summaryrefslogtreecommitdiffstats
path: root/src/tsc.c
diff options
context:
space:
mode:
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;
}