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).
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to