mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-11 14:10:34 +00:00
Sigh. Signal handlers are executed on leaving the system call, not
at moment of delivery. Restoring the signal mask after the tsleep() is next to useless since the signal is still queued.. This was interacting with usleep(3) on receipt of a SIGALRM causing it to near busy loop. Now, we set the new signal mask "permanently" for signanosleep(). Problem noted by: bde
This commit is contained in:
parent
138ec1f71a
commit
987163643c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=30440
@ -31,7 +31,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_time.c 8.1 (Berkeley) 6/10/93
|
||||
* $Id: kern_time.c,v 1.34 1997/09/02 20:05:49 bde Exp $
|
||||
* $Id: kern_time.c,v 1.35 1997/09/21 22:00:16 gibbs Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -342,17 +342,11 @@ signanosleep(p, uap, retval)
|
||||
if (error)
|
||||
return (error);
|
||||
|
||||
/* See kern_sig.c:sigsuspend() for explanation. */
|
||||
ps->ps_oldmask = p->p_sigmask;
|
||||
ps->ps_flags |= SAS_OLDMASK;
|
||||
/* change mask for sleep */
|
||||
p->p_sigmask = mask &~ sigcantmask;
|
||||
|
||||
error = nanosleep1(p, &rqt, &rmt);
|
||||
|
||||
/* See kern_sig.c:sigsuspend() again. */
|
||||
p->p_sigmask = ps->ps_oldmask; /* in case timeout rather than sig */
|
||||
ps->ps_flags &= ~SAS_OLDMASK;
|
||||
|
||||
if (SCARG(uap, rmtp)) {
|
||||
error2 = copyout(&rmt, SCARG(uap, rmtp), sizeof(rmt));
|
||||
if (error2) /* XXX shouldn't happen, did useracc() above */
|
||||
|
Loading…
Reference in New Issue
Block a user