blob: ed441fd5a288ad6c41d793293d5749886d15fb7c [file] [log] [blame]
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001/***********************************************************
2Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
4
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
25/* Signal module -- many thanks to Lance Ellinghouse */
26
27#include "allobjects.h"
28#include "modsupport.h"
29#include "ceval.h"
30#include "intrcheck.h"
31
32#include <signal.h>
Guido van Rossum6299d1e1994-05-31 12:51:13 +000033#include <errno.h>
Guido van Rossum398d9fe1994-05-11 08:59:13 +000034
Guido van Rossume4485b01994-09-07 14:32:49 +000035#include "rename1.h"
36
Guido van Rossumbb4ba121994-06-23 11:25:45 +000037#ifndef SIG_ERR
38#define SIG_ERR ((RETSIGTYPE (*)())-1)
39#endif
40
41/*
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
60 be to deliver it to the main thread -- POSIX???). For now, we have
61 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 Rossume4485b01994-09-07 14:32:49 +0000107 (void *)signal(sig_num, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000108}
109
Guido van Rossume4485b01994-09-07 14:32:49 +0000110
111static PyObject *
112PySignal_Alarm(self, args)
113 PyObject *self; /* Not used */
114 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000115{
116 int t;
Guido van Rossume4485b01994-09-07 14:32:49 +0000117 int rtn;
118 if (!PyArg_Parse(args, "i", &t))
119 return (PyObject *)NULL;
120 /* alarm() returns the number of seconds remaining */
121 return PyInt_FromLong(alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000122}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000123
124static object *
Guido van Rossume4485b01994-09-07 14:32:49 +0000125PySignal_Pause(self, args)
126 PyObject *self; /* Not used */
127 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000128{
Guido van Rossume4485b01994-09-07 14:32:49 +0000129 if (!PyArg_NoArgs(args))
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000130 return NULL;
Guido van Rossume4485b01994-09-07 14:32:49 +0000131 BGN_SAVE
132 pause();
133 END_SAVE
134 Py_INCREF(Py_None);
135 return Py_None;
136}
137
138static PyObject *
139PySignal_Signal(self, args)
140 PyObject *self; /* Not used */
141 PyObject *args;
142{
143 PyObject *obj;
144 int sig_num;
145 PyObject *old_handler;
146 RETSIGTYPE (*func)();
147 if (!PyArg_Parse(args, "(iO)", &sig_num, &obj))
148 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000149#ifdef WITH_THREAD
150 if (get_thread_ident() != main_thread) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000151 PyErr_SetString(PyExc_ValueError, "signal only works in main thread");
152 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000153 }
154#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000155 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000156 PyErr_SetString(PyExc_ValueError, "signal number out of range");
157 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000158 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000159 if (obj == PySignal_SignalIgnoreHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000160 func = SIG_IGN;
Guido van Rossume4485b01994-09-07 14:32:49 +0000161 else if (obj == PySignal_SignalDefaultHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000162 func = SIG_DFL;
Guido van Rossume4485b01994-09-07 14:32:49 +0000163 else if (!PyCFunction_Check(obj) &&
164 !PyFunction_Check(obj) &&
165 !PyMethod_Check(obj)) {
166 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000167"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Guido van Rossume4485b01994-09-07 14:32:49 +0000168 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000169 }
170 else
Guido van Rossume4485b01994-09-07 14:32:49 +0000171 func = PySignal_Handler;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000172 if (signal(sig_num, func) == SIG_ERR) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000173 PyErr_SetFromErrno(PyExc_RuntimeError);
174 return (PyObject *)NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000175 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000176 old_handler = PySignal_SignalHandlerArray[sig_num].func;
177 PySignal_SignalHandlerArray[sig_num].tripped = 0;
178 Py_INCREF(obj);
179 PySignal_SignalHandlerArray[sig_num].func = obj;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000180 return old_handler;
181}
182
Guido van Rossume4485b01994-09-07 14:32:49 +0000183static PyObject *
184PySignal_GetSignal(self, args)
185 PyObject *self; /* Not used */
186 PyObject *args;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000187{
188 int sig_num;
Guido van Rossume4485b01994-09-07 14:32:49 +0000189 PyObject *old_handler;
190 if (!PyArg_Parse(args, "i", &sig_num))
191 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000192 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000193 PyErr_SetString(PyExc_ValueError, "signal number out of range");
194 return (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000195 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000196 old_handler = PySignal_SignalHandlerArray[sig_num].func;
197 Py_INCREF(old_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000198 return old_handler;
199}
200
201
202/* List of functions defined in the module */
203
Guido van Rossume4485b01994-09-07 14:32:49 +0000204static PyMethodDef PySignal_methods[] = {
205 {"alarm", PySignal_Alarm},
206 {"signal", PySignal_Signal},
207 {"getsignal", PySignal_GetSignal},
208 {"pause", PySignal_Pause},
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000209 {NULL, NULL} /* sentinel */
210};
211
212void
213initsignal()
214{
Guido van Rossume4485b01994-09-07 14:32:49 +0000215 PyObject *m, *d, *x;
216 PyObject *b_dict;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000217 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000218
219#ifdef WITH_THREAD
220 main_thread = get_thread_ident();
221 main_pid = getpid();
222#endif
223
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000224 /* Create the module and add the functions */
Guido van Rossume4485b01994-09-07 14:32:49 +0000225 m = Py_InitModule("signal", PySignal_methods);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000226
227 /* Add some symbolic constants to the module */
Guido van Rossume4485b01994-09-07 14:32:49 +0000228 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000229
Guido van Rossume4485b01994-09-07 14:32:49 +0000230 PySignal_SignalDefaultHandler = PyInt_FromLong((long)SIG_DFL);
231 PyDict_SetItemString(d, "SIG_DFL", PySignal_SignalDefaultHandler);
232 PySignal_SignalIgnoreHandler = PyInt_FromLong((long)SIG_IGN);
233 PyDict_SetItemString(d, "SIG_IGN", PySignal_SignalIgnoreHandler);
234 PyDict_SetItemString(d, "NSIG", PyInt_FromLong((long)NSIG));
235 PySignal_DefaultIntHandler = PyCFunction_New("default_int_handler",
236 PySignal_CDefaultIntHandler,
237 (PyObject *)NULL,
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000238 0);
Guido van Rossume4485b01994-09-07 14:32:49 +0000239 PyDict_SetItemString(d, "default_int_handler", PySignal_DefaultIntHandler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000240
Guido van Rossume4485b01994-09-07 14:32:49 +0000241 PySignal_SignalHandlerArray[0].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000242 for (i = 1; i < NSIG; i++) {
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000243 RETSIGTYPE (*t)();
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000244 t = signal(i, SIG_IGN);
245 signal(i, t);
Guido van Rossume4485b01994-09-07 14:32:49 +0000246 PySignal_SignalHandlerArray[i].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000247 if (t == SIG_DFL)
Guido van Rossume4485b01994-09-07 14:32:49 +0000248 PySignal_SignalHandlerArray[i].func = PySignal_SignalDefaultHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000249 else if (t == SIG_IGN)
Guido van Rossume4485b01994-09-07 14:32:49 +0000250 PySignal_SignalHandlerArray[i].func = PySignal_SignalIgnoreHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000251 else
Guido van Rossume4485b01994-09-07 14:32:49 +0000252 PySignal_SignalHandlerArray[i].func = Py_None; /* None of our business */
253 Py_INCREF(PySignal_SignalHandlerArray[i].func);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000254 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000255 if (PySignal_SignalHandlerArray[SIGINT].func == PySignal_SignalDefaultHandler) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000256 /* Install default int handler */
Guido van Rossume4485b01994-09-07 14:32:49 +0000257 Py_DECREF(PySignal_SignalHandlerArray[SIGINT].func);
258 PySignal_SignalHandlerArray[SIGINT].func = PySignal_DefaultIntHandler;
259 Py_INCREF(PySignal_DefaultIntHandler);
260 signal(SIGINT, &PySignal_Handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000261 }
262
263#ifdef SIGHUP
Guido van Rossume4485b01994-09-07 14:32:49 +0000264 x = PyInt_FromLong(SIGHUP);
265 PyDict_SetItemString(d, "SIGHUP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000266#endif
267#ifdef SIGINT
Guido van Rossume4485b01994-09-07 14:32:49 +0000268 x = PyInt_FromLong(SIGINT);
269 PyDict_SetItemString(d, "SIGINT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000270#endif
271#ifdef SIGQUIT
Guido van Rossume4485b01994-09-07 14:32:49 +0000272 x = PyInt_FromLong(SIGQUIT);
273 PyDict_SetItemString(d, "SIGQUIT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000274#endif
275#ifdef SIGILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000276 x = PyInt_FromLong(SIGILL);
277 PyDict_SetItemString(d, "SIGILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000278#endif
279#ifdef SIGTRAP
Guido van Rossume4485b01994-09-07 14:32:49 +0000280 x = PyInt_FromLong(SIGTRAP);
281 PyDict_SetItemString(d, "SIGTRAP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000282#endif
283#ifdef SIGIOT
Guido van Rossume4485b01994-09-07 14:32:49 +0000284 x = PyInt_FromLong(SIGIOT);
285 PyDict_SetItemString(d, "SIGIOT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000286#endif
287#ifdef SIGABRT
Guido van Rossume4485b01994-09-07 14:32:49 +0000288 x = PyInt_FromLong(SIGABRT);
289 PyDict_SetItemString(d, "SIGABRT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000290#endif
291#ifdef SIGEMT
Guido van Rossume4485b01994-09-07 14:32:49 +0000292 x = PyInt_FromLong(SIGEMT);
293 PyDict_SetItemString(d, "SIGEMT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000294#endif
295#ifdef SIGFPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000296 x = PyInt_FromLong(SIGFPE);
297 PyDict_SetItemString(d, "SIGFPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000298#endif
299#ifdef SIGKILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000300 x = PyInt_FromLong(SIGKILL);
301 PyDict_SetItemString(d, "SIGKILL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000302#endif
303#ifdef SIGBUS
Guido van Rossume4485b01994-09-07 14:32:49 +0000304 x = PyInt_FromLong(SIGBUS);
305 PyDict_SetItemString(d, "SIGBUS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000306#endif
307#ifdef SIGSEGV
Guido van Rossume4485b01994-09-07 14:32:49 +0000308 x = PyInt_FromLong(SIGSEGV);
309 PyDict_SetItemString(d, "SIGSEGV", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000310#endif
311#ifdef SIGSYS
Guido van Rossume4485b01994-09-07 14:32:49 +0000312 x = PyInt_FromLong(SIGSYS);
313 PyDict_SetItemString(d, "SIGSYS", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000314#endif
315#ifdef SIGPIPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000316 x = PyInt_FromLong(SIGPIPE);
317 PyDict_SetItemString(d, "SIGPIPE", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000318#endif
319#ifdef SIGALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000320 x = PyInt_FromLong(SIGALRM);
321 PyDict_SetItemString(d, "SIGALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000322#endif
323#ifdef SIGTERM
Guido van Rossume4485b01994-09-07 14:32:49 +0000324 x = PyInt_FromLong(SIGTERM);
325 PyDict_SetItemString(d, "SIGTERM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000326#endif
327#ifdef SIGUSR1
Guido van Rossume4485b01994-09-07 14:32:49 +0000328 x = PyInt_FromLong(SIGUSR1);
329 PyDict_SetItemString(d, "SIGUSR1", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000330#endif
331#ifdef SIGUSR2
Guido van Rossume4485b01994-09-07 14:32:49 +0000332 x = PyInt_FromLong(SIGUSR2);
333 PyDict_SetItemString(d, "SIGUSR2", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000334#endif
335#ifdef SIGCLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000336 x = PyInt_FromLong(SIGCLD);
337 PyDict_SetItemString(d, "SIGCLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000338#endif
339#ifdef SIGCHLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000340 x = PyInt_FromLong(SIGCHLD);
341 PyDict_SetItemString(d, "SIGCHLD", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000342#endif
343#ifdef SIGPWR
Guido van Rossume4485b01994-09-07 14:32:49 +0000344 x = PyInt_FromLong(SIGPWR);
345 PyDict_SetItemString(d, "SIGPWR", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000346#endif
347#ifdef SIGIO
Guido van Rossume4485b01994-09-07 14:32:49 +0000348 x = PyInt_FromLong(SIGIO);
349 PyDict_SetItemString(d, "SIGIO", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000350#endif
351#ifdef SIGURG
Guido van Rossume4485b01994-09-07 14:32:49 +0000352 x = PyInt_FromLong(SIGURG);
353 PyDict_SetItemString(d, "SIGURG", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000354#endif
355#ifdef SIGWINCH
Guido van Rossume4485b01994-09-07 14:32:49 +0000356 x = PyInt_FromLong(SIGWINCH);
357 PyDict_SetItemString(d, "SIGWINCH", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000358#endif
359#ifdef SIGPOLL
Guido van Rossume4485b01994-09-07 14:32:49 +0000360 x = PyInt_FromLong(SIGPOLL);
361 PyDict_SetItemString(d, "SIGPOLL", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000362#endif
363#ifdef SIGSTOP
Guido van Rossume4485b01994-09-07 14:32:49 +0000364 x = PyInt_FromLong(SIGSTOP);
365 PyDict_SetItemString(d, "SIGSTOP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000366#endif
367#ifdef SIGTSTP
Guido van Rossume4485b01994-09-07 14:32:49 +0000368 x = PyInt_FromLong(SIGTSTP);
369 PyDict_SetItemString(d, "SIGTSTP", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000370#endif
371#ifdef SIGCONT
Guido van Rossume4485b01994-09-07 14:32:49 +0000372 x = PyInt_FromLong(SIGCONT);
373 PyDict_SetItemString(d, "SIGCONT", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000374#endif
375#ifdef SIGTTIN
Guido van Rossume4485b01994-09-07 14:32:49 +0000376 x = PyInt_FromLong(SIGTTIN);
377 PyDict_SetItemString(d, "SIGTTIN", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000378#endif
379#ifdef SIGTTOU
Guido van Rossume4485b01994-09-07 14:32:49 +0000380 x = PyInt_FromLong(SIGTTOU);
381 PyDict_SetItemString(d, "SIGTTOU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000382#endif
383#ifdef SIGVTALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000384 x = PyInt_FromLong(SIGVTALRM);
385 PyDict_SetItemString(d, "SIGVTALRM", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000386#endif
387#ifdef SIGPROF
Guido van Rossume4485b01994-09-07 14:32:49 +0000388 x = PyInt_FromLong(SIGPROF);
389 PyDict_SetItemString(d, "SIGPROF", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000390#endif
391#ifdef SIGCPU
Guido van Rossume4485b01994-09-07 14:32:49 +0000392 x = PyInt_FromLong(SIGCPU);
393 PyDict_SetItemString(d, "SIGCPU", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000394#endif
395#ifdef SIGFSZ
Guido van Rossume4485b01994-09-07 14:32:49 +0000396 x = PyInt_FromLong(SIGFSZ);
397 PyDict_SetItemString(d, "SIGFSZ", x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000398#endif
399 /* Check for errors */
Guido van Rossume4485b01994-09-07 14:32:49 +0000400 if (PyErr_Occurred())
401 Py_FatalError("can't initialize module signal");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000402}
403
404int
405sigcheck()
406{
407 int i;
Guido van Rossume4485b01994-09-07 14:32:49 +0000408 PyObject *f;
409 if (!PySignal_IsTripped)
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000410 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000411#ifdef WITH_THREAD
412 if (get_thread_ident() != main_thread)
413 return 0;
414#endif
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000415 f = getframe();
Guido van Rossume4485b01994-09-07 14:32:49 +0000416 if (f == (PyObject *)NULL)
417 f = Py_None;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000418 for (i = 1; i < NSIG; i++) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000419 if (PySignal_SignalHandlerArray[i].tripped) {
420 PyObject *arglist, *result;
421 PySignal_SignalHandlerArray[i].tripped = 0;
422 arglist = Py_BuildValue("(iO)", i, f);
423 if (arglist == (PyObject *)NULL)
424 result = (PyObject *)NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000425 else {
Guido van Rossume4485b01994-09-07 14:32:49 +0000426 result = PyEval_CallObject(PySignal_SignalHandlerArray[i].func,arglist);
427 Py_DECREF(arglist);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000428 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000429 if (result == (PyObject *)NULL) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000430 return 1;
431 } else {
Guido van Rossume4485b01994-09-07 14:32:49 +0000432 Py_DECREF(result);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000433 }
434 }
435 }
Guido van Rossume4485b01994-09-07 14:32:49 +0000436 PySignal_IsTripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000437 return 0;
438}
439
440/* Replacement for intrcheck.c functionality */
441
442void
443initintr()
444{
445 initsignal();
446}
447
448int
449intrcheck()
450{
Guido van Rossume4485b01994-09-07 14:32:49 +0000451 if (PySignal_SignalHandlerArray[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000452#ifdef WITH_THREAD
453 if (get_thread_ident() != main_thread)
454 return 0;
455#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000456 PySignal_SignalHandlerArray[SIGINT].tripped = 0;
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000457 return 1;
458 }
459 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000460}