[DTrace-devel] [PATCH] pid, usdt, stapsdt: refactor dependency on pcb and dpr
Eugene Loh
eugene.loh at oracle.com
Thu Jan 22 19:38:46 UTC 2026
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
On 1/21/26 17:57, Kris Van Hees via DTrace-devel wrote:
> The pid/usdt/stapsdt handling code in dt_pid.c was passing along both
> dtp and pcb, while dtp->dt_pcb is known to provide the value of pcb
> already. This was done to handle a case where a fake pcb was being
> passed (from dt_prov_uprobe.c) to ensure that dt_pid_error() would not
> trigger a SEGV.
>
> After careful code analysis, dt_pid_error() is restructured to handle
> the case of pcb and/or dpr being NULL, so that the fake pcb is no
> longer needed, and we can use dtp to get to the (possibly NULL) pcb.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_cc.c | 4 +-
> libdtrace/dt_pid.c | 194 ++++++++++++++++++-------------------
> libdtrace/dt_pid.h | 8 +-
> libdtrace/dt_prov_uprobe.c | 14 +--
> 4 files changed, 101 insertions(+), 119 deletions(-)
>
> diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
> index 1dc119ea..0b205c38 100644
> --- a/libdtrace/dt_cc.c
> +++ b/libdtrace/dt_cc.c
> @@ -275,13 +275,13 @@ dt_setcontext(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
> isdigit(pdp->prv[strlen(pdp->prv) - 1]) &&
> ((pvp = dt_provider_lookup(dtp, pdp->prv)) == NULL ||
> pvp->pv_flags & DT_PROVIDER_PID) &&
> - dt_pid_create_pid_probes((dtrace_probedesc_t *)pdp, dtp, yypcb) != 0)
> + dt_pid_create_pid_probes((dtrace_probedesc_t *)pdp, dtp) != 0)
> longjmp(yypcb->pcb_jmpbuf, EDT_COMPILER);
>
> /*
> * USDT probes.
> */
> - if (dt_pid_create_usdt_probes((dtrace_probedesc_t *)pdp, dtp, yypcb) != 0)
> + if (dt_pid_create_usdt_probes((dtrace_probedesc_t *)pdp, dtp) != 0)
> longjmp(yypcb->pcb_jmpbuf, EDT_COMPILER);
>
> /*
> diff --git a/libdtrace/dt_pid.c b/libdtrace/dt_pid.c
> index 36a5883b..91c2c13a 100644
> --- a/libdtrace/dt_pid.c
> +++ b/libdtrace/dt_pid.c
> @@ -46,7 +46,6 @@
> */
> typedef struct dt_pid_probe {
> dtrace_hdl_t *dpp_dtp;
> - dt_pcb_t *dpp_pcb;
> dt_proc_t *dpp_dpr;
> struct ps_prochandle *dpp_pr;
> const char *dpp_mod;
> @@ -82,24 +81,26 @@ dt_pid_objname(Lmid_t lmid, const char *obj)
> }
>
> static int
> -dt_pid_error(dtrace_hdl_t *dtp, dt_pcb_t *pcb, dt_proc_t *dpr,
> - dt_errtag_t tag, const char *fmt, ...)
> +dt_pid_error(dtrace_hdl_t *dtp, dt_proc_t *dpr, dt_errtag_t tag,
> + const char *fmt, ...)
> {
> - va_list ap;
> - int len;
> + va_list ap;
> + dt_pcb_t *pcb = dtp->dt_pcb;
>
> va_start(ap, fmt);
> - if (pcb == NULL) {
> - assert(dpr != NULL);
> + if (pcb != NULL) {
> + dt_set_errmsg(dtp, dt_errtag(tag), pcb->pcb_region,
> + pcb->pcb_filetag, pcb->pcb_fileptr ? yylineno : 0, fmt, ap);
> + } else if (dpr != NULL) {
> + int len;
> +
> len = vsnprintf(dpr->dpr_errmsg, sizeof(dpr->dpr_errmsg),
> - fmt, ap);
> + fmt, ap);
> assert(len >= 2);
> if (dpr->dpr_errmsg[len - 2] == '\n')
> dpr->dpr_errmsg[len - 2] = '\0';
> - } else {
> - dt_set_errmsg(dtp, dt_errtag(tag), pcb->pcb_region,
> - pcb->pcb_filetag, pcb->pcb_fileptr ? yylineno : 0, fmt, ap);
> - }
> + } else
> + dt_set_errmsg(dtp, dt_errtag(tag), NULL, NULL, 0, fmt, ap);
> va_end(ap);
>
> return 1;
> @@ -151,7 +152,6 @@ static int
> dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
> {
> dtrace_hdl_t *dtp = pp->dpp_dtp;
> - dt_pcb_t *pcb = pp->dpp_pcb;
> dt_proc_t *dpr = pp->dpp_dpr;
> pid_probespec_t *psp;
> uint64_t off;
> @@ -195,7 +195,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
>
> off = strtoull(pp->dpp_name, &end, 16);
> if (*end != '\0') {
> - rc = dt_pid_error(dtp, pcb, dpr, D_PROC_NAME,
> + rc = dt_pid_error(dtp, dpr, D_PROC_NAME,
> "'%s' is an invalid probe name",
> pp->dpp_name);
> goto out;
> @@ -204,8 +204,9 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
> psp->pps_nameoff = off;
>
> if (dt_Plookup_by_addr(dtp, pid, off, (const char **)&psp->pps_fun, &sym)) {
> - rc = dt_pid_error(dtp, pcb, dpr, D_PROC_NAME,
> - "failed to lookup 0x%lx in module '%s'", off, pp->dpp_mod);
> + rc = dt_pid_error(dtp, dpr, D_PROC_NAME,
> + "failed to lookup 0x%lx in module '%s'",
> + off, pp->dpp_mod);
> if (psp->pps_fun != func && psp->pps_fun != NULL)
> free(psp->pps_fun);
> goto out;
> @@ -215,9 +216,10 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
> psp->pps_off = off - pp->dpp_vaddr;
>
> if (dt_pid_create_one_probe(pp->dpp_pr, dtp, psp, DTPPT_ABSOFFSETS) < 0)
> - rc = dt_pid_error(dtp, pcb, dpr, D_PROC_CREATEFAIL,
> - "failed to create probes at '%s+0x%llx': %s",
> - func, (unsigned long long)off, dtrace_errmsg(dtp, dtrace_errno(dtp)));
> + rc = dt_pid_error(dtp, dpr, D_PROC_CREATEFAIL,
> + "failed to create probes at '%s+0x%llx': %s",
> + func, (unsigned long long)off,
> + dtrace_errmsg(dtp, dtrace_errno(dtp)));
> else
> pp->dpp_nmatches++;
> free(psp->pps_fun);
> @@ -226,8 +228,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
>
> if (gmatch("return", pp->dpp_name)) {
> if (dt_pid_create_one_probe(pp->dpp_pr, dtp, psp, DTPPT_RETURN) < 0) {
> - rc = dt_pid_error(
> - dtp, pcb, dpr, D_PROC_CREATEFAIL,
> + rc = dt_pid_error(dtp, dpr, D_PROC_CREATEFAIL,
> "failed to create return probe for '%s': %s",
> func, dtrace_errmsg(dtp, dtrace_errno(dtp)));
> goto out;
> @@ -238,8 +239,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
>
> if (gmatch("entry", pp->dpp_name)) {
> if (dt_pid_create_one_probe(pp->dpp_pr, dtp, psp, DTPPT_ENTRY) < 0) {
> - rc = dt_pid_error(
> - dtp, pcb, dpr, D_PROC_CREATEFAIL,
> + rc = dt_pid_error(dtp, dpr, D_PROC_CREATEFAIL,
> "failed to create entry probe for '%s': %s",
> func, dtrace_errmsg(dtp, dtrace_errno(dtp)));
> goto out;
> @@ -254,15 +254,14 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
>
> off = strtoull(pp->dpp_name, &end, 16);
> if (*end != '\0') {
> - rc = dt_pid_error(dtp, pcb, dpr, D_PROC_NAME,
> + rc = dt_pid_error(dtp, dpr, D_PROC_NAME,
> "'%s' is an invalid probe name",
> pp->dpp_name);
> goto out;
> }
>
> if (off >= symp->st_size) {
> - rc = dt_pid_error(
> - dtp, pcb, dpr, D_PROC_OFF,
> + rc = dt_pid_error(dtp, dpr, D_PROC_OFF,
> "offset 0x%llx outside of function '%s'",
> (unsigned long long)off, func);
> goto out;
> @@ -272,8 +271,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
> psp->pps_off = symp->st_value - pp->dpp_vaddr + off;
> if (dt_pid_create_one_probe(pp->dpp_pr, dtp,
> psp, DTPPT_OFFSETS) < 0) {
> - rc = dt_pid_error(
> - dtp, pcb, dpr, D_PROC_CREATEFAIL,
> + rc = dt_pid_error(dtp, dpr, D_PROC_CREATEFAIL,
> "failed to create probes at '%s+0x%llx': %s",
> func, (unsigned long long)off,
> dtrace_errmsg(dtp, dtrace_errno(dtp)));
> @@ -460,7 +458,6 @@ dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj)
> {
> dt_pid_probe_t *pp = arg;
> dtrace_hdl_t *dtp = pp->dpp_dtp;
> - dt_pcb_t *pcb = pp->dpp_pcb;
> dt_proc_t *dpr = pp->dpp_dpr;
> pid_t pid = Pgetpid(dpr->dpr_proc);
> GElf_Sym sym;
> @@ -504,8 +501,7 @@ dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj)
> if (dt_Pxlookup_by_name(dtp, pid, pp->dpp_lmid, obj,
> pp->dpp_func, &sym, NULL) != 0) {
> if (!strisglob(pp->dpp_mod)) {
> - return dt_pid_error(
> - dtp, pcb, dpr, D_PROC_FUNC,
> + return dt_pid_error(dtp, dpr, D_PROC_FUNC,
> "failed to lookup '%s' in module '%s'",
> pp->dpp_func, pp->dpp_mod);
> } else
> @@ -635,7 +631,7 @@ dt_pid_fix_mod(dt_pid_probe_t *pp, dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> */
> static int
> dt_pid_create_pid_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> - dt_pcb_t *pcb, dt_proc_t *dpr)
> + dt_proc_t *dpr)
> {
> dt_pid_probe_t pp;
> int ret = 0;
> @@ -644,7 +640,6 @@ dt_pid_create_pid_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> pp.dpp_dtp = dtp;
> pp.dpp_dpr = dpr;
> pp.dpp_pr = dpr->dpr_proc;
> - pp.dpp_pcb = pcb;
> pp.dpp_nmatches = 0;
> pp.dpp_dev = makedev(0, 0);
> pp.dpp_inum = 0;
> @@ -654,7 +649,7 @@ dt_pid_create_pid_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> * we get a nicer error message.)
> */
> if (pid == getpid())
> - return dt_pid_error(dtp, pcb, dpr, D_PROC_DYN,
> + return dt_pid_error(dtp, dpr, D_PROC_DYN,
> "process %s is dtrace itself",
> &pdp->prv[3]);
>
> @@ -663,7 +658,7 @@ dt_pid_create_pid_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> * hidden some magic in ld.so.1 as well as libc.so.1).
> */
> if (dt_Pname_to_map(dtp, pid, PR_OBJ_LDSO) == NULL) {
> - return dt_pid_error(dtp, pcb, dpr, D_PROC_DYN,
> + return dt_pid_error(dtp, dpr, D_PROC_DYN,
> "process %s is not a dynamically-linked executable",
> &pdp->prv[3]);
> }
> @@ -685,15 +680,15 @@ dt_pid_create_pid_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> (aout = dt_Pname_to_map(dtp, pid, "a.out")) == NULL ||
> (pmp = dt_Pname_to_map(dtp, pid, pp.dpp_mod)) == NULL ||
> aout->pr_vaddr != pmp->pr_vaddr) {
> - return dt_pid_error(dtp, pcb, dpr, D_PROC_LIB,
> - "only the a.out module is valid with the "
> - "'-' function");
> + return dt_pid_error(dtp, dpr, D_PROC_LIB,
> + "only the a.out module is valid with the "
> + "'-' function");
> }
>
> if (strisglob(pp.dpp_name)) {
> - return dt_pid_error(dtp, pcb, dpr, D_PROC_NAME,
> - "only individual addresses may be specified "
> - "with the '-' function");
> + return dt_pid_error(dtp, dpr, D_PROC_NAME,
> + "only individual addresses may be specified "
> + "with the '-' function");
> }
> }
>
> @@ -818,7 +813,7 @@ validate_dof_record(const char *path, const dof_parsed_t *parsed,
> */
> static int
> dt_pid_create_usdt_probes_proc(dtrace_hdl_t *dtp, pid_t pid, dt_proc_t *dpr,
> - dtrace_probedesc_t *pdp, dt_pcb_t *pcb)
> + dtrace_probedesc_t *pdp)
> {
> const dt_provider_t *pvp;
> int ret = 0;
> @@ -897,8 +892,8 @@ dt_pid_create_usdt_probes_proc(dtrace_hdl_t *dtp, pid_t pid, dt_proc_t *dpr,
> if (dpr_caller == 0) {
> if (dt_proc_grab_lock(dtp, pid, DTRACE_PROC_WAITING |
> DTRACE_PROC_SHORTLIVED) < 0) {
> - dt_pid_error(dtp, pcb, NULL, D_PROC_GRAB,
> - "failed to grab process %d", (int)pid);
> + dt_pid_error(dtp, NULL, D_PROC_GRAB,
> + "failed to grab process %d", (int)pid);
> return -1;
> }
> dpr = dt_proc_lookup(dtp, pid);
> @@ -1041,11 +1036,11 @@ dt_pid_create_usdt_probes_proc(dtrace_hdl_t *dtp, pid_t pid, dt_proc_t *dpr,
>
> psp.pps_fn = Pmap_mapfile_name(dpr->dpr_proc, pmp);
> if (psp.pps_fn == NULL) {
> - dt_pid_error(dtp, pcb, dpr, D_PROC_USDT,
> - "Cannot get name of mapping containing "
> - "%sprobe %s for pid %d\n",
> - tp->tracepoint.is_enabled ? "is-enabled ": "",
> - prb, dpr->dpr_pid);
> + dt_pid_error(dtp, dpr, D_PROC_USDT,
> + "Cannot get name of mapping containing "
> + "%sprobe %s for pid %d\n",
> + tp->tracepoint.is_enabled ? "is-enabled ": "",
> + prb, dpr->dpr_pid);
> goto oom;
> }
>
> @@ -1082,11 +1077,11 @@ dt_pid_create_usdt_probes_proc(dtrace_hdl_t *dtp, pid_t pid, dt_proc_t *dpr,
> psp.pps_prv, psp.pps_mod, psp.pps_fun,
> psp.pps_prb, psp.pps_pid, psp.pps_off);
> if (pvp->impl->provide_probe(dtp, &psp) < 0) {
> - dt_pid_error(dtp, pcb, dpr, D_PROC_USDT,
> - "failed to instantiate %sprobe %s for pid %d: %s",
> - tp->tracepoint.is_enabled ? "is-enabled ": "",
> - psp.pps_prb, psp.pps_pid,
> - dtrace_errmsg(dtp, dtrace_errno(dtp)));
> + dt_pid_error(dtp, dpr, D_PROC_USDT,
> + "failed to instantiate %sprobe %s for pid %d: %s",
> + tp->tracepoint.is_enabled ? "is-enabled ": "",
> + psp.pps_prb, psp.pps_pid,
> + dtrace_errmsg(dtp, dtrace_errno(dtp)));
> ret = -1;
> }
> free(psp.pps_fn);
> @@ -1183,7 +1178,7 @@ dt_pid_usdt_mapping(void *data, const prmap_t *pmp, const char *oname)
> * Extract the pid from a USDT provider name.
> */
> pid_t
> -dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb,
> +dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> dt_proc_t *dpr)
> {
> pid_t pid;
> @@ -1196,7 +1191,7 @@ dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb,
> }
>
> if (last == NULL || (*(++last) == '\0')) {
> - dt_pid_error(dtp, pcb, dpr, D_PROC_BADPROV,
> + dt_pid_error(dtp, dpr, D_PROC_BADPROV,
> "'%s' is not a valid provider", pdp->prv);
> return -1;
> }
> @@ -1205,7 +1200,7 @@ dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb,
> pid = strtol(last, &end, 10);
>
> if (errno != 0 || end == last || end[0] != '\0' || pid <= 0) {
> - dt_pid_error(dtp, pcb, dpr, D_PROC_BADPID,
> + dt_pid_error(dtp, dpr, D_PROC_BADPID,
> "'%s' does not contain a valid pid", pdp->prv);
> return -1;
> }
> @@ -1218,24 +1213,22 @@ dt_pid_get_pid(const dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb,
> * created, since there might still be USDT probes) and -1 on error.
> */
> int
> -dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb)
> +dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp)
> {
> pid_t pid;
> char provname[DTRACE_PROVNAMELEN];
> dt_proc_t *dpr;
> int err;
>
> - assert(pcb != NULL);
> -
> /* Exclude pid0 from being specifically requested. */
> if (strcmp(pdp->prv, "pid0") == 0) {
> - dt_pid_error(dtp, pcb, NULL, D_PROC_BADPID,
> + dt_pid_error(dtp, NULL, D_PROC_BADPID,
> "pid0 does not contain a valid pid");
> return -1;
> }
>
> /* Extract the pid. */
> - pid = dt_pid_get_pid(pdp, dtp, pcb, NULL);
> + pid = dt_pid_get_pid(pdp, dtp, NULL);
> if (pid <= 0)
> return 0;
>
> @@ -1247,15 +1240,15 @@ dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *p
> /* Grab the process. */
> if (dt_proc_grab_lock(dtp, pid, DTRACE_PROC_WAITING |
> DTRACE_PROC_SHORTLIVED) < 0) {
> - dt_pid_error(dtp, pcb, NULL, D_PROC_GRAB,
> - "failed to grab process %d", (int)pid);
> + dt_pid_error(dtp, NULL, D_PROC_GRAB,
> + "failed to grab process %d", (int)pid);
> return -1;
> }
> dpr = dt_proc_lookup(dtp, pid);
> assert(dpr != NULL);
>
> /* Create the pid probes for this process. */
> - err = dt_pid_create_pid_probes_proc(pdp, dtp, pcb, dpr);
> + err = dt_pid_create_pid_probes_proc(pdp, dtp, dpr);
> dt_proc_release_unlock(dtp, pid);
>
> return err;
> @@ -1263,8 +1256,7 @@ dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *p
>
> static int
> dt_stapsdt_parse(dtrace_hdl_t *dtp, dt_proc_t *dpr, dtrace_probedesc_t *pdp,
> - dt_pcb_t *pcb, const dt_provider_t *pvp, char *path,
> - unsigned long addr_start)
> + const dt_provider_t *pvp, char *path, unsigned long addr_start)
> {
> size_t shstrndx, noff, doff, off, n;
> const prmap_t *pmp = NULL;
> @@ -1282,8 +1274,7 @@ dt_stapsdt_parse(dtrace_hdl_t *dtp, dt_proc_t *dpr, dtrace_probedesc_t *pdp,
>
> fd = open(path, O_RDONLY);
> if (fd < 0) {
> - dt_pid_error(dtp, pcb, dpr, D_PROC_USDT,
> - "Cannot open %s: %s\n",
> + dt_pid_error(dtp, dpr, D_PROC_USDT, "Cannot open %s: %s\n",
> path, strerror(errno));
> return -1;
> }
> @@ -1400,9 +1391,9 @@ dt_stapsdt_parse(dtrace_hdl_t *dtp, dt_proc_t *dpr, dtrace_probedesc_t *pdp,
> mapfile = Pmap_mapfile_name(dpr->dpr_proc, pmp);
>
> if (!mapfile) {
> - dt_pid_error(dtp, pcb, dpr, D_PROC_USDT,
> - "Cannot get name of mapping containing probe %s for pid %d\n",
> - psp.pps_prb, dpr->dpr_pid);
> + dt_pid_error(dtp, dpr, D_PROC_USDT,
> + "Cannot get name of mapping containing probe %s for pid %d\n",
> + psp.pps_prb, dpr->dpr_pid);
> err = -1;
> break;
> }
> @@ -1418,10 +1409,10 @@ dt_stapsdt_parse(dtrace_hdl_t *dtp, dt_proc_t *dpr, dtrace_probedesc_t *pdp,
> psp.pps_nameoff = 0;
>
> if (pvp->impl->provide_probe(dtp, &psp) < 0) {
> - dt_pid_error(dtp, pcb, dpr, D_PROC_USDT,
> - "failed to instantiate probe %s for pid %d: %s",
> - psp.pps_prb, psp.pps_pid,
> - dtrace_errmsg(dtp, dtrace_errno(dtp)));
> + dt_pid_error(dtp, dpr, D_PROC_USDT,
> + "failed to instantiate probe %s for pid %d: %s",
> + psp.pps_prb, psp.pps_pid,
> + dtrace_errmsg(dtp, dtrace_errno(dtp)));
> err = -1;
> }
> if (err == -1)
> @@ -1440,8 +1431,8 @@ out:
>
> static void
> dt_pid_create_stapsdt_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> - dt_pcb_t *pcb, const dt_provider_t *pvp,
> - dt_proc_t *dpr, const char *proc_map)
> + const dt_provider_t *pvp, dt_proc_t *dpr,
> + const char *proc_map)
> {
> char line[1024];
> FILE *fp = NULL;
> @@ -1493,12 +1484,12 @@ dt_pid_create_stapsdt_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> pid, dirent->d_name);
> if (stat(path, &s) != 0 || s.st_ino != inode)
> continue;
> - if (dt_stapsdt_parse(dtp, dpr, pdp, pcb, pvp,
> - path, addr_start - file_offset) != 0)
> + if (dt_stapsdt_parse(dtp, dpr, pdp, pvp, path,
> + addr_start - file_offset) != 0)
> break;
> }
> } else {
> - if (dt_stapsdt_parse(dtp, dpr, pdp, pcb, pvp, name,
> + if (dt_stapsdt_parse(dtp, dpr, pdp, pvp, name,
> addr_start - file_offset) != 0)
> break;
> }
> @@ -1507,7 +1498,7 @@ dt_pid_create_stapsdt_probes_proc(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
> }
>
> static int
> -dt_pid_create_stapsdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb)
> +dt_pid_create_stapsdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp)
> {
> const dt_provider_t *pvp;
> dt_proc_t *dpr = NULL;
> @@ -1518,8 +1509,6 @@ dt_pid_create_stapsdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_
> if (len == 0)
> return 0;
>
> - assert(pcb != NULL);
> -
> pidstr = &pdp->prv[len];
>
> while (isdigit(*(pidstr - 1)))
> @@ -1535,20 +1524,27 @@ dt_pid_create_stapsdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_
> return 0;
> if (dt_proc_grab_lock(dtp, pid, DTRACE_PROC_WAITING |
> DTRACE_PROC_SHORTLIVED) < 0) {
> - dt_pid_error(dtp, pcb, NULL, D_PROC_GRAB,
> - "failed to grab process %d",
> - (int)pid);
> + dt_pid_error(dtp, NULL, D_PROC_GRAB,
> + "failed to grab process %d", (int)pid);
> return 1;
> }
> dpr = dt_proc_lookup(dtp, pid);
> if (dpr) {
> char *path = NULL;
>
> - if (asprintf(&path, "/proc/%s/maps", pidstr) == -1)
> - longjmp(pcb->pcb_jmpbuf, EDT_NOMEM);
> - dt_pid_create_stapsdt_probes_proc(pdp, dtp, pcb,
> - pvp, dpr, path);
> - free(path);
> + if (asprintf(&path, "/proc/%s/maps", pidstr) == -1) {
> + if (dtp->dt_pcb != NULL)
> + longjmp(dtp->dt_pcb->pcb_jmpbuf, EDT_NOMEM);
> + else
> + path = NULL;
> + }
> +
> + if (path != NULL) {
> + dt_pid_create_stapsdt_probes_proc(pdp, dtp, pvp, dpr,
> + path);
> + free(path);
> + }
> +
> dt_proc_release_unlock(dtp, pid);
> }
>
> @@ -1556,14 +1552,12 @@ dt_pid_create_stapsdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_
> }
>
> int
> -dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb)
> +dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp)
> {
> glob_t globbuf;
> char *globpat = NULL;
> int err = 0, i, nmatches = 0;
>
> - assert(pcb != NULL);
> -
> /* If it cannot end with a pid, we're done. */
> if (pdp->prv[0] != '\0') {
> char lastchar = pdp->prv[strlen(pdp->prv) - 1];
> @@ -1606,14 +1600,14 @@ dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *
> pdptmp.prb = pdp->prb[0] == '\0' ? "*" : pdp->prb;
>
> /* Create USDT probes for this process. */
> - if (dt_pid_create_usdt_probes_proc(dtp, pid, NULL, &pdptmp, pcb))
> + if (dt_pid_create_usdt_probes_proc(dtp, pid, NULL, &pdptmp))
> err = 1;
> }
> free(globpat);
> globfree(&globbuf);
>
> if (err == 0)
> - err = dt_pid_create_stapsdt_probes(pdp, dtp, pcb);
> + err = dt_pid_create_stapsdt_probes(pdp, dtp);
>
> /* If no errors, report success. */
> if (err == 0)
> @@ -1667,7 +1661,7 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
> dtrace_probedesc_t pd;
>
> pdp = &stp->ds_desc->dtsd_ecbdesc->dted_probe;
> - pid = dt_pid_get_pid(pdp, dtp, NULL, dpr);
> + pid = dt_pid_get_pid(pdp, dtp, dpr);
> if (pid != dpr->dpr_pid)
> continue;
>
> @@ -1675,7 +1669,7 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
> pd.fun = strdup(pd.fun); /* we may change it */
>
> if (gmatch(provname, pdp->prv) != 0 &&
> - dt_pid_create_pid_probes_proc(&pd, dtp, NULL, dpr) != 0)
> + dt_pid_create_pid_probes_proc(&pd, dtp, dpr) != 0)
> ret = 1;
>
> /*
> @@ -1683,7 +1677,7 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
> * a USDT provider.
> */
> if (strcmp(provname, pdp->prv) != 0) {
> - if (dt_pid_create_usdt_probes_proc(dtp, -1, dpr, pdp, NULL) < 0)
> + if (dt_pid_create_usdt_probes_proc(dtp, -1, dpr, pdp) < 0)
> ret = 1;
> else
> dt_pid_fix_mod(NULL, pdp, dtp, dpr->dpr_pid);
> diff --git a/libdtrace/dt_pid.h b/libdtrace/dt_pid.h
> index c35adc2c..f59bdfdd 100644
> --- a/libdtrace/dt_pid.h
> +++ b/libdtrace/dt_pid.h
> @@ -16,12 +16,10 @@
> extern "C" {
> #endif
>
> -extern int dt_pid_create_pid_probes(dtrace_probedesc_t *, dtrace_hdl_t *,
> - dt_pcb_t *);
> -extern int dt_pid_create_usdt_probes(dtrace_probedesc_t *, dtrace_hdl_t *,
> - dt_pcb_t *);
> +extern int dt_pid_create_pid_probes(dtrace_probedesc_t *, dtrace_hdl_t *);
> +extern int dt_pid_create_usdt_probes(dtrace_probedesc_t *, dtrace_hdl_t *);
> extern int dt_pid_create_probes_module(dtrace_hdl_t *, dt_proc_t *);
> -extern pid_t dt_pid_get_pid(const dtrace_probedesc_t *, dtrace_hdl_t *, dt_pcb_t *,
> +extern pid_t dt_pid_get_pid(const dtrace_probedesc_t *, dtrace_hdl_t *,
> dt_proc_t *);
>
> #ifdef __cplusplus
> diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
> index e94827f2..101956e5 100644
> --- a/libdtrace/dt_prov_uprobe.c
> +++ b/libdtrace/dt_prov_uprobe.c
> @@ -645,23 +645,13 @@ static int add_probe_usdt(dtrace_hdl_t *dtp, dt_probe_t *prp)
> static int discover(dtrace_hdl_t *dtp)
> {
> int i;
> - dt_pcb_t pcb;
>
> /* Clean up stale pids from among the USDT probes. */
> clean_usdt_probes(dtp);
>
> /* Discover new probes, placing them in dt_probes[]. */
> - /*
> - * pcb is only used inside of dt_pid_error() to get:
> - * pcb->pcb_region
> - * pcb->pcb_filetag
> - * pcb->pcb_fileptr
> - * While pcb cannot be NULL, these other things apparently can be.
> - */
> - memset(&pcb, 0, sizeof(dt_pcb_t));
> - for (i = 0; i < dtp->dt_stmt_nextid; i++) {
> - dt_pid_create_usdt_probes(&dtp->dt_stmts[i]->dtsd_ecbdesc->dted_probe, dtp, &pcb);
> - }
> + for (i = 0; i < dtp->dt_stmt_nextid; i++)
> + dt_pid_create_usdt_probes(&dtp->dt_stmts[i]->dtsd_ecbdesc->dted_probe, dtp);
>
> return 0;
> }
More information about the DTrace-devel
mailing list