Date: Mon, 5 Jul 2004 11:47:42 GMT From: David Xu <davidxu@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 56496 for review Message-ID: <200407051147.i65Blg1a084662@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=56496 Change 56496 by davidxu@davidxu_alona on 2004/07/05 11:47:36 Allow multiple threads to report debug event at same time, the last thread will win the race, and others will retry, debugger has chance to select a thread to be replied. Affected files ... .. //depot/projects/davidxu_ksedbg/src/sys/kern/kern_sig.c#5 edit .. //depot/projects/davidxu_ksedbg/src/sys/sys/proc.h#4 edit Differences ... ==== //depot/projects/davidxu_ksedbg/src/sys/kern/kern_sig.c#5 (text+ko) ==== @@ -2005,16 +2005,39 @@ { struct proc *p = td->td_proc; struct thread *td0; - int newsig; PROC_LOCK_ASSERT(p, MA_OWNED); WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, &p->p_mtx.mtx_object, "Stopping for traced signal"); - while (P_SHOULDSTOP(p)) { - if (p->p_flag & P_SINGLE_EXIT) + mtx_lock_spin(&sched_lock); + td->td_flags |= TDF_XSIG; + mtx_unlock_spin(&sched_lock); + td->td_xsig = sig; + while (td->td_flags & TDF_XSIG) { + if (p->p_flag & P_SINGLE_EXIT) { + mtx_lock_spin(&sched_lock); + td->td_flags &= ~TDF_XSIG; + mtx_unlock_spin(&sched_lock); return (sig); + } + /* + * Just make wait() to work, the last stopped thread + * will win. + */ + p->p_xstat = sig; + p->p_xthread = td; + p->p_flag |= (P_STOPPED_SIG|P_STOPPED_TRACE); mtx_lock_spin(&sched_lock); + FOREACH_THREAD_IN_PROC(p, td0) { + if (TD_IS_SLEEPING(td0) && + (td0->td_flags & TDF_SINTR) && + !TD_IS_SUSPENDED(td0)) { + thread_suspend_one(td0); + } else if (td != td0) { + td0->td_flags |= TDF_ASTPENDING; + } + } thread_stopped(p); thread_suspend_one(td); PROC_UNLOCK(p); @@ -2024,33 +2047,7 @@ PICKUP_GIANT(); PROC_LOCK(p); } - p->p_xstat = sig; - p->p_xthread = td; - p->p_flag |= (P_STOPPED_SIG|P_STOPPED_TRACE); - mtx_lock_spin(&sched_lock); - FOREACH_THREAD_IN_PROC(p, td0) { - if (TD_IS_SLEEPING(td0) && - (td0->td_flags & TDF_SINTR) && - !TD_IS_SUSPENDED(td0)) { - thread_suspend_one(td0); - } else if (td != td0) { - td0->td_flags |= TDF_ASTPENDING; - } - } - thread_stopped(p); - thread_suspend_one(td); - PROC_UNLOCK(p); - DROP_GIANT(); - mi_switch(SW_INVOL, NULL); - mtx_unlock_spin(&sched_lock); - PICKUP_GIANT(); - PROC_LOCK(p); - newsig = p->p_xstat; - p->p_xstat = newsig; - mtx_lock_spin(&sched_lock); - thread_unsuspend(p); - mtx_unlock_spin(&sched_lock); - return (newsig); + return (td->td_xsig); } /* ==== //depot/projects/davidxu_ksedbg/src/sys/sys/proc.h#4 (text+ko) ==== @@ -303,7 +303,7 @@ volatile u_int td_generation; /* (k) Enable detection of preemption */ stack_t td_sigstk; /* (k) Stack ptr and on-stack flag. */ int td_kflags; /* (c) Flags for KSE threading. */ - + int td_xsig; /* (c) Signal for ptrace */ #define td_endzero td_base_pri /* Copied during fork1() or thread_sched_upcall(). */ @@ -354,6 +354,7 @@ #define TDF_OWEUPC 0x008000 /* Owe thread an addupc() call at next AST. */ #define TDF_NEEDRESCHED 0x010000 /* Thread needs to yield. */ #define TDF_NEEDSIGCHK 0x020000 /* Thread may need signal delivery. */ +#define TDF_XSIG 0x040000 /* Thread is exchanging signal under traced */ #define TDF_UMTXWAKEUP 0x080000 /* Libthr thread must not sleep on a umtx. */ #define TDF_THRWAKEUP 0x100000 /* Libthr thread must not suspend itself. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200407051147.i65Blg1a084662>