From: Miroslav Lichvar Date: Wed, 1 Jul 2009 13:49:05 +0000 (+0200) Subject: Try to minimize adjtime error X-Git-Tag: 1.24-pre1~89 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8c0f3f4;p=thirdparty%2Fchrony.git Try to minimize adjtime error The offset is rounded before calling adjtime and the error below microsecond is accumulated. --- diff --git a/sys_linux.c b/sys_linux.c index 2da7ed51..c60a7d3c 100644 --- a/sys_linux.c +++ b/sys_linux.c @@ -126,6 +126,17 @@ our_round(double x) { return y; } +inline static long +our_lround(double x) { + int y; + + if (x > 0.0) + y = x + 0.5; + else + y = x - 0.5; + return y; +} + /* ================================================== */ /* Amount of outstanding offset to process */ static double offset_register; @@ -255,14 +266,13 @@ initiate_slew(void) if (fabs(offset_register) < MAX_ADJUST_WITH_ADJTIME) { /* Use adjtime to do the shift */ - offset = (long)(0.5 + 1.0e6*(-offset_register)); + offset = our_lround(1.0e6 * -offset_register); + + offset_register += offset * 1e-6; if (TMX_ApplyOffset(&offset) < 0) { CROAK("adjtimex() failed in initiate_slew"); } - - offset_register = 0.0; - } else { /* If the system clock has a high drift rate, the combination of