Handle kernels not providing microsecond time resolution
[users/jgh/exim.git] / src / src / exim.c
index 8c3c8e7ed3c2fff003cda2429fa283b4b88bc598..72bf65e72c6c8ee5850cbd75787dfafe99e08522 100644 (file)
@@ -407,7 +407,7 @@ long int now_true_usec;
 now_true_usec = now_tv.tv_usec;
 now_tv.tv_usec = (now_true_usec/resolution) * resolution;
 
-if (exim_tvcmp(&now_tv, then_tv) <= 0)
+while (exim_tvcmp(&now_tv, then_tv) <= 0)
   {
   struct itimerval itval;
   itval.it_interval.tv_sec = 0;
@@ -439,6 +439,13 @@ if (exim_tvcmp(&now_tv, then_tv) <= 0)
     }
 
   milliwait(&itval);
+
+  /* Be prapared to go around if the kernel does not implement subtick
+  granularity (GNU Hurd) */
+
+  (void)gettimeofday(&now_tv, NULL);
+  now_true_usec = now_tv.tv_usec;
+  now_tv.tv_usec = (now_true_usec/resolution) * resolution;
   }
 }