Procházet zdrojové kódy

Reduced the size of sigsets to the minimal needed. Apart from the size,
it has the added advantage of giving the C++ build of m68k-elf-gcc a clean
bill of health.

David McCullough před 25 roky
rodič
revize
ec656c1429

+ 2 - 0
libc/sysdeps/linux/m68k/bits/setjmp.h

@@ -22,6 +22,8 @@
 # error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
 # error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
 #endif
 #endif
 
 
+#include <signal.h>
+
 typedef struct
 typedef struct
   {
   {
     /* There are eight 4-byte data registers, but D0 is not saved.  */
     /* There are eight 4-byte data registers, but D0 is not saved.  */

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

@@ -24,11 +24,7 @@ typedef int __sig_atomic_t;
 
 
 /* A `sigset_t' has a bit for each signal.  */
 /* A `sigset_t' has a bit for each signal.  */
 
 
-# define _SIGSET_NWORDS	(1024 / (8 * sizeof (unsigned long int)))
-typedef struct
-  {
-    unsigned long int __val[_SIGSET_NWORDS];
-  } __sigset_t;
+typedef unsigned long __sigset_t;
 
 
 #endif
 #endif
 
 
@@ -47,79 +43,27 @@ typedef struct
 # 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) \
-  (((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)))
+# define __sigmask(sig) (1L << ((sig) - 1))
 
 
 # if defined __GNUC__ && __GNUC__ >= 2
 # if defined __GNUC__ && __GNUC__ >= 2
-#  define __sigemptyset(set) \
-  (__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; }))
+#  define __sigemptyset(set) (*(set) = 0)
+#  define __sigfillset(set) (*(set) = ~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) \
-  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
-		    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; }))
+#   define __sigisemptyset(set) (*(set) == 0)
+#   define __sigandset(dest, left, right) (*(dest) = *(left) & *(right))
+#   define __sigorset(dest, left, right) (*(dest) = *(left) | *(right))
 #  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.  */
 
 
-extern int __sigismember (__const __sigset_t *, int);
-extern int __sigaddset (__sigset_t *, int);
-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
-
+# define __sigismember(set, sig) (*(set) & (1L << ((sig)-1)))
+# define __sigaddset(set, sig) (*(set) |= (1L << ((sig)-1)))
+# define __sigdelset(set, sig) (*(set) &= ~(1L << ((sig)-1)))
 
 
 #endif /* ! _SIGSET_H_fns.  */
 #endif /* ! _SIGSET_H_fns.  */