diff options
-rw-r--r-- | ChangeLog | 20 | ||||
-rw-r--r-- | signal/allocrtsig.c | 55 | ||||
-rw-r--r-- | sysdeps/generic/testrtsig.h | 27 | ||||
-rw-r--r-- | sysdeps/nptl/allocrtsig.c | 49 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/allocrtsig.c | 55 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/testrtsig.h | 27 |
6 files changed, 88 insertions, 145 deletions
diff --git a/ChangeLog b/ChangeLog index 676e72c467..a84c0cbf82 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,25 @@ 2015-01-08 Roland McGrath <roland@hack.frob.com> + * signal/allocrtsig.c (RESERVED_SIGRT): New macro, defined to 0 if not + already defined. + [__SIGRTMIN] (init): Function removed. + [__SIGRTMIN] (initialized): Variable removed. + [!__SIGRTMIN] (current_rtmin, current_rtmax): Variables removed. + [__SIGRTMIN] (current_rtmin, current_rtmax): Initialize to + __SIGRTMIN + RESERVED_SIGRT and __SIGRTMAX, respectively. + (__libc_current_sigrtmin) [__SIGRTMIN]: Don't call init. + (__libc_current_sigrtmin) [!__SIGRTMIN]: Just return -1. + (__libc_current_sigrtmin): Add __libc_current_sigrtmin_private alias. + (__libc_current_sigrtmax) [__SIGRTMIN]: Don't call init. + (__libc_current_sigrtmax) [!__SIGRTMIN]: Just return -1. + (__libc_current_sigrtmax): Add __libc_current_sigrtmax_private alias. + (__libc_allocate_rtsig) [__SIGRTMIN]: Don't call init. + (__libc_allocate_rtsig): Add __libc_allocate_rtsig_private alias. + * sysdeps/nptl/allocrtsig.c: New file. + * sysdeps/unix/sysv/linux/allocrtsig.c: File removed. + * sysdeps/unix/sysv/linux/testrtsig.h: File removed. + * sysdeps/generic/testrtsig.h: File removed. + * nptl/pthread_sigmask.c [SIGCANCEL || SIGTIMER || SIGSETXID]: #error. (pthread_sigmask): Call sigprocmask, not __sigprocmask. diff --git a/signal/allocrtsig.c b/signal/allocrtsig.c index c9af846cf6..0dd003110f 100644 --- a/signal/allocrtsig.c +++ b/signal/allocrtsig.c @@ -1,4 +1,4 @@ -/* Handle real-time signal allocation. +/* Handle real-time signal allocation. Generic version. Copyright (C) 1997-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -19,36 +19,18 @@ #include <signal.h> +/* Another sysdeps file can #define this and then #include this file. */ +#ifndef RESERVED_SIGRT +# define RESERVED_SIGRT 0 +#endif + /* In these variables we keep track of the used variables. If the platform does not support any real-time signals we will define the values to some unreasonable value which will signal failing of all the functions below. */ -#ifndef __SIGRTMIN -static int current_rtmin = -1; -static int current_rtmax = -1; -#else -static int current_rtmin; -static int current_rtmax; - -static int initialized; - -#include <testrtsig.h> - -static void -init (void) -{ - if (!kernel_has_rtsig ()) - { - current_rtmin = -1; - current_rtmax = -1; - } - else - { - current_rtmin = __SIGRTMIN; - current_rtmax = __SIGRTMAX; - } - initialized = 1; -} +#ifdef __SIGRTMIN +static int current_rtmin = __SIGRTMIN + RESERVED_SIGRT; +static int current_rtmax = __SIGRTMAX; #endif /* Return number of available real-time signal with highest priority. */ @@ -56,24 +38,26 @@ int __libc_current_sigrtmin (void) { #ifdef __SIGRTMIN - if (!initialized) - init (); -#endif return current_rtmin; +#else + return -1; +#endif } libc_hidden_def (__libc_current_sigrtmin) +strong_alias (__libc_current_sigrtmin, __libc_current_sigrtmin_private) /* Return number of available real-time signal with lowest priority. */ int __libc_current_sigrtmax (void) { #ifdef __SIGRTMIN - if (!initialized) - init (); -#endif return current_rtmax; +#else + return -1; +#endif } libc_hidden_def (__libc_current_sigrtmax) +strong_alias (__libc_current_sigrtmax, __libc_current_sigrtmax_private) /* Allocate real-time signal with highest/lowest available priority. Please note that we don't use a lock since we assume @@ -84,12 +68,11 @@ __libc_allocate_rtsig (int high) #ifndef __SIGRTMIN return -1; #else - if (!initialized) - init (); if (current_rtmin == -1 || current_rtmin > current_rtmax) - /* We don't have anymore signal available. */ + /* We don't have any more signals available. */ return -1; return high ? current_rtmin++ : current_rtmax--; #endif } +strong_alias (__libc_allocate_rtsig, __libc_allocate_rtsig_private) diff --git a/sysdeps/generic/testrtsig.h b/sysdeps/generic/testrtsig.h deleted file mode 100644 index 842ee7fc01..0000000000 --- a/sysdeps/generic/testrtsig.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Test whether RT signals are really available. - Copyright (C) 1997-2015 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <sys/utsname.h> - -static int -kernel_has_rtsig (void) -{ - return 0; -} diff --git a/sysdeps/nptl/allocrtsig.c b/sysdeps/nptl/allocrtsig.c new file mode 100644 index 0000000000..6b1c5b2e33 --- /dev/null +++ b/sysdeps/nptl/allocrtsig.c @@ -0,0 +1,49 @@ +/* Handle real-time signal allocation. NPTL version. + Copyright (C) 2015 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 + <http://www.gnu.org/licenses/>. */ + +#include <nptl/pthreadP.h> + +/* Up to three special signals might be used privately by libpthread. + Figure out how many unique ones are actually used. */ + +#ifdef SIGCANCEL +# define SIGCANCEL_CONSUMES 1 +#else +# define SIGCANCEL_CONSUMES 0 +#endif + +#if defined SIGTIMER && (!defined SIGCANCEL || SIGTIMER != SIGCANCEL) +# define SIGTIMER_CONSUMES 1 +#else +# define SIGTIMER_CONSUMES 0 +#endif + +#if (defined SIGSETXID \ + && (!defined SIGCANCEL || SIGSETXID != SIGCANCEL) \ + && (!defined SIGTIMER || SIGSETXID != SIGTIMER)) +# define SIGSETXID_CONSUMES 1 +#else +# define SIGSETXID_CONSUMES 0 +#endif + +/* This tells the generic code (included below) how many signal + numbers need to be reserved for libpthread's private uses. */ +#define RESERVED_SIGRT \ + (SIGCANCEL_CONSUMES + SIGTIMER_CONSUMES + SIGSETXID_CONSUMES) + +#include <signal/allocrtsig.c> diff --git a/sysdeps/unix/sysv/linux/allocrtsig.c b/sysdeps/unix/sysv/linux/allocrtsig.c deleted file mode 100644 index 52ce21cb03..0000000000 --- a/sysdeps/unix/sysv/linux/allocrtsig.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2002-2015 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <signal.h> - - -static int current_rtmin = __SIGRTMIN + 2; -static int current_rtmax = __SIGRTMAX; - - -/* We reserve __SIGRTMIN for use as the cancelation signal. This - signal is used internally. */ -int -__libc_current_sigrtmin (void) -{ - return current_rtmin; -} -libc_hidden_def (__libc_current_sigrtmin) -strong_alias (__libc_current_sigrtmin, __libc_current_sigrtmin_private) - - -int -__libc_current_sigrtmax (void) -{ - return current_rtmax; -} -libc_hidden_def (__libc_current_sigrtmax) -strong_alias (__libc_current_sigrtmax, __libc_current_sigrtmax_private) - - -int -__libc_allocate_rtsig (int high) -{ - if (current_rtmin == -1 || current_rtmin > current_rtmax) - /* We don't have anymore signal available. */ - return -1; - - return high ? current_rtmin++ : current_rtmax--; -} -strong_alias (__libc_allocate_rtsig, __libc_allocate_rtsig_private) diff --git a/sysdeps/unix/sysv/linux/testrtsig.h b/sysdeps/unix/sysv/linux/testrtsig.h deleted file mode 100644 index 8b12a8418b..0000000000 --- a/sysdeps/unix/sysv/linux/testrtsig.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Test whether RT signals are really available. - Copyright (C) 1997-2015 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. - - 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 - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <sys/utsname.h> - -static int -kernel_has_rtsig (void) -{ - return 1; -} |