*err = fabs(duration) <= max_freq_change_delay ? slew_error : 0.0;
}
+/* ================================================== */
+/* Positive means currently fast of true time, i.e. jump backwards */
+
+static void
+apply_step_offset(double offset)
+{
+ struct timeval old_time, new_time;
+ double err;
+
+ LCL_ReadRawTime(&old_time);
+ UTI_AddDoubleToTimeval(&old_time, -offset, &new_time);
+
+ if (settimeofday(&new_time, NULL) < 0) {
+ LOG_FATAL(LOGF_SysGeneric, "settimeofday() failed");
+ }
+
+ LCL_ReadRawTime(&old_time);
+ UTI_DiffTimevalsToDouble(&err, &old_time, &new_time);
+
+ lcl_InvokeDispersionNotifyHandlers(fabs(err));
+}
+
/* ================================================== */
void
offset_register = 0.0;
lcl_RegisterSystemDrivers(read_frequency, set_frequency,
- accrue_offset, sys_apply_step_offset,
+ accrue_offset, sys_apply_step_offset ?
+ sys_apply_step_offset : apply_step_offset,
offset_convert, sys_set_leap);
LCL_AddParameterChangeHandler(handle_step, NULL);
#include <grp.h>
#endif
-#include "localp.h"
#include "sys_generic.h"
#include "sys_linux.h"
#include "conf.h"
static void
apply_step_offset(double offset)
{
- struct timeval old_time, new_time;
- double err;
-
- if (have_setoffset) {
- if (TMX_ApplyStepOffset(-offset) < 0) {
- LOG_FATAL(LOGF_SysLinux, "adjtimex() failed");
- }
- } else {
- if (gettimeofday(&old_time, NULL) < 0) {
- LOG_FATAL(LOGF_SysLinux, "gettimeofday() failed");
- }
-
- UTI_AddDoubleToTimeval(&old_time, -offset, &new_time);
-
- if (settimeofday(&new_time, NULL) < 0) {
- LOG_FATAL(LOGF_SysLinux, "settimeofday() failed");
- }
-
- if (gettimeofday(&old_time, NULL) < 0) {
- LOG_FATAL(LOGF_SysLinux, "gettimeofday() failed");
- }
-
- UTI_DiffTimevalsToDouble(&err, &old_time, &new_time);
- lcl_InvokeDispersionNotifyHandlers(fabs(err));
+ if (TMX_ApplyStepOffset(-offset) < 0) {
+ LOG_FATAL(LOGF_SysLinux, "adjtimex() failed");
}
}
SYS_Generic_CompleteFreqDriver(1.0e6 * max_tick_bias / nominal_tick,
1.0 / tick_update_hz,
read_frequency, set_frequency,
- apply_step_offset, set_leap);
+ have_setoffset ? apply_step_offset : NULL,
+ set_leap);
}
/* ================================================== */