(JSP-5368): Separate JX1-7A24.
[chise/xemacs-chise.git.1] / src / syssignal.h
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 INCLUDED_syssignal_h_
24 #define INCLUDED_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 HAVE_KILLPG
213 #define EMACS_KILLPG(pid, signo) killpg (pid, signo)
214 #else
215 #ifdef WIN32_NATIVE
216 #define EMACS_KILLPG(pid, signo) kill (pid, signo)
217 #else
218 #define EMACS_KILLPG(pid, signo) kill (-(pid), 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_NATIVE
238 /* Prototypes for signal functions, see nt.c */
239 typedef void (__cdecl *mswindows_sighandler) (int);
240 mswindows_sighandler mswindows_sigset (int sig, mswindows_sighandler handler);
241 int mswindows_sighold (int nsig);
242 int mswindows_sigrelse (int nsig);
243 int mswindows_sigpause (int nsig);
244 int mswindows_raise (int nsig);
245 #endif /* WIN32_NATIVE */
246
247 #endif /* INCLUDED_syssignal_h_ */