diff --git a/Makefile b/Makefile index caf9d48..28ca565 100644 --- a/Makefile +++ b/Makefile @@ -1,27 +1,17 @@ -# OS=$(uname) make - -### OS = OpenBSD -### OS = FreeBSD PROG= xmem VERSION= 1.27 -FreeBSD_lflag= -lkvm -LDFLAGS+= -L/usr/X11R6/lib -L/usr/local/lib/ -lX11 -lXt -lXaw -lXmu -LDFLAGS+= $($(OS)_lflag) +LDFLAGS+= -L/usr/X11R6/lib -L/usr/local/lib/ -lX11 -lXt -lXaw -lXmu +LDFLAGS+= -lkvm CFLAGS+= -Wall -I/usr/X11R6/include/ -I/usr/local/include/ -OBJECTS= xmem.o MemStripChart.o -FreeBSD_stub = get_mem_fbsd.o -OpenBSD_stub = get_mem.o -_stub = get_mem.o -OBJECTS += $($(OS)_stub) - +OBJECTS= xmem.o MemStripChart.o get_mem.o all: xmem xmem.full: - echo "full not supported yet" + @echo "full not supported yet" xmem.debug: - echo "debug not supported yet" + @echo "debug not supported yet" xmem: $(OBJECTS) $(CC) -o xmem $(OBJECTS) $(LDFLAGS) @@ -29,10 +19,10 @@ xmem: $(OBJECTS) %.o: %c $(CC) $(CFLAGS) -c $< -clean: +clean: -rm -rf $(OBJECTS) $(PROG) -dist: +dist: mkdir -p ${PROG}-${VERSION} cp *.h *.c Makefile xmem.1 xmem.bit copyright XMem.ad ${PROG}-${VERSION} tar cfvz ${PROG}-${VERSION}.tar.gz ${PROG}-${VERSION} @@ -48,9 +38,8 @@ install: install -c -o root -g bin -m 644 xmem.1 ${PREFIX}/man/man1/xmem.1 install -d -m 755 ${PREFIX}/lib/X11/app-defaults/ install -c -o root -g bin -m 644 XMem.ad ${PREFIX}/lib/X11/app-defaults/XMem - install -d -m 755 ${PREFIX}/share/${PROG}/ + install -d -m 755 ${PREFIX}/share/${PROG}/ install -c -o root -g bin -m 644 xmem.bit ${PREFIX}/share/${PROG}/xmem.bit install -c -o root -g bin -m 644 copyright ${PREFIX}/share/${PROG}/copyright - .include diff --git a/get_mem.c b/get_mem.c index ed233fc..b2bcc9e 100644 --- a/get_mem.c +++ b/get_mem.c @@ -1,15 +1,17 @@ /* $Id: get_mem.c,v 1.5 2018/12/26 18:46:04 bch Exp $ - * - * Adapted: get memory usage on OpenBSD - * Author: Christian Barthel + * + * xmem(1) utility adapted by Christian Barthel : + * - Added OpenBSD support + * - Added FreeBSD support * * get memory usage, from get_load.c derived * * Author: Hans-Helmut Buehmann 20. Jan. 1996 - * + * * Modified for more recent kernels Helmut Geyer Oct. 1996 */ +#if __OpenBSD__ #include /* DEV_BSIZE MAXCOMLEN PZERO */ #include @@ -26,11 +28,11 @@ #include #include "MemStripChart.h" -static int pageshift = -1; +static int pageshift = -1; #define pagetok(size) ((size) << pageshift) -#define LOG1024 10 +#define LOG1024 10 -static double allmem_kb = 0; +static double allmem_kb = 0; static void initPageShift(void) { @@ -43,7 +45,7 @@ static void initPageShift(void) pageshift -= LOG1024; } -static double getSwapFrac() +static double getSwapFrac() { struct swapent *swdev; int used, total, nswap, rnswap, i; @@ -76,17 +78,17 @@ static double getSwapFrac() return (double)used/total; } -void GetMemLoadPoint(Widget w, caddr_t closure, caddr_t call_data) +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(); + size_t size; + + if (pageshift < 0) + initPageShift(); size = sizeof(uvmexp); if (sysctl(uvmexp_mib, 2, &uvmexp, &size, NULL, 0) < 0) { @@ -100,7 +102,7 @@ void GetMemLoadPoint(Widget w, caddr_t closure, caddr_t call_data) } - allmem_kb = pagetok(uvmexp.npages); + allmem_kb = pagetok(uvmexp.npages); ret.cached = pagetok(bcstats.numbufpages) / allmem_kb; ret.free = pagetok(uvmexp.free) / allmem_kb; ret.buffer = 0; @@ -108,9 +110,137 @@ void GetMemLoadPoint(Widget w, caddr_t closure, caddr_t call_data) ret.swap = getSwapFrac(); #ifdef DEBUG - printf("%lf %lf %lf %lf %lf\n", allmem_kb, ret.code, ret.cached, ret.free, ret.swap); + printf("%lf %lf %lf %lf %lf\n", + allmem_kb, + ret.code, + ret.cached, + ret.free, + ret.swap); #endif - + memcpy(call_data, &ret, sizeof(MemStripChartCallbackData)); } +#endif + +/* ------------------------------------------------------------------- */ + +#if __FreeBSD__ + +/* $Id: get_mem_fbsd.c,v 1.1 2018/12/26 18:46:16 bch Exp $ + * + * Author: Christian Barthel + */ + + +#include /* DEV_BSIZE MAXCOMLEN PZERO */ +#include + +#include +#include + +#include +#include +#include +#include +#include +#include "MemStripChart.h" + +static int pageshift = -1; +static int pagesize = 0; +static kvm_t *kd = 0; +#define pagetok(size) ((size) << pageshift) +#define LOG1024 10 + +static unsigned int allmem_pages = 0; + +static void initPageShift(void) +{ + pagesize = getpagesize(); + size_t len = sizeof(allmem_pages); + int mib[len]; + pageshift = 0; + while (pagesize > 1) { + pageshift++; + pagesize >>= 1; + } + pageshift -= LOG1024; + + kd = kvm_open(NULL, "/dev/null" ,NULL, O_RDONLY, "kvm_open"); + + if (sysctlbyname("vm.stats.vm.v_page_count", &allmem_pages, &len, NULL, 0) == -1) + perror("sysctl"); +#ifdef DEBUG + printf("page_count: %d\n", allmem_pages); +#endif +} + +static double getSwapFrac() +{ + /* XXX Borrowed from top(1) code: */ + int n; + struct kvm_swap swapary[1]; + static int pagesize = 0; + static unsigned long swap_maxpages = 0; + size_t sz = sizeof(swap_maxpages); + + int retavail = 0; + int retfree = 0; + + + n = kvm_getswapinfo(kd, swapary, 1, 0); + if (n < 0 || swapary[0].ksw_total == 0) + return (0); + + if (swap_maxpages == 0) + sysctlbyname("vm.swap_maxpages", + &swap_maxpages, &sz, NULL, 0); + + if ( swapary[0].ksw_total > swap_maxpages ) + swapary[0].ksw_total = swap_maxpages; + + retavail = swapary[0].ksw_total; + retfree = swapary[0].ksw_total - swapary[0].ksw_used; + +#ifdef DEBUG + printf("swap: %d %d %d %d\n", retavail, + retavail, swapary[0].ksw_total, + swapary[0].ksw_used); +#endif + return (double)(retavail-retfree)/(double)retavail; +} + +void GetMemLoadPoint(Widget w, caddr_t closure, caddr_t call_data) +{ + MemStripChartCallbackData ret; + int a, b; + size_t sz = sizeof(int); + double cache = 0; + + if (pageshift < 0) + initPageShift(); + + sysctlbyname("vm.stats.vm.v_wire_count", &a, &sz, NULL, 0); + ret.code = (double)a / (double)allmem_pages; + + sysctlbyname("vm.stats.vm.v_active_count", &a, &sz, NULL, 0); + ret.buffer = (double)a / (double)allmem_pages; + + /* v_cache_count and v_inactive_count are treated similarly */ + sysctlbyname("vm.stats.vm.v_inactive_count", &a, &sz, NULL, 0); + sysctlbyname("vm.stats.vm.v_cache_count", &b, &sz, NULL, 0); + ret.cached = (double)(a + b) / allmem_pages; + + + sysctlbyname("vm.stats.vm.v_free_count", &a, &sz, NULL, 0); + ret.free = (double)a / allmem_pages; + ret.swap = getSwapFrac(); + +#ifdef DEBUG + printf("%u %lf %lf %lf %lf\n", allmem_pages, + ret.code, ret.cached, ret.free, ret.swap); +#endif + memcpy(call_data, &ret, sizeof(MemStripChartCallbackData)); +} + +#endif diff --git a/get_mem_fbsd.c b/get_mem_fbsd.c deleted file mode 100644 index 2ba9cc0..0000000 --- a/get_mem_fbsd.c +++ /dev/null @@ -1,113 +0,0 @@ -/* $Id: get_mem_fbsd.c,v 1.1 2018/12/26 18:46:16 bch Exp $ - * - * Author: Christian Barthel - */ - - -#include /* DEV_BSIZE MAXCOMLEN PZERO */ -#include - -#include -#include - -#include -#include -#include -#include -#include -#include "MemStripChart.h" - -static int pageshift = -1; -static int pagesize = 0; -static kvm_t *kd = 0; -#define pagetok(size) ((size) << pageshift) -#define LOG1024 10 - -static unsigned int allmem_pages = 0; - -static void initPageShift(void) -{ - pagesize = getpagesize(); - size_t len = sizeof(allmem_pages); - int mib[len]; - pageshift = 0; - while (pagesize > 1) { - pageshift++; - pagesize >>= 1; - } - pageshift -= LOG1024; - - kd = kvm_open(NULL, "/dev/null" ,NULL, O_RDONLY, "kvm_open"); - - if (sysctlbyname("vm.stats.vm.v_page_count", &allmem_pages, &len, NULL, 0) == -1) - perror("sysctl"); -#ifdef DEBUG - printf("page_count: %d\n", allmem_pages); -#endif -} - -static double getSwapFrac() -{ - /* XXX Borrowed from top(1) code: */ - int n; - struct kvm_swap swapary[1]; - static int pagesize = 0; - static unsigned long swap_maxpages = 0; - size_t sz = sizeof(swap_maxpages); - - int retavail = 0; - int retfree = 0; - - - n = kvm_getswapinfo(kd, swapary, 1, 0); - if (n < 0 || swapary[0].ksw_total == 0) - return (0); - - if (swap_maxpages == 0) - sysctlbyname("vm.swap_maxpages", &swap_maxpages, &sz, NULL, 0); - - if ( swapary[0].ksw_total > swap_maxpages ) - swapary[0].ksw_total = swap_maxpages; - - retavail = swapary[0].ksw_total; - retfree = swapary[0].ksw_total - swapary[0].ksw_used; - -#ifdef DEBUG - printf("swap: %d %d %d %d\n", retavail, retavail, swapary[0].ksw_total, - swapary[0].ksw_used); -#endif - return (double)(retavail-retfree)/(double)retavail; -} - -void GetMemLoadPoint(Widget w, caddr_t closure, caddr_t call_data) -{ - MemStripChartCallbackData ret; - int a, b; - size_t sz = sizeof(int); - double cache = 0; - - if (pageshift < 0) - initPageShift(); - - sysctlbyname("vm.stats.vm.v_wire_count", &a, &sz, NULL, 0); - ret.code = (double)a / (double)allmem_pages; - - sysctlbyname("vm.stats.vm.v_active_count", &a, &sz, NULL, 0); - ret.buffer = (double)a / (double)allmem_pages; - - /* v_cache_count and v_inactive_count are treated similarly */ - sysctlbyname("vm.stats.vm.v_inactive_count", &a, &sz, NULL, 0); - sysctlbyname("vm.stats.vm.v_cache_count", &b, &sz, NULL, 0); - ret.cached = (double)(a + b) / allmem_pages; - - - sysctlbyname("vm.stats.vm.v_free_count", &a, &sz, NULL, 0); - ret.free = (double)a / allmem_pages; - ret.swap = getSwapFrac(); - -#ifdef DEBUG - printf("%u %lf %lf %lf %lf\n", allmem_pages, - ret.code, ret.cached, ret.free, ret.swap); -#endif - memcpy(call_data, &ret, sizeof(MemStripChartCallbackData)); -}