From 0b12bb29adc33255b97d2fb995ef145f0127d950 Mon Sep 17 00:00:00 2001
From: Tavian Barnes <tavianator@gmail.com>
Date: Sun, 20 Sep 2009 16:09:53 +0000
Subject: Make SANDGLASS_REALTICKS accurate to 1 clock cycle.

---
 src/sandglass.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

(limited to 'src')

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;
 }
-- 
cgit v1.2.3