]> err.no Git - util-linux/commitdiff
hwclock: delay loop in set_hardware_clock_exact
authorKalev Soikonen <ksop@hot.ee>
Sun, 27 Jul 2008 23:26:44 +0000 (02:26 +0300)
committerKarel Zak <kzak@redhat.com>
Wed, 13 Aug 2008 09:43:59 +0000 (11:43 +0200)
- Avoid delaying 1.5 seconds when 0.5 will do.
- Guard for forward time resets as well.

[kzak@redhat.com: - fix the "Delaying.." debug message
                  - add comments]

Signed-off-by: Kalev Soikonen <ksop@hot.ee>
Signed-off-by: Karel Zak <kzak@redhat.com>
hwclock/hwclock.c

index c08ae3f5ed0a9c8490d684a7cb8d2e7bc654f2d8..48b47ade88fa1ececa3930bf15c9e35615fde513 100644 (file)
@@ -526,28 +526,32 @@ set_hardware_clock_exact(const time_t sethwtime,
 
   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 new time.\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);
+                 goto time_resync;     /* probably backward time reset */
+         if (tdiff > 0.1)
+                 goto time_resync;     /* probably forward time reset */
+         beginsystime = nowsystime;
+         tdiff = time_diff(nowsystime, refsystime);
+  } while (newhwtime == sethwtime + (int) (tdiff + 0.5));
 
   set_hardware_clock(newhwtime, universal, testing);
 }