summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2010-10-22 17:01:05 +0200
committerDenys Vlasenko <dvlasenk@redhat.com>2010-10-22 17:01:05 +0200
commit162cfaea20d807f0ae329efe39292a9b22593b41 (patch)
tree4f2d5ac60a263551b4352b5bbb5ab8cbe7d60a3e
parent4bbf7dfe44bb83391b12ac94ca478df71fcf3dd7 (diff)
*: inline constant __sig{add,del}set and __sigismember
text data bss dec hex filename - 318 4 0 322 142 libc/pwd_grp/lckpwdf.o + 312 4 0 316 13c libc/pwd_grp/lckpwdf.o - 166 0 1 167 a7 libc/stdlib/abort.o + 157 0 1 158 9e libc/stdlib/abort.o - 42 0 0 42 2a libc/sysdeps/linux/common/pause.o + 27 0 0 27 1b libc/sysdeps/linux/common/pause.o Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-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
-rw-r--r--libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c2
6 files changed, 43 insertions, 12 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 */
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c
index 2681961bf..4319d8dbe 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c
@@ -175,7 +175,7 @@ __start_helper_thread (void)
sigset_t ss;
sigset_t oss;
sigfillset (&ss);
- __sigaddset (&ss, SIGCANCEL);
+ /*__sigaddset (&ss, SIGCANCEL); - already done by sigfillset */
INTERNAL_SYSCALL_DECL (err);
INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_SETMASK, &ss, &oss, _NSIG / 8);