From b5d482d00ef8bc29f0b4dd84812d52759ebdd630 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 27 Aug 2002 02:43:22 +0000 Subject: * sysdeps/generic/sigset-cvt-mask.h (sigset_set_old_mask): Replace macro with inline function. (sigset_get_old_mask): Likewise. * sysdeps/posix/sigblock.c (__sigblock): Update callers. * sysdeps/posix/sigsetmask.c (__sigsetmask): Likewise. * sysdeps/posix/sigpause.c (__sigpause): Likewise. * sysdeps/posix/sigvec.c (__sigvec, sigvec_wrapper_handler): Likewise. * sysdeps/unix/sysv/aix/sigset-cvt-mask.h (sigset_set_old_mask, sigset_get_old_mask): Make these macros return values. * sysdeps/unix/sysv/linux/sigset-cvt-mask.h: Likewise. * sysdeps/unix/sysv/sysv4/sigset-cvt-mask.h: Likewise. 2002-07-06 Bruno Haible * sysdeps/generic/sigset-cvt-mask.h (sigset_set_old_mask, sigset_get_old_mask): Make it work with larger sigset_t. * sysdeps/posix/sigblock.c (__sigblock): Use those macros. * sysdeps/posix/sigsetmask.c (__sigsetmask): Likewise. * sysdeps/posix/sigpause.c (__sigpause): Likewise. 2002-08-26 Roland McGrath --- sysdeps/generic/sigset-cvt-mask.h | 46 +++++++++++++++++++++++++++++-- sysdeps/posix/sigblock.c | 27 ++++-------------- sysdeps/posix/sigpause.c | 19 +++---------- sysdeps/posix/sigsetmask.c | 27 ++++-------------- sysdeps/posix/sigvec.c | 16 +++++------ sysdeps/unix/sysv/aix/sigset-cvt-mask.h | 9 ++---- sysdeps/unix/sysv/linux/sigset-cvt-mask.h | 10 +++---- sysdeps/unix/sysv/sysv4/sigset-cvt-mask.h | 10 +++---- 8 files changed, 78 insertions(+), 86 deletions(-) (limited to 'sysdeps') diff --git a/sysdeps/generic/sigset-cvt-mask.h b/sysdeps/generic/sigset-cvt-mask.h index b202e56..c9a0434 100644 --- a/sysdeps/generic/sigset-cvt-mask.h +++ b/sysdeps/generic/sigset-cvt-mask.h @@ -1,6 +1,6 @@ /* Convert between lowlevel sigmask and libc representation of sigset_t. Generic version. - Copyright (C) 1998 Free Software Foundation, Inc. + Copyright (C) 1998, 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Joe Keane . @@ -19,6 +19,46 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#define sigset_set_old_mask(set, mask) (*(set) = (unsigned long int) (mask)) +/* Convert between an old-style 32-bit signal mask and a POSIX sigset_t. */ -#define sigset_get_old_mask(set, mask) ((mask) = (unsigned int) *(set)) +/* Perform *SET = MASK. Unused bits of *SET are set to 0. + Returns zero for success or -1 for errors (from sigaddset/sigemptyset). */ +static inline int __attribute__ ((unused)) +sigset_set_old_mask (sigset_t *set, int mask) +{ + if (sizeof (__sigset_t) == sizeof (unsigned int)) + *set = (unsigned int) (mask); + else + { + register unsigned int __sig; + + if (__sigemptyset (set) < 0) + return -1; + + for (__sig = 1; __sig < NSIG && __sig <= sizeof (mask) * 8; __sig++) + if (mask & sigmask (__sig)) + if (__sigaddset (set, __sig) < 0) + return -1; + } + return 0; +} + +/* Return the sigmask corresponding to *SET. + Unused bits of *SET are thrown away. */ +static inline int __attribute__ ((unused)) +sigset_get_old_mask (const sigset_t *set) +{ + if (sizeof (sigset_t) == sizeof (unsigned int)) + return (unsigned int) *set; + else + { + unsigned int mask = 0; + register unsigned int sig; + + for (sig = 1; sig < NSIG && sig <= sizeof (mask) * 8; sig++) + if (__sigismember (set, sig)) + mask |= sigmask (sig); + + return mask; + } +} diff --git a/sysdeps/posix/sigblock.c b/sysdeps/posix/sigblock.c index 6edf3a8..143b4c8 100644 --- a/sysdeps/posix/sigblock.c +++ b/sysdeps/posix/sigblock.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 94, 95, 96, 97, 98, 2001 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1994-1998, 2001-2002 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -19,39 +19,22 @@ #include #include +#include + /* Block signals in MASK, returning the old mask. */ int __sigblock (mask) int mask; { - register unsigned int sig; sigset_t set, oset; - if (__sigemptyset (&set) < 0) + if (sigset_set_old_mask (&set, mask) < 0) return -1; - if (sizeof (mask) == sizeof (set)) - *(int *) &set = mask; - else if (sizeof (unsigned long int) == sizeof (set)) - *(unsigned long int *) &set = (unsigned int) mask; - else - for (sig = 1; sig < NSIG && sig <= sizeof (mask) * 8; ++sig) - if ((mask & sigmask (sig)) && __sigaddset (&set, sig) < 0) - return -1; - if (__sigprocmask (SIG_BLOCK, &set, &oset) < 0) return -1; - if (sizeof (mask) == sizeof (oset)) - mask = *(int *) &oset; - else if (sizeof (unsigned long int) == sizeof (oset)) - mask = *(unsigned long int*) &oset; - else - for (sig = 1, mask = 0; sig < NSIG && sig <= sizeof (mask) * 8; ++sig) - if (__sigismember (&oset, sig)) - mask |= sigmask (sig); - - return mask; + return sigset_get_old_mask (&oset); } weak_alias (__sigblock, sigblock) diff --git a/sysdeps/posix/sigpause.c b/sysdeps/posix/sigpause.c index fc5f79e..7181874 100644 --- a/sysdeps/posix/sigpause.c +++ b/sysdeps/posix/sigpause.c @@ -20,13 +20,14 @@ #include #include /* For NULL. */ +#include + /* Set the mask of blocked signals to MASK, wait for a signal to arrive, and then restore the mask. */ int __sigpause (int sig_or_mask, int is_sig) { sigset_t set; - int sig; if (is_sig != 0) { @@ -36,20 +37,8 @@ __sigpause (int sig_or_mask, int is_sig) || __sigdelset (&set, sig_or_mask) < 0) return -1; } - else - { - if (__sigemptyset (&set) < 0) - return -1; - - if (sizeof (sig_or_mask) == sizeof (set)) - *(int *) &set = sig_or_mask; - else if (sizeof (unsigned long int) == sizeof (set)) - *(unsigned long int *) &set = (unsigned int) sig_or_mask; - else - for (sig = 1; sig < NSIG; ++sig) - if ((sig_or_mask & sigmask (sig)) && __sigaddset (&set, sig) < 0) - return -1; - } + else if (sigset_set_old_mask (&set, sig_or_mask) < 0) + return -1; return __sigsuspend (&set); } diff --git a/sysdeps/posix/sigsetmask.c b/sysdeps/posix/sigsetmask.c index 7b97a51..bb50e4f 100644 --- a/sysdeps/posix/sigsetmask.c +++ b/sysdeps/posix/sigsetmask.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,1994,1995,1996,1997,2001 Free Software Foundation, Inc. +/* Copyright (C) 1991,1994-1997,2001-2002 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -19,38 +19,21 @@ #include #include +#include + /* Set the mask of blocked signals to MASK, returning the old mask. */ int __sigsetmask (int mask) { - register unsigned int sig; sigset_t set, oset; - if (__sigemptyset (&set) < 0) + if (sigset_set_old_mask (&set, mask) < 0) return -1; - if (sizeof (mask) == sizeof (set)) - *(int *) &set = mask; - else if (sizeof (unsigned long int) == sizeof (set)) - *(unsigned long int *) &set = (unsigned int) mask; - else - for (sig = 1; sig < NSIG && sig <= sizeof (mask) * 8; ++sig) - if ((mask & sigmask (sig)) && __sigaddset (&set, sig) < 0) - return -1; - if (__sigprocmask (SIG_SETMASK, &set, &oset) < 0) return -1; - if (sizeof (mask) == sizeof (oset)) - mask = *(int *) &oset; - else if (sizeof (unsigned long int) == sizeof (oset)) - mask = *(unsigned long int *) &oset; - else - for (sig = 1, mask = 0; sig < NSIG && sig <= sizeof (mask) * 8; ++sig) - if (__sigismember (&oset, sig)) - mask |= sigmask (sig); - - return mask; + return sigset_get_old_mask (&oset); } weak_alias (__sigsetmask, sigsetmask) diff --git a/sysdeps/posix/sigvec.c b/sysdeps/posix/sigvec.c index d5f7ccd..d1b80e2 100644 --- a/sysdeps/posix/sigvec.c +++ b/sysdeps/posix/sigvec.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,94,95,96,97,98,2002 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -21,7 +21,7 @@ #include /* Include macros to convert between `sigset_t' and old-style mask. */ -#include "sigset-cvt-mask.h" +#include /* We use a wrapper handler to support SV_RESETHAND. */ struct sigvec_wrapper_data @@ -80,7 +80,8 @@ __sigvec (sig, vec, ovec) #endif n = &new; new.sa_handler = handler; - sigset_set_old_mask (&new.sa_mask, mask); + if (sigset_set_old_mask (&new.sa_mask, mask) < 0) + return -1; new.sa_flags = sa_flags; } @@ -122,7 +123,7 @@ __sigvec (sig, vec, ovec) /* should we use data->sw_mask?? */ sv_flags |= SV_RESETHAND; } - sigset_get_old_mask (&old.sa_mask, mask); + mask = sigset_get_old_mask (&old.sa_mask); #ifdef SA_ONSTACK if (sa_flags & SA_ONSTACK) sv_flags |= SV_ONSTACK; @@ -147,19 +148,18 @@ sigvec_wrapper_handler (sig) int sig; { struct sigvec_wrapper_data *data; - unsigned int mask; struct sigaction act; int save; __sighandler_t handler; data = &sigvec_wrapper_data[sig]; - mask = data->sw_mask; act.sa_handler = SIG_DFL; - sigset_set_old_mask (&act.sa_mask, mask); act.sa_flags = 0; - save = errno; + sigset_set_old_mask (&act.sa_mask, data->sw_mask); handler = data->sw_handler; + save = errno; (void) __sigaction (sig, &act, (struct sigaction *) NULL); __set_errno (save); + (*handler) (sig); } diff --git a/sysdeps/unix/sysv/aix/sigset-cvt-mask.h b/sysdeps/unix/sysv/aix/sigset-cvt-mask.h index 762144e..50d70ae 100644 --- a/sysdeps/unix/sysv/aix/sigset-cvt-mask.h +++ b/sysdeps/unix/sysv/aix/sigset-cvt-mask.h @@ -1,6 +1,6 @@ /* Convert between lowlevel sigmask and libc representation of sigset_t. AIX version. - Copyright (C) 1998, 2000 Free Software Foundation, Inc. + Copyright (C) 1998,2000,02 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -19,10 +19,7 @@ 02111-1307 USA. */ #define sigset_set_old_mask(set, mask) \ - do { \ - (set)->__losigs = (unsigned int) mask; \ - (set)->__hisigs = 0; \ - } while (0) + ((set)->__losigs = (unsigned int) (mask), (set)->__hisigs = 0, 0) #define sigset_get_old_mask(set, mask) \ - ((mask) = (unsigned int) (set)->__losigs) + ((unsigned int) (set)->__losigs) diff --git a/sysdeps/unix/sysv/linux/sigset-cvt-mask.h b/sysdeps/unix/sysv/linux/sigset-cvt-mask.h index 2bd4b3a..b86a101 100644 --- a/sysdeps/unix/sysv/linux/sigset-cvt-mask.h +++ b/sysdeps/unix/sysv/linux/sigset-cvt-mask.h @@ -1,6 +1,6 @@ /* Convert between lowlevel sigmask and libc representation of sigset_t. Linux version. - Copyright (C) 1998 Free Software Foundation, Inc. + Copyright (C) 1998, 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Joe Keane . @@ -20,7 +20,7 @@ 02111-1307 USA. */ #define sigset_set_old_mask(set, mask) \ - do { \ + ({ \ unsigned long int *__ptr; \ int __cnt; \ __ptr = &(set)->__val[0]; \ @@ -29,7 +29,7 @@ do \ *__ptr++ = 0ul; \ while (--__cnt >= 0); \ - } while (0) + 0; }) -#define sigset_get_old_mask(set, mask) \ - ((mask) = (unsigned int) (set)->__val[0]) +#define sigset_get_old_mask(set) \ + ((unsigned int) (set)->__val[0]) diff --git a/sysdeps/unix/sysv/sysv4/sigset-cvt-mask.h b/sysdeps/unix/sysv/sysv4/sigset-cvt-mask.h index 7b082f7..f647dfe 100644 --- a/sysdeps/unix/sysv/sysv4/sigset-cvt-mask.h +++ b/sysdeps/unix/sysv/sysv4/sigset-cvt-mask.h @@ -1,6 +1,6 @@ /* Convert between lowlevel sigmask and libc representation of sigset_t. SysVr4 version. - Copyright (C) 1998 Free Software Foundation, Inc. + Copyright (C) 1998, 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Joe Keane . @@ -20,14 +20,14 @@ 02111-1307 USA. */ #define sigset_set_old_mask(set, mask) \ - do { \ + ({ \ unsigned long int *__ptr; \ __ptr = &(set)->__sigbits[0]; \ __ptr[0] = (mask); \ __ptr[1] = 0ul; \ __ptr[2] = 0ul; \ __ptr[3] = 0ul; \ - } while (0) + 0; }) -#define sigset_get_old_mask(set, mask) \ - ((mask) = (unsigned int) (set)->__sigbits[0]) +#define sigset_get_old_mask(set) \ + ((unsigned int) (set)->__sigbits[0]) -- cgit v1.1