[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