summaryrefslogtreecommitdiffstats
path: root/freebsd
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2014-11-27 18:31:39 -0200
committerHisham Muhammad <hisham@gobolinux.org>2014-11-27 18:31:39 -0200
commit0aa485cf47f337848b79bda3bead5ab7005ffacc (patch)
treef170f193f2050ee34bad797c089996194e983286 /freebsd
parentd8f2b5abf7d2e2b04b72785f053af804ea78cdf5 (diff)
Reading swap data!
Diffstat (limited to 'freebsd')
-rw-r--r--freebsd/FreeBSDProcessList.c53
-rw-r--r--freebsd/FreeBSDProcessList.h3
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

© 2014-2024 Faster IT GmbH | imprint | privacy policy