From 9a358c3cdf8eb34754cc5544e2a5e0f67c022f8d Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Thu, 17 Sep 2009 13:33:06 +0000 Subject: Improve sandglass_tsc_resolution(), and fix timespec-based grains counts. --- src/sandglass.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src/sandglass.c') diff --git a/src/sandglass.c b/src/sandglass.c index 57729f9..3399b73 100644 --- a/src/sandglass.c +++ b/src/sandglass.c @@ -184,6 +184,9 @@ sandglass_elapse(sandglass_t *sandglass) return -1; sandglass->grains -= oldgrains; + /* Magical correction for timespec-based grains */ + if (sandglass->grains < 0) + sandglass->grains += 2000000000L; sandglass->grains /= sandglass->loops; return 0; @@ -219,12 +222,11 @@ sandglass_real_gettime(sandglass_t *sandglass) if (sysconf(_SC_MONOTONIC_CLOCK) > 0) { if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) return -1; - sandglass->grains = ts.tv_nsec; } else { if (clock_gettime(CLOCK_REALTIME, &ts) != 0) return -1; - sandglass->grains = ts.tv_nsec; } + sandglass->grains = sandglass_timespec_grains(&ts); break; default: @@ -242,13 +244,12 @@ sandglass_real_gettime(sandglass_t *sandglass) if (sysconf(_SC_THREAD_CPUTIME) > 0) { if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) != 0) return -1; - sandglass->grains = ts.tv_nsec; } else if (sysconf(_SC_CPUTIME) > 0) { if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) != 0) return -1; - sandglass->grains = ts.tv_nsec; } else return -1; + sandglass->grains = sandglass_timespec_grains(&ts); break; case SANDGLASS_SYSTEM: -- cgit v1.2.3