summaryrefslogtreecommitdiff
path: root/src/libvmon
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2025-04-11 15:01:55 -0700
committerVito Caputo <vcaputo@pengaru.com>2025-04-11 18:26:03 -0700
commitd68b2deb370fc474f3b2adc8e4e1e37d385e2893 (patch)
tree9988edffe7eb665711cfff558e5cfb750ca887f1 /src/libvmon
parent98d6a06b8050082c2f45ebaf027c2bf324d4dc8a (diff)
libvmon: introduce VMON_FLAG_NEGLECT_THREADS flag
--hide-threads needs a way to tell libvmon to both follow threads and neglect to actually sample them. Note this will still allocate the vmon_proc_t for every thread, but conserves in the open proc files department by not opening/reading everything other than the children proc file for threads - regardless of what other proc wants have been specified. So front-ends still need to traverse threads of processes, and if they want to collapse the children of threads as if they're all children of the threads' parent, that's up to the front-end to do so. In the vwm/vmon case, that's a detail for charts.c to handle, when --hide-threads is in effect. It will have to render the children of threads as if they're children of the threads' parent, to hide this clusterfuck from what's visible to the user.
Diffstat (limited to 'src/libvmon')
-rw-r--r--src/libvmon/defs/proc_wants.def4
-rw-r--r--src/libvmon/vmon.c10
-rw-r--r--src/libvmon/vmon.h3
3 files changed, 15 insertions, 2 deletions
diff --git a/src/libvmon/defs/proc_wants.def b/src/libvmon/defs/proc_wants.def
index f08f08c..a3c3cd7 100644
--- a/src/libvmon/defs/proc_wants.def
+++ b/src/libvmon/defs/proc_wants.def
@@ -2,6 +2,10 @@
/* the available per-process wants, the order here matters, put wants which affect the sampling hierarchy first */
/* otherwise they will change the hierarchy after samples have been collected, leaving newly introduced nodes with uninitialized sample stores after return from vmon_sample() */
+/* also PROC_FOLLOW_THREADS must be the last thing before the sampling wants, because those get skipped
+ * if VMON_FLAG_NEGLECT_THREADS is set even when following threaads, and that's done by skipping wants
+ * greater than VMON_FLAG_NEGLECT_THREADS for threads at sample time.
+ */
/* sym, name, internal fulfilllment function */
vmon_want(PROC_FOLLOW_CHILDREN, proc_follow_children, proc_follow_children)
diff --git a/src/libvmon/vmon.c b/src/libvmon/vmon.c
index 618f224..b9565dd 100644
--- a/src/libvmon/vmon.c
+++ b/src/libvmon/vmon.c
@@ -1445,8 +1445,14 @@ static void sample(vmon_t *vmon, vmon_proc_t *proc)
proc->activity = 0;
for (i = 0, cur = 1; wants; cur <<= 1, i++) {
if (wants & cur) {
- if (vmon->proc_funcs[i](vmon, proc, &proc->stores[i]) == SAMPLE_CHANGED)
- proc->activity |= cur;
+ /* XXX: this is a bit awkward, but in constrained environments you might want to only follow threads while
+ * suppressing their sampling of the other WANT_PROC* data. To achieve that you specify VMON_FLAG_NEGLECT_THREADS
+ * in combination with VMON_WANT_PROC_FOLLOW_THREADS. The following line is what makes that actually work.
+ * This also adds another ordering dependency in proc_wants.def
+ */
+ if (!proc->is_thread || !(vmon->flags & VMON_FLAG_NEGLECT_THREADS) || cur <= VMON_WANT_PROC_FOLLOW_THREADS)
+ if (vmon->proc_funcs[i](vmon, proc, &proc->stores[i]) == SAMPLE_CHANGED)
+ proc->activity |= cur;
wants &= ~cur;
}
diff --git a/src/libvmon/vmon.h b/src/libvmon/vmon.h
index cf9ea09..f1042c9 100644
--- a/src/libvmon/vmon.h
+++ b/src/libvmon/vmon.h
@@ -18,6 +18,9 @@ typedef enum _vmon_flags_t {
VMON_FLAG_PROC_ARRAY = 1L, /* maintain a process array (useful if you need to do things like implement top(1) */
VMON_FLAG_PROC_ALL = 1L << 1, /* monitor all the processes in the system (XXX this has some follow_children implications...) */
VMON_FLAG_2PASS = 1L << 2, /* perform all sampling/wants in a first pass, then invoke all callbacks in second in vmon_sample(), important if your callbacks are layout-sensitive (vwm) */
+ VMON_FLAG_NEGLECT_THREADS = 1L << 3, /* only actually sample processes, even if we're following threads
+ * (for situations where you still want to monitor children of threads, but don't care about per-thread monitoring)
+ */
} vmon_flags_t;
/* store ids, used as indices into the stores array, and shift offsets for the wants mask */
© All Rights Reserved