blob: f15c62a3c0ccb4f73e24f9d2b6354d9d5e3d0b78 [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 Rossumbb4ba121994-06-23 11:25:45 +0000118#ifdef WITH_THREAD
119 }
120#endif
Guido van Rossum602099a1994-09-14 13:32:22 +0000121#ifdef SIGCHLD
122 if (sig_num == SIGCHLD) {
123 /* To avoid infinite recursion, this signal remains
124 reset until explicit re-instated.
125 Don't clear the 'func' field as it is our pointer
126 to the Python handler... */
127 return;
128 }
129#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000130 (void *)signal(sig_num, &signal_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000131}
Guido van Rossume4485b01994-09-07 14:32:49 +0000132
Guido van Rossum06d511d1995-03-10 15:13:48 +0000133
Barry Warsaw92971171997-01-03 00:14:25 +0000134
Guido van Rossum06d511d1995-03-10 15:13:48 +0000135#ifndef DONT_HAVE_SIG_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000136static PyObject *
Barry Warsaw92971171997-01-03 00:14:25 +0000137signal_alarm(self, args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000138 PyObject *self; /* Not used */
139 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000140{
141 int t;
Guido van Rossume4485b01994-09-07 14:32:49 +0000142 if (!PyArg_Parse(args, "i", &t))
Barry Warsaw92971171997-01-03 00:14:25 +0000143 return NULL;
Guido van Rossume4485b01994-09-07 14:32:49 +0000144 /* alarm() returns the number of seconds remaining */
145 return PyInt_FromLong(alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000146}
Guido van Rossum06d511d1995-03-10 15:13:48 +0000147#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000148
Guido van Rossum06d511d1995-03-10 15:13:48 +0000149#ifndef DONT_HAVE_SIG_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000150static PyObject *
Barry Warsaw92971171997-01-03 00:14:25 +0000151signal_pause(self, args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000152 PyObject *self; /* Not used */
153 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000154{
Guido van Rossume4485b01994-09-07 14:32:49 +0000155 if (!PyArg_NoArgs(args))
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000156 return NULL;
Barry Warsaw92971171997-01-03 00:14:25 +0000157
Guido van Rossuma597dde1995-01-10 20:56:29 +0000158 Py_BEGIN_ALLOW_THREADS
Barry Warsaw92971171997-01-03 00:14:25 +0000159 (void)pause();
Guido van Rossuma597dde1995-01-10 20:56:29 +0000160 Py_END_ALLOW_THREADS
Barry Warsaw92971171997-01-03 00:14:25 +0000161 /* make sure that any exceptions that got raised are propagated
162 * back into Python
163 */
164 if (PyErr_CheckSignals())
165 return NULL;
166
Guido van Rossume4485b01994-09-07 14:32:49 +0000167 Py_INCREF(Py_None);
168 return Py_None;
169}
Guido van Rossum06d511d1995-03-10 15:13:48 +0000170#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000171
Barry Warsaw92971171997-01-03 00:14:25 +0000172
Guido van Rossume4485b01994-09-07 14:32:49 +0000173static PyObject *
Barry Warsaw92971171997-01-03 00:14:25 +0000174signal_signal(self, args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000175 PyObject *self; /* Not used */
176 PyObject *args;
177{
178 PyObject *obj;
179 int sig_num;
180 PyObject *old_handler;
181 RETSIGTYPE (*func)();
182 if (!PyArg_Parse(args, "(iO)", &sig_num, &obj))
Barry Warsaw92971171997-01-03 00:14:25 +0000183 return NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000184#ifdef WITH_THREAD
185 if (get_thread_ident() != main_thread) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000186 PyErr_SetString(PyExc_ValueError,
187 "signal only works in main thread");
Barry Warsaw92971171997-01-03 00:14:25 +0000188 return NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000189 }
190#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000191 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000192 PyErr_SetString(PyExc_ValueError,
193 "signal number out of range");
Barry Warsaw92971171997-01-03 00:14:25 +0000194 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000195 }
Barry Warsaw92971171997-01-03 00:14:25 +0000196 if (obj == IgnoreHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000197 func = SIG_IGN;
Barry Warsaw92971171997-01-03 00:14:25 +0000198 else if (obj == DefaultHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000199 func = SIG_DFL;
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000200 else if (!PyCallable_Check(obj)) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000201 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000202"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Barry Warsaw92971171997-01-03 00:14:25 +0000203 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000204 }
205 else
Barry Warsaw92971171997-01-03 00:14:25 +0000206 func = signal_handler;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000207 if (signal(sig_num, func) == SIG_ERR) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000208 PyErr_SetFromErrno(PyExc_RuntimeError);
Barry Warsaw92971171997-01-03 00:14:25 +0000209 return NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000210 }
Barry Warsaw92971171997-01-03 00:14:25 +0000211 old_handler = Handlers[sig_num].func;
212 Handlers[sig_num].tripped = 0;
Guido van Rossume4485b01994-09-07 14:32:49 +0000213 Py_INCREF(obj);
Barry Warsaw92971171997-01-03 00:14:25 +0000214 Handlers[sig_num].func = obj;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000215 return old_handler;
216}
217
Barry Warsaw92971171997-01-03 00:14:25 +0000218
Guido van Rossume4485b01994-09-07 14:32:49 +0000219static PyObject *
Barry Warsaw92971171997-01-03 00:14:25 +0000220signal_get_signal(self, args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000221 PyObject *self; /* Not used */
222 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000223{
224 int sig_num;
Guido van Rossume4485b01994-09-07 14:32:49 +0000225 PyObject *old_handler;
226 if (!PyArg_Parse(args, "i", &sig_num))
Barry Warsaw92971171997-01-03 00:14:25 +0000227 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000228 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000229 PyErr_SetString(PyExc_ValueError,
230 "signal number out of range");
Barry Warsaw92971171997-01-03 00:14:25 +0000231 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000232 }
Barry Warsaw92971171997-01-03 00:14:25 +0000233 old_handler = Handlers[sig_num].func;
Guido van Rossume4485b01994-09-07 14:32:49 +0000234 Py_INCREF(old_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000235 return old_handler;
236}
237
238
Barry Warsaw92971171997-01-03 00:14:25 +0000239
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000240/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +0000241static PyMethodDef signal_methods[] = {
Guido van Rossum06d511d1995-03-10 15:13:48 +0000242#ifndef DONT_HAVE_SIG_ALARM
Barry Warsaw92971171997-01-03 00:14:25 +0000243 {"alarm", signal_alarm},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000244#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000245 {"signal", signal_signal},
246 {"getsignal", signal_get_signal},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000247#ifndef DONT_HAVE_SIG_PAUSE
Barry Warsaw92971171997-01-03 00:14:25 +0000248 {"pause", signal_pause},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000249#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000250 {"default_int_handler", signal_default_int_handler},
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000251 {NULL, NULL} /* sentinel */
252};
253
Barry Warsaw92971171997-01-03 00:14:25 +0000254
255
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000256void
257initsignal()
258{
Guido van Rossume4485b01994-09-07 14:32:49 +0000259 PyObject *m, *d, *x;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000260 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000261
262#ifdef WITH_THREAD
263 main_thread = get_thread_ident();
264 main_pid = getpid();
265#endif
266
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000267 /* Create the module and add the functions */
Barry Warsaw92971171997-01-03 00:14:25 +0000268 m = Py_InitModule("signal", signal_methods);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000269
270 /* Add some symbolic constants to the module */
Guido van Rossume4485b01994-09-07 14:32:49 +0000271 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000272
Barry Warsaw92971171997-01-03 00:14:25 +0000273 x = DefaultHandler = PyInt_FromLong((long)SIG_DFL);
274 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
275 goto finally;
276 Py_DECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000277
Barry Warsaw92971171997-01-03 00:14:25 +0000278 x = IgnoreHandler = PyInt_FromLong((long)SIG_IGN);
279 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
280 goto finally;
281
282 x = PyInt_FromLong((long)NSIG);
283 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
284 goto finally;
285
286 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
287 if (!x)
288 goto finally;
289
290 Handlers[0].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000291 for (i = 1; i < NSIG; i++) {
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000292 RETSIGTYPE (*t)();
Guido van Rossumfb0df941996-05-23 22:55:35 +0000293#ifdef HAVE_SIGACTION
294 struct sigaction act;
295 sigaction(i, 0, &act);
Guido van Rossum1835c4f1996-05-29 14:15:19 +0000296 t = act.sa_handler;
Guido van Rossumfb0df941996-05-23 22:55:35 +0000297#else
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000298 t = signal(i, SIG_IGN);
299 signal(i, t);
Guido van Rossumfb0df941996-05-23 22:55:35 +0000300#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000301 Handlers[i].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000302 if (t == SIG_DFL)
Barry Warsaw92971171997-01-03 00:14:25 +0000303 Handlers[i].func = DefaultHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000304 else if (t == SIG_IGN)
Barry Warsaw92971171997-01-03 00:14:25 +0000305 Handlers[i].func = IgnoreHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000306 else
Barry Warsaw92971171997-01-03 00:14:25 +0000307 Handlers[i].func = Py_None; /* None of our business */
308 Py_INCREF(Handlers[i].func);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000309 }
Barry Warsaw92971171997-01-03 00:14:25 +0000310 if (Handlers[SIGINT].func == DefaultHandler) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000311 /* Install default int handler */
Barry Warsaw92971171997-01-03 00:14:25 +0000312 Py_DECREF(Handlers[SIGINT].func);
313 Handlers[SIGINT].func = IntHandler;
314 Py_INCREF(IntHandler);
315 signal(SIGINT, &signal_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000316 }
317
318#ifdef SIGHUP
Guido van Rossume4485b01994-09-07 14:32:49 +0000319 x = PyInt_FromLong(SIGHUP);
320 PyDict_SetItemString(d, "SIGHUP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000321 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000322#endif
323#ifdef SIGINT
Guido van Rossume4485b01994-09-07 14:32:49 +0000324 x = PyInt_FromLong(SIGINT);
325 PyDict_SetItemString(d, "SIGINT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000326 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000327#endif
328#ifdef SIGQUIT
Guido van Rossume4485b01994-09-07 14:32:49 +0000329 x = PyInt_FromLong(SIGQUIT);
330 PyDict_SetItemString(d, "SIGQUIT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000331 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000332#endif
333#ifdef SIGILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000334 x = PyInt_FromLong(SIGILL);
335 PyDict_SetItemString(d, "SIGILL", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000336 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000337#endif
338#ifdef SIGTRAP
Guido van Rossume4485b01994-09-07 14:32:49 +0000339 x = PyInt_FromLong(SIGTRAP);
340 PyDict_SetItemString(d, "SIGTRAP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000341 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000342#endif
343#ifdef SIGIOT
Guido van Rossume4485b01994-09-07 14:32:49 +0000344 x = PyInt_FromLong(SIGIOT);
345 PyDict_SetItemString(d, "SIGIOT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000346 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000347#endif
348#ifdef SIGABRT
Guido van Rossume4485b01994-09-07 14:32:49 +0000349 x = PyInt_FromLong(SIGABRT);
350 PyDict_SetItemString(d, "SIGABRT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000351 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000352#endif
353#ifdef SIGEMT
Guido van Rossume4485b01994-09-07 14:32:49 +0000354 x = PyInt_FromLong(SIGEMT);
355 PyDict_SetItemString(d, "SIGEMT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000356 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000357#endif
358#ifdef SIGFPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000359 x = PyInt_FromLong(SIGFPE);
360 PyDict_SetItemString(d, "SIGFPE", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000361 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000362#endif
363#ifdef SIGKILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000364 x = PyInt_FromLong(SIGKILL);
365 PyDict_SetItemString(d, "SIGKILL", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000366 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000367#endif
368#ifdef SIGBUS
Guido van Rossume4485b01994-09-07 14:32:49 +0000369 x = PyInt_FromLong(SIGBUS);
370 PyDict_SetItemString(d, "SIGBUS", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000371 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000372#endif
373#ifdef SIGSEGV
Guido van Rossume4485b01994-09-07 14:32:49 +0000374 x = PyInt_FromLong(SIGSEGV);
375 PyDict_SetItemString(d, "SIGSEGV", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000376 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000377#endif
378#ifdef SIGSYS
Guido van Rossume4485b01994-09-07 14:32:49 +0000379 x = PyInt_FromLong(SIGSYS);
380 PyDict_SetItemString(d, "SIGSYS", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000381 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000382#endif
383#ifdef SIGPIPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000384 x = PyInt_FromLong(SIGPIPE);
385 PyDict_SetItemString(d, "SIGPIPE", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000386 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000387#endif
388#ifdef SIGALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000389 x = PyInt_FromLong(SIGALRM);
390 PyDict_SetItemString(d, "SIGALRM", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000391 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000392#endif
393#ifdef SIGTERM
Guido van Rossume4485b01994-09-07 14:32:49 +0000394 x = PyInt_FromLong(SIGTERM);
395 PyDict_SetItemString(d, "SIGTERM", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000396 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000397#endif
398#ifdef SIGUSR1
Guido van Rossume4485b01994-09-07 14:32:49 +0000399 x = PyInt_FromLong(SIGUSR1);
400 PyDict_SetItemString(d, "SIGUSR1", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000401 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000402#endif
403#ifdef SIGUSR2
Guido van Rossume4485b01994-09-07 14:32:49 +0000404 x = PyInt_FromLong(SIGUSR2);
405 PyDict_SetItemString(d, "SIGUSR2", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000406 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000407#endif
408#ifdef SIGCLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000409 x = PyInt_FromLong(SIGCLD);
410 PyDict_SetItemString(d, "SIGCLD", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000411 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000412#endif
413#ifdef SIGCHLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000414 x = PyInt_FromLong(SIGCHLD);
415 PyDict_SetItemString(d, "SIGCHLD", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000416 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000417#endif
418#ifdef SIGPWR
Guido van Rossume4485b01994-09-07 14:32:49 +0000419 x = PyInt_FromLong(SIGPWR);
420 PyDict_SetItemString(d, "SIGPWR", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000421 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000422#endif
423#ifdef SIGIO
Guido van Rossume4485b01994-09-07 14:32:49 +0000424 x = PyInt_FromLong(SIGIO);
425 PyDict_SetItemString(d, "SIGIO", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000426 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000427#endif
428#ifdef SIGURG
Guido van Rossume4485b01994-09-07 14:32:49 +0000429 x = PyInt_FromLong(SIGURG);
430 PyDict_SetItemString(d, "SIGURG", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000431 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000432#endif
433#ifdef SIGWINCH
Guido van Rossume4485b01994-09-07 14:32:49 +0000434 x = PyInt_FromLong(SIGWINCH);
435 PyDict_SetItemString(d, "SIGWINCH", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000436 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000437#endif
438#ifdef SIGPOLL
Guido van Rossume4485b01994-09-07 14:32:49 +0000439 x = PyInt_FromLong(SIGPOLL);
440 PyDict_SetItemString(d, "SIGPOLL", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000441 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000442#endif
443#ifdef SIGSTOP
Guido van Rossume4485b01994-09-07 14:32:49 +0000444 x = PyInt_FromLong(SIGSTOP);
445 PyDict_SetItemString(d, "SIGSTOP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000446 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000447#endif
448#ifdef SIGTSTP
Guido van Rossume4485b01994-09-07 14:32:49 +0000449 x = PyInt_FromLong(SIGTSTP);
450 PyDict_SetItemString(d, "SIGTSTP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000451 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000452#endif
453#ifdef SIGCONT
Guido van Rossume4485b01994-09-07 14:32:49 +0000454 x = PyInt_FromLong(SIGCONT);
455 PyDict_SetItemString(d, "SIGCONT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000456 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000457#endif
458#ifdef SIGTTIN
Guido van Rossume4485b01994-09-07 14:32:49 +0000459 x = PyInt_FromLong(SIGTTIN);
460 PyDict_SetItemString(d, "SIGTTIN", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000461 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000462#endif
463#ifdef SIGTTOU
Guido van Rossume4485b01994-09-07 14:32:49 +0000464 x = PyInt_FromLong(SIGTTOU);
465 PyDict_SetItemString(d, "SIGTTOU", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000466 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000467#endif
468#ifdef SIGVTALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000469 x = PyInt_FromLong(SIGVTALRM);
470 PyDict_SetItemString(d, "SIGVTALRM", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000471 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000472#endif
473#ifdef SIGPROF
Guido van Rossume4485b01994-09-07 14:32:49 +0000474 x = PyInt_FromLong(SIGPROF);
475 PyDict_SetItemString(d, "SIGPROF", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000476 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000477#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000478#ifdef SIGXCPU
479 x = PyInt_FromLong(SIGXCPU);
480 PyDict_SetItemString(d, "SIGXCPU", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000481 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000482#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000483#ifdef SIGXFSZ
484 x = PyInt_FromLong(SIGXFSZ);
485 PyDict_SetItemString(d, "SIGXFSZ", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000486 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000487#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000488 if (!PyErr_Occurred())
489 return;
490
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000491 /* Check for errors */
Barry Warsaw92971171997-01-03 00:14:25 +0000492 finally:
493 Py_FatalError("can't initialize module signal");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000494}
495
Barry Warsaw92971171997-01-03 00:14:25 +0000496
497
498/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000499int
Guido van Rossumec25b911995-01-22 00:46:57 +0000500PyErr_CheckSignals()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000501{
502 int i;
Guido van Rossume4485b01994-09-07 14:32:49 +0000503 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +0000504
505 if (!is_tripped)
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000506 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000507#ifdef WITH_THREAD
508 if (get_thread_ident() != main_thread)
509 return 0;
510#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000511 if (!(f = PyEval_GetFrame()))
Guido van Rossume4485b01994-09-07 14:32:49 +0000512 f = Py_None;
Barry Warsaw92971171997-01-03 00:14:25 +0000513
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000514 for (i = 1; i < NSIG; i++) {
Barry Warsaw92971171997-01-03 00:14:25 +0000515 if (Handlers[i].tripped) {
516 PyObject *result = NULL;
517 PyObject *arglist = Py_BuildValue("(iO)", i, f);
518 Handlers[i].tripped = 0;
519
520 if (arglist) {
521 result = PyEval_CallObject(Handlers[i].func,
522 arglist);
Guido van Rossume4485b01994-09-07 14:32:49 +0000523 Py_DECREF(arglist);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000524 }
Barry Warsaw92971171997-01-03 00:14:25 +0000525 if (!result)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000526 return 1;
Barry Warsaw92971171997-01-03 00:14:25 +0000527
528 Py_DECREF(result);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000529 }
530 }
Barry Warsaw92971171997-01-03 00:14:25 +0000531 is_tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000532 return 0;
533}
534
Barry Warsaw92971171997-01-03 00:14:25 +0000535
536/* Replacements for intrcheck.c functionality
537 * Declared in pyerrors.h
538 */
539void
540PyErr_SetInterrupt()
541{
542 is_tripped++;
543 Handlers[SIGINT].tripped = 1;
544}
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000545
546void
Barry Warsaw92971171997-01-03 00:14:25 +0000547PyOS_InitInterrupts()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000548{
549 initsignal();
550}
551
552int
Barry Warsaw92971171997-01-03 00:14:25 +0000553PyOS_InterruptOccurred()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000554{
Barry Warsaw92971171997-01-03 00:14:25 +0000555 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000556#ifdef WITH_THREAD
557 if (get_thread_ident() != main_thread)
558 return 0;
559#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000560 Handlers[SIGINT].tripped = 0;
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000561 return 1;
562 }
563 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000564}