]> err.no Git - util-linux/commitdiff
hwclock: use time limit for synchronization busy wait
authorKarel Zak <kzak@redhat.com>
Tue, 12 Aug 2008 11:58:51 +0000 (13:58 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 13 Aug 2008 09:43:59 +0000 (11:43 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
hwclock/clock.h
hwclock/hwclock.c
hwclock/rtc.c

index 6e8a9b4ca616127bccf06a2292128d7327be20b8..cbdf999177a9dfffc69edf04380c597c3a853dc9 100644 (file)
@@ -33,6 +33,7 @@ extern void outsyserr(char *msg, ...)
 #else
         ;
 #endif
+extern double time_diff(struct timeval subtrahend, struct timeval subtractor);
 /* cmos.c */
 extern void set_cmos_epoch(int ARCconsole, int SRM);
 extern void set_cmos_access(int Jensen, int funky_toy);
index 82da273dfda62d2f7d65d67389f844f1de768ec9..c08ae3f5ed0a9c8490d684a7cb8d2e7bc654f2d8 100644 (file)
@@ -182,7 +182,7 @@ read_date_from_file (struct tm *tm) {
   write_date_to_file (tm);
 }
 
-static double
+double
 time_diff(struct timeval subtrahend, struct timeval subtractor) {
 /*---------------------------------------------------------------------------
   The difference in seconds between two times in "timeval" format.
index 3eb1f4eb7637a6e69399b416b4db55ee7271dbc5..e59414fde13d940b7aee5b5dfc9f22d54c0cc9fc 100644 (file)
@@ -179,8 +179,8 @@ busywait_for_rtc_clock_tick(const int rtc_fd) {
   struct tm start_time;
     /* The time when we were called (and started waiting) */
   struct tm nowtime;
-  int i;  /* local loop index */
   int rc;
+  struct timeval begin, now;
 
   if (debug)
     printf(_("Waiting in loop for time from %s to change\n"),
@@ -191,25 +191,26 @@ busywait_for_rtc_clock_tick(const int rtc_fd) {
     return 1;
 
   /* Wait for change.  Should be within a second, but in case something
-     weird happens, we have a limit on this loop to reduce the impact
-     of this failure.
-     */
-  for (i = 0;
-       (rc = do_rtc_read_ioctl(rtc_fd, &nowtime)) == 0
-        && start_time.tm_sec == nowtime.tm_sec;
-       i++)
-    if (i >= 1000000) {
+   * weird happens, we have a time limit (1.5s) on this loop to reduce the
+   * impact of this failure.
+   */
+  gettimeofday(&begin, NULL);
+  do {
+    rc = do_rtc_read_ioctl(rtc_fd, &nowtime);
+    if (rc || start_time.tm_sec != nowtime.tm_sec)
+      break;
+    gettimeofday(&now, NULL);
+    if (time_diff(now, begin) > 1.5) {
       fprintf(stderr, _("Timed out waiting for time change.\n"));
       return 2;
     }
+  } while(1);
 
   if (rc)
     return 3;
   return 0;
 }
 
-
-
 static int
 synchronize_to_clock_tick_rtc(void) {
 /*----------------------------------------------------------------------------