PERFORCE change 57038 for review
David Xu
davidxu at FreeBSD.org
Sat Jul 10 20:52:58 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=57038
Change 57038 by davidxu at davidxu_alona on 2004/07/11 03:52:28
use ps_lstop, ps_lcontinue to stop/resume bound thread, however
signal thread won't be stopped.
Affected files ...
.. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db.c#7 edit
.. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db.h#2 edit
Differences ...
==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db.c#7 (text+ko) ====
@@ -444,6 +444,8 @@
{
struct pthread pt;
pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p;
+ psaddr_t tcb_addr;
+ uint32_t dflags;
int ret;
TDBG_FUNC();
@@ -468,12 +470,15 @@
return (P2T(ret));
if (pt.magic != THR_MAGIC)
return (TD_BADTH);
+ tcb_addr = (psaddr_t) pt.tcb;
ret = ps_pdread(ta->ph,
- ((psaddr_t)pt.tcb) + offsetof(struct tcb, tcb_tmbx.tm_lwp),
+ tcb_addr + offsetof(struct tcb, tcb_tmbx.tm_lwp),
&info->ti_lid, sizeof(lwpid_t));
if (ret != 0)
return (P2T(ret));
-
+ ret = ps_pdread(ta->ph,
+ tcb_addr + offsetof(struct tcb, tcb_tmbx.tm_dflags),
+ &dflags, sizeof(dflags));
info->ti_ta_p = th->th_ta_p;
info->ti_tid = th->th_unique;
info->ti_tls = (char *)pt.specific;
@@ -503,7 +508,7 @@
break;
}
- info->ti_db_suspended = 0;
+ info->ti_db_suspended = ((dflags & TMDF_DONOTRUNUSER) != 0);
info->ti_type = TD_THR_USER;
info->ti_pri = pt.active_priority;
info->ti_sigmask = pt.sigmask;
@@ -815,14 +820,10 @@
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));
}
@@ -841,15 +842,18 @@
ret = ps_pdread(ta->ph, ptr, &lwp, sizeof(lwpid_t));
if (ret != 0)
return (P2T(ret));
+ /*
+ * don't stop lwp assigned to a M:N thread, it belongs
+ * to UTS, UTS shouldn't be stopped.
+ */
if (lwp != 0 && (attrflags & PTHREAD_SCOPE_SYSTEM)) {
-#if 0
+ /* dont' suspend signal thread */
+ if (attrflags & THR_SIGNAL_THREAD)
+ return 0;
if (suspend)
ret = ps_lstop(ta->ph, lwp);
else
ret = ps_lcontinue(ta->ph, lwp);
-#else
- ret = 0;
-#endif
return (P2T(ret));
}
==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db.h#2 (text+ko) ====
More information about the p4-projects
mailing list