Mercurial > hg > xemacs-beta
comparison src/syssignal.h @ 428:3ecd8885ac67 r21-2-22
Import from CVS: tag r21-2-22
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:28:15 +0200 |
parents | |
children | 8de8e3f6228a |
comparison
equal
deleted
inserted
replaced
427:0a0253eac470 | 428:3ecd8885ac67 |
---|---|
1 /* syssignal.h - System-dependent definitions for signals. | |
2 Copyright (C) 1992, 1993 Free Software Foundation, Inc. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Synched up with: FSF 19.30. */ | |
22 | |
23 #ifndef _XEMACS_SYSSIGNAL_H_ | |
24 #define _XEMACS_SYSSIGNAL_H_ | |
25 | |
26 /* In the old world, one could not #include <signal.h> here. The party line | |
27 was that that header should always be #included before <config.h>, because | |
28 some configuration files (like s/hpux.h) indicate that SIGIO doesn't work | |
29 by #undef-ing SIGIO, and if this file #includes <signal.h>, then that will | |
30 re-#define SIGIO and confuse things. | |
31 | |
32 This was, however, a completely fucked up state of affairs, because on some | |
33 systems it's necessary for the s/m files to #define things in order to get | |
34 <signal.h> to provide the right typedefs, etc. And it's generally a broken | |
35 concept for <config.h> to not be the very very first file included. | |
36 | |
37 So instead of #undef'ing SIGIO in the various s/m files, I've changed them | |
38 to define BROKEN_SIGIO instead, then we (syssignal.h) do an #undef SIGIO | |
39 at the end, after including signal.h. Therefore, it's important that | |
40 <signal.h> not be included after "syssignal.h", but that's the normal state: | |
41 nothing should be directly including <signal.h> these days. | |
42 -- jwz, 29-nov-93 | |
43 */ | |
44 | |
45 #include <signal.h> | |
46 #include <errno.h> | |
47 | |
48 /* SIGPOLL is the SVR4 signal. Those systems generally define | |
49 SIGIO as an alias for SIGPOLL, but just in case ... */ | |
50 | |
51 #if defined (BROKEN_SIGIO) | |
52 # if defined (SIGIO) && defined (SIGPOLL) | |
53 # if SIGIO == SIGPOLL | |
54 # undef SIGIO | |
55 # undef SIGPOLL | |
56 # else | |
57 # undef SIGIO | |
58 # endif | |
59 # endif | |
60 #else /* Not BROKEN_SIGIO */ | |
61 # if !defined (SIGIO) && defined (SIGPOLL) | |
62 # define SIGIO SIGPOLL | |
63 # endif | |
64 #endif | |
65 | |
66 /* Define SIGCHLD as an alias for SIGCLD. There are many conditionals | |
67 testing SIGCHLD. */ | |
68 #if defined (SIGCLD) && !defined (SIGCHLD) | |
69 # define SIGCHLD SIGCLD | |
70 #endif /* SIGCHLD */ | |
71 | |
72 #ifdef BROKEN_SIGCHLD | |
73 #undef SIGCHLD | |
74 #endif | |
75 | |
76 #ifdef SIGCHLD | |
77 #define EMACS_BLOCK_SIGCHLD EMACS_BLOCK_SIGNAL (SIGCHLD) | |
78 #define EMACS_UNBLOCK_SIGCHLD EMACS_UNBLOCK_SIGNAL (SIGCHLD) | |
79 #else | |
80 #define EMACS_BLOCK_SIGCHLD | |
81 #define EMACS_UNBLOCK_SIGCHLD | |
82 #endif | |
83 | |
84 /* According to W.R. Stevens __Advanced Programming in the Unix | |
85 Environment__, there are four different paradigms for handling | |
86 signals. We use autoconf to tell us which one applies. | |
87 | |
88 Note that on some systems, more than one paradigm is implemented | |
89 (typically, the POSIX sigaction/sigprocmask and either the older | |
90 SYSV or BSD way). In such a case, we prefer the POSIX way. | |
91 | |
92 NOTE: We use EMACS_* macros for most signal operations, but | |
93 just signal() for the standard signal-setting operation. | |
94 Perhaps we should change this to EMACS_SIGNAL(), but that runs | |
95 the risk of someone forgetting this convention and calling | |
96 signal() directly. */ | |
97 | |
98 #ifndef NeXT | |
99 typedef SIGTYPE (*signal_handler_t) (int); | |
100 #endif | |
101 | |
102 #if defined (HAVE_SIGPROCMASK) | |
103 | |
104 /* The POSIX way (sigaction, sigprocmask, sigpending, sigsuspend) */ | |
105 | |
106 signal_handler_t sys_do_signal (int signal_number, signal_handler_t action); | |
107 /* Provide our own version of signal(), that calls sigaction(). The | |
108 name is not sys_signal() because a function of that name exists in | |
109 libenergize.a */ | |
110 #undef signal | |
111 #define signal sys_do_signal | |
112 | |
113 #define EMACS_BLOCK_SIGNAL(sig) do \ | |
114 { \ | |
115 sigset_t ES_mask; \ | |
116 sigemptyset (&ES_mask); \ | |
117 sigaddset (&ES_mask, sig); \ | |
118 sigprocmask (SIG_BLOCK, &ES_mask, NULL); \ | |
119 } while (0) | |
120 #define EMACS_UNBLOCK_SIGNAL(sig) do \ | |
121 { \ | |
122 sigset_t ES_mask; \ | |
123 sigemptyset (&ES_mask); \ | |
124 sigaddset (&ES_mask, sig); \ | |
125 sigprocmask (SIG_UNBLOCK, &ES_mask, NULL); \ | |
126 } while (0) | |
127 #define EMACS_UNBLOCK_ALL_SIGNALS() do \ | |
128 { \ | |
129 sigset_t ES_mask; \ | |
130 sigemptyset (&ES_mask); \ | |
131 sigprocmask (SIG_SETMASK, &ES_mask, NULL); \ | |
132 } while (0) | |
133 #define EMACS_WAIT_FOR_SIGNAL(sig) do \ | |
134 { \ | |
135 sigset_t ES_mask; \ | |
136 sigprocmask (0, NULL, &ES_mask); \ | |
137 sigdelset (&ES_mask, sig); \ | |
138 sigsuspend (&ES_mask); \ | |
139 } while (0) | |
140 #define EMACS_REESTABLISH_SIGNAL(sig, handler) | |
141 | |
142 #elif defined (HAVE_SIGBLOCK) | |
143 | |
144 /* The older BSD way (signal/sigvec, sigblock, sigsetmask, sigpause) */ | |
145 | |
146 /* It's OK to use signal() here directly. No unreliable signal | |
147 problems. However, we use sigvec() because it allows us to | |
148 request interruptible I/O. */ | |
149 | |
150 #define signal sys_do_signal | |
151 | |
152 /* Is it necessary to define sigmask like this? */ | |
153 #ifndef sigmask | |
154 # define sigmask(no) (1L << ((no) - 1)) | |
155 #endif | |
156 | |
157 #define EMACS_BLOCK_SIGNAL(sig) sigblock (sigmask (sig)) | |
158 #define EMACS_UNBLOCK_SIGNAL(sig) sigsetmask (sigblock (0) & ~sigmask (sig)) | |
159 #define EMACS_UNBLOCK_ALL_SIGNALS() sigsetmask (0) | |
160 #define EMACS_WAIT_FOR_SIGNAL(sig) do \ | |
161 { \ | |
162 int ES_mask = sigblock (0); \ | |
163 sigpause (ES_mask & ~sigmask (sig)); \ | |
164 } while (0) | |
165 #define EMACS_REESTABLISH_SIGNAL(sig, handler) | |
166 | |
167 #elif defined (HAVE_SIGHOLD) | |
168 | |
169 /* The older SYSV way (signal/sigset, sighold, sigrelse, sigignore, | |
170 sigpause) */ | |
171 | |
172 #define signal sigset | |
173 #define EMACS_BLOCK_SIGNAL(sig) sighold (sig) | |
174 #define EMACS_UNBLOCK_SIGNAL(sig) sigrelse (sig) | |
175 /* #### There's not really any simple way to implement this. | |
176 Since EMACS_UNBLOCK_ALL_SIGNALS() is only called once (at startup), | |
177 it's probably OK to just ignore it. */ | |
178 #define EMACS_UNBLOCK_ALL_SIGNALS() 0 | |
179 #define EMACS_WAIT_FOR_SIGNAL(sig) sigpause (sig) | |
180 #define EMACS_REESTABLISH_SIGNAL(sig, handler) | |
181 | |
182 #else | |
183 | |
184 /* The oldest SYSV way (signal only; unreliable signals) */ | |
185 | |
186 /* Old USG systems don't really have signal blocking. | |
187 We indicate this by not defining EMACS_BLOCK_SIGNAL or | |
188 EMACS_WAIT_FOR_SIGNAL. */ | |
189 #define EMACS_UNBLOCK_SIGNAL(sig) 0 | |
190 #define EMACS_UNBLOCK_ALL_SIGNALS() 0 | |
191 #define EMACS_REESTABLISH_SIGNAL(sig, handler) do \ | |
192 { \ | |
193 int old_errno = errno; \ | |
194 signal (sig, handler); \ | |
195 errno = old_errno; \ | |
196 } while (0) | |
197 | |
198 /* Under SYSV, setting a signal handler for SIGCLD causes | |
199 SIGCLD to immediately be sent if there any unwaited processes | |
200 out there. This means that the SIGCLD handler *must* call | |
201 wait() to reap the status of all processes -- it cannot | |
202 simply set a flag and then reestablish the handler, because | |
203 it will get called again, infinitely. We only need to | |
204 worry about this on systems where signals need to be | |
205 reestablished (SYSV Release 2 and earlier). */ | |
206 #define OBNOXIOUS_SYSV_SIGCLD_BEHAVIOR | |
207 | |
208 #endif | |
209 | |
210 /* On bsd, [man says] kill does not accept a negative number to kill a pgrp. | |
211 Must do that using the killpg call. */ | |
212 #ifdef BSD | |
213 #define EMACS_KILLPG(gid, signo) killpg (gid, signo) | |
214 #else | |
215 #ifdef WINDOWSNT | |
216 #define EMACS_KILLPG(gid, signo) kill (gid, signo) | |
217 #else | |
218 #define EMACS_KILLPG(gid, signo) kill (-(gid), signo) | |
219 #endif | |
220 #endif | |
221 | |
222 #ifndef NSIG | |
223 # define NSIG (SIGUSR2+1) /* guess how many elements are in sys_siglist... */ | |
224 #endif | |
225 | |
226 /* SYS_SIGLIST_DECLARED is determined by configure. On Linux, it seems, | |
227 configure incorrectly fails to find it, so s/linux.h defines | |
228 HAVE_SYS_SIGLIST. */ | |
229 #if !defined (SYS_SIGLIST_DECLARED) && !defined (HAVE_SYS_SIGLIST) | |
230 extern CONST char *sys_siglist[]; | |
231 #endif | |
232 | |
233 #ifdef SIGDANGER | |
234 SIGTYPE memory_warning_signal (int sig); | |
235 #endif | |
236 | |
237 #ifdef _WIN32 | |
238 /* Prototypes for signal functions, see nt.c */ | |
239 typedef void (__cdecl *msw_sighandler) (int); | |
240 msw_sighandler msw_sigset (int sig, msw_sighandler handler); | |
241 int msw_sighold (int nsig); | |
242 int msw_sigrelse (int nsig); | |
243 int msw_sigpause (int nsig); | |
244 int msw_raise (int nsig); | |
245 #endif /* _WIN32 */ | |
246 | |
247 #endif /* _XEMACS_SYSSIGNAL_H_ */ |