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