X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=libc%2Fsysdeps%2Flinux%2Fcommon%2Fbits%2Fsigset.h;h=f220e817170bb08d46008dac14eceea05a0d44fd;hb=b4e091562671505b8cf23288b06001a46f5fa3ef;hp=7c2ce0ebe295bf8ab9d6789245dde65f922879af;hpb=251a3c19cb4bba47fcd38c697b3d7679b3edb137;p=uclinux-h8%2Fuclibc-ng.git diff --git a/libc/sysdeps/linux/common/bits/sigset.h b/libc/sysdeps/linux/common/bits/sigset.h index 7c2ce0ebe..f220e8171 100644 --- a/libc/sysdeps/linux/common/bits/sigset.h +++ b/libc/sysdeps/linux/common/bits/sigset.h @@ -13,9 +13,8 @@ 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, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ + License along with the GNU C Library; if not, see + . */ #ifndef _SIGSET_H_types # define _SIGSET_H_types 1 @@ -153,11 +152,11 @@ typedef struct { checking is done in the non __ versions. */ # if !defined __USE_EXTERN_INLINES || defined __PROVIDE_OUT_OF_LINE_SIGSETFN -extern int __sigismember (__const __sigset_t *, int); +extern int __sigismember (const __sigset_t *, int); libc_hidden_proto(__sigismember) -extern int __sigaddset (__sigset_t *, int); +extern void __sigaddset (__sigset_t *, int); libc_hidden_proto(__sigaddset) -extern int __sigdelset (__sigset_t *, int); +extern void __sigdelset (__sigset_t *, int); libc_hidden_proto(__sigdelset) # endif @@ -170,21 +169,55 @@ libc_hidden_proto(__sigdelset) * will have its own copy of out-of line function emitted. */ # define _EXTERN_INLINE /*extern*/ __always_inline # endif -# define __SIGSETFN(NAME, BODY, CONST) \ -_EXTERN_INLINE int \ +# define __SIGSETFN(RET_TYPE, NAME, BODY, CONST) \ +_EXTERN_INLINE RET_TYPE \ NAME (CONST __sigset_t *__set, int __sig) \ { \ unsigned long __mask = __sigmask (__sig); \ - unsigned long __word = __sigword (__sig); \ - return BODY; \ + unsigned __word = __sigword (__sig); \ + BODY; \ } -__SIGSETFN (__sigismember, (__set->__val[__word] & __mask) ? 1 : 0, __const) -__SIGSETFN (__sigaddset, ((__set->__val[__word] |= __mask), 0), ) -__SIGSETFN (__sigdelset, ((__set->__val[__word] &= ~__mask), 0), ) +__SIGSETFN (int, __sigismember, return (__set->__val[__word] & __mask) ? 1 : 0, + const) +__SIGSETFN (void, __sigaddset, (__set->__val[__word] |= __mask), ) +__SIGSETFN (void, __sigdelset, (__set->__val[__word] &= ~__mask), ) # 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) : __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) : __sigdelset(set, sig)) +# endif #endif /* ! _SIGSET_H_fns. */