You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kcontrol/info/memory_fbsd.cpp

90 lines
2.4 KiB

#include <sys/types.h>
#include <sys/sysctl.h>
#include <sys/vmmeter.h>
#include <vm/vm_param.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void KMemoryWidget::update()
{
char blah[10], buf[80], *used_str, *total_str;
/* Stuff for sysctl */
int memory;
size_t len;
/* Stuff for swap display */
int used, total, _free;
FILE *pipe;
len=sizeof(memory);
sysctlbyname("hw.physmem", &memory, &len, NULL, 0);
snprintf(blah, 10, "%d", memory);
// Numerical values
// total physical memory (without swap space)
Memory_Info[TOTAL_MEM] = MEMORY(memory);
// added by Brad Hughes bhughes@trolltech.com
struct vmtotal vmem;
#warning "FIXME: Memory_Info[CACHED_MEM]"
Memory_Info[CACHED_MEM] = NO_MEMORY_INFO;
// The sysctls don't work in a nice manner under FreeBSD v2.2.x
// so we assume that if sysctlbyname doesn't return what we
// prefer, assume it's the old data types. FreeBSD prior
// to 4.0-R isn't supported by the rest of KDE, so what is
// this code doing here.
len = sizeof(vmem);
if (sysctlbyname("vm.vmmeter", &vmem, &len, NULL, 0) == 0)
Memory_Info[SHARED_MEM] = MEMORY(vmem.t_armshr) * PAGE_SIZE;
else
Memory_Info[SHARED_MEM] = NO_MEMORY_INFO;
int buffers;
len = sizeof (buffers);
if ((sysctlbyname("vfs.bufspace", &buffers, &len, NULL, 0) == -1) || !len)
Memory_Info[BUFFER_MEM] = NO_MEMORY_INFO;
else
Memory_Info[BUFFER_MEM] = MEMORY(buffers);
// total free physical memory (without swap space)
int free;
len = sizeof (buffers);
if ((sysctlbyname("vm.stats.vm.v_free_count", &free, &len, NULL, 0) == -1) || !len)
Memory_Info[FREE_MEM] = NO_MEMORY_INFO;
else
Memory_Info[FREE_MEM] = MEMORY(free) * getpagesize();
// Q&D hack for swap display. Borrowed from xsysinfo-1.4
if ((pipe = popen("/usr/sbin/pstat -ks", "r")) == NULL) {
used = total = 1;
return;
}
fgets(buf, sizeof(buf), pipe);
fgets(buf, sizeof(buf), pipe);
fgets(buf, sizeof(buf), pipe);
fgets(buf, sizeof(buf), pipe);
pclose(pipe);
strtok(buf, " ");
total_str = strtok(NULL, " ");
used_str = strtok(NULL, " ");
used = atoi(used_str);
total = atoi(total_str);
_free=total-used;
// total size of all swap-partitions
Memory_Info[SWAP_MEM] = MEMORY(total) * 1024;
// free memory in swap-partitions
Memory_Info[FREESWAP_MEM] = MEMORY(_free) * 1024;
}