mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 15:30:07 +00:00
linux: Consolidate sigprocmask
All architectures now uses the Linux generic implementation which uses __NR_rt_sigprocmask. Checked on x86_64-linux-gnu, sparc64-linux-gnu, ia64-linux-gnu, s390x-linux-gnu, and alpha-linux-gnu.
This commit is contained in:
parent
58bd592536
commit
dc86199477
@ -1,58 +0,0 @@
|
|||||||
/* Copyright (C) 1993-2019 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
Contributed by David Mosberger (davidm@azstarnet.com).
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library. If not, see
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
/* When there is kernel support for more than 64 signals, we'll have to
|
|
||||||
switch to a new system call convention here. */
|
|
||||||
|
|
||||||
int
|
|
||||||
__sigprocmask (int how, const sigset_t *set, sigset_t *oset)
|
|
||||||
{
|
|
||||||
unsigned long int setval;
|
|
||||||
long result;
|
|
||||||
|
|
||||||
if (set)
|
|
||||||
setval = set->__val[0];
|
|
||||||
else
|
|
||||||
{
|
|
||||||
setval = 0;
|
|
||||||
how = SIG_BLOCK; /* ensure blocked mask doesn't get changed */
|
|
||||||
}
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (osf_sigprocmask, 2, how, setval);
|
|
||||||
if (result == -1)
|
|
||||||
/* If there are ever more than 63 signals, we need to recode this
|
|
||||||
in assembler since we wouldn't be able to distinguish a mask of
|
|
||||||
all 1s from -1, but for now, we're doing just fine... */
|
|
||||||
return result;
|
|
||||||
|
|
||||||
if (oset)
|
|
||||||
{
|
|
||||||
oset->__val[0] = result;
|
|
||||||
result = _SIGSET_NWORDS;
|
|
||||||
while (--result > 0)
|
|
||||||
oset->__val[result] = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
libc_hidden_def (__sigprocmask)
|
|
||||||
weak_alias (__sigprocmask, sigprocmask);
|
|
@ -1,40 +0,0 @@
|
|||||||
/* Copyright (C) 1997-2019 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
Linux/IA64 specific sigprocmask
|
|
||||||
Written by Jes Sorensen, <Jes.Sorensen@cern.ch>, April 1999.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
/* Linux/ia64 only has rt signals, thus we do not even want to try falling
|
|
||||||
back to the old style signals as the default Linux handler does. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
|
|
||||||
/* Get and/or change the set of blocked signals. */
|
|
||||||
int
|
|
||||||
__sigprocmask (int how, const sigset_t *set, sigset_t *oset)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* XXX The size argument hopefully will have to be changed to the
|
|
||||||
real size of the user-level sigset_t. */
|
|
||||||
return INLINE_SYSCALL (rt_sigprocmask, 4, how, set, oset, _NSIG / 8);
|
|
||||||
}
|
|
||||||
libc_hidden_def (__sigprocmask)
|
|
||||||
weak_alias (__sigprocmask, sigprocmask)
|
|
@ -1,38 +0,0 @@
|
|||||||
/* Copyright (C) 2001-2019 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
/* 64 bit Linux for S/390 only has rt signals, thus we do not even want to try
|
|
||||||
falling back to the old style signals as the default Linux handler does. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
|
|
||||||
/* Get and/or change the set of blocked signals. */
|
|
||||||
int
|
|
||||||
__sigprocmask (int how, const sigset_t *set, sigset_t *oset)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* XXX The size argument hopefully will have to be changed to the
|
|
||||||
real size of the user-level sigset_t. */
|
|
||||||
return INLINE_SYSCALL (rt_sigprocmask, 4, how, set, oset, _NSIG / 8);
|
|
||||||
}
|
|
||||||
libc_hidden_def (__sigprocmask)
|
|
||||||
weak_alias (__sigprocmask, sigprocmask)
|
|
@ -15,17 +15,9 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <string.h> /* Needed for string function builtin redirection. */
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
|
|
||||||
#include <nptl/pthreadP.h> /* SIGCANCEL, SIGSETXID */
|
#include <nptl/pthreadP.h> /* SIGCANCEL, SIGSETXID */
|
||||||
|
|
||||||
|
|
||||||
/* Get and/or change the set of blocked signals. */
|
/* Get and/or change the set of blocked signals. */
|
||||||
int
|
int
|
||||||
__sigprocmask (int how, const sigset_t *set, sigset_t *oset)
|
__sigprocmask (int how, const sigset_t *set, sigset_t *oset)
|
||||||
@ -35,8 +27,8 @@ __sigprocmask (int how, const sigset_t *set, sigset_t *oset)
|
|||||||
/* The only thing we have to make sure here is that SIGCANCEL and
|
/* The only thing we have to make sure here is that SIGCANCEL and
|
||||||
SIGSETXID are not blocked. */
|
SIGSETXID are not blocked. */
|
||||||
if (set != NULL
|
if (set != NULL
|
||||||
&& (__builtin_expect (__sigismember (set, SIGCANCEL), 0)
|
&& __glibc_unlikely (__sigismember (set, SIGCANCEL)
|
||||||
|| __builtin_expect (__sigismember (set, SIGSETXID), 0)))
|
|| __glibc_unlikely (__sigismember (set, SIGSETXID))))
|
||||||
{
|
{
|
||||||
local_newmask = *set;
|
local_newmask = *set;
|
||||||
__sigdelset (&local_newmask, SIGCANCEL);
|
__sigdelset (&local_newmask, SIGCANCEL);
|
||||||
@ -44,7 +36,7 @@ __sigprocmask (int how, const sigset_t *set, sigset_t *oset)
|
|||||||
set = &local_newmask;
|
set = &local_newmask;
|
||||||
}
|
}
|
||||||
|
|
||||||
return INLINE_SYSCALL (rt_sigprocmask, 4, how, set, oset, _NSIG / 8);
|
return INLINE_SYSCALL_CALL (rt_sigprocmask, how, set, oset, _NSIG / 8);
|
||||||
}
|
}
|
||||||
libc_hidden_def (__sigprocmask)
|
libc_hidden_def (__sigprocmask)
|
||||||
weak_alias (__sigprocmask, sigprocmask)
|
weak_alias (__sigprocmask, sigprocmask)
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
/* Copyright (C) 1997-2019 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
|
|
||||||
/* Get and/or change the set of blocked signals. */
|
|
||||||
int
|
|
||||||
__sigprocmask (int how, const sigset_t *set, sigset_t *oset)
|
|
||||||
{
|
|
||||||
/* XXX The size argument hopefully will have to be changed to the
|
|
||||||
real size of the user-level sigset_t. */
|
|
||||||
return INLINE_SYSCALL (rt_sigprocmask, 4, how, set, oset, _NSIG / 8);
|
|
||||||
}
|
|
||||||
libc_hidden_def (__sigprocmask)
|
|
||||||
weak_alias (__sigprocmask, sigprocmask)
|
|
@ -1,39 +0,0 @@
|
|||||||
/* Copyright (C) 1997-2019 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
Written by Jes Sorensen, <Jes.Sorensen@cern.ch>, April 1999.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
/* Linux/x86_64 only has rt signals, thus we do not even want to try falling
|
|
||||||
back to the old style signals as the default Linux handler does. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <sysdep.h>
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
|
|
||||||
/* Get and/or change the set of blocked signals. */
|
|
||||||
int
|
|
||||||
__sigprocmask (int how, const sigset_t *set, sigset_t *oset)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* XXX The size argument hopefully will have to be changed to the
|
|
||||||
real size of the user-level sigset_t. */
|
|
||||||
return INLINE_SYSCALL (rt_sigprocmask, 4, how, set, oset, _NSIG / 8);
|
|
||||||
}
|
|
||||||
libc_hidden_def (__sigprocmask)
|
|
||||||
weak_alias (__sigprocmask, sigprocmask)
|
|
Loading…
Reference in New Issue
Block a user