From: Eli Zaretskii Date: Tue, 17 Dec 2013 18:00:25 +0000 (+0200) Subject: Fix minor problems in Windows emulation of getloadavg. X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~365 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=60e62dc596e0603397c416cd82c4d4512565fa38;p=emacs.git Fix minor problems in Windows emulation of getloadavg. src/w32.c (getloadavg): Don't index samples[] array with negative indices. Recover from wall-clock time being set backwards. --- diff --git a/src/ChangeLog b/src/ChangeLog index aaa8788c2ba..0fe25e6fd63 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,8 @@ 2013-12-17 Eli Zaretskii + * 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. diff --git a/src/w32.c b/src/w32.c index e4678637cbb..159085e7f50 100644 --- 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);