Mercurial > controlcenter
changeset 80:cd8f1ac1d050
Linux/Android: Fallback to checking /proc/loadavg if /proc/stat is not
accessible. Hopefully this will work on later Android versions to get a
system load, however it is a 1 minute average and not a more precise amount.
author | Brian Smith <brian@dbsoft.org> |
---|---|
date | Tue, 24 Aug 2021 18:27:12 -0500 |
parents | b1b8397fcdc7 |
children | 4acd9b9d3555 |
files | statsunx.c |
diffstat | 1 files changed, 21 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/statsunx.c Thu Aug 12 16:15:45 2021 -0500 +++ b/statsunx.c Tue Aug 24 18:27:12 2021 -0500 @@ -76,20 +76,17 @@ { #ifdef __linux__ FILE *fp = fopen("/proc/stat", "r"); - static int lastused = 0, lasttotal = 0; + static unsigned long lastused = 0, lasttotal = 0; static double lastload = 0; - *Load =0; + *Load = 0; if(fp) { - char buf[1024]; - int user, nice, sys, idle, used, total; + unsigned long user, nice, sys, idle, used, total; - if(fgets(buf, 1024, fp)) + if(fscanf(fp, "cpu %lu %lu %lu %lu", &user, &nice, &sys, &idle) != EOF) { - sscanf(buf, "cpu %d %d %d %d", &user, &nice, &sys, &idle); - used = (user+nice+sys); total = used + idle; @@ -100,7 +97,23 @@ lastused = used; lasttotal = total; - } + } + fclose(fp); + } + else if((fp = fopen("/proc/loadavg", "r"))) + { + int cpucores = get_nprocs(); + float onemin, fivemin, fifteenmin; + + if(fscanf(fp,"%f %f %f", &onemin, &fivemin, &fifteenmin) != EOF) + { + if(cpucores > 0) + *Load = ((double)onemin)/((double)cpucores); + else if(onemin < 1.0) + *Load = (double)onemin; + else + *Load = 1.0; + } fclose(fp); } #elif defined(__FreeBSD__)