commit 1a22e74299cee75b85e00b509f319f83d9e08c2e
parent ae8a1ff1c171ecf0518321edaed3568e5cd9b8b2
Author: bsandro <email@bsandro.tech>
Date: Sun, 20 Jul 2025 12:54:49 +0300
netbsd mem usage fix
Diffstat:
M | dwmstatus.c | | | 67 | +++++++++++++++++++++++++++---------------------------------------- |
1 file changed, 27 insertions(+), 40 deletions(-)
diff --git a/dwmstatus.c b/dwmstatus.c
@@ -14,7 +14,8 @@
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
-
+#include <sys/sysctl.h>
+#include <uvm/uvm_extern.h>
#include <X11/Xlib.h>
char *tzcyprus = "Asia/Nicosia";
@@ -111,7 +112,8 @@ readfile(char *base, char *file)
return smprintf("%s", line);
}
-char *get_cpu()
+char *
+get_cpu()
{
static char status[128];
char buffer[256];
@@ -164,52 +166,37 @@ char *get_cpu()
return status;
}
-char *get_mem()
-{
- static char status[128];
- char buffer[256];
- FILE *mem_fp;
- unsigned long memtotal, memfree, buffers, cached, meminuse = 0;
- unsigned long swaptotal, swapfree, swapused = 0;
-
- mem_fp = fopen("/proc/meminfo", "r");
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
+#include <errno.h>
- if (mem_fp == NULL)
- return 0;
+char *
+get_mem()
+{
+ static char status[128] = "";
- while (!feof(mem_fp))
- {
- if (fgets(buffer, 255, mem_fp) == NULL)
- break;
+ static const int mib[] = {CTL_VM, VM_UVMEXP2};
+ struct uvmexp_sysctl uvm;
+ size_t len = sizeof(uvm);
+ printf("len: %zu\n", len);
- if (strncmp(buffer, "MemTotal:", 9) == 0)
- sscanf(buffer, "%*s %lu", &memtotal);
- else if (strncmp(buffer, "MemFree:", 8) == 0)
- sscanf(buffer, "%*s %lu", &memfree);
- else if (strncmp(buffer, "Buffers:", 8) == 0)
- sscanf(buffer, "%*s %lu", &buffers);
- else if (strncmp(buffer, "SwapTotal:", 10) == 0)
- sscanf(buffer, "%*s %lu", &swaptotal);
- else if (strncmp(buffer, "SwapFree:", 9) == 0)
- sscanf(buffer, "%*s %lu", &swapfree);
- else if (strncmp(buffer, "Cached:", 7) == 0)
- sscanf(buffer, "%*s %lu", &cached);
+ if (sysctl(mib, ARRAY_SIZE(mib), &uvm, &len, NULL, 0)!=0) {
+ printf("sysctl error: %d\n", errno);
+ return NULL;
}
- fclose(mem_fp);
-
- memfree = memfree + buffers + cached;
- meminuse = memtotal - memfree;
- swapused = swaptotal - swapfree;
+ uint64_t meminuse = (uvm.npages-(uvm.free+uvm.inactive))<<uvm.pageshift;
+ uint64_t memtotal = uvm.npages<<uvm.pageshift;
+ uint64_t swapused = uvm.swpginuse<<uvm.pageshift;
+ uint64_t swaptotal = uvm.swpages<<uvm.pageshift;
- snprintf(status, 128, "%.0f%%(%dM/%dM) swap:%.0f%%(%dM/%dM)",
- //snprintf(status, 128, "%.0f%% swap:%.1f%%",
+ static const uint64_t nmegs = 1024*1024;
+ snprintf(status, 128, "%.0f%%(%lldM/%lldM) swap:%.0f%%(%lldM/%lldM)",
(float)meminuse/memtotal*100,
- (int)meminuse/1024,
- (int)memtotal/1024,
+ meminuse/nmegs,
+ memtotal/nmegs,
(float)swapused/swaptotal*100,
- (int)swapused/1024,
- (int)swaptotal/1024);
+ swapused/nmegs,
+ swaptotal/nmegs);
#ifdef DEBUG
printf("MEM: %.0f%% (%dM/%dM)\n",