If a signal did not fire, restore the original signal mask for pselect/pollts
using a signal mask. Tested by tron.
This commit is contained in:
parent
3b708a2134
commit
0b60c7be7c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: sys_select.c,v 1.32 2011/05/18 14:48:04 christos Exp $ */
|
/* $NetBSD: sys_select.c,v 1.33 2011/05/28 15:33:41 christos Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2007, 2008, 2009, 2010 The NetBSD Foundation, Inc.
|
* Copyright (c) 2007, 2008, 2009, 2010 The NetBSD Foundation, Inc.
|
||||||
@ -84,7 +84,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: sys_select.c,v 1.32 2011/05/18 14:48:04 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: sys_select.c,v 1.33 2011/05/28 15:33:41 christos Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
@ -304,6 +304,9 @@ state_check:
|
|||||||
}
|
}
|
||||||
selclear();
|
selclear();
|
||||||
|
|
||||||
|
if (__predict_false(mask))
|
||||||
|
sigsuspendteardown(l);
|
||||||
|
|
||||||
/* select and poll are not restarted after signals... */
|
/* select and poll are not restarted after signals... */
|
||||||
if (error == ERESTART)
|
if (error == ERESTART)
|
||||||
return EINTR;
|
return EINTR;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: sys_sig.c,v 1.33 2011/05/18 03:51:41 christos Exp $ */
|
/* $NetBSD: sys_sig.c,v 1.34 2011/05/28 15:33:40 christos Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
|
* Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
|
||||||
@ -66,7 +66,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.33 2011/05/18 03:51:41 christos Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.34 2011/05/28 15:33:40 christos Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
@ -631,6 +631,19 @@ sigsuspendsetup(struct lwp *l, const sigset_t *ss)
|
|||||||
mutex_exit(p->p_lock);
|
mutex_exit(p->p_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sigsuspendteardown(struct lwp *l)
|
||||||
|
{
|
||||||
|
struct proc *p = l->l_proc;
|
||||||
|
|
||||||
|
mutex_enter(p->p_lock);
|
||||||
|
if (l->l_sigrestore) {
|
||||||
|
l->l_sigrestore = 0;
|
||||||
|
l->l_sigmask = l->l_sigoldmask;
|
||||||
|
}
|
||||||
|
mutex_exit(p->p_lock);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sigsuspend1(struct lwp *l, const sigset_t *ss)
|
sigsuspend1(struct lwp *l, const sigset_t *ss)
|
||||||
{
|
{
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: signalvar.h,v 1.80 2011/05/18 03:51:41 christos Exp $ */
|
/* $NetBSD: signalvar.h,v 1.81 2011/05/28 15:33:41 christos Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1991, 1993
|
* Copyright (c) 1991, 1993
|
||||||
@ -149,6 +149,7 @@ int sigaction1(struct lwp *, int, const struct sigaction *,
|
|||||||
int sigprocmask1(struct lwp *, int, const sigset_t *, sigset_t *);
|
int sigprocmask1(struct lwp *, int, const sigset_t *, sigset_t *);
|
||||||
void sigpending1(struct lwp *, sigset_t *);
|
void sigpending1(struct lwp *, sigset_t *);
|
||||||
void sigsuspendsetup(struct lwp *, const sigset_t *);
|
void sigsuspendsetup(struct lwp *, const sigset_t *);
|
||||||
|
void sigsuspendteardown(struct lwp *);
|
||||||
int sigsuspend1(struct lwp *, const sigset_t *);
|
int sigsuspend1(struct lwp *, const sigset_t *);
|
||||||
int sigaltstack1(struct lwp *, const struct sigaltstack *,
|
int sigaltstack1(struct lwp *, const struct sigaltstack *,
|
||||||
struct sigaltstack *);
|
struct sigaltstack *);
|
||||||
|
Loading…
Reference in New Issue
Block a user