annotate src/syssignal.h @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents 023b83f4e54b
children a634e3b7acc8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* syssignal.h - System-dependent definitions for signals.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1992, 1993 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 /* Synched up with: FSF 19.30. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
23 #ifndef INCLUDED_syssignal_h_
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
24 #define INCLUDED_syssignal_h_
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 /* In the old world, one could not #include <signal.h> here. The party line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 was that that header should always be #included before <config.h>, because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 some configuration files (like s/hpux.h) indicate that SIGIO doesn't work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 by #undef-ing SIGIO, and if this file #includes <signal.h>, then that will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 re-#define SIGIO and confuse things.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 This was, however, a completely fucked up state of affairs, because on some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 systems it's necessary for the s/m files to #define things in order to get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 <signal.h> to provide the right typedefs, etc. And it's generally a broken
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 concept for <config.h> to not be the very very first file included.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 So instead of #undef'ing SIGIO in the various s/m files, I've changed them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 to define BROKEN_SIGIO instead, then we (syssignal.h) do an #undef SIGIO
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 at the end, after including signal.h. Therefore, it's important that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 <signal.h> not be included after "syssignal.h", but that's the normal state:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 nothing should be directly including <signal.h> these days.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 -- jwz, 29-nov-93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 #include <signal.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 #include <errno.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 /* SIGPOLL is the SVR4 signal. Those systems generally define
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 SIGIO as an alias for SIGPOLL, but just in case ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 #if defined (BROKEN_SIGIO)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 # if defined (SIGIO) && defined (SIGPOLL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 # if SIGIO == SIGPOLL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 # undef SIGIO
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 # undef SIGPOLL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 # else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 # undef SIGIO
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 #else /* Not BROKEN_SIGIO */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 # if !defined (SIGIO) && defined (SIGPOLL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 # define SIGIO SIGPOLL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 /* Define SIGCHLD as an alias for SIGCLD. There are many conditionals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 testing SIGCHLD. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 #if defined (SIGCLD) && !defined (SIGCHLD)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 # define SIGCHLD SIGCLD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 #endif /* SIGCHLD */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 #ifdef BROKEN_SIGCHLD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #undef SIGCHLD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 #ifdef SIGCHLD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 #define EMACS_BLOCK_SIGCHLD EMACS_BLOCK_SIGNAL (SIGCHLD)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 #define EMACS_UNBLOCK_SIGCHLD EMACS_UNBLOCK_SIGNAL (SIGCHLD)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 #define EMACS_BLOCK_SIGCHLD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 #define EMACS_UNBLOCK_SIGCHLD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 /* According to W.R. Stevens __Advanced Programming in the Unix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 Environment__, there are four different paradigms for handling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 signals. We use autoconf to tell us which one applies.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 Note that on some systems, more than one paradigm is implemented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 (typically, the POSIX sigaction/sigprocmask and either the older
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 SYSV or BSD way). In such a case, we prefer the POSIX way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
92 We used to say this:
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
93
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
94 [[ NOTE: We use EMACS_* macros for most signal operations, but
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 just signal() for the standard signal-setting operation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 Perhaps we should change this to EMACS_SIGNAL(), but that runs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 the risk of someone forgetting this convention and calling
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
98 signal() directly. ]]
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
99
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
100 But current policy is to avoid playing with macros as much as
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
101 possible, since in the long run it really just ends up creating
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
102 unmaintainable code -- someone newly reading the code is never
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
103 going to realize exactly which calls are redirected, and on
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
104 which systems, and where the redirection occurs.
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
105
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
106 Possibly we should use the new "qxe" convention.
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
107 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 #ifndef NeXT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 typedef SIGTYPE (*signal_handler_t) (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 #if defined (HAVE_SIGPROCMASK)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 /* The POSIX way (sigaction, sigprocmask, sigpending, sigsuspend) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
117 signal_handler_t qxe_reliable_signal (int signal_number,
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
118 signal_handler_t action);
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
119
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
120 #define EMACS_SIGNAL qxe_reliable_signal
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 #define EMACS_BLOCK_SIGNAL(sig) do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 sigset_t ES_mask; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 sigemptyset (&ES_mask); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 sigaddset (&ES_mask, sig); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 sigprocmask (SIG_BLOCK, &ES_mask, NULL); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 #define EMACS_UNBLOCK_SIGNAL(sig) do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 sigset_t ES_mask; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 sigemptyset (&ES_mask); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 sigaddset (&ES_mask, sig); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 sigprocmask (SIG_UNBLOCK, &ES_mask, NULL); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 #define EMACS_UNBLOCK_ALL_SIGNALS() do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 sigset_t ES_mask; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 sigemptyset (&ES_mask); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 sigprocmask (SIG_SETMASK, &ES_mask, NULL); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 #define EMACS_WAIT_FOR_SIGNAL(sig) do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 sigset_t ES_mask; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 sigprocmask (0, NULL, &ES_mask); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 sigdelset (&ES_mask, sig); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 sigsuspend (&ES_mask); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 #define EMACS_REESTABLISH_SIGNAL(sig, handler)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 #elif defined (HAVE_SIGBLOCK)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 /* The older BSD way (signal/sigvec, sigblock, sigsetmask, sigpause) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 /* It's OK to use signal() here directly. No unreliable signal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 problems. However, we use sigvec() because it allows us to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 request interruptible I/O. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
159 #define EMACS_SIGNAL qxe_reliable_signal
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 /* Is it necessary to define sigmask like this? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 #ifndef sigmask
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 # define sigmask(no) (1L << ((no) - 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 #define EMACS_BLOCK_SIGNAL(sig) sigblock (sigmask (sig))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 #define EMACS_UNBLOCK_SIGNAL(sig) sigsetmask (sigblock (0) & ~sigmask (sig))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 #define EMACS_UNBLOCK_ALL_SIGNALS() sigsetmask (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 #define EMACS_WAIT_FOR_SIGNAL(sig) do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 int ES_mask = sigblock (0); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 sigpause (ES_mask & ~sigmask (sig)); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 #define EMACS_REESTABLISH_SIGNAL(sig, handler)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 #elif defined (HAVE_SIGHOLD)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 /* The older SYSV way (signal/sigset, sighold, sigrelse, sigignore,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 sigpause) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
181 #define EMACS_SIGNAL sigset
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 #define EMACS_BLOCK_SIGNAL(sig) sighold (sig)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 #define EMACS_UNBLOCK_SIGNAL(sig) sigrelse (sig)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 /* #### There's not really any simple way to implement this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 Since EMACS_UNBLOCK_ALL_SIGNALS() is only called once (at startup),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 it's probably OK to just ignore it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 #define EMACS_UNBLOCK_ALL_SIGNALS() 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 #define EMACS_WAIT_FOR_SIGNAL(sig) sigpause (sig)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 #define EMACS_REESTABLISH_SIGNAL(sig, handler)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
191 #elif defined (WIN32_NATIVE)
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
192
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
193 /* MS Windows signal emulation (in turns emulates the sigset/sighold
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
194 paradigm) */
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
195
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
196 #define EMACS_SIGNAL mswindows_sigset
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
197 #define EMACS_BLOCK_SIGNAL(sig) mswindows_sighold (sig)
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
198 #define EMACS_UNBLOCK_SIGNAL(sig) mswindows_sigrelse (sig)
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
199 /* #### There's not really any simple way to implement this.
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
200 Since EMACS_UNBLOCK_ALL_SIGNALS() is only called once (at startup),
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
201 it's probably OK to just ignore it. */
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
202 #define EMACS_UNBLOCK_ALL_SIGNALS() 0
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
203 #define EMACS_WAIT_FOR_SIGNAL(sig) mswindows_sigpause (sig)
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
204 #define EMACS_REESTABLISH_SIGNAL(sig, handler)
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
205
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
206 /* Defines that we need that aren't in the standard signal.h */
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
207 #define SIGHUP 1 /* Hang up */
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
208 #define SIGQUIT 3 /* Quit process */
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
209 #define SIGKILL 9 /* Die, die die */
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
210 #define SIGALRM 14 /* Alarm */
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
211 #define SIGPROF 29 /* Profiling timer exp */
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
212
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 /* The oldest SYSV way (signal only; unreliable signals) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 /* Old USG systems don't really have signal blocking.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 We indicate this by not defining EMACS_BLOCK_SIGNAL or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 EMACS_WAIT_FOR_SIGNAL. */
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
220 #define EMACS_SIGNAL signal
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 #define EMACS_UNBLOCK_SIGNAL(sig) 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 #define EMACS_UNBLOCK_ALL_SIGNALS() 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 #define EMACS_REESTABLISH_SIGNAL(sig, handler) do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 int old_errno = errno; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 signal (sig, handler); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 errno = old_errno; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 /* Under SYSV, setting a signal handler for SIGCLD causes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 SIGCLD to immediately be sent if there any unwaited processes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 out there. This means that the SIGCLD handler *must* call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 wait() to reap the status of all processes -- it cannot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 simply set a flag and then reestablish the handler, because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 it will get called again, infinitely. We only need to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 worry about this on systems where signals need to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 reestablished (SYSV Release 2 and earlier). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 #define OBNOXIOUS_SYSV_SIGCLD_BEHAVIOR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
240 #endif /* different signalling methods */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 /* On bsd, [man says] kill does not accept a negative number to kill a pgrp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 Must do that using the killpg call. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
244 #ifdef HAVE_KILLPG
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
245 #define EMACS_KILLPG(pid, signo) killpg (pid, signo)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 #else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
247 #ifdef WIN32_NATIVE
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 613
diff changeset
248 /* Only needed in callproc.c, slated to go */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 613
diff changeset
249 int kill_will_disappear_soon (int pid, int sig);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 613
diff changeset
250 #define EMACS_KILLPG(pid, signo) kill_will_disappear_soon (pid, signo)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 #else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
252 #define EMACS_KILLPG(pid, signo) kill (-(pid), signo)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 #ifndef NSIG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 # define NSIG (SIGUSR2+1) /* guess how many elements are in sys_siglist... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 /* SYS_SIGLIST_DECLARED is determined by configure. On Linux, it seems,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 configure incorrectly fails to find it, so s/linux.h defines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 HAVE_SYS_SIGLIST. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 #if !defined (SYS_SIGLIST_DECLARED) && !defined (HAVE_SYS_SIGLIST)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
264 extern const char *sys_siglist[];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 #ifdef SIGDANGER
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 SIGTYPE memory_warning_signal (int sig);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
271 #if defined (WIN32_NATIVE) || defined (CYGWIN_BROKEN_SIGNALS)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
272 typedef void (__cdecl *mswindows_sighandler) (int);
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
273
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
274 /* Prototypes for signal functions, see win32.c */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
275 int mswindows_sighold (int nsig);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
276 int mswindows_sigrelse (int nsig);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
277 int mswindows_sigpause (int nsig);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
278 int mswindows_raise (int nsig);
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
279 mswindows_sighandler mswindows_sigset (int sig, mswindows_sighandler handler);
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
280
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
281 #endif /* defined (WIN32_NATIVE) || defined (CYGWIN_BROKEN_SIGNALS) */
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
282
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
283 signal_handler_t set_timeout_signal (int signal_number,
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
284 signal_handler_t action);
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
285
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
287 #endif /* INCLUDED_syssignal_h_ */