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.
This commit is contained in:
parent
af025ae850
commit
60e62dc596
2 changed files with 23 additions and 1 deletions
|
@ -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.
|
||||
|
||||
|
|
21
src/w32.c
21
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);
|
||||
|
|
Loading…
Add table
Reference in a new issue