[PATCH] hwclock: delay loop in set_hardware_clock_exact

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



- 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

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux