From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10901 invoked by alias); 1 Jan 2018 21:56:45 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 10889 invoked by uid 89); 1 Jan 2018 21:56:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=Operation, operational, sake, gap X-HELO: mail-qt0-f194.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=YFZUYcBFKxqkdyDXiBkAeYnguteD1VUa87oXD2HM7mI=; b=EEEfmEAhWgfHcLhetZmXIAbbxpkhlHE4a8g7F9vEQalrhGPiSeUZ5Dn5Nui0pludAU xFIEL1XL+AZn+3zUMzjT402LcbLPAnK67Yki+FSrOz+CVdwLOStkSD4C3d+zxBjIpvy1 +/wBXzRLS/lZty/9fuqRnqSf55PQjK627nxrf3e93YCQvXlu39X9D053l7c0zhvmZVla K3pxTDrdCEwyjjiSa+ewZBIH1j3w+eUbPyVROYFOBpssIs7dHYAjOsxriVa5HW3sU6/+ dg4EtWRmixF1otvU5kEBSFMzV7rQY4xgu/Xl0F08GgNOWziknYrPoxGuF46oaFVA+ixB Ubvw== X-Gm-Message-State: AKGB3mKwvMsSJ3uS1wayjumz/LaiO0R3MNkX/0dTipgUvJCdA7cG5vuY mZPb1tA4rtyXORg12Zo9C8vjeyVRwG8= X-Google-Smtp-Source: ACJfBovkU8+98KILn1GdAi3K6ot+gX7giauCXfBWZwghEQeRHfU8HJI/dVml/uNu7+CnmfgOD1YdNg== X-Received: by 10.200.46.50 with SMTP id r47mr57753386qta.314.1514843798846; Mon, 01 Jan 2018 13:56:38 -0800 (PST) Subject: Re: [PATCH v3 2/3] Consolidate Linux sigprocmask implementation (BZ #22391) From: Adhemerval Zanella To: libc-alpha@sourceware.org References: <1510768451-18453-1-git-send-email-adhemerval.zanella@linaro.org> <1510768451-18453-2-git-send-email-adhemerval.zanella@linaro.org> Message-ID: <087abfc1-5916-521f-e561-1b13e94854df@linaro.org> Date: Mon, 01 Jan 2018 21:56:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-SW-Source: 2018-01/txt/msg00063.txt.bz2 Ping. On 12/12/2017 15:03, Adhemerval Zanella wrote: > Ping (with Rical suggested changes). > > On 15/11/2017 15:54, Adhemerval Zanella wrote: >> Changes from previous version: >> >> - Cleanup __nptl prefix from the generic names. >> >> --- >> >> This patch consolidates the sigprocmask Linux syscall implementation on >> sysdeps/unix/sysv/linux/sigprocmask.c. The changes are: >> >> 1. For ia64, s390-64, sparc64, and x86_64 the default semantic for >> filter out SIGCANCEL and SIGSETXID is used. Also the Linux pthread >> semantic is documented in the signal chapter. >> >> 2. A new internal function to check for NPTL internal signals within a >> signal set is added (__has_internal_signal). It is used to >> simplify the default sigprocmask.c implementation. >> >> Checked on x86_64-linux-gnu. >> >> [BZ #22391] >> * manual/signal.texi: Add a note about internal pthread signals >> on Linux. >> * sysdeps/unix/sysv/linux/alpha/sigprocmask.c: Remove file. >> * sysdeps/unix/sysv/linux/ia64/sigprocmask.c: Likewise. >> * sysdeps/unix/sysv/linux/s390/s390-64/sigprocmask.c: Likewise. >> * sysdeps/unix/sysv/linux/sparc/sparc64/sigprocmask.c: Likewise. >> * sysdeps/unix/sysv/linux/x86_64/sigprocmask.c: Likewise. >> * sysdeps/unix/sysv/linux/internal-signals.h >> (__has_internal_signal): New function. >> * sysdeps/unix/sysv/linux/sigprocmask.c (__sigprocmask): >> Use __has_internal_signal and __clear_internal_signals >> function. >> >> Signed-off-by: Adhemerval Zanella >> Signed-off-by: Zack Weinberg >> Reported-by: Yury Norov >> --- >> ChangeLog | 17 +++++++ >> manual/signal.texi | 37 ++++++++++++++ >> sysdeps/unix/sysv/linux/alpha/sigprocmask.c | 58 ---------------------- >> sysdeps/unix/sysv/linux/ia64/sigprocmask.c | 40 --------------- >> sysdeps/unix/sysv/linux/internal-signals.h | 6 +++ >> sysdeps/unix/sysv/linux/s390/s390-64/sigprocmask.c | 38 -------------- >> sysdeps/unix/sysv/linux/sigprocmask.c | 23 +++------ >> .../unix/sysv/linux/sparc/sparc64/sigprocmask.c | 34 ------------- >> sysdeps/unix/sysv/linux/x86_64/sigprocmask.c | 39 --------------- >> 9 files changed, 66 insertions(+), 226 deletions(-) >> delete mode 100644 sysdeps/unix/sysv/linux/alpha/sigprocmask.c >> delete mode 100644 sysdeps/unix/sysv/linux/ia64/sigprocmask.c >> delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/sigprocmask.c >> delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/sigprocmask.c >> delete mode 100644 sysdeps/unix/sysv/linux/x86_64/sigprocmask.c >> >> diff --git a/manual/signal.texi b/manual/signal.texi >> index 9577ff0..4f0ef59 100644 >> --- a/manual/signal.texi >> +++ b/manual/signal.texi >> @@ -235,6 +235,7 @@ defined. Since the signal numbers are allocated consecutively, >> * Job Control Signals:: Signals used to support job control. >> * Operation Error Signals:: Used to report operational system errors. >> * Miscellaneous Signals:: Miscellaneous Signals. >> +* Internally-Used Signals:: Signals used internally by the C library. >> * Signal Messages:: Printing a message describing a signal. >> @end menu >> >> @@ -794,6 +795,26 @@ in @ref{Signaling Another Process}. >> The default action is to terminate the process. >> @end deftypevr >> >> +@deftypevr Macro int SIGRTMIN >> +@deftypevrx Macro int SIGRTMAX >> +@standards{POSIX.1, signal.h} >> +@cindex real-time signals >> +The range of signal numbers @code{SIGRTMIN}, @code{SIGRTMIN+1}, >> +@dots{}, @code{SIGRTMAX} is also set aside for you to use any way you >> +want. In addition, these signals (and no others) are guaranteed to >> +support @dfn{real-time} signal semantics, which unfortunately this >> +manual does not yet document. >> + >> +Unlike all of the other signal number macros, @code{SIGRTMIN} and >> +@code{SIGRTMAX} are not compile-time constants, because some operating >> +systems make the number of real-time signals tunable on a >> +per-installation or even per-process basis. However, POSIX guarantees >> +that there will be at least 8 signal numbers in this range. >> + >> +The default action for all signals in this range is to terminate the >> +process. >> +@end deftypevr >> + >> @deftypevr Macro int SIGWINCH >> @standards{BSD, signal.h} >> Window size change. This is generated on some systems (including GNU) >> @@ -817,6 +838,22 @@ to print some status information about the system and what the process >> is doing. Otherwise the default is to do nothing. >> @end deftypevr >> >> +@node Internally-Used Signals >> +@subsection Internally-Used Signals >> +@cindex internally used signals >> + >> +On some operating systems, @theglibc{} needs to use a few signals from >> +the ``true'' real-time range internally, to implement thread >> +cancellation, cross-thread effective ID synchronization, POSIX timer >> +management, etc. @Theglibc{} adjusts @code{SIGRTMIN} and >> +@code{SIGRTMAX} to exclude these signals, and it also takes steps to >> +prevent application code from altering their state: @code{sigprocmask} >> +cannot block them and @code{sigaction} cannot redefine their handlers, >> +for instance. Therefore, most programs do not need to know or care >> +about these signals. We mainly document their existence for the sake >> +of anyone who has ever wondered why there is a gap between the >> +highest-numbered ``normal'' signal and @code{SIGRTMIN} on Linux. >> + >> @node Signal Messages >> @subsection Signal Messages >> @cindex signal messages >> diff --git a/sysdeps/unix/sysv/linux/alpha/sigprocmask.c b/sysdeps/unix/sysv/linux/alpha/sigprocmask.c >> deleted file mode 100644 >> index ebec70c..0000000 >> --- a/sysdeps/unix/sysv/linux/alpha/sigprocmask.c >> +++ /dev/null >> @@ -1,58 +0,0 @@ >> -/* Copyright (C) 1993-2017 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 >> - . */ >> - >> -#include >> -#include >> -#include >> - >> -/* 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); >> diff --git a/sysdeps/unix/sysv/linux/ia64/sigprocmask.c b/sysdeps/unix/sysv/linux/ia64/sigprocmask.c >> deleted file mode 100644 >> index 920c5fd..0000000 >> --- a/sysdeps/unix/sysv/linux/ia64/sigprocmask.c >> +++ /dev/null >> @@ -1,40 +0,0 @@ >> -/* Copyright (C) 1997-2017 Free Software Foundation, Inc. >> - This file is part of the GNU C Library. >> - Linux/IA64 specific sigprocmask >> - Written by Jes Sorensen, , 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 >> - . */ >> - >> -/* 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 >> -#include >> -#include >> - >> -#include >> -#include >> - >> -/* 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) >> diff --git a/sysdeps/unix/sysv/linux/internal-signals.h b/sysdeps/unix/sysv/linux/internal-signals.h >> index e96a718..bb8234d 100644 >> --- a/sysdeps/unix/sysv/linux/internal-signals.h >> +++ b/sysdeps/unix/sysv/linux/internal-signals.h >> @@ -36,6 +36,12 @@ >> #define SIGSETXID (__SIGRTMIN + 1) >> >> >> +static inline bool >> +__has_internal_signal (const sigset_t *set) >> +{ >> + return __sigismember (set, SIGCANCEL) || __sigismember (set, SIGSETXID); >> +} >> + >> /* Return is sig is used internally. */ >> static inline int >> __is_internal_signal (int sig) >> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sigprocmask.c b/sysdeps/unix/sysv/linux/s390/s390-64/sigprocmask.c >> deleted file mode 100644 >> index a8010e7..0000000 >> --- a/sysdeps/unix/sysv/linux/s390/s390-64/sigprocmask.c >> +++ /dev/null >> @@ -1,38 +0,0 @@ >> -/* Copyright (C) 2001-2017 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 >> - . */ >> - >> -/* 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 >> -#include >> -#include >> - >> -#include >> -#include >> - >> -/* 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) >> diff --git a/sysdeps/unix/sysv/linux/sigprocmask.c b/sysdeps/unix/sysv/linux/sigprocmask.c >> index e776563..e574b5d 100644 >> --- a/sysdeps/unix/sysv/linux/sigprocmask.c >> +++ b/sysdeps/unix/sysv/linux/sigprocmask.c >> @@ -1,4 +1,5 @@ >> -/* Copyright (C) 1997-2017 Free Software Foundation, Inc. >> +/* Get and/or change the set of blocked signals. Linux version. >> + Copyright (C) 1997-2017 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 >> @@ -17,34 +18,22 @@ >> >> #include >> #include >> -#include /* Needed for string function builtin redirection. */ >> -#include >> +#include >> >> -#include >> -#include >> >> -#include /* SIGCANCEL, SIGSETXID */ >> - >> - >> -/* Get and/or change the set of blocked signals. */ >> int >> __sigprocmask (int how, const sigset_t *set, sigset_t *oset) >> { >> sigset_t local_newmask; >> >> - /* 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))) >> + if (set != NULL && __glibc_unlikely (__has_internal_signal (set))) >> { >> local_newmask = *set; >> - __sigdelset (&local_newmask, SIGCANCEL); >> - __sigdelset (&local_newmask, SIGSETXID); >> + __clear_internal_signals (&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) >> weak_alias (__sigprocmask, sigprocmask) >> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sigprocmask.c b/sysdeps/unix/sysv/linux/sparc/sparc64/sigprocmask.c >> deleted file mode 100644 >> index ef7d7fe..0000000 >> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sigprocmask.c >> +++ /dev/null >> @@ -1,34 +0,0 @@ >> -/* Copyright (C) 1997-2017 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 >> - . */ >> - >> -#include >> -#include >> -#include >> - >> -#include >> -#include >> - >> -/* 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) >> diff --git a/sysdeps/unix/sysv/linux/x86_64/sigprocmask.c b/sysdeps/unix/sysv/linux/x86_64/sigprocmask.c >> deleted file mode 100644 >> index 1610ddf..0000000 >> --- a/sysdeps/unix/sysv/linux/x86_64/sigprocmask.c >> +++ /dev/null >> @@ -1,39 +0,0 @@ >> -/* Copyright (C) 1997-2017 Free Software Foundation, Inc. >> - This file is part of the GNU C Library. >> - Written by Jes Sorensen, , 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 >> - . */ >> - >> -/* 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 >> -#include >> -#include >> - >> -#include >> -#include >> - >> -/* 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) >>