blob: 94e6bcbf312a29d43d63d2063c7e5d705ff4db12 [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
Victor Stinner2ec6b172011-05-15 10:21:59 +020091static volatile struct {
92 sig_atomic_t tripped;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 PyObject *func;
Barry Warsaw92971171997-01-03 00:14:25 +000094} Handlers[NSIG];
Guido van Rossum398d9fe1994-05-11 08:59:13 +000095
Victor Stinner2ec6b172011-05-15 10:21:59 +020096static volatile sig_atomic_t wakeup_fd = -1;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +000097
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{
Victor Stinnerd49b1f12011-05-08 02:03:15 +0200179 unsigned char byte;
Victor Stinnerc13ef662011-05-25 02:35:58 +0200180
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200181 Handlers[sig_num].tripped = 1;
Victor Stinnerc13ef662011-05-25 02:35:58 +0200182 if (wakeup_fd != -1) {
183 byte = (unsigned char)sig_num;
184 write(wakeup_fd, &byte, 1);
185 }
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200186 if (is_tripped)
187 return;
188 /* Set is_tripped after setting .tripped, as it gets
189 cleared in PyErr_CheckSignals() before .tripped. */
190 is_tripped = 1;
191 Py_AddPendingCall(checksignals_witharg, NULL);
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200192}
193
194static void
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000195signal_handler(int sig_num)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000196{
Antoine Pitrou39a65912010-11-05 19:47:27 +0000197 int save_errno = errno;
198
199#if defined(WITH_THREAD) && defined(WITH_PTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 if (PyThread_get_thread_ident() != main_thread) {
201 pth_raise(*(pth_t *) main_thread, sig_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 }
Antoine Pitrou39a65912010-11-05 19:47:27 +0000203 else
Guido van Rossum9e8181b2000-09-19 00:46:46 +0000204#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000205 {
206#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 /* See NOTES section above */
Antoine Pitrou39a65912010-11-05 19:47:27 +0000208 if (getpid() == main_pid)
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000209#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000210 {
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200211 trip_signal(sig_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 }
Antoine Pitrou39a65912010-11-05 19:47:27 +0000213
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000214#ifndef HAVE_SIGACTION
Antoine Pitrou39a65912010-11-05 19:47:27 +0000215#ifdef SIGCHLD
216 /* To avoid infinite recursion, this signal remains
217 reset until explicit re-instated.
218 Don't clear the 'func' field as it is our pointer
219 to the Python handler... */
220 if (sig_num != SIGCHLD)
221#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 /* If the handler was not set up with sigaction, reinstall it. See
223 * Python/pythonrun.c for the implementation of PyOS_setsig which
224 * makes this true. See also issue8354. */
225 PyOS_setsig(sig_num, signal_handler);
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000226#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000227 }
228
229 /* Issue #10311: asynchronously executing signal handlers should not
230 mutate errno under the feet of unsuspecting C code. */
231 errno = save_errno;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000232}
Guido van Rossume4485b01994-09-07 14:32:49 +0000233
Guido van Rossum06d511d1995-03-10 15:13:48 +0000234
Guido van Rossum1171ee61997-08-22 20:42:00 +0000235#ifdef HAVE_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000236static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000237signal_alarm(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 int t;
240 if (!PyArg_ParseTuple(args, "i:alarm", &t))
241 return NULL;
242 /* alarm() returns the number of seconds remaining */
243 return PyLong_FromLong((long)alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000244}
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000245
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000246PyDoc_STRVAR(alarm_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000247"alarm(seconds)\n\
248\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000249Arrange for SIGALRM to arrive after the given number of seconds.");
Guido van Rossum06d511d1995-03-10 15:13:48 +0000250#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000251
Guido van Rossum1171ee61997-08-22 20:42:00 +0000252#ifdef HAVE_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000253static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +0000254signal_pause(PyObject *self)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 Py_BEGIN_ALLOW_THREADS
257 (void)pause();
258 Py_END_ALLOW_THREADS
259 /* make sure that any exceptions that got raised are propagated
260 * back into Python
261 */
262 if (PyErr_CheckSignals())
263 return NULL;
Barry Warsaw92971171997-01-03 00:14:25 +0000264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 Py_INCREF(Py_None);
266 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000267}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000268PyDoc_STRVAR(pause_doc,
Barry Warsaw1ee36ff1998-07-21 22:41:18 +0000269"pause()\n\
270\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000271Wait until a signal arrives.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000272
Guido van Rossum06d511d1995-03-10 15:13:48 +0000273#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000274
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000275
Guido van Rossume4485b01994-09-07 14:32:49 +0000276static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000277signal_signal(PyObject *self, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 PyObject *obj;
280 int sig_num;
281 PyObject *old_handler;
282 void (*func)(int);
283 if (!PyArg_ParseTuple(args, "iO:signal", &sig_num, &obj))
284 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000285#ifdef MS_WINDOWS
286 /* Validate that sig_num is one of the allowable signals */
Brian Curtinc734b312010-09-06 16:04:10 +0000287 switch (sig_num) {
288 case SIGABRT: break;
Brian Curtin9e88b5a2010-10-01 14:49:24 +0000289#ifdef SIGBREAK
290 /* Issue #10003: SIGBREAK is not documented as permitted, but works
291 and corresponds to CTRL_BREAK_EVENT. */
292 case SIGBREAK: break;
293#endif
Brian Curtinc734b312010-09-06 16:04:10 +0000294 case SIGFPE: break;
295 case SIGILL: break;
296 case SIGINT: break;
297 case SIGSEGV: break;
298 case SIGTERM: break;
299 default:
300 PyErr_SetString(PyExc_ValueError, "invalid signal value");
301 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000302 }
303#endif
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000304#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 if (PyThread_get_thread_ident() != main_thread) {
306 PyErr_SetString(PyExc_ValueError,
307 "signal only works in main thread");
308 return NULL;
309 }
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 if (sig_num < 1 || sig_num >= NSIG) {
312 PyErr_SetString(PyExc_ValueError,
313 "signal number out of range");
314 return NULL;
315 }
316 if (obj == IgnoreHandler)
317 func = SIG_IGN;
318 else if (obj == DefaultHandler)
319 func = SIG_DFL;
320 else if (!PyCallable_Check(obj)) {
321 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000322"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 return NULL;
324 }
325 else
326 func = signal_handler;
327 if (PyOS_setsig(sig_num, func) == SIG_ERR) {
Victor Stinner388196e2011-05-10 17:13:00 +0200328 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 return NULL;
330 }
331 old_handler = Handlers[sig_num].func;
332 Handlers[sig_num].tripped = 0;
333 Py_INCREF(obj);
334 Handlers[sig_num].func = obj;
335 return old_handler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000336}
337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000338PyDoc_STRVAR(signal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000339"signal(sig, action) -> action\n\
340\n\
341Set the action for the given signal. The action can be SIG_DFL,\n\
342SIG_IGN, or a callable Python object. The previous action is\n\
343returned. See getsignal() for possible return values.\n\
344\n\
345*** IMPORTANT NOTICE ***\n\
346A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000347the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000348
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000349
Guido van Rossume4485b01994-09-07 14:32:49 +0000350static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000351signal_getsignal(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000352{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 int sig_num;
354 PyObject *old_handler;
355 if (!PyArg_ParseTuple(args, "i:getsignal", &sig_num))
356 return NULL;
357 if (sig_num < 1 || sig_num >= NSIG) {
358 PyErr_SetString(PyExc_ValueError,
359 "signal number out of range");
360 return NULL;
361 }
362 old_handler = Handlers[sig_num].func;
363 Py_INCREF(old_handler);
364 return old_handler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000365}
366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000367PyDoc_STRVAR(getsignal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000368"getsignal(sig) -> action\n\
369\n\
370Return the current action for the given signal. The return value can be:\n\
371SIG_IGN -- if the signal is being ignored\n\
372SIG_DFL -- if the default action for the signal is in effect\n\
373None -- if an unknown handler is in effect\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000374anything else -- the callable Python object used as a handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000375
Christian Heimes8640e742008-02-23 16:23:06 +0000376#ifdef HAVE_SIGINTERRUPT
377PyDoc_STRVAR(siginterrupt_doc,
378"siginterrupt(sig, flag) -> None\n\
379change system call restart behaviour: if flag is False, system calls\n\
380will be restarted when interrupted by signal sig, else system calls\n\
381will be interrupted.");
382
383static PyObject *
384signal_siginterrupt(PyObject *self, PyObject *args)
385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 int sig_num;
387 int flag;
Christian Heimes8640e742008-02-23 16:23:06 +0000388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 if (!PyArg_ParseTuple(args, "ii:siginterrupt", &sig_num, &flag))
390 return NULL;
391 if (sig_num < 1 || sig_num >= NSIG) {
392 PyErr_SetString(PyExc_ValueError,
393 "signal number out of range");
394 return NULL;
395 }
396 if (siginterrupt(sig_num, flag)<0) {
Victor Stinner388196e2011-05-10 17:13:00 +0200397 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 return NULL;
399 }
Christian Heimes8640e742008-02-23 16:23:06 +0000400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 Py_INCREF(Py_None);
402 return Py_None;
Christian Heimes8640e742008-02-23 16:23:06 +0000403}
404
405#endif
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000406
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000407static PyObject *
408signal_set_wakeup_fd(PyObject *self, PyObject *args)
409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 struct stat buf;
411 int fd, old_fd;
412 if (!PyArg_ParseTuple(args, "i:set_wakeup_fd", &fd))
413 return NULL;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000414#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 if (PyThread_get_thread_ident() != main_thread) {
416 PyErr_SetString(PyExc_ValueError,
417 "set_wakeup_fd only works in main thread");
418 return NULL;
419 }
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000420#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 if (fd != -1 && fstat(fd, &buf) != 0) {
422 PyErr_SetString(PyExc_ValueError, "invalid fd");
423 return NULL;
424 }
425 old_fd = wakeup_fd;
426 wakeup_fd = fd;
427 return PyLong_FromLong(old_fd);
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000428}
429
430PyDoc_STRVAR(set_wakeup_fd_doc,
431"set_wakeup_fd(fd) -> fd\n\
432\n\
433Sets the fd to be written to (with '\\0') when a signal\n\
434comes in. A library can use this to wakeup select or poll.\n\
435The previous fd is returned.\n\
436\n\
437The fd must be non-blocking.");
438
439/* C API for the same, without all the error checking */
440int
441PySignal_SetWakeupFd(int fd)
442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 int old_fd = wakeup_fd;
444 if (fd < 0)
445 fd = -1;
446 wakeup_fd = fd;
447 return old_fd;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000448}
449
450
Martin v. Löwis823725e2008-03-24 13:39:54 +0000451#ifdef HAVE_SETITIMER
452static PyObject *
453signal_setitimer(PyObject *self, PyObject *args)
454{
455 double first;
456 double interval = 0;
457 int which;
458 struct itimerval new, old;
459
460 if(!PyArg_ParseTuple(args, "id|d:setitimer", &which, &first, &interval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000462
463 timeval_from_double(first, &new.it_value);
464 timeval_from_double(interval, &new.it_interval);
465 /* Let OS check "which" value */
466 if (setitimer(which, &new, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 PyErr_SetFromErrno(ItimerError);
468 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000469 }
470
471 return itimer_retval(&old);
472}
473
474PyDoc_STRVAR(setitimer_doc,
475"setitimer(which, seconds[, interval])\n\
476\n\
477Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL\n\
478or ITIMER_PROF) to fire after value seconds and after\n\
479that every interval seconds.\n\
480The itimer can be cleared by setting seconds to zero.\n\
481\n\
482Returns old values as a tuple: (delay, interval).");
483#endif
484
485
486#ifdef HAVE_GETITIMER
487static PyObject *
488signal_getitimer(PyObject *self, PyObject *args)
489{
490 int which;
491 struct itimerval old;
492
493 if (!PyArg_ParseTuple(args, "i:getitimer", &which))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000495
496 if (getitimer(which, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 PyErr_SetFromErrno(ItimerError);
498 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000499 }
500
501 return itimer_retval(&old);
502}
503
504PyDoc_STRVAR(getitimer_doc,
505"getitimer(which)\n\
506\n\
507Returns current value of given itimer.");
508#endif
509
Victor Stinnerb3e72192011-05-08 01:46:11 +0200510#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT)
Victor Stinnera9293352011-04-30 15:21:58 +0200511/* Convert an iterable to a sigset.
512 Return 0 on success, return -1 and raise an exception on error. */
513
514static int
515iterable_to_sigset(PyObject *iterable, sigset_t *mask)
516{
517 int result = -1;
518 PyObject *iterator, *item;
519 long signum;
520 int err;
521
522 sigemptyset(mask);
523
524 iterator = PyObject_GetIter(iterable);
525 if (iterator == NULL)
526 goto error;
527
528 while (1)
529 {
530 item = PyIter_Next(iterator);
531 if (item == NULL) {
532 if (PyErr_Occurred())
533 goto error;
534 else
535 break;
536 }
537
538 signum = PyLong_AsLong(item);
539 Py_DECREF(item);
540 if (signum == -1 && PyErr_Occurred())
541 goto error;
542 if (0 < signum && signum < NSIG)
543 err = sigaddset(mask, (int)signum);
544 else
545 err = 1;
546 if (err) {
547 PyErr_Format(PyExc_ValueError,
548 "signal number %ld out of range", signum);
549 goto error;
550 }
551 }
552 result = 0;
553
554error:
555 Py_XDECREF(iterator);
556 return result;
557}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200558#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200559
Victor Stinnerb3e72192011-05-08 01:46:11 +0200560#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
Victor Stinner35b300c2011-05-04 13:20:35 +0200561static PyObject*
562sigset_to_set(sigset_t mask)
563{
564 PyObject *signum, *result;
565 int sig;
566
567 result = PySet_New(0);
568 if (result == NULL)
569 return NULL;
570
571 for (sig = 1; sig < NSIG; sig++) {
572 if (sigismember(&mask, sig) != 1)
573 continue;
574
575 /* Handle the case where it is a member by adding the signal to
576 the result list. Ignore the other cases because they mean the
577 signal isn't a member of the mask or the signal was invalid,
578 and an invalid signal must have been our fault in constructing
579 the loop boundaries. */
580 signum = PyLong_FromLong(sig);
581 if (signum == NULL) {
582 Py_DECREF(result);
583 return NULL;
584 }
585 if (PySet_Add(result, signum) == -1) {
586 Py_DECREF(signum);
587 Py_DECREF(result);
588 return NULL;
589 }
590 Py_DECREF(signum);
591 }
592 return result;
593}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200594#endif
Victor Stinner35b300c2011-05-04 13:20:35 +0200595
Victor Stinnerb3e72192011-05-08 01:46:11 +0200596#ifdef PYPTHREAD_SIGMASK
Victor Stinnera9293352011-04-30 15:21:58 +0200597static PyObject *
598signal_pthread_sigmask(PyObject *self, PyObject *args)
599{
Victor Stinner35b300c2011-05-04 13:20:35 +0200600 int how;
601 PyObject *signals;
Victor Stinnera9293352011-04-30 15:21:58 +0200602 sigset_t mask, previous;
603 int err;
604
605 if (!PyArg_ParseTuple(args, "iO:pthread_sigmask", &how, &signals))
606 return NULL;
607
608 if (iterable_to_sigset(signals, &mask))
609 return NULL;
610
611 err = pthread_sigmask(how, &mask, &previous);
612 if (err != 0) {
613 errno = err;
Victor Stinnerb3e72192011-05-08 01:46:11 +0200614 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera9293352011-04-30 15:21:58 +0200615 return NULL;
616 }
617
Victor Stinnerd0e516d2011-05-03 14:57:12 +0200618 /* if signals was unblocked, signal handlers have been called */
619 if (PyErr_CheckSignals())
620 return NULL;
621
Victor Stinner35b300c2011-05-04 13:20:35 +0200622 return sigset_to_set(previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200623}
624
625PyDoc_STRVAR(signal_pthread_sigmask_doc,
626"pthread_sigmask(how, mask) -> old mask\n\
627\n\
628Fetch and/or change the signal mask of the calling thread.");
629#endif /* #ifdef PYPTHREAD_SIGMASK */
630
Martin v. Löwis823725e2008-03-24 13:39:54 +0000631
Victor Stinnerb3e72192011-05-08 01:46:11 +0200632#ifdef HAVE_SIGPENDING
633static PyObject *
634signal_sigpending(PyObject *self)
635{
636 int err;
637 sigset_t mask;
638 err = sigpending(&mask);
639 if (err)
640 return PyErr_SetFromErrno(PyExc_OSError);
641 return sigset_to_set(mask);
642}
643
644PyDoc_STRVAR(signal_sigpending_doc,
645"sigpending() -> list\n\
646\n\
647Examine pending signals.");
648#endif /* #ifdef HAVE_SIGPENDING */
649
650
651#ifdef HAVE_SIGWAIT
652static PyObject *
653signal_sigwait(PyObject *self, PyObject *args)
654{
655 PyObject *signals;
656 sigset_t set;
657 int err, signum;
658
659 if (!PyArg_ParseTuple(args, "O:sigwait", &signals))
660 return NULL;
661
662 if (iterable_to_sigset(signals, &set))
663 return NULL;
664
Victor Stinner10c30d62011-06-10 01:39:53 +0200665 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200666 err = sigwait(&set, &signum);
Victor Stinner10c30d62011-06-10 01:39:53 +0200667 Py_END_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200668 if (err) {
669 errno = err;
670 return PyErr_SetFromErrno(PyExc_OSError);
671 }
672
673 return PyLong_FromLong(signum);
674}
675
676PyDoc_STRVAR(signal_sigwait_doc,
677"sigwait(sigset) -> signum\n\
678\n\
679Wait a signal.");
680#endif /* #ifdef HAVE_SIGPENDING */
681
682
683#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
684static PyObject *
685signal_pthread_kill(PyObject *self, PyObject *args)
686{
687 long tid;
688 int signum;
689 int err;
690
691 if (!PyArg_ParseTuple(args, "li:pthread_kill", &tid, &signum))
692 return NULL;
693
Victor Stinner86e104a2011-05-09 14:45:38 +0200694 err = pthread_kill((pthread_t)tid, signum);
Victor Stinnerb3e72192011-05-08 01:46:11 +0200695 if (err != 0) {
696 errno = err;
697 PyErr_SetFromErrno(PyExc_OSError);
698 return NULL;
699 }
700
701 /* the signal may have been send to the current thread */
702 if (PyErr_CheckSignals())
703 return NULL;
704
705 Py_RETURN_NONE;
706}
707
708PyDoc_STRVAR(signal_pthread_kill_doc,
709"pthread_kill(thread_id, signum)\n\
710\n\
711Send a signal to a thread.");
712#endif /* #if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD) */
713
714
715
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000716/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +0000717static PyMethodDef signal_methods[] = {
Guido van Rossum1171ee61997-08-22 20:42:00 +0000718#ifdef HAVE_ALARM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 {"alarm", signal_alarm, METH_VARARGS, alarm_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000720#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +0000721#ifdef HAVE_SETITIMER
722 {"setitimer", signal_setitimer, METH_VARARGS, setitimer_doc},
723#endif
724#ifdef HAVE_GETITIMER
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 {"getitimer", signal_getitimer, METH_VARARGS, getitimer_doc},
Martin v. Löwis823725e2008-03-24 13:39:54 +0000726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 {"signal", signal_signal, METH_VARARGS, signal_doc},
728 {"getsignal", signal_getsignal, METH_VARARGS, getsignal_doc},
729 {"set_wakeup_fd", signal_set_wakeup_fd, METH_VARARGS, set_wakeup_fd_doc},
Christian Heimes8640e742008-02-23 16:23:06 +0000730#ifdef HAVE_SIGINTERRUPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 {"siginterrupt", signal_siginterrupt, METH_VARARGS, siginterrupt_doc},
Christian Heimes8640e742008-02-23 16:23:06 +0000732#endif
Guido van Rossum1171ee61997-08-22 20:42:00 +0000733#ifdef HAVE_PAUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 {"pause", (PyCFunction)signal_pause,
Victor Stinnera9293352011-04-30 15:21:58 +0200735 METH_NOARGS, pause_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 {"default_int_handler", signal_default_int_handler,
738 METH_VARARGS, default_int_handler_doc},
Victor Stinnerb3e72192011-05-08 01:46:11 +0200739#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
740 {"pthread_kill", (PyCFunction)signal_pthread_kill,
741 METH_VARARGS, signal_pthread_kill_doc},
742#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200743#ifdef PYPTHREAD_SIGMASK
744 {"pthread_sigmask", (PyCFunction)signal_pthread_sigmask,
745 METH_VARARGS, signal_pthread_sigmask_doc},
746#endif
Victor Stinnerb3e72192011-05-08 01:46:11 +0200747#ifdef HAVE_SIGPENDING
748 {"sigpending", (PyCFunction)signal_sigpending,
749 METH_NOARGS, signal_sigpending_doc},
750#endif
751#ifdef HAVE_SIGWAIT
752 {"sigwait", (PyCFunction)signal_sigwait,
753 METH_VARARGS, signal_sigwait_doc},
754#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000756};
757
Barry Warsaw92971171997-01-03 00:14:25 +0000758
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000759PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000760"This module provides mechanisms to use signal handlers in Python.\n\
761\n\
762Functions:\n\
763\n\
764alarm() -- cause SIGALRM after a specified time [Unix only]\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +0000765setitimer() -- cause a signal (described below) after a specified\n\
766 float time and the timer may restart then [Unix only]\n\
767getitimer() -- get current value of timer [Unix only]\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000768signal() -- set the action for a given signal\n\
769getsignal() -- get the signal action for a given signal\n\
770pause() -- wait until a signal arrives [Unix only]\n\
771default_int_handler() -- default SIGINT handler\n\
772\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +0000773signal constants:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000774SIG_DFL -- used to refer to the system default handler\n\
775SIG_IGN -- used to ignore the signal\n\
776NSIG -- number of defined signals\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000777SIGINT, SIGTERM, etc. -- signal numbers\n\
778\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +0000779itimer constants:\n\
780ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
781 expiration\n\
782ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
783 and delivers SIGVTALRM upon expiration\n\
784ITIMER_PROF -- decrements both when the process is executing and\n\
785 when the system is executing on behalf of the process.\n\
786 Coupled with ITIMER_VIRTUAL, this timer is usually\n\
787 used to profile the time spent by the application\n\
788 in user and kernel space. SIGPROF is delivered upon\n\
789 expiration.\n\
790\n\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000791*** IMPORTANT NOTICE ***\n\
792A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000793the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000794
Martin v. Löwis1a214512008-06-11 05:26:20 +0000795static struct PyModuleDef signalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 PyModuleDef_HEAD_INIT,
797 "signal",
798 module_doc,
799 -1,
800 signal_methods,
801 NULL,
802 NULL,
803 NULL,
804 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000805};
806
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000807PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000808PyInit_signal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 PyObject *m, *d, *x;
811 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000812
813#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 main_thread = PyThread_get_thread_ident();
815 main_pid = getpid();
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000816#endif
817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 /* Create the module and add the functions */
819 m = PyModule_Create(&signalmodule);
820 if (m == NULL)
821 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 /* Add some symbolic constants to the module */
824 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
827 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
828 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
831 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
832 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +0000833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 x = PyLong_FromLong((long)NSIG);
835 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
836 goto finally;
837 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +0000838
Victor Stinnera9293352011-04-30 15:21:58 +0200839#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +0200840 if (PyModule_AddIntMacro(m, SIG_BLOCK))
841 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +0200842#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200843#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +0200844 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
845 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +0200846#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200847#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +0200848 if (PyModule_AddIntMacro(m, SIG_SETMASK))
849 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +0200850#endif
851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
853 if (!x)
854 goto finally;
855 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +0000856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 Handlers[0].tripped = 0;
858 for (i = 1; i < NSIG; i++) {
859 void (*t)(int);
860 t = PyOS_getsig(i);
861 Handlers[i].tripped = 0;
862 if (t == SIG_DFL)
863 Handlers[i].func = DefaultHandler;
864 else if (t == SIG_IGN)
865 Handlers[i].func = IgnoreHandler;
866 else
867 Handlers[i].func = Py_None; /* None of our business */
868 Py_INCREF(Handlers[i].func);
869 }
870 if (Handlers[SIGINT].func == DefaultHandler) {
871 /* Install default int handler */
872 Py_INCREF(IntHandler);
873 Py_DECREF(Handlers[SIGINT].func);
874 Handlers[SIGINT].func = IntHandler;
875 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
876 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000877
878#ifdef SIGHUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 x = PyLong_FromLong(SIGHUP);
880 PyDict_SetItemString(d, "SIGHUP", x);
881 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000882#endif
883#ifdef SIGINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 x = PyLong_FromLong(SIGINT);
885 PyDict_SetItemString(d, "SIGINT", x);
886 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000887#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +0000888#ifdef SIGBREAK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 x = PyLong_FromLong(SIGBREAK);
890 PyDict_SetItemString(d, "SIGBREAK", x);
891 Py_XDECREF(x);
Tim Peters1ce3cf72001-10-01 17:58:40 +0000892#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000893#ifdef SIGQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 x = PyLong_FromLong(SIGQUIT);
895 PyDict_SetItemString(d, "SIGQUIT", x);
896 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000897#endif
898#ifdef SIGILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 x = PyLong_FromLong(SIGILL);
900 PyDict_SetItemString(d, "SIGILL", x);
901 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000902#endif
903#ifdef SIGTRAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 x = PyLong_FromLong(SIGTRAP);
905 PyDict_SetItemString(d, "SIGTRAP", x);
906 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000907#endif
908#ifdef SIGIOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 x = PyLong_FromLong(SIGIOT);
910 PyDict_SetItemString(d, "SIGIOT", x);
911 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000912#endif
913#ifdef SIGABRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 x = PyLong_FromLong(SIGABRT);
915 PyDict_SetItemString(d, "SIGABRT", x);
916 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000917#endif
918#ifdef SIGEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 x = PyLong_FromLong(SIGEMT);
920 PyDict_SetItemString(d, "SIGEMT", x);
921 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000922#endif
923#ifdef SIGFPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 x = PyLong_FromLong(SIGFPE);
925 PyDict_SetItemString(d, "SIGFPE", x);
926 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000927#endif
928#ifdef SIGKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 x = PyLong_FromLong(SIGKILL);
930 PyDict_SetItemString(d, "SIGKILL", x);
931 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000932#endif
933#ifdef SIGBUS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 x = PyLong_FromLong(SIGBUS);
935 PyDict_SetItemString(d, "SIGBUS", x);
936 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000937#endif
938#ifdef SIGSEGV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 x = PyLong_FromLong(SIGSEGV);
940 PyDict_SetItemString(d, "SIGSEGV", x);
941 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000942#endif
943#ifdef SIGSYS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 x = PyLong_FromLong(SIGSYS);
945 PyDict_SetItemString(d, "SIGSYS", x);
946 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000947#endif
948#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 x = PyLong_FromLong(SIGPIPE);
950 PyDict_SetItemString(d, "SIGPIPE", x);
951 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000952#endif
953#ifdef SIGALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 x = PyLong_FromLong(SIGALRM);
955 PyDict_SetItemString(d, "SIGALRM", x);
956 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000957#endif
958#ifdef SIGTERM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 x = PyLong_FromLong(SIGTERM);
960 PyDict_SetItemString(d, "SIGTERM", x);
961 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000962#endif
963#ifdef SIGUSR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 x = PyLong_FromLong(SIGUSR1);
965 PyDict_SetItemString(d, "SIGUSR1", x);
966 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000967#endif
968#ifdef SIGUSR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 x = PyLong_FromLong(SIGUSR2);
970 PyDict_SetItemString(d, "SIGUSR2", x);
971 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000972#endif
973#ifdef SIGCLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 x = PyLong_FromLong(SIGCLD);
975 PyDict_SetItemString(d, "SIGCLD", x);
976 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000977#endif
978#ifdef SIGCHLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 x = PyLong_FromLong(SIGCHLD);
980 PyDict_SetItemString(d, "SIGCHLD", x);
981 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000982#endif
983#ifdef SIGPWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 x = PyLong_FromLong(SIGPWR);
985 PyDict_SetItemString(d, "SIGPWR", x);
986 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000987#endif
988#ifdef SIGIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 x = PyLong_FromLong(SIGIO);
990 PyDict_SetItemString(d, "SIGIO", x);
991 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000992#endif
993#ifdef SIGURG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 x = PyLong_FromLong(SIGURG);
995 PyDict_SetItemString(d, "SIGURG", x);
996 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000997#endif
998#ifdef SIGWINCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 x = PyLong_FromLong(SIGWINCH);
1000 PyDict_SetItemString(d, "SIGWINCH", x);
1001 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001002#endif
1003#ifdef SIGPOLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 x = PyLong_FromLong(SIGPOLL);
1005 PyDict_SetItemString(d, "SIGPOLL", x);
1006 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001007#endif
1008#ifdef SIGSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 x = PyLong_FromLong(SIGSTOP);
1010 PyDict_SetItemString(d, "SIGSTOP", x);
1011 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001012#endif
1013#ifdef SIGTSTP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 x = PyLong_FromLong(SIGTSTP);
1015 PyDict_SetItemString(d, "SIGTSTP", x);
1016 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001017#endif
1018#ifdef SIGCONT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 x = PyLong_FromLong(SIGCONT);
1020 PyDict_SetItemString(d, "SIGCONT", x);
1021 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001022#endif
1023#ifdef SIGTTIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 x = PyLong_FromLong(SIGTTIN);
1025 PyDict_SetItemString(d, "SIGTTIN", x);
1026 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001027#endif
1028#ifdef SIGTTOU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 x = PyLong_FromLong(SIGTTOU);
1030 PyDict_SetItemString(d, "SIGTTOU", x);
1031 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001032#endif
1033#ifdef SIGVTALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 x = PyLong_FromLong(SIGVTALRM);
1035 PyDict_SetItemString(d, "SIGVTALRM", x);
1036 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001037#endif
1038#ifdef SIGPROF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 x = PyLong_FromLong(SIGPROF);
1040 PyDict_SetItemString(d, "SIGPROF", x);
1041 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001042#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001043#ifdef SIGXCPU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 x = PyLong_FromLong(SIGXCPU);
1045 PyDict_SetItemString(d, "SIGXCPU", x);
1046 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001047#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001048#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 x = PyLong_FromLong(SIGXFSZ);
1050 PyDict_SetItemString(d, "SIGXFSZ", x);
1051 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001052#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001053#ifdef SIGRTMIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 x = PyLong_FromLong(SIGRTMIN);
1055 PyDict_SetItemString(d, "SIGRTMIN", x);
1056 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001057#endif
1058#ifdef SIGRTMAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 x = PyLong_FromLong(SIGRTMAX);
1060 PyDict_SetItemString(d, "SIGRTMAX", x);
1061 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001062#endif
Martin v. Löwis175af252002-01-12 11:43:25 +00001063#ifdef SIGINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 x = PyLong_FromLong(SIGINFO);
1065 PyDict_SetItemString(d, "SIGINFO", x);
1066 Py_XDECREF(x);
Martin v. Löwis175af252002-01-12 11:43:25 +00001067#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001068
1069#ifdef ITIMER_REAL
1070 x = PyLong_FromLong(ITIMER_REAL);
1071 PyDict_SetItemString(d, "ITIMER_REAL", x);
1072 Py_DECREF(x);
1073#endif
1074#ifdef ITIMER_VIRTUAL
1075 x = PyLong_FromLong(ITIMER_VIRTUAL);
1076 PyDict_SetItemString(d, "ITIMER_VIRTUAL", x);
1077 Py_DECREF(x);
1078#endif
1079#ifdef ITIMER_PROF
1080 x = PyLong_FromLong(ITIMER_PROF);
1081 PyDict_SetItemString(d, "ITIMER_PROF", x);
1082 Py_DECREF(x);
1083#endif
1084
1085#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 ItimerError = PyErr_NewException("signal.ItimerError",
1087 PyExc_IOError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +00001088 if (ItimerError != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +00001090#endif
1091
Brian Curtineb24d742010-04-12 17:16:38 +00001092#ifdef CTRL_C_EVENT
1093 x = PyLong_FromLong(CTRL_C_EVENT);
1094 PyDict_SetItemString(d, "CTRL_C_EVENT", x);
1095 Py_DECREF(x);
1096#endif
1097
1098#ifdef CTRL_BREAK_EVENT
1099 x = PyLong_FromLong(CTRL_BREAK_EVENT);
1100 PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x);
1101 Py_DECREF(x);
1102#endif
1103
Martin v. Löwis1a214512008-06-11 05:26:20 +00001104 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 Py_DECREF(m);
1106 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001107 }
Barry Warsaw92971171997-01-03 00:14:25 +00001108
Barry Warsaw92971171997-01-03 00:14:25 +00001109 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001110 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +00001111}
1112
1113static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001114finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 int i;
1117 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 PyOS_setsig(SIGINT, old_siginthandler);
1120 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 for (i = 1; i < NSIG; i++) {
1123 func = Handlers[i].func;
1124 Handlers[i].tripped = 0;
1125 Handlers[i].func = NULL;
1126 if (i != SIGINT && func != NULL && func != Py_None &&
1127 func != DefaultHandler && func != IgnoreHandler)
1128 PyOS_setsig(i, SIG_DFL);
1129 Py_XDECREF(func);
1130 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 Py_XDECREF(IntHandler);
1133 IntHandler = NULL;
1134 Py_XDECREF(DefaultHandler);
1135 DefaultHandler = NULL;
1136 Py_XDECREF(IgnoreHandler);
1137 IgnoreHandler = NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001138}
1139
Barry Warsaw92971171997-01-03 00:14:25 +00001140
Barry Warsaw92971171997-01-03 00:14:25 +00001141/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001142int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001143PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 int i;
1146 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 if (!is_tripped)
1149 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001150
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001151#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 if (PyThread_get_thread_ident() != main_thread)
1153 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001154#endif
Christian Heimesb76922a2007-12-11 01:06:40 +00001155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 /*
1157 * The is_tripped variable is meant to speed up the calls to
1158 * PyErr_CheckSignals (both directly or via pending calls) when no
1159 * signal has arrived. This variable is set to 1 when a signal arrives
1160 * and it is set to 0 here, when we know some signals arrived. This way
1161 * we can run the registered handlers with no signals blocked.
1162 *
1163 * NOTE: with this approach we can have a situation where is_tripped is
1164 * 1 but we have no more signals to handle (Handlers[i].tripped
1165 * is 0 for every signal i). This won't do us any harm (except
1166 * we're gonna spent some cycles for nothing). This happens when
1167 * we receive a signal i after we zero is_tripped and before we
1168 * check Handlers[i].tripped.
1169 */
1170 is_tripped = 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 if (!(f = (PyObject *)PyEval_GetFrame()))
1173 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 for (i = 1; i < NSIG; i++) {
1176 if (Handlers[i].tripped) {
1177 PyObject *result = NULL;
1178 PyObject *arglist = Py_BuildValue("(iO)", i, f);
1179 Handlers[i].tripped = 0;
Barry Warsaw92971171997-01-03 00:14:25 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 if (arglist) {
1182 result = PyEval_CallObject(Handlers[i].func,
1183 arglist);
1184 Py_DECREF(arglist);
1185 }
1186 if (!result)
1187 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 Py_DECREF(result);
1190 }
1191 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001194}
1195
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001196
Barry Warsaw92971171997-01-03 00:14:25 +00001197/* Replacements for intrcheck.c functionality
1198 * Declared in pyerrors.h
1199 */
1200void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001201PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001202{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001203 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001204}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001205
1206void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001207PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 PyObject *m = PyInit_signal();
1210 if (m) {
Victor Stinner49d3f252010-10-17 01:24:53 +00001211 _PyImport_FixupBuiltin(m, "signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 Py_DECREF(m);
1213 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001214}
1215
1216void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001217PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001220}
1221
1222int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001223PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001226#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 if (PyThread_get_thread_ident() != main_thread)
1228 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 Handlers[SIGINT].tripped = 0;
1231 return 1;
1232 }
1233 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001234}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001235
1236void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001237PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001238{
1239#ifdef WITH_THREAD
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001240 _PyGILState_Reinit();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 PyEval_ReInitThreads();
1242 main_thread = PyThread_get_thread_ident();
1243 main_pid = getpid();
1244 _PyImport_ReInitLock();
1245 PyThread_ReInitTLS();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001246#endif
1247}