Reduce adjtime calling

Don't call adjtime to determine remaining offset when there is no slewing
running.
This commit is contained in:
Miroslav Lichvar 2009-11-23 17:23:43 +01:00
parent 4097ab29c7
commit 62fe343990

View file

@ -143,6 +143,9 @@ our_lround(double x) {
/* Amount of outstanding offset to process */ /* Amount of outstanding offset to process */
static double offset_register; static double offset_register;
/* Flag set true if an adjtime slew was started and still may be running */
static int slow_slewing;
/* Flag set true if a fast slew (one done by altering tick) is being /* Flag set true if a fast slew (one done by altering tick) is being
run at the moment */ run at the moment */
static int fast_slewing; static int fast_slewing;
@ -267,11 +270,14 @@ initiate_slew(void)
} }
/* Cancel any standard adjtime that is running */ /* Cancel any standard adjtime that is running */
if (slow_slewing) {
offset = 0; offset = 0;
if (TMX_ApplyOffset(&offset) < 0) { if (TMX_ApplyOffset(&offset) < 0) {
CROAK("adjtimex() failed in accrue_offset"); CROAK("adjtimex() failed in accrue_offset");
} }
offset_register -= (double) offset / 1.0e6; offset_register -= (double) offset / 1.0e6;
slow_slewing = 0;
}
if (fabs(offset_register) < MAX_ADJUST_WITH_ADJTIME) { if (fabs(offset_register) < MAX_ADJUST_WITH_ADJTIME) {
/* Use adjtime to do the shift */ /* Use adjtime to do the shift */
@ -279,9 +285,12 @@ initiate_slew(void)
offset_register += offset * 1e-6; offset_register += offset * 1e-6;
if (offset != 0) {
if (TMX_ApplyOffset(&offset) < 0) { if (TMX_ApplyOffset(&offset) < 0) {
CROAK("adjtimex() failed in initiate_slew"); CROAK("adjtimex() failed in initiate_slew");
} }
slow_slewing = 1;
}
} else { } else {
/* If the system clock has a high drift rate, the combination of /* If the system clock has a high drift rate, the combination of
@ -540,37 +549,47 @@ get_offset_correction(struct timeval *raw,
double fast_slew_duration; double fast_slew_duration;
double fast_slew_achieved; double fast_slew_achieved;
double fast_slew_remaining; double fast_slew_remaining;
long offset; long offset, toffset;
if (!slow_slewing) {
offset = 0;
} else {
again: again:
if (have_readonly_adjtime == 1) { switch (have_readonly_adjtime) {
if (TMX_GetOffsetLeftOld(&offset) < 0) { case 2:
CROAK("adjtimex() failed in get_offset_correction");
}
adjtime_left = (double)offset / 1.0e6;
} else if (have_readonly_adjtime == 2) {
if (TMX_GetOffsetLeft(&offset) < 0) { if (TMX_GetOffsetLeft(&offset) < 0) {
LOG(LOGS_INFO, LOGF_SysLinux, "adjtimex() doesn't support ADJ_OFFSET_SS_READ"); LOG(LOGS_INFO, LOGF_SysLinux, "adjtimex() doesn't support ADJ_OFFSET_SS_READ");
have_readonly_adjtime = 0; have_readonly_adjtime = 0;
goto again; goto again;
} }
break;
adjtime_left = (double)offset / 1.0e6; case 0:
} else { toffset = 0;
offset = 0; if (TMX_ApplyOffset(&toffset) < 0) {
if (TMX_ApplyOffset(&offset) < 0) {
CROAK("adjtimex() failed in get_offset_correction"); CROAK("adjtimex() failed in get_offset_correction");
} }
offset = toffset;
if (TMX_ApplyOffset(&toffset) < 0) {
CROAK("adjtimex() failed in get_offset_correction");
}
break;
case 1:
if (TMX_GetOffsetLeftOld(&offset) < 0) {
CROAK("adjtimex() failed in get_offset_correction");
}
break;
default:
assert(0);
}
if (offset == 0) {
/* adjtime slew has finished */
slow_slewing = 0;
}
}
adjtime_left = (double)offset / 1.0e6; adjtime_left = (double)offset / 1.0e6;
/* txc.offset still set from return value of last call */
if (TMX_ApplyOffset(&offset) < 0) {
CROAK("adjtimex() failed in get_offset_correction");
}
}
if (fast_slewing) { if (fast_slewing) {
UTI_DiffTimevalsToDouble(&fast_slew_duration, raw, &slew_start_tv); UTI_DiffTimevalsToDouble(&fast_slew_duration, raw, &slew_start_tv);
fast_slew_achieved = delta_total_tick * fast_slew_duration / fast_slew_achieved = delta_total_tick * fast_slew_duration /
@ -604,6 +623,7 @@ immediate_step(void)
} }
offset_register -= (double) offset / 1.0e6; offset_register -= (double) offset / 1.0e6;
slow_slewing = 0;
if (gettimeofday(&old_time, &tz) < 0) { if (gettimeofday(&old_time, &tz) < 0) {
CROAK("gettimeofday() failed in immediate_step"); CROAK("gettimeofday() failed in immediate_step");