summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
Diffstat (limited to 'libc')
-rw-r--r--libc/signal/sigsetops.c3
-rw-r--r--libc/stdlib/system.c5
-rw-r--r--libc/sysdeps/linux/common/bits/sigset.h35
-rw-r--r--libc/sysdeps/linux/common/pause.c2
-rw-r--r--libc/unistd/sleep.c8
5 files changed, 42 insertions, 11 deletions
diff --git a/libc/signal/sigsetops.c b/libc/signal/sigsetops.c
index e39d32f99..fa5fe6acf 100644
--- a/libc/signal/sigsetops.c
+++ b/libc/signal/sigsetops.c
@@ -12,6 +12,9 @@
/* Since we massaged signal.h into emitting non-inline function
* definitions, we need to finish PLT avoidance trick: */
+#undef __sigismember
+#undef __sigaddset
+#undef __sigdelset
libc_hidden_def(__sigismember)
libc_hidden_def(__sigaddset)
libc_hidden_def(__sigdelset)
diff --git a/libc/stdlib/system.c b/libc/stdlib/system.c
index acd86761d..59f5cc9c6 100644
--- a/libc/stdlib/system.c
+++ b/libc/stdlib/system.c
@@ -126,9 +126,10 @@ do_system (const char *line)
struct sigaction sa;
sigset_t omask;
+ memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_IGN;
- sa.sa_flags = 0;
- __sigemptyset (&sa.sa_mask);
+ /*sa.sa_flags = 0; - done by memset */
+ /*__sigemptyset (&sa.sa_mask); - done by memset */
DO_LOCK ();
if (ADD_REF () == 0)
diff --git a/libc/sysdeps/linux/common/bits/sigset.h b/libc/sysdeps/linux/common/bits/sigset.h
index 7c2ce0ebe..4ef22311a 100644
--- a/libc/sysdeps/linux/common/bits/sigset.h
+++ b/libc/sysdeps/linux/common/bits/sigset.h
@@ -175,7 +175,7 @@ _EXTERN_INLINE int \
NAME (CONST __sigset_t *__set, int __sig) \
{ \
unsigned long __mask = __sigmask (__sig); \
- unsigned long __word = __sigword (__sig); \
+ unsigned __word = __sigword (__sig); \
return BODY; \
}
@@ -186,5 +186,38 @@ __SIGSETFN (__sigdelset, ((__set->__val[__word] &= ~__mask), 0), )
# undef __SIGSETFN
# endif
+# ifdef _LIBC
+/* It's far too much PITA to __USE_EXTERN_INLINES from within libc.
+ * Especially since we want to inline only calls with const sig,
+ * but __USE_EXTERN_INLINES will inline all calls!
+ */
+static __always_inline unsigned long
+const_sigismember(const __sigset_t *set, int sig)
+{
+ unsigned long mask = __sigmask(sig);
+ unsigned word = __sigword(sig);
+ return (set->__val[word] & mask);
+}
+# define __sigismember(set, sig) \
+ (__builtin_constant_p(sig) ? (const_sigismember(set, sig) != 0) : __sigismember(set, sig))
+static __always_inline void
+const_sigaddset(__sigset_t *set, int sig)
+{
+ unsigned long mask = __sigmask(sig);
+ unsigned word = __sigword(sig);
+ set->__val[word] |= mask;
+}
+# define __sigaddset(set, sig) \
+ (__builtin_constant_p(sig) ? (const_sigaddset(set, sig), 0) : __sigaddset(set, sig))
+static __always_inline void
+const_sigdelset(__sigset_t *set, int sig)
+{
+ unsigned long mask = __sigmask(sig);
+ unsigned word = __sigword(sig);
+ set->__val[word] &= ~mask;
+}
+# define __sigdelset(set, sig) \
+ (__builtin_constant_p(sig) ? (const_sigdelset(set, sig), 0) : __sigdelset(set, sig))
+# endif
#endif /* ! _SIGSET_H_fns. */
diff --git a/libc/sysdeps/linux/common/pause.c b/libc/sysdeps/linux/common/pause.c
index 33eb409c6..ab16fa73c 100644
--- a/libc/sysdeps/linux/common/pause.c
+++ b/libc/sysdeps/linux/common/pause.c
@@ -25,7 +25,7 @@ __libc_pause (void)
{
sigset_t set;
- __sigemptyset (&set);
+ /*__sigemptyset (&set); - why? */
sigprocmask (SIG_BLOCK, NULL, &set);
/* pause is a cancellation point, but so is sigsuspend.
diff --git a/libc/unistd/sleep.c b/libc/unistd/sleep.c
index 6a237e3f9..c4b8a4812 100644
--- a/libc/unistd/sleep.c
+++ b/libc/unistd/sleep.c
@@ -20,14 +20,8 @@
#include <errno.h>
#include <time.h>
-#include <unistd.h>
-/* Want fast and small __sigemptyset/__sigaddset/__sigismember: */
-/* TODO: make them available (to everybody) without this hack */
-#ifndef __USE_EXTERN_INLINES
-# define __USE_EXTERN_INLINES 1
-#endif
#include <signal.h>
-
+#include <unistd.h>
/* version perusing nanosleep */