[DTrace-devel] Introduce dt_calloc() for array allocations

Kris Van Hees kris.van.hees at oracle.com
Tue Mar 17 14:44:07 PDT 2020


Various places in the DTrace userspace implementation was using the
dt_alloc() and dt_zalloc() functions to allocate an array of objects.
This patch introduces dt_calloc() to do that.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_aggregate.c | 13 ++++++-------
 libdtrace/dt_as.c        | 23 ++++++++++-------------
 libdtrace/dt_cc.c        |  3 +--
 libdtrace/dt_dlibs.c     |  4 ++--
 libdtrace/dt_dof.c       |  4 ++--
 libdtrace/dt_impl.h      |  1 +
 libdtrace/dt_probe.c     | 20 ++++++++++----------
 libdtrace/dt_subr.c      | 11 +++++++++++
 libdtrace/dt_xlator.c    |  8 ++++----
 9 files changed, 47 insertions(+), 40 deletions(-)

diff --git a/libdtrace/dt_aggregate.c b/libdtrace/dt_aggregate.c
index 47cbd8fb..b545cb32 100644
--- a/libdtrace/dt_aggregate.c
+++ b/libdtrace/dt_aggregate.c
@@ -1364,8 +1364,7 @@ dt_aggregate_walk_sorted(dtrace_hdl_t *dtp,
 	for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall)
 		nentries++;
 
-	sorted = dt_alloc(dtp, nentries * sizeof (dt_ahashent_t *));
-
+	sorted = dt_calloc(dtp, nentries, sizeof(dt_ahashent_t *));
 	if (sorted == NULL)
 		return (-1);
 
@@ -1507,10 +1506,11 @@ dtrace_aggregate_walk_joined(dtrace_hdl_t *dtp, dtrace_aggvarid_t *aggvars,
 			max = aggvars[i];
 	}
 
-	if ((map = dt_zalloc(dtp, (max + 1) * sizeof (int))) == NULL)
+	map = dt_calloc(dtp, max + 1, sizeof(int));
+	if (map == NULL)
 		return (-1);
 
-	zaggdata = dt_zalloc(dtp, naggvars * sizeof (dt_ahashent_t));
+	zaggdata = dt_calloc(dtp, naggvars, sizeof(dt_ahashent_t));
 
 	if (zaggdata == NULL)
 		goto out;
