blob: c310024307ad29ff845d0c2f64d6762531c85970 [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000025/* Signal module -- many thanks to Lance Ellinghaus */
Guido van Rossum398d9fe1994-05-11 08:59:13 +000026
Guido van Rossum602099a1994-09-14 13:32:22 +000027#include "Python.h"
Guido van Rossum398d9fe1994-05-11 08:59:13 +000028#include "intrcheck.h"
29
30#include <signal.h>
31
Guido van Rossumbb4ba121994-06-23 11:25:45 +000032#ifndef SIG_ERR
33#define SIG_ERR ((RETSIGTYPE (*)())-1)
34#endif
35
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000036#ifndef NSIG
37#define NSIG (_SIGMAX + 1) /* For QNX */
38#endif
39
40
Guido van Rossumbb4ba121994-06-23 11:25:45 +000041/*
42 NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
43
44 When threads are supported, we want the following semantics:
45
46 - only the main thread can set a signal handler
47 - any thread can get a signal handler
48 - signals are only delivered to the main thread
49
50 I.e. we don't support "synchronous signals" like SIGFPE (catching
51 this doesn't make much sense in Python anyway) nor do we support
52 signals as a means of inter-thread communication, since not all
53 thread implementations support that (at least our thread library
54 doesn't).
55
56 We still have the problem that in some implementations signals
57 generated by the keyboard (e.g. SIGINT) are delivered to all
58 threads (e.g. SGI), while in others (e.g. Solaris) such signals are
59 delivered to one random thread (an intermediate possibility would
Guido van Rossuma3c04b01995-01-12 11:29:01 +000060 be to deliver it to the main thread -- POSIX?). For now, we have
Guido van Rossumbb4ba121994-06-23 11:25:45 +000061 a working implementation that works in all three cases -- the
62 handler ignores signals if getpid() isn't the same as in the main
63 thread. XXX This is a hack.
64
65*/
66
67#ifdef WITH_THREAD
68#include "thread.h"
69static long main_thread;
70static pid_t main_pid;
71#endif
72
Guido van Rossume4485b01994-09-07 14:32:49 +000073struct PySignal_SignalArrayStruct {
Guido van Rossum398d9fe1994-05-11 08:59:13 +000074 int tripped;
Guido van Rossume4485b01994-09-07 14:32:49 +000075 PyObject *func;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000076};
77
Guido van Rossume4485b01994-09-07 14:32:49 +000078static struct PySignal_SignalArrayStruct PySignal_SignalHandlerArray[NSIG];
79static int PySignal_IsTripped = 0; /* Speed up sigcheck() when none tripped */
Guido van Rossum398d9fe1994-05-11 08:59:13 +000080
Guido van Rossume4485b01994-09-07 14:32:49 +000081static PyObject *PySignal_SignalDefaultHandler;
82static PyObject *PySignal_SignalIgnoreHandler;
83static PyObject *PySignal_DefaultIntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000084
Guido van Rossume4485b01994-09-07 14:32:49 +000085static PyObject *
86PySignal_CDefaultIntHandler(self, arg)
87 PyObject *self;
88 PyObject *arg;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000089{
Guido van Rossume4485b01994-09-07 14:32:49 +000090 PyErr_SetNone(PyExc_KeyboardInterrupt);
91 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000092}
93
Guido van Rossum06d511d1995-03-10 15:13:48 +000094void
95PyErr_SetInterrupt()
96{
97 PySignal_IsTripped++;
98 PySignal_SignalHandlerArray[SIGINT].tripped = 1;
99}
100
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000101static RETSIGTYPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000102PySignal_Handler(sig_num)
103 int sig_num;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000104{
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000105#ifdef WITH_THREAD
106 /* See NOTES section above */
107 if (getpid() == main_pid) {
108#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000109 PySignal_IsTripped++;
110 PySignal_SignalHandlerArray[sig_num].tripped = 1;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000111#ifdef WITH_THREAD
112 }
113#endif
Guido van Rossum602099a1994-09-14 13:32:22 +0000114#ifdef SIGCHLD
115 if (sig_num == SIGCHLD) {
116 /* To avoid infinite recursion, this signal remains
117 reset until explicit re-instated.
118 Don't clear the 'func' field as it is our pointer
119 to the Python handler... */
120 return;
121 }
122#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000123 (void *)signal(sig_num, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000124}
Guido van Rossume4485b01994-09-07 14:32:49 +0000125
Guido van Rossum06d511d1995-03-10 15:13:48 +0000126
127#ifndef DONT_HAVE_SIG_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000128static PyObject *
129PySignal_Alarm(self, args)
130 PyObject *self; /* Not used */
131 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000132{
133 int t;
Guido van Rossume4485b01994-09-07 14:32:49 +0000134 if (!PyArg_Parse(args, "i", &t))
135 return (PyObject *)NULL;
136 /* alarm() returns the number of seconds remaining */
137 return PyInt_FromLong(alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000138}
Guido van Rossum06d511d1995-03-10 15:13:48 +0000139#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000140
Guido van Rossum06d511d1995-03-10 15:13:48 +0000141#ifndef DONT_HAVE_SIG_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000142static PyObject *
Guido van Rossume4485b01994-09-07 14:32:49 +0000143PySignal_Pause(self, args)
144 PyObject *self; /* Not used */
145 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000146{
Guido van Rossume4485b01994-09-07 14:32:49 +0000147 if (!PyArg_NoArgs(args))
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000148 return NULL;
Guido van Rossuma597dde1995-01-10 20:56:29 +0000149 Py_BEGIN_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000150 pause();
Guido van Rossuma597dde1995-01-10 20:56:29 +0000151 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000152 Py_INCREF(Py_None);
153 return Py_None;
154}
Guido van Rossum06d511d1995-03-10 15:13:48 +0000155#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000156
157static PyObject *
158PySignal_Signal(self, args)
159 PyObject *self; /* Not used */
160 PyObject *args;
161{
162 PyObject *obj;
163 int sig_num;
164 PyObject *old_handler;
165 RETSIGTYPE (*func)();
166 if (!PyArg_Parse(args, "(iO)", &sig_num, &obj))
167 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000168#ifdef WITH_THREAD
169 if (get_thread_ident() != main_thread) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000170 PyErr_SetString(PyExc_ValueError,
171 "signal only works in main thread");
Guido van Rossume4485b01994-09-07 14:32:49 +0000172 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000173 }
174#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000175 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000176 PyErr_SetString(PyExc_ValueError,
177 "signal number out of range");
Guido van Rossume4485b01994-09-07 14:32:49 +0000178 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000179 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000180 if (obj == PySignal_SignalIgnoreHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000181 func = SIG_IGN;
Guido van Rossume4485b01994-09-07 14:32:49 +0000182 else if (obj == PySignal_SignalDefaultHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000183 func = SIG_DFL;
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000184 else if (!PyCallable_Check(obj)) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000185 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000186"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Guido van Rossume4485b01994-09-07 14:32:49 +0000187 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000188 }
189 else
Guido van Rossume4485b01994-09-07 14:32:49 +0000190 func = PySignal_Handler;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000191 if (signal(sig_num, func) == SIG_ERR) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000192 PyErr_SetFromErrno(PyExc_RuntimeError);
193 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000194 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000195 old_handler = PySignal_SignalHandlerArray[sig_num].func;
196 PySignal_SignalHandlerArray[sig_num].tripped = 0;
197 Py_INCREF(obj);
198 PySignal_SignalHandlerArray[sig_num].func = obj;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000199 return old_handler;
200}
201
Guido van Rossume4485b01994-09-07 14:32:49 +0000202static PyObject *
203PySignal_GetSignal(self, args)
204 PyObject *self; /* Not used */
205 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000206{
207 int sig_num;
Guido van Rossume4485b01994-09-07 14:32:49 +0000208 PyObject *old_handler;
209 if (!PyArg_Parse(args, "i", &sig_num))
210 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000211 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000212 PyErr_SetString(PyExc_ValueError,
213 "signal number out of range");
Guido van Rossume4485b01994-09-07 14:32:49 +0000214 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000215 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000216 old_handler = PySignal_SignalHandlerArray[sig_num].func;
217 Py_INCREF(old_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000218 return old_handler;
219}
220
221
222/* List of functions defined in the module */
223
Guido van Rossume4485b01994-09-07 14:32:49 +0000224static PyMethodDef PySignal_methods[] = {
Guido van Rossum06d511d1995-03-10 15:13:48 +0000225#ifndef DONT_HAVE_SIG_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000226 {"alarm", PySignal_Alarm},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000227#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000228 {"signal", PySignal_Signal},
229 {"getsignal", PySignal_GetSignal},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000230#ifndef DONT_HAVE_SIG_PAUSE
Guido van Rossume4485b01994-09-07 14:32:49 +0000231 {"pause", PySignal_Pause},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000232#endif
Guido van Rossum95588251995-01-07 11:50:04 +0000233 {"default_int_handler", PySignal_CDefaultIntHandler},
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000234 {NULL, NULL} /* sentinel */
235};
236
237void
238initsignal()
239{
Guido van Rossume4485b01994-09-07 14:32:49 +0000240 PyObject *m, *d, *x;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000241 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000242
243#ifdef WITH_THREAD
244 main_thread = get_thread_ident();
245 main_pid = getpid();
246#endif
247
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000248 /* Create the module and add the functions */
Guido van Rossume4485b01994-09-07 14:32:49 +0000249 m = Py_InitModule("signal", PySignal_methods);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000250
251 /* Add some symbolic constants to the module */
Guido van Rossume4485b01994-09-07 14:32:49 +0000252 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000253
Guido van Rossume4485b01994-09-07 14:32:49 +0000254 PySignal_SignalDefaultHandler = PyInt_FromLong((long)SIG_DFL);
255 PyDict_SetItemString(d, "SIG_DFL", PySignal_SignalDefaultHandler);
256 PySignal_SignalIgnoreHandler = PyInt_FromLong((long)SIG_IGN);
257 PyDict_SetItemString(d, "SIG_IGN", PySignal_SignalIgnoreHandler);
258 PyDict_SetItemString(d, "NSIG", PyInt_FromLong((long)NSIG));
Guido van Rossum95588251995-01-07 11:50:04 +0000259 PySignal_DefaultIntHandler =
260 PyDict_GetItemString(d, "default_int_handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000261
Guido van Rossume4485b01994-09-07 14:32:49 +0000262 PySignal_SignalHandlerArray[0].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000263 for (i = 1; i < NSIG; i++) {
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000264 RETSIGTYPE (*t)();
Guido van Rossumfb0df941996-05-23 22:55:35 +0000265#ifdef HAVE_SIGACTION
266 struct sigaction act;
267 sigaction(i, 0, &act);
Guido van Rossum1835c4f1996-05-29 14:15:19 +0000268 t = act.sa_handler;
Guido van Rossumfb0df941996-05-23 22:55:35 +0000269#else
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000270 t = signal(i, SIG_IGN);
271 signal(i, t);
Guido van Rossumfb0df941996-05-23 22:55:35 +0000272#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000273 PySignal_SignalHandlerArray[i].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000274 if (t == SIG_DFL)
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000275 PySignal_SignalHandlerArray[i].func =
276 PySignal_SignalDefaultHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000277 else if (t == SIG_IGN)
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000278 PySignal_SignalHandlerArray[i].func =
279 PySignal_SignalIgnoreHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000280 else
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000281 PySignal_SignalHandlerArray[i].func =
282 Py_None; /* None of our business */
Guido van Rossume4485b01994-09-07 14:32:49 +0000283 Py_INCREF(PySignal_SignalHandlerArray[i].func);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000284 }
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000285 if (PySignal_SignalHandlerArray[SIGINT].func ==
286 PySignal_SignalDefaultHandler) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000287 /* Install default int handler */
Guido van Rossume4485b01994-09-07 14:32:49 +0000288 Py_DECREF(PySignal_SignalHandlerArray[SIGINT].func);
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000289 PySignal_SignalHandlerArray[SIGINT].func =
290 PySignal_DefaultIntHandler;
Guido van Rossume4485b01994-09-07 14:32:49 +0000291 Py_INCREF(PySignal_DefaultIntHandler);
292 signal(SIGINT, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000293 }
294
295#ifdef SIGHUP
Guido van Rossume4485b01994-09-07 14:32:49 +0000296 x = PyInt_FromLong(SIGHUP);
297 PyDict_SetItemString(d, "SIGHUP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000298#endif
299#ifdef SIGINT
Guido van Rossume4485b01994-09-07 14:32:49 +0000300 x = PyInt_FromLong(SIGINT);
301 PyDict_SetItemString(d, "SIGINT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000302#endif
303#ifdef SIGQUIT
Guido van Rossume4485b01994-09-07 14:32:49 +0000304 x = PyInt_FromLong(SIGQUIT);
305 PyDict_SetItemString(d, "SIGQUIT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000306#endif
307#ifdef SIGILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000308 x = PyInt_FromLong(SIGILL);
309 PyDict_SetItemString(d, "SIGILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000310#endif
311#ifdef SIGTRAP
Guido van Rossume4485b01994-09-07 14:32:49 +0000312 x = PyInt_FromLong(SIGTRAP);
313 PyDict_SetItemString(d, "SIGTRAP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000314#endif
315#ifdef SIGIOT
Guido van Rossume4485b01994-09-07 14:32:49 +0000316 x = PyInt_FromLong(SIGIOT);
317 PyDict_SetItemString(d, "SIGIOT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000318#endif
319#ifdef SIGABRT
Guido van Rossume4485b01994-09-07 14:32:49 +0000320 x = PyInt_FromLong(SIGABRT);
321 PyDict_SetItemString(d, "SIGABRT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000322#endif
323#ifdef SIGEMT
Guido van Rossume4485b01994-09-07 14:32:49 +0000324 x = PyInt_FromLong(SIGEMT);
325 PyDict_SetItemString(d, "SIGEMT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000326#endif
327#ifdef SIGFPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000328 x = PyInt_FromLong(SIGFPE);
329 PyDict_SetItemString(d, "SIGFPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000330#endif
331#ifdef SIGKILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000332 x = PyInt_FromLong(SIGKILL);
333 PyDict_SetItemString(d, "SIGKILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000334#endif
335#ifdef SIGBUS
Guido van Rossume4485b01994-09-07 14:32:49 +0000336 x = PyInt_FromLong(SIGBUS);
337 PyDict_SetItemString(d, "SIGBUS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000338#endif
339#ifdef SIGSEGV
Guido van Rossume4485b01994-09-07 14:32:49 +0000340 x = PyInt_FromLong(SIGSEGV);
341 PyDict_SetItemString(d, "SIGSEGV", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000342#endif
343#ifdef SIGSYS
Guido van Rossume4485b01994-09-07 14:32:49 +0000344 x = PyInt_FromLong(SIGSYS);
345 PyDict_SetItemString(d, "SIGSYS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000346#endif
347#ifdef SIGPIPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000348 x = PyInt_FromLong(SIGPIPE);
349 PyDict_SetItemString(d, "SIGPIPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000350#endif
351#ifdef SIGALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000352 x = PyInt_FromLong(SIGALRM);
353 PyDict_SetItemString(d, "SIGALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000354#endif
355#ifdef SIGTERM
Guido van Rossume4485b01994-09-07 14:32:49 +0000356 x = PyInt_FromLong(SIGTERM);
357 PyDict_SetItemString(d, "SIGTERM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000358#endif
359#ifdef SIGUSR1
Guido van Rossume4485b01994-09-07 14:32:49 +0000360 x = PyInt_FromLong(SIGUSR1);
361 PyDict_SetItemString(d, "SIGUSR1", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000362#endif
363#ifdef SIGUSR2
Guido van Rossume4485b01994-09-07 14:32:49 +0000364 x = PyInt_FromLong(SIGUSR2);
365 PyDict_SetItemString(d, "SIGUSR2", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000366#endif
367#ifdef SIGCLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000368 x = PyInt_FromLong(SIGCLD);
369 PyDict_SetItemString(d, "SIGCLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000370#endif
371#ifdef SIGCHLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000372 x = PyInt_FromLong(SIGCHLD);
373 PyDict_SetItemString(d, "SIGCHLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000374#endif
375#ifdef SIGPWR
Guido van Rossume4485b01994-09-07 14:32:49 +0000376 x = PyInt_FromLong(SIGPWR);
377 PyDict_SetItemString(d, "SIGPWR", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000378#endif
379#ifdef SIGIO
Guido van Rossume4485b01994-09-07 14:32:49 +0000380 x = PyInt_FromLong(SIGIO);
381 PyDict_SetItemString(d, "SIGIO", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000382#endif
383#ifdef SIGURG
Guido van Rossume4485b01994-09-07 14:32:49 +0000384 x = PyInt_FromLong(SIGURG);
385 PyDict_SetItemString(d, "SIGURG", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000386#endif
387#ifdef SIGWINCH
Guido van Rossume4485b01994-09-07 14:32:49 +0000388 x = PyInt_FromLong(SIGWINCH);
389 PyDict_SetItemString(d, "SIGWINCH", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000390#endif
391#ifdef SIGPOLL
Guido van Rossume4485b01994-09-07 14:32:49 +0000392 x = PyInt_FromLong(SIGPOLL);
393 PyDict_SetItemString(d, "SIGPOLL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000394#endif
395#ifdef SIGSTOP
Guido van Rossume4485b01994-09-07 14:32:49 +0000396 x = PyInt_FromLong(SIGSTOP);
397 PyDict_SetItemString(d, "SIGSTOP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000398#endif
399#ifdef SIGTSTP
Guido van Rossume4485b01994-09-07 14:32:49 +0000400 x = PyInt_FromLong(SIGTSTP);
401 PyDict_SetItemString(d, "SIGTSTP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000402#endif
403#ifdef SIGCONT
Guido van Rossume4485b01994-09-07 14:32:49 +0000404 x = PyInt_FromLong(SIGCONT);
405 PyDict_SetItemString(d, "SIGCONT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000406#endif
407#ifdef SIGTTIN
Guido van Rossume4485b01994-09-07 14:32:49 +0000408 x = PyInt_FromLong(SIGTTIN);
409 PyDict_SetItemString(d, "SIGTTIN", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000410#endif
411#ifdef SIGTTOU
Guido van Rossume4485b01994-09-07 14:32:49 +0000412 x = PyInt_FromLong(SIGTTOU);
413 PyDict_SetItemString(d, "SIGTTOU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000414#endif
415#ifdef SIGVTALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000416 x = PyInt_FromLong(SIGVTALRM);
417 PyDict_SetItemString(d, "SIGVTALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000418#endif
419#ifdef SIGPROF
Guido van Rossume4485b01994-09-07 14:32:49 +0000420 x = PyInt_FromLong(SIGPROF);
421 PyDict_SetItemString(d, "SIGPROF", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000422#endif
423#ifdef SIGCPU
Guido van Rossume4485b01994-09-07 14:32:49 +0000424 x = PyInt_FromLong(SIGCPU);
425 PyDict_SetItemString(d, "SIGCPU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000426#endif
427#ifdef SIGFSZ
Guido van Rossume4485b01994-09-07 14:32:49 +0000428 x = PyInt_FromLong(SIGFSZ);
429 PyDict_SetItemString(d, "SIGFSZ", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000430#endif
431 /* Check for errors */
Guido van Rossume4485b01994-09-07 14:32:49 +0000432 if (PyErr_Occurred())
433 Py_FatalError("can't initialize module signal");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000434}
435
436int
Guido van Rossumec25b911995-01-22 00:46:57 +0000437PyErr_CheckSignals()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000438{
439 int i;
Guido van Rossume4485b01994-09-07 14:32:49 +0000440 PyObject *f;
441 if (!PySignal_IsTripped)
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000442 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000443#ifdef WITH_THREAD
444 if (get_thread_ident() != main_thread)
445 return 0;
446#endif
Guido van Rossuma597dde1995-01-10 20:56:29 +0000447 f = PyEval_GetFrame();
Guido van Rossume4485b01994-09-07 14:32:49 +0000448 if (f == (PyObject *)NULL)
449 f = Py_None;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000450 for (i = 1; i < NSIG; i++) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000451 if (PySignal_SignalHandlerArray[i].tripped) {
452 PyObject *arglist, *result;
453 PySignal_SignalHandlerArray[i].tripped = 0;
454 arglist = Py_BuildValue("(iO)", i, f);
455 if (arglist == (PyObject *)NULL)
456 result = (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000457 else {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000458 result = PyEval_CallObject(
459 PySignal_SignalHandlerArray[i].func, arglist);
Guido van Rossume4485b01994-09-07 14:32:49 +0000460 Py_DECREF(arglist);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000461 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000462 if (result == (PyObject *)NULL) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000463 return 1;
464 } else {
Guido van Rossume4485b01994-09-07 14:32:49 +0000465 Py_DECREF(result);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000466 }
467 }
468 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000469 PySignal_IsTripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000470 return 0;
471}
472
473/* Replacement for intrcheck.c functionality */
474
475void
Guido van Rossuma597dde1995-01-10 20:56:29 +0000476PyOS_InitInterrupts ()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000477{
478 initsignal();
479}
480
481int
Guido van Rossuma597dde1995-01-10 20:56:29 +0000482PyOS_InterruptOccurred ()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000483{
Guido van Rossume4485b01994-09-07 14:32:49 +0000484 if (PySignal_SignalHandlerArray[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000485#ifdef WITH_THREAD
486 if (get_thread_ident() != main_thread)
487 return 0;
488#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000489 PySignal_SignalHandlerArray[SIGINT].tripped = 0;
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000490 return 1;
491 }
492 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000493}