public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2 8/8] Optimize sigrelse implementation
  2017-11-06 13:37 [PATCH v2 1/8] Rename nptl-signals.h to internal-signals.h Adhemerval Zanella
                   ` (4 preceding siblings ...)
  2017-11-06 13:37 ` [PATCH v2 5/8] Cleanup Linux sigqueue implementation Adhemerval Zanella
@ 2017-11-06 13:37 ` Adhemerval Zanella
  2017-11-15 16:44   ` Adhemerval Zanella
  2017-11-06 13:37 ` [PATCH v2 7/8] Cleanup sigpause implementation Adhemerval Zanella
  6 siblings, 1 reply; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-06 13:37 UTC (permalink / raw)
  To: libc-alpha

This patch simplifies sighold a bit by removing an extra sigprocmask
and using SIG_BLOCK (which union of the current set and the set argument).

Checked on x86_64-linux-gnu.

	* signal/sighold.c (sighold): Optimize implementation.

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
 ChangeLog         |  2 ++
 signal/sigrelse.c | 12 +++---------
 2 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/signal/sigrelse.c b/signal/sigrelse.c
index e41c2bd..61f240b 100644
--- a/signal/sigrelse.c
+++ b/signal/sigrelse.c
@@ -26,14 +26,8 @@ sigrelse (int sig)
 {
   sigset_t set;
 
-  /* Retrieve current signal set.  */
-  if (__sigprocmask (SIG_SETMASK, NULL, &set) < 0)
+  sigemptyset (&set);
+  if (sigaddset (&set, sig) < 0)
     return -1;
-
-  /* Remove the specified signal.  */
-  if (sigdelset (&set, sig) < 0)
-    return -1;
-
-  /* Set the new mask.  */
-  return __sigprocmask (SIG_SETMASK, &set, NULL);
+  return __sigprocmask (SIG_UNBLOCK, &set, NULL);
 }
-- 
2.7.4

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 6/8] Optimize sighold implementation
  2017-11-06 13:37 [PATCH v2 1/8] Rename nptl-signals.h to internal-signals.h Adhemerval Zanella
  2017-11-06 13:37 ` [PATCH v2 3/8] Filter out NPTL internal signals (BZ #22391) Adhemerval Zanella
@ 2017-11-06 13:37 ` Adhemerval Zanella
  2017-11-06 13:37 ` [PATCH v2 2/8] Consolidate Linux sigprocmask implementation (BZ #22391) Adhemerval Zanella
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-06 13:37 UTC (permalink / raw)
  To: libc-alpha

This patch simplifies sighold a bit by removing an extra sigprocmask
and using SIG_BLOCK (which union of the current set and the set argument).

Checked on x86_64-linux-gnu.

	* signal/sighold.c (sighold): Optimize implementation.

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Zack Weinberg <zackw@panix.com>
---
 ChangeLog        |  2 ++
 signal/sighold.c | 10 ++--------
 2 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/signal/sighold.c b/signal/sighold.c
index 2e32e47..955ac5b 100644
--- a/signal/sighold.c
+++ b/signal/sighold.c
@@ -26,14 +26,8 @@ sighold (int sig)
 {
   sigset_t set;
 
-  /* Retrieve current signal set.  */
-  if (__sigprocmask (SIG_SETMASK, NULL, &set) < 0)
-    return -1;
-
-  /* Add the specified signal.  */
+  sigemptyset (&set);
   if (sigaddset (&set, sig) < 0)
     return -1;
-
-  /* Set the new mask.  */
-  return __sigprocmask (SIG_SETMASK, &set, NULL);
+  return __sigprocmask (SIG_BLOCK, &set, NULL);
 }
-- 
2.7.4

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 3/8] Filter out NPTL internal signals (BZ #22391)
  2017-11-06 13:37 [PATCH v2 1/8] Rename nptl-signals.h to internal-signals.h Adhemerval Zanella
@ 2017-11-06 13:37 ` Adhemerval Zanella
  2017-11-06 14:03   ` Zack Weinberg
  2017-11-06 13:37 ` [PATCH v2 6/8] Optimize sighold implementation Adhemerval Zanella
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-06 13:37 UTC (permalink / raw)
  To: libc-alpha

Changes from previous version:

  - Use the internal-signals.h headers instead of nptl-signals.

---

This patch filters out the internal NPTL signals (SIGCANCEL/SIGTIMER and
SIGSETXID) from signal functions.  GLIBC on Linux requires both signals to
proper implement pthread cancellation, posix timers, and set*id posix
thread synchronization.

And not filtering out the internal signal is troublesome:

  - A conformant program on a architecture that does not filter out the
    signals might inadvertently disable pthread asynchronous cancellation,
    set*id synchronization or posix timers.

  - It might also to security issues if SIGSETXID is masked and set*id
    functions are called (some threads might have effective user or group
    id different from the rest).

The changes are basically:

  - Change __nptl_is_internal_signal to bool and used on all signal function
    that has a signal number as input.  Also for signal function which accepts
    signals sets (sigset_t) it assumes that canonical function were used to
    add/remove signals which lead to some input simplification.

  - Fix tst-sigset.c to avoid check for SIGCANCEL/SIGTIMER and SIGSETXID.
    It is rewritten to check each signal indidually and to check realtime
    signals using canonical macros.

  - Add generic __nptl_clear_internal_signals and __nptl_is_internal_signal
    version since both symbols are used on generic implementations.

  - Remove superflous sysdeps/nptl/sigfillset.c.

  - Remove superflous SIGTIMER handling on Linux __nptl_is_internal_signal
    since it is the same of SIGCANCEL.

  - Remove dnagling define and obvious comment on nptl/sigaction.c.

Checked on x86_64-linux-gnu.

	[BZ #22391]
	* nptl/sigaction.c (__sigaction): Use __nptl_is_internal_signal to
	check for internal nptl signals.
	* signal/sigaddset.c (sigaddset): Likewise.
	* signal/sigdelset.c (sigdelset): Likewise.
	* sysdeps/posix/signal.c (__bsd_signal): Likewise.
	* sysdeps/posix/sigset.c (sigset): Call and check sigaddset return
	value.
	* signal/sigfillset.c (sigfillset): User __nptl_clear_internal_signals
	to filter out internal nptl signals.
	* signal/tst-sigset.c (do_test): Check ech signal indidually and
	also check realtime signals using standard macros.
	* sysdeps/nptl/nptl-signals.h (__nptl_clear_internal_signals,
	__nptl_is_internal_signal): New functions.
	* sysdeps/nptl/sigfillset.c: Remove file.
	* sysdeps/unix/sysv/linux/nptl-signals.h (__nptl_is_internal_signal):
	Change return to bool.
	(__nptl_clear_internal_signals): Remove SIGTIMER clean since it is
	equal to SIGCANEL on Linux.
	* sysdeps/unix/sysv/linux/sigtimedwait.c (__sigtimedwait): Assume
	signal set was constructed using standard functions.
	* sysdeps/unix/sysv/linux/sigwait.c (do_sigtwait): Likewise.

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reported-by: Yury Norov <ynorov@caviumnetworks.com>
---
 ChangeLog                                  | 25 ++++++++
 nptl/sigaction.c                           | 14 +----
 signal/sigaction.c                         |  2 +-
 signal/sigaddset.c                         |  5 +-
 signal/sigdelset.c                         |  5 +-
 signal/sigfillset.c                        | 10 +---
 signal/tst-sigset.c                        | 92 ++++++++++++++++++++++--------
 sysdeps/generic/internal-signals.h         | 11 ++++
 sysdeps/nptl/sigfillset.c                  | 20 -------
 sysdeps/posix/signal.c                     |  5 +-
 sysdeps/posix/sigset.c                     | 10 +---
 sysdeps/unix/sysv/linux/internal-signals.h |  5 +-
 sysdeps/unix/sysv/linux/sigprocmask.c      |  4 +-
 sysdeps/unix/sysv/linux/sigtimedwait.c     | 17 +-----
 sysdeps/unix/sysv/linux/sigwait.c          | 13 -----
 15 files changed, 126 insertions(+), 112 deletions(-)
 delete mode 100644 sysdeps/nptl/sigfillset.c

diff --git a/nptl/sigaction.c b/nptl/sigaction.c
index 2994fd5..b2ff674 100644
--- a/nptl/sigaction.c
+++ b/nptl/sigaction.c
@@ -16,22 +16,12 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-
-/* This is no complete implementation.  The file is meant to be
-   included in the real implementation to provide the wrapper around
-   __libc_sigaction.  */
-
-#include <nptl/pthreadP.h>
-
-/* We use the libc implementation but we tell it to not allow
-   SIGCANCEL or SIGTIMER to be handled.  */
-#define LIBC_SIGACTION	1
-
+#include <internal-signals.h>
 
 int
 __sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
 {
-  if (__glibc_unlikely (sig == SIGCANCEL || sig == SIGSETXID))
+  if (sig <= 0 || sig >= NSIG || __is_internal_signal (sig))
     {
       __set_errno (EINVAL);
       return -1;
diff --git a/signal/sigaction.c b/signal/sigaction.c
index 8a6220c..3025aab 100644
--- a/signal/sigaction.c
+++ b/signal/sigaction.c
@@ -24,7 +24,7 @@
 int
 __sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
 {
-  if (sig <= 0 || sig >= NSIG)
+  if (sig <= 0 || sig >= NSIG || __is_internal_signal (sig))
     {
       __set_errno (EINVAL);
       return -1;
diff --git a/signal/sigaddset.c b/signal/sigaddset.c
index 161be7b..a435f61 100644
--- a/signal/sigaddset.c
+++ b/signal/sigaddset.c
@@ -17,13 +17,14 @@
 
 #include <errno.h>
 #include <signal.h>
-#include <sigsetops.h>
+#include <internal-signals.h>
 
 /* Add SIGNO to SET.  */
 int
 sigaddset (sigset_t *set, int signo)
 {
-  if (set == NULL || signo <= 0 || signo >= NSIG)
+  if (set == NULL || signo <= 0 || signo >= NSIG
+      || __is_internal_signal (signo))
     {
       __set_errno (EINVAL);
       return -1;
diff --git a/signal/sigdelset.c b/signal/sigdelset.c
index 2aaa536..01a50ec 100644
--- a/signal/sigdelset.c
+++ b/signal/sigdelset.c
@@ -17,13 +17,14 @@
 
 #include <errno.h>
 #include <signal.h>
-#include <sigsetops.h>
+#include <internal-signals.h>
 
 /* Add SIGNO to SET.  */
 int
 sigdelset (sigset_t *set, int signo)
 {
-  if (set == NULL || signo <= 0 || signo >= NSIG)
+  if (set == NULL || signo <= 0 || signo >= NSIG
+      || __is_internal_signal (signo))
     {
       __set_errno (EINVAL);
       return -1;
diff --git a/signal/sigfillset.c b/signal/sigfillset.c
index 0fcc24a..560c66e 100644
--- a/signal/sigfillset.c
+++ b/signal/sigfillset.c
@@ -18,6 +18,7 @@
 #include <errno.h>
 #include <signal.h>
 #include <string.h>
+#include <internal-signals.h>
 
 /* Set all signals in SET.  */
 int
@@ -31,14 +32,7 @@ sigfillset (sigset_t *set)
 
   memset (set, 0xff, sizeof (sigset_t));
 
-  /* If the implementation uses a cancellation signal don't set the bit.  */
-#ifdef SIGCANCEL
-  __sigdelset (set, SIGCANCEL);
-#endif
-  /* Likewise for the signal to implement setxid.  */
-#ifdef SIGSETXID
-  __sigdelset (set, SIGSETXID);
-#endif
+  __clear_internal_signals (set);
 
   return 0;
 }
diff --git a/signal/tst-sigset.c b/signal/tst-sigset.c
index d47adcc..a2b764d 100644
--- a/signal/tst-sigset.c
+++ b/signal/tst-sigset.c
@@ -1,43 +1,85 @@
 /* Test sig*set functions.  */
 
 #include <signal.h>
-#include <stdio.h>
 
-#define TEST_FUNCTION do_test ()
+#include <support/check.h>
+
 static int
 do_test (void)
 {
-  int result = 0;
-  int sig = -1;
+  sigset_t set;
+  TEST_VERIFY (sigemptyset (&set) == 0);
 
-#define TRY(call)							      \
-  if (call)								      \
-    {									      \
-      printf ("%s (sig = %d): %m\n", #call, sig);			      \
-      result = 1;							      \
-    }									      \
-  else
+#define VERIFY(set, sig)			\
+  TEST_VERIFY (sigismember (&set, sig) == 0);	\
+  TEST_VERIFY (sigaddset (&set, sig) == 0);	\
+  TEST_VERIFY (sigismember (&set, sig) != 0);	\
+  TEST_VERIFY (sigdelset (&set, sig) == 0);	\
+  TEST_VERIFY (sigismember (&set, sig) == 0)
 
+  /* ISO C99 signals.  */
+  VERIFY (set, SIGINT);
+  VERIFY (set, SIGILL);
+  VERIFY (set, SIGABRT);
+  VERIFY (set, SIGFPE);
+  VERIFY (set, SIGSEGV);
+  VERIFY (set, SIGTERM);
 
-  sigset_t set;
-  TRY (sigemptyset (&set) != 0);
+  /* Historical signals specified by POSIX. */
+  VERIFY (set, SIGHUP);
+  VERIFY (set, SIGQUIT);
+  VERIFY (set, SIGTRAP);
+  VERIFY (set, SIGKILL);
+  VERIFY (set, SIGBUS);
+  VERIFY (set, SIGSYS);
+  VERIFY (set, SIGPIPE);
+  VERIFY (set, SIGALRM);
+
+  /* New(er) POSIX signals (1003.1-2008, 1003.1-2013).  */
+  VERIFY (set, SIGURG);
+  VERIFY (set, SIGSTOP);
+  VERIFY (set, SIGTSTP);
+  VERIFY (set, SIGCONT);
+  VERIFY (set, SIGCHLD);
+  VERIFY (set, SIGTTIN);
+  VERIFY (set, SIGTTOU);
+  VERIFY (set, SIGPOLL);
+  VERIFY (set, SIGXCPU);
+  VERIFY (set, SIGXFSZ);
+  VERIFY (set, SIGVTALRM);
+  VERIFY (set, SIGPROF);
+  VERIFY (set, SIGUSR1);
+  VERIFY (set, SIGUSR2);
+
+  /* Nonstandard signals found in all modern POSIX systems
+     (including both BSD and Linux).  */
+  VERIFY (set, SIGWINCH);
 
-#ifdef SIGRTMAX
-  int max_sig = SIGRTMAX;
-#else
-  int max_sig = NSIG - 1;
+  /* Arch-specific signals.  */
+#ifdef SIGEMT
+  VERIFY (set, SIGEMT);
+#endif
+#ifdef SIGLOST
+  VERIFY (set, SIGLOST);
+#endif
+#ifdef SIGINFO
+  VERIFY (set, SIGINFO);
+#endif
+#ifdef SIGSTKFLT
+  VERIFY (set, SIGSTKFLT);
+#endif
+#ifdef SIGPWR
+  VERIFY (set, SIGPWR);
 #endif
 
-  for (sig = 1; sig <= max_sig; ++sig)
+  /* Read-time signals (POSIX.1b real-time extensions).  If they are
+     supported SIGRTMAX value is greater than SIGRTMIN.  */
+  for (int rtsig = SIGRTMIN; rtsig <= SIGRTMAX; rtsig++)
     {
-      TRY (sigismember (&set, sig) != 0);
-      TRY (sigaddset (&set, sig) != 0);
-      TRY (sigismember (&set, sig) == 0);
-      TRY (sigdelset (&set, sig) != 0);
-      TRY (sigismember (&set, sig) != 0);
+      VERIFY (set, rtsig);
     }
 
-  return result;
+  return 0;
 }
 
-#include "../test-skeleton.c"
+#include <support/test-driver.c>
diff --git a/sysdeps/generic/internal-signals.h b/sysdeps/generic/internal-signals.h
index 55bc07d..8a8854c 100644
--- a/sysdeps/generic/internal-signals.h
+++ b/sysdeps/generic/internal-signals.h
@@ -15,3 +15,14 @@
    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/>.  */
+
+static inline void
+__clear_internal_signals (sigset_t *set)
+{
+}
+
+static inline bool
+__is_internal_signal (int sig)
+{
+  return false;
+}
diff --git a/sysdeps/nptl/sigfillset.c b/sysdeps/nptl/sigfillset.c
deleted file mode 100644
index 50e8512..0000000
--- a/sysdeps/nptl/sigfillset.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright (C) 2003-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
-   <http://www.gnu.org/licenses/>.  */
-
-#include <nptl/pthreadP.h>
-
-#include <signal/sigfillset.c>
diff --git a/sysdeps/posix/signal.c b/sysdeps/posix/signal.c
index 81ba177..87c5d1c 100644
--- a/sysdeps/posix/signal.c
+++ b/sysdeps/posix/signal.c
@@ -18,8 +18,8 @@
 
 #include <errno.h>
 #include <signal.h>
-#include <string.h>	/* For the real memset prototype.  */
 #include <sigsetops.h>
+#include <internal-signals.h>
 
 sigset_t _sigintr attribute_hidden;		/* Set by siginterrupt.  */
 
@@ -31,7 +31,8 @@ __bsd_signal (int sig, __sighandler_t handler)
   struct sigaction act, oact;
 
   /* Check signal extents to protect __sigismember.  */
-  if (handler == SIG_ERR || sig < 1 || sig >= NSIG)
+  if (handler == SIG_ERR || sig < 1 || sig >= NSIG
+      || __is_internal_signal (sig))
     {
       __set_errno (EINVAL);
       return SIG_ERR;
diff --git a/sysdeps/posix/sigset.c b/sysdeps/posix/sigset.c
index a4dfe0a..6234ecf 100644
--- a/sysdeps/posix/sigset.c
+++ b/sysdeps/posix/sigset.c
@@ -31,15 +31,9 @@ sigset (int sig, __sighandler_t disp)
   sigset_t set;
   sigset_t oset;
 
-  /* Check signal extents to protect __sigismember.  */
-  if (disp == SIG_ERR || sig < 1 || sig >= NSIG)
-    {
-      __set_errno (EINVAL);
-      return SIG_ERR;
-    }
-
   __sigemptyset (&set);
-  __sigaddset (&set, sig);
+  if (sigaddset (&set, sig) < 0)
+    return SIG_ERR;
 
   if (disp == SIG_HOLD)
     {
diff --git a/sysdeps/unix/sysv/linux/internal-signals.h b/sysdeps/unix/sysv/linux/internal-signals.h
index ad9783b..219415c 100644
--- a/sysdeps/unix/sysv/linux/internal-signals.h
+++ b/sysdeps/unix/sysv/linux/internal-signals.h
@@ -21,6 +21,8 @@
 
 #include <signal.h>
 #include <sigsetops.h>
+#include <stdbool.h>
+#include <sysdep.h>
 
 /* The signal used for asynchronous cancelation.  */
 #define SIGCANCEL       __SIGRTMIN
@@ -43,7 +45,7 @@ __nptl_has_internal_signal (const sigset_t *set)
 }
 
 /* Return is sig is used internally.  */
-static inline int
+static inline bool
 __is_internal_signal (int sig)
 {
   return (sig == SIGCANCEL) || (sig == SIGTIMER) || (sig == SIGSETXID);
@@ -54,7 +56,6 @@ static inline void
 __clear_internal_signals (sigset_t *set)
 {
   __sigdelset (set, SIGCANCEL);
-  __sigdelset (set, SIGTIMER);
   __sigdelset (set, SIGSETXID);
 }
 
diff --git a/sysdeps/unix/sysv/linux/sigprocmask.c b/sysdeps/unix/sysv/linux/sigprocmask.c
index d14fc5c..004b0b6 100644
--- a/sysdeps/unix/sysv/linux/sigprocmask.c
+++ b/sysdeps/unix/sysv/linux/sigprocmask.c
@@ -18,7 +18,7 @@
 
 #include <errno.h>
 #include <signal.h>
-#include <nptl-signals.h>
+#include <internal-signals.h>
 
 
 int
@@ -29,7 +29,7 @@ __sigprocmask (int how, const sigset_t *set, sigset_t *oset)
   if (set != NULL && __glibc_unlikely (__nptl_has_internal_signal (set)))
     {
       local_newmask = *set;
-      __nptl_clear_internal_signals (&local_newmask);
+      __clear_internal_signals (&local_newmask);
       set = &local_newmask;
     }
 
diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c
index 42afbce..21e9fca 100644
--- a/sysdeps/unix/sysv/linux/sigtimedwait.c
+++ b/sysdeps/unix/sysv/linux/sigtimedwait.c
@@ -29,21 +29,8 @@ int
 __sigtimedwait (const sigset_t *set, siginfo_t *info,
 		const struct timespec *timeout)
 {
-  sigset_t tmpset;
-  if (set != NULL
-      && (__builtin_expect (__sigismember (set, SIGCANCEL), 0)
-	  || __builtin_expect (__sigismember (set, SIGSETXID), 0)))
-    {
-      /* Create a temporary mask without the bit for SIGCANCEL set.  */
-      // We are not copying more than we have to.
-      memcpy (&tmpset, set, _NSIG / 8);
-      __sigdelset (&tmpset, SIGCANCEL);
-      __sigdelset (&tmpset, SIGSETXID);
-      set = &tmpset;
-    }
-
-    /* XXX The size argument hopefully will have to be changed to the
-       real size of the user-level sigset_t.  */
+  /* XXX The size argument hopefully will have to be changed to the
+     real size of the user-level sigset_t.  */
   int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, timeout, _NSIG / 8);
 
   /* The kernel generates a SI_TKILL code in si_code in case tkill is
diff --git a/sysdeps/unix/sysv/linux/sigwait.c b/sysdeps/unix/sysv/linux/sigwait.c
index 395bd9f..18a4485 100644
--- a/sysdeps/unix/sysv/linux/sigwait.c
+++ b/sysdeps/unix/sysv/linux/sigwait.c
@@ -33,19 +33,6 @@ do_sigwait (const sigset_t *set, int *sig)
 {
   int ret;
 
-  sigset_t tmpset;
-  if (set != NULL
-      && (__builtin_expect (__sigismember (set, SIGCANCEL), 0)
-	  || __builtin_expect (__sigismember (set, SIGSETXID), 0)))
-    {
-      /* Create a temporary mask without the bit for SIGCANCEL set.  */
-      // We are not copying more than we have to.
-      memcpy (&tmpset, set, _NSIG / 8);
-      __sigdelset (&tmpset, SIGCANCEL);
-      __sigdelset (&tmpset, SIGSETXID);
-      set = &tmpset;
-    }
-
   /* XXX The size argument hopefully will have to be changed to the
      real size of the user-level sigset_t.  */
 #ifdef INTERNAL_SYSCALL
-- 
2.7.4

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 4/8] Simplify Linux sig{timed}wait{info} implementations
  2017-11-06 13:37 [PATCH v2 1/8] Rename nptl-signals.h to internal-signals.h Adhemerval Zanella
                   ` (2 preceding siblings ...)
  2017-11-06 13:37 ` [PATCH v2 2/8] Consolidate Linux sigprocmask implementation (BZ #22391) Adhemerval Zanella
@ 2017-11-06 13:37 ` Adhemerval Zanella
  2017-11-06 13:37 ` [PATCH v2 5/8] Cleanup Linux sigqueue implementation Adhemerval Zanella
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-06 13:37 UTC (permalink / raw)
  To: libc-alpha

Changes from previous version:

  - Add a note about __NR_rt_sigtimedwait Linux minimum version support.
  - Comment about LIBC_CANCEL_HANDLED annotations.
  - Add a note about __sigtimedwait inclusion on GLIBC_PRIVATE.

---

This patch simplifies sig{timed}wait{info} by:

  - Assuming __NR_rt_sigtimedwait existence on all architectures due minimum
    kernel version requirement (it pre-dates Linux git inclusion for Linux
    2.6.12).

  - Now that sigwait is based on a internal sigtimedwait call and it is 
    present of both libc.so and libpthread.so we need to add an external
    private definition of __sigtimedwait for libpthread.so call.

  - Call __sigtimedwait on both sigwait and sigwaitinfo.

Checked on x86_64-linux-gnu.

	* sysdeps/unix/sysv/linux/Versions (libc) [GLIBC_PRIVATE]: Add
	__sigtimedwait.
	* sysdeps/unix/sysv/linux/sigtimedwait.c: Simplify includes and
	assume __NR_rt_sigtimedwait.
	* sysdeps/unix/sysv/linux/sigwait.c (__sigwait): Call __sigtimedwait
	and add LIBC_CANCEL_HANDLED for cancellation marking.
	* sysdeps/unix/sysv/linux/sigwaitinfo.c (__sigwaitinfo): Likewise.

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Zack Weinberg <zackw@panix.com>
---
 ChangeLog                              |  8 ++++
 sysdeps/unix/sysv/linux/Versions       |  1 +
 sysdeps/unix/sysv/linux/sigtimedwait.c |  9 -----
 sysdeps/unix/sysv/linux/sigwait.c      | 68 ++++------------------------------
 sysdeps/unix/sysv/linux/sigwaitinfo.c  | 41 ++------------------
 5 files changed, 21 insertions(+), 106 deletions(-)

diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions
index 6c9e06f..d3dbcde 100644
--- a/sysdeps/unix/sysv/linux/Versions
+++ b/sysdeps/unix/sysv/linux/Versions
@@ -172,6 +172,7 @@ libc {
     __open_nocancel;
     __read_nocancel;
     __close_nocancel;
+    __sigtimedwait;
     # functions used by nscd
     __netlink_assert_response;
   }
diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c
index 21e9fca..f74a921 100644
--- a/sysdeps/unix/sysv/linux/sigtimedwait.c
+++ b/sysdeps/unix/sysv/linux/sigtimedwait.c
@@ -17,13 +17,7 @@
 
 #include <errno.h>
 #include <signal.h>
-#include <string.h>
-
-#include <nptl/pthreadP.h>
 #include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-#ifdef __NR_rt_sigtimedwait
 
 int
 __sigtimedwait (const sigset_t *set, siginfo_t *info,
@@ -44,6 +38,3 @@ __sigtimedwait (const sigset_t *set, siginfo_t *info,
 }
 libc_hidden_def (__sigtimedwait)
 weak_alias (__sigtimedwait, sigtimedwait)
-#else
-# include <signal/sigtimedwait.c>
-#endif
diff --git a/sysdeps/unix/sysv/linux/sigwait.c b/sysdeps/unix/sysv/linux/sigwait.c
index 18a4485..e6fb32a 100644
--- a/sysdeps/unix/sysv/linux/sigwait.c
+++ b/sysdeps/unix/sysv/linux/sigwait.c
@@ -15,73 +15,21 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
 #include <signal.h>
-#define __need_NULL
-#include <stddef.h>
-#include <string.h>
-
-#include <nptl/pthreadP.h>
 #include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-#ifdef __NR_rt_sigtimedwait
-
-/* Return any pending signal or wait for one for the given time.  */
-static int
-do_sigwait (const sigset_t *set, int *sig)
-{
-  int ret;
-
-  /* XXX The size argument hopefully will have to be changed to the
-     real size of the user-level sigset_t.  */
-#ifdef INTERNAL_SYSCALL
-  INTERNAL_SYSCALL_DECL (err);
-  do
-    ret = INTERNAL_SYSCALL (rt_sigtimedwait, err, 4, set,
-			    NULL, NULL, _NSIG / 8);
-  while (INTERNAL_SYSCALL_ERROR_P (ret, err)
-	 && INTERNAL_SYSCALL_ERRNO (ret, err) == EINTR);
-  if (! INTERNAL_SYSCALL_ERROR_P (ret, err))
-    {
-      *sig = ret;
-      ret = 0;
-    }
-  else
-    ret = INTERNAL_SYSCALL_ERRNO (ret, err);
-#else
-  do
-    ret = INLINE_SYSCALL (rt_sigtimedwait, 4, set, NULL, NULL, _NSIG / 8);
-  while (ret == -1 && errno == EINTR);
-  if (ret != -1)
-    {
-      *sig = ret;
-      ret = 0;
-    }
-  else
-    ret = errno;
-#endif
-
-  return ret;
-}
 
 int
 __sigwait (const sigset_t *set, int *sig)
 {
-  if (SINGLE_THREAD_P)
-    return do_sigwait (set, sig);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = do_sigwait (set, sig);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  siginfo_t si;
+  if (__sigtimedwait (set, &si, 0) < 0)
+    return -1;
+  *sig = si.si_signo;
+  return 0;
 }
 libc_hidden_def (__sigwait)
 weak_alias (__sigwait, sigwait)
-#else
-# include <sysdeps/posix/sigwait.c>
-#endif
 strong_alias (__sigwait, __libc_sigwait)
+
+/* __sigtimedwait handles cancellation.  */
+LIBC_CANCEL_HANDLED ();
diff --git a/sysdeps/unix/sysv/linux/sigwaitinfo.c b/sysdeps/unix/sysv/linux/sigwaitinfo.c
index 0062d3e..75ddd52 100644
--- a/sysdeps/unix/sysv/linux/sigwaitinfo.c
+++ b/sysdeps/unix/sysv/linux/sigwaitinfo.c
@@ -15,52 +15,19 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
 #include <signal.h>
-#define __need_NULL
-#include <stddef.h>
-#include <string.h>
-
-#include <nptl/pthreadP.h>
 #include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-#ifdef __NR_rt_sigtimedwait
 
 /* Return any pending signal or wait for one for the given time.  */
 int
 __sigwaitinfo (const sigset_t *set, siginfo_t *info)
 {
-  sigset_t tmpset;
-  if (set != NULL
-      && (__builtin_expect (__sigismember (set, SIGCANCEL), 0)
-	  || __builtin_expect (__sigismember (set, SIGSETXID), 0)))
-    {
-      /* Create a temporary mask without the bit for SIGCANCEL set.  */
-      // We are not copying more than we have to.
-      memcpy (&tmpset, set, _NSIG / 8);
-      __sigdelset (&tmpset, SIGCANCEL);
-      __sigdelset (&tmpset, SIGSETXID);
-      set = &tmpset;
-    }
-
-  /* XXX The size argument hopefully will have to be changed to the
-     real size of the user-level sigset_t.  */
-  int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, NULL, _NSIG / 8);
-
-  /* The kernel generates a SI_TKILL code in si_code in case tkill is
-     used.  tkill is transparently used in raise().  Since having
-     SI_TKILL as a code is useful in general we fold the results
-     here.  */
-  if (result != -1 && info != NULL && info->si_code == SI_TKILL)
-    info->si_code = SI_USER;
-
-  return result;
+  return __sigtimedwait (set, info, 0);
 }
 
 libc_hidden_def (__sigwaitinfo)
 weak_alias (__sigwaitinfo, sigwaitinfo)
-#else
-# include <signal/sigwaitinfo.c>
-#endif
 strong_alias (__sigwaitinfo, __libc_sigwaitinfo)
+
+/* __sigtimedwait handles cancellation.  */
+LIBC_CANCEL_HANDLED ();
-- 
2.7.4

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 2/8] Consolidate Linux sigprocmask implementation (BZ #22391)
  2017-11-06 13:37 [PATCH v2 1/8] Rename nptl-signals.h to internal-signals.h Adhemerval Zanella
  2017-11-06 13:37 ` [PATCH v2 3/8] Filter out NPTL internal signals (BZ #22391) Adhemerval Zanella
  2017-11-06 13:37 ` [PATCH v2 6/8] Optimize sighold implementation Adhemerval Zanella
@ 2017-11-06 13:37 ` Adhemerval Zanella
  2017-11-06 13:37 ` [PATCH v2 4/8] Simplify Linux sig{timed}wait{info} implementations Adhemerval Zanella
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-06 13:37 UTC (permalink / raw)
  To: libc-alpha; +Cc: Zack Weinberg

Changes from previous version:

  - Rewrite manual/signal.text based on Zack Weinberg suggestion.

---

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 (__nptl_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/ia64/sigprocmask.c: Remove file.
	* 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/nptl-signals.h
	(__nptl_has_internal_signal): New function.
	* sysdeps/unix/sysv/linux/sigprocmask.c (__sigprocmask):
	Use __nptl_has_internal_signal and __nptl_clear_internal_signals
	function.

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Signed-off-by: Zack Weinberg <zackw@panix.com>
Reported-by: Yury Norov <ynorov@caviumnetworks.com>
---
 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
-   <http://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);
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, <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
-   <http://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)
diff --git a/sysdeps/unix/sysv/linux/internal-signals.h b/sysdeps/unix/sysv/linux/internal-signals.h
index 797698b..ad9783b 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
+__nptl_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
-   <http://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)
diff --git a/sysdeps/unix/sysv/linux/sigprocmask.c b/sysdeps/unix/sysv/linux/sigprocmask.c
index e776563..d14fc5c 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 <errno.h>
 #include <signal.h>
-#include <string.h>  /* Needed for string function builtin redirection.  */
-#include <unistd.h>
+#include <nptl-signals.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)
 {
   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 (__nptl_has_internal_signal (set)))
     {
       local_newmask = *set;
-      __sigdelset (&local_newmask, SIGCANCEL);
-      __sigdelset (&local_newmask, SIGSETXID);
+      __nptl_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
-   <http://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)
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, <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
-   <http://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)
-- 
2.7.4

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/8] Rename nptl-signals.h to internal-signals.h
@ 2017-11-06 13:37 Adhemerval Zanella
  2017-11-06 13:37 ` [PATCH v2 3/8] Filter out NPTL internal signals (BZ #22391) Adhemerval Zanella
                   ` (6 more replies)
  0 siblings, 7 replies; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-06 13:37 UTC (permalink / raw)
  To: libc-alpha

This patch renames the nptl-signals.h header to internal-signals.h.
On Linux the definitions and functions are not only NPTL related, but
used for other POSIX definitions as well (for instance SIGTIMER for
posix times, SIGSETXID for id functions, and signal block/restore
helpers) and since generic functions will be places and used in generic
implementation it makes more sense to decouple it from NPTL.

Checked on x86_64-linux-gnu.

	* sysdeps/nptl/nptl-signals.h: Move to ...
	* sysdeps/generic/internal-signals.h: ... here.  Adjust internal
	comments.
	* sysdeps/unix/sysv/linux/internal-signals.h: Add include guards.
	(__nptl_is_internal_signal): Rename to __is_internal_signal.
	(__nptl_clear_internal_signals): Rename to __clear_internal_signals.
	* sysdeps/unix/sysv/linux/raise.c: Adjust nptl-signal.h to
	include-signals.h rename.
	* nptl/pthreadP.h: Likewise.
	* sysdeps/unix/sysv/linux/spawni.c (__spawni_child): Call
	__is_internal_signal instead of __nptl_is_internal_signal.

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
 ChangeLog                                                  | 14 ++++++++++++++
 nptl/pthreadP.h                                            |  2 +-
 .../{nptl/nptl-signals.h => generic/internal-signals.h}    |  7 +------
 .../unix/sysv/linux/{nptl-signals.h => internal-signals.h} | 13 +++++++++----
 sysdeps/unix/sysv/linux/raise.c                            |  2 +-
 sysdeps/unix/sysv/linux/spawni.c                           |  2 +-
 6 files changed, 27 insertions(+), 13 deletions(-)
 rename sysdeps/{nptl/nptl-signals.h => generic/internal-signals.h} (74%)
 rename sysdeps/unix/sysv/linux/{nptl-signals.h => internal-signals.h} (91%)

diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index dbf46b0..e0872b9 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -32,7 +32,7 @@
 #include <atomic.h>
 #include <kernel-features.h>
 #include <errno.h>
-#include <nptl-signals.h>
+#include <internal-signals.h>
 
 
 /* Atomic operations on TLS memory.  */
diff --git a/sysdeps/nptl/nptl-signals.h b/sysdeps/generic/internal-signals.h
similarity index 74%
rename from sysdeps/nptl/nptl-signals.h
rename to sysdeps/generic/internal-signals.h
index 298acf2..55bc07d 100644
--- a/sysdeps/nptl/nptl-signals.h
+++ b/sysdeps/generic/internal-signals.h
@@ -1,4 +1,4 @@
-/* Special use of signals in NPTL internals.  Stub version.
+/* Special use of signals internally.  Stub version.
    Copyright (C) 2014-2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -15,8 +15,3 @@
    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/>.  */
-
-/* This file can define the macros SIGCANCEL, SIGTIMER, and SIGSETXID to
-   signal numbers reserved by libpthread for those internal purposes.
-
-   Note that some code presumes SIGTIMER is the same as SIGCANCEL.  */
diff --git a/sysdeps/unix/sysv/linux/nptl-signals.h b/sysdeps/unix/sysv/linux/internal-signals.h
similarity index 91%
rename from sysdeps/unix/sysv/linux/nptl-signals.h
rename to sysdeps/unix/sysv/linux/internal-signals.h
index f30c597..797698b 100644
--- a/sysdeps/unix/sysv/linux/nptl-signals.h
+++ b/sysdeps/unix/sysv/linux/internal-signals.h
@@ -1,4 +1,4 @@
-/* Special use of signals in NPTL internals.  Linux version.
+/* Special use of signals internally.  Linux version.
    Copyright (C) 2014-2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,6 +16,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef __INTERNAL_SIGNALS_H
+# define __INTERNAL_SIGNALS_H
+
 #include <signal.h>
 #include <sigsetops.h>
 
@@ -35,14 +38,14 @@
 
 /* Return is sig is used internally.  */
 static inline int
-__nptl_is_internal_signal (int sig)
+__is_internal_signal (int sig)
 {
   return (sig == SIGCANCEL) || (sig == SIGTIMER) || (sig == SIGSETXID);
 }
 
 /* Remove internal glibc signal from the mask.  */
 static inline void
-__nptl_clear_internal_signals (sigset_t *set)
+__clear_internal_signals (sigset_t *set)
 {
   __sigdelset (set, SIGCANCEL);
   __sigdelset (set, SIGTIMER);
@@ -66,7 +69,7 @@ static inline int
 __libc_signal_block_app (sigset_t *set)
 {
   sigset_t allset = SIGALL_SET;
-  __nptl_clear_internal_signals (&allset);
+  __clear_internal_signals (&allset);
   INTERNAL_SYSCALL_DECL (err);
   return INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_BLOCK, &allset, set,
 			   _NSIG / 8);
@@ -83,3 +86,5 @@ __libc_signal_restore_set (const sigset_t *set)
 
 /* Used to communicate with signal handler.  */
 extern struct xid_command *__xidcmd attribute_hidden;
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/raise.c b/sysdeps/unix/sysv/linux/raise.c
index 70e5a98..1167950 100644
--- a/sysdeps/unix/sysv/linux/raise.c
+++ b/sysdeps/unix/sysv/linux/raise.c
@@ -21,7 +21,7 @@
 #include <errno.h>
 #include <sys/types.h>
 #include <unistd.h>
-#include <nptl-signals.h>
+#include <internal-signals.h>
 
 int
 raise (int sig)
diff --git a/sysdeps/unix/sysv/linux/spawni.c b/sysdeps/unix/sysv/linux/spawni.c
index fb83c2e..af464b5 100644
--- a/sysdeps/unix/sysv/linux/spawni.c
+++ b/sysdeps/unix/sysv/linux/spawni.c
@@ -144,7 +144,7 @@ __spawni_child (void *arguments)
 	}
       else if (sigismember (&hset, sig))
 	{
-	  if (__nptl_is_internal_signal (sig))
+	  if (__is_internal_signal (sig))
 	    sa.sa_handler = SIG_IGN;
 	  else
 	    {
-- 
2.7.4

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 5/8] Cleanup Linux sigqueue implementation
  2017-11-06 13:37 [PATCH v2 1/8] Rename nptl-signals.h to internal-signals.h Adhemerval Zanella
                   ` (3 preceding siblings ...)
  2017-11-06 13:37 ` [PATCH v2 4/8] Simplify Linux sig{timed}wait{info} implementations Adhemerval Zanella
@ 2017-11-06 13:37 ` Adhemerval Zanella
  2017-11-06 13:37 ` [PATCH v2 8/8] Optimize sigrelse implementation Adhemerval Zanella
  2017-11-06 13:37 ` [PATCH v2 7/8] Cleanup sigpause implementation Adhemerval Zanella
  6 siblings, 0 replies; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-06 13:37 UTC (permalink / raw)
  To: libc-alpha

Changes from previous version:

  - Add a note about __NR_rt_sigqueueinfo Linux minimum version support.

---

This patch simplify Linux sigqueue implementation by assuming
__NR_rt_sigqueueinfo existence due minimum kernel requirement
(tt pre-dates Linux git inclusion for Linux 2.6.12).

Checked on x86_64-linux-gnu.

	* sysdeps/unix/sysv/linux/sigqueue.c (__sigqueue): Asssume
	__NR_rt_sigqueueinfo.

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Zack Weinberg <zackw@panix.com>
---
 ChangeLog                          |  3 +++
 sysdeps/unix/sysv/linux/sigqueue.c | 10 ++--------
 2 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/sysdeps/unix/sysv/linux/sigqueue.c b/sysdeps/unix/sysv/linux/sigqueue.c
index 059e524..67bb6b2 100644
--- a/sysdeps/unix/sysv/linux/sigqueue.c
+++ b/sysdeps/unix/sysv/linux/sigqueue.c
@@ -17,13 +17,10 @@
 
 #include <errno.h>
 #include <signal.h>
-#include <unistd.h>
 #include <string.h>
-
+#include <unistd.h>
 #include <sysdep.h>
-#include <sys/syscall.h>
 
-#ifdef __NR_rt_sigqueueinfo
 /* Return any pending signal or wait for one for the given time.  */
 int
 __sigqueue (pid_t pid, int sig, const union sigval val)
@@ -40,9 +37,6 @@ __sigqueue (pid_t pid, int sig, const union sigval val)
   info.si_uid = __getuid ();
   info.si_value = val;
 
-  return INLINE_SYSCALL (rt_sigqueueinfo, 3, pid, sig, &info);
+  return INLINE_SYSCALL_CALL (rt_sigqueueinfo, pid, sig, &info);
 }
 weak_alias (__sigqueue, sigqueue)
-#else
-# include <signal/sigqueue.c>
-#endif
-- 
2.7.4

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 7/8] Cleanup sigpause implementation
  2017-11-06 13:37 [PATCH v2 1/8] Rename nptl-signals.h to internal-signals.h Adhemerval Zanella
                   ` (5 preceding siblings ...)
  2017-11-06 13:37 ` [PATCH v2 8/8] Optimize sigrelse implementation Adhemerval Zanella
@ 2017-11-06 13:37 ` Adhemerval Zanella
  2017-11-15 16:44   ` Adhemerval Zanella
  6 siblings, 1 reply; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-06 13:37 UTC (permalink / raw)
  To: libc-alpha

This patch simplify sigpause by remobing the single thread optimization
since it will be handled already by the __sigsuspend call.

Checked on x86_64-linux-gnu.

	* sysdeps/posix/sigpause.c (do_sigpause): Remove.
	(__sigpause): Rely on __sigsuspend to implement single thread
	optimization.  Add LIBC_CANCEL_HANDLED for cancellation marking.

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Zack Weinberg <zackw@panix.com>
---
 ChangeLog                |  4 ++++
 sysdeps/posix/sigpause.c | 26 ++++++--------------------
 2 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/sysdeps/posix/sigpause.c b/sysdeps/posix/sigpause.c
index 9038ed3..a61e056 100644
--- a/sysdeps/posix/sigpause.c
+++ b/sysdeps/posix/sigpause.c
@@ -19,15 +19,13 @@
 #include <errno.h>
 #include <signal.h>
 #include <stddef.h>		/* For NULL.  */
-#include <sysdep-cancel.h>
 #undef sigpause
 
 #include <sigset-cvt-mask.h>
+#include <sysdep-cancel.h>
 
-/* Set the mask of blocked signals to MASK,
-   wait for a signal to arrive, and then restore the mask.  */
-static int
-do_sigpause (int sig_or_mask, int is_sig)
+int
+__sigpause (int sig_or_mask, int is_sig)
 {
   sigset_t set;
 
@@ -46,21 +44,6 @@ do_sigpause (int sig_or_mask, int is_sig)
      to do anything here.  */
   return __sigsuspend (&set);
 }
-
-int
-__sigpause (int sig_or_mask, int is_sig)
-{
-  if (SINGLE_THREAD_P)
-    return do_sigpause (sig_or_mask, is_sig);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = do_sigpause (sig_or_mask, is_sig);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-}
 libc_hidden_def (__sigpause)
 
 /* We have to provide a default version of this function since the
@@ -87,3 +70,6 @@ __xpg_sigpause (int sig)
   return __sigpause (sig, 1);
 }
 strong_alias (__xpg_sigpause, __libc___xpg_sigpause)
+
+/* __sigsuspend handles cancellation.  */
+LIBC_CANCEL_HANDLED ();
-- 
2.7.4

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/8] Filter out NPTL internal signals (BZ #22391)
  2017-11-06 13:37 ` [PATCH v2 3/8] Filter out NPTL internal signals (BZ #22391) Adhemerval Zanella
@ 2017-11-06 14:03   ` Zack Weinberg
  2017-11-06 15:41     ` Adhemerval Zanella
  0 siblings, 1 reply; 15+ messages in thread
From: Zack Weinberg @ 2017-11-06 14:03 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: GNU C Library

On Mon, Nov 6, 2017 at 8:37 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> Changes from previous version:
>
>   - Use the internal-signals.h headers instead of nptl-signals.

The ChangeLog is inconsistent with the code: I spent a few minutes
being confused because I thought the previous patch was dropping the
__nptl prefix from these internal functions.  Which it is, and the
code appears to be right, but the changelog doesn't match.

zw

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/8] Filter out NPTL internal signals (BZ #22391)
  2017-11-06 14:03   ` Zack Weinberg
@ 2017-11-06 15:41     ` Adhemerval Zanella
  2017-11-06 16:17       ` Zack Weinberg
  0 siblings, 1 reply; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-06 15:41 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: GNU C Library



On 06/11/2017 12:02, Zack Weinberg wrote:
> On Mon, Nov 6, 2017 at 8:37 AM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>> Changes from previous version:
>>
>>   - Use the internal-signals.h headers instead of nptl-signals.
> 
> The ChangeLog is inconsistent with the code: I spent a few minutes
> being confused because I thought the previous patch was dropping the
> __nptl prefix from these internal functions.  Which it is, and the
> code appears to be right, but the changelog doesn't match.
> 
> zw
> 

My mistake, I will fix it locally.  I changed to:

	[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
	(__nptl_has_internal_signal): New function.
	* sysdeps/unix/sysv/linux/sigprocmask.c (__sigprocmask):
	Use __has_internal_signal and __clear_internal_signals
	function.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/8] Filter out NPTL internal signals (BZ #22391)
  2017-11-06 15:41     ` Adhemerval Zanella
@ 2017-11-06 16:17       ` Zack Weinberg
  2017-11-06 16:53         ` Adhemerval Zanella
  0 siblings, 1 reply; 15+ messages in thread
From: Zack Weinberg @ 2017-11-06 16:17 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: GNU C Library

On Mon, Nov 6, 2017 at 10:41 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>         * sysdeps/unix/sysv/linux/internal-signals.h
>         (__nptl_has_internal_signal): New function.
>         * sysdeps/unix/sysv/linux/sigprocmask.c (__sigprocmask):
>         Use __has_internal_signal and __clear_internal_signals
>         function.

Still got __nptl_ in there ;-)

zw

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/8] Filter out NPTL internal signals (BZ #22391)
  2017-11-06 16:17       ` Zack Weinberg
@ 2017-11-06 16:53         ` Adhemerval Zanella
  0 siblings, 0 replies; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-06 16:53 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: GNU C Library



On 06/11/2017 14:17, Zack Weinberg wrote:
> On Mon, Nov 6, 2017 at 10:41 AM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>         * sysdeps/unix/sysv/linux/internal-signals.h
>>         (__nptl_has_internal_signal): New function.
>>         * sysdeps/unix/sysv/linux/sigprocmask.c (__sigprocmask):
>>         Use __has_internal_signal and __clear_internal_signals
>>         function.
> 
> Still got __nptl_ in there ;-)
> 
> zw
> 

Fixed, thanks.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 8/8] Optimize sigrelse implementation
  2017-11-06 13:37 ` [PATCH v2 8/8] Optimize sigrelse implementation Adhemerval Zanella
@ 2017-11-15 16:44   ` Adhemerval Zanella
  0 siblings, 0 replies; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-15 16:44 UTC (permalink / raw)
  To: libc-alpha

If nobody opposes it I will commit this shortly.

On 06/11/2017 11:37, Adhemerval Zanella wrote:
> This patch simplifies sighold a bit by removing an extra sigprocmask
> and using SIG_BLOCK (which union of the current set and the set argument).
> 
> Checked on x86_64-linux-gnu.
> 
> 	* signal/sighold.c (sighold): Optimize implementation.
> 
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
>  ChangeLog         |  2 ++
>  signal/sigrelse.c | 12 +++---------
>  2 files changed, 5 insertions(+), 9 deletions(-)
> 
> diff --git a/signal/sigrelse.c b/signal/sigrelse.c
> index e41c2bd..61f240b 100644
> --- a/signal/sigrelse.c
> +++ b/signal/sigrelse.c
> @@ -26,14 +26,8 @@ sigrelse (int sig)
>  {
>    sigset_t set;
>  
> -  /* Retrieve current signal set.  */
> -  if (__sigprocmask (SIG_SETMASK, NULL, &set) < 0)
> +  sigemptyset (&set);
> +  if (sigaddset (&set, sig) < 0)
>      return -1;
> -
> -  /* Remove the specified signal.  */
> -  if (sigdelset (&set, sig) < 0)
> -    return -1;
> -
> -  /* Set the new mask.  */
> -  return __sigprocmask (SIG_SETMASK, &set, NULL);
> +  return __sigprocmask (SIG_UNBLOCK, &set, NULL);
>  }
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 7/8] Cleanup sigpause implementation
  2017-11-06 13:37 ` [PATCH v2 7/8] Cleanup sigpause implementation Adhemerval Zanella
@ 2017-11-15 16:44   ` Adhemerval Zanella
  2017-11-15 19:27     ` Paul Clarke
  0 siblings, 1 reply; 15+ messages in thread
From: Adhemerval Zanella @ 2017-11-15 16:44 UTC (permalink / raw)
  To: libc-alpha

If nobody opposes it I will commit this shortly.

On 06/11/2017 11:37, Adhemerval Zanella wrote:
> This patch simplify sigpause by remobing the single thread optimization
> since it will be handled already by the __sigsuspend call.
> 
> Checked on x86_64-linux-gnu.
> 
> 	* sysdeps/posix/sigpause.c (do_sigpause): Remove.
> 	(__sigpause): Rely on __sigsuspend to implement single thread
> 	optimization.  Add LIBC_CANCEL_HANDLED for cancellation marking.
> 
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> Reviewed-by: Zack Weinberg <zackw@panix.com>
> ---
>  ChangeLog                |  4 ++++
>  sysdeps/posix/sigpause.c | 26 ++++++--------------------
>  2 files changed, 10 insertions(+), 20 deletions(-)
> 
> diff --git a/sysdeps/posix/sigpause.c b/sysdeps/posix/sigpause.c
> index 9038ed3..a61e056 100644
> --- a/sysdeps/posix/sigpause.c
> +++ b/sysdeps/posix/sigpause.c
> @@ -19,15 +19,13 @@
>  #include <errno.h>
>  #include <signal.h>
>  #include <stddef.h>		/* For NULL.  */
> -#include <sysdep-cancel.h>
>  #undef sigpause
>  
>  #include <sigset-cvt-mask.h>
> +#include <sysdep-cancel.h>
>  
> -/* Set the mask of blocked signals to MASK,
> -   wait for a signal to arrive, and then restore the mask.  */
> -static int
> -do_sigpause (int sig_or_mask, int is_sig)
> +int
> +__sigpause (int sig_or_mask, int is_sig)
>  {
>    sigset_t set;
>  
> @@ -46,21 +44,6 @@ do_sigpause (int sig_or_mask, int is_sig)
>       to do anything here.  */
>    return __sigsuspend (&set);
>  }
> -
> -int
> -__sigpause (int sig_or_mask, int is_sig)
> -{
> -  if (SINGLE_THREAD_P)
> -    return do_sigpause (sig_or_mask, is_sig);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = do_sigpause (sig_or_mask, is_sig);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> -}
>  libc_hidden_def (__sigpause)
>  
>  /* We have to provide a default version of this function since the
> @@ -87,3 +70,6 @@ __xpg_sigpause (int sig)
>    return __sigpause (sig, 1);
>  }
>  strong_alias (__xpg_sigpause, __libc___xpg_sigpause)
> +
> +/* __sigsuspend handles cancellation.  */
> +LIBC_CANCEL_HANDLED ();
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 7/8] Cleanup sigpause implementation
  2017-11-15 16:44   ` Adhemerval Zanella
@ 2017-11-15 19:27     ` Paul Clarke
  0 siblings, 0 replies; 15+ messages in thread
From: Paul Clarke @ 2017-11-15 19:27 UTC (permalink / raw)
  To: Adhemerval Zanella, libc-alpha

nits only...

On 11/15/2017 10:44 AM, Adhemerval Zanella wrote:
> If nobody opposes it I will commit this shortly.
> 
> On 06/11/2017 11:37, Adhemerval Zanella wrote:
>> This patch simplify sigpause by remobing the single thread optimization

s/simplify/simplifies/
s/remobing/removing/

PC

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2017-11-15 19:27 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-06 13:37 [PATCH v2 1/8] Rename nptl-signals.h to internal-signals.h Adhemerval Zanella
2017-11-06 13:37 ` [PATCH v2 3/8] Filter out NPTL internal signals (BZ #22391) Adhemerval Zanella
2017-11-06 14:03   ` Zack Weinberg
2017-11-06 15:41     ` Adhemerval Zanella
2017-11-06 16:17       ` Zack Weinberg
2017-11-06 16:53         ` Adhemerval Zanella
2017-11-06 13:37 ` [PATCH v2 6/8] Optimize sighold implementation Adhemerval Zanella
2017-11-06 13:37 ` [PATCH v2 2/8] Consolidate Linux sigprocmask implementation (BZ #22391) Adhemerval Zanella
2017-11-06 13:37 ` [PATCH v2 4/8] Simplify Linux sig{timed}wait{info} implementations Adhemerval Zanella
2017-11-06 13:37 ` [PATCH v2 5/8] Cleanup Linux sigqueue implementation Adhemerval Zanella
2017-11-06 13:37 ` [PATCH v2 8/8] Optimize sigrelse implementation Adhemerval Zanella
2017-11-15 16:44   ` Adhemerval Zanella
2017-11-06 13:37 ` [PATCH v2 7/8] Cleanup sigpause implementation Adhemerval Zanella
2017-11-15 16:44   ` Adhemerval Zanella
2017-11-15 19:27     ` Paul Clarke

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).