blob: 081063375731109fed0ce51324aae870a189ac80 [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"
Serhiy Storchaka7cf55992013-02-10 21:56:49 +02007#ifndef MS_WINDOWS
8#include "posixmodule.h"
9#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +000010
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000011#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +020012#include <windows.h>
Benjamin Peterson2614cda2010-03-21 22:36:19 +000013#ifdef HAVE_PROCESS_H
Guido van Rossum644a12b1997-04-09 19:24:53 +000014#include <process.h>
15#endif
Benjamin Peterson2614cda2010-03-21 22:36:19 +000016#endif
Guido van Rossum644a12b1997-04-09 19:24:53 +000017
Benjamin Peterson2614cda2010-03-21 22:36:19 +000018#ifdef HAVE_SIGNAL_H
Guido van Rossum398d9fe1994-05-11 08:59:13 +000019#include <signal.h>
Benjamin Peterson2614cda2010-03-21 22:36:19 +000020#endif
21#ifdef HAVE_SYS_STAT_H
Christian Heimes5fb7c2a2007-12-24 08:52:31 +000022#include <sys/stat.h>
Benjamin Peterson2614cda2010-03-21 22:36:19 +000023#endif
Martin v. Löwis3bf3cc02008-03-24 14:05:07 +000024#ifdef HAVE_SYS_TIME_H
Martin v. Löwis823725e2008-03-24 13:39:54 +000025#include <sys/time.h>
Martin v. Löwis3bf3cc02008-03-24 14:05:07 +000026#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +000027
Victor Stinnera9293352011-04-30 15:21:58 +020028#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
29# define PYPTHREAD_SIGMASK
30#endif
31
32#if defined(PYPTHREAD_SIGMASK) && defined(HAVE_PTHREAD_H)
33# include <pthread.h>
34#endif
35
Guido van Rossumbb4ba121994-06-23 11:25:45 +000036#ifndef SIG_ERR
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +000037#define SIG_ERR ((PyOS_sighandler_t)(-1))
Guido van Rossumbb4ba121994-06-23 11:25:45 +000038#endif
39
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000040#ifndef NSIG
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000041# if defined(_NSIG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042# define NSIG _NSIG /* For BSD/SysV */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000043# elif defined(_SIGMAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044# define NSIG (_SIGMAX + 1) /* For QNX */
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 djgpp */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000047# else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048# define NSIG 64 /* Use a reasonable default value */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000049# endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000050#endif
51
52
Guido van Rossumbb4ba121994-06-23 11:25:45 +000053/*
54 NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
55
56 When threads are supported, we want the following semantics:
57
58 - only the main thread can set a signal handler
59 - any thread can get a signal handler
60 - signals are only delivered to the main thread
61
62 I.e. we don't support "synchronous signals" like SIGFPE (catching
63 this doesn't make much sense in Python anyway) nor do we support
64 signals as a means of inter-thread communication, since not all
65 thread implementations support that (at least our thread library
66 doesn't).
67
68 We still have the problem that in some implementations signals
69 generated by the keyboard (e.g. SIGINT) are delivered to all
70 threads (e.g. SGI), while in others (e.g. Solaris) such signals are
71 delivered to one random thread (an intermediate possibility would
Guido van Rossuma3c04b01995-01-12 11:29:01 +000072 be to deliver it to the main thread -- POSIX?). For now, we have
Guido van Rossumbb4ba121994-06-23 11:25:45 +000073 a working implementation that works in all three cases -- the
74 handler ignores signals if getpid() isn't the same as in the main
75 thread. XXX This is a hack.
76
Guido van Rossum9e8181b2000-09-19 00:46:46 +000077 GNU pth is a user-space threading library, and as such, all threads
78 run within the same process. In this case, if the currently running
79 thread is not the main_thread, send the signal to the main_thread.
Guido van Rossumbb4ba121994-06-23 11:25:45 +000080*/
81
82#ifdef WITH_THREAD
Guido van Rossum295b8e51997-06-06 21:16:41 +000083#include <sys/types.h> /* For pid_t */
Guido van Rossum49b56061998-10-01 20:42:43 +000084#include "pythread.h"
Guido van Rossumbb4ba121994-06-23 11:25:45 +000085static long main_thread;
86static pid_t main_pid;
87#endif
88
Victor Stinner2ec6b172011-05-15 10:21:59 +020089static volatile struct {
90 sig_atomic_t tripped;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 PyObject *func;
Barry Warsaw92971171997-01-03 00:14:25 +000092} Handlers[NSIG];
Guido van Rossum398d9fe1994-05-11 08:59:13 +000093
Victor Stinner2ec6b172011-05-15 10:21:59 +020094static volatile sig_atomic_t wakeup_fd = -1;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +000095
Christian Heimesb76922a2007-12-11 01:06:40 +000096/* Speed up sigcheck() when none tripped */
97static volatile sig_atomic_t is_tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +000098
Barry Warsaw92971171997-01-03 00:14:25 +000099static PyObject *DefaultHandler;
100static PyObject *IgnoreHandler;
101static PyObject *IntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000102
Martin v. Löwisf58de1b2001-03-06 12:13:56 +0000103/* On Solaris 8, gcc will produce a warning that the function
104 declaration is not a prototype. This is caused by the definition of
105 SIG_DFL as (void (*)())0; the correct declaration would have been
106 (void (*)(int))0. */
107
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000108static PyOS_sighandler_t old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +0000109
Antoine Pitrou6dd381e2011-11-21 21:26:56 +0100110#ifdef MS_WINDOWS
111static HANDLE sigint_event = NULL;
112#endif
113
Martin v. Löwis823725e2008-03-24 13:39:54 +0000114#ifdef HAVE_GETITIMER
115static PyObject *ItimerError;
116
117/* auxiliary functions for setitimer/getitimer */
118static void
119timeval_from_double(double d, struct timeval *tv)
120{
121 tv->tv_sec = floor(d);
122 tv->tv_usec = fmod(d, 1.0) * 1000000.0;
123}
124
Christian Heimes1a8501c2008-10-02 19:56:01 +0000125Py_LOCAL_INLINE(double)
Martin v. Löwis823725e2008-03-24 13:39:54 +0000126double_from_timeval(struct timeval *tv)
127{
128 return tv->tv_sec + (double)(tv->tv_usec / 1000000.0);
129}
130
131static PyObject *
132itimer_retval(struct itimerval *iv)
133{
134 PyObject *r, *v;
135
136 r = PyTuple_New(2);
137 if (r == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000139
140 if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_value)))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 Py_DECREF(r);
142 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000143 }
144
145 PyTuple_SET_ITEM(r, 0, v);
146
147 if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_interval)))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 Py_DECREF(r);
149 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000150 }
151
152 PyTuple_SET_ITEM(r, 1, v);
153
154 return r;
155}
156#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000157
Guido van Rossume4485b01994-09-07 14:32:49 +0000158static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000159signal_default_int_handler(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 PyErr_SetNone(PyExc_KeyboardInterrupt);
162 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000163}
164
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000165PyDoc_STRVAR(default_int_handler_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000166"default_int_handler(...)\n\
167\n\
Michael W. Hudson24ec2112004-06-17 15:55:53 +0000168The default handler for SIGINT installed by Python.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000169It raises KeyboardInterrupt.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000170
Thomas Wouters0796b002000-07-22 23:49:30 +0000171
172static int
173checksignals_witharg(void * unused)
174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 return PyErr_CheckSignals();
Thomas Wouters0796b002000-07-22 23:49:30 +0000176}
177
Tim Peters4f1b2082000-07-23 21:18:09 +0000178static void
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200179trip_signal(int sig_num)
180{
Victor Stinnerd49b1f12011-05-08 02:03:15 +0200181 unsigned char byte;
Victor Stinnerc13ef662011-05-25 02:35:58 +0200182
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200183 Handlers[sig_num].tripped = 1;
Victor Stinnerc13ef662011-05-25 02:35:58 +0200184 if (wakeup_fd != -1) {
185 byte = (unsigned char)sig_num;
186 write(wakeup_fd, &byte, 1);
187 }
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200188 if (is_tripped)
189 return;
190 /* Set is_tripped after setting .tripped, as it gets
191 cleared in PyErr_CheckSignals() before .tripped. */
192 is_tripped = 1;
193 Py_AddPendingCall(checksignals_witharg, NULL);
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200194}
195
196static void
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000197signal_handler(int sig_num)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000198{
Antoine Pitrou39a65912010-11-05 19:47:27 +0000199 int save_errno = errno;
200
201#if defined(WITH_THREAD) && defined(WITH_PTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 if (PyThread_get_thread_ident() != main_thread) {
203 pth_raise(*(pth_t *) main_thread, sig_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 }
Antoine Pitrou39a65912010-11-05 19:47:27 +0000205 else
Guido van Rossum9e8181b2000-09-19 00:46:46 +0000206#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000207 {
208#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 /* See NOTES section above */
Antoine Pitrou39a65912010-11-05 19:47:27 +0000210 if (getpid() == main_pid)
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000211#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000212 {
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200213 trip_signal(sig_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 }
Antoine Pitrou39a65912010-11-05 19:47:27 +0000215
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000216#ifndef HAVE_SIGACTION
Antoine Pitrou39a65912010-11-05 19:47:27 +0000217#ifdef SIGCHLD
218 /* To avoid infinite recursion, this signal remains
219 reset until explicit re-instated.
220 Don't clear the 'func' field as it is our pointer
221 to the Python handler... */
222 if (sig_num != SIGCHLD)
223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 /* If the handler was not set up with sigaction, reinstall it. See
225 * Python/pythonrun.c for the implementation of PyOS_setsig which
226 * makes this true. See also issue8354. */
227 PyOS_setsig(sig_num, signal_handler);
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000228#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000229 }
230
231 /* Issue #10311: asynchronously executing signal handlers should not
232 mutate errno under the feet of unsuspecting C code. */
233 errno = save_errno;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +0100234
235#ifdef MS_WINDOWS
236 if (sig_num == SIGINT)
237 SetEvent(sigint_event);
238#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000239}
Guido van Rossume4485b01994-09-07 14:32:49 +0000240
Guido van Rossum06d511d1995-03-10 15:13:48 +0000241
Guido van Rossum1171ee61997-08-22 20:42:00 +0000242#ifdef HAVE_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000243static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000244signal_alarm(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 int t;
247 if (!PyArg_ParseTuple(args, "i:alarm", &t))
248 return NULL;
249 /* alarm() returns the number of seconds remaining */
250 return PyLong_FromLong((long)alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000251}
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000252
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000253PyDoc_STRVAR(alarm_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000254"alarm(seconds)\n\
255\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000256Arrange for SIGALRM to arrive after the given number of seconds.");
Guido van Rossum06d511d1995-03-10 15:13:48 +0000257#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000258
Guido van Rossum1171ee61997-08-22 20:42:00 +0000259#ifdef HAVE_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000260static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +0000261signal_pause(PyObject *self)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 Py_BEGIN_ALLOW_THREADS
264 (void)pause();
265 Py_END_ALLOW_THREADS
266 /* make sure that any exceptions that got raised are propagated
267 * back into Python
268 */
269 if (PyErr_CheckSignals())
270 return NULL;
Barry Warsaw92971171997-01-03 00:14:25 +0000271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 Py_INCREF(Py_None);
273 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000274}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000275PyDoc_STRVAR(pause_doc,
Barry Warsaw1ee36ff1998-07-21 22:41:18 +0000276"pause()\n\
277\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000278Wait until a signal arrives.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000279
Guido van Rossum06d511d1995-03-10 15:13:48 +0000280#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000281
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000282
Guido van Rossume4485b01994-09-07 14:32:49 +0000283static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000284signal_signal(PyObject *self, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 PyObject *obj;
287 int sig_num;
288 PyObject *old_handler;
289 void (*func)(int);
290 if (!PyArg_ParseTuple(args, "iO:signal", &sig_num, &obj))
291 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000292#ifdef MS_WINDOWS
293 /* Validate that sig_num is one of the allowable signals */
Brian Curtinc734b312010-09-06 16:04:10 +0000294 switch (sig_num) {
295 case SIGABRT: break;
Brian Curtin9e88b5a2010-10-01 14:49:24 +0000296#ifdef SIGBREAK
297 /* Issue #10003: SIGBREAK is not documented as permitted, but works
298 and corresponds to CTRL_BREAK_EVENT. */
299 case SIGBREAK: break;
300#endif
Brian Curtinc734b312010-09-06 16:04:10 +0000301 case SIGFPE: break;
302 case SIGILL: break;
303 case SIGINT: break;
304 case SIGSEGV: break;
305 case SIGTERM: break;
306 default:
307 PyErr_SetString(PyExc_ValueError, "invalid signal value");
308 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000309 }
310#endif
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000311#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 if (PyThread_get_thread_ident() != main_thread) {
313 PyErr_SetString(PyExc_ValueError,
314 "signal only works in main thread");
315 return NULL;
316 }
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 if (sig_num < 1 || sig_num >= NSIG) {
319 PyErr_SetString(PyExc_ValueError,
320 "signal number out of range");
321 return NULL;
322 }
323 if (obj == IgnoreHandler)
324 func = SIG_IGN;
325 else if (obj == DefaultHandler)
326 func = SIG_DFL;
327 else if (!PyCallable_Check(obj)) {
328 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000329"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 return NULL;
331 }
332 else
333 func = signal_handler;
334 if (PyOS_setsig(sig_num, func) == SIG_ERR) {
Victor Stinner388196e2011-05-10 17:13:00 +0200335 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 return NULL;
337 }
338 old_handler = Handlers[sig_num].func;
339 Handlers[sig_num].tripped = 0;
340 Py_INCREF(obj);
341 Handlers[sig_num].func = obj;
Antoine Pitrouc8c952c2013-05-04 23:16:59 +0200342 if (old_handler != NULL)
343 return old_handler;
344 else
345 Py_RETURN_NONE;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000346}
347
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000348PyDoc_STRVAR(signal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000349"signal(sig, action) -> action\n\
350\n\
351Set the action for the given signal. The action can be SIG_DFL,\n\
352SIG_IGN, or a callable Python object. The previous action is\n\
353returned. See getsignal() for possible return values.\n\
354\n\
355*** IMPORTANT NOTICE ***\n\
356A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000357the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000358
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000359
Guido van Rossume4485b01994-09-07 14:32:49 +0000360static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000361signal_getsignal(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 int sig_num;
364 PyObject *old_handler;
365 if (!PyArg_ParseTuple(args, "i:getsignal", &sig_num))
366 return NULL;
367 if (sig_num < 1 || sig_num >= NSIG) {
368 PyErr_SetString(PyExc_ValueError,
369 "signal number out of range");
370 return NULL;
371 }
372 old_handler = Handlers[sig_num].func;
Antoine Pitrouc8c952c2013-05-04 23:16:59 +0200373 if (old_handler != NULL) {
374 Py_INCREF(old_handler);
375 return old_handler;
376 }
377 else {
378 Py_RETURN_NONE;
379 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000380}
381
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000382PyDoc_STRVAR(getsignal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000383"getsignal(sig) -> action\n\
384\n\
385Return the current action for the given signal. The return value can be:\n\
386SIG_IGN -- if the signal is being ignored\n\
387SIG_DFL -- if the default action for the signal is in effect\n\
388None -- if an unknown handler is in effect\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000389anything else -- the callable Python object used as a handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000390
Christian Heimes8640e742008-02-23 16:23:06 +0000391#ifdef HAVE_SIGINTERRUPT
392PyDoc_STRVAR(siginterrupt_doc,
393"siginterrupt(sig, flag) -> None\n\
394change system call restart behaviour: if flag is False, system calls\n\
395will be restarted when interrupted by signal sig, else system calls\n\
396will be interrupted.");
397
398static PyObject *
399signal_siginterrupt(PyObject *self, PyObject *args)
400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 int sig_num;
402 int flag;
Christian Heimes8640e742008-02-23 16:23:06 +0000403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 if (!PyArg_ParseTuple(args, "ii:siginterrupt", &sig_num, &flag))
405 return NULL;
406 if (sig_num < 1 || sig_num >= NSIG) {
407 PyErr_SetString(PyExc_ValueError,
408 "signal number out of range");
409 return NULL;
410 }
411 if (siginterrupt(sig_num, flag)<0) {
Victor Stinner388196e2011-05-10 17:13:00 +0200412 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 return NULL;
414 }
Christian Heimes8640e742008-02-23 16:23:06 +0000415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 Py_INCREF(Py_None);
417 return Py_None;
Christian Heimes8640e742008-02-23 16:23:06 +0000418}
419
420#endif
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000421
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000422static PyObject *
423signal_set_wakeup_fd(PyObject *self, PyObject *args)
424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 struct stat buf;
426 int fd, old_fd;
427 if (!PyArg_ParseTuple(args, "i:set_wakeup_fd", &fd))
428 return NULL;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000429#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 if (PyThread_get_thread_ident() != main_thread) {
431 PyErr_SetString(PyExc_ValueError,
432 "set_wakeup_fd only works in main thread");
433 return NULL;
434 }
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000435#endif
Benjamin Petersonc68a4a02013-01-18 00:10:24 -0500436 if (fd != -1 && (!_PyVerify_fd(fd) || fstat(fd, &buf) != 0)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 PyErr_SetString(PyExc_ValueError, "invalid fd");
438 return NULL;
439 }
440 old_fd = wakeup_fd;
441 wakeup_fd = fd;
442 return PyLong_FromLong(old_fd);
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000443}
444
445PyDoc_STRVAR(set_wakeup_fd_doc,
446"set_wakeup_fd(fd) -> fd\n\
447\n\
448Sets the fd to be written to (with '\\0') when a signal\n\
449comes in. A library can use this to wakeup select or poll.\n\
450The previous fd is returned.\n\
451\n\
452The fd must be non-blocking.");
453
454/* C API for the same, without all the error checking */
455int
456PySignal_SetWakeupFd(int fd)
457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 int old_fd = wakeup_fd;
459 if (fd < 0)
460 fd = -1;
461 wakeup_fd = fd;
462 return old_fd;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000463}
464
465
Martin v. Löwis823725e2008-03-24 13:39:54 +0000466#ifdef HAVE_SETITIMER
467static PyObject *
468signal_setitimer(PyObject *self, PyObject *args)
469{
470 double first;
471 double interval = 0;
472 int which;
473 struct itimerval new, old;
474
475 if(!PyArg_ParseTuple(args, "id|d:setitimer", &which, &first, &interval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000477
478 timeval_from_double(first, &new.it_value);
479 timeval_from_double(interval, &new.it_interval);
480 /* Let OS check "which" value */
481 if (setitimer(which, &new, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 PyErr_SetFromErrno(ItimerError);
483 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000484 }
485
486 return itimer_retval(&old);
487}
488
489PyDoc_STRVAR(setitimer_doc,
490"setitimer(which, seconds[, interval])\n\
491\n\
492Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL\n\
493or ITIMER_PROF) to fire after value seconds and after\n\
494that every interval seconds.\n\
495The itimer can be cleared by setting seconds to zero.\n\
496\n\
497Returns old values as a tuple: (delay, interval).");
498#endif
499
500
501#ifdef HAVE_GETITIMER
502static PyObject *
503signal_getitimer(PyObject *self, PyObject *args)
504{
505 int which;
506 struct itimerval old;
507
508 if (!PyArg_ParseTuple(args, "i:getitimer", &which))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000510
511 if (getitimer(which, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 PyErr_SetFromErrno(ItimerError);
513 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000514 }
515
516 return itimer_retval(&old);
517}
518
519PyDoc_STRVAR(getitimer_doc,
520"getitimer(which)\n\
521\n\
522Returns current value of given itimer.");
523#endif
524
Ross Lagerwallbc808222011-06-25 12:13:40 +0200525#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \
526 defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinnera9293352011-04-30 15:21:58 +0200527/* Convert an iterable to a sigset.
528 Return 0 on success, return -1 and raise an exception on error. */
529
530static int
531iterable_to_sigset(PyObject *iterable, sigset_t *mask)
532{
533 int result = -1;
534 PyObject *iterator, *item;
535 long signum;
536 int err;
537
538 sigemptyset(mask);
539
540 iterator = PyObject_GetIter(iterable);
541 if (iterator == NULL)
542 goto error;
543
544 while (1)
545 {
546 item = PyIter_Next(iterator);
547 if (item == NULL) {
548 if (PyErr_Occurred())
549 goto error;
550 else
551 break;
552 }
553
554 signum = PyLong_AsLong(item);
555 Py_DECREF(item);
556 if (signum == -1 && PyErr_Occurred())
557 goto error;
558 if (0 < signum && signum < NSIG)
559 err = sigaddset(mask, (int)signum);
560 else
561 err = 1;
562 if (err) {
563 PyErr_Format(PyExc_ValueError,
564 "signal number %ld out of range", signum);
565 goto error;
566 }
567 }
568 result = 0;
569
570error:
571 Py_XDECREF(iterator);
572 return result;
573}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200574#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200575
Victor Stinnerb3e72192011-05-08 01:46:11 +0200576#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
Victor Stinner35b300c2011-05-04 13:20:35 +0200577static PyObject*
578sigset_to_set(sigset_t mask)
579{
580 PyObject *signum, *result;
581 int sig;
582
583 result = PySet_New(0);
584 if (result == NULL)
585 return NULL;
586
587 for (sig = 1; sig < NSIG; sig++) {
588 if (sigismember(&mask, sig) != 1)
589 continue;
590
591 /* Handle the case where it is a member by adding the signal to
592 the result list. Ignore the other cases because they mean the
593 signal isn't a member of the mask or the signal was invalid,
594 and an invalid signal must have been our fault in constructing
595 the loop boundaries. */
596 signum = PyLong_FromLong(sig);
597 if (signum == NULL) {
598 Py_DECREF(result);
599 return NULL;
600 }
601 if (PySet_Add(result, signum) == -1) {
602 Py_DECREF(signum);
603 Py_DECREF(result);
604 return NULL;
605 }
606 Py_DECREF(signum);
607 }
608 return result;
609}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200610#endif
Victor Stinner35b300c2011-05-04 13:20:35 +0200611
Victor Stinnerb3e72192011-05-08 01:46:11 +0200612#ifdef PYPTHREAD_SIGMASK
Victor Stinnera9293352011-04-30 15:21:58 +0200613static PyObject *
614signal_pthread_sigmask(PyObject *self, PyObject *args)
615{
Victor Stinner35b300c2011-05-04 13:20:35 +0200616 int how;
617 PyObject *signals;
Victor Stinnera9293352011-04-30 15:21:58 +0200618 sigset_t mask, previous;
619 int err;
620
621 if (!PyArg_ParseTuple(args, "iO:pthread_sigmask", &how, &signals))
622 return NULL;
623
624 if (iterable_to_sigset(signals, &mask))
625 return NULL;
626
627 err = pthread_sigmask(how, &mask, &previous);
628 if (err != 0) {
629 errno = err;
Victor Stinnerb3e72192011-05-08 01:46:11 +0200630 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera9293352011-04-30 15:21:58 +0200631 return NULL;
632 }
633
Victor Stinnerd0e516d2011-05-03 14:57:12 +0200634 /* if signals was unblocked, signal handlers have been called */
635 if (PyErr_CheckSignals())
636 return NULL;
637
Victor Stinner35b300c2011-05-04 13:20:35 +0200638 return sigset_to_set(previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200639}
640
641PyDoc_STRVAR(signal_pthread_sigmask_doc,
642"pthread_sigmask(how, mask) -> old mask\n\
643\n\
644Fetch and/or change the signal mask of the calling thread.");
645#endif /* #ifdef PYPTHREAD_SIGMASK */
646
Martin v. Löwis823725e2008-03-24 13:39:54 +0000647
Victor Stinnerb3e72192011-05-08 01:46:11 +0200648#ifdef HAVE_SIGPENDING
649static PyObject *
650signal_sigpending(PyObject *self)
651{
652 int err;
653 sigset_t mask;
654 err = sigpending(&mask);
655 if (err)
656 return PyErr_SetFromErrno(PyExc_OSError);
657 return sigset_to_set(mask);
658}
659
660PyDoc_STRVAR(signal_sigpending_doc,
661"sigpending() -> list\n\
662\n\
663Examine pending signals.");
664#endif /* #ifdef HAVE_SIGPENDING */
665
666
667#ifdef HAVE_SIGWAIT
668static PyObject *
669signal_sigwait(PyObject *self, PyObject *args)
670{
671 PyObject *signals;
672 sigset_t set;
673 int err, signum;
674
675 if (!PyArg_ParseTuple(args, "O:sigwait", &signals))
676 return NULL;
677
678 if (iterable_to_sigset(signals, &set))
679 return NULL;
680
Victor Stinner10c30d62011-06-10 01:39:53 +0200681 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200682 err = sigwait(&set, &signum);
Victor Stinner10c30d62011-06-10 01:39:53 +0200683 Py_END_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200684 if (err) {
685 errno = err;
686 return PyErr_SetFromErrno(PyExc_OSError);
687 }
688
689 return PyLong_FromLong(signum);
690}
691
692PyDoc_STRVAR(signal_sigwait_doc,
693"sigwait(sigset) -> signum\n\
694\n\
695Wait a signal.");
696#endif /* #ifdef HAVE_SIGPENDING */
697
Ross Lagerwallbc808222011-06-25 12:13:40 +0200698#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
699static int initialized;
700static PyStructSequence_Field struct_siginfo_fields[] = {
701 {"si_signo", "signal number"},
702 {"si_code", "signal code"},
703 {"si_errno", "errno associated with this signal"},
704 {"si_pid", "sending process ID"},
705 {"si_uid", "real user ID of sending process"},
706 {"si_status", "exit value or signal"},
707 {"si_band", "band event for SIGPOLL"},
708 {0}
709};
710
711PyDoc_STRVAR(struct_siginfo__doc__,
712"struct_siginfo: Result from sigwaitinfo or sigtimedwait.\n\n\
713This object may be accessed either as a tuple of\n\
714(si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band),\n\
715or via the attributes si_signo, si_code, and so on.");
716
717static PyStructSequence_Desc struct_siginfo_desc = {
718 "signal.struct_siginfo", /* name */
719 struct_siginfo__doc__, /* doc */
720 struct_siginfo_fields, /* fields */
721 7 /* n_in_sequence */
722};
723
724static PyTypeObject SiginfoType;
725
726static PyObject *
727fill_siginfo(siginfo_t *si)
728{
729 PyObject *result = PyStructSequence_New(&SiginfoType);
730 if (!result)
731 return NULL;
732
733 PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo)));
734 PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code)));
735 PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno)));
736 PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid));
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200737 PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid));
Ross Lagerwallbc808222011-06-25 12:13:40 +0200738 PyStructSequence_SET_ITEM(result, 5,
739 PyLong_FromLong((long)(si->si_status)));
740 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
741 if (PyErr_Occurred()) {
742 Py_DECREF(result);
743 return NULL;
744 }
745
746 return result;
747}
748#endif
749
750#ifdef HAVE_SIGWAITINFO
751static PyObject *
752signal_sigwaitinfo(PyObject *self, PyObject *args)
753{
754 PyObject *signals;
755 sigset_t set;
756 siginfo_t si;
757 int err;
758
759 if (!PyArg_ParseTuple(args, "O:sigwaitinfo", &signals))
760 return NULL;
761
762 if (iterable_to_sigset(signals, &set))
763 return NULL;
764
765 Py_BEGIN_ALLOW_THREADS
766 err = sigwaitinfo(&set, &si);
767 Py_END_ALLOW_THREADS
768 if (err == -1)
769 return PyErr_SetFromErrno(PyExc_OSError);
770
771 return fill_siginfo(&si);
772}
773
774PyDoc_STRVAR(signal_sigwaitinfo_doc,
775"sigwaitinfo(sigset) -> struct_siginfo\n\
776\n\
777Wait synchronously for a signal until one of the signals in *sigset* is\n\
778delivered.\n\
779Returns a struct_siginfo containing information about the signal.");
780#endif /* #ifdef HAVE_SIGWAITINFO */
781
782#ifdef HAVE_SIGTIMEDWAIT
783static PyObject *
784signal_sigtimedwait(PyObject *self, PyObject *args)
785{
786 PyObject *signals, *timeout;
787 struct timespec buf;
788 sigset_t set;
789 siginfo_t si;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200790 time_t tv_sec;
791 long tv_nsec;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200792 int err;
793
Victor Stinner643cd682012-03-02 22:54:03 +0100794 if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
795 &signals, &timeout))
Ross Lagerwallbc808222011-06-25 12:13:40 +0200796 return NULL;
797
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200798 if (_PyTime_ObjectToTimespec(timeout, &tv_sec, &tv_nsec) == -1)
Ross Lagerwallbc808222011-06-25 12:13:40 +0200799 return NULL;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200800 buf.tv_sec = tv_sec;
801 buf.tv_nsec = tv_nsec;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200802
803 if (buf.tv_sec < 0 || buf.tv_nsec < 0) {
804 PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
805 return NULL;
806 }
807
808 if (iterable_to_sigset(signals, &set))
809 return NULL;
810
811 Py_BEGIN_ALLOW_THREADS
812 err = sigtimedwait(&set, &si, &buf);
813 Py_END_ALLOW_THREADS
814 if (err == -1) {
815 if (errno == EAGAIN)
816 Py_RETURN_NONE;
817 else
818 return PyErr_SetFromErrno(PyExc_OSError);
819 }
820
821 return fill_siginfo(&si);
822}
823
824PyDoc_STRVAR(signal_sigtimedwait_doc,
825"sigtimedwait(sigset, (timeout_sec, timeout_nsec)) -> struct_siginfo\n\
826\n\
827Like sigwaitinfo(), but with a timeout specified as a tuple of (seconds,\n\
828nanoseconds).");
829#endif /* #ifdef HAVE_SIGTIMEDWAIT */
830
Victor Stinnerb3e72192011-05-08 01:46:11 +0200831
832#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
833static PyObject *
834signal_pthread_kill(PyObject *self, PyObject *args)
835{
836 long tid;
837 int signum;
838 int err;
839
840 if (!PyArg_ParseTuple(args, "li:pthread_kill", &tid, &signum))
841 return NULL;
842
Victor Stinner86e104a2011-05-09 14:45:38 +0200843 err = pthread_kill((pthread_t)tid, signum);
Victor Stinnerb3e72192011-05-08 01:46:11 +0200844 if (err != 0) {
845 errno = err;
846 PyErr_SetFromErrno(PyExc_OSError);
847 return NULL;
848 }
849
850 /* the signal may have been send to the current thread */
851 if (PyErr_CheckSignals())
852 return NULL;
853
854 Py_RETURN_NONE;
855}
856
857PyDoc_STRVAR(signal_pthread_kill_doc,
858"pthread_kill(thread_id, signum)\n\
859\n\
860Send a signal to a thread.");
861#endif /* #if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD) */
862
863
864
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000865/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +0000866static PyMethodDef signal_methods[] = {
Guido van Rossum1171ee61997-08-22 20:42:00 +0000867#ifdef HAVE_ALARM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 {"alarm", signal_alarm, METH_VARARGS, alarm_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000869#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +0000870#ifdef HAVE_SETITIMER
871 {"setitimer", signal_setitimer, METH_VARARGS, setitimer_doc},
872#endif
873#ifdef HAVE_GETITIMER
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 {"getitimer", signal_getitimer, METH_VARARGS, getitimer_doc},
Martin v. Löwis823725e2008-03-24 13:39:54 +0000875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 {"signal", signal_signal, METH_VARARGS, signal_doc},
877 {"getsignal", signal_getsignal, METH_VARARGS, getsignal_doc},
878 {"set_wakeup_fd", signal_set_wakeup_fd, METH_VARARGS, set_wakeup_fd_doc},
Christian Heimes8640e742008-02-23 16:23:06 +0000879#ifdef HAVE_SIGINTERRUPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 {"siginterrupt", signal_siginterrupt, METH_VARARGS, siginterrupt_doc},
Christian Heimes8640e742008-02-23 16:23:06 +0000881#endif
Guido van Rossum1171ee61997-08-22 20:42:00 +0000882#ifdef HAVE_PAUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 {"pause", (PyCFunction)signal_pause,
Victor Stinnera9293352011-04-30 15:21:58 +0200884 METH_NOARGS, pause_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 {"default_int_handler", signal_default_int_handler,
887 METH_VARARGS, default_int_handler_doc},
Victor Stinnerb3e72192011-05-08 01:46:11 +0200888#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
889 {"pthread_kill", (PyCFunction)signal_pthread_kill,
890 METH_VARARGS, signal_pthread_kill_doc},
891#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200892#ifdef PYPTHREAD_SIGMASK
893 {"pthread_sigmask", (PyCFunction)signal_pthread_sigmask,
894 METH_VARARGS, signal_pthread_sigmask_doc},
895#endif
Victor Stinnerb3e72192011-05-08 01:46:11 +0200896#ifdef HAVE_SIGPENDING
897 {"sigpending", (PyCFunction)signal_sigpending,
898 METH_NOARGS, signal_sigpending_doc},
899#endif
900#ifdef HAVE_SIGWAIT
901 {"sigwait", (PyCFunction)signal_sigwait,
902 METH_VARARGS, signal_sigwait_doc},
903#endif
Ross Lagerwallbc808222011-06-25 12:13:40 +0200904#ifdef HAVE_SIGWAITINFO
905 {"sigwaitinfo", (PyCFunction)signal_sigwaitinfo,
906 METH_VARARGS, signal_sigwaitinfo_doc},
907#endif
908#ifdef HAVE_SIGTIMEDWAIT
909 {"sigtimedwait", (PyCFunction)signal_sigtimedwait,
910 METH_VARARGS, signal_sigtimedwait_doc},
911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000913};
914
Barry Warsaw92971171997-01-03 00:14:25 +0000915
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000916PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000917"This module provides mechanisms to use signal handlers in Python.\n\
918\n\
919Functions:\n\
920\n\
921alarm() -- cause SIGALRM after a specified time [Unix only]\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +0000922setitimer() -- cause a signal (described below) after a specified\n\
923 float time and the timer may restart then [Unix only]\n\
924getitimer() -- get current value of timer [Unix only]\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000925signal() -- set the action for a given signal\n\
926getsignal() -- get the signal action for a given signal\n\
927pause() -- wait until a signal arrives [Unix only]\n\
928default_int_handler() -- default SIGINT handler\n\
929\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +0000930signal constants:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000931SIG_DFL -- used to refer to the system default handler\n\
932SIG_IGN -- used to ignore the signal\n\
933NSIG -- number of defined signals\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000934SIGINT, SIGTERM, etc. -- signal numbers\n\
935\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +0000936itimer constants:\n\
937ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
938 expiration\n\
939ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
940 and delivers SIGVTALRM upon expiration\n\
941ITIMER_PROF -- decrements both when the process is executing and\n\
942 when the system is executing on behalf of the process.\n\
943 Coupled with ITIMER_VIRTUAL, this timer is usually\n\
944 used to profile the time spent by the application\n\
945 in user and kernel space. SIGPROF is delivered upon\n\
946 expiration.\n\
947\n\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000948*** IMPORTANT NOTICE ***\n\
949A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000950the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000951
Martin v. Löwis1a214512008-06-11 05:26:20 +0000952static struct PyModuleDef signalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 PyModuleDef_HEAD_INIT,
954 "signal",
955 module_doc,
956 -1,
957 signal_methods,
958 NULL,
959 NULL,
960 NULL,
961 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000962};
963
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000964PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000965PyInit_signal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 PyObject *m, *d, *x;
968 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000969
970#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 main_thread = PyThread_get_thread_ident();
972 main_pid = getpid();
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000973#endif
974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 /* Create the module and add the functions */
976 m = PyModule_Create(&signalmodule);
977 if (m == NULL)
978 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000979
Ross Lagerwallbc808222011-06-25 12:13:40 +0200980#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinner1c8f0592013-07-22 22:24:54 +0200981 if (!initialized) {
982 if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0)
983 return NULL;
984 }
Ross Lagerwallbc808222011-06-25 12:13:40 +0200985 Py_INCREF((PyObject*) &SiginfoType);
986 PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
987 initialized = 1;
988#endif
989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 /* Add some symbolic constants to the module */
991 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
994 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
995 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
998 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
999 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 x = PyLong_FromLong((long)NSIG);
1002 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
1003 goto finally;
1004 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +00001005
Victor Stinnera9293352011-04-30 15:21:58 +02001006#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001007 if (PyModule_AddIntMacro(m, SIG_BLOCK))
1008 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001009#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001010#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001011 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
1012 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001013#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001014#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +02001015 if (PyModule_AddIntMacro(m, SIG_SETMASK))
1016 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001017#endif
1018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
1020 if (!x)
1021 goto finally;
1022 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +00001023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 Handlers[0].tripped = 0;
1025 for (i = 1; i < NSIG; i++) {
1026 void (*t)(int);
1027 t = PyOS_getsig(i);
1028 Handlers[i].tripped = 0;
1029 if (t == SIG_DFL)
1030 Handlers[i].func = DefaultHandler;
1031 else if (t == SIG_IGN)
1032 Handlers[i].func = IgnoreHandler;
1033 else
1034 Handlers[i].func = Py_None; /* None of our business */
1035 Py_INCREF(Handlers[i].func);
1036 }
1037 if (Handlers[SIGINT].func == DefaultHandler) {
1038 /* Install default int handler */
1039 Py_INCREF(IntHandler);
1040 Py_DECREF(Handlers[SIGINT].func);
1041 Handlers[SIGINT].func = IntHandler;
1042 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
1043 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001044
1045#ifdef SIGHUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 x = PyLong_FromLong(SIGHUP);
1047 PyDict_SetItemString(d, "SIGHUP", x);
1048 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001049#endif
1050#ifdef SIGINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 x = PyLong_FromLong(SIGINT);
1052 PyDict_SetItemString(d, "SIGINT", x);
1053 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001054#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +00001055#ifdef SIGBREAK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 x = PyLong_FromLong(SIGBREAK);
1057 PyDict_SetItemString(d, "SIGBREAK", x);
1058 Py_XDECREF(x);
Tim Peters1ce3cf72001-10-01 17:58:40 +00001059#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001060#ifdef SIGQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 x = PyLong_FromLong(SIGQUIT);
1062 PyDict_SetItemString(d, "SIGQUIT", x);
1063 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001064#endif
1065#ifdef SIGILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 x = PyLong_FromLong(SIGILL);
1067 PyDict_SetItemString(d, "SIGILL", x);
1068 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001069#endif
1070#ifdef SIGTRAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 x = PyLong_FromLong(SIGTRAP);
1072 PyDict_SetItemString(d, "SIGTRAP", x);
1073 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001074#endif
1075#ifdef SIGIOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 x = PyLong_FromLong(SIGIOT);
1077 PyDict_SetItemString(d, "SIGIOT", x);
1078 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001079#endif
1080#ifdef SIGABRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 x = PyLong_FromLong(SIGABRT);
1082 PyDict_SetItemString(d, "SIGABRT", x);
1083 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001084#endif
1085#ifdef SIGEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 x = PyLong_FromLong(SIGEMT);
1087 PyDict_SetItemString(d, "SIGEMT", x);
1088 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001089#endif
1090#ifdef SIGFPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 x = PyLong_FromLong(SIGFPE);
1092 PyDict_SetItemString(d, "SIGFPE", x);
1093 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001094#endif
1095#ifdef SIGKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 x = PyLong_FromLong(SIGKILL);
1097 PyDict_SetItemString(d, "SIGKILL", x);
1098 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001099#endif
1100#ifdef SIGBUS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 x = PyLong_FromLong(SIGBUS);
1102 PyDict_SetItemString(d, "SIGBUS", x);
1103 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001104#endif
1105#ifdef SIGSEGV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 x = PyLong_FromLong(SIGSEGV);
1107 PyDict_SetItemString(d, "SIGSEGV", x);
1108 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001109#endif
1110#ifdef SIGSYS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 x = PyLong_FromLong(SIGSYS);
1112 PyDict_SetItemString(d, "SIGSYS", x);
1113 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001114#endif
1115#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 x = PyLong_FromLong(SIGPIPE);
1117 PyDict_SetItemString(d, "SIGPIPE", x);
1118 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001119#endif
1120#ifdef SIGALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 x = PyLong_FromLong(SIGALRM);
1122 PyDict_SetItemString(d, "SIGALRM", x);
1123 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001124#endif
1125#ifdef SIGTERM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 x = PyLong_FromLong(SIGTERM);
1127 PyDict_SetItemString(d, "SIGTERM", x);
1128 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001129#endif
1130#ifdef SIGUSR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 x = PyLong_FromLong(SIGUSR1);
1132 PyDict_SetItemString(d, "SIGUSR1", x);
1133 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001134#endif
1135#ifdef SIGUSR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 x = PyLong_FromLong(SIGUSR2);
1137 PyDict_SetItemString(d, "SIGUSR2", x);
1138 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001139#endif
1140#ifdef SIGCLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 x = PyLong_FromLong(SIGCLD);
1142 PyDict_SetItemString(d, "SIGCLD", x);
1143 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001144#endif
1145#ifdef SIGCHLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 x = PyLong_FromLong(SIGCHLD);
1147 PyDict_SetItemString(d, "SIGCHLD", x);
1148 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001149#endif
1150#ifdef SIGPWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 x = PyLong_FromLong(SIGPWR);
1152 PyDict_SetItemString(d, "SIGPWR", x);
1153 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001154#endif
1155#ifdef SIGIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 x = PyLong_FromLong(SIGIO);
1157 PyDict_SetItemString(d, "SIGIO", x);
1158 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001159#endif
1160#ifdef SIGURG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 x = PyLong_FromLong(SIGURG);
1162 PyDict_SetItemString(d, "SIGURG", x);
1163 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001164#endif
1165#ifdef SIGWINCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 x = PyLong_FromLong(SIGWINCH);
1167 PyDict_SetItemString(d, "SIGWINCH", x);
1168 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001169#endif
1170#ifdef SIGPOLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 x = PyLong_FromLong(SIGPOLL);
1172 PyDict_SetItemString(d, "SIGPOLL", x);
1173 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001174#endif
1175#ifdef SIGSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 x = PyLong_FromLong(SIGSTOP);
1177 PyDict_SetItemString(d, "SIGSTOP", x);
1178 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001179#endif
1180#ifdef SIGTSTP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 x = PyLong_FromLong(SIGTSTP);
1182 PyDict_SetItemString(d, "SIGTSTP", x);
1183 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001184#endif
1185#ifdef SIGCONT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 x = PyLong_FromLong(SIGCONT);
1187 PyDict_SetItemString(d, "SIGCONT", x);
1188 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001189#endif
1190#ifdef SIGTTIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 x = PyLong_FromLong(SIGTTIN);
1192 PyDict_SetItemString(d, "SIGTTIN", x);
1193 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001194#endif
1195#ifdef SIGTTOU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 x = PyLong_FromLong(SIGTTOU);
1197 PyDict_SetItemString(d, "SIGTTOU", x);
1198 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001199#endif
1200#ifdef SIGVTALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 x = PyLong_FromLong(SIGVTALRM);
1202 PyDict_SetItemString(d, "SIGVTALRM", x);
1203 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001204#endif
1205#ifdef SIGPROF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 x = PyLong_FromLong(SIGPROF);
1207 PyDict_SetItemString(d, "SIGPROF", x);
1208 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001209#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001210#ifdef SIGXCPU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 x = PyLong_FromLong(SIGXCPU);
1212 PyDict_SetItemString(d, "SIGXCPU", x);
1213 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001214#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001215#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 x = PyLong_FromLong(SIGXFSZ);
1217 PyDict_SetItemString(d, "SIGXFSZ", x);
1218 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001219#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001220#ifdef SIGRTMIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 x = PyLong_FromLong(SIGRTMIN);
1222 PyDict_SetItemString(d, "SIGRTMIN", x);
1223 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001224#endif
1225#ifdef SIGRTMAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 x = PyLong_FromLong(SIGRTMAX);
1227 PyDict_SetItemString(d, "SIGRTMAX", x);
1228 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001229#endif
Martin v. Löwis175af252002-01-12 11:43:25 +00001230#ifdef SIGINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 x = PyLong_FromLong(SIGINFO);
1232 PyDict_SetItemString(d, "SIGINFO", x);
1233 Py_XDECREF(x);
Martin v. Löwis175af252002-01-12 11:43:25 +00001234#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001235
1236#ifdef ITIMER_REAL
1237 x = PyLong_FromLong(ITIMER_REAL);
1238 PyDict_SetItemString(d, "ITIMER_REAL", x);
1239 Py_DECREF(x);
1240#endif
1241#ifdef ITIMER_VIRTUAL
1242 x = PyLong_FromLong(ITIMER_VIRTUAL);
1243 PyDict_SetItemString(d, "ITIMER_VIRTUAL", x);
1244 Py_DECREF(x);
1245#endif
1246#ifdef ITIMER_PROF
1247 x = PyLong_FromLong(ITIMER_PROF);
1248 PyDict_SetItemString(d, "ITIMER_PROF", x);
1249 Py_DECREF(x);
1250#endif
1251
1252#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 ItimerError = PyErr_NewException("signal.ItimerError",
1254 PyExc_IOError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +00001255 if (ItimerError != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +00001257#endif
1258
Brian Curtineb24d742010-04-12 17:16:38 +00001259#ifdef CTRL_C_EVENT
1260 x = PyLong_FromLong(CTRL_C_EVENT);
1261 PyDict_SetItemString(d, "CTRL_C_EVENT", x);
1262 Py_DECREF(x);
1263#endif
1264
1265#ifdef CTRL_BREAK_EVENT
1266 x = PyLong_FromLong(CTRL_BREAK_EVENT);
1267 PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x);
1268 Py_DECREF(x);
1269#endif
1270
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001271#ifdef MS_WINDOWS
1272 /* Create manual-reset event, initially unset */
1273 sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
1274#endif
1275
Martin v. Löwis1a214512008-06-11 05:26:20 +00001276 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 Py_DECREF(m);
1278 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001279 }
Barry Warsaw92971171997-01-03 00:14:25 +00001280
Barry Warsaw92971171997-01-03 00:14:25 +00001281 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001282 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +00001283}
1284
1285static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001286finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 int i;
1289 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 PyOS_setsig(SIGINT, old_siginthandler);
1292 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 for (i = 1; i < NSIG; i++) {
1295 func = Handlers[i].func;
1296 Handlers[i].tripped = 0;
1297 Handlers[i].func = NULL;
1298 if (i != SIGINT && func != NULL && func != Py_None &&
1299 func != DefaultHandler && func != IgnoreHandler)
1300 PyOS_setsig(i, SIG_DFL);
1301 Py_XDECREF(func);
1302 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 Py_XDECREF(IntHandler);
1305 IntHandler = NULL;
1306 Py_XDECREF(DefaultHandler);
1307 DefaultHandler = NULL;
1308 Py_XDECREF(IgnoreHandler);
1309 IgnoreHandler = NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001310}
1311
Barry Warsaw92971171997-01-03 00:14:25 +00001312
Barry Warsaw92971171997-01-03 00:14:25 +00001313/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001314int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001315PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 int i;
1318 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 if (!is_tripped)
1321 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001322
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001323#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 if (PyThread_get_thread_ident() != main_thread)
1325 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001326#endif
Christian Heimesb76922a2007-12-11 01:06:40 +00001327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 /*
1329 * The is_tripped variable is meant to speed up the calls to
1330 * PyErr_CheckSignals (both directly or via pending calls) when no
1331 * signal has arrived. This variable is set to 1 when a signal arrives
1332 * and it is set to 0 here, when we know some signals arrived. This way
1333 * we can run the registered handlers with no signals blocked.
1334 *
1335 * NOTE: with this approach we can have a situation where is_tripped is
1336 * 1 but we have no more signals to handle (Handlers[i].tripped
1337 * is 0 for every signal i). This won't do us any harm (except
1338 * we're gonna spent some cycles for nothing). This happens when
1339 * we receive a signal i after we zero is_tripped and before we
1340 * check Handlers[i].tripped.
1341 */
1342 is_tripped = 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 if (!(f = (PyObject *)PyEval_GetFrame()))
1345 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 for (i = 1; i < NSIG; i++) {
1348 if (Handlers[i].tripped) {
1349 PyObject *result = NULL;
1350 PyObject *arglist = Py_BuildValue("(iO)", i, f);
1351 Handlers[i].tripped = 0;
Barry Warsaw92971171997-01-03 00:14:25 +00001352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 if (arglist) {
1354 result = PyEval_CallObject(Handlers[i].func,
1355 arglist);
1356 Py_DECREF(arglist);
1357 }
1358 if (!result)
1359 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +00001360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 Py_DECREF(result);
1362 }
1363 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001366}
1367
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001368
Barry Warsaw92971171997-01-03 00:14:25 +00001369/* Replacements for intrcheck.c functionality
1370 * Declared in pyerrors.h
1371 */
1372void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001373PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001374{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001375 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001376}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001377
1378void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001379PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001380{
Brett Cannon0ecd30b2013-02-01 14:04:12 -05001381 PyObject *m = PyImport_ImportModule("signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 if (m) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 Py_DECREF(m);
1384 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001385}
1386
1387void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001388PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001391}
1392
1393int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001394PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001397#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 if (PyThread_get_thread_ident() != main_thread)
1399 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 Handlers[SIGINT].tripped = 0;
1402 return 1;
1403 }
1404 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001405}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001406
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001407static void
1408_clear_pending_signals(void)
1409{
1410 int i;
1411 if (!is_tripped)
1412 return;
1413 is_tripped = 0;
1414 for (i = 1; i < NSIG; ++i) {
1415 Handlers[i].tripped = 0;
1416 }
1417}
1418
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001419void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001420PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001421{
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001422 /* Clear the signal flags after forking so that they aren't handled
1423 * in both processes if they came in just before the fork() but before
1424 * the interpreter had an opportunity to call the handlers. issue9535. */
1425 _clear_pending_signals();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001426#ifdef WITH_THREAD
Charles-François Natali6d0d24e2012-02-02 20:31:42 +01001427 /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API
1428 * can be called safely. */
1429 PyThread_ReInitTLS();
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001430 _PyGILState_Reinit();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 PyEval_ReInitThreads();
1432 main_thread = PyThread_get_thread_ident();
1433 main_pid = getpid();
1434 _PyImport_ReInitLock();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001435#endif
1436}
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001437
1438int
1439_PyOS_IsMainThread(void)
1440{
1441#ifdef WITH_THREAD
1442 return PyThread_get_thread_ident() == main_thread;
1443#else
1444 return 1;
1445#endif
1446}
1447
1448#ifdef MS_WINDOWS
1449void *_PyOS_SigintEvent(void)
1450{
1451 /* Returns a manual-reset event which gets tripped whenever
1452 SIGINT is received.
1453
1454 Python.h does not include windows.h so we do cannot use HANDLE
1455 as the return type of this function. We use void* instead. */
1456 return sigint_event;
1457}
1458#endif