--- ProcessList.c.orig 2013-04-21 03:39:12.000000000 +0800 +++ ProcessList.c 2013-04-21 03:41:41.000000000 +0800 @@ -25,6 +25,19 @@ #include #include +#ifndef PAGE_SIZE +#define PAGE_SIZE sysconf(_SC_PAGESIZE) +#endif + +#ifdef __FreeBSD__ +#define KB 1024 +#define SYSCTLBYNAME(name, var, len) sysctlbyname(name, &(var), &(len), NULL, 0) +#include +#include +#include +#include +#endif + /*{ #include "Vector.h" #include "Hashtable.h" @@ -685,7 +698,7 @@ unsigned long long int lasttimes = (process->utime + process->stime); if (! ProcessList_readStatFile(process, dirname, name, command)) goto errorReadingProcess; - Process_updateIOPriority(process); +// Process_updateIOPriority(process); float percent_cpu = (process->utime + process->stime - lasttimes) / period * 100.0; process->percent_cpu = MAX(MIN(percent_cpu, cpus*100.0), 0.0); if (isnan(process->percent_cpu)) process->percent_cpu = 0.0; @@ -764,13 +777,15 @@ void ProcessList_scan(ProcessList* this) { unsigned long long int usertime, nicetime, systemtime, systemalltime, idlealltime, idletime, totaltime, virtalltime; - unsigned long long int swapFree = 0; + int cpus = this->cpuCount; + FILE* file = NULL; - FILE* file = fopen(PROCMEMINFOFILE, "r"); + #ifndef __FreeBSD__ + unsigned long long int swapFree = 0; + file = fopen(PROCMEMINFOFILE, "r"); if (file == NULL) { CRT_fatalError("Cannot open " PROCMEMINFOFILE); } - int cpus = this->cpuCount; { char buffer[128]; while (fgets(buffer, 128, file)) { @@ -805,6 +820,33 @@ this->usedMem = this->totalMem - this->freeMem; this->usedSwap = this->totalSwap - swapFree; fclose(file); + #endif + + #ifdef __FreeBSD__ + kvm_t *kd = NULL; + struct kvm_swap kvmswapinfo[1]; + size_t len = 0; + + kd = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, NULL); + assert(kd != NULL); + kvm_getswapinfo(kd, kvmswapinfo, 1, 0); + this->totalSwap = kvmswapinfo[0].ksw_total * (PAGE_SIZE / KB); + this->usedSwap = kvmswapinfo[0].ksw_used * (PAGE_SIZE / KB); + kvm_close(kd); + len = sizeof(this->totalMem); + SYSCTLBYNAME("vm.stats.vm.v_page_count", this->totalMem, len); + this->totalMem *= PAGE_SIZE / KB; + len = sizeof(this->cachedMem); + SYSCTLBYNAME("vm.stats.vm.v_cache_count", this->cachedMem, len); + this->cachedMem *= PAGE_SIZE / KB; + len = sizeof(this->buffersMem); + SYSCTLBYNAME("vfs.bufspace", this->buffersMem, len); + this->buffersMem /= KB; + len = sizeof(this->usedMem); + SYSCTLBYNAME("vm.stats.vm.v_active_count", this->usedMem, len); + this->usedMem = this->usedMem * PAGE_SIZE / KB + this->cachedMem + this->buffersMem; + this->freeMem = this->totalMem - this->usedMem; + #endif file = fopen(PROCSTATFILE, "r"); if (file == NULL) {