summaryrefslogtreecommitdiff
path: root/sysdeps/freebsd
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/freebsd')
-rw-r--r--sysdeps/freebsd/mem.c67
1 files changed, 39 insertions, 28 deletions
diff --git a/sysdeps/freebsd/mem.c b/sysdeps/freebsd/mem.c
index 3e1d4ab0..a9e9d253 100644
--- a/sysdeps/freebsd/mem.c
+++ b/sysdeps/freebsd/mem.c
@@ -45,46 +45,57 @@ _glibtop_init_mem_s (glibtop *server)
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
glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
{
gulong memtotal;
- guint memused;
- gulong buffers;
- guint cached;
- size_t len;
+ gulong memactive;
+ gulong meminactive;
+ gulong memwired;
+ gulong memcached;
+ gulong membuffer;
+ gulong memfree;
glibtop_init_s (&server, GLIBTOP_SYSDEPS_MEM, 0);
memset (buf, 0, sizeof *buf);
- len = sizeof (memtotal);
- if (sysctlbyname ("hw.physmem", &memtotal, &len, NULL, 0)) {
- glibtop_warn_io_r (server, "sysctl (hw.physmem)");
- return;
- }
-
- len = sizeof (memused);
- 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;
+ memtotal = mem_get_by_bytes (server, "hw.physmem");
+ memactive = mem_get_by_pages (server, "vm.stats.vm.v_active_count");
+ meminactive = mem_get_by_pages (server, "vm.stats.vm.v_inactive_count");
+ 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");
+ memfree = mem_get_by_pages (server, "vm.stats.vm.v_free_count");
buf->total = memtotal;
- buf->used = (memused * (gulong) pagesize);
- buf->free = (buf->total - buf->used);
+ buf->used = memtotal - memfree;
+ buf->free = memfree;
buf->shared = 0;
- buf->cached = (cached * (gulong) pagesize);
- buf->buffer = buffers;
+ buf->buffer = membuffer;
+ 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;
}