[DTrace-devel] [PATCH 01/12] Change use of dtrace_probe_iter()

eugene.loh at oracle.com eugene.loh at oracle.com
Sat Jul 11 17:38:25 PDT 2020


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

In DTrace v1, dtrace_probe_iter() was used to iterate over probes,
using dt_probe_iter() as a callback function.

In the current release, dtrace_probe_iter() will be used as an external
API, with dt_probe_iter() the "internal" (to libdtrace) interface.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_probe.c | 30 ++++++++++++------------------
 1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/libdtrace/dt_probe.c b/libdtrace/dt_probe.c
index b6c79354..4068fb83 100644
--- a/libdtrace/dt_probe.c
+++ b/libdtrace/dt_probe.c
@@ -960,10 +960,12 @@ dt_probe_args_info(dtrace_hdl_t *dtp, dt_probe_t *prp)
 
 /*ARGSUSED*/
 static int
-dt_probe_desc(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp, void *arg)
+dt_probe_first_match(dtrace_hdl_t *dtp, const dt_probe_t *prp, void *arg)
 {
-	if (((dtrace_probedesc_t *)arg)->id == DTRACE_IDNONE) {
-		memcpy(arg, pdp, sizeof (dtrace_probedesc_t));
+	dt_probe_t **prpp = arg;
+
+	if (*prpp == NULL) {
+		*prpp = prp;
 		return (0);
 	}
 
@@ -982,24 +984,20 @@ dt_probe_info(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp,
 	dt_probe_t *prp = NULL;
 	const dtrace_pattr_t *pap;
 	dt_provider_t *pvp;
-	dtrace_probedesc_t pd;
 	int m;
 
-	memset(&pd, 0, sizeof (pd));
-	pd.id = DTRACE_IDNONE;
-
 	/*
-	 * Call dtrace_probe_iter() to find matching probes.  Our
-	 * dt_probe_desc() callback will produce the following results:
+	 * Call dt_probe_iter() to find matching probes.  Our
+	 * dt_probe_first_match() callback will produce the following results:
 	 *
-	 * m < 0 dtrace_probe_iter() found zero matches (or failed).
-	 * m > 0 dtrace_probe_iter() found more than one match.
-	 * m = 0 dtrace_probe_iter() found exactly one match.
+	 * m < 0 dt_probe_iter() found zero matches (or failed).
+	 * m > 0 dt_probe_iter() found more than one match.
+	 * m = 0 dt_probe_iter() found exactly one match.
 	 */
-	if ((m = dtrace_probe_iter(dtp, pdp, dt_probe_desc, &pd)) < 0)
+	if ((m = dt_probe_iter(dtp, pdp, dt_probe_first_match, NULL, &prp)) < 0)
 		return NULL; /* dt_errno is set for us */
 
-	if ((pvp = dt_provider_lookup(dtp, pd.prv)) == NULL)
+	if ((pvp = prp->prov) == NULL)
 		return NULL; /* dt_errno is set for us */
 
 	/*
@@ -1043,10 +1041,6 @@ dt_probe_info(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp,
 		}
 	}
 
-	prp = dt_probe_lookup(dtp, &pd);
-	if (!prp)
-		return NULL; /* dt_errno is set for us */
-
 	/*
 	 * Compute the probe description attributes by taking the minimum of
 	 * the attributes of the specified fields.  If no provider is specified
-- 
2.18.2




More information about the DTrace-devel mailing list