diff options
author | Tavian Barnes <tavianator@gmail.com> | 2009-09-20 16:09:53 +0000 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2009-09-20 16:09:53 +0000 |
commit | 0b12bb29adc33255b97d2fb995ef145f0127d950 (patch) | |
tree | 2e3d09bf8b95419618505522f5b12fe78911c260 /src | |
parent | 1a2471411605302574df89cc82d7a3b4da0b2005 (diff) | |
download | libsandglass-0b12bb29adc33255b97d2fb995ef145f0127d950.tar.xz |
Make SANDGLASS_REALTICKS accurate to 1 clock cycle.
Diffstat (limited to 'src')
-rw-r--r-- | src/sandglass.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/sandglass.c b/src/sandglass.c index c3435d0..b9316e5 100644 --- a/src/sandglass.c +++ b/src/sandglass.c @@ -179,15 +179,25 @@ int sandglass_elapse(sandglass_t *sandglass) { long oldgrains = sandglass->grains; + sandglass_t baseline; if (sandglass_real_gettime(sandglass) != 0) return -1; sandglass->grains -= oldgrains; - /* Magical correction for timespec-based grains */ if (sandglass->grains < 0) + /* Magical correction for timespec-based grains */ sandglass->grains += sandglass->adjustment; - sandglass->grains /= sandglass->loops; + + if (sandglass->attributes.resolution == SANDGLASS_REALTICKS) { + baseline.attributes.incrementation = SANDGLASS_MONOTONIC; + baseline.attributes.resolution = SANDGLASS_CPUTIME; + baseline.loops = sandglass->loops; + + sandglass_bench(&baseline, { }); + sandglass->grains -= baseline.grains; + sandglass->grains /= sandglass->loops; + } return 0; } |