From owner-p4-projects@FreeBSD.ORG Sat Jul 10 14:24:02 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C407816A4D0; Sat, 10 Jul 2004 14:24:01 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A02C316A4CE for ; Sat, 10 Jul 2004 14:24:01 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 85EEF43D2D for ; Sat, 10 Jul 2004 14:24:01 +0000 (GMT) (envelope-from davidxu@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.11/8.12.11) with ESMTP id i6AEO1kS027954 for ; Sat, 10 Jul 2004 14:24:01 GMT (envelope-from davidxu@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id i6AEO1Vj027951 for perforce@freebsd.org; Sat, 10 Jul 2004 14:24:01 GMT (envelope-from davidxu@freebsd.org) Date: Sat, 10 Jul 2004 14:24:01 GMT Message-Id: <200407101424.i6AEO1Vj027951@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to davidxu@freebsd.org using -f From: David Xu To: Perforce Change Reviews Subject: PERFORCE change 56962 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Jul 2004 14:24:02 -0000 http://perforce.freebsd.org/chv.cgi?CH=56962 Change 56962 by davidxu@davidxu_alona on 2004/07/10 14:23:47 Implement td_thr_suspend/td_thr_resume, not tested, not finished yet. Affected files ... .. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db.c#6 edit Differences ... ==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db.c#6 (text+ko) ==== @@ -799,17 +799,88 @@ } static td_err_e +pt_dbsuspend(const td_thrhandle_t *th, int suspend) +{ + pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p; + psaddr_t tcb_addr, tmbx_addr, ptr; + lwpid_t lwp; + uint32_t dflags; + int attrflags; + int ret; + + TDBG_FUNC(); + + ret = pt_validate(th); + if (ret) + return (ret); + + if (ta->map[th->th_unique].type == PT_LWP) { +#if 0 + if (suspend) + ret = ps_lstop(ta->ph, ta->map[th->th_unique].lwp); + else + ret = ps_lcontinue(ta->ph, ta->map[th->th_unique].lwp); +#else + ret = 0; +#endif + return (P2T(ret)); + } + + ret = ps_pdread(ta->ph, ta->map[th->th_unique].thr + + offsetof(struct pthread, attr.flags), + &attrflags, sizeof(attrflags)); + if (ret != 0) + return (P2T(ret)); + ret = ps_pdread(ta->ph, ta->map[th->th_unique].thr + + offsetof(struct pthread, tcb), + &tcb_addr, sizeof(tcb_addr)); + if (ret != 0) + return (P2T(ret)); + tmbx_addr = tcb_addr + offsetof(struct tcb, tcb_tmbx); + ptr = tmbx_addr + offsetof(struct kse_thr_mailbox, tm_lwp); + ret = ps_pdread(ta->ph, ptr, &lwp, sizeof(lwpid_t)); + if (ret != 0) + return (P2T(ret)); + if (lwp != 0 && (attrflags & PTHREAD_SCOPE_SYSTEM)) { +#if 0 + if (suspend) + ret = ps_lstop(ta->ph, lwp); + else + ret = ps_lcontinue(ta->ph, lwp); +#else + ret = 0; +#endif + return (P2T(ret)); + } + + ret = ps_pdread(ta->ph, + tmbx_addr + offsetof(struct kse_thr_mailbox, tm_dflags), + &dflags, sizeof(dflags)); + if (ret != 0) + return (P2T(ret)); + + if (suspend) + dflags |= TMDF_DONOTRUNUSER; + else + dflags &= ~TMDF_DONOTRUNUSER; + ret = ps_pdwrite(ta->ph, + tmbx_addr + offsetof(struct kse_thr_mailbox, tm_dflags), + &dflags, sizeof(dflags)); + return (P2T(ret)); +} + +static td_err_e pt_thr_dbsuspend(const td_thrhandle_t *th) { TDBG_FUNC(); - return (TD_ERR); + return pt_dbsuspend(th, 1); } static td_err_e pt_thr_dbresume(const td_thrhandle_t *th) { TDBG_FUNC(); - return (TD_ERR); + return pt_dbsuspend(th, 0); } static td_err_e