aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/top/machine.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c
index 180d67b9b714..0cd412644bf0 100644
--- a/usr.bin/top/machine.c
+++ b/usr.bin/top/machine.c
@@ -415,17 +415,39 @@ get_system_info(struct system_info *si)
#define NOPROC ((void *)-1)
+/*
+ * We need to compare data from the old process entry with the new
+ * process entry.
+ * To facilitate doing this quickly we stash a pointer in the kinfo_proc
+ * structure to cache the mapping. We also use a negative cache pointer
+ * of NOPROC to avoid duplicate lookups.
+ * XXX: this could be done when the actual processes are fetched, we do
+ * it here out of laziness.
+ */
const struct kinfo_proc *
get_old_proc(struct kinfo_proc *pp)
{
struct kinfo_proc **oldpp, *oldp;
+ /*
+ * If this is the first fetch of the kinfo_procs then we don't have
+ * any previous entries.
+ */
if (previous_proc_count == 0)
return (NULL);
+ /* negative cache? */
if (pp->ki_udata == NOPROC)
return (NULL);
+ /* cached? */
if (pp->ki_udata != NULL)
return (pp->ki_udata);
+ /*
+ * Not cached,
+ * 1) look up based on pid.
+ * 2) compare process start.
+ * If we fail here, then setup a negative cache entry, otherwise
+ * cache it.
+ */
oldpp = bsearch(&pp, previous_pref, previous_proc_count,
sizeof(*previous_pref), compare_pid);
if (oldpp == NULL) {
@@ -441,6 +463,10 @@ get_old_proc(struct kinfo_proc *pp)
return (oldp);
}
+/*
+ * Return the total amount of IO done in blocks in/out and faults.
+ * store the values individually in the pointers passed in.
+ */
long
get_io_stats(struct kinfo_proc *pp, long *inp, long *oup, long *flp)
{
@@ -464,6 +490,9 @@ get_io_stats(struct kinfo_proc *pp, long *inp, long *oup, long *flp)
return (ret);
}
+/*
+ * Return the total number of block in/out and faults by a process.
+ */
long
get_io_total(struct kinfo_proc *pp)
{