From 6d54da1b0f94e8e9149e3e44707c93375bb5900f Mon Sep 17 00:00:00 2001 From: bch Date: Sat, 18 Feb 2017 21:06:47 +0000 Subject: [PATCH] load memory usage numbers (OpenBSD) --- get_mem.c | 110 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 93 insertions(+), 17 deletions(-) diff --git a/get_mem.c b/get_mem.c index c12d9a7..7412f71 100644 --- a/get_mem.c +++ b/get_mem.c @@ -1,5 +1,7 @@ -/* - * get_mem.c +/* + * Adapted: get memory usage on OpenBSD + * Author: Christian Barthel + * * get memory usage, from get_load.c derived * * Author: Hans-Helmut Buehmann 20. Jan. 1996 @@ -7,36 +9,110 @@ * Modified for more recent kernels Helmut Geyer Oct. 1996 */ +#include /* DEV_BSIZE MAXCOMLEN PZERO */ +#include +#include +#include +#include #include #include #include +#include #include #include "MemStripChart.h" +static int pageshift = -1; +#define pagetok(size) ((size) << pageshift) +#define LOG1024 10 -void GetMemLoadPoint(w, closure, call_data) /* Linux version */ - Widget w; /* unused */ - caddr_t closure; /* unused */ - caddr_t call_data; /* pointer to (MemStripChartCallbackData) return value */ +static double allmem_kb = 0; + +static void initPageShift(void) { - MemStripChartCallbackData ret; - /* meminfo();*/ + int pagesize = getpagesize(); + pageshift = 0; + while (pagesize > 1) { + pageshift++; + pagesize >>= 1; + } + pageshift -= LOG1024; +} - /*et.code = (double)(kb_main_used - kb_main_buffers - kb_main_cached) / kb_main_total; +static double getSwapFrac() +{ + struct swapent *swdev; + int used, total, nswap, rnswap, i; + + nswap = swapctl(SWAP_NSWAP, 0, 0); + if (nswap == 0) + return 0; + + swdev = calloc(nswap, sizeof(*swdev)); + if (swdev == NULL) + return 0; + + rnswap = swapctl(SWAP_STATS, swdev, nswap); + if (rnswap == -1) { + free(swdev); + return 0; + } + + /* if rnswap != nswap, then what? */ + + /* Total things up */ + total = used = 0; + for (i = 0; i < nswap; i++) { + if (swdev[i].se_flags & SWF_ENABLE) { + used += (swdev[i].se_inuse / (1024 / DEV_BSIZE)); + total += (swdev[i].se_nblks / (1024 / DEV_BSIZE)); + } + } + free(swdev); + return (double)used/total; +} + +void GetMemLoadPoint(Widget w, caddr_t closure, caddr_t call_data) +{ + static int bcstats_mib[] = {CTL_VFS, VFS_GENERIC, VFS_BCACHESTAT}; + static int uvmexp_mib[] = {CTL_VM, VM_UVMEXP}; + MemStripChartCallbackData ret; + struct uvmexp uvmexp; + struct bcachestats bcstats; + size_t size; + + if (pageshift < 0) + initPageShift(); + + /*ret.code = (double)(kb_main_used - kb_main_buffers - kb_main_cached) / kb_main_total; ret.cached = (double)kb_main_cached / (double)kb_main_total; ret.buffer = (double)kb_main_buffers / (double)kb_main_total; ret.free = (double)kb_main_free / (double)kb_main_total; ret.swap = (double)kb_swap_used / (double)kb_main_total; - */ - printf("test?\n"); - ret.code = 0.5; - ret.cached = 0.5; - ret.buffer = 0.5; - ret.free = 0.5; - ret.swap = 0.5; + size = sizeof(uvmexp); + if (sysctl(uvmexp_mib, 2, &uvmexp, &size, NULL, 0) < 0) { + warn("sysctl failed"); + bzero(&uvmexp, sizeof(uvmexp)); + } + size = sizeof(bcstats); + if (sysctl(bcstats_mib, 3, &bcstats, &size, NULL, 0) < 0) { + warn("sysctl failed"); + bzero(&bcstats, sizeof(bcstats)); + } - memcpy(call_data, &ret, sizeof(MemStripChartCallbackData)); + + allmem_kb = pagetok(uvmexp.npages); + ret.cached = pagetok(bcstats.numbufpages) / allmem_kb; + ret.free = pagetok(uvmexp.free) / allmem_kb; + ret.buffer = 0; + ret.code = (1 - ret.cached - ret.free); + ret.swap = getSwapFrac(); + +#ifdef DEBUG + printf("%lf %lf %lf %lf %lf\n", allmem_kb, ret.code, ret.cached, ret.free, ret.swap); +#endif + + memcpy(call_data, &ret, sizeof(MemStripChartCallbackData)); }