浏览代码

This header file was broken, breaking signal handling on ARM.
This update fixes it...
-Erik

Eric Andersen 24 年之前
父节点
当前提交
fe1d95673c
共有 1 个文件被更改,包括 66 次插入10 次删除
  1. 66 10
      libc/sysdeps/linux/arm/bits/sigset.h

+ 66 - 10
libc/sysdeps/linux/arm/bits/sigset.h

@@ -24,7 +24,11 @@ typedef int __sig_atomic_t;
 
 
 /* A `sigset_t' has a bit for each signal.  */
 /* A `sigset_t' has a bit for each signal.  */
 
 
-typedef unsigned long __sigset_t;
+# define _SIGSET_NWORDS	(1024 / (8 * sizeof (unsigned long int)))
+typedef struct
+  {
+    unsigned long int __val[_SIGSET_NWORDS];
+  } __sigset_t;
 
 
 #endif
 #endif
 
 
@@ -43,27 +47,79 @@ typedef unsigned long __sigset_t;
 # endif
 # endif
 
 
 /* Return a mask that includes the bit for SIG only.  */
 /* Return a mask that includes the bit for SIG only.  */
-# define __sigmask(sig) (1L << ((sig) - 1))
+# define __sigmask(sig) \
+  (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int))))
+
+/* Return the word index for SIG.  */
+# define __sigword(sig)	(((sig) - 1) / (8 * sizeof (unsigned long int)))
 
 
 # if defined __GNUC__ && __GNUC__ >= 2
 # if defined __GNUC__ && __GNUC__ >= 2
-#  define __sigemptyset(set) (*(set) = 0)
+#  define __sigemptyset(set) \
-#  define __sigfillset(set) (*(set) = ~0)
+  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
+		    sigset_t *__set = (set);				      \
+		    while (--__cnt >= 0) __set->__val[__cnt] = 0;	      \
+		    0; }))
+#  define __sigfillset(set) \
+  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
+		    sigset_t *__set = (set);				      \
+		    while (--__cnt >= 0) __set->__val[__cnt] = ~0UL;	      \
+		    0; }))
 
 
 #  ifdef __USE_GNU
 #  ifdef __USE_GNU
 /* The POSIX does not specify for handling the whole signal set in one
 /* The POSIX does not specify for handling the whole signal set in one
    command.  This is often wanted and so we define three more functions
    command.  This is often wanted and so we define three more functions
    here.  */
    here.  */
-#   define __sigisemptyset(set) (*(set) == 0)
+#   define __sigisemptyset(set) \
-#   define __sigandset(dest, left, right) (*(dest) = *(left) & *(right))
+  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
-#   define __sigorset(dest, left, right) (*(dest) = *(left) | *(right))
+		    const sigset_t *__set = (set);			      \
+		    int __ret = __set->__val[--__cnt];			      \
+		    while (!__ret && --__cnt >= 0)			      \
+			__ret = __set->__val[__cnt];			      \
+		    __ret == 0; }))
+#   define __sigandset(dest, left, right) \
+  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
+		    sigset_t *__dest = (dest);				      \
+		    const sigset_t *__left = (left);			      \
+		    const sigset_t *__right = (right);			      \
+		    while (--__cnt >= 0)				      \
+		      __dest->__val[__cnt] = (__left->__val[__cnt]	      \
+					      & __right->__val[__cnt]);	      \
+		    0; }))
+#   define __sigorset(dest, left, right) \
+  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
+		    sigset_t *__dest = (dest);				      \
+		    const sigset_t *__left = (left);			      \
+		    const sigset_t *__right = (right);			      \
+		    while (--__cnt >= 0)				      \
+		      __dest->__val[__cnt] = (__left->__val[__cnt]	      \
+					      | __right->__val[__cnt]);	      \
+		    0; }))
 #  endif
 #  endif
 # endif
 # endif
 
 
 /* These functions needn't check for a bogus signal number -- error
 /* These functions needn't check for a bogus signal number -- error
    checking is done in the non __ versions.  */
    checking is done in the non __ versions.  */
 
 
-# define __sigismember(set, sig) (*(set) & (1L << ((sig)-1)))
+extern int __sigismember (__const __sigset_t *, int);
-# define __sigaddset(set, sig) (*(set) |= (1L << ((sig)-1)))
+extern int __sigaddset (__sigset_t *, int);
-# define __sigdelset(set, sig) (*(set) &= ~(1L << ((sig)-1)))
+extern int __sigdelset (__sigset_t *, int);
+
+# ifdef __USE_EXTERN_INLINES
+#  define __SIGSETFN(NAME, BODY, CONST)					      \
+  _EXTERN_INLINE int							      \
+  NAME (CONST __sigset_t *__set, int __sig)				      \
+  {									      \
+    unsigned long int __mask = __sigmask (__sig);			      \
+    unsigned long int __word = __sigword (__sig);			      \
+    return BODY;							      \
+  }
+
+__SIGSETFN (__sigismember, (__set->__val[__word] & __mask) ? 1 : 0, __const)
+__SIGSETFN (__sigaddset, ((__set->__val[__word] |= __mask), 0), )
+__SIGSETFN (__sigdelset, ((__set->__val[__word] &= ~__mask), 0), )
+
+#  undef __SIGSETFN
+# endif
+
 
 
 #endif /* ! _SIGSET_H_fns.  */
 #endif /* ! _SIGSET_H_fns.  */