diff options
Diffstat (limited to 'devel/libgtop2/files/patch-systeps::freebsd::procmap.c')
-rw-r--r-- | devel/libgtop2/files/patch-systeps::freebsd::procmap.c | 152 |
1 files changed, 148 insertions, 4 deletions
diff --git a/devel/libgtop2/files/patch-systeps::freebsd::procmap.c b/devel/libgtop2/files/patch-systeps::freebsd::procmap.c index c8c701e46eca..a17e9595e7c8 100644 --- a/devel/libgtop2/files/patch-systeps::freebsd::procmap.c +++ b/devel/libgtop2/files/patch-systeps::freebsd::procmap.c @@ -1,11 +1,155 @@ ---- sysdeps/freebsd/procmap.c Wed Feb 23 17:20:45 2005 -+++ sysdeps/freebsd/procmap.c.orig Sat Mar 19 02:46:57 2005 -@@ -129,7 +129,7 @@ +--- sysdeps/freebsd/procmap.c.orig Mon Dec 12 05:09:39 2005 ++++ sysdeps/freebsd/procmap.c Fri Jan 20 16:28:33 2006 +@@ -108,14 +108,16 @@ glibtop_get_proc_map_p (glibtop *server, + #else + struct vm_object object; + #endif +- glibtop_map_entry *maps; ++ GArray *maps = g_array_sized_new(FALSE, FALSE, ++ sizeof(glibtop_map_entry), ++ 100); + #if defined __FreeBSD__ + struct vnode vnode; + #if __FreeBSD_version < 500039 + struct inode inode; + #endif + #endif +- int count, i = 0; ++ int count; + int update = 0; + + glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_PROC_MAP), 0); +@@ -123,15 +125,15 @@ glibtop_get_proc_map_p (glibtop *server, + memset (buf, 0, sizeof (glibtop_proc_map)); + + /* It does not work for the swapper task. */ +- if (pid == 0) return NULL; ++ if (pid == 0) return (glibtop_map_entry*) g_array_free(maps, TRUE); + + glibtop_suid_enter (server); + /* Get the process data */ pinfo = kvm_getprocs (server->machine.kd, KERN_PROC_PID, pid, &count); if ((pinfo == NULL) || (count < 1)) { - glibtop_error_io_r (server, "kvm_getprocs (%d)", pid); +- return NULL; + glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); - return NULL; ++ return (glibtop_map_entry*) g_array_free(maps, TRUE); } + /* Now we get the memory maps. */ +@@ -159,8 +161,6 @@ glibtop_get_proc_map_p (glibtop *server, + + buf->total = buf->number * buf->size; + +- maps = g_malloc0(buf->total); +- + buf->flags = _glibtop_sysdeps_proc_map; + + /* Walk through the `vm_map_entry' list ... */ +@@ -170,6 +170,10 @@ glibtop_get_proc_map_p (glibtop *server, + * to OBJT_DEFAULT so if seems this really works. */ + + do { ++ glibtop_map_entry *mentry; ++ unsigned long inode, dev; ++ guint len; ++ + if (update) { + if (kvm_read (server->machine.kd, + (unsigned long) entry.next, +@@ -197,22 +201,6 @@ glibtop_get_proc_map_p (glibtop *server, + #endif + #endif + +- maps [i].flags = _glibtop_sysdeps_map_entry; +- +- maps [i].start = entry.start; +- maps [i].end = entry.end; +- maps [i].offset = entry.offset; +- +- maps [i].perm = 0; +- +- if (entry.protection & VM_PROT_READ) +- maps [i].perm |= GLIBTOP_MAP_PERM_READ; +- if (entry.protection & VM_PROT_WRITE) +- maps [i].perm |= GLIBTOP_MAP_PERM_WRITE; +- if (entry.protection & VM_PROT_EXECUTE) +- maps [i].perm |= GLIBTOP_MAP_PERM_EXECUTE; +- +- i++; + + #if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + if (!entry.object.uvm_obj) +@@ -224,7 +212,7 @@ glibtop_get_proc_map_p (glibtop *server, + (unsigned long) entry.object.uvm_obj, + &vnode, sizeof (vnode)) != sizeof (vnode)) { + glibtop_warn_io_r (server, "kvm_read (vnode)"); +- return NULL; ++ return (glibtop_map_entry*) g_array_free(maps, TRUE); + } + #else + if (!entry.object.vm_object) +@@ -251,8 +239,8 @@ glibtop_get_proc_map_p (glibtop *server, + &inode, sizeof (inode)) != sizeof (inode)) + glibtop_error_io_r (server, "kvm_read (inode)"); + +- maps [i-1].inode = inode.i_number; +- maps [i-1].device = inode.i_dev; ++ inode = inode.i_number; ++ dev = inode.i_dev; + #endif + + +@@ -274,8 +262,8 @@ glibtop_get_proc_map_p (glibtop *server, + switch (vnode.v_type) { + case VREG: + #if __FreeBSD_version < 600006 +- maps [i-1].inode = vnode.v_cachedid; +- maps [i-1].device = vnode.v_cachedfs; ++ inode = vnode.v_cachedid; ++ dev = vnode.v_cachedfs; + #endif + default: + continue; +@@ -289,11 +277,37 @@ glibtop_get_proc_map_p (glibtop *server, + &inode, sizeof (inode)) != sizeof (inode)) + glibtop_error_io_r (server, "kvm_read (inode)"); + +- maps [i-1].inode = inode.i_number; +- maps [i-1].device = inode.i_dev; ++ inode = inode.i_number; ++ dev = inode.i_dev; + #endif + #endif ++ len = maps->len; ++ g_array_set_size(maps, len + 1); ++ mentry = &g_array_index(maps, glibtop_map_entry, len); ++ ++ mentry->flags = _glibtop_sysdeps_map_entry; ++ ++ mentry->start = (guint64) entry.start; ++ mentry->end = (guint64) entry.end; ++ mentry->offset = (guint64) entry.offset; ++ mentry->device = (guint64) dev; ++ mentry->inode = (guint64) inode; ++ ++ mentry->perm = (guint64) 0; ++ ++ if (entry.protection & VM_PROT_READ) ++ mentry->perm |= GLIBTOP_MAP_PERM_READ; ++ if (entry.protection & VM_PROT_WRITE) ++ mentry->perm |= GLIBTOP_MAP_PERM_WRITE; ++ if (entry.protection & VM_PROT_EXECUTE) ++ mentry->perm |= GLIBTOP_MAP_PERM_EXECUTE; + } while (entry.next != first); + +- return maps; ++ buf->flags = _glibtop_sysdeps_proc_map; ++ ++ buf->number = maps->len; ++ buf->size = sizeof (glibtop_map_entry); ++ buf->total = buf->number * buf->size; ++ ++ return (glibtop_map_entry*) g_array_free(maps, FALSE); + } |