freebsd: rework system memory usage
Change the value of memory usage from: Used = Wired Free = Total - Wired Shared = 0 Buffer = 0 Cached = Cache User = Wired - Cache Locked = Not Supported To: Used = Total - Free Free = Free Shared = 0 Buffer = Buf Cached = Cache User = Active + Wired Locked = Not Supported The left-hand side means fields in the glibtop_mem struct and the right-hand side means the value showed by `top' command. This change should make the value showed by gnome-system-monitor, which uses `User' field, become closer to the real memory usage. All sysctlbyname code in sysdeps/freebsd/mem.c has been moved to separate functions to make the code cleaner.
This commit is contained in:
@@ -45,46 +45,57 @@ _glibtop_init_mem_s (glibtop *server)
|
|||||||
server->sysdeps.mem = _glibtop_sysdeps_mem;
|
server->sysdeps.mem = _glibtop_sysdeps_mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gulong mem_get_by_bytes (glibtop *server, const char *name) {
|
||||||
|
gulong result = 0;
|
||||||
|
size_t len = sizeof (result);
|
||||||
|
|
||||||
|
if (sysctlbyname (name, &result, &len, NULL, 0)) {
|
||||||
|
glibtop_warn_io_r (server, "sysctl (%s)", name);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gulong mem_get_by_pages (glibtop *server, const char *name) {
|
||||||
|
guint result = 0;
|
||||||
|
size_t len = sizeof (result);
|
||||||
|
|
||||||
|
if (sysctlbyname (name, &result, &len, NULL, 0)) {
|
||||||
|
glibtop_warn_io_r (server, "sysctl (%s)", name);
|
||||||
|
}
|
||||||
|
return (gulong) result * pagesize;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
|
glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
|
||||||
{
|
{
|
||||||
gulong memtotal;
|
gulong memtotal;
|
||||||
guint memused;
|
gulong memactive;
|
||||||
gulong buffers;
|
gulong meminactive;
|
||||||
guint cached;
|
gulong memwired;
|
||||||
size_t len;
|
gulong memcached;
|
||||||
|
gulong membuffer;
|
||||||
|
gulong memfree;
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_MEM, 0);
|
glibtop_init_s (&server, GLIBTOP_SYSDEPS_MEM, 0);
|
||||||
|
|
||||||
memset (buf, 0, sizeof *buf);
|
memset (buf, 0, sizeof *buf);
|
||||||
|
|
||||||
len = sizeof (memtotal);
|
memtotal = mem_get_by_bytes (server, "hw.physmem");
|
||||||
if (sysctlbyname ("hw.physmem", &memtotal, &len, NULL, 0)) {
|
memactive = mem_get_by_pages (server, "vm.stats.vm.v_active_count");
|
||||||
glibtop_warn_io_r (server, "sysctl (hw.physmem)");
|
meminactive = mem_get_by_pages (server, "vm.stats.vm.v_inactive_count");
|
||||||
return;
|
memwired = mem_get_by_pages (server, "vm.stats.vm.v_wire_count");
|
||||||
}
|
memcached = mem_get_by_pages (server, "vm.stats.vm.v_cache_count");
|
||||||
|
membuffer = mem_get_by_bytes (server, "vfs.bufspace");
|
||||||
len = sizeof (memused);
|
memfree = mem_get_by_pages (server, "vm.stats.vm.v_free_count");
|
||||||
if (sysctlbyname ("vm.stats.vm.v_wire_count", &memused, &len, NULL, 0)) {
|
|
||||||
glibtop_warn_io_r (server, "sysctl (vm.stats.vm.v_wire_count)");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = sizeof (cached);
|
|
||||||
if (sysctlbyname ("vm.stats.vm.v_cache_count", &cached, &len, NULL, 0)) {
|
|
||||||
glibtop_warn_io_r (server, "sysctl (vm.stats.vm.v_cache_count)");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffers = 0;
|
|
||||||
|
|
||||||
buf->total = memtotal;
|
buf->total = memtotal;
|
||||||
buf->used = (memused * (gulong) pagesize);
|
buf->used = memtotal - memfree;
|
||||||
buf->free = (buf->total - buf->used);
|
buf->free = memfree;
|
||||||
buf->shared = 0;
|
buf->shared = 0;
|
||||||
buf->cached = (cached * (gulong) pagesize);
|
buf->buffer = membuffer;
|
||||||
buf->buffer = buffers;
|
buf->cached = memcached;
|
||||||
|
buf->locked = 0;
|
||||||
|
|
||||||
buf->user = buf->total - buf->free - buf->cached - buf->buffer;
|
buf->user = memactive + memwired;
|
||||||
buf->flags = _glibtop_sysdeps_mem;
|
buf->flags = _glibtop_sysdeps_mem;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user