diff options
author | ahl <none@none> | 2006-02-08 10:03:09 -0800 |
---|---|---|
committer | ahl <none@none> | 2006-02-08 10:03:09 -0800 |
commit | 900524f30cbbebc670e146a87587f355b9f633ee (patch) | |
tree | 81a3f2e4cc774c698d8a4880e5c6d3098bcd5b28 /usr/src/lib/libdtrace/common/dt_proc.c | |
parent | c877ffe618c3f6a0f995ed6b3d5feed148e6d49f (diff) | |
download | illumos-gate-900524f30cbbebc670e146a87587f355b9f633ee.tar.gz |
4864945 spelling error in usage message
6299947 ustack() needs to ignore the top 32 bits for 32-bit processes
6305794 libdtrace misses rtld notifications
6309681 USDT headergen
6349088 dtrace command, Assertion failed: dpr->dpr_refs != 0, file ../common/dt_proc.c, line 976
6375841 USDT providers shouldn't be allowed to end in a digit
--HG--
rename : usr/src/cmd/abi/apptrace/amd64/Makefile => deleted_files/usr/src/cmd/abi/apptrace/amd64/Makefile
Diffstat (limited to 'usr/src/lib/libdtrace/common/dt_proc.c')
-rw-r--r-- | usr/src/lib/libdtrace/common/dt_proc.c | 97 |
1 files changed, 54 insertions, 43 deletions
diff --git a/usr/src/lib/libdtrace/common/dt_proc.c b/usr/src/lib/libdtrace/common/dt_proc.c index 0402c60cf1..66bc3aa011 100644 --- a/usr/src/lib/libdtrace/common/dt_proc.c +++ b/usr/src/lib/libdtrace/common/dt_proc.c @@ -19,8 +19,9 @@ * * CDDL HEADER END */ + /* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -161,7 +162,7 @@ dt_proc_bpmatch(dtrace_hdl_t *dtp, dt_proc_t *dpr) (void) Pxecbkpt(dpr->dpr_proc, dbp->dbp_instr); } -static void +void dt_proc_bpenable(dt_proc_t *dpr) { dt_bkpt_t *dbp; @@ -174,9 +175,11 @@ dt_proc_bpenable(dt_proc_t *dpr) dbp->dbp_addr, &dbp->dbp_instr) == 0) dbp->dbp_active = B_TRUE; } + + dt_dprintf("breakpoints enabled\n"); } -static void +void dt_proc_bpdisable(dt_proc_t *dpr) { dt_bkpt_t *dbp; @@ -189,6 +192,35 @@ dt_proc_bpdisable(dt_proc_t *dpr) dbp->dbp_addr, dbp->dbp_instr) == 0) dbp->dbp_active = B_FALSE; } + + dt_dprintf("breakpoints disabled\n"); +} + +static void +dt_proc_notify(dtrace_hdl_t *dtp, dt_proc_hash_t *dph, dt_proc_t *dpr, + const char *msg) +{ + dt_proc_notify_t *dprn = dt_alloc(dtp, sizeof (dt_proc_notify_t)); + + if (dprn == NULL) { + dt_dprintf("failed to allocate notification for %d %s\n", + (int)dpr->dpr_pid, msg); + } else { + dprn->dprn_dpr = dpr; + if (msg == NULL) + dprn->dprn_errmsg[0] = '\0'; + else + (void) strlcpy(dprn->dprn_errmsg, msg, + sizeof (dprn->dprn_errmsg)); + + (void) pthread_mutex_lock(&dph->dph_lock); + + dprn->dprn_next = dph->dph_notify; + dph->dph_notify = dprn; + + (void) pthread_cond_broadcast(&dph->dph_cv); + (void) pthread_mutex_unlock(&dph->dph_lock); + } } /* @@ -239,12 +271,14 @@ dt_proc_rdevent(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *evname) switch (rdm.type) { case RD_DLACTIVITY: - if (rdm.u.state == RD_CONSISTENT) { - Pupdate_syms(dpr->dpr_proc); - dt_proc_bpdisable(dpr); - dt_pid_create_probes_module(dtp, dpr); - dt_proc_bpenable(dpr); - } + if (rdm.u.state != RD_CONSISTENT) + break; + + Pupdate_syms(dpr->dpr_proc); + if (dt_pid_create_probes_module(dtp, dpr) != 0) + dt_proc_notify(dtp, dtp->dt_procs, dpr, + dpr->dpr_errmsg); + break; case RD_PREINIT: Pupdate_syms(dpr->dpr_proc); @@ -588,15 +622,8 @@ pwait_locked: * If the control thread detected PS_UNDEAD or PS_LOST, then enqueue * the dt_proc_t structure on the dt_proc_hash_t notification list. */ - if (notify) { - (void) pthread_mutex_lock(&dph->dph_lock); - - dpr->dpr_notify = dph->dph_notify; - dph->dph_notify = dpr; - - (void) pthread_mutex_unlock(&dph->dph_lock); - (void) pthread_cond_broadcast(&dph->dph_cv); - } + if (notify) + dt_proc_notify(dtp, dph, dpr, NULL); /* * Destroy and remove any remaining breakpoints, set dpr_done and clear @@ -609,8 +636,8 @@ pwait_locked: dpr->dpr_done = B_TRUE; dpr->dpr_tid = 0; - (void) pthread_mutex_unlock(&dpr->dpr_lock); (void) pthread_cond_broadcast(&dpr->dpr_cv); + (void) pthread_mutex_unlock(&dpr->dpr_lock); return (NULL); } @@ -661,7 +688,7 @@ dt_proc_destroy(dtrace_hdl_t *dtp, struct ps_prochandle *P) { dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); dt_proc_hash_t *dph = dtp->dt_procs; - dt_proc_t *npr, **npp; + dt_proc_notify_t *npr, **npp; int rflag; assert(dpr != NULL); @@ -723,16 +750,13 @@ dt_proc_destroy(dtrace_hdl_t *dtp, struct ps_prochandle *P) (void) dt_proc_lookup(dtp, P, B_TRUE); npp = &dph->dph_notify; - for (npr = *npp; npr != NULL; npr = npr->dpr_notify) { - if (npr != dpr) - npp = &npr->dpr_notify; - else - break; - } - - if (npr != NULL) { - *npp = npr->dpr_notify; - npr->dpr_notify = NULL; + while ((npr = *npp) != NULL) { + if (npr->dprn_dpr == dpr) { + *npp = npr->dprn_next; + dt_free(dtp, npr); + } else { + npp = &npr->dprn_next; + } } (void) pthread_mutex_unlock(&dph->dph_lock); @@ -814,15 +838,7 @@ dt_proc_create_thread(dtrace_hdl_t *dtp, dt_proc_t *dpr, uint_t stop) } err = ESRCH; /* cause grab() or create() to fail */ - } else { - /* - * Disable breakpoints while the process is stopped so - * the pid provider can correctly disassemble all - * functions. - */ - dt_proc_bpdisable(dpr); } - } else { (void) dt_proc_error(dpr->dpr_hdl, dpr, "failed to create control thread for process-id %d: %s\n", @@ -988,11 +1004,6 @@ dt_proc_continue(dtrace_hdl_t *dtp, struct ps_prochandle *P) (void) pthread_mutex_lock(&dpr->dpr_lock); if (dpr->dpr_stop & DT_PROC_STOP_IDLE) { - /* - * Breakpoints are disabled while the process is stopped so - * the pid provider can correctly disassemble all functions. - */ - dt_proc_bpenable(dpr); dpr->dpr_stop &= ~DT_PROC_STOP_IDLE; (void) pthread_cond_broadcast(&dpr->dpr_cv); } |