]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix minor problems in Windows emulation of getloadavg.
authorEli Zaretskii <eliz@gnu.org>
Tue, 17 Dec 2013 18:00:25 +0000 (20:00 +0200)
committerEli Zaretskii <eliz@gnu.org>
Tue, 17 Dec 2013 18:00:25 +0000 (20:00 +0200)
 src/w32.c (getloadavg): Don't index samples[] array with negative
 indices.  Recover from wall-clock time being set backwards.

src/ChangeLog
src/w32.c

index aaa8788c2baa7e1e1cc548944214421a8e0bf6d0..0fe25e6fd63ce46f250858f690882b70378b4bcc 100644 (file)
@@ -1,5 +1,8 @@
 2013-12-17  Eli Zaretskii  <eliz@gnu.org>
 
+       * w32.c (getloadavg): Don't index samples[] array with negative
+       indices.  Recover from wall-clock time being set backwards.
+
        * w32term.c (w32_initialize): Declare the argument of
        set_user_model as const.
 
index e4678637cbbfe77bad054528d19aed70ff3a39f7..159085e7f50df5ace82e5c1434efc493dd5386fa 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -1732,9 +1732,28 @@ getloadavg (double loadavg[], int nelem)
   ULONGLONG idle, kernel, user;
   time_t now = time (NULL);
 
+  /* If system time jumped back for some reason, delete all samples
+     whose time is later than the current wall-clock time.  This
+     prevents load average figures from becoming frozen for prolonged
+     periods of time, when system time is reset backwards.  */
+  if (last_idx >= 0)
+    {
+      while (difftime (now, samples[last_idx].sample_time) < -1.0)
+       {
+         if (last_idx == first_idx)
+           {
+             first_idx = last_idx = -1;
+             break;
+           }
+         last_idx = buf_prev (last_idx);
+       }
+    }
+
   /* Store another sample.  We ignore samples that are less than 1 sec
      apart.  */
-  if (difftime (now, samples[last_idx].sample_time) >= 1.0 - 2*DBL_EPSILON*now)
+  if (last_idx < 0
+      || (difftime (now, samples[last_idx].sample_time)
+         >= 1.0 - 2*DBL_EPSILON*now))
     {
       sample_system_load (&idle, &kernel, &user);
       last_idx = buf_next (last_idx);