blob: 4b81889879ed7c08ecd75758247e00ebcbd53185 [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>
Guido van Rossum6299d1e1994-05-31 12:51:13 +000031#include <errno.h>
Guido van Rossum398d9fe1994-05-11 08:59:13 +000032
Guido van Rossumbb4ba121994-06-23 11:25:45 +000033#ifndef SIG_ERR
34#define SIG_ERR ((RETSIGTYPE (*)())-1)
35#endif
36
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000037#ifndef NSIG
38#define NSIG (_SIGMAX + 1) /* For QNX */
39#endif
40
41
Guido van Rossumbb4ba121994-06-23 11:25:45 +000042/*
43 NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
44
45 When threads are supported, we want the following semantics:
46
47 - only the main thread can set a signal handler
48 - any thread can get a signal handler
49 - signals are only delivered to the main thread
50
51 I.e. we don't support "synchronous signals" like SIGFPE (catching
52 this doesn't make much sense in Python anyway) nor do we support
53 signals as a means of inter-thread communication, since not all
54 thread implementations support that (at least our thread library
55 doesn't).
56
57 We still have the problem that in some implementations signals
58 generated by the keyboard (e.g. SIGINT) are delivered to all
59 threads (e.g. SGI), while in others (e.g. Solaris) such signals are
60 delivered to one random thread (an intermediate possibility would
61 be to deliver it to the main thread -- POSIX???). For now, we have
62 a working implementation that works in all three cases -- the
63 handler ignores signals if getpid() isn't the same as in the main
64 thread. XXX This is a hack.
65
66*/
67
68#ifdef WITH_THREAD
69#include "thread.h"
70static long main_thread;
71static pid_t main_pid;
72#endif
73
Guido van Rossume4485b01994-09-07 14:32:49 +000074struct PySignal_SignalArrayStruct {
Guido van Rossum398d9fe1994-05-11 08:59:13 +000075 int tripped;
Guido van Rossume4485b01994-09-07 14:32:49 +000076 PyObject *func;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000077};
78
Guido van Rossume4485b01994-09-07 14:32:49 +000079static struct PySignal_SignalArrayStruct PySignal_SignalHandlerArray[NSIG];
80static int PySignal_IsTripped = 0; /* Speed up sigcheck() when none tripped */
Guido van Rossum398d9fe1994-05-11 08:59:13 +000081
Guido van Rossume4485b01994-09-07 14:32:49 +000082static PyObject *PySignal_SignalDefaultHandler;
83static PyObject *PySignal_SignalIgnoreHandler;
84static PyObject *PySignal_DefaultIntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000085
Guido van Rossume4485b01994-09-07 14:32:49 +000086static PyObject *
87PySignal_CDefaultIntHandler(self, arg)
88 PyObject *self;
89 PyObject *arg;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000090{
Guido van Rossume4485b01994-09-07 14:32:49 +000091 PyErr_SetNone(PyExc_KeyboardInterrupt);
92 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000093}
94
95static RETSIGTYPE
Guido van Rossume4485b01994-09-07 14:32:49 +000096PySignal_Handler(sig_num)
97 int sig_num;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000098{
Guido van Rossumbb4ba121994-06-23 11:25:45 +000099#ifdef WITH_THREAD
100 /* See NOTES section above */
101 if (getpid() == main_pid) {
102#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000103 PySignal_IsTripped++;
104 PySignal_SignalHandlerArray[sig_num].tripped = 1;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000105#ifdef WITH_THREAD
106 }
107#endif
Guido van Rossum602099a1994-09-14 13:32:22 +0000108#ifdef SIGCHLD
109 if (sig_num == SIGCHLD) {
110 /* To avoid infinite recursion, this signal remains
111 reset until explicit re-instated.
112 Don't clear the 'func' field as it is our pointer
113 to the Python handler... */
114 return;
115 }
116#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000117 (void *)signal(sig_num, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000118}
119
Guido van Rossume4485b01994-09-07 14:32:49 +0000120
121static PyObject *
122PySignal_Alarm(self, args)
123 PyObject *self; /* Not used */
124 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000125{
126 int t;
Guido van Rossume4485b01994-09-07 14:32:49 +0000127 if (!PyArg_Parse(args, "i", &t))
128 return (PyObject *)NULL;
129 /* alarm() returns the number of seconds remaining */
130 return PyInt_FromLong(alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000131}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000132
133static object *
Guido van Rossume4485b01994-09-07 14:32:49 +0000134PySignal_Pause(self, args)
135 PyObject *self; /* Not used */
136 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000137{
Guido van Rossume4485b01994-09-07 14:32:49 +0000138 if (!PyArg_NoArgs(args))
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000139 return NULL;
Guido van Rossume4485b01994-09-07 14:32:49 +0000140 BGN_SAVE
141 pause();
142 END_SAVE
143 Py_INCREF(Py_None);
144 return Py_None;
145}
146
147static PyObject *
148PySignal_Signal(self, args)
149 PyObject *self; /* Not used */
150 PyObject *args;
151{
152 PyObject *obj;
153 int sig_num;
154 PyObject *old_handler;
155 RETSIGTYPE (*func)();
156 if (!PyArg_Parse(args, "(iO)", &sig_num, &obj))
157 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000158#ifdef WITH_THREAD
159 if (get_thread_ident() != main_thread) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000160 PyErr_SetString(PyExc_ValueError, "signal only works in main thread");
161 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000162 }
163#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000164 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000165 PyErr_SetString(PyExc_ValueError, "signal number out of range");
166 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000167 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000168 if (obj == PySignal_SignalIgnoreHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000169 func = SIG_IGN;
Guido van Rossume4485b01994-09-07 14:32:49 +0000170 else if (obj == PySignal_SignalDefaultHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000171 func = SIG_DFL;
Guido van Rossume4485b01994-09-07 14:32:49 +0000172 else if (!PyCFunction_Check(obj) &&
173 !PyFunction_Check(obj) &&
174 !PyMethod_Check(obj)) {
175 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000176"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Guido van Rossume4485b01994-09-07 14:32:49 +0000177 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000178 }
179 else
Guido van Rossume4485b01994-09-07 14:32:49 +0000180 func = PySignal_Handler;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000181 if (signal(sig_num, func) == SIG_ERR) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000182 PyErr_SetFromErrno(PyExc_RuntimeError);
183 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000184 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000185 old_handler = PySignal_SignalHandlerArray[sig_num].func;
186 PySignal_SignalHandlerArray[sig_num].tripped = 0;
187 Py_INCREF(obj);
188 PySignal_SignalHandlerArray[sig_num].func = obj;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000189 return old_handler;
190}
191
Guido van Rossume4485b01994-09-07 14:32:49 +0000192static PyObject *
193PySignal_GetSignal(self, args)
194 PyObject *self; /* Not used */
195 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000196{
197 int sig_num;
Guido van Rossume4485b01994-09-07 14:32:49 +0000198 PyObject *old_handler;
199 if (!PyArg_Parse(args, "i", &sig_num))
200 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000201 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000202 PyErr_SetString(PyExc_ValueError, "signal number out of range");
203 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000204 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000205 old_handler = PySignal_SignalHandlerArray[sig_num].func;
206 Py_INCREF(old_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000207 return old_handler;
208}
209
210
211/* List of functions defined in the module */
212
Guido van Rossume4485b01994-09-07 14:32:49 +0000213static PyMethodDef PySignal_methods[] = {
214 {"alarm", PySignal_Alarm},
215 {"signal", PySignal_Signal},
216 {"getsignal", PySignal_GetSignal},
217 {"pause", PySignal_Pause},
Guido van Rossum95588251995-01-07 11:50:04 +0000218 {"default_int_handler", PySignal_CDefaultIntHandler},
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000219 {NULL, NULL} /* sentinel */
220};
221
222void
223initsignal()
224{
Guido van Rossume4485b01994-09-07 14:32:49 +0000225 PyObject *m, *d, *x;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000226 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000227
228#ifdef WITH_THREAD
229 main_thread = get_thread_ident();
230 main_pid = getpid();
231#endif
232
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000233 /* Create the module and add the functions */
Guido van Rossume4485b01994-09-07 14:32:49 +0000234 m = Py_InitModule("signal", PySignal_methods);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000235
236 /* Add some symbolic constants to the module */
Guido van Rossume4485b01994-09-07 14:32:49 +0000237 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000238
Guido van Rossume4485b01994-09-07 14:32:49 +0000239 PySignal_SignalDefaultHandler = PyInt_FromLong((long)SIG_DFL);
240 PyDict_SetItemString(d, "SIG_DFL", PySignal_SignalDefaultHandler);
241 PySignal_SignalIgnoreHandler = PyInt_FromLong((long)SIG_IGN);
242 PyDict_SetItemString(d, "SIG_IGN", PySignal_SignalIgnoreHandler);
243 PyDict_SetItemString(d, "NSIG", PyInt_FromLong((long)NSIG));
Guido van Rossum95588251995-01-07 11:50:04 +0000244 PySignal_DefaultIntHandler =
245 PyDict_GetItemString(d, "default_int_handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000246
Guido van Rossume4485b01994-09-07 14:32:49 +0000247 PySignal_SignalHandlerArray[0].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000248 for (i = 1; i < NSIG; i++) {
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000249 RETSIGTYPE (*t)();
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000250 t = signal(i, SIG_IGN);
251 signal(i, t);
Guido van Rossume4485b01994-09-07 14:32:49 +0000252 PySignal_SignalHandlerArray[i].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000253 if (t == SIG_DFL)
Guido van Rossume4485b01994-09-07 14:32:49 +0000254 PySignal_SignalHandlerArray[i].func = PySignal_SignalDefaultHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000255 else if (t == SIG_IGN)
Guido van Rossume4485b01994-09-07 14:32:49 +0000256 PySignal_SignalHandlerArray[i].func = PySignal_SignalIgnoreHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000257 else
Guido van Rossume4485b01994-09-07 14:32:49 +0000258 PySignal_SignalHandlerArray[i].func = Py_None; /* None of our business */
259 Py_INCREF(PySignal_SignalHandlerArray[i].func);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000260 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000261 if (PySignal_SignalHandlerArray[SIGINT].func == PySignal_SignalDefaultHandler) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000262 /* Install default int handler */
Guido van Rossume4485b01994-09-07 14:32:49 +0000263 Py_DECREF(PySignal_SignalHandlerArray[SIGINT].func);
264 PySignal_SignalHandlerArray[SIGINT].func = PySignal_DefaultIntHandler;
265 Py_INCREF(PySignal_DefaultIntHandler);
266 signal(SIGINT, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000267 }
268
269#ifdef SIGHUP
Guido van Rossume4485b01994-09-07 14:32:49 +0000270 x = PyInt_FromLong(SIGHUP);
271 PyDict_SetItemString(d, "SIGHUP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000272#endif
273#ifdef SIGINT
Guido van Rossume4485b01994-09-07 14:32:49 +0000274 x = PyInt_FromLong(SIGINT);
275 PyDict_SetItemString(d, "SIGINT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000276#endif
277#ifdef SIGQUIT
Guido van Rossume4485b01994-09-07 14:32:49 +0000278 x = PyInt_FromLong(SIGQUIT);
279 PyDict_SetItemString(d, "SIGQUIT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000280#endif
281#ifdef SIGILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000282 x = PyInt_FromLong(SIGILL);
283 PyDict_SetItemString(d, "SIGILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000284#endif
285#ifdef SIGTRAP
Guido van Rossume4485b01994-09-07 14:32:49 +0000286 x = PyInt_FromLong(SIGTRAP);
287 PyDict_SetItemString(d, "SIGTRAP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000288#endif
289#ifdef SIGIOT
Guido van Rossume4485b01994-09-07 14:32:49 +0000290 x = PyInt_FromLong(SIGIOT);
291 PyDict_SetItemString(d, "SIGIOT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000292#endif
293#ifdef SIGABRT
Guido van Rossume4485b01994-09-07 14:32:49 +0000294 x = PyInt_FromLong(SIGABRT);
295 PyDict_SetItemString(d, "SIGABRT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000296#endif
297#ifdef SIGEMT
Guido van Rossume4485b01994-09-07 14:32:49 +0000298 x = PyInt_FromLong(SIGEMT);
299 PyDict_SetItemString(d, "SIGEMT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000300#endif
301#ifdef SIGFPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000302 x = PyInt_FromLong(SIGFPE);
303 PyDict_SetItemString(d, "SIGFPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000304#endif
305#ifdef SIGKILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000306 x = PyInt_FromLong(SIGKILL);
307 PyDict_SetItemString(d, "SIGKILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000308#endif
309#ifdef SIGBUS
Guido van Rossume4485b01994-09-07 14:32:49 +0000310 x = PyInt_FromLong(SIGBUS);
311 PyDict_SetItemString(d, "SIGBUS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000312#endif
313#ifdef SIGSEGV
Guido van Rossume4485b01994-09-07 14:32:49 +0000314 x = PyInt_FromLong(SIGSEGV);
315 PyDict_SetItemString(d, "SIGSEGV", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000316#endif
317#ifdef SIGSYS
Guido van Rossume4485b01994-09-07 14:32:49 +0000318 x = PyInt_FromLong(SIGSYS);
319 PyDict_SetItemString(d, "SIGSYS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000320#endif
321#ifdef SIGPIPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000322 x = PyInt_FromLong(SIGPIPE);
323 PyDict_SetItemString(d, "SIGPIPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000324#endif
325#ifdef SIGALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000326 x = PyInt_FromLong(SIGALRM);
327 PyDict_SetItemString(d, "SIGALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000328#endif
329#ifdef SIGTERM
Guido van Rossume4485b01994-09-07 14:32:49 +0000330 x = PyInt_FromLong(SIGTERM);
331 PyDict_SetItemString(d, "SIGTERM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000332#endif
333#ifdef SIGUSR1
Guido van Rossume4485b01994-09-07 14:32:49 +0000334 x = PyInt_FromLong(SIGUSR1);
335 PyDict_SetItemString(d, "SIGUSR1", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000336#endif
337#ifdef SIGUSR2
Guido van Rossume4485b01994-09-07 14:32:49 +0000338 x = PyInt_FromLong(SIGUSR2);
339 PyDict_SetItemString(d, "SIGUSR2", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000340#endif
341#ifdef SIGCLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000342 x = PyInt_FromLong(SIGCLD);
343 PyDict_SetItemString(d, "SIGCLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000344#endif
345#ifdef SIGCHLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000346 x = PyInt_FromLong(SIGCHLD);
347 PyDict_SetItemString(d, "SIGCHLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000348#endif
349#ifdef SIGPWR
Guido van Rossume4485b01994-09-07 14:32:49 +0000350 x = PyInt_FromLong(SIGPWR);
351 PyDict_SetItemString(d, "SIGPWR", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000352#endif
353#ifdef SIGIO
Guido van Rossume4485b01994-09-07 14:32:49 +0000354 x = PyInt_FromLong(SIGIO);
355 PyDict_SetItemString(d, "SIGIO", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000356#endif
357#ifdef SIGURG
Guido van Rossume4485b01994-09-07 14:32:49 +0000358 x = PyInt_FromLong(SIGURG);
359 PyDict_SetItemString(d, "SIGURG", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000360#endif
361#ifdef SIGWINCH
Guido van Rossume4485b01994-09-07 14:32:49 +0000362 x = PyInt_FromLong(SIGWINCH);
363 PyDict_SetItemString(d, "SIGWINCH", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000364#endif
365#ifdef SIGPOLL
Guido van Rossume4485b01994-09-07 14:32:49 +0000366 x = PyInt_FromLong(SIGPOLL);
367 PyDict_SetItemString(d, "SIGPOLL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000368#endif
369#ifdef SIGSTOP
Guido van Rossume4485b01994-09-07 14:32:49 +0000370 x = PyInt_FromLong(SIGSTOP);
371 PyDict_SetItemString(d, "SIGSTOP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000372#endif
373#ifdef SIGTSTP
Guido van Rossume4485b01994-09-07 14:32:49 +0000374 x = PyInt_FromLong(SIGTSTP);
375 PyDict_SetItemString(d, "SIGTSTP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000376#endif
377#ifdef SIGCONT
Guido van Rossume4485b01994-09-07 14:32:49 +0000378 x = PyInt_FromLong(SIGCONT);
379 PyDict_SetItemString(d, "SIGCONT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000380#endif
381#ifdef SIGTTIN
Guido van Rossume4485b01994-09-07 14:32:49 +0000382 x = PyInt_FromLong(SIGTTIN);
383 PyDict_SetItemString(d, "SIGTTIN", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000384#endif
385#ifdef SIGTTOU
Guido van Rossume4485b01994-09-07 14:32:49 +0000386 x = PyInt_FromLong(SIGTTOU);
387 PyDict_SetItemString(d, "SIGTTOU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000388#endif
389#ifdef SIGVTALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000390 x = PyInt_FromLong(SIGVTALRM);
391 PyDict_SetItemString(d, "SIGVTALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000392#endif
393#ifdef SIGPROF
Guido van Rossume4485b01994-09-07 14:32:49 +0000394 x = PyInt_FromLong(SIGPROF);
395 PyDict_SetItemString(d, "SIGPROF", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000396#endif
397#ifdef SIGCPU
Guido van Rossume4485b01994-09-07 14:32:49 +0000398 x = PyInt_FromLong(SIGCPU);
399 PyDict_SetItemString(d, "SIGCPU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000400#endif
401#ifdef SIGFSZ
Guido van Rossume4485b01994-09-07 14:32:49 +0000402 x = PyInt_FromLong(SIGFSZ);
403 PyDict_SetItemString(d, "SIGFSZ", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000404#endif
405 /* Check for errors */
Guido van Rossume4485b01994-09-07 14:32:49 +0000406 if (PyErr_Occurred())
407 Py_FatalError("can't initialize module signal");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000408}
409
410int
411sigcheck()
412{
413 int i;
Guido van Rossume4485b01994-09-07 14:32:49 +0000414 PyObject *f;
415 if (!PySignal_IsTripped)
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000416 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000417#ifdef WITH_THREAD
418 if (get_thread_ident() != main_thread)
419 return 0;
420#endif
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000421 f = getframe();
Guido van Rossume4485b01994-09-07 14:32:49 +0000422 if (f == (PyObject *)NULL)
423 f = Py_None;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000424 for (i = 1; i < NSIG; i++) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000425 if (PySignal_SignalHandlerArray[i].tripped) {
426 PyObject *arglist, *result;
427 PySignal_SignalHandlerArray[i].tripped = 0;
428 arglist = Py_BuildValue("(iO)", i, f);
429 if (arglist == (PyObject *)NULL)
430 result = (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000431 else {
Guido van Rossume4485b01994-09-07 14:32:49 +0000432 result = PyEval_CallObject(PySignal_SignalHandlerArray[i].func,arglist);
433 Py_DECREF(arglist);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000434 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000435 if (result == (PyObject *)NULL) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000436 return 1;
437 } else {
Guido van Rossume4485b01994-09-07 14:32:49 +0000438 Py_DECREF(result);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000439 }
440 }
441 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000442 PySignal_IsTripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000443 return 0;
444}
445
446/* Replacement for intrcheck.c functionality */
447
448void
449initintr()
450{
451 initsignal();
452}
453
454int
455intrcheck()
456{
Guido van Rossume4485b01994-09-07 14:32:49 +0000457 if (PySignal_SignalHandlerArray[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000458#ifdef WITH_THREAD
459 if (get_thread_ident() != main_thread)
460 return 0;
461#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000462 PySignal_SignalHandlerArray[SIGINT].tripped = 0;
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000463 return 1;
464 }
465 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000466}