diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2014-11-27 18:31:39 -0200 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2014-11-27 18:31:39 -0200 |
commit | 0aa485cf47f337848b79bda3bead5ab7005ffacc (patch) | |
tree | f170f193f2050ee34bad797c089996194e983286 /freebsd | |
parent | d8f2b5abf7d2e2b04b72785f053af804ea78cdf5 (diff) |
Reading swap data!
Diffstat (limited to 'freebsd')
-rw-r--r-- | freebsd/FreeBSDProcessList.c | 53 | ||||
-rw-r--r-- | freebsd/FreeBSDProcessList.h | 3 |
2 files changed, 40 insertions, 16 deletions
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 pl; +} - return (ProcessList*) this; +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 |