@@ -1536,7 +1536,7 @@ dtrace_aggregate_walk_joined(dtrace_hdl_t *dtp, dtrace_aggvarid_t *aggvars,
 			 * map from one position to another.)
 			 */
 			if (remap == NULL) {
-				remap = dt_zalloc(dtp, naggvars * sizeof (int));
+				remap = dt_calloc(dtp, naggvars, sizeof(int));
 
 				if (remap == NULL)
 					goto out;
@@ -1759,8 +1759,7 @@ dtrace_aggregate_walk_joined(dtrace_hdl_t *dtp, dtrace_aggvarid_t *aggvars,
 	 * allocate our sorted array, and take another pass over the data to
 	 * fill it.
 	 */
-	sorted = dt_alloc(dtp, nentries * sizeof (dt_ahashent_t *));
-
+	sorted = dt_calloc(dtp, nentries, sizeof(dt_ahashent_t *));
 	if (sorted == NULL)
 		goto out;
 
diff --git a/libdtrace/dt_as.c b/libdtrace/dt_as.c
index 1ad33190..096e660a 100644
--- a/libdtrace/dt_as.c
+++ b/libdtrace/dt_as.c
@@ -146,8 +146,8 @@ dt_as_xlate(dt_pcb_t *pcb, dtrace_difo_t *dp,
 
 	if (pcb->pcb_asxrefs == NULL) {
 		pcb->pcb_asxreflen = dtp->dt_xlatorid;
-		pcb->pcb_asxrefs =
-		    dt_zalloc(dtp, sizeof (ulong_t *) * pcb->pcb_asxreflen);
+		pcb->pcb_asxrefs = dt_calloc(dtp, pcb->pcb_asxreflen,
+						  sizeof(ulong_t *));
 		if (pcb->pcb_asxrefs == NULL)
 			longjmp(pcb->pcb_jmpbuf, EDT_NOMEM);
 	}
@@ -241,12 +241,12 @@ dt_as(dt_pcb_t *pcb)
 	if ((dp = pcb->pcb_difo) == NULL)
 		longjmp(pcb->pcb_jmpbuf, EDT_NOMEM);
 
-	dp->dtdo_buf = dt_alloc(dtp, sizeof (struct bpf_insn) * dlp->dl_len);
-
+	dp->dtdo_buf = dt_calloc(dtp, dlp->dl_len, sizeof(struct bpf_insn));
 	if (dp->dtdo_buf == NULL)
 		longjmp(pcb->pcb_jmpbuf, EDT_NOMEM);
 
-	if ((labels = dt_alloc(dtp, sizeof (uint_t) * dlp->dl_label)) == NULL)
+	labels = dt_calloc(dtp, dlp->dl_label, sizeof(uint_t));
+	if (labels == NULL)
 		longjmp(pcb->pcb_jmpbuf, EDT_NOMEM);
 
 	/*
@@ -365,7 +365,7 @@ fail:
 	dt_idhash_iter(pcb->pcb_locals, dt_countvar, &n);
 
 	if (n != 0) {
-		dp->dtdo_vartab = dt_alloc(dtp, n * sizeof (dtrace_difv_t));
+		dp->dtdo_vartab = dt_calloc(dtp, n, sizeof(dtrace_difv_t));
 		dp->dtdo_varlen = (uint32_t)n;
 
 		if (dp->dtdo_vartab == NULL)
@@ -381,8 +381,7 @@ fail:
 	 * entries based upon our kernel and user counts from the first pass.
 	 */
 	if (brel != 0) {
-		dp->dtdo_breltab = dt_alloc(dtp,
-					    brel * sizeof (dof_relodesc_t));
+		dp->dtdo_breltab = dt_calloc(dtp, brel, sizeof(dof_relodesc_t));
 		dp->dtdo_brelen = brel;
 
 		if (dp->dtdo_breltab == NULL)
@@ -390,8 +389,7 @@ fail:
 	}
 
 	if (krel != 0) {
-		dp->dtdo_kreltab = dt_alloc(dtp,
-					    krel * sizeof (dof_relodesc_t));
+		dp->dtdo_kreltab = dt_calloc(dtp, krel, sizeof(dof_relodesc_t));
 		dp->dtdo_krelen = krel;
 
 		if (dp->dtdo_kreltab == NULL)
@@ -399,8 +397,7 @@ fail:
 	}
 
 	if (urel != 0) {
-		dp->dtdo_ureltab = dt_alloc(dtp,
-					    urel * sizeof (dof_relodesc_t));
+		dp->dtdo_ureltab = dt_calloc(dtp, urel, sizeof(dof_relodesc_t));
 		dp->dtdo_urelen = urel;
 
 		if (dp->dtdo_ureltab == NULL)
@@ -408,7 +405,7 @@ fail:
 	}
 
 	if (xlrefs != 0) {
-		dp->dtdo_xlmtab = dt_zalloc(dtp, sizeof (dt_node_t *) * xlrefs);
+		dp->dtdo_xlmtab = dt_calloc(dtp, xlrefs, sizeof(dt_node_t *));
 		dp->dtdo_xlmlen = xlrefs;
 
 		if (dp->dtdo_xlmtab == NULL)
diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
index 7a77e421..cc299b93 100644
--- a/libdtrace/dt_cc.c
+++ b/libdtrace/dt_cc.c
@@ -282,8 +282,7 @@ dt_action_difconst(dtrace_actdesc_t *ap, uint_t id, dtrace_actkind_t kind)
 	if (dp == NULL)
 		longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
 
-	dp->dtdo_buf = dt_alloc(dtp, sizeof (dif_instr_t) * 2);
-
+	dp->dtdo_buf = dt_calloc(dtp, 2, sizeof(dif_instr_t));
 	if (dp->dtdo_buf == NULL) {
 		dt_difo_free(dtp, dp);
 		longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
diff --git a/libdtrace/dt_dlibs.c b/libdtrace/dt_dlibs.c
index c86cdc74..2c644cd2 100644
--- a/libdtrace/dt_dlibs.c
+++ b/libdtrace/dt_dlibs.c
@@ -358,7 +358,7 @@ get_symbols(dtrace_hdl_t *dtp, Elf *elf, int syms_idx, int strs_idx,
 	 * so modifications made through the (sorted) copy will still affect
 	 * the actual data items.
 	 */
-	funcs = dt_alloc(dtp, symc * sizeof(dt_bpf_func_t *));
+	funcs = dt_calloc(dtp, symc, sizeof(dt_bpf_func_t *));
 	if (funcs == NULL) {
 		fprintf(stderr, "Failed to copy symbol list\n");
 		goto out;
@@ -530,7 +530,7 @@ done:
 			continue;
 
 		stab = dt_strtab_create(BUFSIZ);
-		dp->dtdo_breltab = dt_alloc(dtp, relc * sizeof(dof_relodesc_t));
+		dp->dtdo_breltab = dt_calloc(dtp, relc, sizeof(dof_relodesc_t));
 		if (dp->dtdo_breltab == NULL) {
 			fprintf(stderr, "Failed to alloc BPF reloc table\n");
 			goto out;
diff --git a/libdtrace/dt_dof.c b/libdtrace/dt_dof.c
index b441fe45..194b5471 100644
--- a/libdtrace/dt_dof.c
+++ b/libdtrace/dt_dof.c
@@ -85,8 +85,8 @@ dt_dof_reset(dtrace_hdl_t *dtp, dtrace_prog_t *pgp)
 	dt_free(dtp, ddo->ddo_xlimport);
 	dt_free(dtp, ddo->ddo_xlexport);
 
-	ddo->ddo_xlimport = dt_alloc(dtp, sizeof (dof_secidx_t) * nx);
-	ddo->ddo_xlexport = dt_alloc(dtp, sizeof (dof_secidx_t) * nx);
+	ddo->ddo_xlimport = dt_calloc(dtp, nx, sizeof(dof_secidx_t));
+	ddo->ddo_xlexport = dt_calloc(dtp, nx, sizeof(dof_secidx_t));
 
 	if (nx != 0 && (ddo->ddo_xlimport == NULL || ddo->ddo_xlexport == NULL))
 		return (-1); /* errno is set for us */
diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
index c8fef091..b38c9ad8 100644
--- a/libdtrace/dt_impl.h
+++ b/libdtrace/dt_impl.h
@@ -660,6 +660,7 @@ _dt_printflike_(3,4)
 extern int dt_printf(dtrace_hdl_t *, FILE *, const char *, ...);
 
 extern void *dt_zalloc(dtrace_hdl_t *, size_t);
+extern void *dt_calloc(dtrace_hdl_t *, size_t, size_t);
 extern void *dt_alloc(dtrace_hdl_t *, size_t);
 extern void dt_free(dtrace_hdl_t *, void *);
 extern void dt_difo_free(dtrace_hdl_t *, dtrace_difo_t *);
diff --git a/libdtrace/dt_probe.c b/libdtrace/dt_probe.c
index 2652be2b..e44247e6 100644
--- a/libdtrace/dt_probe.c
+++ b/libdtrace/dt_probe.c
@@ -182,13 +182,13 @@ dt_probe_alloc_args(dt_probe_t *prp, int nargc, int xargc)
 	int		i;
 
 	prp->nargs = alloc_arg_nodes(dtp, prp->prov, nargc);
-	prp->nargv = dt_alloc(dtp, sizeof(dt_node_t *) * nargc);
+	prp->nargv = dt_calloc(dtp, nargc, sizeof(dt_node_t *));
 	prp->nargc = nargc;
 	prp->xargs = alloc_arg_nodes(dtp, prp->prov, xargc);
-	prp->xargv = dt_alloc(dtp, sizeof(dt_node_t *) * xargc);
+	prp->xargv = dt_calloc(dtp, xargc, sizeof(dt_node_t *));
 	prp->xargc = xargc;
-	prp->mapping = dt_alloc(dtp, sizeof(uint8_t) * xargc);
-	prp->argv = dt_alloc(dtp, sizeof(dtrace_typeinfo_t) * xargc);
+	prp->mapping = dt_calloc(dtp, xargc, sizeof(uint8_t));
+	prp->argv = dt_calloc(dtp, xargc, sizeof(dtrace_typeinfo_t));
 	prp->argc = xargc;
 
 	for (i = 0, xargs = prp->xargs;
@@ -425,14 +425,14 @@ dt_probe_create(dtrace_hdl_t *dtp, dt_ident_t *idp, int protoc,
 	prp->pr_name = p + 1;
 
 	prp->nargs = nargs;
-	prp->nargv = dt_alloc(dtp, sizeof (dt_node_t *) * nargc);
+	prp->nargv = dt_calloc(dtp, nargc, sizeof(dt_node_t *));
 	prp->nargc = nargc;
 	prp->xargs = xargs;
-	prp->xargv = dt_alloc(dtp, sizeof (dt_node_t *) * xargc);
+	prp->xargv = dt_calloc(dtp, xargc, sizeof(dt_node_t *));
 	prp->xargc = xargc;
-	prp->mapping = dt_alloc(dtp, sizeof (uint8_t) * xargc);
+	prp->mapping = dt_calloc(dtp, xargc, sizeof(uint8_t));
 	prp->pr_inst = NULL;
-	prp->argv = dt_alloc(dtp, sizeof (dtrace_typeinfo_t) * xargc);
+	prp->argv = dt_calloc(dtp, xargc, sizeof(dtrace_typeinfo_t));
 	prp->argc = xargc;
 
 	if ((prp->nargc != 0 && prp->nargv == NULL) ||
@@ -578,7 +578,7 @@ dt_probe_define(dt_provider_t *pvp, dt_probe_t *prp, const char *fname,
 
 	if (*noffs == *maxoffs) {
 		uint_t new_max = *maxoffs * 2;
-		uint32_t *new_offs = dt_alloc(dtp, sizeof (uint32_t) * new_max);
+		uint32_t *new_offs = dt_calloc(dtp, new_max, sizeof(uint32_t));
 
 		if (new_offs == NULL)
 			return (-1);
@@ -661,7 +661,7 @@ dt_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov, const char *prv,
 			return NULL;
 		}
 
-		nprobes = dt_zalloc(dtp, nprobes_sz * sizeof(dt_probe_t *));
+		nprobes = dt_calloc(dtp, nprobes_sz, sizeof(dt_probe_t *));
 		if (nprobes == NULL)
 			return NULL;
 
diff --git a/libdtrace/dt_subr.c b/libdtrace/dt_subr.c
index f4a54660..8610e47d 100644
--- a/libdtrace/dt_subr.c
+++ b/libdtrace/dt_subr.c
@@ -693,6 +693,17 @@ dt_zalloc(dtrace_hdl_t *dtp, size_t size)
 	return (data);
 }
 
+void *
+dt_calloc(dtrace_hdl_t *dtp, size_t cnt, size_t size)
+{
+	void *data;
+
+	if (cnt == 0 || size == 0)
+		return NULL;
+
+	return dt_zalloc(dtp, cnt * size);
+}
+
 void *
 dt_alloc(dtrace_hdl_t *dtp, size_t size)
 {
diff --git a/libdtrace/dt_xlator.c b/libdtrace/dt_xlator.c
index ee225db4..9d8c5e34 100644
--- a/libdtrace/dt_xlator.c
+++ b/libdtrace/dt_xlator.c
@@ -89,7 +89,8 @@ dt_xlator_create(dtrace_hdl_t *dtp,
 	dxp->dx_gen = dtp->dt_gen;
 	dxp->dx_arg = -1;
 
-	if ((map = dt_alloc(dtp, sizeof (void *) * (dxp->dx_id + 1))) == NULL) {
+	map = dt_calloc(dtp, dxp->dx_id + 1, sizeof(void *));
+	if (map == NULL) {
 		dt_free(dtp, dxp);
 		return (NULL);
 	}
@@ -196,9 +197,8 @@ dt_xlator_create(dtrace_hdl_t *dtp,
 		dnp->dn_membid = dxp->dx_nmembers++;
 	}
 
-	dxp->dx_membdif = dt_zalloc(dtp,
-	    sizeof (dtrace_difo_t *) * dxp->dx_nmembers);
-
+	dxp->dx_membdif = dt_calloc(dtp, dxp->dx_nmembers,
+					 sizeof(dtrace_difo_t *));
 	if (dxp->dx_membdif == NULL) {
 		dxp->dx_nmembers = 0;
 		goto err;
-- 
2.25.0




More information about the DTrace-devel mailing list