[DTrace-devel] [PATCH 44/61] Add aggregation description records for aggregation keys

eugene.loh at oracle.com eugene.loh at oracle.com
Fri Jul 8 14:45:28 UTC 2022


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

Use the new dt_aggid_add_rec() function.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_cg.c   | 21 ++++++++++++++++++++-
 libdtrace/dt_impl.h |  1 +
 libdtrace/dt_map.c  | 21 ++++++++++++++++++++-
 3 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 61611c1d..fdd32ce9 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -6590,6 +6590,7 @@ dt_cg_agg(dt_pcb_t *pcb, dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 	dt_ident_t	*aid, *fid;
 	dt_cg_aggfunc_f	*aggfp;
 	int		nrecs, off;
+	dt_node_t	*d;
 
 	/*
 	 * If the aggregation has no aggregating function applied to it, then
@@ -6612,7 +6613,6 @@ dt_cg_agg(dt_pcb_t *pcb, dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 		dnerror(dnp->dn_aggtup, D_ARR_BADREF, "indexing is not "
 			"supported yet: @%s\n", dnp->dn_ident->di_name);
 
-
 	assert(fid->di_id >= DT_AGG_BASE && fid->di_id < DT_AGG_HIGHEST);
 
 	dt_cg_clsflags(pcb, DTRACEACT_AGGREGATION, dnp);
@@ -6627,12 +6627,31 @@ dt_cg_agg(dt_pcb_t *pcb, dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 
 		/* count the number of records */
 		nrecs = 1;		/* variable ID */
+		for (d = dnp->dn_aggtup; d; d = d->dn_list)
+			nrecs++;
 		nrecs++;		/* data */
 
 		/* add the aid */
 		dt_aggid_add(dtp, aid, nrecs);
 
+		/* add records for keys (if any) */
+		nrecs = 1;		/* variable ID */
 		off = sizeof(uint32_t);
+		for (d = dnp->dn_aggtup; d; d = d->dn_list) {
+			int size;
+
+			if (dt_node_is_string(d))
+				size = dtp->dt_options[DTRACEOPT_STRSIZE] + 1;
+			else {
+				dtrace_diftype_t t;
+
+				dt_node_diftype(dtp, d, &t);
+				size = t.dtdt_size;
+			}
+
+			off = dt_aggid_add_rec(dtp, aid->di_id, nrecs, size, off);
+			nrecs++;
+		}
 
 		/* add record for aggregation data */
 		off = dt_aggid_add_rec_data(dtp, aid->di_id, off);
diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
index 581f568f..258ec810 100644
--- a/libdtrace/dt_impl.h
+++ b/libdtrace/dt_impl.h
@@ -780,6 +780,7 @@ typedef void (*dt_cg_gap_f)(dt_pcb_t *, int);
 extern uint32_t dt_rec_add(dtrace_hdl_t *, dt_cg_gap_f, dtrace_actkind_t,
 			   uint32_t, uint16_t, dt_pfargv_t *, uint64_t);
 extern int dt_aggid_add(dtrace_hdl_t *, const dt_ident_t *, int);
+extern int dt_aggid_add_rec(dtrace_hdl_t *, dtrace_aggid_t, int, int, int);
 extern int dt_aggid_add_rec_data(dtrace_hdl_t *, dtrace_aggid_t, int);
 extern int dt_aggid_lookup(dtrace_hdl_t *, dtrace_aggid_t, dtrace_aggdesc_t **);
 extern void dt_aggid_destroy(dtrace_hdl_t *);
diff --git a/libdtrace/dt_map.c b/libdtrace/dt_map.c
index d7e8a8c5..338f5df4 100644
--- a/libdtrace/dt_map.c
+++ b/libdtrace/dt_map.c
@@ -297,12 +297,31 @@ dt_aggid_add(dtrace_hdl_t *dtp, const dt_ident_t *aid, int nrecs)
 	/* prepopulate some data fields */
 	recs[nrecs - 1].dtrd_action = ((dt_ident_t *) aid->di_iarg)->di_id;
 	recs[nrecs - 1].dtrd_size = (aid->di_size - sizeof(uint64_t)) / DT_AGG_NUM_COPIES;
- 
+
 	dtp->dt_adesc[id] = agg;
 
 	return 0;
 }
 
+int
+dt_aggid_add_rec(dtrace_hdl_t *dtp, dtrace_aggid_t id, int irec, int size, int off)
+{
+	dtrace_recdesc_t *rec;
+
+	assert(id >= 0 && id < dtp->dt_maxagg && dtp->dt_adesc != NULL && dtp->dt_adesc[id] != NULL);
+
+	rec = &dtp->dt_adesc[id]->dtagd_recs[irec];
+
+	rec->dtrd_action = DTRACEACT_DIFEXPR;
+	rec->dtrd_size = size;
+	rec->dtrd_offset = off;
+	rec->dtrd_alignment = 1;
+	rec->dtrd_format = NULL;
+	rec->dtrd_arg = 1;  /* does this matter? */
+
+	return off + size;
+}
+
 int
 dt_aggid_add_rec_data(dtrace_hdl_t *dtp, dtrace_aggid_t id, int off)
 {
-- 
2.18.4




More information about the DTrace-devel mailing list