Page MenuHomeFreeBSD
Authored By
dougm
Dec 17 2019, 10:20 PM
Size
4 KB
Referenced Files
None
Subscribers
None

gtop.diff

diff --git a/sysdeps/freebsd/procmap.c b/sysdeps/freebsd/procmap.c
index 92ae9368..d06e4af9 100644
--- a/sysdeps/freebsd/procmap.c
+++ b/sysdeps/freebsd/procmap.c
@@ -231,6 +231,33 @@ _glibtop_init_proc_map_p (glibtop *server)
server->sysdeps.proc_map = _glibtop_sysdeps_proc_map;
}
+static int
+vm_map_reader(void *token, vm_map_entry_t addr, vm_map_entry_t dest)
+{
+ kvm_t kd;
+
+ kd = (kvm_t *)token;
+ return (kvm_read(kd, (gulong)addr, dest, sizeof(*dest)) ==
+ sizeof(*dest));
+}
+
+#if FREEBSDV<1300062
+typedef int vm_map_entry_reader(void *token, vm_map_entry_t addr,
+ vm_map_entry_t dest);
+
+static inline vm_map_entry_t
+vm_map_entry_read_succ(void *token, struct vm_map_entry *const clone,
+ vm_map_entry_reader reader)
+{
+ vm_map_entry_t next;
+
+ next = clone->next;
+ if (!reader(token, next, clone))
+ return (NULL);
+ return (next);
+}
+#endif /* FREEBSD<1300062 */
+
/* Provides detailed information about a process. */
glibtop_map_entry *
@@ -238,13 +265,12 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf,
pid_t pid)
{
struct kinfo_proc *pinfo;
- struct vm_map_entry entry, *first;
+ struct vm_map_entry entry;
struct vmspace vmspace;
struct vm_object object;
GArray *maps;
struct vnode vnode;
- int count;
- int update = 0;
+ int i, count;
memset (buf, 0, sizeof (glibtop_proc_map));
@@ -273,24 +299,6 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf,
return NULL;
}
-#if (__FreeBSD_version >= 1300062)
- first = vmspace.vm_map.header.right;
-#else
- first = vmspace.vm_map.header.next;
-#endif
-
- if (kvm_read (server->machine->kd,
-#if (__FreeBSD_version >= 1300062)
- (gulong) vmspace.vm_map.header.right,
-#else
- (gulong) vmspace.vm_map.header.next,
-#endif
- (char *) &entry, sizeof (entry)) != sizeof (entry)) {
- glibtop_warn_io_r (server, "kvm_read (entry)");
- glibtop_suid_leave (server);
- return NULL;
- }
-
/* Walk through the `vm_map_entry' list ... */
/* I tested this a few times with `mmap'; as soon as you write
@@ -300,25 +308,17 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf,
maps = g_array_sized_new(FALSE, FALSE, sizeof(glibtop_map_entry),
vmspace.vm_map.nentries);
- do {
+ entry = vmspace.vm_map.header;
+ for (i = 0; i < vmspace.vm_map.nentries; i++) {
glibtop_map_entry *mentry;
guint64 inum, dev;
guint len;
- if (update) {
- if (kvm_read (server->machine->kd,
-#if (__FreeBSD_version >= 1300062)
- (gulong) entry.right,
-#else
- (gulong) entry.next,
-#endif
- (char *) &entry, sizeof (entry)) != sizeof (entry)) {
- glibtop_warn_io_r (server, "kvm_read (entry)");
- continue;
- }
- } else {
- update = 1;
- }
+ if (!vm_map_entry_read_succ(server->machine->kd, &entry, vm_map_reader)) {
+ glibtop_warn_io_r (server, "kvm_read (entry)");
+ glibtop_suid_leave (server);
+ return NULL;
+ }
if (entry.eflags & (MAP_ENTRY_IS_SUB_MAP))
continue;
@@ -388,13 +388,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf,
mentry->perm |= GLIBTOP_MAP_PERM_WRITE;
if (entry.protection & VM_PROT_EXECUTE)
mentry->perm |= GLIBTOP_MAP_PERM_EXECUTE;
-
-#if (__FreeBSD_version >= 1300062)
- } while (entry.right != first);
-#else
- } while (entry.next != first);
-#endif
-
+ }
glibtop_suid_leave (server);
buf->flags = _glibtop_sysdeps_proc_map;

File Metadata

Mime Type
text/x-diff
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2455666
Default Alt Text
gtop.diff (4 KB)

Event Timeline