Re: [hackers] [slstatus][PATCH] cpu_perc: Check for division by zero

From: Michael Buch <michaelbuch12_AT_gmail.com>
Date: Thu, 14 Feb 2019 21:16:23 +0000

Thanks for changing, on second thought though, I have my doubts about this
situation being possible. The cp times are millisecond increments since
boot and would only not increment from our perspective if we sampled at
submillisecond frequency. You can maximally
configure slstatus to 1ms so I dont think we need a check here
Did this happen to you?


Am Do., 14. Feb. 2019 um 18:26 Uhr schrieb Ingo Feinerer <feinerer_AT_logic.at
>:
>
> ---
> components/cpu.c | 45 +++++++++++++++++++++++++++------------------
> 1 file changed, 27 insertions(+), 18 deletions(-)
>
> diff --git a/components/cpu.c b/components/cpu.c
> index d9bd018..9e28003 100644
> --- a/components/cpu.c
> +++ b/components/cpu.c
> _AT__AT_ -24,7 +24,7 @@
> cpu_perc(void)
> {
> static long double a[7];
> - long double b[7];
> + long double b[7], sum;
>
> memcpy(b, a, sizeof(b));
> /* cpu user nice system idle iowait irq softirq */
> _AT__AT_ -37,13 +37,16 @@
> return NULL;
> }
>
> + sum = (b[0] + b[1] + b[2] + b[3] + b[4] + b[5] + b[6]) -
> + (a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6]);
> +
> + if (sum == 0) {
> + return NULL;
> + }
> +
> return bprintf("%d", (int)(100 *
> ((b[0] + b[1] + b[2] + b[5] + b[6]) -
> - (a[0] + a[1] + a[2] + a[5] + a[6])) /
> - ((b[0] + b[1] + b[2] + b[3] + b[4] + b[5] +
> - b[6]) -
> - (a[0] + a[1] + a[2] + a[3] + a[4] + a[5] +
> - a[6]))));
> + (a[0] + a[1] + a[2] + a[5] + a[6])) /
sum));
> }
> #elif defined(__OpenBSD__)
> #include <sys/param.h>
> _AT__AT_ -75,7 +78,7 @@
> {
> int mib[2];
> static uintmax_t a[CPUSTATES];
> - uintmax_t b[CPUSTATES];
> + uintmax_t b[CPUSTATES], sum;
> size_t size;
>
> mib[0] = CTL_KERN;
> _AT__AT_ -92,15 +95,18 @@
> return NULL;
> }
>
> + sum = (a[CP_USER] + a[CP_NICE] + a[CP_SYS] + a[CP_INTR] +
a[CP_IDLE]) -
> + (b[CP_USER] + b[CP_NICE] + b[CP_SYS] + b[CP_INTR] +
b[CP_IDLE]);
> +
> + if (sum == 0) {
> + return NULL;
> + }
> +
> return bprintf("%d", 100 *
> ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
> a[CP_INTR]) -
> (b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
> - b[CP_INTR])) /
> - ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
> - a[CP_INTR] + a[CP_IDLE]) -
> - (b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
> - b[CP_INTR] + b[CP_IDLE])));
> + b[CP_INTR])) / sum);
> }
> #elif defined(__FreeBSD__)
> #include <sys/param.h>
> _AT__AT_ -129,7 +135,7 @@
> {
> size_t size;
> static long a[CPUSTATES];
> - long b[CPUSTATES];
> + long b[CPUSTATES], sum;
>
> size = sizeof(a);
> memcpy(b, a, sizeof(b));
> _AT__AT_ -142,14 +148,17 @@
> return NULL;
> }
>
> + sum = (a[CP_USER] + a[CP_NICE] + a[CP_SYS] + a[CP_INTR] +
a[CP_IDLE]) -
> + (b[CP_USER] + b[CP_NICE] + b[CP_SYS] + b[CP_INTR] +
b[CP_IDLE]);
> +
> + if (sum == 0) {
> + return NULL;
> + }
> +
> return bprintf("%d", 100 *
> ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
> a[CP_INTR]) -
> (b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
> - b[CP_INTR])) /
> - ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
> - a[CP_INTR] + a[CP_IDLE]) -
> - (b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
> - b[CP_INTR] + b[CP_IDLE])));
> + b[CP_INTR])) / sum);
> }
> #endif
> --
> 2.20.1
>
>
Received on Thu Feb 14 2019 - 22:16:23 CET

This archive was generated by hypermail 2.3.0 : Thu Feb 14 2019 - 22:24:21 CET