- Avoid delaying 1.5 seconds when 0.5 will do. - Guard for forward time resets as well. Signed-off-by: Kalev Soikonen <ksop@xxxxxx> --- hwclock/hwclock.c | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-) diff --git a/hwclock/hwclock.c b/hwclock/hwclock.c index 619ff79..b249d10 100644 --- a/hwclock/hwclock.c +++ b/hwclock/hwclock.c @@ -521,28 +521,34 @@ set_hardware_clock_exact(const time_t se time_t newhwtime; struct timeval beginsystime, nowsystime; + double tdiff; time_resync: gettimeofday(&beginsystime, NULL); - newhwtime = sethwtime + (int) time_diff(beginsystime, refsystime) + 1; + tdiff = time_diff(beginsystime, refsystime); + newhwtime = sethwtime + (int) (tdiff + 0.5); if (debug) printf(_("Time elapsed since reference time has been %.6f seconds.\n" - "Delaying further to reach the next full second.\n"), - time_diff(beginsystime, refsystime)); + "Delaying further to reach the next full second.\n"), tdiff); /* - * Now delay some more until Hardware Clock time newhwtime arrives. The -500 - * ms is because the Hardware Clock always sets to your set time plus 500 ms + * Now delay some more until Hardware Clock time newhwtime arrives. The 0.5 s + * is because the Hardware Clock always sets to your set time plus 500 ms * (because it is designed to update to the next second precisely 500 ms * after you finish the setting). */ do { - float tdiff; gettimeofday(&nowsystime, NULL); tdiff = time_diff(nowsystime, beginsystime); if (tdiff < 0) goto time_resync; /* probably time was reset */ - } while (time_diff(nowsystime, refsystime) - 0.5 < newhwtime - sethwtime); +#if 1 + if (tdiff > 0.1) + goto time_resync; + beginsystime = nowsystime; +#endif + tdiff = time_diff(nowsystime, refsystime); + } while (newhwtime == sethwtime + (int) (tdiff + 0.5)); set_hardware_clock(newhwtime, universal, testing); } -- 1.4.2.1 -- To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html