DragonFly commits List (threaded) for 2004-12
[
Date Prev][
Date Next]
[
Thread Prev][
Thread Next]
[
Date Index][
Thread Index]
Re: cvs commit: src/sys/kern
On Sat, 4 Dec 2004, Matthew Dillon wrote:
Log:
Fix the boottime calculation when the time of day is set in absolute terms.
We want boottime to be calculated based on the current real time minus our
best uptime guess. gd_time_seconds survives a lot of time issues and is our
best uptime guess and since it is already used to calculate the new basetime,
we can just assign boottime to basetime.
On an additional note -- and I suppose anything at this point is
nitpicking -- would it be worthwhile to preserve the original
drift? Take an extreme example with the current code with a
machine booted at 12:00:00 when the clock adds a second every 30
seconds compared to a reference clock:
basetime = 11:59:58
boottime = 12:00:00
reference time = 12:01:00
gd_time_seconds = 62
nanouptime() = 00:01:02
wallclock uptime = 00:01:00
w(1) uptime = 00:01:00
Now, reset time on the reference clock (and machine) forward 1
minute to 12:02:00
basetime = 12:00:58
boottime = 12:00:58
reference time = 12:02:00
gd_time_seconds = 62
nanouptime() = 00:01:02
wallclock uptime = 00:01:00
w(1) uptime = 00:01:02
So (if I got the logic all right) the w(1) uptime reported would be
wrong. If we could add the original 2 second difference between
boottime & basetime back to boottime, I think things should be
better.
Thoughts? Am I getting too anal? :-)
-Paul.
void
set_timeofday(struct timespec *ts)
{
struct timespec ts2, drift;
/*
* XXX SMP / non-atomic basetime updates
*/
crit_enter();
drift.tv_sec = boottime.tv_sec - basetime.tv_sec;
drift.tv_nsec = boottime.tv_nsec - basetime.tv_nsec;
nanouptime(&ts2);
basetime.tv_sec = ts->tv_sec - ts2.tv_sec;
basetime.tv_nsec = ts->tv_nsec - ts2.tv_nsec;
if (basetime.tv_nsec < 0) {
basetime.tv_nsec += 1000000000;
--basetime.tv_sec;
}
boottime.tv_sec = basetime.tv_sec + drift.tv_sec;
boottime.tv_nsec = basetime.tv_nsec + drift.tv_nsec;
timedelta = 0;
crit_exit();
}
[
Date Prev][
Date Next]
[
Thread Prev][
Thread Next]
[
Date Index][
Thread Index]