blob: 48eb03d1c8e54ab7ac055808411c79507cfd8355 [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
37#include <signal.h>
38
Guido van Rossumbb4ba121994-06-23 11:25:45 +000039#ifndef SIG_ERR
40#define SIG_ERR ((RETSIGTYPE (*)())-1)
41#endif
42
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000043#ifndef NSIG
44#define NSIG (_SIGMAX + 1) /* For QNX */
45#endif
46
47
Guido van Rossumbb4ba121994-06-23 11:25:45 +000048/*
49 NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
50
51 When threads are supported, we want the following semantics:
52
53 - only the main thread can set a signal handler
54 - any thread can get a signal handler
55 - signals are only delivered to the main thread
56
57 I.e. we don't support "synchronous signals" like SIGFPE (catching
58 this doesn't make much sense in Python anyway) nor do we support
59 signals as a means of inter-thread communication, since not all
60 thread implementations support that (at least our thread library
61 doesn't).
62
63 We still have the problem that in some implementations signals
64 generated by the keyboard (e.g. SIGINT) are delivered to all
65 threads (e.g. SGI), while in others (e.g. Solaris) such signals are
66 delivered to one random thread (an intermediate possibility would
Guido van Rossuma3c04b01995-01-12 11:29:01 +000067 be to deliver it to the main thread -- POSIX?). For now, we have
Guido van Rossumbb4ba121994-06-23 11:25:45 +000068 a working implementation that works in all three cases -- the
69 handler ignores signals if getpid() isn't the same as in the main
70 thread. XXX This is a hack.
71
72*/
73
74#ifdef WITH_THREAD
75#include "thread.h"
76static long main_thread;
77static pid_t main_pid;
78#endif
79
Guido van Rossume4485b01994-09-07 14:32:49 +000080struct PySignal_SignalArrayStruct {
Guido van Rossum398d9fe1994-05-11 08:59:13 +000081 int tripped;
Guido van Rossume4485b01994-09-07 14:32:49 +000082 PyObject *func;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000083};
84
Guido van Rossume4485b01994-09-07 14:32:49 +000085static struct PySignal_SignalArrayStruct PySignal_SignalHandlerArray[NSIG];
86static int PySignal_IsTripped = 0; /* Speed up sigcheck() when none tripped */
Guido van Rossum398d9fe1994-05-11 08:59:13 +000087
Guido van Rossume4485b01994-09-07 14:32:49 +000088static PyObject *PySignal_SignalDefaultHandler;
89static PyObject *PySignal_SignalIgnoreHandler;
90static PyObject *PySignal_DefaultIntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000091
Guido van Rossume4485b01994-09-07 14:32:49 +000092static PyObject *
93PySignal_CDefaultIntHandler(self, arg)
94 PyObject *self;
95 PyObject *arg;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000096{
Guido van Rossume4485b01994-09-07 14:32:49 +000097 PyErr_SetNone(PyExc_KeyboardInterrupt);
98 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000099}
100
Guido van Rossum06d511d1995-03-10 15:13:48 +0000101void
102PyErr_SetInterrupt()
103{
104 PySignal_IsTripped++;
105 PySignal_SignalHandlerArray[SIGINT].tripped = 1;
106}
107
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000108static RETSIGTYPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000109PySignal_Handler(sig_num)
110 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
Guido van Rossume4485b01994-09-07 14:32:49 +0000116 PySignal_IsTripped++;
117 PySignal_SignalHandlerArray[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
Guido van Rossume4485b01994-09-07 14:32:49 +0000130 (void *)signal(sig_num, &PySignal_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
134#ifndef DONT_HAVE_SIG_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000135static PyObject *
136PySignal_Alarm(self, args)
137 PyObject *self; /* Not used */
138 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000139{
140 int t;
Guido van Rossume4485b01994-09-07 14:32:49 +0000141 if (!PyArg_Parse(args, "i", &t))
142 return (PyObject *)NULL;
143 /* alarm() returns the number of seconds remaining */
144 return PyInt_FromLong(alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000145}
Guido van Rossum06d511d1995-03-10 15:13:48 +0000146#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000147
Guido van Rossum06d511d1995-03-10 15:13:48 +0000148#ifndef DONT_HAVE_SIG_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000149static PyObject *
Guido van Rossume4485b01994-09-07 14:32:49 +0000150PySignal_Pause(self, args)
151 PyObject *self; /* Not used */
152 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000153{
Guido van Rossume4485b01994-09-07 14:32:49 +0000154 if (!PyArg_NoArgs(args))
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000155 return NULL;
Guido van Rossuma597dde1995-01-10 20:56:29 +0000156 Py_BEGIN_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000157 pause();
Guido van Rossuma597dde1995-01-10 20:56:29 +0000158 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000159 Py_INCREF(Py_None);
160 return Py_None;
161}
Guido van Rossum06d511d1995-03-10 15:13:48 +0000162#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000163
164static PyObject *
165PySignal_Signal(self, args)
166 PyObject *self; /* Not used */
167 PyObject *args;
168{
169 PyObject *obj;
170 int sig_num;
171 PyObject *old_handler;
172 RETSIGTYPE (*func)();
173 if (!PyArg_Parse(args, "(iO)", &sig_num, &obj))
174 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000175#ifdef WITH_THREAD
176 if (get_thread_ident() != main_thread) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000177 PyErr_SetString(PyExc_ValueError,
178 "signal only works in main thread");
Guido van Rossume4485b01994-09-07 14:32:49 +0000179 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000180 }
181#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000182 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000183 PyErr_SetString(PyExc_ValueError,
184 "signal number out of range");
Guido van Rossume4485b01994-09-07 14:32:49 +0000185 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000186 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000187 if (obj == PySignal_SignalIgnoreHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000188 func = SIG_IGN;
Guido van Rossume4485b01994-09-07 14:32:49 +0000189 else if (obj == PySignal_SignalDefaultHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000190 func = SIG_DFL;
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000191 else if (!PyCallable_Check(obj)) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000192 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000193"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Guido van Rossume4485b01994-09-07 14:32:49 +0000194 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000195 }
196 else
Guido van Rossume4485b01994-09-07 14:32:49 +0000197 func = PySignal_Handler;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000198 if (signal(sig_num, func) == SIG_ERR) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000199 PyErr_SetFromErrno(PyExc_RuntimeError);
200 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000201 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000202 old_handler = PySignal_SignalHandlerArray[sig_num].func;
203 PySignal_SignalHandlerArray[sig_num].tripped = 0;
204 Py_INCREF(obj);
205 PySignal_SignalHandlerArray[sig_num].func = obj;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000206 return old_handler;
207}
208
Guido van Rossume4485b01994-09-07 14:32:49 +0000209static PyObject *
210PySignal_GetSignal(self, args)
211 PyObject *self; /* Not used */
212 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000213{
214 int sig_num;
Guido van Rossume4485b01994-09-07 14:32:49 +0000215 PyObject *old_handler;
216 if (!PyArg_Parse(args, "i", &sig_num))
217 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000218 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000219 PyErr_SetString(PyExc_ValueError,
220 "signal number out of range");
Guido van Rossume4485b01994-09-07 14:32:49 +0000221 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000222 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000223 old_handler = PySignal_SignalHandlerArray[sig_num].func;
224 Py_INCREF(old_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000225 return old_handler;
226}
227
228
229/* List of functions defined in the module */
230
Guido van Rossume4485b01994-09-07 14:32:49 +0000231static PyMethodDef PySignal_methods[] = {
Guido van Rossum06d511d1995-03-10 15:13:48 +0000232#ifndef DONT_HAVE_SIG_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000233 {"alarm", PySignal_Alarm},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000234#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000235 {"signal", PySignal_Signal},
236 {"getsignal", PySignal_GetSignal},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000237#ifndef DONT_HAVE_SIG_PAUSE
Guido van Rossume4485b01994-09-07 14:32:49 +0000238 {"pause", PySignal_Pause},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000239#endif
Guido van Rossum95588251995-01-07 11:50:04 +0000240 {"default_int_handler", PySignal_CDefaultIntHandler},
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000241 {NULL, NULL} /* sentinel */
242};
243
244void
245initsignal()
246{
Guido van Rossume4485b01994-09-07 14:32:49 +0000247 PyObject *m, *d, *x;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000248 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000249
250#ifdef WITH_THREAD
251 main_thread = get_thread_ident();
252 main_pid = getpid();
253#endif
254
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000255 /* Create the module and add the functions */
Guido van Rossume4485b01994-09-07 14:32:49 +0000256 m = Py_InitModule("signal", PySignal_methods);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000257
258 /* Add some symbolic constants to the module */
Guido van Rossume4485b01994-09-07 14:32:49 +0000259 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000260
Guido van Rossume4485b01994-09-07 14:32:49 +0000261 PySignal_SignalDefaultHandler = PyInt_FromLong((long)SIG_DFL);
262 PyDict_SetItemString(d, "SIG_DFL", PySignal_SignalDefaultHandler);
263 PySignal_SignalIgnoreHandler = PyInt_FromLong((long)SIG_IGN);
264 PyDict_SetItemString(d, "SIG_IGN", PySignal_SignalIgnoreHandler);
265 PyDict_SetItemString(d, "NSIG", PyInt_FromLong((long)NSIG));
Guido van Rossum95588251995-01-07 11:50:04 +0000266 PySignal_DefaultIntHandler =
267 PyDict_GetItemString(d, "default_int_handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000268
Guido van Rossume4485b01994-09-07 14:32:49 +0000269 PySignal_SignalHandlerArray[0].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000270 for (i = 1; i < NSIG; i++) {
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000271 RETSIGTYPE (*t)();
Guido van Rossumfb0df941996-05-23 22:55:35 +0000272#ifdef HAVE_SIGACTION
273 struct sigaction act;
274 sigaction(i, 0, &act);
Guido van Rossum1835c4f1996-05-29 14:15:19 +0000275 t = act.sa_handler;
Guido van Rossumfb0df941996-05-23 22:55:35 +0000276#else
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000277 t = signal(i, SIG_IGN);
278 signal(i, t);
Guido van Rossumfb0df941996-05-23 22:55:35 +0000279#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000280 PySignal_SignalHandlerArray[i].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000281 if (t == SIG_DFL)
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000282 PySignal_SignalHandlerArray[i].func =
283 PySignal_SignalDefaultHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000284 else if (t == SIG_IGN)
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000285 PySignal_SignalHandlerArray[i].func =
286 PySignal_SignalIgnoreHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000287 else
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000288 PySignal_SignalHandlerArray[i].func =
289 Py_None; /* None of our business */
Guido van Rossume4485b01994-09-07 14:32:49 +0000290 Py_INCREF(PySignal_SignalHandlerArray[i].func);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000291 }
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000292 if (PySignal_SignalHandlerArray[SIGINT].func ==
293 PySignal_SignalDefaultHandler) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000294 /* Install default int handler */
Guido van Rossume4485b01994-09-07 14:32:49 +0000295 Py_DECREF(PySignal_SignalHandlerArray[SIGINT].func);
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000296 PySignal_SignalHandlerArray[SIGINT].func =
297 PySignal_DefaultIntHandler;
Guido van Rossume4485b01994-09-07 14:32:49 +0000298 Py_INCREF(PySignal_DefaultIntHandler);
299 signal(SIGINT, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000300 }
301
302#ifdef SIGHUP
Guido van Rossume4485b01994-09-07 14:32:49 +0000303 x = PyInt_FromLong(SIGHUP);
304 PyDict_SetItemString(d, "SIGHUP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000305#endif
306#ifdef SIGINT
Guido van Rossume4485b01994-09-07 14:32:49 +0000307 x = PyInt_FromLong(SIGINT);
308 PyDict_SetItemString(d, "SIGINT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000309#endif
310#ifdef SIGQUIT
Guido van Rossume4485b01994-09-07 14:32:49 +0000311 x = PyInt_FromLong(SIGQUIT);
312 PyDict_SetItemString(d, "SIGQUIT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000313#endif
314#ifdef SIGILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000315 x = PyInt_FromLong(SIGILL);
316 PyDict_SetItemString(d, "SIGILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000317#endif
318#ifdef SIGTRAP
Guido van Rossume4485b01994-09-07 14:32:49 +0000319 x = PyInt_FromLong(SIGTRAP);
320 PyDict_SetItemString(d, "SIGTRAP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000321#endif
322#ifdef SIGIOT
Guido van Rossume4485b01994-09-07 14:32:49 +0000323 x = PyInt_FromLong(SIGIOT);
324 PyDict_SetItemString(d, "SIGIOT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000325#endif
326#ifdef SIGABRT
Guido van Rossume4485b01994-09-07 14:32:49 +0000327 x = PyInt_FromLong(SIGABRT);
328 PyDict_SetItemString(d, "SIGABRT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000329#endif
330#ifdef SIGEMT
Guido van Rossume4485b01994-09-07 14:32:49 +0000331 x = PyInt_FromLong(SIGEMT);
332 PyDict_SetItemString(d, "SIGEMT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000333#endif
334#ifdef SIGFPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000335 x = PyInt_FromLong(SIGFPE);
336 PyDict_SetItemString(d, "SIGFPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000337#endif
338#ifdef SIGKILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000339 x = PyInt_FromLong(SIGKILL);
340 PyDict_SetItemString(d, "SIGKILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000341#endif
342#ifdef SIGBUS
Guido van Rossume4485b01994-09-07 14:32:49 +0000343 x = PyInt_FromLong(SIGBUS);
344 PyDict_SetItemString(d, "SIGBUS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000345#endif
346#ifdef SIGSEGV
Guido van Rossume4485b01994-09-07 14:32:49 +0000347 x = PyInt_FromLong(SIGSEGV);
348 PyDict_SetItemString(d, "SIGSEGV", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000349#endif
350#ifdef SIGSYS
Guido van Rossume4485b01994-09-07 14:32:49 +0000351 x = PyInt_FromLong(SIGSYS);
352 PyDict_SetItemString(d, "SIGSYS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000353#endif
354#ifdef SIGPIPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000355 x = PyInt_FromLong(SIGPIPE);
356 PyDict_SetItemString(d, "SIGPIPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000357#endif
358#ifdef SIGALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000359 x = PyInt_FromLong(SIGALRM);
360 PyDict_SetItemString(d, "SIGALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000361#endif
362#ifdef SIGTERM
Guido van Rossume4485b01994-09-07 14:32:49 +0000363 x = PyInt_FromLong(SIGTERM);
364 PyDict_SetItemString(d, "SIGTERM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000365#endif
366#ifdef SIGUSR1
Guido van Rossume4485b01994-09-07 14:32:49 +0000367 x = PyInt_FromLong(SIGUSR1);
368 PyDict_SetItemString(d, "SIGUSR1", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000369#endif
370#ifdef SIGUSR2
Guido van Rossume4485b01994-09-07 14:32:49 +0000371 x = PyInt_FromLong(SIGUSR2);
372 PyDict_SetItemString(d, "SIGUSR2", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000373#endif
374#ifdef SIGCLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000375 x = PyInt_FromLong(SIGCLD);
376 PyDict_SetItemString(d, "SIGCLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000377#endif
378#ifdef SIGCHLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000379 x = PyInt_FromLong(SIGCHLD);
380 PyDict_SetItemString(d, "SIGCHLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000381#endif
382#ifdef SIGPWR
Guido van Rossume4485b01994-09-07 14:32:49 +0000383 x = PyInt_FromLong(SIGPWR);
384 PyDict_SetItemString(d, "SIGPWR", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000385#endif
386#ifdef SIGIO
Guido van Rossume4485b01994-09-07 14:32:49 +0000387 x = PyInt_FromLong(SIGIO);
388 PyDict_SetItemString(d, "SIGIO", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000389#endif
390#ifdef SIGURG
Guido van Rossume4485b01994-09-07 14:32:49 +0000391 x = PyInt_FromLong(SIGURG);
392 PyDict_SetItemString(d, "SIGURG", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000393#endif
394#ifdef SIGWINCH
Guido van Rossume4485b01994-09-07 14:32:49 +0000395 x = PyInt_FromLong(SIGWINCH);
396 PyDict_SetItemString(d, "SIGWINCH", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000397#endif
398#ifdef SIGPOLL
Guido van Rossume4485b01994-09-07 14:32:49 +0000399 x = PyInt_FromLong(SIGPOLL);
400 PyDict_SetItemString(d, "SIGPOLL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000401#endif
402#ifdef SIGSTOP
Guido van Rossume4485b01994-09-07 14:32:49 +0000403 x = PyInt_FromLong(SIGSTOP);
404 PyDict_SetItemString(d, "SIGSTOP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000405#endif
406#ifdef SIGTSTP
Guido van Rossume4485b01994-09-07 14:32:49 +0000407 x = PyInt_FromLong(SIGTSTP);
408 PyDict_SetItemString(d, "SIGTSTP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000409#endif
410#ifdef SIGCONT
Guido van Rossume4485b01994-09-07 14:32:49 +0000411 x = PyInt_FromLong(SIGCONT);
412 PyDict_SetItemString(d, "SIGCONT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000413#endif
414#ifdef SIGTTIN
Guido van Rossume4485b01994-09-07 14:32:49 +0000415 x = PyInt_FromLong(SIGTTIN);
416 PyDict_SetItemString(d, "SIGTTIN", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000417#endif
418#ifdef SIGTTOU
Guido van Rossume4485b01994-09-07 14:32:49 +0000419 x = PyInt_FromLong(SIGTTOU);
420 PyDict_SetItemString(d, "SIGTTOU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000421#endif
422#ifdef SIGVTALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000423 x = PyInt_FromLong(SIGVTALRM);
424 PyDict_SetItemString(d, "SIGVTALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000425#endif
426#ifdef SIGPROF
Guido van Rossume4485b01994-09-07 14:32:49 +0000427 x = PyInt_FromLong(SIGPROF);
428 PyDict_SetItemString(d, "SIGPROF", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000429#endif
430#ifdef SIGCPU
Guido van Rossume4485b01994-09-07 14:32:49 +0000431 x = PyInt_FromLong(SIGCPU);
432 PyDict_SetItemString(d, "SIGCPU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000433#endif
434#ifdef SIGFSZ
Guido van Rossume4485b01994-09-07 14:32:49 +0000435 x = PyInt_FromLong(SIGFSZ);
436 PyDict_SetItemString(d, "SIGFSZ", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000437#endif
438 /* Check for errors */
Guido van Rossume4485b01994-09-07 14:32:49 +0000439 if (PyErr_Occurred())
440 Py_FatalError("can't initialize module signal");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000441}
442
443int
Guido van Rossumec25b911995-01-22 00:46:57 +0000444PyErr_CheckSignals()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000445{
446 int i;
Guido van Rossume4485b01994-09-07 14:32:49 +0000447 PyObject *f;
448 if (!PySignal_IsTripped)
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000449 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000450#ifdef WITH_THREAD
451 if (get_thread_ident() != main_thread)
452 return 0;
453#endif
Guido van Rossuma597dde1995-01-10 20:56:29 +0000454 f = PyEval_GetFrame();
Guido van Rossume4485b01994-09-07 14:32:49 +0000455 if (f == (PyObject *)NULL)
456 f = Py_None;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000457 for (i = 1; i < NSIG; i++) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000458 if (PySignal_SignalHandlerArray[i].tripped) {
459 PyObject *arglist, *result;
460 PySignal_SignalHandlerArray[i].tripped = 0;
461 arglist = Py_BuildValue("(iO)", i, f);
462 if (arglist == (PyObject *)NULL)
463 result = (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000464 else {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000465 result = PyEval_CallObject(
466 PySignal_SignalHandlerArray[i].func, arglist);
Guido van Rossume4485b01994-09-07 14:32:49 +0000467 Py_DECREF(arglist);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000468 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000469 if (result == (PyObject *)NULL) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000470 return 1;
471 } else {
Guido van Rossume4485b01994-09-07 14:32:49 +0000472 Py_DECREF(result);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000473 }
474 }
475 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000476 PySignal_IsTripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000477 return 0;
478}
479
480/* Replacement for intrcheck.c functionality */
481
482void
Guido van Rossuma597dde1995-01-10 20:56:29 +0000483PyOS_InitInterrupts ()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000484{
485 initsignal();
486}
487
488int
Guido van Rossuma597dde1995-01-10 20:56:29 +0000489PyOS_InterruptOccurred ()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000490{
Guido van Rossume4485b01994-09-07 14:32:49 +0000491 if (PySignal_SignalHandlerArray[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000492#ifdef WITH_THREAD
493 if (get_thread_ident() != main_thread)
494 return 0;
495#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000496 PySignal_SignalHandlerArray[SIGINT].tripped = 0;
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000497 return 1;
498 }
499 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000500}