From 027781b3f024eb0dfbdc7e9012cd01e4f47f831d Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 27 Feb 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-02-27 --- port/tod.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/port/tod.c b/port/tod.c index 665f646a798622b88636512f2510f8bc62d36e61..1bbd4e8b61b4e5dd2f8917a6c07f4b24e33ed4c7 100644 --- a/port/tod.c +++ b/port/tod.c @@ -102,9 +102,9 @@ struct { vlong last; // last reading of fast clock vlong off; // offset from epoch to last vlong lasttime; // last return value from gettod - vlong delta; // amount to add to bias each slow clock tick - int n; // number of times to add in delta - int i; // number of times we've added in delta + vlong delta; // add 'delta' each slow clock tick from sstart to send + ulong sstart; // ... + ulong send; // ... } tod; int @@ -159,7 +159,6 @@ todsetfreq(vlong f) tod.multiplier = (TODFREQ<= 0){ tod.off = t; tod.last = fastticks(nil); tod.lasttime = 0; } else { + if(n <= 0) + n = 1; + n *= HZ; + if(delta < 0 && n > -delta) + n = -delta; + if(delta > 0 && n > delta) + n = delta; + delta /= n; + tod.sstart = MACHP(0)->ticks; + tod.send = tod.sstart + n; tod.delta = delta; - tod.n = n; } iunlock(&tod); } @@ -188,6 +196,7 @@ vlong todget(void) { vlong ticks, x, diff; + ulong t; ilock(&tod); @@ -197,6 +206,15 @@ todget(void) ticks = fastticks(nil); diff = ticks - tod.last; + // add in correction + if(tod.sstart < tod.send){ + t = MACHP(0)->ticks; + if(t >= tod.send) + t = tod.send; + tod.off += tod.delta*(t - tod.sstart); + tod.sstart = t; + } + // convert to epoch x = ((diff>>tod.s2)*tod.multiplier)>>(tod.s1-tod.s2); x += tod.off; @@ -222,15 +240,6 @@ todget(void) void todfix(void) { - if((MACHP(0)->ticks % HZ) != 0) - return; - - // once a second apply correction - ilock(&tod); - if(tod.n > tod.i++) - tod.off += tod.delta; - iunlock(&tod); - // once a minute, make sure we don't overflow if((MACHP(0)->ticks % (60*HZ)) == 0) todget();