blob: 387dc8c3e287ba57b23b21ce1437c27b08a9dc21 [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
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00008#ifdef MS_WINDOWS
Brian Curtineb24d742010-04-12 17:16:38 +00009#include <Windows.h>
Benjamin Peterson2614cda2010-03-21 22:36:19 +000010#ifdef HAVE_PROCESS_H
Guido van Rossum644a12b1997-04-09 19:24:53 +000011#include <process.h>
12#endif
Benjamin Peterson2614cda2010-03-21 22:36:19 +000013#endif
Guido van Rossum644a12b1997-04-09 19:24:53 +000014
Benjamin Peterson2614cda2010-03-21 22:36:19 +000015#ifdef HAVE_SIGNAL_H
Guido van Rossum398d9fe1994-05-11 08:59:13 +000016#include <signal.h>
Benjamin Peterson2614cda2010-03-21 22:36:19 +000017#endif
18#ifdef HAVE_SYS_STAT_H
Christian Heimes5fb7c2a2007-12-24 08:52:31 +000019#include <sys/stat.h>
Benjamin Peterson2614cda2010-03-21 22:36:19 +000020#endif
Martin v. Löwis3bf3cc02008-03-24 14:05:07 +000021#ifdef HAVE_SYS_TIME_H
Martin v. Löwis823725e2008-03-24 13:39:54 +000022#include <sys/time.h>
Martin v. Löwis3bf3cc02008-03-24 14:05:07 +000023#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +000024
Victor Stinnera9293352011-04-30 15:21:58 +020025#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
26# define PYPTHREAD_SIGMASK
27#endif
28
29#if defined(PYPTHREAD_SIGMASK) && defined(HAVE_PTHREAD_H)
30# include <pthread.h>
31#endif
32
Guido van Rossumbb4ba121994-06-23 11:25:45 +000033#ifndef SIG_ERR
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +000034#define SIG_ERR ((PyOS_sighandler_t)(-1))
Guido van Rossumbb4ba121994-06-23 11:25:45 +000035#endif
36
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000037#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000038#define NSIG 12
39#include <process.h>
40#endif
41
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000042#ifndef NSIG
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000043# if defined(_NSIG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044# define NSIG _NSIG /* For BSD/SysV */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000045# elif defined(_SIGMAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046# define NSIG (_SIGMAX + 1) /* For QNX */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000047# elif defined(SIGMAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048# define NSIG (SIGMAX + 1) /* For djgpp */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000049# else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050# define NSIG 64 /* Use a reasonable default value */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000051# endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000052#endif
53
54
Guido van Rossumbb4ba121994-06-23 11:25:45 +000055/*
56 NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
57
58 When threads are supported, we want the following semantics:
59
60 - only the main thread can set a signal handler
61 - any thread can get a signal handler
62 - signals are only delivered to the main thread
63
64 I.e. we don't support "synchronous signals" like SIGFPE (catching
65 this doesn't make much sense in Python anyway) nor do we support
66 signals as a means of inter-thread communication, since not all
67 thread implementations support that (at least our thread library
68 doesn't).
69
70 We still have the problem that in some implementations signals
71 generated by the keyboard (e.g. SIGINT) are delivered to all
72 threads (e.g. SGI), while in others (e.g. Solaris) such signals are
73 delivered to one random thread (an intermediate possibility would
Guido van Rossuma3c04b01995-01-12 11:29:01 +000074 be to deliver it to the main thread -- POSIX?). For now, we have
Guido van Rossumbb4ba121994-06-23 11:25:45 +000075 a working implementation that works in all three cases -- the
76 handler ignores signals if getpid() isn't the same as in the main
77 thread. XXX This is a hack.
78
Guido van Rossum9e8181b2000-09-19 00:46:46 +000079 GNU pth is a user-space threading library, and as such, all threads
80 run within the same process. In this case, if the currently running
81 thread is not the main_thread, send the signal to the main_thread.
Guido van Rossumbb4ba121994-06-23 11:25:45 +000082*/
83
84#ifdef WITH_THREAD
Guido van Rossum295b8e51997-06-06 21:16:41 +000085#include <sys/types.h> /* For pid_t */
Guido van Rossum49b56061998-10-01 20:42:43 +000086#include "pythread.h"
Guido van Rossumbb4ba121994-06-23 11:25:45 +000087static long main_thread;
88static pid_t main_pid;
89#endif
90
Barry Warsaw92971171997-01-03 00:14:25 +000091static struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 int tripped;
93 PyObject *func;
Barry Warsaw92971171997-01-03 00:14:25 +000094} Handlers[NSIG];
Guido van Rossum398d9fe1994-05-11 08:59:13 +000095
Christian Heimes5fb7c2a2007-12-24 08:52:31 +000096static sig_atomic_t wakeup_fd = -1;
97
Christian Heimesb76922a2007-12-11 01:06:40 +000098/* Speed up sigcheck() when none tripped */
99static volatile sig_atomic_t is_tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000100
Barry Warsaw92971171997-01-03 00:14:25 +0000101static PyObject *DefaultHandler;
102static PyObject *IgnoreHandler;
103static PyObject *IntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000104
Martin v. Löwisf58de1b2001-03-06 12:13:56 +0000105/* On Solaris 8, gcc will produce a warning that the function
106 declaration is not a prototype. This is caused by the definition of
107 SIG_DFL as (void (*)())0; the correct declaration would have been
108 (void (*)(int))0. */
109
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000110static PyOS_sighandler_t old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +0000111
Martin v. Löwis823725e2008-03-24 13:39:54 +0000112#ifdef HAVE_GETITIMER
113static PyObject *ItimerError;
114
115/* auxiliary functions for setitimer/getitimer */
116static void
117timeval_from_double(double d, struct timeval *tv)
118{
119 tv->tv_sec = floor(d);
120 tv->tv_usec = fmod(d, 1.0) * 1000000.0;
121}
122
Christian Heimes1a8501c2008-10-02 19:56:01 +0000123Py_LOCAL_INLINE(double)
Martin v. Löwis823725e2008-03-24 13:39:54 +0000124double_from_timeval(struct timeval *tv)
125{
126 return tv->tv_sec + (double)(tv->tv_usec / 1000000.0);
127}
128
129static PyObject *
130itimer_retval(struct itimerval *iv)
131{
132 PyObject *r, *v;
133
134 r = PyTuple_New(2);
135 if (r == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000137
138 if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_value)))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 Py_DECREF(r);
140 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000141 }
142
143 PyTuple_SET_ITEM(r, 0, v);
144
145 if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_interval)))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 Py_DECREF(r);
147 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000148 }
149
150 PyTuple_SET_ITEM(r, 1, v);
151
152 return r;
153}
154#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000155
Guido van Rossume4485b01994-09-07 14:32:49 +0000156static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000157signal_default_int_handler(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000159 PyErr_SetNone(PyExc_KeyboardInterrupt);
160 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000161}
162
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000163PyDoc_STRVAR(default_int_handler_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000164"default_int_handler(...)\n\
165\n\
Michael W. Hudson24ec2112004-06-17 15:55:53 +0000166The default handler for SIGINT installed by Python.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000167It raises KeyboardInterrupt.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000168
Thomas Wouters0796b002000-07-22 23:49:30 +0000169
170static int
171checksignals_witharg(void * unused)
172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 return PyErr_CheckSignals();
Thomas Wouters0796b002000-07-22 23:49:30 +0000174}
175
Tim Peters4f1b2082000-07-23 21:18:09 +0000176static void
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200177trip_signal(int sig_num)
178{
179 Handlers[sig_num].tripped = 1;
180 if (is_tripped)
181 return;
182 /* Set is_tripped after setting .tripped, as it gets
183 cleared in PyErr_CheckSignals() before .tripped. */
184 is_tripped = 1;
185 Py_AddPendingCall(checksignals_witharg, NULL);
186 if (wakeup_fd != -1)
187 write(wakeup_fd, "\0", 1);
188}
189
190static void
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000191signal_handler(int sig_num)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000192{
Antoine Pitrou39a65912010-11-05 19:47:27 +0000193 int save_errno = errno;
194
195#if defined(WITH_THREAD) && defined(WITH_PTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 if (PyThread_get_thread_ident() != main_thread) {
197 pth_raise(*(pth_t *) main_thread, sig_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 }
Antoine Pitrou39a65912010-11-05 19:47:27 +0000199 else
Guido van Rossum9e8181b2000-09-19 00:46:46 +0000200#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000201 {
202#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 /* See NOTES section above */
Antoine Pitrou39a65912010-11-05 19:47:27 +0000204 if (getpid() == main_pid)
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000205#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000206 {
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200207 trip_signal(sig_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 }
Antoine Pitrou39a65912010-11-05 19:47:27 +0000209
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000210#ifndef HAVE_SIGACTION
Antoine Pitrou39a65912010-11-05 19:47:27 +0000211#ifdef SIGCHLD
212 /* To avoid infinite recursion, this signal remains
213 reset until explicit re-instated.
214 Don't clear the 'func' field as it is our pointer
215 to the Python handler... */
216 if (sig_num != SIGCHLD)
217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 /* If the handler was not set up with sigaction, reinstall it. See
219 * Python/pythonrun.c for the implementation of PyOS_setsig which
220 * makes this true. See also issue8354. */
221 PyOS_setsig(sig_num, signal_handler);
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000222#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000223 }
224
225 /* Issue #10311: asynchronously executing signal handlers should not
226 mutate errno under the feet of unsuspecting C code. */
227 errno = save_errno;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000228}
Guido van Rossume4485b01994-09-07 14:32:49 +0000229
Guido van Rossum06d511d1995-03-10 15:13:48 +0000230
Guido van Rossum1171ee61997-08-22 20:42:00 +0000231#ifdef HAVE_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000232static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000233signal_alarm(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 int t;
236 if (!PyArg_ParseTuple(args, "i:alarm", &t))
237 return NULL;
238 /* alarm() returns the number of seconds remaining */
239 return PyLong_FromLong((long)alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000240}
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000241
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000242PyDoc_STRVAR(alarm_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000243"alarm(seconds)\n\
244\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000245Arrange for SIGALRM to arrive after the given number of seconds.");
Guido van Rossum06d511d1995-03-10 15:13:48 +0000246#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000247
Guido van Rossum1171ee61997-08-22 20:42:00 +0000248#ifdef HAVE_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000249static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +0000250signal_pause(PyObject *self)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 Py_BEGIN_ALLOW_THREADS
253 (void)pause();
254 Py_END_ALLOW_THREADS
255 /* make sure that any exceptions that got raised are propagated
256 * back into Python
257 */
258 if (PyErr_CheckSignals())
259 return NULL;
Barry Warsaw92971171997-01-03 00:14:25 +0000260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 Py_INCREF(Py_None);
262 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000263}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000264PyDoc_STRVAR(pause_doc,
Barry Warsaw1ee36ff1998-07-21 22:41:18 +0000265"pause()\n\
266\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000267Wait until a signal arrives.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000268
Guido van Rossum06d511d1995-03-10 15:13:48 +0000269#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000270
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000271
Guido van Rossume4485b01994-09-07 14:32:49 +0000272static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000273signal_signal(PyObject *self, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 PyObject *obj;
276 int sig_num;
277 PyObject *old_handler;
278 void (*func)(int);
279 if (!PyArg_ParseTuple(args, "iO:signal", &sig_num, &obj))
280 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000281#ifdef MS_WINDOWS
282 /* Validate that sig_num is one of the allowable signals */
Brian Curtinc734b312010-09-06 16:04:10 +0000283 switch (sig_num) {
284 case SIGABRT: break;
Brian Curtin9e88b5a2010-10-01 14:49:24 +0000285#ifdef SIGBREAK
286 /* Issue #10003: SIGBREAK is not documented as permitted, but works
287 and corresponds to CTRL_BREAK_EVENT. */
288 case SIGBREAK: break;
289#endif
Brian Curtinc734b312010-09-06 16:04:10 +0000290 case SIGFPE: break;
291 case SIGILL: break;
292 case SIGINT: break;
293 case SIGSEGV: break;
294 case SIGTERM: break;
295 default:
296 PyErr_SetString(PyExc_ValueError, "invalid signal value");
297 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000298 }
299#endif
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000300#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 if (PyThread_get_thread_ident() != main_thread) {
302 PyErr_SetString(PyExc_ValueError,
303 "signal only works in main thread");
304 return NULL;
305 }
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 if (sig_num < 1 || sig_num >= NSIG) {
308 PyErr_SetString(PyExc_ValueError,
309 "signal number out of range");
310 return NULL;
311 }
312 if (obj == IgnoreHandler)
313 func = SIG_IGN;
314 else if (obj == DefaultHandler)
315 func = SIG_DFL;
316 else if (!PyCallable_Check(obj)) {
317 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000318"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 return NULL;
320 }
321 else
322 func = signal_handler;
323 if (PyOS_setsig(sig_num, func) == SIG_ERR) {
324 PyErr_SetFromErrno(PyExc_RuntimeError);
325 return NULL;
326 }
327 old_handler = Handlers[sig_num].func;
328 Handlers[sig_num].tripped = 0;
329 Py_INCREF(obj);
330 Handlers[sig_num].func = obj;
331 return old_handler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000332}
333
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000334PyDoc_STRVAR(signal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000335"signal(sig, action) -> action\n\
336\n\
337Set the action for the given signal. The action can be SIG_DFL,\n\
338SIG_IGN, or a callable Python object. The previous action is\n\
339returned. See getsignal() for possible return values.\n\
340\n\
341*** IMPORTANT NOTICE ***\n\
342A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000343the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000344
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000345
Guido van Rossume4485b01994-09-07 14:32:49 +0000346static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000347signal_getsignal(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 int sig_num;
350 PyObject *old_handler;
351 if (!PyArg_ParseTuple(args, "i:getsignal", &sig_num))
352 return NULL;
353 if (sig_num < 1 || sig_num >= NSIG) {
354 PyErr_SetString(PyExc_ValueError,
355 "signal number out of range");
356 return NULL;
357 }
358 old_handler = Handlers[sig_num].func;
359 Py_INCREF(old_handler);
360 return old_handler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000361}
362
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000363PyDoc_STRVAR(getsignal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000364"getsignal(sig) -> action\n\
365\n\
366Return the current action for the given signal. The return value can be:\n\
367SIG_IGN -- if the signal is being ignored\n\
368SIG_DFL -- if the default action for the signal is in effect\n\
369None -- if an unknown handler is in effect\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000370anything else -- the callable Python object used as a handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000371
Christian Heimes8640e742008-02-23 16:23:06 +0000372#ifdef HAVE_SIGINTERRUPT
373PyDoc_STRVAR(siginterrupt_doc,
374"siginterrupt(sig, flag) -> None\n\
375change system call restart behaviour: if flag is False, system calls\n\
376will be restarted when interrupted by signal sig, else system calls\n\
377will be interrupted.");
378
379static PyObject *
380signal_siginterrupt(PyObject *self, PyObject *args)
381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 int sig_num;
383 int flag;
Christian Heimes8640e742008-02-23 16:23:06 +0000384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 if (!PyArg_ParseTuple(args, "ii:siginterrupt", &sig_num, &flag))
386 return NULL;
387 if (sig_num < 1 || sig_num >= NSIG) {
388 PyErr_SetString(PyExc_ValueError,
389 "signal number out of range");
390 return NULL;
391 }
392 if (siginterrupt(sig_num, flag)<0) {
393 PyErr_SetFromErrno(PyExc_RuntimeError);
394 return NULL;
395 }
Christian Heimes8640e742008-02-23 16:23:06 +0000396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 Py_INCREF(Py_None);
398 return Py_None;
Christian Heimes8640e742008-02-23 16:23:06 +0000399}
400
401#endif
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000402
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000403static PyObject *
404signal_set_wakeup_fd(PyObject *self, PyObject *args)
405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 struct stat buf;
407 int fd, old_fd;
408 if (!PyArg_ParseTuple(args, "i:set_wakeup_fd", &fd))
409 return NULL;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000410#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 if (PyThread_get_thread_ident() != main_thread) {
412 PyErr_SetString(PyExc_ValueError,
413 "set_wakeup_fd only works in main thread");
414 return NULL;
415 }
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 if (fd != -1 && fstat(fd, &buf) != 0) {
418 PyErr_SetString(PyExc_ValueError, "invalid fd");
419 return NULL;
420 }
421 old_fd = wakeup_fd;
422 wakeup_fd = fd;
423 return PyLong_FromLong(old_fd);
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000424}
425
426PyDoc_STRVAR(set_wakeup_fd_doc,
427"set_wakeup_fd(fd) -> fd\n\
428\n\
429Sets the fd to be written to (with '\\0') when a signal\n\
430comes in. A library can use this to wakeup select or poll.\n\
431The previous fd is returned.\n\
432\n\
433The fd must be non-blocking.");
434
435/* C API for the same, without all the error checking */
436int
437PySignal_SetWakeupFd(int fd)
438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 int old_fd = wakeup_fd;
440 if (fd < 0)
441 fd = -1;
442 wakeup_fd = fd;
443 return old_fd;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000444}
445
446
Martin v. Löwis823725e2008-03-24 13:39:54 +0000447#ifdef HAVE_SETITIMER
448static PyObject *
449signal_setitimer(PyObject *self, PyObject *args)
450{
451 double first;
452 double interval = 0;
453 int which;
454 struct itimerval new, old;
455
456 if(!PyArg_ParseTuple(args, "id|d:setitimer", &which, &first, &interval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000458
459 timeval_from_double(first, &new.it_value);
460 timeval_from_double(interval, &new.it_interval);
461 /* Let OS check "which" value */
462 if (setitimer(which, &new, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 PyErr_SetFromErrno(ItimerError);
464 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000465 }
466
467 return itimer_retval(&old);
468}
469
470PyDoc_STRVAR(setitimer_doc,
471"setitimer(which, seconds[, interval])\n\
472\n\
473Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL\n\
474or ITIMER_PROF) to fire after value seconds and after\n\
475that every interval seconds.\n\
476The itimer can be cleared by setting seconds to zero.\n\
477\n\
478Returns old values as a tuple: (delay, interval).");
479#endif
480
481
482#ifdef HAVE_GETITIMER
483static PyObject *
484signal_getitimer(PyObject *self, PyObject *args)
485{
486 int which;
487 struct itimerval old;
488
489 if (!PyArg_ParseTuple(args, "i:getitimer", &which))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000491
492 if (getitimer(which, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 PyErr_SetFromErrno(ItimerError);
494 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000495 }
496
497 return itimer_retval(&old);
498}
499
500PyDoc_STRVAR(getitimer_doc,
501"getitimer(which)\n\
502\n\
503Returns current value of given itimer.");
504#endif
505
Victor Stinnera9293352011-04-30 15:21:58 +0200506#ifdef PYPTHREAD_SIGMASK
507/* Convert an iterable to a sigset.
508 Return 0 on success, return -1 and raise an exception on error. */
509
510static int
511iterable_to_sigset(PyObject *iterable, sigset_t *mask)
512{
513 int result = -1;
514 PyObject *iterator, *item;
515 long signum;
516 int err;
517
518 sigemptyset(mask);
519
520 iterator = PyObject_GetIter(iterable);
521 if (iterator == NULL)
522 goto error;
523
524 while (1)
525 {
526 item = PyIter_Next(iterator);
527 if (item == NULL) {
528 if (PyErr_Occurred())
529 goto error;
530 else
531 break;
532 }
533
534 signum = PyLong_AsLong(item);
535 Py_DECREF(item);
536 if (signum == -1 && PyErr_Occurred())
537 goto error;
538 if (0 < signum && signum < NSIG)
539 err = sigaddset(mask, (int)signum);
540 else
541 err = 1;
542 if (err) {
543 PyErr_Format(PyExc_ValueError,
544 "signal number %ld out of range", signum);
545 goto error;
546 }
547 }
548 result = 0;
549
550error:
551 Py_XDECREF(iterator);
552 return result;
553}
554
555static PyObject *
556signal_pthread_sigmask(PyObject *self, PyObject *args)
557{
558 int how, sig;
559 PyObject *signals, *result, *signum;
560 sigset_t mask, previous;
561 int err;
562
563 if (!PyArg_ParseTuple(args, "iO:pthread_sigmask", &how, &signals))
564 return NULL;
565
566 if (iterable_to_sigset(signals, &mask))
567 return NULL;
568
569 err = pthread_sigmask(how, &mask, &previous);
570 if (err != 0) {
571 errno = err;
572 PyErr_SetFromErrno(PyExc_RuntimeError);
573 return NULL;
574 }
575
Victor Stinnerd0e516d2011-05-03 14:57:12 +0200576 /* if signals was unblocked, signal handlers have been called */
577 if (PyErr_CheckSignals())
578 return NULL;
579
Victor Stinnera9293352011-04-30 15:21:58 +0200580 result = PyList_New(0);
581 if (result == NULL)
582 return NULL;
583
584 for (sig = 1; sig < NSIG; sig++) {
585 if (sigismember(&previous, sig) != 1)
586 continue;
587
588 /* Handle the case where it is a member by adding the signal to
589 the result list. Ignore the other cases because they mean the
590 signal isn't a member of the mask or the signal was invalid,
591 and an invalid signal must have been our fault in constructing
592 the loop boundaries. */
593 signum = PyLong_FromLong(sig);
594 if (signum == NULL) {
595 Py_DECREF(result);
596 return NULL;
597 }
598 if (PyList_Append(result, signum) == -1) {
599 Py_DECREF(signum);
600 Py_DECREF(result);
601 return NULL;
602 }
603 Py_DECREF(signum);
604 }
605 return result;
606}
607
608PyDoc_STRVAR(signal_pthread_sigmask_doc,
609"pthread_sigmask(how, mask) -> old mask\n\
610\n\
611Fetch and/or change the signal mask of the calling thread.");
612#endif /* #ifdef PYPTHREAD_SIGMASK */
613
Martin v. Löwis823725e2008-03-24 13:39:54 +0000614
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000615/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +0000616static PyMethodDef signal_methods[] = {
Guido van Rossum1171ee61997-08-22 20:42:00 +0000617#ifdef HAVE_ALARM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 {"alarm", signal_alarm, METH_VARARGS, alarm_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000619#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +0000620#ifdef HAVE_SETITIMER
621 {"setitimer", signal_setitimer, METH_VARARGS, setitimer_doc},
622#endif
623#ifdef HAVE_GETITIMER
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 {"getitimer", signal_getitimer, METH_VARARGS, getitimer_doc},
Martin v. Löwis823725e2008-03-24 13:39:54 +0000625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 {"signal", signal_signal, METH_VARARGS, signal_doc},
627 {"getsignal", signal_getsignal, METH_VARARGS, getsignal_doc},
628 {"set_wakeup_fd", signal_set_wakeup_fd, METH_VARARGS, set_wakeup_fd_doc},
Christian Heimes8640e742008-02-23 16:23:06 +0000629#ifdef HAVE_SIGINTERRUPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 {"siginterrupt", signal_siginterrupt, METH_VARARGS, siginterrupt_doc},
Christian Heimes8640e742008-02-23 16:23:06 +0000631#endif
Guido van Rossum1171ee61997-08-22 20:42:00 +0000632#ifdef HAVE_PAUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 {"pause", (PyCFunction)signal_pause,
Victor Stinnera9293352011-04-30 15:21:58 +0200634 METH_NOARGS, pause_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 {"default_int_handler", signal_default_int_handler,
637 METH_VARARGS, default_int_handler_doc},
Victor Stinnera9293352011-04-30 15:21:58 +0200638#ifdef PYPTHREAD_SIGMASK
639 {"pthread_sigmask", (PyCFunction)signal_pthread_sigmask,
640 METH_VARARGS, signal_pthread_sigmask_doc},
641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000643};
644
Barry Warsaw92971171997-01-03 00:14:25 +0000645
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000646PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000647"This module provides mechanisms to use signal handlers in Python.\n\
648\n\
649Functions:\n\
650\n\
651alarm() -- cause SIGALRM after a specified time [Unix only]\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +0000652setitimer() -- cause a signal (described below) after a specified\n\
653 float time and the timer may restart then [Unix only]\n\
654getitimer() -- get current value of timer [Unix only]\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000655signal() -- set the action for a given signal\n\
656getsignal() -- get the signal action for a given signal\n\
657pause() -- wait until a signal arrives [Unix only]\n\
658default_int_handler() -- default SIGINT handler\n\
659\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +0000660signal constants:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000661SIG_DFL -- used to refer to the system default handler\n\
662SIG_IGN -- used to ignore the signal\n\
663NSIG -- number of defined signals\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000664SIGINT, SIGTERM, etc. -- signal numbers\n\
665\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +0000666itimer constants:\n\
667ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
668 expiration\n\
669ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
670 and delivers SIGVTALRM upon expiration\n\
671ITIMER_PROF -- decrements both when the process is executing and\n\
672 when the system is executing on behalf of the process.\n\
673 Coupled with ITIMER_VIRTUAL, this timer is usually\n\
674 used to profile the time spent by the application\n\
675 in user and kernel space. SIGPROF is delivered upon\n\
676 expiration.\n\
677\n\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000678*** IMPORTANT NOTICE ***\n\
679A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000680the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000681
Martin v. Löwis1a214512008-06-11 05:26:20 +0000682static struct PyModuleDef signalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 PyModuleDef_HEAD_INIT,
684 "signal",
685 module_doc,
686 -1,
687 signal_methods,
688 NULL,
689 NULL,
690 NULL,
691 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000692};
693
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000694PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000695PyInit_signal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 PyObject *m, *d, *x;
698 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000699
700#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 main_thread = PyThread_get_thread_ident();
702 main_pid = getpid();
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000703#endif
704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 /* Create the module and add the functions */
706 m = PyModule_Create(&signalmodule);
707 if (m == NULL)
708 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 /* Add some symbolic constants to the module */
711 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
714 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
715 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
718 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
719 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +0000720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 x = PyLong_FromLong((long)NSIG);
722 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
723 goto finally;
724 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +0000725
Victor Stinnera9293352011-04-30 15:21:58 +0200726#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +0200727 if (PyModule_AddIntMacro(m, SIG_BLOCK))
728 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +0200729#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200730#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +0200731 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
732 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +0200733#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200734#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +0200735 if (PyModule_AddIntMacro(m, SIG_SETMASK))
736 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +0200737#endif
738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
740 if (!x)
741 goto finally;
742 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +0000743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 Handlers[0].tripped = 0;
745 for (i = 1; i < NSIG; i++) {
746 void (*t)(int);
747 t = PyOS_getsig(i);
748 Handlers[i].tripped = 0;
749 if (t == SIG_DFL)
750 Handlers[i].func = DefaultHandler;
751 else if (t == SIG_IGN)
752 Handlers[i].func = IgnoreHandler;
753 else
754 Handlers[i].func = Py_None; /* None of our business */
755 Py_INCREF(Handlers[i].func);
756 }
757 if (Handlers[SIGINT].func == DefaultHandler) {
758 /* Install default int handler */
759 Py_INCREF(IntHandler);
760 Py_DECREF(Handlers[SIGINT].func);
761 Handlers[SIGINT].func = IntHandler;
762 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
763 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000764
765#ifdef SIGHUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 x = PyLong_FromLong(SIGHUP);
767 PyDict_SetItemString(d, "SIGHUP", x);
768 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000769#endif
770#ifdef SIGINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 x = PyLong_FromLong(SIGINT);
772 PyDict_SetItemString(d, "SIGINT", x);
773 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000774#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +0000775#ifdef SIGBREAK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 x = PyLong_FromLong(SIGBREAK);
777 PyDict_SetItemString(d, "SIGBREAK", x);
778 Py_XDECREF(x);
Tim Peters1ce3cf72001-10-01 17:58:40 +0000779#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000780#ifdef SIGQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 x = PyLong_FromLong(SIGQUIT);
782 PyDict_SetItemString(d, "SIGQUIT", x);
783 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000784#endif
785#ifdef SIGILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 x = PyLong_FromLong(SIGILL);
787 PyDict_SetItemString(d, "SIGILL", x);
788 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000789#endif
790#ifdef SIGTRAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 x = PyLong_FromLong(SIGTRAP);
792 PyDict_SetItemString(d, "SIGTRAP", x);
793 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000794#endif
795#ifdef SIGIOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 x = PyLong_FromLong(SIGIOT);
797 PyDict_SetItemString(d, "SIGIOT", x);
798 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000799#endif
800#ifdef SIGABRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 x = PyLong_FromLong(SIGABRT);
802 PyDict_SetItemString(d, "SIGABRT", x);
803 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000804#endif
805#ifdef SIGEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 x = PyLong_FromLong(SIGEMT);
807 PyDict_SetItemString(d, "SIGEMT", x);
808 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000809#endif
810#ifdef SIGFPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 x = PyLong_FromLong(SIGFPE);
812 PyDict_SetItemString(d, "SIGFPE", x);
813 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000814#endif
815#ifdef SIGKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 x = PyLong_FromLong(SIGKILL);
817 PyDict_SetItemString(d, "SIGKILL", x);
818 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000819#endif
820#ifdef SIGBUS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 x = PyLong_FromLong(SIGBUS);
822 PyDict_SetItemString(d, "SIGBUS", x);
823 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000824#endif
825#ifdef SIGSEGV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 x = PyLong_FromLong(SIGSEGV);
827 PyDict_SetItemString(d, "SIGSEGV", x);
828 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000829#endif
830#ifdef SIGSYS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 x = PyLong_FromLong(SIGSYS);
832 PyDict_SetItemString(d, "SIGSYS", x);
833 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000834#endif
835#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 x = PyLong_FromLong(SIGPIPE);
837 PyDict_SetItemString(d, "SIGPIPE", x);
838 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000839#endif
840#ifdef SIGALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 x = PyLong_FromLong(SIGALRM);
842 PyDict_SetItemString(d, "SIGALRM", x);
843 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000844#endif
845#ifdef SIGTERM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 x = PyLong_FromLong(SIGTERM);
847 PyDict_SetItemString(d, "SIGTERM", x);
848 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000849#endif
850#ifdef SIGUSR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 x = PyLong_FromLong(SIGUSR1);
852 PyDict_SetItemString(d, "SIGUSR1", x);
853 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000854#endif
855#ifdef SIGUSR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 x = PyLong_FromLong(SIGUSR2);
857 PyDict_SetItemString(d, "SIGUSR2", x);
858 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000859#endif
860#ifdef SIGCLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 x = PyLong_FromLong(SIGCLD);
862 PyDict_SetItemString(d, "SIGCLD", x);
863 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000864#endif
865#ifdef SIGCHLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 x = PyLong_FromLong(SIGCHLD);
867 PyDict_SetItemString(d, "SIGCHLD", x);
868 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000869#endif
870#ifdef SIGPWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 x = PyLong_FromLong(SIGPWR);
872 PyDict_SetItemString(d, "SIGPWR", x);
873 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000874#endif
875#ifdef SIGIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 x = PyLong_FromLong(SIGIO);
877 PyDict_SetItemString(d, "SIGIO", x);
878 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000879#endif
880#ifdef SIGURG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 x = PyLong_FromLong(SIGURG);
882 PyDict_SetItemString(d, "SIGURG", x);
883 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000884#endif
885#ifdef SIGWINCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 x = PyLong_FromLong(SIGWINCH);
887 PyDict_SetItemString(d, "SIGWINCH", x);
888 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000889#endif
890#ifdef SIGPOLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 x = PyLong_FromLong(SIGPOLL);
892 PyDict_SetItemString(d, "SIGPOLL", x);
893 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000894#endif
895#ifdef SIGSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 x = PyLong_FromLong(SIGSTOP);
897 PyDict_SetItemString(d, "SIGSTOP", x);
898 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000899#endif
900#ifdef SIGTSTP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 x = PyLong_FromLong(SIGTSTP);
902 PyDict_SetItemString(d, "SIGTSTP", x);
903 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000904#endif
905#ifdef SIGCONT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 x = PyLong_FromLong(SIGCONT);
907 PyDict_SetItemString(d, "SIGCONT", x);
908 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000909#endif
910#ifdef SIGTTIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 x = PyLong_FromLong(SIGTTIN);
912 PyDict_SetItemString(d, "SIGTTIN", x);
913 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000914#endif
915#ifdef SIGTTOU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 x = PyLong_FromLong(SIGTTOU);
917 PyDict_SetItemString(d, "SIGTTOU", x);
918 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000919#endif
920#ifdef SIGVTALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 x = PyLong_FromLong(SIGVTALRM);
922 PyDict_SetItemString(d, "SIGVTALRM", x);
923 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000924#endif
925#ifdef SIGPROF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 x = PyLong_FromLong(SIGPROF);
927 PyDict_SetItemString(d, "SIGPROF", x);
928 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000929#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000930#ifdef SIGXCPU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 x = PyLong_FromLong(SIGXCPU);
932 PyDict_SetItemString(d, "SIGXCPU", x);
933 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000934#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000935#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 x = PyLong_FromLong(SIGXFSZ);
937 PyDict_SetItemString(d, "SIGXFSZ", x);
938 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +0000939#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +0000940#ifdef SIGRTMIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 x = PyLong_FromLong(SIGRTMIN);
942 PyDict_SetItemString(d, "SIGRTMIN", x);
943 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +0000944#endif
945#ifdef SIGRTMAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 x = PyLong_FromLong(SIGRTMAX);
947 PyDict_SetItemString(d, "SIGRTMAX", x);
948 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +0000949#endif
Martin v. Löwis175af252002-01-12 11:43:25 +0000950#ifdef SIGINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 x = PyLong_FromLong(SIGINFO);
952 PyDict_SetItemString(d, "SIGINFO", x);
953 Py_XDECREF(x);
Martin v. Löwis175af252002-01-12 11:43:25 +0000954#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +0000955
956#ifdef ITIMER_REAL
957 x = PyLong_FromLong(ITIMER_REAL);
958 PyDict_SetItemString(d, "ITIMER_REAL", x);
959 Py_DECREF(x);
960#endif
961#ifdef ITIMER_VIRTUAL
962 x = PyLong_FromLong(ITIMER_VIRTUAL);
963 PyDict_SetItemString(d, "ITIMER_VIRTUAL", x);
964 Py_DECREF(x);
965#endif
966#ifdef ITIMER_PROF
967 x = PyLong_FromLong(ITIMER_PROF);
968 PyDict_SetItemString(d, "ITIMER_PROF", x);
969 Py_DECREF(x);
970#endif
971
972#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 ItimerError = PyErr_NewException("signal.ItimerError",
974 PyExc_IOError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +0000975 if (ItimerError != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +0000977#endif
978
Brian Curtineb24d742010-04-12 17:16:38 +0000979#ifdef CTRL_C_EVENT
980 x = PyLong_FromLong(CTRL_C_EVENT);
981 PyDict_SetItemString(d, "CTRL_C_EVENT", x);
982 Py_DECREF(x);
983#endif
984
985#ifdef CTRL_BREAK_EVENT
986 x = PyLong_FromLong(CTRL_BREAK_EVENT);
987 PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x);
988 Py_DECREF(x);
989#endif
990
Martin v. Löwis1a214512008-06-11 05:26:20 +0000991 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 Py_DECREF(m);
993 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000994 }
Barry Warsaw92971171997-01-03 00:14:25 +0000995
Barry Warsaw92971171997-01-03 00:14:25 +0000996 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +0000997 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +0000998}
999
1000static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001001finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 int i;
1004 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 PyOS_setsig(SIGINT, old_siginthandler);
1007 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 for (i = 1; i < NSIG; i++) {
1010 func = Handlers[i].func;
1011 Handlers[i].tripped = 0;
1012 Handlers[i].func = NULL;
1013 if (i != SIGINT && func != NULL && func != Py_None &&
1014 func != DefaultHandler && func != IgnoreHandler)
1015 PyOS_setsig(i, SIG_DFL);
1016 Py_XDECREF(func);
1017 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 Py_XDECREF(IntHandler);
1020 IntHandler = NULL;
1021 Py_XDECREF(DefaultHandler);
1022 DefaultHandler = NULL;
1023 Py_XDECREF(IgnoreHandler);
1024 IgnoreHandler = NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001025}
1026
Barry Warsaw92971171997-01-03 00:14:25 +00001027
Barry Warsaw92971171997-01-03 00:14:25 +00001028/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001029int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001030PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 int i;
1033 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 if (!is_tripped)
1036 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001037
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001038#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 if (PyThread_get_thread_ident() != main_thread)
1040 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001041#endif
Christian Heimesb76922a2007-12-11 01:06:40 +00001042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 /*
1044 * The is_tripped variable is meant to speed up the calls to
1045 * PyErr_CheckSignals (both directly or via pending calls) when no
1046 * signal has arrived. This variable is set to 1 when a signal arrives
1047 * and it is set to 0 here, when we know some signals arrived. This way
1048 * we can run the registered handlers with no signals blocked.
1049 *
1050 * NOTE: with this approach we can have a situation where is_tripped is
1051 * 1 but we have no more signals to handle (Handlers[i].tripped
1052 * is 0 for every signal i). This won't do us any harm (except
1053 * we're gonna spent some cycles for nothing). This happens when
1054 * we receive a signal i after we zero is_tripped and before we
1055 * check Handlers[i].tripped.
1056 */
1057 is_tripped = 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 if (!(f = (PyObject *)PyEval_GetFrame()))
1060 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 for (i = 1; i < NSIG; i++) {
1063 if (Handlers[i].tripped) {
1064 PyObject *result = NULL;
1065 PyObject *arglist = Py_BuildValue("(iO)", i, f);
1066 Handlers[i].tripped = 0;
Barry Warsaw92971171997-01-03 00:14:25 +00001067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 if (arglist) {
1069 result = PyEval_CallObject(Handlers[i].func,
1070 arglist);
1071 Py_DECREF(arglist);
1072 }
1073 if (!result)
1074 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +00001075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 Py_DECREF(result);
1077 }
1078 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001081}
1082
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001083
Barry Warsaw92971171997-01-03 00:14:25 +00001084/* Replacements for intrcheck.c functionality
1085 * Declared in pyerrors.h
1086 */
1087void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001088PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001089{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001090 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001091}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001092
1093void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001094PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 PyObject *m = PyInit_signal();
1097 if (m) {
Victor Stinner49d3f252010-10-17 01:24:53 +00001098 _PyImport_FixupBuiltin(m, "signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 Py_DECREF(m);
1100 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001101}
1102
1103void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001104PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001107}
1108
1109int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001110PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001113#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 if (PyThread_get_thread_ident() != main_thread)
1115 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 Handlers[SIGINT].tripped = 0;
1118 return 1;
1119 }
1120 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001121}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001122
1123void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001124PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001125{
1126#ifdef WITH_THREAD
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001127 _PyGILState_Reinit();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 PyEval_ReInitThreads();
1129 main_thread = PyThread_get_thread_ident();
1130 main_pid = getpid();
1131 _PyImport_ReInitLock();
1132 PyThread_ReInitTLS();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001133#endif
1134}