[DTrace-devel] [PATCH 19/38] Retain probe descriptions

eugene.loh at oracle.com eugene.loh at oracle.com
Thu Jun 27 05:38:10 UTC 2024


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

To support matching probes after dtrace has started, we retain
probe descriptions.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_impl.h    |  2 ++
 libdtrace/dt_program.c | 37 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
index 2132eda2..445cd602 100644
--- a/libdtrace/dt_impl.h
+++ b/libdtrace/dt_impl.h
@@ -300,6 +300,8 @@ struct dtrace_hdl {
 	dt_list_t dt_programs;	/* linked list of dtrace_prog_t's */
 	dt_list_t dt_xlators;	/* linked list of dt_xlator_t's */
 	dt_list_t dt_enablings;	/* list of (to be) enabled probes */
+	dtrace_probedesc_t **dt_retained; /* array of retained pdescs */
+	int dt_maxretained;	/* number of retained pdescs allocated */
 	struct dt_xlator **dt_xlatormap; /* dt_xlator_t's indexed by dx_id */
 	id_t dt_xlatorid;	/* next dt_xlator_t id to assign */
 	dt_ident_t *dt_externs;	/* linked list of external symbol identifiers */
diff --git a/libdtrace/dt_program.c b/libdtrace/dt_program.c
index a4b052fc..7106c249 100644
--- a/libdtrace/dt_program.c
+++ b/libdtrace/dt_program.c
@@ -163,7 +163,42 @@ dt_prog_stmt(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, dtrace_stmtdesc_t *sdp,
 {
 	pi_state_t		st;
 	dtrace_probedesc_t	*pdp = &sdp->dtsd_ecbdesc->dted_probe;
-	int			rc;
+	char			*sclause = sdp->dtsd_clause->di_name;
+	int			rc, nclause;
+
+	/* Get the clause number from the clause name "dt_clause_"$n. */
+	assert(strncmp(sclause, "dt_clause_", strlen("dt_clause_")) == 0);    // FIXME can probably drop this check (make sure the name starts "dt_clause_")
+	nclause = atoi(sclause + strlen("dt_clause_"));
+	assert(nclause < 65536);	// FIXME are we okay here with some arbitrary limit?
+
+	/* Grow the list of retained pdescs, if necessary. */
+	if (nclause >= dtp->dt_maxretained) {
+		int			newm;
+		dtrace_probedesc_t	**newr;
+
+		/* Figure how big to make the array. */
+		if (dtp->dt_maxretained > 0)
+			newm = 2 * dtp->dt_maxretained;
+		else
+			newm = 8;
+		while (newm <= nclause)
+			newm *= 2;
+
+		/* Allocate the bigger array. */
+		newr = dt_zalloc(dtp, newm * sizeof(dtrace_probedesc_t *));
+		if (newr == NULL)
+			return 0;
+
+		/* Copy data and reset the parameters. */
+		memcpy(newr, dtp->dt_retained, dtp->dt_maxretained * sizeof(dtrace_probedesc_t *));
+		dt_free(dtp, dtp->dt_retained);
+		dtp->dt_retained = newr;
+		dtp->dt_maxretained = newm;
+	}
+
+	/* Add probe description to retained pdescs. */
+	assert(dtp->dt_retained[nclause] == NULL);  // FIXME can probably drop this
+	dtp->dt_retained[nclause] = pdp;        // FIXME I think just pointing to pdp is okay.  No need to cache my own copy.
 
 	st.cnt = cnt;
 	st.idp = sdp->dtsd_clause;
-- 
2.18.4




More information about the DTrace-devel mailing list