From owner-p4-projects@FreeBSD.ORG Sun Jan 13 04:19:45 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D961416A421; Sun, 13 Jan 2008 04:19:44 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 85BC016A41B for ; Sun, 13 Jan 2008 04:19:44 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 8CF2C13C459 for ; Sun, 13 Jan 2008 04:19:44 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m0D4JidG046344 for ; Sun, 13 Jan 2008 04:19:44 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0D4JiVD046341 for perforce@freebsd.org; Sun, 13 Jan 2008 04:19:44 GMT (envelope-from jb@freebsd.org) Date: Sun, 13 Jan 2008 04:19:44 GMT Message-Id: <200801130419.m0D4JiVD046341@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jb@freebsd.org using -f From: John Birrell To: Perforce Change Reviews Cc: Subject: PERFORCE change 133158 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Jan 2008 04:19:45 -0000 http://perforce.freebsd.org/chv.cgi?CH=133158 Change 133158 by jb@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