File 8201-os_mon-Implement-cpu_sup-util-0-1-for-OpenBSD.patch of Package erlang
From 259ef22b495fac794246c6cb5fc6b2aa8a65ba52 Mon Sep 17 00:00:00 2001
From: vlkrs <codeberg@schlecht.dev>
Date: Tue, 28 Mar 2023 20:48:11 +0200
Subject: [PATCH 1/2] os_mon: Implement cpu_sup:util/0,1 for OpenBSD
---
lib/os_mon/c_src/cpu_sup.c | 88 ++++++++++++++++++++++++++++++-
lib/os_mon/doc/src/cpu_sup.xml | 2 +-
lib/os_mon/src/cpu_sup.erl | 1 +
lib/os_mon/test/cpu_sup_SUITE.erl | 2 +
4 files changed, 90 insertions(+), 3 deletions(-)
diff --git a/lib/os_mon/c_src/cpu_sup.c b/lib/os_mon/c_src/cpu_sup.c
index 415168fc72..8e8e3a32f5 100644
--- a/lib/os_mon/c_src/cpu_sup.c
+++ b/lib/os_mon/c_src/cpu_sup.c
@@ -87,6 +87,11 @@ typedef struct {
#define CU_BSD_VALUES (6)
#endif
+#if defined(__OpenBSD__)
+#include <sys/types.h>
+#include <sys/sched.h>
+#define CU_OPENBSD_VALUES (6)
+#endif
#define FD_IN (0)
#define FD_OUT (1)
@@ -178,12 +183,17 @@ static int processors_online() {
void getsysctl(const char *, void *, size_t);
#endif
+#if defined(__OpenBSD__)
+static int getncpu(void);
+static int getncpuonline(void);
+#endif
+
int main(int argc, char** argv) {
char cmd;
int rc;
int sz;
unsigned int *rv;
-#if defined(__linux__) || (defined(__APPLE__) && defined(__MACH__)) ||defined(__FreeBSD__)
+#if defined(__linux__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) || defined(__OpenBSD__)
unsigned int no_of_cpus = 0;
#endif
@@ -207,6 +217,15 @@ int main(int argc, char** argv) {
}
#endif
+#if defined(__OpenBSD__)
+ no_of_cpus = getncpu();
+ if ( no_of_cpus == -1 )
+ error("cpu_sup: sysctl error");
+
+ if ( (rv = (unsigned int*)malloc(sizeof(unsigned int)*(2 + 2*no_of_cpus*CU_OPENBSD_VALUES))) == NULL)
+ error("cpu_sup: malloc error");
+#endif
+
#if defined(__FreeBSD__)
getsysctl("hw.ncpu", &no_of_cpus, sizeof(int));
if ( (rv = (unsigned int*)malloc(sizeof(unsigned int)*(2 + 2*no_of_cpus*CU_BSD_VALUES))) == NULL) {
@@ -244,7 +263,7 @@ int main(int argc, char** argv) {
case AVG5: bsd_loadavg(1); break;
case AVG15: bsd_loadavg(2); break;
#endif
-#if defined(__sun__) || defined(__linux__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__)
+#if defined(__sun__) || defined(__linux__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) || defined(__OpenBSD__)
case UTIL: util_measure(&rv,&sz); sendv(rv, sz); break;
#endif
case QUIT: free((void*)rv); return 0;
@@ -712,6 +731,71 @@ static void util_measure(unsigned int **result_vec, int *result_sz) {
}
#endif
+/* ---------------------------- *
+ * OpenBSD stat functions *
+ * ---------------------------- */
+
+#if defined(__OpenBSD__)
+static int getncpu(void) {
+ const int mib[] = { CTL_HW, HW_NCPU };
+ int numcpu;
+ size_t size = sizeof(numcpu);
+
+ if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), &numcpu, &size, NULL, 0) == -1)
+ error("cpu_sup: sysctl error");
+
+ return(numcpu);
+}
+
+static int getncpuonline(void) {
+ const int mib[] = { CTL_HW, HW_NCPUONLINE };
+ int numcpu;
+ size_t size = sizeof(numcpu);
+
+ if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), &numcpu, &size, NULL, 0) == -1)
+ error("cpu_sup: sysctl error");
+
+ return(numcpu);
+}
+
+static void util_measure(unsigned int **result_vec, int *result_sz) {
+ static int mib[] = { CTL_KERN, KERN_CPTIME2, 0 };
+ size_t size_cpu_times;
+ int64_t *cpu_times;
+ unsigned int *rv = NULL;
+ int i;
+ int ncpuonline = getncpuonline();
+
+ size_cpu_times = sizeof(int64_t) * CPUSTATES;
+ cpu_times = malloc(size_cpu_times);
+ if (!cpu_times)
+ error("cpu_sup: malloc error");
+
+ rv = *result_vec;
+ rv[0] = ncpuonline;
+ rv[1] = CU_OPENBSD_VALUES;
+ ++rv; /* first value is number of cpus */
+ ++rv; /* second value is number of entries */
+
+ for (i = 0; i < ncpuonline; ++i) {
+ mib[2] = i;
+ if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), cpu_times, &size_cpu_times, NULL, 0) == -1)
+ error("cpu_sup: sysctl error");
+
+ rv[ 0] = CU_CPU_ID; rv[ 1] = i;
+ rv[ 2] = CU_USER; rv[ 3] = (unsigned int)cpu_times[CP_USER];
+ rv[ 4] = CU_NICE_USER; rv[ 5] = (unsigned int)cpu_times[CP_NICE];
+ rv[ 6] = CU_KERNEL; rv[ 7] = (unsigned int)cpu_times[CP_SYS];
+ rv[ 8] = CU_IDLE; rv[ 9] = (unsigned int)cpu_times[CP_IDLE];
+ rv[10] = CU_HARD_IRQ; rv[11] = (unsigned int)cpu_times[CP_INTR];
+ rv += CU_OPENBSD_VALUES*2;
+ }
+ free((void*) cpu_times);
+
+ *result_sz = 2 + 2*CU_OPENBSD_VALUES * ncpuonline;
+}
+#endif
+
/* ---------------------------- *
* Generic functions *
diff --git a/lib/os_mon/doc/src/cpu_sup.xml b/lib/os_mon/doc/src/cpu_sup.xml
index e9dd930cf1..e79b3038b3 100644
--- a/lib/os_mon/doc/src/cpu_sup.xml
+++ b/lib/os_mon/doc/src/cpu_sup.xml
@@ -35,7 +35,7 @@
and CPU utilization. It is part of the OS_Mon application, see
<seeapp marker="os_mon_app">os_mon(6)</seeapp>. Available for Unix,
although CPU utilization values (<c>util/0,1</c>) are only
- available for Solaris, Linux and FreeBSD.</p>
+ available for Solaris, Linux, FreeBSD and OpenBSD.</p>
<p>The load values are proportional to how long time a runnable
Unix process has to spend in the run queue before it is scheduled.
Accordingly, higher values mean more system load. The returned
diff --git a/lib/os_mon/src/cpu_sup.erl b/lib/os_mon/src/cpu_sup.erl
index be917021e7..522ffe5830 100644
--- a/lib/os_mon/src/cpu_sup.erl
+++ b/lib/os_mon/src/cpu_sup.erl
@@ -163,6 +163,7 @@ handle_call({?util, D, PC}, {Client, _Tag},
when Flavor == sunos;
Flavor == linux;
Flavor == freebsd;
+ Flavor == openbsd;
Flavor == darwin ->
case measurement_server_call(State#state.server, {?util, D, PC, Client}) of
{error, Reason} ->
diff --git a/lib/os_mon/test/cpu_sup_SUITE.erl b/lib/os_mon/test/cpu_sup_SUITE.erl
index e719963ea9..f3494da860 100644
--- a/lib/os_mon/test/cpu_sup_SUITE.erl
+++ b/lib/os_mon/test/cpu_sup_SUITE.erl
@@ -63,6 +63,8 @@ all() ->
[load_api, util_api, util_values, port, unavailable];
{unix, freebsd} ->
[load_api, util_api, util_values, port, unavailable];
+ {unix, openbsd} ->
+ [load_api, util_api, util_values, port, unavailable];
{unix, darwin} ->
[load_api, util_api, util_values, port, unavailable];
{unix, netbsd} -> [unavailable];
--
2.35.3