2014-11-27 18:27:34 +00:00
|
|
|
/*
|
2014-11-27 19:44:55 +00:00
|
|
|
htop - FreeBSDProcessList.c
|
2014-11-27 18:27:34 +00:00
|
|
|
(C) 2014 Hisham H. Muhammad
|
|
|
|
Released under the GNU GPL, see the COPYING file
|
|
|
|
in the source distribution for its full text.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "ProcessList.h"
|
2014-11-27 19:44:55 +00:00
|
|
|
#include "FreeBSDProcessList.h"
|
2014-11-27 18:27:34 +00:00
|
|
|
|
2014-11-27 19:44:55 +00:00
|
|
|
#include <unistd.h>
|
2014-11-27 18:27:34 +00:00
|
|
|
#include <stdlib.h>
|
2014-11-27 19:44:55 +00:00
|
|
|
#include <sys/types.h>
|
2014-11-27 18:27:34 +00:00
|
|
|
#include <sys/sysctl.h>
|
2014-11-27 19:44:55 +00:00
|
|
|
#include <fcntl.h>
|
2014-11-27 18:27:34 +00:00
|
|
|
|
|
|
|
/*{
|
|
|
|
|
2014-11-27 19:44:55 +00:00
|
|
|
#include <kvm.h>
|
|
|
|
|
2015-03-16 06:13:42 +00:00
|
|
|
typedef struct CPUData_ {
|
|
|
|
unsigned long long int totalTime;
|
|
|
|
unsigned long long int totalPeriod;
|
|
|
|
} CPUData;
|
|
|
|
|
2014-11-27 19:44:55 +00:00
|
|
|
typedef struct FreeBSDProcessList_ {
|
|
|
|
ProcessList super;
|
|
|
|
kvm_t* kd;
|
2015-03-16 06:13:42 +00:00
|
|
|
|
|
|
|
CPUData* cpus;
|
|
|
|
|
2014-11-27 19:44:55 +00:00
|
|
|
} FreeBSDProcessList;
|
|
|
|
|
2014-11-27 18:27:34 +00:00
|
|
|
}*/
|
|
|
|
|
2014-11-27 19:44:55 +00:00
|
|
|
static int MIB_vm_stats_vm_v_wire_count[4];
|
2014-11-27 20:31:39 +00:00
|
|
|
static int MIB_vm_stats_vm_v_cache_count[4];
|
2014-11-27 19:44:55 +00:00
|
|
|
static int MIB_hw_physmem[2];
|
|
|
|
|
2014-11-27 20:31:39 +00:00
|
|
|
static int pageSizeKb;
|
|
|
|
|
2015-03-16 06:13:42 +00:00
|
|
|
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList, uid_t userId) {
|
2014-11-27 20:31:39 +00:00
|
|
|
FreeBSDProcessList* fpl = calloc(1, sizeof(FreeBSDProcessList));
|
|
|
|
ProcessList* pl = (ProcessList*) fpl;
|
2015-03-16 06:13:42 +00:00
|
|
|
ProcessList_init(pl, usersTable, pidWhiteList, userId);
|
2014-11-27 18:27:34 +00:00
|
|
|
|
|
|
|
int cpus = 1;
|
|
|
|
size_t sizeof_cpus = sizeof(cpus);
|
|
|
|
int err = sysctlbyname("hw.ncpu", &cpus, &sizeof_cpus, NULL, 0);
|
|
|
|
if (err) cpus = 1;
|
2014-11-27 19:44:55 +00:00
|
|
|
pl->cpuCount = MAX(cpus, 1);
|
2015-03-16 06:13:42 +00:00
|
|
|
fpl->cpus = realloc(fpl->cpus, cpus * sizeof(CPUData));
|
2014-11-27 18:27:34 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < cpus; i++) {
|
2015-03-16 06:13:42 +00:00
|
|
|
fpl->cpus[i].totalTime = 1;
|
|
|
|
fpl->cpus[i].totalPeriod = 1;
|
2014-11-27 18:27:34 +00:00
|
|
|
}
|
2014-11-27 19:44:55 +00:00
|
|
|
|
2014-11-27 20:31:39 +00:00
|
|
|
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;
|
|
|
|
}
|
2014-11-27 18:27:34 +00:00
|
|
|
|
2014-11-27 20:31:39 +00:00
|
|
|
void ProcessList_delete(ProcessList* this) {
|
|
|
|
const FreeBSDProcessList* fpl = (FreeBSDProcessList*) this;
|
|
|
|
if (fpl->kd) kvm_close(fpl->kd);
|
|
|
|
|
|
|
|
ProcessList_done(this);
|
|
|
|
free(this);
|
2014-11-27 19:44:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline void FreeBSDProcessList_scanMemoryInfo(ProcessList* pl) {
|
|
|
|
const FreeBSDProcessList* fpl = (FreeBSDProcessList*) pl;
|
|
|
|
|
|
|
|
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);
|
2014-11-27 20:31:39 +00:00
|
|
|
pl->usedMem *= pageSizeKb;
|
2014-11-27 19:44:55 +00:00
|
|
|
pl->freeMem = pl->totalMem - pl->usedMem;
|
2014-11-27 20:31:39 +00:00
|
|
|
sysctl(MIB_vm_stats_vm_v_cache_count, 4, &(pl->cachedMem), &len, NULL, 0);
|
|
|
|
pl->cachedMem *= pageSizeKb;
|
2014-11-27 19:44:55 +00:00
|
|
|
|
2014-11-27 20:31:39 +00:00
|
|
|
struct kvm_swap swap[16];
|
|
|
|
int nswap = kvm_getswapinfo(fpl->kd, swap, sizeof(swap)/sizeof(swap[0]), 0);
|
2014-11-27 19:44:55 +00:00
|
|
|
pl->totalSwap = 0;
|
2014-11-27 20:31:39 +00:00
|
|
|
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
|
2014-11-27 18:27:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ProcessList_scan(ProcessList* this) {
|
|
|
|
(void) this;
|
2014-11-27 19:44:55 +00:00
|
|
|
|
|
|
|
FreeBSDProcessList_scanMemoryInfo(this);
|
|
|
|
|
2014-11-27 18:27:34 +00:00
|
|
|
// stub!
|
|
|
|
}
|