From 8c0f3f4042dd624b865eb48b02b80163e0d3e15b Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Wed, 1 Jul 2009 15:49:05 +0200 Subject: [PATCH] Try to minimize adjtime error The offset is rounded before calling adjtime and the error below microsecond is accumulated. --- sys_linux.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/sys_linux.c b/sys_linux.c index 2da7ed5..c60a7d3 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