commit 2b82bf02488147a3e69a715267934f015fe29a43
Author:     Aaron Marcher <[email protected]>
AuthorDate: Sun May 6 17:48:37 2018 +0200
Commit:     Aaron Marcher <[email protected]>
CommitDate: Sun May 6 17:48:37 2018 +0200

    cpu_perc: Port to OpenBSD
    
    In OpenBSD the CPU usage in percent is now computed using KERN_CPTIME
    sysctl.

diff --git a/README b/README
index 0961030..805f541 100644
--- a/README
+++ b/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
diff --git a/components/cpu.c b/components/cpu.c
index e7f4cd9..79bb881 100644
--- a/components/cpu.c
+++ b/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

Reply via email to