gnu/77818: GDB locks in wait4() when running applications
David Xu
davidxu at freebsd.org
Fri Jun 3 05:20:05 GMT 2005
The following reply was made to PR gnu/77818; it has been noted by GNATS.
From: David Xu <davidxu at freebsd.org>
To: bug-followup at freebsd.org, sean-freebsd at farley.org
Cc:
Subject: Re: gnu/77818: GDB locks in wait4() when running applications
Date: Fri, 03 Jun 2005 13:14:29 +0800
Please try following patch, this patch fixes nanosleep problem,
the patch just removed some unnecessary code.
Index: kern_sig.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_sig.c,v
retrieving revision 1.305
diff -u -r1.305 kern_sig.c
--- kern_sig.c 19 Apr 2005 08:11:28 -0000 1.305
+++ kern_sig.c 3 Jun 2005 05:05:20 -0000
@@ -1690,34 +1690,25 @@
}
/*
- * If proc is traced, always give parent a chance;
- * if signal event is tracked by procfs, give *that*
- * a chance, as well.
+ * If the signal is being ignored,
+ * then we forget about it immediately.
+ * (Note: we don't set SIGCONT in ps_sigignore,
+ * and if it is set to SIG_IGN,
+ * action will be SIG_DFL here.)
*/
- if ((p->p_flag & P_TRACED) || (p->p_stops & S_SIG)) {
- action = SIG_DFL;
- } else {
- /*
- * If the signal is being ignored,
- * then we forget about it immediately.
- * (Note: we don't set SIGCONT in ps_sigignore,
- * and if it is set to SIG_IGN,
- * action will be SIG_DFL here.)
- */
- mtx_lock(&ps->ps_mtx);
- if (SIGISMEMBER(ps->ps_sigignore, sig) ||
- (p->p_flag & P_WEXIT)) {
- mtx_unlock(&ps->ps_mtx);
- return;
- }
- if (SIGISMEMBER(td->td_sigmask, sig))
- action = SIG_HOLD;
- else if (SIGISMEMBER(ps->ps_sigcatch, sig))
- action = SIG_CATCH;
- else
- action = SIG_DFL;
+ mtx_lock(&ps->ps_mtx);
+ if (SIGISMEMBER(ps->ps_sigignore, sig) ||
+ (p->p_flag & P_WEXIT)) {
mtx_unlock(&ps->ps_mtx);
+ return;
}
+ if (SIGISMEMBER(td->td_sigmask, sig))
+ action = SIG_HOLD;
+ else if (SIGISMEMBER(ps->ps_sigcatch, sig))
+ action = SIG_CATCH;
+ else
+ action = SIG_DFL;
+ mtx_unlock(&ps->ps_mtx);
if (prop & SA_CONT) {
SIG_STOPSIGMASK(p->p_siglist);
@@ -1866,14 +1857,16 @@
* Mutexes are short lived. Threads waiting on them will
* hit thread_suspend_check() soon.
*/
- } else if (p->p_state == PRS_NORMAL) {
- if ((p->p_flag & P_TRACED) || (action != SIG_DFL) ||
- !(prop & SA_STOP)) {
+ } else if (p->p_state == PRS_NORMAL) {
+ if (p->p_flag & P_TRACED || action == SIG_CATCH) {
mtx_lock_spin(&sched_lock);
tdsigwakeup(td, sig, action);
mtx_unlock_spin(&sched_lock);
goto out;
}
+
+ MPASS(action == SIG_DFL);
+
if (prop & SA_STOP) {
if (p->p_flag & P_PPWAIT)
goto out;
@@ -1959,34 +1952,26 @@
if ((td->td_flags & TDF_SINTR) == 0)
return;
/*
- * Process is sleeping and traced. Make it runnable
- * so it can discover the signal in issignal() and stop
- * for its parent.
+ * If SIGCONT is default (or ignored) and process is
+ * asleep, we are finished; the process should not
+ * be awakened.
*/
- if (p->p_flag & P_TRACED) {
- p->p_flag &= ~P_STOPPED_TRACE;
- } else {
- /*
- * If SIGCONT is default (or ignored) and process is
- * asleep, we are finished; the process should not
- * be awakened.
- */
- if ((prop & SA_CONT) && action == SIG_DFL) {
- SIGDELSET(p->p_siglist, sig);
- /*
- * It may be on either list in this state.
- * Remove from both for now.
- */
- SIGDELSET(td->td_siglist, sig);
- return;
- }
-
+ if ((prop & SA_CONT) && action == SIG_DFL) {
+ SIGDELSET(p->p_siglist, sig);
/*
- * Give low priority threads a better chance to run.
+ * It may be on either list in this state.
+ * Remove from both for now.
*/
- if (td->td_priority > PUSER)
- sched_prio(td, PUSER);
+ SIGDELSET(td->td_siglist, sig);
+ return;
}
+
+ /*
+ * Give low priority threads a better chance to run.
+ */
+ if (td->td_priority > PUSER)
+ sched_prio(td, PUSER);
+
sleepq_abort(td);
} else {
/*
More information about the freebsd-bugs
mailing list