From d44df22180ed6733dda20b1bedbfacd7c9abe928 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Mon, 10 Aug 1998 12:27:43 +0000 Subject: [PATCH] Getting shared memory size seems to work now. --- sysdeps/freebsd/procmem.c | 51 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/sysdeps/freebsd/procmem.c b/sysdeps/freebsd/procmem.c index 716688a7..92dc0835 100644 --- a/sysdeps/freebsd/procmem.c +++ b/sysdeps/freebsd/procmem.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -39,6 +40,7 @@ static const unsigned long _glibtop_sysdeps_proc_mem = (1 << GLIBTOP_PROC_MEM_SIZE) + (1 << GLIBTOP_PROC_MEM_VSIZE) + +(1 << GLIBTOP_PROC_MEM_SHARE) + (1 << GLIBTOP_PROC_MEM_RESIDENT) + (1 << GLIBTOP_PROC_MEM_RSS) + (1 << GLIBTOP_PROC_MEM_RSS_RLIM); @@ -83,8 +85,10 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, { struct kinfo_proc *pinfo; struct user *u_addr = (struct user *)USRSTACK; + struct vm_map_entry entry, *first; + struct vmspace *vms, vmspace; + struct vm_object object; struct plimit plimit; - struct vmspace *vms; int count; glibtop_suid_enter (server); @@ -112,5 +116,50 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, buf->resident = buf->rss = (u_int64_t) pagetok (vms->vm_rssize) << LOG1024; + /* Now we get the shared memory. */ + + if (kvm_read (server->machine.kd, + (unsigned long) pinfo [0].kp_proc.p_vmspace, + (char *) &vmspace, sizeof (vmspace)) != sizeof (vmspace)) + glibtop_error_io_r (server, "kvm_read (vmspace)"); + + first = vmspace.vm_map.header.next; + + if (kvm_read (server->machine.kd, + (unsigned long) vmspace.vm_map.header.next, + (char *) &entry, sizeof (entry)) != sizeof (entry)) + glibtop_error_io_r (server, "kvm_read (entry)"); + + /* Walk through the `vm_map_entry' list ... */ + + /* I tested this a few times with `mmap'; as soon as you write + * to the mmap'ed area, the object type changes from OBJT_VNODE + * to OBJT_DEFAULT so if seems this really works. */ + + while (entry.next != first) { + if (kvm_read (server->machine.kd, + (unsigned long) entry.next, + &entry, sizeof (entry)) != sizeof (entry)) + glibtop_error_io_r (server, "kvm_read (entry)"); + + if (entry.eflags & (MAP_ENTRY_IS_A_MAP|MAP_ENTRY_IS_SUB_MAP)) + continue; + + if (!entry.object.vm_object) + continue; + + /* We're only interested in `vm_object's */ + + if (kvm_read (server->machine.kd, + (unsigned long) entry.object.vm_object, + &object, sizeof (object)) != sizeof (object)) + glibtop_error_io_r (server, "kvm_read (object)"); + + /* If the object is of type vnode, add its size */ + + if (object.type == OBJT_VNODE) + buf->share += object.un_pager.vnp.vnp_size; + } + buf->flags = _glibtop_sysdeps_proc_mem; }