summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdtrace/common/dt_pid.c
diff options
context:
space:
mode:
authorjhaslam <none@none>2008-02-07 06:05:33 -0800
committerjhaslam <none@none>2008-02-07 06:05:33 -0800
commit6e0bee749e9081c846d305caa233c222da771831 (patch)
tree2b80fafadb23a6c6e046538da071ce8a2e3297b2 /usr/src/lib/libdtrace/common/dt_pid.c
parent5bd0e5515c0fb3ef06efffdeec87dca8a69b392b (diff)
downloadillumos-joyent-6e0bee749e9081c846d305caa233c222da771831.tar.gz
6325485 A stddev() aggregator would be a nice adjunct to avg()
6618705 p*d123 doesn't cause pid probes to be created 6624541 dtrace aggregations should assume signed arguments Contributed by Chad Mynhier <cmynhier@gmail.com>.
Diffstat (limited to 'usr/src/lib/libdtrace/common/dt_pid.c')
-rw-r--r--usr/src/lib/libdtrace/common/dt_pid.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/usr/src/lib/libdtrace/common/dt_pid.c b/usr/src/lib/libdtrace/common/dt_pid.c
index f16e742cdd..6346329339 100644
--- a/usr/src/lib/libdtrace/common/dt_pid.c
+++ b/usr/src/lib/libdtrace/common/dt_pid.c
@@ -20,7 +20,7 @@
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -655,7 +655,7 @@ dt_pid_create_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb)
(void) snprintf(provname, sizeof (provname), "pid%d", (int)pid);
- if (strcmp(provname, pdp->dtpd_provider) == 0) {
+ if (gmatch(provname, pdp->dtpd_provider) != 0) {
if ((P = dt_proc_grab(dtp, pid, PGRAB_RDONLY | PGRAB_FORCE,
0)) == NULL) {
(void) dt_pid_error(dtp, pcb, NULL, NULL, D_PROC_GRAB,
@@ -671,8 +671,12 @@ dt_pid_create_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb)
(void) pthread_mutex_unlock(&dpr->dpr_lock);
dt_proc_release(dtp, P);
+ }
- } else {
+ /*
+ * If it's not strictly a pid provider, we might match a USDT provider.
+ */
+ if (strcmp(provname, pdp->dtpd_provider) != 0) {
if ((P = dt_proc_grab(dtp, pid, 0, 1)) == NULL) {
(void) dt_pid_error(dtp, pcb, NULL, NULL, D_PROC_GRAB,
"failed to grab process %d", (int)pid);
@@ -703,6 +707,10 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
dtrace_probedesc_t *pdp, pd;
pid_t pid;
int ret = 0, found = B_FALSE;
+ char provname[DTRACE_PROVNAMELEN];
+
+ (void) snprintf(provname, sizeof (provname), "pid%d",
+ (int)dpr->dpr_pid);
for (pgp = dt_list_next(&dtp->dt_programs); pgp != NULL;
pgp = dt_list_next(pgp)) {
@@ -719,15 +727,17 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
pd = *pdp;
- if (strncmp(pdp->dtpd_provider, "pid", 3) == 0) {
- if (dt_pid_create_pid_probes(&pd, dtp, NULL,
- dpr) != 0)
- ret = 1;
- } else {
- if (dt_pid_create_usdt_probes(&pd, dtp, NULL,
- dpr) != 0)
- ret = 1;
- }
+ if (gmatch(provname, pdp->dtpd_provider) != 0 &&
+ dt_pid_create_pid_probes(&pd, dtp, NULL, dpr) != 0)
+ ret = 1;
+
+ /*
+ * If it's not strictly a pid provider, we might match
+ * a USDT provider.
+ */
+ if (strcmp(provname, pdp->dtpd_provider) != 0 &&
+ dt_pid_create_usdt_probes(&pd, dtp, NULL, dpr) != 0)
+ ret = 1;
}
}