[DTrace-devel] [PATCH 04/11] Add ability to provide user-specified probes on demand

eugene.loh at oracle.com eugene.loh at oracle.com
Sun Jun 28 23:23:23 PDT 2020


From: Eugene Loh <eugene.loh at oracle.com>

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_probe.c    | 20 ++++++++++++++++++++
 libdtrace/dt_provider.h |  2 ++
 2 files changed, 22 insertions(+)

diff --git a/libdtrace/dt_probe.c b/libdtrace/dt_probe.c
index 46c47fbe..be407dd2 100644
--- a/libdtrace/dt_probe.c
+++ b/libdtrace/dt_probe.c
@@ -1141,6 +1141,26 @@ dt_probe_iter(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp,
 
 	tmpl.desc = pdp;
 
+	/*
+	 * Special case: if the probe name is specified,
+	 * give all providers the opportunity to provide it.
+	 */
+	if (n_is_glob == 0) {
+		dt_provider_t *pvp;
+		dtrace_probedesc_t pd;
+
+		/* loop over providers */
+		for (pvp = dt_list_next(&dtp->dt_provlist);
+		    pvp != NULL; pvp = dt_list_next(pvp)) {
+			if (pvp->impl->provide == NULL ||
+			    !dt_gmatch(pvp->desc.dtvd_name, pdp->prv))
+				continue;
+			memcpy(&pd, pdp, sizeof (pd));
+			pd.prv = pvp->desc.dtvd_name;
+			pvp->impl->provide(dtp, &pd);
+		}
+	}
+
 	/*
 	 * Special case: if the probe is fully specified (none of the elements
 	 * are empty of a glob pattern, we can do a direct lookup based on the
diff --git a/libdtrace/dt_provider.h b/libdtrace/dt_provider.h
index e98bfac1..50f663f1 100644
--- a/libdtrace/dt_provider.h
+++ b/libdtrace/dt_provider.h
@@ -62,6 +62,8 @@ typedef struct dt_provimpl {
 	int (*probe_info)(dtrace_hdl_t *dtp,	/* get probe info */
 			  const struct dt_probe *prp,
 			  int *idp, int *argcp, dt_argdesc_t **argvp);
+	int (*provide)(dtrace_hdl_t *dtp,	/* provide probes */
+		       const dtrace_probedesc_t *pdp);
 	void (*trampoline)(dt_pcb_t *pcb);	/* generate BPF trampoline */
 	int (*probe_fini)(dtrace_hdl_t *dtp,	/* probe cleanup */
 			  struct dt_probe *prb);
-- 
2.18.2




More information about the DTrace-devel mailing list