svn commit: r212311 - stable/8/sys/kern

David Xu davidxu at FreeBSD.org
Wed Sep 8 01:55:03 UTC 2010


Author: davidxu
Date: Wed Sep  8 01:55:03 2010
New Revision: 212311
URL: http://svn.freebsd.org/changeset/base/212311

Log:
  MFC: r212047
    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.

Modified:
  stable/8/sys/kern/kern_sig.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/kern/kern_sig.c
==============================================================================
--- stable/8/sys/kern/kern_sig.c	Wed Sep  8 01:41:22 2010	(r212310)
+++ stable/8/sys/kern/kern_sig.c	Wed Sep  8 01:55:03 2010	(r212311)
@@ -2129,20 +2129,13 @@ tdsignal(struct proc *p, struct thread *
 	 * 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) {
+		if (sig == SIGKILL) {
 			/*
-			 * The traced process is already stopped,
-			 * so no further action is necessary.
-			 * No signal can restart us.
+			 * If traced process is already stopped,
+			 * then no further action is necessary.
 			 */
-			goto out;
-		}
-
-		if (sig == SIGKILL) {
+			if (p->p_flag & P_TRACED)
+				goto out;
 			/*
 			 * SIGKILL sets process running.
 			 * It will die elsewhere.
@@ -2154,6 +2147,12 @@ tdsignal(struct proc *p, struct thread *
 
 		if (prop & SA_CONT) {
 			/*
+			 * If traced process is already stopped,
+			 * then no further action is necessary.
+			 */
+			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
 			 * it has no further action.  If SIGCONT is held, we
@@ -2198,6 +2197,12 @@ tdsignal(struct proc *p, struct thread *
 
 		if (prop & SA_STOP) {
 			/*
+			 * If traced process is already stopped,
+			 * then no further action is necessary.
+			 */
+			if (p->p_flag & P_TRACED)
+				goto out;
+			/*
 			 * Already stopped, don't need to stop again
 			 * (If we did the shell could get confused).
 			 * Just make sure the signal STOP bit set.


More information about the svn-src-all mailing list