blob: 9e7f2396442318aa884745836752d88ca34afbad [file] [log] [blame]
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum398d9fe1994-05-11 08:59:13 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum398d9fe1994-05-11 08:59:13 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum398d9fe1994-05-11 08:59:13 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum398d9fe1994-05-11 08:59:13 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum398d9fe1994-05-11 08:59:13 +000029
30******************************************************************/
31
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000032/* Signal module -- many thanks to Lance Ellinghaus */
Guido van Rossum398d9fe1994-05-11 08:59:13 +000033
Guido van Rossum602099a1994-09-14 13:32:22 +000034#include "Python.h"
Guido van Rossum398d9fe1994-05-11 08:59:13 +000035#include "intrcheck.h"
36
Guido van Rossuma376cc51996-12-05 23:43:35 +000037#ifdef HAVE_UNISTD_H
38#include <unistd.h>
39#endif
40
Guido van Rossum398d9fe1994-05-11 08:59:13 +000041#include <signal.h>
42
Guido van Rossumbb4ba121994-06-23 11:25:45 +000043#ifndef SIG_ERR
44#define SIG_ERR ((RETSIGTYPE (*)())-1)
45#endif
46
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000047#ifndef NSIG
48#define NSIG (_SIGMAX + 1) /* For QNX */
49#endif
50
51
Guido van Rossumbb4ba121994-06-23 11:25:45 +000052/*
53 NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
54
55 When threads are supported, we want the following semantics:
56
57 - only the main thread can set a signal handler
58 - any thread can get a signal handler
59 - signals are only delivered to the main thread
60
61 I.e. we don't support "synchronous signals" like SIGFPE (catching
62 this doesn't make much sense in Python anyway) nor do we support
63 signals as a means of inter-thread communication, since not all
64 thread implementations support that (at least our thread library
65 doesn't).
66
67 We still have the problem that in some implementations signals
68 generated by the keyboard (e.g. SIGINT) are delivered to all
69 threads (e.g. SGI), while in others (e.g. Solaris) such signals are
70 delivered to one random thread (an intermediate possibility would
Guido van Rossuma3c04b01995-01-12 11:29:01 +000071 be to deliver it to the main thread -- POSIX?). For now, we have
Guido van Rossumbb4ba121994-06-23 11:25:45 +000072 a working implementation that works in all three cases -- the
73 handler ignores signals if getpid() isn't the same as in the main
74 thread. XXX This is a hack.
75
76*/
77
78#ifdef WITH_THREAD
79#include "thread.h"
80static long main_thread;
81static pid_t main_pid;
82#endif
83
Guido van Rossume4485b01994-09-07 14:32:49 +000084struct PySignal_SignalArrayStruct {
Guido van Rossum398d9fe1994-05-11 08:59:13 +000085 int tripped;
Guido van Rossume4485b01994-09-07 14:32:49 +000086 PyObject *func;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000087};
88
Guido van Rossume4485b01994-09-07 14:32:49 +000089static struct PySignal_SignalArrayStruct PySignal_SignalHandlerArray[NSIG];
90static int PySignal_IsTripped = 0; /* Speed up sigcheck() when none tripped */
Guido van Rossum398d9fe1994-05-11 08:59:13 +000091
Guido van Rossume4485b01994-09-07 14:32:49 +000092static PyObject *PySignal_SignalDefaultHandler;
93static PyObject *PySignal_SignalIgnoreHandler;
94static PyObject *PySignal_DefaultIntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000095
Guido van Rossume4485b01994-09-07 14:32:49 +000096static PyObject *
97PySignal_CDefaultIntHandler(self, arg)
98 PyObject *self;
99 PyObject *arg;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000100{
Guido van Rossume4485b01994-09-07 14:32:49 +0000101 PyErr_SetNone(PyExc_KeyboardInterrupt);
102 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000103}
104
Guido van Rossum06d511d1995-03-10 15:13:48 +0000105void
106PyErr_SetInterrupt()
107{
108 PySignal_IsTripped++;
109 PySignal_SignalHandlerArray[SIGINT].tripped = 1;
110}
111
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000112static RETSIGTYPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000113PySignal_Handler(sig_num)
114 int sig_num;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000115{
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000116#ifdef WITH_THREAD
117 /* See NOTES section above */
118 if (getpid() == main_pid) {
119#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000120 PySignal_IsTripped++;
121 PySignal_SignalHandlerArray[sig_num].tripped = 1;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000122#ifdef WITH_THREAD
123 }
124#endif
Guido van Rossum602099a1994-09-14 13:32:22 +0000125#ifdef SIGCHLD
126 if (sig_num == SIGCHLD) {
127 /* To avoid infinite recursion, this signal remains
128 reset until explicit re-instated.
129 Don't clear the 'func' field as it is our pointer
130 to the Python handler... */
131 return;
132 }
133#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000134 (void *)signal(sig_num, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000135}
Guido van Rossume4485b01994-09-07 14:32:49 +0000136
Guido van Rossum06d511d1995-03-10 15:13:48 +0000137
138#ifndef DONT_HAVE_SIG_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000139static PyObject *
140PySignal_Alarm(self, args)
141 PyObject *self; /* Not used */
142 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000143{
144 int t;
Guido van Rossume4485b01994-09-07 14:32:49 +0000145 if (!PyArg_Parse(args, "i", &t))
146 return (PyObject *)NULL;
147 /* alarm() returns the number of seconds remaining */
148 return PyInt_FromLong(alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000149}
Guido van Rossum06d511d1995-03-10 15:13:48 +0000150#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000151
Guido van Rossum06d511d1995-03-10 15:13:48 +0000152#ifndef DONT_HAVE_SIG_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000153static PyObject *
Guido van Rossume4485b01994-09-07 14:32:49 +0000154PySignal_Pause(self, args)
155 PyObject *self; /* Not used */
156 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000157{
Guido van Rossume4485b01994-09-07 14:32:49 +0000158 if (!PyArg_NoArgs(args))
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000159 return NULL;
Guido van Rossuma597dde1995-01-10 20:56:29 +0000160 Py_BEGIN_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000161 pause();
Guido van Rossuma597dde1995-01-10 20:56:29 +0000162 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000163 Py_INCREF(Py_None);
164 return Py_None;
165}
Guido van Rossum06d511d1995-03-10 15:13:48 +0000166#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000167
168static PyObject *
169PySignal_Signal(self, args)
170 PyObject *self; /* Not used */
171 PyObject *args;
172{
173 PyObject *obj;
174 int sig_num;
175 PyObject *old_handler;
176 RETSIGTYPE (*func)();
177 if (!PyArg_Parse(args, "(iO)", &sig_num, &obj))
178 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000179#ifdef WITH_THREAD
180 if (get_thread_ident() != main_thread) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000181 PyErr_SetString(PyExc_ValueError,
182 "signal only works in main thread");
Guido van Rossume4485b01994-09-07 14:32:49 +0000183 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000184 }
185#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000186 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000187 PyErr_SetString(PyExc_ValueError,
188 "signal number out of range");
Guido van Rossume4485b01994-09-07 14:32:49 +0000189 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000190 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000191 if (obj == PySignal_SignalIgnoreHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000192 func = SIG_IGN;
Guido van Rossume4485b01994-09-07 14:32:49 +0000193 else if (obj == PySignal_SignalDefaultHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000194 func = SIG_DFL;
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000195 else if (!PyCallable_Check(obj)) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000196 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000197"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Guido van Rossume4485b01994-09-07 14:32:49 +0000198 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000199 }
200 else
Guido van Rossume4485b01994-09-07 14:32:49 +0000201 func = PySignal_Handler;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000202 if (signal(sig_num, func) == SIG_ERR) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000203 PyErr_SetFromErrno(PyExc_RuntimeError);
204 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000205 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000206 old_handler = PySignal_SignalHandlerArray[sig_num].func;
207 PySignal_SignalHandlerArray[sig_num].tripped = 0;
208 Py_INCREF(obj);
209 PySignal_SignalHandlerArray[sig_num].func = obj;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000210 return old_handler;
211}
212
Guido van Rossume4485b01994-09-07 14:32:49 +0000213static PyObject *
214PySignal_GetSignal(self, args)
215 PyObject *self; /* Not used */
216 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000217{
218 int sig_num;
Guido van Rossume4485b01994-09-07 14:32:49 +0000219 PyObject *old_handler;
220 if (!PyArg_Parse(args, "i", &sig_num))
221 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000222 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000223 PyErr_SetString(PyExc_ValueError,
224 "signal number out of range");
Guido van Rossume4485b01994-09-07 14:32:49 +0000225 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000226 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000227 old_handler = PySignal_SignalHandlerArray[sig_num].func;
228 Py_INCREF(old_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000229 return old_handler;
230}
231
232
233/* List of functions defined in the module */
234
Guido van Rossume4485b01994-09-07 14:32:49 +0000235static PyMethodDef PySignal_methods[] = {
Guido van Rossum06d511d1995-03-10 15:13:48 +0000236#ifndef DONT_HAVE_SIG_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000237 {"alarm", PySignal_Alarm},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000238#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000239 {"signal", PySignal_Signal},
240 {"getsignal", PySignal_GetSignal},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000241#ifndef DONT_HAVE_SIG_PAUSE
Guido van Rossume4485b01994-09-07 14:32:49 +0000242 {"pause", PySignal_Pause},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000243#endif
Guido van Rossum95588251995-01-07 11:50:04 +0000244 {"default_int_handler", PySignal_CDefaultIntHandler},
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000245 {NULL, NULL} /* sentinel */
246};
247
248void
249initsignal()
250{
Guido van Rossume4485b01994-09-07 14:32:49 +0000251 PyObject *m, *d, *x;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000252 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000253
254#ifdef WITH_THREAD
255 main_thread = get_thread_ident();
256 main_pid = getpid();
257#endif
258
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000259 /* Create the module and add the functions */
Guido van Rossume4485b01994-09-07 14:32:49 +0000260 m = Py_InitModule("signal", PySignal_methods);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000261
262 /* Add some symbolic constants to the module */
Guido van Rossume4485b01994-09-07 14:32:49 +0000263 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000264
Guido van Rossume4485b01994-09-07 14:32:49 +0000265 PySignal_SignalDefaultHandler = PyInt_FromLong((long)SIG_DFL);
266 PyDict_SetItemString(d, "SIG_DFL", PySignal_SignalDefaultHandler);
267 PySignal_SignalIgnoreHandler = PyInt_FromLong((long)SIG_IGN);
268 PyDict_SetItemString(d, "SIG_IGN", PySignal_SignalIgnoreHandler);
269 PyDict_SetItemString(d, "NSIG", PyInt_FromLong((long)NSIG));
Guido van Rossum95588251995-01-07 11:50:04 +0000270 PySignal_DefaultIntHandler =
271 PyDict_GetItemString(d, "default_int_handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000272
Guido van Rossume4485b01994-09-07 14:32:49 +0000273 PySignal_SignalHandlerArray[0].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000274 for (i = 1; i < NSIG; i++) {
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000275 RETSIGTYPE (*t)();
Guido van Rossumfb0df941996-05-23 22:55:35 +0000276#ifdef HAVE_SIGACTION
277 struct sigaction act;
278 sigaction(i, 0, &act);
Guido van Rossum1835c4f1996-05-29 14:15:19 +0000279 t = act.sa_handler;
Guido van Rossumfb0df941996-05-23 22:55:35 +0000280#else
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000281 t = signal(i, SIG_IGN);
282 signal(i, t);
Guido van Rossumfb0df941996-05-23 22:55:35 +0000283#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000284 PySignal_SignalHandlerArray[i].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000285 if (t == SIG_DFL)
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000286 PySignal_SignalHandlerArray[i].func =
287 PySignal_SignalDefaultHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000288 else if (t == SIG_IGN)
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000289 PySignal_SignalHandlerArray[i].func =
290 PySignal_SignalIgnoreHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000291 else
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000292 PySignal_SignalHandlerArray[i].func =
293 Py_None; /* None of our business */
Guido van Rossume4485b01994-09-07 14:32:49 +0000294 Py_INCREF(PySignal_SignalHandlerArray[i].func);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000295 }
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000296 if (PySignal_SignalHandlerArray[SIGINT].func ==
297 PySignal_SignalDefaultHandler) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000298 /* Install default int handler */
Guido van Rossume4485b01994-09-07 14:32:49 +0000299 Py_DECREF(PySignal_SignalHandlerArray[SIGINT].func);
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000300 PySignal_SignalHandlerArray[SIGINT].func =
301 PySignal_DefaultIntHandler;
Guido van Rossume4485b01994-09-07 14:32:49 +0000302 Py_INCREF(PySignal_DefaultIntHandler);
303 signal(SIGINT, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000304 }
305
306#ifdef SIGHUP
Guido van Rossume4485b01994-09-07 14:32:49 +0000307 x = PyInt_FromLong(SIGHUP);
308 PyDict_SetItemString(d, "SIGHUP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000309#endif
310#ifdef SIGINT
Guido van Rossume4485b01994-09-07 14:32:49 +0000311 x = PyInt_FromLong(SIGINT);
312 PyDict_SetItemString(d, "SIGINT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000313#endif
314#ifdef SIGQUIT
Guido van Rossume4485b01994-09-07 14:32:49 +0000315 x = PyInt_FromLong(SIGQUIT);
316 PyDict_SetItemString(d, "SIGQUIT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000317#endif
318#ifdef SIGILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000319 x = PyInt_FromLong(SIGILL);
320 PyDict_SetItemString(d, "SIGILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000321#endif
322#ifdef SIGTRAP
Guido van Rossume4485b01994-09-07 14:32:49 +0000323 x = PyInt_FromLong(SIGTRAP);
324 PyDict_SetItemString(d, "SIGTRAP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000325#endif
326#ifdef SIGIOT
Guido van Rossume4485b01994-09-07 14:32:49 +0000327 x = PyInt_FromLong(SIGIOT);
328 PyDict_SetItemString(d, "SIGIOT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000329#endif
330#ifdef SIGABRT
Guido van Rossume4485b01994-09-07 14:32:49 +0000331 x = PyInt_FromLong(SIGABRT);
332 PyDict_SetItemString(d, "SIGABRT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000333#endif
334#ifdef SIGEMT
Guido van Rossume4485b01994-09-07 14:32:49 +0000335 x = PyInt_FromLong(SIGEMT);
336 PyDict_SetItemString(d, "SIGEMT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000337#endif
338#ifdef SIGFPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000339 x = PyInt_FromLong(SIGFPE);
340 PyDict_SetItemString(d, "SIGFPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000341#endif
342#ifdef SIGKILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000343 x = PyInt_FromLong(SIGKILL);
344 PyDict_SetItemString(d, "SIGKILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000345#endif
346#ifdef SIGBUS
Guido van Rossume4485b01994-09-07 14:32:49 +0000347 x = PyInt_FromLong(SIGBUS);
348 PyDict_SetItemString(d, "SIGBUS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000349#endif
350#ifdef SIGSEGV
Guido van Rossume4485b01994-09-07 14:32:49 +0000351 x = PyInt_FromLong(SIGSEGV);
352 PyDict_SetItemString(d, "SIGSEGV", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000353#endif
354#ifdef SIGSYS
Guido van Rossume4485b01994-09-07 14:32:49 +0000355 x = PyInt_FromLong(SIGSYS);
356 PyDict_SetItemString(d, "SIGSYS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000357#endif
358#ifdef SIGPIPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000359 x = PyInt_FromLong(SIGPIPE);
360 PyDict_SetItemString(d, "SIGPIPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000361#endif
362#ifdef SIGALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000363 x = PyInt_FromLong(SIGALRM);
364 PyDict_SetItemString(d, "SIGALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000365#endif
366#ifdef SIGTERM
Guido van Rossume4485b01994-09-07 14:32:49 +0000367 x = PyInt_FromLong(SIGTERM);
368 PyDict_SetItemString(d, "SIGTERM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000369#endif
370#ifdef SIGUSR1
Guido van Rossume4485b01994-09-07 14:32:49 +0000371 x = PyInt_FromLong(SIGUSR1);
372 PyDict_SetItemString(d, "SIGUSR1", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000373#endif
374#ifdef SIGUSR2
Guido van Rossume4485b01994-09-07 14:32:49 +0000375 x = PyInt_FromLong(SIGUSR2);
376 PyDict_SetItemString(d, "SIGUSR2", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000377#endif
378#ifdef SIGCLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000379 x = PyInt_FromLong(SIGCLD);
380 PyDict_SetItemString(d, "SIGCLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000381#endif
382#ifdef SIGCHLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000383 x = PyInt_FromLong(SIGCHLD);
384 PyDict_SetItemString(d, "SIGCHLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000385#endif
386#ifdef SIGPWR
Guido van Rossume4485b01994-09-07 14:32:49 +0000387 x = PyInt_FromLong(SIGPWR);
388 PyDict_SetItemString(d, "SIGPWR", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000389#endif
390#ifdef SIGIO
Guido van Rossume4485b01994-09-07 14:32:49 +0000391 x = PyInt_FromLong(SIGIO);
392 PyDict_SetItemString(d, "SIGIO", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000393#endif
394#ifdef SIGURG
Guido van Rossume4485b01994-09-07 14:32:49 +0000395 x = PyInt_FromLong(SIGURG);
396 PyDict_SetItemString(d, "SIGURG", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000397#endif
398#ifdef SIGWINCH
Guido van Rossume4485b01994-09-07 14:32:49 +0000399 x = PyInt_FromLong(SIGWINCH);
400 PyDict_SetItemString(d, "SIGWINCH", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000401#endif
402#ifdef SIGPOLL
Guido van Rossume4485b01994-09-07 14:32:49 +0000403 x = PyInt_FromLong(SIGPOLL);
404 PyDict_SetItemString(d, "SIGPOLL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000405#endif
406#ifdef SIGSTOP
Guido van Rossume4485b01994-09-07 14:32:49 +0000407 x = PyInt_FromLong(SIGSTOP);
408 PyDict_SetItemString(d, "SIGSTOP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000409#endif
410#ifdef SIGTSTP
Guido van Rossume4485b01994-09-07 14:32:49 +0000411 x = PyInt_FromLong(SIGTSTP);
412 PyDict_SetItemString(d, "SIGTSTP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000413#endif
414#ifdef SIGCONT
Guido van Rossume4485b01994-09-07 14:32:49 +0000415 x = PyInt_FromLong(SIGCONT);
416 PyDict_SetItemString(d, "SIGCONT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000417#endif
418#ifdef SIGTTIN
Guido van Rossume4485b01994-09-07 14:32:49 +0000419 x = PyInt_FromLong(SIGTTIN);
420 PyDict_SetItemString(d, "SIGTTIN", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000421#endif
422#ifdef SIGTTOU
Guido van Rossume4485b01994-09-07 14:32:49 +0000423 x = PyInt_FromLong(SIGTTOU);
424 PyDict_SetItemString(d, "SIGTTOU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000425#endif
426#ifdef SIGVTALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000427 x = PyInt_FromLong(SIGVTALRM);
428 PyDict_SetItemString(d, "SIGVTALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000429#endif
430#ifdef SIGPROF
Guido van Rossume4485b01994-09-07 14:32:49 +0000431 x = PyInt_FromLong(SIGPROF);
432 PyDict_SetItemString(d, "SIGPROF", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000433#endif
434#ifdef SIGCPU
Guido van Rossume4485b01994-09-07 14:32:49 +0000435 x = PyInt_FromLong(SIGCPU);
436 PyDict_SetItemString(d, "SIGCPU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000437#endif
438#ifdef SIGFSZ
Guido van Rossume4485b01994-09-07 14:32:49 +0000439 x = PyInt_FromLong(SIGFSZ);
440 PyDict_SetItemString(d, "SIGFSZ", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000441#endif
442 /* Check for errors */
Guido van Rossume4485b01994-09-07 14:32:49 +0000443 if (PyErr_Occurred())
444 Py_FatalError("can't initialize module signal");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000445}
446
447int
Guido van Rossumec25b911995-01-22 00:46:57 +0000448PyErr_CheckSignals()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000449{
450 int i;
Guido van Rossume4485b01994-09-07 14:32:49 +0000451 PyObject *f;
452 if (!PySignal_IsTripped)
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000453 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000454#ifdef WITH_THREAD
455 if (get_thread_ident() != main_thread)
456 return 0;
457#endif
Guido van Rossuma597dde1995-01-10 20:56:29 +0000458 f = PyEval_GetFrame();
Guido van Rossume4485b01994-09-07 14:32:49 +0000459 if (f == (PyObject *)NULL)
460 f = Py_None;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000461 for (i = 1; i < NSIG; i++) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000462 if (PySignal_SignalHandlerArray[i].tripped) {
463 PyObject *arglist, *result;
464 PySignal_SignalHandlerArray[i].tripped = 0;
465 arglist = Py_BuildValue("(iO)", i, f);
466 if (arglist == (PyObject *)NULL)
467 result = (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000468 else {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000469 result = PyEval_CallObject(
470 PySignal_SignalHandlerArray[i].func, arglist);
Guido van Rossume4485b01994-09-07 14:32:49 +0000471 Py_DECREF(arglist);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000472 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000473 if (result == (PyObject *)NULL) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000474 return 1;
475 } else {
Guido van Rossume4485b01994-09-07 14:32:49 +0000476 Py_DECREF(result);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000477 }
478 }
479 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000480 PySignal_IsTripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000481 return 0;
482}
483
484/* Replacement for intrcheck.c functionality */
485
486void
Guido van Rossuma597dde1995-01-10 20:56:29 +0000487PyOS_InitInterrupts ()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000488{
489 initsignal();
490}
491
492int
Guido van Rossuma597dde1995-01-10 20:56:29 +0000493PyOS_InterruptOccurred ()
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000494{
Guido van Rossume4485b01994-09-07 14:32:49 +0000495 if (PySignal_SignalHandlerArray[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000496#ifdef WITH_THREAD
497 if (get_thread_ident() != main_thread)
498 return 0;
499#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000500 PySignal_SignalHandlerArray[SIGINT].tripped = 0;
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000501 return 1;
502 }
503 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000504}