mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 21:40:12 +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
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <errno.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 */
|
||||
|
||||
|
||||
/* Get and/or change the set of blocked signals. */
|
||||
int
|
||||
__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
|
||||
SIGSETXID are not blocked. */
|
||||
if (set != NULL
|
||||
&& (__builtin_expect (__sigismember (set, SIGCANCEL), 0)
|
||||
|| __builtin_expect (__sigismember (set, SIGSETXID), 0)))
|
||||
&& __glibc_unlikely (__sigismember (set, SIGCANCEL)
|
||||
|| __glibc_unlikely (__sigismember (set, SIGSETXID))))
|
||||
{
|
||||
local_newmask = *set;
|
||||
__sigdelset (&local_newmask, SIGCANCEL);
|
||||
@ -44,7 +36,7 @@ __sigprocmask (int how, const sigset_t *set, sigset_t *oset)
|
||||
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)
|
||||
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