diff --git a/ChangeLog b/ChangeLog index 661fe2838ddd7badd787324a16486d29773aded0..c47db80e47a5da481ed211b85f16e44d3add106f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-07-18 Derek R. Price <derek@ximbiot.com> + + * NEWS: Note timestamp fix for systems with imperfectly synchronized + time() & gettimeofday() functions. + 2008-11-25 Larry Jones <lawrence.jones@siemens.com> * HACKING, NEWS: Note update to Autoconf 2.63. diff --git a/NEWS b/NEWS index 863030da58be5df6d397af511dd0ba09e4d44491..2dbbdfb40b2d5847551e4a7246ee1b8fd22f57c5 100644 --- a/NEWS +++ b/NEWS @@ -50,6 +50,9 @@ NEW FEATURES BUG FIXES +* Time stamps are set correctly on systems where time() and gettimeofday() + return times with different values for the current second. + * Changing keyword substitution mode no longer interferes with conflict tracking (fixes bug #17565). diff --git a/src/ChangeLog b/src/ChangeLog index c65df7808ada5aa6a3abc371b5b09939870c94ae..0fbbb8625adab14e4ab88b4b7bf44e5aad302da7 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2009-07-18 Derek R. Price <derek@ximbiot.com> + + * subr.c (sleep_past): Don't assume that time() called after + gettimeofday() must return a seconds value >= than gettimeofday() did. + 2008-12-02 Larry Jones <lawrence.jones@siemens.com> * commit.c: Remove defunct variable (got_message). diff --git a/src/subr.c b/src/subr.c index 2895f1e3ae29343f2b33acdcac2c6b052fb3329e..914a8079ca9b78cbed382f04cc7477a770f4ddd8 100644 --- a/src/subr.c +++ b/src/subr.c @@ -906,27 +906,37 @@ sleep_past (time_t desttime) time_t t; long s; long us; - +/* printf ("sleep requested until %d, current time it %d\n", + desttime, time(&t)); */ while (time (&t) <= desttime) { #ifdef HAVE_GETTIMEOFDAY struct timeval tv; gettimeofday (&tv, NULL); - if (tv.tv_sec > desttime) - break; - s = desttime - tv.tv_sec; - if (tv.tv_usec > 0) - us = 1000000 - tv.tv_usec; + if (tv.tv_sec <= desttime) { + s = desttime - tv.tv_sec; + if (tv.tv_usec > 0) + us = 1000000 - tv.tv_usec; + else + { + s++; + us = 0; + } + } else +#endif { - s++; - us = 0; + /* On at least one Linux 2.6.24 system, time() lags behind + * gettimeofday() by up to 10 msec, and file time stamps use + * time(). For example, time() might return 1247677670 while + * gettimeofday() returns 1247677671.000060, so we always sleep + * at least 20ms and retry the test using time(), like we do when + * gettimeofday() is not available. + */ + /* default to 20 ms increments */ + us = 20000; + s = desttime - t; } -#else - /* default to 20 ms increments */ - s = desttime - t; - us = 20000; -#endif { struct timespec ts; @@ -935,6 +945,7 @@ sleep_past (time_t desttime) (void)nanosleep (&ts, NULL); } } + /* printf ("slept until %d\n", time(&t)); */ }