]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
sys: include predicted drift in adjtime() offset
authorMiroslav Lichvar <mlichvar@redhat.com>
Wed, 12 Aug 2015 13:48:13 +0000 (15:48 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Wed, 12 Aug 2015 14:09:24 +0000 (16:09 +0200)
In drivers with periodic drift removal include in the adjustment also a
prediction of the error gained in half of the interval to move the mean
offset of the clock closer to zero. E.g. offset of a stable clock
drifting by 10 ppm should now be closer to 0 +/- 5 microseconds instead
of 5 +/- 5 microseconds.

sys_macosx.c
sys_solaris.c
sys_sunos.c

index 4db6a0ceab06f139229f54ba515648a29c7661a6..5d7c1d538600e6358bed70194822c25cabae378a 100644 (file)
@@ -108,7 +108,7 @@ start_adjust(void)
 {
   struct timeval newadj, oldadj;
   struct timeval T1;
-  double elapsed, accrued_error;
+  double elapsed, accrued_error, predicted_error;
   double adjust_required;
   double rounding_error;
   double old_adjust_remaining;
@@ -120,8 +120,9 @@ start_adjust(void)
 
   UTI_DiffTimevalsToDouble(&elapsed, &T1, &T0);
   accrued_error = elapsed * current_freq;
+  predicted_error = DRIFT_REMOVAL_INTERVAL / 2.0 * current_freq;
 
-  adjust_required = - (accrued_error + offset_register);
+  adjust_required = - (accrued_error + offset_register + predicted_error);
 
   UTI_DoubleToTimeval(adjust_required, &newadj);
   UTI_TimevalToDouble(&newadj, &adjustment_requested);
@@ -133,7 +134,7 @@ start_adjust(void)
 
   UTI_TimevalToDouble(&oldadj, &old_adjust_remaining);
 
-  offset_register = rounding_error - old_adjust_remaining;
+  offset_register = rounding_error - old_adjust_remaining - predicted_error;
 
   T0 = T1;
 }
index fe8b63a204feaf9751999b20b70b301b03c1414e..6c018ee945dd6649b6c26f2383bcc1a5b9e6af26 100644 (file)
@@ -127,7 +127,7 @@ start_adjust(void)
 {
   struct timeval newadj, oldadj;
   struct timeval T1;
-  double elapsed, accrued_error;
+  double elapsed, accrued_error, predicted_error;
   double adjust_required;
   struct timeval exact_newadj;
   double rounding_error;
@@ -140,8 +140,9 @@ start_adjust(void)
 
   UTI_DiffTimevalsToDouble(&elapsed, &T1, &T0);
   accrued_error = elapsed * current_freq;
+  predicted_error = DRIFT_REMOVAL_INTERVAL / 2.0 * current_freq;
   
-  adjust_required = - (accrued_error + offset_register);
+  adjust_required = - (accrued_error + offset_register + predicted_error);
 
   UTI_DoubleToTimeval(adjust_required, &exact_newadj);
 
@@ -160,7 +161,7 @@ start_adjust(void)
 
   UTI_TimevalToDouble(&oldadj, &old_adjust_remaining);
 
-  offset_register = rounding_error - old_adjust_remaining;
+  offset_register = rounding_error - old_adjust_remaining - predicted_error;
 
   T0 = T1;
   UTI_TimevalToDouble(&newadj, &adjustment_requested);
index 7d0737e946b605f1bacde2a4ae20a33ab9cd623e..1e7f3ab7e9e5420db65cc2523c1390111f5d82e3 100644 (file)
@@ -118,7 +118,7 @@ start_adjust(void)
 {
   struct timeval newadj, oldadj;
   struct timeval T1;
-  double elapsed, accrued_error;
+  double elapsed, accrued_error, predicted_error;
   double adjust_required;
   struct timeval exact_newadj;
   double rounding_error;
@@ -132,8 +132,9 @@ start_adjust(void)
 
   UTI_DiffTimevalsToDouble(&elapsed, &T1, &T0);
   accrued_error = elapsed * current_freq;
+  predicted_error = DRIFT_REMOVAL_INTERVAL / 2.0 * current_freq;
   
-  adjust_required = - (accrued_error + offset_register);
+  adjust_required = - (accrued_error + offset_register + predicted_error);
 
   UTI_DoubleToTimeval(adjust_required, &exact_newadj);
 
@@ -163,7 +164,7 @@ start_adjust(void)
 
   UTI_TimevalToDouble(&oldadj, &old_adjust_remaining);
 
-  offset_register = rounding_error - old_adjust_remaining;
+  offset_register = rounding_error - old_adjust_remaining - predicted_error;
 
   T0 = T1;
   UTI_TimevalToDouble(&newadj, &adjustment_requested);