blob: 3049f225f7e5b7ad46054f836a73fe5234773f02 [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
94static RETSIGTYPE
Guido van Rossume4485b01994-09-07 14:32:49 +000095PySignal_Handler(sig_num)
96 int sig_num;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000097{
Guido van Rossumbb4ba121994-06-23 11:25:45 +000098#ifdef WITH_THREAD
99 /* See NOTES section above */
100 if (getpid() == main_pid) {
101#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000102 PySignal_IsTripped++;
103 PySignal_SignalHandlerArray[sig_num].tripped = 1;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000104#ifdef WITH_THREAD
105 }
106#endif
Guido van Rossum602099a1994-09-14 13:32:22 +0000107#ifdef SIGCHLD
108 if (sig_num == SIGCHLD) {
109 /* To avoid infinite recursion, this signal remains
110 reset until explicit re-instated.
111 Don't clear the 'func' field as it is our pointer
112 to the Python handler... */
113 return;
114 }
115#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000116 (void *)signal(sig_num, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000117}
118
Guido van Rossume4485b01994-09-07 14:32:49 +0000119
120static PyObject *
121PySignal_Alarm(self, args)
122 PyObject *self; /* Not used */
123 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000124{
125 int t;
Guido van Rossume4485b01994-09-07 14:32:49 +0000126 if (!PyArg_Parse(args, "i", &t))
127 return (PyObject *)NULL;
128 /* alarm() returns the number of seconds remaining */
129 return PyInt_FromLong(alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000130}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131
Guido van Rossuma597dde1995-01-10 20:56:29 +0000132static PyObject *
Guido van Rossume4485b01994-09-07 14:32:49 +0000133PySignal_Pause(self, args)
134 PyObject *self; /* Not used */
135 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000136{
Guido van Rossume4485b01994-09-07 14:32:49 +0000137 if (!PyArg_NoArgs(args))
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000138 return NULL;
Guido van Rossuma597dde1995-01-10 20:56:29 +0000139 Py_BEGIN_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000140 pause();
Guido van Rossuma597dde1995-01-10 20:56:29 +0000141 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000142 Py_INCREF(Py_None);
143 return Py_None;
144}
145
146static PyObject *
147PySignal_Signal(self, args)
148 PyObject *self; /* Not used */
149 PyObject *args;
150{
151 PyObject *obj;
152 int sig_num;
153 PyObject *old_handler;
154 RETSIGTYPE (*func)();
155 if (!PyArg_Parse(args, "(iO)", &sig_num, &obj))
156 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000157#ifdef WITH_THREAD
158 if (get_thread_ident() != main_thread) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000159 PyErr_SetString(PyExc_ValueError, "signal only works in main thread");
160 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000161 }
162#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000163 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000164 PyErr_SetString(PyExc_ValueError, "signal number out of range");
165 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000166 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000167 if (obj == PySignal_SignalIgnoreHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000168 func = SIG_IGN;
Guido van Rossume4485b01994-09-07 14:32:49 +0000169 else if (obj == PySignal_SignalDefaultHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000170 func = SIG_DFL;
Guido van Rossume4485b01994-09-07 14:32:49 +0000171 else if (!PyCFunction_Check(obj) &&
172 !PyFunction_Check(obj) &&
173 !PyMethod_Check(obj)) {
174 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000175"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Guido van Rossume4485b01994-09-07 14:32:49 +0000176 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000177 }
178 else
Guido van Rossume4485b01994-09-07 14:32:49 +0000179 func = PySignal_Handler;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000180 if (signal(sig_num, func) == SIG_ERR) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000181 PyErr_SetFromErrno(PyExc_RuntimeError);
182 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000183 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000184 old_handler = PySignal_SignalHandlerArray[sig_num].func;
185 PySignal_SignalHandlerArray[sig_num].tripped = 0;
186 Py_INCREF(obj);
187 PySignal_SignalHandlerArray[sig_num].func = obj;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000188 return old_handler;
189}
190
Guido van Rossume4485b01994-09-07 14:32:49 +0000191static PyObject *
192PySignal_GetSignal(self, args)
193 PyObject *self; /* Not used */
194 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000195{
196 int sig_num;
Guido van Rossume4485b01994-09-07 14:32:49 +0000197 PyObject *old_handler;
198 if (!PyArg_Parse(args, "i", &sig_num))
199 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000200 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000201 PyErr_SetString(PyExc_ValueError, "signal number out of range");
202 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000203 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000204 old_handler = PySignal_SignalHandlerArray[sig_num].func;
205 Py_INCREF(old_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000206 return old_handler;
207}
208
209
210/* List of functions defined in the module */
211
Guido van Rossume4485b01994-09-07 14:32:49 +0000212static PyMethodDef PySignal_methods[] = {
213 {"alarm", PySignal_Alarm},
214 {"signal", PySignal_Signal},
215 {"getsignal", PySignal_GetSignal},
216 {"pause", PySignal_Pause},
Guido van Rossum95588251995-01-07 11:50:04 +0000217 {"default_int_handler", PySignal_CDefaultIntHandler},
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000218 {NULL, NULL} /* sentinel */
219};
220
221void
222initsignal()
223{
Guido van Rossume4485b01994-09-07 14:32:49 +0000224 PyObject *m, *d, *x;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000225 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000226
227#ifdef WITH_THREAD
228 main_thread = get_thread_ident();
229 main_pid = getpid();
230#endif
231
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000232 /* Create the module and add the functions */
Guido van Rossume4485b01994-09-07 14:32:49 +0000233 m = Py_InitModule("signal", PySignal_methods);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000234
235 /* Add some symbolic constants to the module */
Guido van Rossume4485b01994-09-07 14:32:49 +0000236 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000237
Guido van Rossume4485b01994-09-07 14:32:49 +0000238 PySignal_SignalDefaultHandler = PyInt_FromLong((long)SIG_DFL);
239 PyDict_SetItemString(d, "SIG_DFL", PySignal_SignalDefaultHandler);
240 PySignal_SignalIgnoreHandler = PyInt_FromLong((long)SIG_IGN);
241 PyDict_SetItemString(d, "SIG_IGN", PySignal_SignalIgnoreHandler);
242 PyDict_SetItemString(d, "NSIG", PyInt_FromLong((long)NSIG));
Guido van Rossum95588251995-01-07 11:50:04 +0000243 PySignal_DefaultIntHandler =
244 PyDict_GetItemString(d, "default_int_handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000245
Guido van Rossume4485b01994-09-07 14:32:49 +0000246 PySignal_SignalHandlerArray[0].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000247 for (i = 1; i < NSIG; i++) {
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000248 RETSIGTYPE (*t)();
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000249 t = signal(i, SIG_IGN);
250 signal(i, t);
Guido van Rossume4485b01994-09-07 14:32:49 +0000251 PySignal_SignalHandlerArray[i].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000252 if (t == SIG_DFL)
Guido van Rossume4485b01994-09-07 14:32:49 +0000253 PySignal_SignalHandlerArray[i].func = PySignal_SignalDefaultHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000254 else if (t == SIG_IGN)
Guido van Rossume4485b01994-09-07 14:32:49 +0000255 PySignal_SignalHandlerArray[i].func = PySignal_SignalIgnoreHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000256 else
Guido van Rossume4485b01994-09-07 14:32:49 +0000257 PySignal_SignalHandlerArray[i].func = Py_None; /* None of our business */
258 Py_INCREF(PySignal_SignalHandlerArray[i].func);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000259 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000260 if (PySignal_SignalHandlerArray[SIGINT].func == PySignal_SignalDefaultHandler) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000261 /* Install default int handler */
Guido van Rossume4485b01994-09-07 14:32:49 +0000262 Py_DECREF(PySignal_SignalHandlerArray[SIGINT].func);
263 PySignal_SignalHandlerArray[SIGINT].func = PySignal_DefaultIntHandler;
264 Py_INCREF(PySignal_DefaultIntHandler);
265 signal(SIGINT, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000266 }
267
268#ifdef SIGHUP
Guido van Rossume4485b01994-09-07 14:32:49 +0000269 x = PyInt_FromLong(SIGHUP);
270 PyDict_SetItemString(d, "SIGHUP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000271#endif
272#ifdef SIGINT
Guido van Rossume4485b01994-09-07 14:32:49 +0000273 x = PyInt_FromLong(SIGINT);
274 PyDict_SetItemString(d, "SIGINT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000275#endif
276#ifdef SIGQUIT
Guido van Rossume4485b01994-09-07 14:32:49 +0000277 x = PyInt_FromLong(SIGQUIT);
278 PyDict_SetItemString(d, "SIGQUIT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000279#endif
280#ifdef SIGILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000281 x = PyInt_FromLong(SIGILL);
282 PyDict_SetItemString(d, "SIGILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000283#endif
284#ifdef SIGTRAP
Guido van Rossume4485b01994-09-07 14:32:49 +0000285 x = PyInt_FromLong(SIGTRAP);
286 PyDict_SetItemString(d, "SIGTRAP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000287#endif
288#ifdef SIGIOT
Guido van Rossume4485b01994-09-07 14:32:49 +0000289 x = PyInt_FromLong(SIGIOT);
290 PyDict_SetItemString(d, "SIGIOT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000291#endif
292#ifdef SIGABRT
Guido van Rossume4485b01994-09-07 14:32:49 +0000293 x = PyInt_FromLong(SIGABRT);
294 PyDict_SetItemString(d, "SIGABRT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000295#endif
296#ifdef SIGEMT
Guido van Rossume4485b01994-09-07 14:32:49 +0000297 x = PyInt_FromLong(SIGEMT);
298 PyDict_SetItemString(d, "SIGEMT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000299#endif
300#ifdef SIGFPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000301 x = PyInt_FromLong(SIGFPE);
302 PyDict_SetItemString(d, "SIGFPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000303#endif
304#ifdef SIGKILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000305 x = PyInt_FromLong(SIGKILL);
306 PyDict_SetItemString(d, "SIGKILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000307#endif
308#ifdef SIGBUS
Guido van Rossume4485b01994-09-07 14:32:49 +0000309 x = PyInt_FromLong(SIGBUS);
310 PyDict_SetItemString(d, "SIGBUS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000311#endif
312#ifdef SIGSEGV
Guido van Rossume4485b01994-09-07 14:32:49 +0000313 x = PyInt_FromLong(SIGSEGV);
314 PyDict_SetItemString(d, "SIGSEGV", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000315#endif
316#ifdef SIGSYS
Guido van Rossume4485b01994-09-07 14:32:49 +0000317 x = PyInt_FromLong(SIGSYS);
318 PyDict_SetItemString(d, "SIGSYS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000319#endif
320#ifdef SIGPIPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000321 x = PyInt_FromLong(SIGPIPE);
322 PyDict_SetItemString(d, "SIGPIPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000323#endif
324#ifdef SIGALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000325 x = PyInt_FromLong(SIGALRM);
326 PyDict_SetItemString(d, "SIGALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000327#endif
328#ifdef SIGTERM
Guido van Rossume4485b01994-09-07 14:32:49 +0000329 x = PyInt_FromLong(SIGTERM);
330 PyDict_SetItemString(d, "SIGTERM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000331#endif
332#ifdef SIGUSR1
Guido van Rossume4485b01994-09-07 14:32:49 +0000333 x = PyInt_FromLong(SIGUSR1);
334 PyDict_SetItemString(d, "SIGUSR1", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000335#endif
336#ifdef SIGUSR2
Guido van Rossume4485b01994-09-07 14:32:49 +0000337 x = PyInt_FromLong(SIGUSR2);
338 PyDict_SetItemString(d, "SIGUSR2", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000339#endif
340#ifdef SIGCLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000341 x = PyInt_FromLong(SIGCLD);
342 PyDict_SetItemString(d, "SIGCLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000343#endif
344#ifdef SIGCHLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000345 x = PyInt_FromLong(SIGCHLD);
346 PyDict_SetItemString(d, "SIGCHLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000347#endif
348#ifdef SIGPWR
Guido van Rossume4485b01994-09-07 14:32:49 +0000349 x = PyInt_FromLong(SIGPWR);
350 PyDict_SetItemString(d, "SIGPWR", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000351#endif
352#ifdef SIGIO
Guido van Rossume4485b01994-09-07 14:32:49 +0000353 x = PyInt_FromLong(SIGIO);
354 PyDict_SetItemString(d, "SIGIO", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000355#endif
356#ifdef SIGURG
Guido van Rossume4485b01994-09-07 14:32:49 +0000357 x = PyInt_FromLong(SIGURG);
358 PyDict_SetItemString(d, "SIGURG", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000359#endif
360#ifdef SIGWINCH
Guido van Rossume4485b01994-09-07 14:32:49 +0000361 x = PyInt_FromLong(SIGWINCH);
362 PyDict_SetItemString(d, "SIGWINCH", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000363#endif
364#ifdef SIGPOLL
Guido van Rossume4485b01994-09-07 14:32:49 +0000365 x = PyInt_FromLong(SIGPOLL);
366 PyDict_SetItemString(d, "SIGPOLL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000367#endif
368#ifdef SIGSTOP
Guido van Rossume4485b01994-09-07 14:32:49 +0000369 x = PyInt_FromLong(SIGSTOP);
370 PyDict_SetItemString(d, "SIGSTOP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000371#endif
372#ifdef SIGTSTP
Guido van Rossume4485b01994-09-07 14:32:49 +0000373 x = PyInt_FromLong(SIGTSTP);
374 PyDict_SetItemString(d, "SIGTSTP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000375#endif
376#ifdef SIGCONT
Guido van Rossume4485b01994-09-07 14:32:49 +0000377 x = PyInt_FromLong(SIGCONT);
378 PyDict_SetItemString(d, "SIGCONT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000379#endif
380#ifdef SIGTTIN
Guido van Rossume4485b01994-09-07 14:32:49 +0000381 x = PyInt_FromLong(SIGTTIN);
382 PyDict_SetItemString(d, "SIGTTIN", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000383#endif
384#ifdef SIGTTOU
Guido van Rossume4485b01994-09-07 14:32:49 +0000385 x = PyInt_FromLong(SIGTTOU);
386 PyDict_SetItemString(d, "SIGTTOU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000387#endif
388#ifdef SIGVTALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000389 x = PyInt_FromLong(SIGVTALRM);
390 PyDict_SetItemString(d, "SIGVTALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000391#endif
392#ifdef SIGPROF
Guido van Rossume4485b01994-09-07 14:32:49 +0000393 x = PyInt_FromLong(SIGPROF);
394 PyDict_SetItemString(d, "SIGPROF", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000395#endif
396#ifdef SIGCPU
Guido van Rossume4485b01994-09-07 14:32:49 +0000397 x = PyInt_FromLong(SIGCPU);
398 PyDict_SetItemString(d, "SIGCPU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000399#endif
400#ifdef SIGFSZ
Guido van Rossume4485b01994-09-07 14:32:49 +0000401 x = PyInt_FromLong(SIGFSZ);
402 PyDict_SetItemString(d, "SIGFSZ", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000403#endif
404 /* Check for errors */
Guido van Rossume4485b01994-09-07 14:32:49 +0000405 if (PyErr_Occurred())
406 Py_FatalError("can't initialize module signal");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000407}
408
409int
Guido van Rossumec25b911995-01-22 00:46:57 +0000410PyErr_CheckSignals()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000411{
412 int i;
Guido van Rossume4485b01994-09-07 14:32:49 +0000413 PyObject *f;
414 if (!PySignal_IsTripped)
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000415 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000416#ifdef WITH_THREAD
417 if (get_thread_ident() != main_thread)
418 return 0;
419#endif
Guido van Rossuma597dde1995-01-10 20:56:29 +0000420 f = PyEval_GetFrame();
Guido van Rossume4485b01994-09-07 14:32:49 +0000421 if (f == (PyObject *)NULL)
422 f = Py_None;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000423 for (i = 1; i < NSIG; i++) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000424 if (PySignal_SignalHandlerArray[i].tripped) {
425 PyObject *arglist, *result;
426 PySignal_SignalHandlerArray[i].tripped = 0;
427 arglist = Py_BuildValue("(iO)", i, f);
428 if (arglist == (PyObject *)NULL)
429 result = (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000430 else {
Guido van Rossume4485b01994-09-07 14:32:49 +0000431 result = PyEval_CallObject(PySignal_SignalHandlerArray[i].func,arglist);
432 Py_DECREF(arglist);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000433 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000434 if (result == (PyObject *)NULL) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000435 return 1;
436 } else {
Guido van Rossume4485b01994-09-07 14:32:49 +0000437 Py_DECREF(result);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000438 }
439 }
440 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000441 PySignal_IsTripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000442 return 0;
443}
444
445/* Replacement for intrcheck.c functionality */
446
447void
Guido van Rossuma597dde1995-01-10 20:56:29 +0000448PyOS_InitInterrupts ()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000449{
450 initsignal();
451}
452
453int
Guido van Rossuma597dde1995-01-10 20:56:29 +0000454PyOS_InterruptOccurred ()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000455{
Guido van Rossume4485b01994-09-07 14:32:49 +0000456 if (PySignal_SignalHandlerArray[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000457#ifdef WITH_THREAD
458 if (get_thread_ident() != main_thread)
459 return 0;
460#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000461 PySignal_SignalHandlerArray[SIGINT].tripped = 0;
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000462 return 1;
463 }
464 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000465}