summaryrefslogtreecommitdiffstats
path: root/src/tsc.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2009-09-18 19:47:51 +0000
committerTavian Barnes <tavianator@gmail.com>2009-09-18 19:47:51 +0000
commite2fa7956b87c23a8229926f39a3863ecd4d4752a (patch)
tree89008fd214693cf8b5df22b9b492fcd3f394e0cb /src/tsc.c
parent25052f0997c75f91846511041cf4eeb20959ae96 (diff)
downloadlibsandglass-e2fa7956b87c23a8229926f39a3863ecd4d4752a.tar.xz
Add timespec helper routines.
Diffstat (limited to 'src/tsc.c')
-rw-r--r--src/tsc.c34
1 files changed, 4 insertions, 30 deletions
diff --git a/src/tsc.c b/src/tsc.c
index 28066a4..554a6d8 100644
--- a/src/tsc.c
+++ b/src/tsc.c
@@ -27,40 +27,14 @@
double
sandglass_tsc_resolution()
{
- static long tsc = 0, grains1, grains2;
-
- int monotonic;
- struct timespec ts;
+ static long tsc = 0;
+ static struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000L };
if (tsc == 0) {
- monotonic = sysconf(_SC_MONOTONIC_CLOCK) > 0;
- if (monotonic) {
- if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0)
- return 0.0/0.0;
- } else {
- if (clock_gettime(CLOCK_REALTIME, &ts) != 0)
- return 0.0/0.0;
- }
tsc = sandglass_get_tsc();
- grains1 = sandglass_timespec_grains(&ts);
- grains2 = grains1;
-
- while (((grains2 >= grains1) ? grains2 - grains1
- : 1000000000L + (grains2 - grains1))
- < 10000000L)
- {
- if (monotonic) {
- if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0)
- return 0.0/0.0;
- } else {
- if (clock_gettime(CLOCK_REALTIME, &ts) != 0)
- return 0.0/0.0;
- }
- grains2 = ts.tv_nsec;
- }
-
+ sandglass_spin(&ts);
tsc = sandglass_get_tsc() - tsc;
}
- return tsc*1.0e9/(grains2 - grains1);
+ return tsc*1.0e9/ts.tv_nsec;
}