[DTrace-devel] [PATCH 18/38] Add a provider-specific probe_add_clause for underlying probes
eugene.loh at oracle.com
eugene.loh at oracle.com
Thu Jun 27 05:34:35 UTC 2024
From: Eugene Loh <eugene.loh at oracle.com>
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_prov_uprobe.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
index c77063a8..5dbd75e3 100644
--- a/libdtrace/dt_prov_uprobe.c
+++ b/libdtrace/dt_prov_uprobe.c
@@ -129,6 +129,38 @@ static void probe_destroy(dtrace_hdl_t *dtp, void *datap)
free_probe_list(dtp, datap);
}
+/*
+ * Add clause to probe.
+ */
+static int probe_add_clause(dtrace_hdl_t *dtp, dt_probe_t *prp, dt_ident_t *idp)
+{
+ const list_probe_t *pup;
+
+ for (pup = prp->prv_data; pup != NULL; pup = dt_list_next(pup)) {
+ dt_probe_t *uprp = pup->probe;
+ dt_probe_clause_t *prev, *pcp;
+
+ /*
+ * Check if the clause is already there. Since the clauses
+ * are added "in order," we only need to check the previous
+ * entry.
+ */
+ prev = dt_list_prev(&uprp->clauses);
+ if (prev && strcmp(prev->clause->di_name, idp->di_name) == 0)
+ continue;
+
+ /*
+ * Add the clause.
+ */
+ pcp = dt_zalloc(dtp, sizeof(dt_probe_clause_t));
+ if (pcp == NULL)
+ return -1;
+ pcp->clause = idp;
+ dt_list_append(&uprp->clauses, pcp);
+ }
+
+ return 0;
+}
/*
* Look up or create an underlying (real) probe, corresponding directly to a
@@ -811,6 +843,7 @@ dt_provimpl_t dt_pid = {
.prog_type = BPF_PROG_TYPE_UNSPEC,
.provide_probe = &provide_pid_probe,
.enable = &enable_pid,
+ .probe_add_clause = &probe_add_clause,
.probe_destroy = &probe_destroy,
};
@@ -822,5 +855,6 @@ dt_provimpl_t dt_usdt = {
.prog_type = BPF_PROG_TYPE_UNSPEC,
.provide_probe = &provide_usdt_probe,
.enable = &enable_usdt,
+ .probe_add_clause = &probe_add_clause,
.probe_destroy = &probe_destroy,
};
--
2.18.4
More information about the DTrace-devel
mailing list