OSDN Git Service

libc: silence warning
[uclinux-h8/uclibc-ng.git] / libc / sysdeps / linux / common / bits / sigset.h
index 7c2ce0e..f220e81 100644 (file)
@@ -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
+   <http://www.gnu.org/licenses/>.  */
 
 #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.  */