NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/38060: blocking TSTP is broken



The following reply was made to PR kern/38060; it has been noted by GNATS.

From: yamt%mwd.biglobe.ne.jp@localhost (YAMAMOTO Takashi)
To: gnats-bugs%NetBSD.org@localhost
Cc: kern-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost, 
netbsd-bugs%netbsd.org@localhost
Subject: Re: kern/38060: blocking TSTP is broken
Date: Wed,  5 Mar 2008 12:16:42 +0900 (JST)

 > The following reply was made to PR kern/38060; it has been noted by GNATS.
 > 
 > From: Andrew Doran <ad%netbsd.org@localhost>
 > To: gnats-bugs%NetBSD.org@localhost
 > Cc: 
 > Subject: Re: kern/38060: blocking TSTP is broken
 > Date: Tue, 4 Mar 2008 15:55:21 +0000
 > 
 >  On Mon, Mar 03, 2008 at 12:20:03AM +0000, YAMAMOTO Takashi wrote:
 >  
 >  >  > how about this?
 >  >  > 
 >  >  > YAMAMOTO Takashi
 >  >  > 
 >  >  > 
 >  >  > Index: kern_sig.c
 >  >  > ===================================================================
 >  >  > RCS file: /cvsroot/src/sys/kern/kern_sig.c,v
 >  >  > retrieving revision 1.272
 >  >  > diff -u -p -r1.272 kern_sig.c
 >  >  > --- kern_sig.c 20 Feb 2008 11:48:46 -0000      1.272
 >  >  > +++ kern_sig.c 2 Mar 2008 12:21:27 -0000
 >  >  > @@ -1352,23 +1352,7 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
 >  >  >                if ((prop & SA_CONT) != 0 && action == SIG_DFL)
 >  >  >                        goto out;
 >  >  >  
 >  >  > -              if ((prop & SA_STOP) != 0 && action == SIG_DFL) {
 >  >  > -                      /*
 >  >  > -                       * If a child holding parent blocked, stopping 
 > could
 >  >  > -                       * cause deadlock: discard the signal.
 >  >  > -                       */
 >  >  > -                      if ((p->p_sflag & PS_PPWAIT) == 0) {
 >  >  > -                              p->p_xstat = signo;
 >  >  > -                              proc_stop(p, 1, signo);
 >  >  > -                      }
 >  >  > -                      goto out;
 >  >  > -              } else {
 >  >  > -                      /*
 >  >  > -                       * Stop signals with the default action are 
 > handled
 >  >  > -                       * specially in issignal(), and so are not 
 > enqueued.
 >  >  > -                       */
 >  >  > -                      sigput(&p->p_sigpend, p, kp);
 >  >  > -              }
 >  >  > +              sigput(&p->p_sigpend, p, kp);
 >  >  >        } else {
 >  >  >                /*
 >  >  >                 * Process is stopped or stopping.  If traced, then no
 >  >  
 >  
 >  I think this should work. I can't remember why it stops there instead of
 >  deferring to issignal().
 
 because otherwise it makes nanosleep wake up earlier?
 (it was fixed by kern_time.c rev.1.141.)
 
 >  There is a question over signal masking. TSTP is job control and so operates
 >  on the whole process, although masks are per-thread. I found nothing in the
 >  standards about this. I think we can be lazy and assume that if any thread
 >  has it unmasked, it can be taken.
 >  
 >  Andrew
 
 i couldn't find anything in standards either.
 
 YAMAMOTO Takashi
 


Home | Main Index | Thread Index | Old Index