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__)