diff options
author | Tavian Barnes <tavianator@gmail.com> | 2009-09-17 13:33:06 +0000 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2009-09-17 13:33:06 +0000 |
commit | 9a358c3cdf8eb34754cc5544e2a5e0f67c022f8d (patch) | |
tree | a351b5a08f614e3ceeb7f63c7cf68f68377e54c5 /src/tsc.c | |
parent | a9f27bf33c6b6b6e9aac0eb1e69743120a11daa1 (diff) | |
download | libsandglass-9a358c3cdf8eb34754cc5544e2a5e0f67c022f8d.tar.xz |
Improve sandglass_tsc_resolution(), and fix timespec-based grains counts.
Diffstat (limited to 'src/tsc.c')
-rw-r--r-- | src/tsc.c | 35 |
1 files changed, 31 insertions, 4 deletions
@@ -21,19 +21,46 @@ #include "sandglass_impl.h" #include "sandglass.h" #include <time.h> +#include <unistd.h> /* Gets the number of clock ticks per second */ double sandglass_tsc_resolution() { - static long tsc = 0; - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; + static long tsc = 0, grains1, grains2; + + int monotonic; + struct timespec ts; 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(); - while (nanosleep(&ts, &ts) != 0); + grains1 = sandglass_timespec_grains(&ts); + grains2 = grains1; + + while (((grains2 >= grains1) ? grains2 - grains1 + : 2000000000L + (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 = sandglass_timespec_grains(&ts); + } + tsc = sandglass_get_tsc() - tsc; } - return tsc*10.0; + return tsc*1.0e9/(grains2 - grains1); } |