diff options
| author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-10-22 17:01:05 +0200 | 
|---|---|---|
| committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-10-22 17:01:05 +0200 | 
| commit | 162cfaea20d807f0ae329efe39292a9b22593b41 (patch) | |
| tree | 4f2d5ac60a263551b4352b5bbb5ab8cbe7d60a3e /libc | |
| parent | 4bbf7dfe44bb83391b12ac94ca478df71fcf3dd7 (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>
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 */  | 
