Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Aug 2010 07:15:50 +0000 (UTC)
From:      David Xu <davidxu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r212047 - head/sys/kern
Message-ID:  <201008310715.o7V7FoSI021421@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davidxu
Date: Tue Aug 31 07:15:50 2010
New Revision: 212047
URL: http://svn.freebsd.org/changeset/base/212047

Log:
  If a process is being debugged, skips job control caused by SIGSTOP/SIGCONT
  signals, because it is managed by debugger, however a normal signal sent to
  a interruptibly sleeping thread wakes up the thread so it will handle the
  signal when the process leaves the stopped state.
  
  PR:	150138
  MFC after:	1 week

Modified:
  head/sys/kern/kern_sig.c

Modified: head/sys/kern/kern_sig.c
==============================================================================
--- head/sys/kern/kern_sig.c	Tue Aug 31 06:22:03 2010	(r212046)
+++ head/sys/kern/kern_sig.c	Tue Aug 31 07:15:50 2010	(r212047)
@@ -2139,20 +2139,9 @@ tdsendsignal(struct proc *p, struct thre
 	 * We try do the per-process part here.
 	 */
 	if (P_SHOULDSTOP(p)) {
-		/*
-		 * The process is in stopped mode. All the threads should be
-		 * either winding down or already on the suspended queue.
-		 */
-		if (p->p_flag & P_TRACED) {
-			/*
-			 * The traced process is already stopped,
-			 * so no further action is necessary.
-			 * No signal can restart us.
-			 */
-			goto out;
-		}
-
 		if (sig == SIGKILL) {
+			if (p->p_flag & P_TRACED)
+				goto out;
 			/*
 			 * SIGKILL sets process running.
 			 * It will die elsewhere.
@@ -2163,6 +2152,8 @@ tdsendsignal(struct proc *p, struct thre
 		}
 
 		if (prop & SA_CONT) {
+			if (p->p_flag & P_TRACED)
+				goto out;
 			/*
 			 * If SIGCONT is default (or ignored), we continue the
 			 * process but don't leave the signal in sigqueue as
@@ -2207,6 +2198,8 @@ tdsendsignal(struct proc *p, struct thre
 		}
 
 		if (prop & SA_STOP) {
+			if (p->p_flag & P_TRACED)
+				goto out;
 			/*
 			 * Already stopped, don't need to stop again
 			 * (If we did the shell could get confused).



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008310715.o7V7FoSI021421>