summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdtrace/common/dt_work.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libdtrace/common/dt_work.c')
-rw-r--r--usr/src/lib/libdtrace/common/dt_work.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/usr/src/lib/libdtrace/common/dt_work.c b/usr/src/lib/libdtrace/common/dt_work.c
index 64cc8ff176..97a7f62d69 100644
--- a/usr/src/lib/libdtrace/common/dt_work.c
+++ b/usr/src/lib/libdtrace/common/dt_work.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.
*/
@@ -47,7 +48,7 @@ dtrace_sleep(dtrace_hdl_t *dtp)
{
dt_proc_hash_t *dph = dtp->dt_procs;
dtrace_optval_t policy = dtp->dt_options[DTRACEOPT_BUFPOLICY];
- dt_proc_t *dpr;
+ dt_proc_notify_t *dprn;
hrtime_t earliest = INT64_MAX;
struct timespec tv;
@@ -91,12 +92,18 @@ dtrace_sleep(dtrace_hdl_t *dtp)
*/
(void) pthread_cond_reltimedwait_np(&dph->dph_cv, &dph->dph_lock, &tv);
- while ((dpr = dph->dph_notify) != NULL) {
- dph->dph_notify = dpr->dpr_notify;
- dpr->dpr_notify = NULL;
+ while ((dprn = dph->dph_notify) != NULL) {
+ if (dtp->dt_prochdlr != NULL) {
+ char *err = dprn->dprn_errmsg;
+ if (*err == '\0')
+ err = NULL;
+
+ dtp->dt_prochdlr(dprn->dprn_dpr->dpr_proc, err,
+ dtp->dt_procarg);
+ }
- if (dtp->dt_prochdlr != NULL)
- dtp->dt_prochdlr(dpr->dpr_proc, dtp->dt_procarg);
+ dph->dph_notify = dprn->dprn_next;
+ dt_free(dtp, dprn);
}
(void) pthread_mutex_unlock(&dph->dph_lock);