blob: b27c4b74a79539358d087c05726ed972b25bc10d [file] [log] [blame]
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002/* Signal module -- many thanks to Lance Ellinghaus */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00003
Guido van Rossum644a12b1997-04-09 19:24:53 +00004/* XXX Signals should be recorded per thread, now we have thread state. */
5
Guido van Rossum602099a1994-09-14 13:32:22 +00006#include "Python.h"
Guido van Rossum398d9fe1994-05-11 08:59:13 +00007#include "intrcheck.h"
8
Guido van Rossum644a12b1997-04-09 19:24:53 +00009#ifdef MS_WIN32
10#include <process.h>
11#endif
12
Guido van Rossum398d9fe1994-05-11 08:59:13 +000013#include <signal.h>
14
Guido van Rossumbb4ba121994-06-23 11:25:45 +000015#ifndef SIG_ERR
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +000016#define SIG_ERR ((PyOS_sighandler_t)(-1))
Guido van Rossumbb4ba121994-06-23 11:25:45 +000017#endif
18
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000019#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000020#define NSIG 12
21#include <process.h>
22#endif
23
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024#ifndef NSIG
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000025# if defined(_NSIG)
26# define NSIG _NSIG /* For BSD/SysV */
27# elif defined(_SIGMAX)
28# define NSIG (_SIGMAX + 1) /* For QNX */
29# elif defined(SIGMAX)
30# define NSIG (SIGMAX + 1) /* For djgpp */
31# else
32# define NSIG 64 /* Use a reasonable default value */
33# endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000034#endif
35
36
Guido van Rossumbb4ba121994-06-23 11:25:45 +000037/*
38 NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
39
40 When threads are supported, we want the following semantics:
41
42 - only the main thread can set a signal handler
43 - any thread can get a signal handler
44 - signals are only delivered to the main thread
45
46 I.e. we don't support "synchronous signals" like SIGFPE (catching
47 this doesn't make much sense in Python anyway) nor do we support
48 signals as a means of inter-thread communication, since not all
49 thread implementations support that (at least our thread library
50 doesn't).
51
52 We still have the problem that in some implementations signals
53 generated by the keyboard (e.g. SIGINT) are delivered to all
54 threads (e.g. SGI), while in others (e.g. Solaris) such signals are
55 delivered to one random thread (an intermediate possibility would
Guido van Rossuma3c04b01995-01-12 11:29:01 +000056 be to deliver it to the main thread -- POSIX?). For now, we have
Guido van Rossumbb4ba121994-06-23 11:25:45 +000057 a working implementation that works in all three cases -- the
58 handler ignores signals if getpid() isn't the same as in the main
59 thread. XXX This is a hack.
60
Guido van Rossum9e8181b2000-09-19 00:46:46 +000061 GNU pth is a user-space threading library, and as such, all threads
62 run within the same process. In this case, if the currently running
63 thread is not the main_thread, send the signal to the main_thread.
Guido van Rossumbb4ba121994-06-23 11:25:45 +000064*/
65
66#ifdef WITH_THREAD
Guido van Rossum295b8e51997-06-06 21:16:41 +000067#include <sys/types.h> /* For pid_t */
Guido van Rossum49b56061998-10-01 20:42:43 +000068#include "pythread.h"
Guido van Rossumbb4ba121994-06-23 11:25:45 +000069static long main_thread;
70static pid_t main_pid;
71#endif
72
Barry Warsaw92971171997-01-03 00:14:25 +000073static struct {
74 int tripped;
75 PyObject *func;
76} Handlers[NSIG];
Guido van Rossum398d9fe1994-05-11 08:59:13 +000077
Barry Warsaw92971171997-01-03 00:14:25 +000078static int is_tripped = 0; /* Speed up sigcheck() when none tripped */
Guido van Rossum398d9fe1994-05-11 08:59:13 +000079
Barry Warsaw92971171997-01-03 00:14:25 +000080static PyObject *DefaultHandler;
81static PyObject *IgnoreHandler;
82static PyObject *IntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000083
Martin v. Löwisf58de1b2001-03-06 12:13:56 +000084/* On Solaris 8, gcc will produce a warning that the function
85 declaration is not a prototype. This is caused by the definition of
86 SIG_DFL as (void (*)())0; the correct declaration would have been
87 (void (*)(int))0. */
88
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +000089static PyOS_sighandler_t old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +000090
Barry Warsaw92971171997-01-03 00:14:25 +000091
Guido van Rossume4485b01994-09-07 14:32:49 +000092static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +000093signal_default_int_handler(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +000094{
Guido van Rossume4485b01994-09-07 14:32:49 +000095 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsaw92971171997-01-03 00:14:25 +000096 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000097}
98
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +000099static char default_int_handler_doc[] =
100"default_int_handler(...)\n\
101\n\
102The default handler for SIGINT instated by Python.\n\
103It raises KeyboardInterrupt.";
104
Thomas Wouters0796b002000-07-22 23:49:30 +0000105
106static int
107checksignals_witharg(void * unused)
108{
109 return PyErr_CheckSignals();
110}
111
Tim Peters4f1b2082000-07-23 21:18:09 +0000112static void
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000113signal_handler(int sig_num)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000114{
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000115#ifdef WITH_THREAD
Guido van Rossum9e8181b2000-09-19 00:46:46 +0000116#ifdef WITH_PTH
117 if (PyThread_get_thread_ident() != main_thread) {
118 pth_raise(*(pth_t *) main_thread, sig_num);
119 return;
120 }
121#endif
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000122 /* See NOTES section above */
123 if (getpid() == main_pid) {
124#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000125 is_tripped++;
126 Handlers[sig_num].tripped = 1;
Thomas Wouters0796b002000-07-22 23:49:30 +0000127 Py_AddPendingCall(checksignals_witharg, NULL);
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000128#ifdef WITH_THREAD
129 }
130#endif
Guido van Rossum602099a1994-09-14 13:32:22 +0000131#ifdef SIGCHLD
132 if (sig_num == SIGCHLD) {
133 /* To avoid infinite recursion, this signal remains
134 reset until explicit re-instated.
135 Don't clear the 'func' field as it is our pointer
136 to the Python handler... */
Tim Peters4f1b2082000-07-23 21:18:09 +0000137 return;
Guido van Rossum602099a1994-09-14 13:32:22 +0000138 }
139#endif
Guido van Rossum1b236761998-09-21 14:46:00 +0000140#ifdef HAVE_SIGINTERRUPT
141 siginterrupt(sig_num, 1);
142#endif
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000143 PyOS_setsig(sig_num, signal_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000144}
Guido van Rossume4485b01994-09-07 14:32:49 +0000145
Guido van Rossum06d511d1995-03-10 15:13:48 +0000146
Guido van Rossum1171ee61997-08-22 20:42:00 +0000147#ifdef HAVE_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000148static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000149signal_alarm(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000150{
151 int t;
Guido van Rossume4485b01994-09-07 14:32:49 +0000152 if (!PyArg_Parse(args, "i", &t))
Barry Warsaw92971171997-01-03 00:14:25 +0000153 return NULL;
Guido van Rossume4485b01994-09-07 14:32:49 +0000154 /* alarm() returns the number of seconds remaining */
Fred Drakedff3a372001-07-19 21:29:49 +0000155 return PyInt_FromLong((long)alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000156}
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000157
158static char alarm_doc[] =
159"alarm(seconds)\n\
160\n\
Guido van Rossum911ec181998-06-28 17:00:19 +0000161Arrange for SIGALRM to arrive after the given number of seconds.";
Guido van Rossum06d511d1995-03-10 15:13:48 +0000162#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000163
Guido van Rossum1171ee61997-08-22 20:42:00 +0000164#ifdef HAVE_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000165static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000166signal_pause(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000167{
Guido van Rossume4485b01994-09-07 14:32:49 +0000168 if (!PyArg_NoArgs(args))
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000169 return NULL;
Barry Warsaw92971171997-01-03 00:14:25 +0000170
Guido van Rossuma597dde1995-01-10 20:56:29 +0000171 Py_BEGIN_ALLOW_THREADS
Barry Warsaw92971171997-01-03 00:14:25 +0000172 (void)pause();
Guido van Rossuma597dde1995-01-10 20:56:29 +0000173 Py_END_ALLOW_THREADS
Barry Warsaw92971171997-01-03 00:14:25 +0000174 /* make sure that any exceptions that got raised are propagated
175 * back into Python
176 */
177 if (PyErr_CheckSignals())
178 return NULL;
179
Guido van Rossume4485b01994-09-07 14:32:49 +0000180 Py_INCREF(Py_None);
181 return Py_None;
182}
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000183static char pause_doc[] =
Barry Warsaw1ee36ff1998-07-21 22:41:18 +0000184"pause()\n\
185\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000186Wait until a signal arrives.";
187
Guido van Rossum06d511d1995-03-10 15:13:48 +0000188#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000189
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000190
Guido van Rossume4485b01994-09-07 14:32:49 +0000191static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000192signal_signal(PyObject *self, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000193{
194 PyObject *obj;
195 int sig_num;
196 PyObject *old_handler;
Tim Peters4f1b2082000-07-23 21:18:09 +0000197 void (*func)(int);
Guido van Rossume4485b01994-09-07 14:32:49 +0000198 if (!PyArg_Parse(args, "(iO)", &sig_num, &obj))
Barry Warsaw92971171997-01-03 00:14:25 +0000199 return NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000200#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000201 if (PyThread_get_thread_ident() != main_thread) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000202 PyErr_SetString(PyExc_ValueError,
203 "signal only works in main thread");
Barry Warsaw92971171997-01-03 00:14:25 +0000204 return NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000205 }
206#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000207 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000208 PyErr_SetString(PyExc_ValueError,
209 "signal number out of range");
Barry Warsaw92971171997-01-03 00:14:25 +0000210 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000211 }
Barry Warsaw92971171997-01-03 00:14:25 +0000212 if (obj == IgnoreHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000213 func = SIG_IGN;
Barry Warsaw92971171997-01-03 00:14:25 +0000214 else if (obj == DefaultHandler)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000215 func = SIG_DFL;
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000216 else if (!PyCallable_Check(obj)) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000217 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000218"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Barry Warsaw92971171997-01-03 00:14:25 +0000219 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000220 }
221 else
Barry Warsaw92971171997-01-03 00:14:25 +0000222 func = signal_handler;
Guido van Rossum1b236761998-09-21 14:46:00 +0000223#ifdef HAVE_SIGINTERRUPT
224 siginterrupt(sig_num, 1);
225#endif
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000226 if (PyOS_setsig(sig_num, func) == SIG_ERR) {
Guido van Rossume4485b01994-09-07 14:32:49 +0000227 PyErr_SetFromErrno(PyExc_RuntimeError);
Barry Warsaw92971171997-01-03 00:14:25 +0000228 return NULL;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000229 }
Barry Warsaw92971171997-01-03 00:14:25 +0000230 old_handler = Handlers[sig_num].func;
231 Handlers[sig_num].tripped = 0;
Guido van Rossume4485b01994-09-07 14:32:49 +0000232 Py_INCREF(obj);
Barry Warsaw92971171997-01-03 00:14:25 +0000233 Handlers[sig_num].func = obj;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000234 return old_handler;
235}
236
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000237static char signal_doc[] =
238"signal(sig, action) -> action\n\
239\n\
240Set the action for the given signal. The action can be SIG_DFL,\n\
241SIG_IGN, or a callable Python object. The previous action is\n\
242returned. See getsignal() for possible return values.\n\
243\n\
244*** IMPORTANT NOTICE ***\n\
245A signal handler function is called with two arguments:\n\
246the first is the signal number, the second is the interrupted stack frame.";
247
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000248
Guido van Rossume4485b01994-09-07 14:32:49 +0000249static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000250signal_getsignal(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000251{
252 int sig_num;
Guido van Rossume4485b01994-09-07 14:32:49 +0000253 PyObject *old_handler;
254 if (!PyArg_Parse(args, "i", &sig_num))
Barry Warsaw92971171997-01-03 00:14:25 +0000255 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000256 if (sig_num < 1 || sig_num >= NSIG) {
Guido van Rossumf4b012a1995-03-16 15:43:29 +0000257 PyErr_SetString(PyExc_ValueError,
258 "signal number out of range");
Barry Warsaw92971171997-01-03 00:14:25 +0000259 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000260 }
Barry Warsaw92971171997-01-03 00:14:25 +0000261 old_handler = Handlers[sig_num].func;
Guido van Rossume4485b01994-09-07 14:32:49 +0000262 Py_INCREF(old_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000263 return old_handler;
264}
265
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000266static char getsignal_doc[] =
267"getsignal(sig) -> action\n\
268\n\
269Return the current action for the given signal. The return value can be:\n\
270SIG_IGN -- if the signal is being ignored\n\
271SIG_DFL -- if the default action for the signal is in effect\n\
272None -- if an unknown handler is in effect\n\
273anything else -- the callable Python object used as a handler\n\
274";
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000275
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000276
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000277/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +0000278static PyMethodDef signal_methods[] = {
Guido van Rossum1171ee61997-08-22 20:42:00 +0000279#ifdef HAVE_ALARM
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000280 {"alarm", signal_alarm, METH_OLDARGS, alarm_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000281#endif
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000282 {"signal", signal_signal, METH_OLDARGS, signal_doc},
283 {"getsignal", signal_getsignal, METH_OLDARGS, getsignal_doc},
Guido van Rossum1171ee61997-08-22 20:42:00 +0000284#ifdef HAVE_PAUSE
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000285 {"pause", signal_pause, METH_OLDARGS, pause_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000286#endif
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000287 {"default_int_handler", signal_default_int_handler,
288 METH_OLDARGS, default_int_handler_doc},
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000289 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000290};
291
Barry Warsaw92971171997-01-03 00:14:25 +0000292
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000293static char module_doc[] =
294"This module provides mechanisms to use signal handlers in Python.\n\
295\n\
296Functions:\n\
297\n\
298alarm() -- cause SIGALRM after a specified time [Unix only]\n\
299signal() -- set the action for a given signal\n\
300getsignal() -- get the signal action for a given signal\n\
301pause() -- wait until a signal arrives [Unix only]\n\
302default_int_handler() -- default SIGINT handler\n\
303\n\
304Constants:\n\
305\n\
306SIG_DFL -- used to refer to the system default handler\n\
307SIG_IGN -- used to ignore the signal\n\
308NSIG -- number of defined signals\n\
309\n\
310SIGINT, SIGTERM, etc. -- signal numbers\n\
311\n\
312*** IMPORTANT NOTICE ***\n\
313A signal handler function is called with two arguments:\n\
314the first is the signal number, the second is the interrupted stack frame.";
315
Guido van Rossum3886bb61998-12-04 18:50:17 +0000316DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000317initsignal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000318{
Guido van Rossume4485b01994-09-07 14:32:49 +0000319 PyObject *m, *d, *x;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000320 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000321
322#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000323 main_thread = PyThread_get_thread_ident();
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000324 main_pid = getpid();
325#endif
326
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000327 /* Create the module and add the functions */
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000328 m = Py_InitModule3("signal", signal_methods, module_doc);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000329
330 /* Add some symbolic constants to the module */
Guido van Rossume4485b01994-09-07 14:32:49 +0000331 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000332
Guido van Rossum276fa432000-06-30 23:04:18 +0000333 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
Barry Warsaw92971171997-01-03 00:14:25 +0000334 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
335 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000336
Guido van Rossum276fa432000-06-30 23:04:18 +0000337 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
Barry Warsaw92971171997-01-03 00:14:25 +0000338 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
339 goto finally;
340
341 x = PyInt_FromLong((long)NSIG);
342 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
343 goto finally;
Guido van Rossum08c16611997-08-02 03:01:42 +0000344 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +0000345
346 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
347 if (!x)
348 goto finally;
Guido van Rossum08c16611997-08-02 03:01:42 +0000349 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +0000350
351 Handlers[0].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000352 for (i = 1; i < NSIG; i++) {
Tim Peters4f1b2082000-07-23 21:18:09 +0000353 void (*t)(int);
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000354 t = PyOS_getsig(i);
Barry Warsaw92971171997-01-03 00:14:25 +0000355 Handlers[i].tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000356 if (t == SIG_DFL)
Barry Warsaw92971171997-01-03 00:14:25 +0000357 Handlers[i].func = DefaultHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000358 else if (t == SIG_IGN)
Barry Warsaw92971171997-01-03 00:14:25 +0000359 Handlers[i].func = IgnoreHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000360 else
Barry Warsaw92971171997-01-03 00:14:25 +0000361 Handlers[i].func = Py_None; /* None of our business */
362 Py_INCREF(Handlers[i].func);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000363 }
Barry Warsaw92971171997-01-03 00:14:25 +0000364 if (Handlers[SIGINT].func == DefaultHandler) {
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000365 /* Install default int handler */
Guido van Rossum08c16611997-08-02 03:01:42 +0000366 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +0000367 Py_DECREF(Handlers[SIGINT].func);
368 Handlers[SIGINT].func = IntHandler;
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000369 old_siginthandler = PyOS_setsig(SIGINT, &signal_handler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000370 }
371
372#ifdef SIGHUP
Guido van Rossume4485b01994-09-07 14:32:49 +0000373 x = PyInt_FromLong(SIGHUP);
374 PyDict_SetItemString(d, "SIGHUP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000375 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000376#endif
377#ifdef SIGINT
Guido van Rossume4485b01994-09-07 14:32:49 +0000378 x = PyInt_FromLong(SIGINT);
379 PyDict_SetItemString(d, "SIGINT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000380 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000381#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +0000382#ifdef SIGBREAK
383 x = PyInt_FromLong(SIGBREAK);
384 PyDict_SetItemString(d, "SIGBREAK", x);
385 Py_XDECREF(x);
386#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000387#ifdef SIGQUIT
Guido van Rossume4485b01994-09-07 14:32:49 +0000388 x = PyInt_FromLong(SIGQUIT);
389 PyDict_SetItemString(d, "SIGQUIT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000390 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000391#endif
392#ifdef SIGILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000393 x = PyInt_FromLong(SIGILL);
394 PyDict_SetItemString(d, "SIGILL", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000395 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000396#endif
397#ifdef SIGTRAP
Guido van Rossume4485b01994-09-07 14:32:49 +0000398 x = PyInt_FromLong(SIGTRAP);
399 PyDict_SetItemString(d, "SIGTRAP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000400 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000401#endif
402#ifdef SIGIOT
Guido van Rossume4485b01994-09-07 14:32:49 +0000403 x = PyInt_FromLong(SIGIOT);
404 PyDict_SetItemString(d, "SIGIOT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000405 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000406#endif
407#ifdef SIGABRT
Guido van Rossume4485b01994-09-07 14:32:49 +0000408 x = PyInt_FromLong(SIGABRT);
409 PyDict_SetItemString(d, "SIGABRT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000410 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000411#endif
412#ifdef SIGEMT
Guido van Rossume4485b01994-09-07 14:32:49 +0000413 x = PyInt_FromLong(SIGEMT);
414 PyDict_SetItemString(d, "SIGEMT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000415 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000416#endif
417#ifdef SIGFPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000418 x = PyInt_FromLong(SIGFPE);
419 PyDict_SetItemString(d, "SIGFPE", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000420 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000421#endif
422#ifdef SIGKILL
Guido van Rossume4485b01994-09-07 14:32:49 +0000423 x = PyInt_FromLong(SIGKILL);
424 PyDict_SetItemString(d, "SIGKILL", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000425 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000426#endif
427#ifdef SIGBUS
Guido van Rossume4485b01994-09-07 14:32:49 +0000428 x = PyInt_FromLong(SIGBUS);
429 PyDict_SetItemString(d, "SIGBUS", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000430 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000431#endif
432#ifdef SIGSEGV
Guido van Rossume4485b01994-09-07 14:32:49 +0000433 x = PyInt_FromLong(SIGSEGV);
434 PyDict_SetItemString(d, "SIGSEGV", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000435 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000436#endif
437#ifdef SIGSYS
Guido van Rossume4485b01994-09-07 14:32:49 +0000438 x = PyInt_FromLong(SIGSYS);
439 PyDict_SetItemString(d, "SIGSYS", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000440 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000441#endif
442#ifdef SIGPIPE
Guido van Rossume4485b01994-09-07 14:32:49 +0000443 x = PyInt_FromLong(SIGPIPE);
444 PyDict_SetItemString(d, "SIGPIPE", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000445 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000446#endif
447#ifdef SIGALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000448 x = PyInt_FromLong(SIGALRM);
449 PyDict_SetItemString(d, "SIGALRM", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000450 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000451#endif
452#ifdef SIGTERM
Guido van Rossume4485b01994-09-07 14:32:49 +0000453 x = PyInt_FromLong(SIGTERM);
454 PyDict_SetItemString(d, "SIGTERM", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000455 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000456#endif
457#ifdef SIGUSR1
Guido van Rossume4485b01994-09-07 14:32:49 +0000458 x = PyInt_FromLong(SIGUSR1);
459 PyDict_SetItemString(d, "SIGUSR1", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000460 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000461#endif
462#ifdef SIGUSR2
Guido van Rossume4485b01994-09-07 14:32:49 +0000463 x = PyInt_FromLong(SIGUSR2);
464 PyDict_SetItemString(d, "SIGUSR2", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000465 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000466#endif
467#ifdef SIGCLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000468 x = PyInt_FromLong(SIGCLD);
469 PyDict_SetItemString(d, "SIGCLD", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000470 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000471#endif
472#ifdef SIGCHLD
Guido van Rossume4485b01994-09-07 14:32:49 +0000473 x = PyInt_FromLong(SIGCHLD);
474 PyDict_SetItemString(d, "SIGCHLD", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000475 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000476#endif
477#ifdef SIGPWR
Guido van Rossume4485b01994-09-07 14:32:49 +0000478 x = PyInt_FromLong(SIGPWR);
479 PyDict_SetItemString(d, "SIGPWR", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000480 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000481#endif
482#ifdef SIGIO
Guido van Rossume4485b01994-09-07 14:32:49 +0000483 x = PyInt_FromLong(SIGIO);
484 PyDict_SetItemString(d, "SIGIO", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000485 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000486#endif
487#ifdef SIGURG
Guido van Rossume4485b01994-09-07 14:32:49 +0000488 x = PyInt_FromLong(SIGURG);
489 PyDict_SetItemString(d, "SIGURG", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000490 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000491#endif
492#ifdef SIGWINCH
Guido van Rossume4485b01994-09-07 14:32:49 +0000493 x = PyInt_FromLong(SIGWINCH);
494 PyDict_SetItemString(d, "SIGWINCH", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000495 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000496#endif
497#ifdef SIGPOLL
Guido van Rossume4485b01994-09-07 14:32:49 +0000498 x = PyInt_FromLong(SIGPOLL);
499 PyDict_SetItemString(d, "SIGPOLL", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000500 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000501#endif
502#ifdef SIGSTOP
Guido van Rossume4485b01994-09-07 14:32:49 +0000503 x = PyInt_FromLong(SIGSTOP);
504 PyDict_SetItemString(d, "SIGSTOP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000505 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000506#endif
507#ifdef SIGTSTP
Guido van Rossume4485b01994-09-07 14:32:49 +0000508 x = PyInt_FromLong(SIGTSTP);
509 PyDict_SetItemString(d, "SIGTSTP", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000510 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000511#endif
512#ifdef SIGCONT
Guido van Rossume4485b01994-09-07 14:32:49 +0000513 x = PyInt_FromLong(SIGCONT);
514 PyDict_SetItemString(d, "SIGCONT", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000515 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000516#endif
517#ifdef SIGTTIN
Guido van Rossume4485b01994-09-07 14:32:49 +0000518 x = PyInt_FromLong(SIGTTIN);
519 PyDict_SetItemString(d, "SIGTTIN", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000520 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000521#endif
522#ifdef SIGTTOU
Guido van Rossume4485b01994-09-07 14:32:49 +0000523 x = PyInt_FromLong(SIGTTOU);
524 PyDict_SetItemString(d, "SIGTTOU", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000525 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000526#endif
527#ifdef SIGVTALRM
Guido van Rossume4485b01994-09-07 14:32:49 +0000528 x = PyInt_FromLong(SIGVTALRM);
529 PyDict_SetItemString(d, "SIGVTALRM", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000530 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000531#endif
532#ifdef SIGPROF
Guido van Rossume4485b01994-09-07 14:32:49 +0000533 x = PyInt_FromLong(SIGPROF);
534 PyDict_SetItemString(d, "SIGPROF", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000535 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000536#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000537#ifdef SIGXCPU
538 x = PyInt_FromLong(SIGXCPU);
539 PyDict_SetItemString(d, "SIGXCPU", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000540 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000541#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000542#ifdef SIGXFSZ
543 x = PyInt_FromLong(SIGXFSZ);
544 PyDict_SetItemString(d, "SIGXFSZ", x);
Barry Warsaw73a75eb1997-01-09 23:50:28 +0000545 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000546#endif
Martin v. Löwis175af252002-01-12 11:43:25 +0000547#ifdef SIGINFO
548 x = PyInt_FromLong(SIGINFO);
549 PyDict_SetItemString(d, "SIGINFO", x);
550 Py_XDECREF(x);
551#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000552 if (!PyErr_Occurred())
553 return;
554
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000555 /* Check for errors */
Barry Warsaw92971171997-01-03 00:14:25 +0000556 finally:
Guido van Rossum08c16611997-08-02 03:01:42 +0000557 return;
558}
559
560static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000561finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +0000562{
563 int i;
Guido van Rossum7ff20ac1997-11-03 21:53:55 +0000564 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +0000565
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000566 PyOS_setsig(SIGINT, old_siginthandler);
Guido van Rossum7ff20ac1997-11-03 21:53:55 +0000567 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +0000568
569 for (i = 1; i < NSIG; i++) {
Guido van Rossum7ff20ac1997-11-03 21:53:55 +0000570 func = Handlers[i].func;
Guido van Rossum08c16611997-08-02 03:01:42 +0000571 Handlers[i].tripped = 0;
Guido van Rossum08c16611997-08-02 03:01:42 +0000572 Handlers[i].func = NULL;
Guido van Rossum7ff20ac1997-11-03 21:53:55 +0000573 if (i != SIGINT && func != NULL && func != Py_None &&
574 func != DefaultHandler && func != IgnoreHandler)
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000575 PyOS_setsig(i, SIG_DFL);
Guido van Rossum7ff20ac1997-11-03 21:53:55 +0000576 Py_XDECREF(func);
Guido van Rossum08c16611997-08-02 03:01:42 +0000577 }
578
579 Py_XDECREF(IntHandler);
580 IntHandler = NULL;
581 Py_XDECREF(DefaultHandler);
582 DefaultHandler = NULL;
583 Py_XDECREF(IgnoreHandler);
584 IgnoreHandler = NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000585}
586
Barry Warsaw92971171997-01-03 00:14:25 +0000587
Barry Warsaw92971171997-01-03 00:14:25 +0000588/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000589int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000590PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000591{
592 int i;
Guido van Rossume4485b01994-09-07 14:32:49 +0000593 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +0000594
595 if (!is_tripped)
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000596 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000597#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000598 if (PyThread_get_thread_ident() != main_thread)
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000599 return 0;
600#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000601 if (!(f = PyEval_GetFrame()))
Guido van Rossume4485b01994-09-07 14:32:49 +0000602 f = Py_None;
Barry Warsaw92971171997-01-03 00:14:25 +0000603
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000604 for (i = 1; i < NSIG; i++) {
Barry Warsaw92971171997-01-03 00:14:25 +0000605 if (Handlers[i].tripped) {
606 PyObject *result = NULL;
607 PyObject *arglist = Py_BuildValue("(iO)", i, f);
608 Handlers[i].tripped = 0;
609
610 if (arglist) {
611 result = PyEval_CallObject(Handlers[i].func,
612 arglist);
Guido van Rossume4485b01994-09-07 14:32:49 +0000613 Py_DECREF(arglist);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000614 }
Barry Warsaw92971171997-01-03 00:14:25 +0000615 if (!result)
Guido van Rossumfcdd0e41997-01-21 06:13:09 +0000616 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +0000617
618 Py_DECREF(result);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000619 }
620 }
Barry Warsaw92971171997-01-03 00:14:25 +0000621 is_tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000622 return 0;
623}
624
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000625
Barry Warsaw92971171997-01-03 00:14:25 +0000626/* Replacements for intrcheck.c functionality
627 * Declared in pyerrors.h
628 */
629void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000630PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +0000631{
632 is_tripped++;
633 Handlers[SIGINT].tripped = 1;
Thomas Wouters334fb892000-07-25 12:56:38 +0000634 Py_AddPendingCall((int (*)(void *))PyErr_CheckSignals, NULL);
Barry Warsaw92971171997-01-03 00:14:25 +0000635}
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000636
637void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000638PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000639{
640 initsignal();
Guido van Rossum08c16611997-08-02 03:01:42 +0000641 _PyImport_FixupExtension("signal", "signal");
642}
643
644void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000645PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +0000646{
647 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000648}
649
650int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000651PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000652{
Barry Warsaw92971171997-01-03 00:14:25 +0000653 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000654#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000655 if (PyThread_get_thread_ident() != main_thread)
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000656 return 0;
657#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000658 Handlers[SIGINT].tripped = 0;
Guido van Rossum6299d1e1994-05-31 12:51:13 +0000659 return 1;
660 }
661 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000662}
Guido van Rossum359bcaa1997-11-14 22:24:28 +0000663
664void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000665PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +0000666{
667#ifdef WITH_THREAD
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000668 PyEval_ReInitThreads();
Guido van Rossum65d5b571998-12-21 19:32:43 +0000669 main_thread = PyThread_get_thread_ident();
Guido van Rossum359bcaa1997-11-14 22:24:28 +0000670 main_pid = getpid();
671#endif
672}