Browse Source

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 24 years ago
parent
commit
ec656c1429
2 changed files with 12 additions and 66 deletions
  1. 2 0
      libc/sysdeps/linux/m68k/bits/setjmp.h
  2. 10 66
      libc/sysdeps/linux/m68k/bits/sigset.h

+ 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 unsigned long __sigset_t;
-typedef struct
-  {
-    unsigned long int __val[_SIGSET_NWORDS];
-  } __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) \
+# define __sigmask(sig) (1L << ((sig) - 1))
-  (((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) \
+#  define __sigemptyset(set) (*(set) = 0)
-  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
+#  define __sigfillset(set) (*(set) = ~0)
-		    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) \
+#   define __sigisemptyset(set) (*(set) == 0)
-  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
+#   define __sigandset(dest, left, right) (*(dest) = *(left) & *(right))
-		    const sigset_t *__set = (set);			      \
+#   define __sigorset(dest, left, right) (*(dest) = *(left) | *(right))
-		    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.  */
 
 
-extern int __sigismember (__const __sigset_t *, int);
+# define __sigismember(set, sig) (*(set) & (1L << ((sig)-1)))
-extern int __sigaddset (__sigset_t *, int);
+# define __sigaddset(set, sig) (*(set) |= (1L << ((sig)-1)))
-extern int __sigdelset (__sigset_t *, int);
+# define __sigdelset(set, sig) (*(set) &= ~(1L << ((sig)-1)))
-
-# 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.  */