From 60e62dc596e0603397c416cd82c4d4512565fa38 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 17 Dec 2013 20:00:25 +0200 Subject: [PATCH] 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. --- src/ChangeLog | 3 +++ src/w32.c | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/ChangeLog b/src/ChangeLog index aaa8788c2b..0fe25e6fd6 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 e4678637cb..159085e7f5 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); -- 2.20.1