[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