642290409eafaba5174b220c17b63dce76e31f2b
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / bits / sigset.h
1 /* __sig_atomic_t, __sigset_t, and related definitions.  OpenSolaris version.
2    Copyright (C) 1991, 1992, 1994, 1996, 1997, 2007, 2008
3    Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
20
21 #ifndef _SIGSET_H_types
22 #define _SIGSET_H_types 1
23
24 typedef int __sig_atomic_t;
25
26 #define _SIGSET_NWORDS  4
27
28 typedef struct {
29     unsigned int        __sigbits[_SIGSET_NWORDS];
30 } __sigset_t;
31
32 #endif /* _SIGSET_H_types */
33
34 /* We only want to define these functions if <signal.h> was actually
35    included; otherwise we were included just to define the types.  Since we
36    are namespace-clean, it wouldn't hurt to define extra macros.  But
37    trouble can be caused by functions being defined (e.g., any global
38    register vars declared later will cause compilation errors).  */
39
40 #if !defined _SIGSET_H_fns && defined _SIGNAL_H
41 # define _SIGSET_H_fns 1
42
43 # ifndef _EXTERN_INLINE
44 #  define _EXTERN_INLINE __extern_inline
45 # endif
46
47 /* Return a mask that includes the bit for SIG only.  */
48 # define __sigmask(sig) \
49   (((unsigned int) 1) << (((sig) - 1) % (8 * sizeof (unsigned int))))
50
51 /* Return the word index for SIG.  */
52 # define __sigword(sig) (((sig) - 1) / (8 * sizeof (unsigned int)))
53
54 # if defined __GNUC__ && __GNUC__ >= 2
55 #  define __sigemptyset(set) \
56   (__extension__ ({ int __cnt = _SIGSET_NWORDS;                               \
57                     sigset_t *__set = (set);                                  \
58                     while (--__cnt >= 0) __set->__sigbits[__cnt] = 0;         \
59                     0; }))
60 #  define __sigfillset(set) \
61   (__extension__ ({ int __cnt = _SIGSET_NWORDS;                               \
62                     sigset_t *__set = (set);                                  \
63                     while (--__cnt >= 0) __set->__sigbits[__cnt] = ~0UL;              \
64                     0; }))
65
66 #  ifdef __USE_GNU
67 /* The POSIX does not specify for handling the whole signal set in one
68    command.  This is often wanted and so we define three more functions
69    here.  */
70 #   define __sigisemptyset(set) \
71   (__extension__ ({ int __cnt = _SIGSET_NWORDS;                               \
72                     const sigset_t *__set = (set);                            \
73                     int __ret = __set->__sigbits[--__cnt];                            \
74                     while (!__ret && --__cnt >= 0)                            \
75                         __ret = __set->__sigbits[__cnt];                              \
76                     __ret == 0; }))
77 #   define __sigandset(dest, left, right) \
78   (__extension__ ({ int __cnt = _SIGSET_NWORDS;                               \
79                     sigset_t *__dest = (dest);                                \
80                     const sigset_t *__left = (left);                          \
81                     const sigset_t *__right = (right);                        \
82                     while (--__cnt >= 0)                                      \
83                       __dest->__sigbits[__cnt] = (__left->__sigbits[__cnt]            \
84                                               & __right->__sigbits[__cnt]);           \
85                     0; }))
86 #   define __sigorset(dest, left, right) \
87   (__extension__ ({ int __cnt = _SIGSET_NWORDS;                               \
88                     sigset_t *__dest = (dest);                                \
89                     const sigset_t *__left = (left);                          \
90                     const sigset_t *__right = (right);                        \
91                     while (--__cnt >= 0)                                      \
92                       __dest->__sigbits[__cnt] = (__left->__sigbits[__cnt]            \
93                                               | __right->__sigbits[__cnt]);           \
94                     0; }))
95 #  endif
96 # endif
97
98 /* These functions needn't check for a bogus signal number -- error
99    checking is done in the non __ versions.  */
100
101 extern int __sigismember (__const __sigset_t *, int);
102 extern int __sigaddset (__sigset_t *, int);
103 extern int __sigdelset (__sigset_t *, int);
104
105 # ifdef __USE_EXTERN_INLINES
106 #  define __SIGSETFN(NAME, BODY, CONST)                                       \
107   _EXTERN_INLINE int                                                          \
108   NAME (CONST __sigset_t *__set, int __sig)                                   \
109   {                                                                           \
110     unsigned int __mask = __sigmask (__sig);                          \
111     unsigned int __word = __sigword (__sig);                          \
112     return BODY;                                                              \
113   }
114
115 __SIGSETFN (__sigismember, (__set->__sigbits[__word] & __mask) ? 1 : 0, __const)
116 __SIGSETFN (__sigaddset, ((__set->__sigbits[__word] |= __mask), 0), )
117 __SIGSETFN (__sigdelset, ((__set->__sigbits[__word] &= ~__mask), 0), )
118
119 #  undef __SIGSETFN
120 # endif
121
122 #endif /* ! _SIGSET_H_fns.  */