PERFORCE change 133158 for review
John Birrell
jb at FreeBSD.org
Sat Jan 12 20:19:45 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=133158
Change 133158 by jb at jb_freebsd1 on 2008/01/13 04:19:21
Update to allow DTrace to attach to a process which is already running.
Affected files ...
.. //depot/projects/dtrace/src/contrib/opensolaris/lib/libdtrace/common/dt_proc.c#8 edit
Differences ...
==== //depot/projects/dtrace/src/contrib/opensolaris/lib/libdtrace/common/dt_proc.c#8 (text) ====
@@ -178,41 +178,41 @@
static void
dt_proc_bpenable(dt_proc_t *dpr)
{
-printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
-#ifdef DOODAD
dt_bkpt_t *dbp;
assert(DT_MUTEX_HELD(&dpr->dpr_lock));
for (dbp = dt_list_next(&dpr->dpr_bps);
dbp != NULL; dbp = dt_list_next(dbp)) {
+printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
+#ifdef DOODAD
if (!dbp->dbp_active && Psetbkpt(dpr->dpr_proc,
dbp->dbp_addr, &dbp->dbp_instr) == 0)
dbp->dbp_active = B_TRUE;
+#endif
}
dt_dprintf("breakpoints enabled\n");
-#endif
}
static void
dt_proc_bpdisable(dt_proc_t *dpr)
{
-printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
-#ifdef DOODAD
dt_bkpt_t *dbp;
assert(DT_MUTEX_HELD(&dpr->dpr_lock));
for (dbp = dt_list_next(&dpr->dpr_bps);
dbp != NULL; dbp = dt_list_next(dbp)) {
+printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
+#ifdef DOODAD
if (dbp->dbp_active && Pdelbkpt(dpr->dpr_proc,
dbp->dbp_addr, dbp->dbp_instr) == 0)
dbp->dbp_active = B_FALSE;
+#endif
}
dt_dprintf("breakpoints disabled\n");
-#endif
}
static void
@@ -282,7 +282,7 @@
dt_proc_stop(dpr, DT_PROC_STOP_MAIN);
}
-#ifdef DOODAD
+#if defined(sun)
static void
dt_proc_rdevent(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *evname)
{
@@ -557,7 +557,14 @@
(int)dpr->dpr_pid, strerror(errno));
}
#else
- dt_proc_stop(dpr, DT_PROC_STOP_CREATE);
+ /*
+ * If PR_KLC is set, we created the process; otherwise we grabbed it.
+ * Check for an appropriate stop request and wait for dt_proc_continue.
+ */
+ if (proc_getflags(P) & PR_KLC)
+ dt_proc_stop(dpr, DT_PROC_STOP_CREATE);
+ else
+ dt_proc_stop(dpr, DT_PROC_STOP_GRAB);
if (proc_continue(P) != 0)
dt_dprintf("pid %d: failed to set running: %s\n",
@@ -602,7 +609,6 @@
switch (proc_state(P)) {
#endif
case PS_STOP:
-printf("Process has stopped!\n");
#ifdef DOODAD
psp = &Pstatus(P)->pr_lwp;
@@ -650,7 +656,6 @@
break;
case PS_LOST:
-printf("Process has been lost!\n");
#if defined(sun)
if (Preopen(P) == 0)
goto pwait_locked;
@@ -664,7 +669,6 @@
break;
case PS_UNDEAD:
-printf("Process is undead!\n");
dt_dprintf("pid %d: proc died\n", pid);
dpr->dpr_quit = B_TRUE;
notify = B_TRUE;
@@ -757,8 +761,6 @@
static void
dt_proc_destroy(dtrace_hdl_t *dtp, struct ps_prochandle *P)
{
-printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
-#ifdef DOODAD
dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE);
dt_proc_hash_t *dph = dtp->dt_procs;
dt_proc_notify_t *npr, **npp;
@@ -771,9 +773,17 @@
* an external debugger and we were waiting in dt_proc_waitrun().
* Leave the process in this condition using PRELEASE_HANG.
*/
+#if defined(sun)
if (!(Pstatus(dpr->dpr_proc)->pr_flags & (PR_KLC | PR_RLC))) {
+#else
+ if (!(proc_getflags(dpr->dpr_proc) & (PR_KLC | PR_RLC))) {
+#endif
dt_dprintf("abandoning pid %d\n", (int)dpr->dpr_pid);
+#if defined(sun)
rflag = PRELEASE_HANG;
+#else
+ rflag = 0 /* XXX */;
+#endif
} else {
dt_dprintf("releasing pid %d\n", (int)dpr->dpr_pid);
rflag = 0; /* apply kill or run-on-last-close */
@@ -796,7 +806,11 @@
*/
(void) pthread_mutex_lock(&dpr->dpr_lock);
dpr->dpr_quit = B_TRUE;
+#if defined(sun)
(void) _lwp_kill(dpr->dpr_tid, SIGCANCEL);
+#else
+ (void) pthread_kill(dpr->dpr_tid, SIGUSR1);
+#endif
/*
* If the process is currently idling in dt_proc_stop(), re-
@@ -844,9 +858,12 @@
}
dt_list_delete(&dph->dph_lrulist, dpr);
+#if defined(sun)
Prelease(dpr->dpr_proc, rflag);
+#else
+ proc_detach(dpr->dpr_proc);
+#endif
dt_free(dtp, dpr);
-#endif
}
static int
@@ -962,6 +979,8 @@
(void) Punsetflags(dpr->dpr_proc, PR_RLC);
(void) Psetflags(dpr->dpr_proc, PR_KLC);
#else
+ (void) proc_clearflags(dpr->dpr_proc, PR_RLC);
+ (void) proc_setflags(dpr->dpr_proc, PR_KLC);
if ((err = proc_create(file, argv, &dpr->dpr_proc)) != 0)
return (dt_proc_error(dtp, dpr,
"failed to execute %s: %s\n", file, strerror(err)));
@@ -989,8 +1008,6 @@
struct ps_prochandle *
dt_proc_grab(dtrace_hdl_t *dtp, pid_t pid, int flags, int nomonitor)
{
-printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
-#ifdef DOODAD
dt_proc_hash_t *dph = dtp->dt_procs;
uint_t h = pid & (dph->dph_hashlen - 1);
dt_proc_t *dpr, *opr;
@@ -1031,16 +1048,27 @@
(void) pthread_mutex_init(&dpr->dpr_lock, NULL);
(void) pthread_cond_init(&dpr->dpr_cv, NULL);
+#if defined(sun)
if ((dpr->dpr_proc = Pgrab(pid, flags, &err)) == NULL) {
return (dt_proc_error(dtp, dpr,
"failed to grab pid %d: %s\n", (int)pid, Pgrab_error(err)));
}
+#else
+ if ((err = proc_attach(pid, flags, &dpr->dpr_proc)) != 0)
+ return (dt_proc_error(dtp, dpr,
+ "failed to grab pid %d: %s\n", (int) pid, strerror(err)));
+#endif
dpr->dpr_hdl = dtp;
dpr->dpr_pid = pid;
+#if defined(sun)
(void) Punsetflags(dpr->dpr_proc, PR_KLC);
(void) Psetflags(dpr->dpr_proc, PR_RLC);
+#else
+ (void) proc_clearflags(dpr->dpr_proc, PR_KLC);
+ (void) proc_setflags(dpr->dpr_proc, PR_RLC);
+#endif
/*
* If we are attempting to grab the process without a monitor
@@ -1080,9 +1108,6 @@
dpr->dpr_refs++;
return (dpr->dpr_proc);
-#else
-return NULL;
-#endif
}
void
More information about the p4-projects
mailing list