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:
Ting-Wei Lan
2015-05-02 21:36:22 +08:00
parent 58ca70eaee
commit a206cfc728

View File

@@ -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;
} }