Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:25
erlang
3041-os_mon-Implement-cpu_sup-util-0-1-for-Open...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 3041-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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor