From 0aa485cf47f337848b79bda3bead5ab7005ffacc Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Thu, 27 Nov 2014 18:31:39 -0200 Subject: [PATCH] Reading swap data! --- configure.ac | 4 +++ freebsd/FreeBSDProcessList.c | 53 ++++++++++++++++++++++++++---------- freebsd/FreeBSDProcessList.h | 3 +- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/configure.ac b/configure.ac index e484839a..328833d0 100644 --- a/configure.ac +++ b/configure.ac @@ -141,6 +141,10 @@ else [AC_CHECK_HEADERS([ncurses.h],[:],[missing_headers="$missing_headers $ac_header"])])])]) fi +if test "$my_htop_platform" = "freebsd"; then + AC_CHECK_LIB([kvm], [kvm_open], [], [missing_libraries="$missing_libraries libkvm"]) +fi + AC_ARG_ENABLE(native_affinity, [AC_HELP_STRING([--enable-native-affinity], [enable native sched_setaffinity and sched_getaffinity for affinity support, disables hwloc])], ,enable_native_affinity="yes") if test "x$enable_native_affinity" = xyes -a "x$cross_compiling" = xno; then AC_MSG_CHECKING([for usable sched_setaffinity]) diff --git a/freebsd/FreeBSDProcessList.c b/freebsd/FreeBSDProcessList.c index c75fb10f..ac985005 100644 --- a/freebsd/FreeBSDProcessList.c +++ b/freebsd/FreeBSDProcessList.c @@ -26,12 +26,15 @@ typedef struct FreeBSDProcessList_ { }*/ static int MIB_vm_stats_vm_v_wire_count[4]; +static int MIB_vm_stats_vm_v_cache_count[4]; static int MIB_hw_physmem[2]; +static int pageSizeKb; + ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList) { - FreeBSDProcessList* this = calloc(1, sizeof(FreeBSDProcessList)); - ProcessList* pl = (ProcessList*) this; - ProcessList_init((ProcessList*)this, usersTable, pidWhiteList); + FreeBSDProcessList* fpl = calloc(1, sizeof(FreeBSDProcessList)); + ProcessList* pl = (ProcessList*) fpl; + ProcessList_init(pl, usersTable, pidWhiteList); int cpus = 1; size_t sizeof_cpus = sizeof(cpus); @@ -45,31 +48,51 @@ ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList) { pl->cpus[i].totalPeriod = 1; } - size_t len = 4; - sysctlnametomib("vm.stats.vm.v_wire_count", MIB_vm_stats_vm_v_wire_count, &len); - len = 2; - sysctlnametomib("hw.physmem", MIB_hw_physmem, &len); + size_t len; + len = 4; sysctlnametomib("vm.stats.vm.v_wire_count", MIB_vm_stats_vm_v_wire_count, &len); + len = 4; sysctlnametomib("vm.stats.vm.v_cache_count", MIB_vm_stats_vm_v_cache_count, &len); + len = 2; sysctlnametomib("hw.physmem", MIB_hw_physmem, &len); + pageSizeKb = PAGE_SIZE_KB; + + fpl->kd = kvm_open(NULL, "/dev/null", NULL, 0, NULL); + assert(fpl->kd); - return (ProcessList*) this; + return pl; +} + +void ProcessList_delete(ProcessList* this) { + const FreeBSDProcessList* fpl = (FreeBSDProcessList*) this; + if (fpl->kd) kvm_close(fpl->kd); + + ProcessList_done(this); + free(this); } static inline void FreeBSDProcessList_scanMemoryInfo(ProcessList* pl) { const FreeBSDProcessList* fpl = (FreeBSDProcessList*) pl; - unsigned long long int swapFree = 0; size_t len = sizeof(pl->totalMem); sysctl(MIB_hw_physmem, 2, &(pl->totalMem), &len, NULL, 0); pl->totalMem /= 1024; sysctl(MIB_vm_stats_vm_v_wire_count, 4, &(pl->usedMem), &len, NULL, 0); - pl->usedMem *= PAGE_SIZE / 1024; + pl->usedMem *= pageSizeKb; pl->freeMem = pl->totalMem - pl->usedMem; + sysctl(MIB_vm_stats_vm_v_cache_count, 4, &(pl->cachedMem), &len, NULL, 0); + pl->cachedMem *= pageSizeKb; - pl->sharedMem = 0; - pl->buffersMem = 0; - pl->cachedMem = 0; + struct kvm_swap swap[16]; + int nswap = kvm_getswapinfo(fpl->kd, swap, sizeof(swap)/sizeof(swap[0]), 0); pl->totalSwap = 0; - swapFree = 0; - pl->usedSwap = pl->totalSwap - swapFree; + pl->usedSwap = 0; + for (int i = 0; i < nswap; i++) { + pl->totalSwap += swap[i].ksw_total; + pl->usedSwap += swap[i].ksw_used; + } + pl->totalSwap *= pageSizeKb; + pl->usedSwap *= pageSizeKb; + + pl->sharedMem = 0; // currently unused + pl->buffersMem = 0; // not exposed to userspace } void ProcessList_scan(ProcessList* this) { diff --git a/freebsd/FreeBSDProcessList.h b/freebsd/FreeBSDProcessList.h index 9389e3aa..11a5dde7 100644 --- a/freebsd/FreeBSDProcessList.h +++ b/freebsd/FreeBSDProcessList.h @@ -18,9 +18,10 @@ typedef struct FreeBSDProcessList_ { } FreeBSDProcessList; - ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList); +void ProcessList_delete(ProcessList* this); + void ProcessList_scan(ProcessList* this); #endif