blob: e6d3f19fda6fdd04c90083e4a0065058b75ebde4 [file] [log] [blame]
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum398d9fe1994-05-11 08:59:13 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum398d9fe1994-05-11 08:59:13 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum398d9fe1994-05-11 08:59:13 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum398d9fe1994-05-11 08:59:13 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum398d9fe1994-05-11 08:59:13 +000029
30******************************************************************/
31
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000032/* Signal module -- many thanks to Lance Ellinghaus */
Guido van Rossum398d9fe1994-05-11 08:59:13 +000033
Guido van Rossum602099a1994-09-14 13:32:22 +000034#include "Python.h"
Guido van Rossum398d9fe1994-05-11 08:59:13 +000035#include "intrcheck.h"
36
Guido van Rossuma376cc51996-12-05 23:43:35 +000037#ifdef HAVE_UNISTD_H
38#include <unistd.h>
39#endif
40
Guido van Rossum398d9fe1994-05-11 08:59:13 +000041#include <signal.h>
42
Guido van Rossumbb4ba121994-06-23 11:25:45 +000043#ifndef SIG_ERR
44#define SIG_ERR ((RETSIGTYPE (*)())-1)
45#endif
46
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000047#ifndef NSIG
48#define NSIG (_SIGMAX + 1) /* For QNX */
49#endif
50
51
Barry Warsaw92971171997-01-03 00:14:25 +000052
Guido van Rossumbb4ba121994-06-23 11:25:45 +000053/*
54 NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
55
56 When threads are supported, we want the following semantics:
57
58 - only the main thread can set a signal handler
59 - any thread can get a signal handler
60 - signals are only delivered to the main thread
61
62 I.e. we don't support "synchronous signals" like SIGFPE (catching
63 this doesn't make much sense in Python anyway) nor do we support
64 signals as a means of inter-thread communication, since not all
65 thread implementations support that (at least our thread library
66 doesn't).
67
68 We still have the problem that in some implementations signals
69 generated by the keyboard (e.g. SIGINT) are delivered to all
70 threads (e.g. SGI), while in others (e.g. Solaris) such signals are
71 delivered to one random thread (an intermediate possibility would
Guido van Rossuma3c04b01995-01-12 11:29:01 +000072 be to deliver it to the main thread -- POSIX?). For now, we have
Guido van Rossumbb4ba121994-06-23 11:25:45 +000073 a working implementation that works in all three cases -- the
74 handler ignores signals if getpid() isn't the same as in the main
75 thread. XXX This is a hack.
76
77*/
78
79#ifdef WITH_THREAD
80#include "thread.h"
81static long main_thread;
82static pid_t main_pid;
83#endif
84
Barry Warsaw92971171997-01-03 00:14:25 +000085static struct {
86 int tripped;
87 PyObject *func;
88} Handlers[NSIG];
Guido van Rossum398d9fe1994-05-11 08:59:13 +000089
Barry Warsaw92971171997-01-03 00:14:25 +000090static int is_tripped = 0; /* Speed up sigcheck() when none tripped */
Guido van Rossum398d9fe1994-05-11 08:59:13 +000091
Barry Warsaw92971171997-01-03 00:14:25 +000092static PyObject *DefaultHandler;
93static PyObject *IgnoreHandler;
94static PyObject *IntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000095
Barry Warsaw92971171997-01-03 00:14:25 +000096
97
Guido van Rossume4485b01994-09-07 14:32:49 +000098static PyObject *
Barry Warsaw92971171997-01-03 00:14:25 +000099signal_default_int_handler(self, arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000100 PyObject *self;
101 PyObject *arg;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000102{
Guido van Rossume4485b01994-09-07 14:32:49 +0000103 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsaw92971171997-01-03 00:14:25 +0000104 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000105}
106
Barry Warsaw92971171997-01-03 00:14:25 +0000107
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000108static RETSIGTYPE
Barry Warsaw92971171997-01-03 00:14:25 +0000109signal_handler(sig_num)
Guido van Rossume4485b01994-09-07 14:32:49 +0000110 int sig_num;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000111{
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000112#ifdef WITH_THREAD
113 /* See NOTES section above */
114 if (getpid() == main_pid) {
115#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000116 is_tripped++;
117 Handlers[sig_num].tripped = 1;
Guido van Rossumfcdd0e41997-01-21 06:13:09 +0000118 Py_AddPendingCall((int (*) Py_PROTO((ANY *)))PyErr_CheckSignals, NULL);
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000119#ifdef WITH_THREAD
120 }
121#endif
Guido van Rossum602099a1994-09-14 13:32:22 +0000122#ifdef SIGCHLD
123 if (sig_num == SIGCHLD) {
124 /* To avoid infinite recursion, this signal remains
125 reset until explicit re-instated.
126 Don't clear the 'func' field as it is our pointer
127 to the Python handler... */
128 return;
129 }
130#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000131 (void *)signal(sig_num, &signal_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000132}
Guido van Rossume4485b01994-09-07 14:32:49 +0000133
Guido van Rossum06d511d1995-03-10 15:13:48 +0000134
Barry Warsaw92971171997-01-03 00:14:25 +0000135
Guido van Rossum06d511d1995-03-10 15:13:48 +0000136#ifndef DONT_HAVE_SIG_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000137static PyObject *
Barry Warsaw92971171997-01-03 00:14:25 +0000138signal_alarm(self, args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000139 PyObject *self; /* Not used */
140 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000141{
142 int t;
Guido van Rossume4485b01994-09-07 14:32:49 +0000143 if (!PyArg_Parse(args, "i", &t))
Barry Warsaw92971171997-01-03 00:14:25 +0000144 return NULL;
Guido van Rossume4485b01994-09-07 14:32:49 +0000145 /* alarm() returns the number of seconds remaining */
146 return PyInt_FromLong(alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000147}
Guido van Rossum06d511d1995-03-10 15:13:48 +0000148#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000149
Guido van Rossum06d511d1995-03-10 15:13:48 +0000150#ifndef DONT_HAVE_SIG_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000151static PyObject *
Barry Warsaw92971171997-01-03 00:14:25 +0000152signal_pause(self, args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000153 PyObject *self; /* Not used */
154 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000155{
Guido van Rossume4485b01994-09-07 14:32:49 +0000156 if (!PyArg_NoArgs(args))
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000157 return NULL;
Barry Warsaw92971171997-01-03 00:14:25 +0000158
Guido van Rossuma597dde1995-01-10 20:56:29 +0000159 Py_BEGIN_ALLOW_THREADS
Barry Warsaw92971171997-01-03 00:14:25 +0000160 (void)pause();
Guido van Rossuma597dde1995-01-10 20:56:29 +0000161 Py_END_ALLOW_THREADS
Barry Warsaw92971171997-01-03 00:14:25 +0000162 /* make sure that any exceptions that got raised are propagated
163 * back into Python
164 */
165 if (PyErr_CheckSignals())
166 return NULL;
167
Guido van Rossume4485b01994-09-07 14:32:49 +0000168 Py_INCREF(Py_None);
169 return Py_None;
170}
Guido van Rossum06d511d1995-03-10 15:13:48 +0000171#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000172
Barry Warsaw92971171997-01-03 00:14:25 +0000173
Guido van Rossume4485b01994-09-07 14:32:49 +0000174static PyObject *
Barry Warsaw92971171997-01-03 00:14:25 +0000175signal_signal(self, args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000176 PyObject *self; /* Not used */
177 PyObject *args;
178{
179 PyObject *obj;
180 int sig_num;
181 PyObject *old_handler;
182 RETSIGTYPE (*func)();
183 if (!PyArg_Parse(args, "(iO)", &sig_num, &obj))
Barry Warsaw92971171997-01-03 00:14:25 +0000184 return NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000185#ifdef WITH_THREAD
186 if (get_thread_ident() != main_thread) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000187 PyErr_SetString(PyExc_ValueError,
188 "signal only works in main thread");
Barry Warsaw92971171997-01-03 00:14:25 +0000189 return NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000190 }
191#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000192 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000193 PyErr_SetString(PyExc_ValueError,
194 "signal number out of range");
Barry Warsaw92971171997-01-03 00:14:25 +0000195 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000196 }
Barry Warsaw92971171997-01-03 00:14:25 +0000197 if (obj == IgnoreHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000198 func = SIG_IGN;
Barry Warsaw92971171997-01-03 00:14:25 +0000199 else if (obj == DefaultHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000200 func = SIG_DFL;
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000201 else if (!PyCallable_Check(obj)) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000202 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000203"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Barry Warsaw92971171997-01-03 00:14:25 +0000204 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000205 }
206 else
Barry Warsaw92971171997-01-03 00:14:25 +0000207 func = signal_handler;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000208 if (signal(sig_num, func) == SIG_ERR) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000209 PyErr_SetFromErrno(PyExc_RuntimeError);
Barry Warsaw92971171997-01-03 00:14:25 +0000210 return NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000211 }
Barry Warsaw92971171997-01-03 00:14:25 +0000212 old_handler = Handlers[sig_num].func;
213 Handlers[sig_num].tripped = 0;
Guido van Rossume4485b01994-09-07 14:32:49 +0000214 Py_INCREF(obj);
Barry Warsaw92971171997-01-03 00:14:25 +0000215 Handlers[sig_num].func = obj;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000216 return old_handler;
217}
218
Barry Warsaw92971171997-01-03 00:14:25 +0000219
Guido van Rossume4485b01994-09-07 14:32:49 +0000220static PyObject *
Barry Warsaw92971171997-01-03 00:14:25 +0000221signal_get_signal(self, args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000222 PyObject *self; /* Not used */
223 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000224{
225 int sig_num;
Guido van Rossume4485b01994-09-07 14:32:49 +0000226 PyObject *old_handler;
227 if (!PyArg_Parse(args, "i", &sig_num))
Barry Warsaw92971171997-01-03 00:14:25 +0000228 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000229 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000230 PyErr_SetString(PyExc_ValueError,
231 "signal number out of range");
Barry Warsaw92971171997-01-03 00:14:25 +0000232 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000233 }
Barry Warsaw92971171997-01-03 00:14:25 +0000234 old_handler = Handlers[sig_num].func;
Guido van Rossume4485b01994-09-07 14:32:49 +0000235 Py_INCREF(old_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000236 return old_handler;
237}
238
239
Barry Warsaw92971171997-01-03 00:14:25 +0000240
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000241/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +0000242static PyMethodDef signal_methods[] = {
Guido van Rossum06d511d1995-03-10 15:13:48 +0000243#ifndef DONT_HAVE_SIG_ALARM
Barry Warsaw92971171997-01-03 00:14:25 +0000244 {"alarm", signal_alarm},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000245#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000246 {"signal", signal_signal},
247 {"getsignal", signal_get_signal},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000248#ifndef DONT_HAVE_SIG_PAUSE
Barry Warsaw92971171997-01-03 00:14:25 +0000249 {"pause", signal_pause},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000250#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000251 {"default_int_handler", signal_default_int_handler},
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000252 {NULL, NULL} /* sentinel */
253};
254
Barry Warsaw92971171997-01-03 00:14:25 +0000255
256
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000257void
258initsignal()
259{
Guido van Rossume4485b01994-09-07 14:32:49 +0000260 PyObject *m, *d, *x;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000261 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000262
263#ifdef WITH_THREAD
264 main_thread = get_thread_ident();
265 main_pid = getpid();
266#endif
267
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000268 /* Create the module and add the functions */
Barry Warsaw92971171997-01-03 00:14:25 +0000269 m = Py_InitModule("signal", signal_methods);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000270
271 /* Add some symbolic constants to the module */
Guido van Rossume4485b01994-09-07 14:32:49 +0000272 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000273
Barry Warsaw92971171997-01-03 00:14:25 +0000274 x = DefaultHandler = PyInt_FromLong((long)SIG_DFL);
275 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
276 goto finally;
277 Py_DECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000278
Barry Warsaw92971171997-01-03 00:14:25 +0000279 x = IgnoreHandler = PyInt_FromLong((long)SIG_IGN);
280 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
281 goto finally;
282
283 x = PyInt_FromLong((long)NSIG);
284 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
285 goto finally;
286
287 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
288 if (!x)
289 goto finally;
290
291 Handlers[0].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000292 for (i = 1; i < NSIG; i++) {
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000293 RETSIGTYPE (*t)();
Guido van Rossumfb0df941996-05-23 22:55:35 +0000294#ifdef HAVE_SIGACTION
295 struct sigaction act;
296 sigaction(i, 0, &act);
Guido van Rossum1835c4f1996-05-29 14:15:19 +0000297 t = act.sa_handler;
Guido van Rossumfb0df941996-05-23 22:55:35 +0000298#else
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000299 t = signal(i, SIG_IGN);
300 signal(i, t);
Guido van Rossumfb0df941996-05-23 22:55:35 +0000301#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000302 Handlers[i].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000303 if (t == SIG_DFL)
Barry Warsaw92971171997-01-03 00:14:25 +0000304 Handlers[i].func = DefaultHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000305 else if (t == SIG_IGN)
Barry Warsaw92971171997-01-03 00:14:25 +0000306 Handlers[i].func = IgnoreHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000307 else
Barry Warsaw92971171997-01-03 00:14:25 +0000308 Handlers[i].func = Py_None; /* None of our business */
309 Py_INCREF(Handlers[i].func);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000310 }
Barry Warsaw92971171997-01-03 00:14:25 +0000311 if (Handlers[SIGINT].func == DefaultHandler) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000312 /* Install default int handler */
Barry Warsaw92971171997-01-03 00:14:25 +0000313 Py_DECREF(Handlers[SIGINT].func);
314 Handlers[SIGINT].func = IntHandler;
315 Py_INCREF(IntHandler);
316 signal(SIGINT, &signal_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000317 }
318
319#ifdef SIGHUP
Guido van Rossume4485b01994-09-07 14:32:49 +0000320 x = PyInt_FromLong(SIGHUP);
321 PyDict_SetItemString(d, "SIGHUP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000322 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000323#endif
324#ifdef SIGINT
Guido van Rossume4485b01994-09-07 14:32:49 +0000325 x = PyInt_FromLong(SIGINT);
326 PyDict_SetItemString(d, "SIGINT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000327 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000328#endif
329#ifdef SIGQUIT
Guido van Rossume4485b01994-09-07 14:32:49 +0000330 x = PyInt_FromLong(SIGQUIT);
331 PyDict_SetItemString(d, "SIGQUIT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000332 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000333#endif
334#ifdef SIGILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000335 x = PyInt_FromLong(SIGILL);
336 PyDict_SetItemString(d, "SIGILL", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000337 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000338#endif
339#ifdef SIGTRAP
Guido van Rossume4485b01994-09-07 14:32:49 +0000340 x = PyInt_FromLong(SIGTRAP);
341 PyDict_SetItemString(d, "SIGTRAP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000342 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000343#endif
344#ifdef SIGIOT
Guido van Rossume4485b01994-09-07 14:32:49 +0000345 x = PyInt_FromLong(SIGIOT);
346 PyDict_SetItemString(d, "SIGIOT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000347 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000348#endif
349#ifdef SIGABRT
Guido van Rossume4485b01994-09-07 14:32:49 +0000350 x = PyInt_FromLong(SIGABRT);
351 PyDict_SetItemString(d, "SIGABRT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000352 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000353#endif
354#ifdef SIGEMT
Guido van Rossume4485b01994-09-07 14:32:49 +0000355 x = PyInt_FromLong(SIGEMT);
356 PyDict_SetItemString(d, "SIGEMT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000357 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000358#endif
359#ifdef SIGFPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000360 x = PyInt_FromLong(SIGFPE);
361 PyDict_SetItemString(d, "SIGFPE", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000362 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000363#endif
364#ifdef SIGKILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000365 x = PyInt_FromLong(SIGKILL);
366 PyDict_SetItemString(d, "SIGKILL", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000367 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000368#endif
369#ifdef SIGBUS
Guido van Rossume4485b01994-09-07 14:32:49 +0000370 x = PyInt_FromLong(SIGBUS);
371 PyDict_SetItemString(d, "SIGBUS", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000372 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000373#endif
374#ifdef SIGSEGV
Guido van Rossume4485b01994-09-07 14:32:49 +0000375 x = PyInt_FromLong(SIGSEGV);
376 PyDict_SetItemString(d, "SIGSEGV", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000377 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000378#endif
379#ifdef SIGSYS
Guido van Rossume4485b01994-09-07 14:32:49 +0000380 x = PyInt_FromLong(SIGSYS);
381 PyDict_SetItemString(d, "SIGSYS", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000382 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000383#endif
384#ifdef SIGPIPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000385 x = PyInt_FromLong(SIGPIPE);
386 PyDict_SetItemString(d, "SIGPIPE", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000387 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000388#endif
389#ifdef SIGALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000390 x = PyInt_FromLong(SIGALRM);
391 PyDict_SetItemString(d, "SIGALRM", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000392 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000393#endif
394#ifdef SIGTERM
Guido van Rossume4485b01994-09-07 14:32:49 +0000395 x = PyInt_FromLong(SIGTERM);
396 PyDict_SetItemString(d, "SIGTERM", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000397 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000398#endif
399#ifdef SIGUSR1
Guido van Rossume4485b01994-09-07 14:32:49 +0000400 x = PyInt_FromLong(SIGUSR1);
401 PyDict_SetItemString(d, "SIGUSR1", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000402 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000403#endif
404#ifdef SIGUSR2
Guido van Rossume4485b01994-09-07 14:32:49 +0000405 x = PyInt_FromLong(SIGUSR2);
406 PyDict_SetItemString(d, "SIGUSR2", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000407 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000408#endif
409#ifdef SIGCLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000410 x = PyInt_FromLong(SIGCLD);
411 PyDict_SetItemString(d, "SIGCLD", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000412 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000413#endif
414#ifdef SIGCHLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000415 x = PyInt_FromLong(SIGCHLD);
416 PyDict_SetItemString(d, "SIGCHLD", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000417 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000418#endif
419#ifdef SIGPWR
Guido van Rossume4485b01994-09-07 14:32:49 +0000420 x = PyInt_FromLong(SIGPWR);
421 PyDict_SetItemString(d, "SIGPWR", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000422 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000423#endif
424#ifdef SIGIO
Guido van Rossume4485b01994-09-07 14:32:49 +0000425 x = PyInt_FromLong(SIGIO);
426 PyDict_SetItemString(d, "SIGIO", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000427 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000428#endif
429#ifdef SIGURG
Guido van Rossume4485b01994-09-07 14:32:49 +0000430 x = PyInt_FromLong(SIGURG);
431 PyDict_SetItemString(d, "SIGURG", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000432 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000433#endif
434#ifdef SIGWINCH
Guido van Rossume4485b01994-09-07 14:32:49 +0000435 x = PyInt_FromLong(SIGWINCH);
436 PyDict_SetItemString(d, "SIGWINCH", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000437 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000438#endif
439#ifdef SIGPOLL
Guido van Rossume4485b01994-09-07 14:32:49 +0000440 x = PyInt_FromLong(SIGPOLL);
441 PyDict_SetItemString(d, "SIGPOLL", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000442 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000443#endif
444#ifdef SIGSTOP
Guido van Rossume4485b01994-09-07 14:32:49 +0000445 x = PyInt_FromLong(SIGSTOP);
446 PyDict_SetItemString(d, "SIGSTOP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000447 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000448#endif
449#ifdef SIGTSTP
Guido van Rossume4485b01994-09-07 14:32:49 +0000450 x = PyInt_FromLong(SIGTSTP);
451 PyDict_SetItemString(d, "SIGTSTP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000452 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000453#endif
454#ifdef SIGCONT
Guido van Rossume4485b01994-09-07 14:32:49 +0000455 x = PyInt_FromLong(SIGCONT);
456 PyDict_SetItemString(d, "SIGCONT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000457 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000458#endif
459#ifdef SIGTTIN
Guido van Rossume4485b01994-09-07 14:32:49 +0000460 x = PyInt_FromLong(SIGTTIN);
461 PyDict_SetItemString(d, "SIGTTIN", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000462 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000463#endif
464#ifdef SIGTTOU
Guido van Rossume4485b01994-09-07 14:32:49 +0000465 x = PyInt_FromLong(SIGTTOU);
466 PyDict_SetItemString(d, "SIGTTOU", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000467 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000468#endif
469#ifdef SIGVTALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000470 x = PyInt_FromLong(SIGVTALRM);
471 PyDict_SetItemString(d, "SIGVTALRM", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000472 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000473#endif
474#ifdef SIGPROF
Guido van Rossume4485b01994-09-07 14:32:49 +0000475 x = PyInt_FromLong(SIGPROF);
476 PyDict_SetItemString(d, "SIGPROF", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000477 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000478#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000479#ifdef SIGXCPU
480 x = PyInt_FromLong(SIGXCPU);
481 PyDict_SetItemString(d, "SIGXCPU", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000482 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000483#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000484#ifdef SIGXFSZ
485 x = PyInt_FromLong(SIGXFSZ);
486 PyDict_SetItemString(d, "SIGXFSZ", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000487 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000488#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000489 if (!PyErr_Occurred())
490 return;
491
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000492 /* Check for errors */
Barry Warsaw92971171997-01-03 00:14:25 +0000493 finally:
494 Py_FatalError("can't initialize module signal");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000495}
496
Barry Warsaw92971171997-01-03 00:14:25 +0000497
498
499/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000500int
Guido van Rossumec25b911995-01-22 00:46:57 +0000501PyErr_CheckSignals()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000502{
503 int i;
Guido van Rossume4485b01994-09-07 14:32:49 +0000504 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +0000505
506 if (!is_tripped)
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000507 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000508#ifdef WITH_THREAD
509 if (get_thread_ident() != main_thread)
510 return 0;
511#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000512 if (!(f = PyEval_GetFrame()))
Guido van Rossume4485b01994-09-07 14:32:49 +0000513 f = Py_None;
Barry Warsaw92971171997-01-03 00:14:25 +0000514
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000515 for (i = 1; i < NSIG; i++) {
Barry Warsaw92971171997-01-03 00:14:25 +0000516 if (Handlers[i].tripped) {
517 PyObject *result = NULL;
518 PyObject *arglist = Py_BuildValue("(iO)", i, f);
519 Handlers[i].tripped = 0;
520
521 if (arglist) {
522 result = PyEval_CallObject(Handlers[i].func,
523 arglist);
Guido van Rossume4485b01994-09-07 14:32:49 +0000524 Py_DECREF(arglist);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000525 }
Barry Warsaw92971171997-01-03 00:14:25 +0000526 if (!result)
Guido van Rossumfcdd0e41997-01-21 06:13:09 +0000527 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +0000528
529 Py_DECREF(result);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000530 }
531 }
Barry Warsaw92971171997-01-03 00:14:25 +0000532 is_tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000533 return 0;
534}
535
Barry Warsaw92971171997-01-03 00:14:25 +0000536
537/* Replacements for intrcheck.c functionality
538 * Declared in pyerrors.h
539 */
540void
541PyErr_SetInterrupt()
542{
543 is_tripped++;
544 Handlers[SIGINT].tripped = 1;
Guido van Rossumfcdd0e41997-01-21 06:13:09 +0000545 Py_AddPendingCall((int (*) Py_PROTO((ANY *)))PyErr_CheckSignals, NULL);
Barry Warsaw92971171997-01-03 00:14:25 +0000546}
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000547
548void
Barry Warsaw92971171997-01-03 00:14:25 +0000549PyOS_InitInterrupts()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000550{
551 initsignal();
552}
553
554int
Barry Warsaw92971171997-01-03 00:14:25 +0000555PyOS_InterruptOccurred()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000556{
Barry Warsaw92971171997-01-03 00:14:25 +0000557 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000558#ifdef WITH_THREAD
559 if (get_thread_ident() != main_thread)
560 return 0;
561#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000562 Handlers[SIGINT].tripped = 0;
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000563 return 1;
564 }
565 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000566}