Przeglądaj źródła

cpu_perc: Port to OpenBSD

In OpenBSD the CPU usage in percent is now computed using KERN_CPTIME
sysctl.
Aaron Marcher 7 lat temu
rodzic
commit
2b82bf0248
2 zmienionych plików z 36 dodań i 1 usunięć
  1. 1 1
      README
  2. 35 0
      components/cpu.c

+ 1 - 1
README

@@ -62,5 +62,5 @@ Porting to OpenBSD is the current goal before thinking about a release.
 
 The following functions are not portable at the moment:
 - wifi_{perc,essid}
-- cpu_{perc,iowait}
+- cpu_iowait
 - entropy

+ 35 - 0
components/cpu.c

@@ -68,6 +68,8 @@
 		return bprintf("%d", perc);
 	}
 #elif defined(__OpenBSD__)
+	#include <sys/param.h>
+	#include <sys/sched.h>
 	#include <sys/sysctl.h>
 
 	const char *
@@ -89,4 +91,37 @@
 
 		return bprintf("%d", freq);
 	}
+
+	const char *
+	cpu_perc(void)
+	{
+		int mib[2], perc;
+		static int valid;
+		static long int a[CPUSTATES];
+		long int b[CPUSTATES];
+		size_t size;
+
+		mib[0] = CTL_KERN;
+		mib[1] = KERN_CPTIME;
+
+		size = sizeof(a);
+
+		memcpy(b, a, sizeof(b));
+		if (sysctl(mib, 2, &a, &size, NULL, 0) == -1) {
+			fprintf(stderr, "sysctl 'KERN_CPTIME': %s\n", strerror(errno));
+			return NULL;
+		}
+		if (!valid) {
+			valid = 1;
+			return NULL;
+		}
+
+		perc = 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]));
+
+		return bprintf("%d", perc);
+	}
 #endif