diff options
Diffstat (limited to 'src/sandglass.c')
-rw-r--r-- | src/sandglass.c | 9 |
1 files changed, 5 insertions, 4 deletions
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: |