diff options
Diffstat (limited to 'libc')
-rw-r--r-- | libc/signal/sigsetops.c | 3 | ||||
-rw-r--r-- | libc/stdlib/system.c | 5 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/bits/sigset.h | 35 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/pause.c | 2 | ||||
-rw-r--r-- | libc/unistd/sleep.c | 8 |
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 */ |