blob: 122530beed8660c3a5e13c1d66c152465cb21fef [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)
981 if (!initialized)
982 PyStructSequence_InitType(&SiginfoType, &struct_siginfo_desc);
983
984 Py_INCREF((PyObject*) &SiginfoType);
985 PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
986 initialized = 1;
987#endif
988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 /* Add some symbolic constants to the module */
990 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
993 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
994 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
997 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
998 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 x = PyLong_FromLong((long)NSIG);
1001 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
1002 goto finally;
1003 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +00001004
Victor Stinnera9293352011-04-30 15:21:58 +02001005#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001006 if (PyModule_AddIntMacro(m, SIG_BLOCK))
1007 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001008#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001009#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001010 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
1011 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001012#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001013#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +02001014 if (PyModule_AddIntMacro(m, SIG_SETMASK))
1015 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001016#endif
1017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
1019 if (!x)
1020 goto finally;
1021 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +00001022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 Handlers[0].tripped = 0;
1024 for (i = 1; i < NSIG; i++) {
1025 void (*t)(int);
1026 t = PyOS_getsig(i);
1027 Handlers[i].tripped = 0;
1028 if (t == SIG_DFL)
1029 Handlers[i].func = DefaultHandler;
1030 else if (t == SIG_IGN)
1031 Handlers[i].func = IgnoreHandler;
1032 else
1033 Handlers[i].func = Py_None; /* None of our business */
1034 Py_INCREF(Handlers[i].func);
1035 }
1036 if (Handlers[SIGINT].func == DefaultHandler) {
1037 /* Install default int handler */
1038 Py_INCREF(IntHandler);
1039 Py_DECREF(Handlers[SIGINT].func);
1040 Handlers[SIGINT].func = IntHandler;
1041 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
1042 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001043
1044#ifdef SIGHUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 x = PyLong_FromLong(SIGHUP);
1046 PyDict_SetItemString(d, "SIGHUP", x);
1047 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001048#endif
1049#ifdef SIGINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 x = PyLong_FromLong(SIGINT);
1051 PyDict_SetItemString(d, "SIGINT", x);
1052 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001053#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +00001054#ifdef SIGBREAK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 x = PyLong_FromLong(SIGBREAK);
1056 PyDict_SetItemString(d, "SIGBREAK", x);
1057 Py_XDECREF(x);
Tim Peters1ce3cf72001-10-01 17:58:40 +00001058#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001059#ifdef SIGQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 x = PyLong_FromLong(SIGQUIT);
1061 PyDict_SetItemString(d, "SIGQUIT", x);
1062 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001063#endif
1064#ifdef SIGILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 x = PyLong_FromLong(SIGILL);
1066 PyDict_SetItemString(d, "SIGILL", x);
1067 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001068#endif
1069#ifdef SIGTRAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 x = PyLong_FromLong(SIGTRAP);
1071 PyDict_SetItemString(d, "SIGTRAP", x);
1072 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001073#endif
1074#ifdef SIGIOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 x = PyLong_FromLong(SIGIOT);
1076 PyDict_SetItemString(d, "SIGIOT", x);
1077 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001078#endif
1079#ifdef SIGABRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 x = PyLong_FromLong(SIGABRT);
1081 PyDict_SetItemString(d, "SIGABRT", x);
1082 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001083#endif
1084#ifdef SIGEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 x = PyLong_FromLong(SIGEMT);
1086 PyDict_SetItemString(d, "SIGEMT", x);
1087 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001088#endif
1089#ifdef SIGFPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 x = PyLong_FromLong(SIGFPE);
1091 PyDict_SetItemString(d, "SIGFPE", x);
1092 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001093#endif
1094#ifdef SIGKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 x = PyLong_FromLong(SIGKILL);
1096 PyDict_SetItemString(d, "SIGKILL", x);
1097 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001098#endif
1099#ifdef SIGBUS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 x = PyLong_FromLong(SIGBUS);
1101 PyDict_SetItemString(d, "SIGBUS", x);
1102 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001103#endif
1104#ifdef SIGSEGV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 x = PyLong_FromLong(SIGSEGV);
1106 PyDict_SetItemString(d, "SIGSEGV", x);
1107 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001108#endif
1109#ifdef SIGSYS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 x = PyLong_FromLong(SIGSYS);
1111 PyDict_SetItemString(d, "SIGSYS", x);
1112 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001113#endif
1114#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 x = PyLong_FromLong(SIGPIPE);
1116 PyDict_SetItemString(d, "SIGPIPE", x);
1117 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001118#endif
1119#ifdef SIGALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 x = PyLong_FromLong(SIGALRM);
1121 PyDict_SetItemString(d, "SIGALRM", x);
1122 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001123#endif
1124#ifdef SIGTERM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 x = PyLong_FromLong(SIGTERM);
1126 PyDict_SetItemString(d, "SIGTERM", x);
1127 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001128#endif
1129#ifdef SIGUSR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 x = PyLong_FromLong(SIGUSR1);
1131 PyDict_SetItemString(d, "SIGUSR1", x);
1132 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001133#endif
1134#ifdef SIGUSR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 x = PyLong_FromLong(SIGUSR2);
1136 PyDict_SetItemString(d, "SIGUSR2", x);
1137 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001138#endif
1139#ifdef SIGCLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 x = PyLong_FromLong(SIGCLD);
1141 PyDict_SetItemString(d, "SIGCLD", x);
1142 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001143#endif
1144#ifdef SIGCHLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 x = PyLong_FromLong(SIGCHLD);
1146 PyDict_SetItemString(d, "SIGCHLD", x);
1147 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001148#endif
1149#ifdef SIGPWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 x = PyLong_FromLong(SIGPWR);
1151 PyDict_SetItemString(d, "SIGPWR", x);
1152 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001153#endif
1154#ifdef SIGIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 x = PyLong_FromLong(SIGIO);
1156 PyDict_SetItemString(d, "SIGIO", x);
1157 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001158#endif
1159#ifdef SIGURG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 x = PyLong_FromLong(SIGURG);
1161 PyDict_SetItemString(d, "SIGURG", x);
1162 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001163#endif
1164#ifdef SIGWINCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 x = PyLong_FromLong(SIGWINCH);
1166 PyDict_SetItemString(d, "SIGWINCH", x);
1167 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001168#endif
1169#ifdef SIGPOLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 x = PyLong_FromLong(SIGPOLL);
1171 PyDict_SetItemString(d, "SIGPOLL", x);
1172 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001173#endif
1174#ifdef SIGSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 x = PyLong_FromLong(SIGSTOP);
1176 PyDict_SetItemString(d, "SIGSTOP", x);
1177 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001178#endif
1179#ifdef SIGTSTP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 x = PyLong_FromLong(SIGTSTP);
1181 PyDict_SetItemString(d, "SIGTSTP", x);
1182 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001183#endif
1184#ifdef SIGCONT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 x = PyLong_FromLong(SIGCONT);
1186 PyDict_SetItemString(d, "SIGCONT", x);
1187 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001188#endif
1189#ifdef SIGTTIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 x = PyLong_FromLong(SIGTTIN);
1191 PyDict_SetItemString(d, "SIGTTIN", x);
1192 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001193#endif
1194#ifdef SIGTTOU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 x = PyLong_FromLong(SIGTTOU);
1196 PyDict_SetItemString(d, "SIGTTOU", x);
1197 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001198#endif
1199#ifdef SIGVTALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 x = PyLong_FromLong(SIGVTALRM);
1201 PyDict_SetItemString(d, "SIGVTALRM", x);
1202 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001203#endif
1204#ifdef SIGPROF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 x = PyLong_FromLong(SIGPROF);
1206 PyDict_SetItemString(d, "SIGPROF", x);
1207 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001208#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001209#ifdef SIGXCPU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 x = PyLong_FromLong(SIGXCPU);
1211 PyDict_SetItemString(d, "SIGXCPU", x);
1212 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001213#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001214#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 x = PyLong_FromLong(SIGXFSZ);
1216 PyDict_SetItemString(d, "SIGXFSZ", x);
1217 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001218#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001219#ifdef SIGRTMIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 x = PyLong_FromLong(SIGRTMIN);
1221 PyDict_SetItemString(d, "SIGRTMIN", x);
1222 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001223#endif
1224#ifdef SIGRTMAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 x = PyLong_FromLong(SIGRTMAX);
1226 PyDict_SetItemString(d, "SIGRTMAX", x);
1227 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001228#endif
Martin v. Löwis175af252002-01-12 11:43:25 +00001229#ifdef SIGINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 x = PyLong_FromLong(SIGINFO);
1231 PyDict_SetItemString(d, "SIGINFO", x);
1232 Py_XDECREF(x);
Martin v. Löwis175af252002-01-12 11:43:25 +00001233#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001234
1235#ifdef ITIMER_REAL
1236 x = PyLong_FromLong(ITIMER_REAL);
1237 PyDict_SetItemString(d, "ITIMER_REAL", x);
1238 Py_DECREF(x);
1239#endif
1240#ifdef ITIMER_VIRTUAL
1241 x = PyLong_FromLong(ITIMER_VIRTUAL);
1242 PyDict_SetItemString(d, "ITIMER_VIRTUAL", x);
1243 Py_DECREF(x);
1244#endif
1245#ifdef ITIMER_PROF
1246 x = PyLong_FromLong(ITIMER_PROF);
1247 PyDict_SetItemString(d, "ITIMER_PROF", x);
1248 Py_DECREF(x);
1249#endif
1250
1251#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 ItimerError = PyErr_NewException("signal.ItimerError",
1253 PyExc_IOError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +00001254 if (ItimerError != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +00001256#endif
1257
Brian Curtineb24d742010-04-12 17:16:38 +00001258#ifdef CTRL_C_EVENT
1259 x = PyLong_FromLong(CTRL_C_EVENT);
1260 PyDict_SetItemString(d, "CTRL_C_EVENT", x);
1261 Py_DECREF(x);
1262#endif
1263
1264#ifdef CTRL_BREAK_EVENT
1265 x = PyLong_FromLong(CTRL_BREAK_EVENT);
1266 PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x);
1267 Py_DECREF(x);
1268#endif
1269
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001270#ifdef MS_WINDOWS
1271 /* Create manual-reset event, initially unset */
1272 sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
1273#endif
1274
Martin v. Löwis1a214512008-06-11 05:26:20 +00001275 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 Py_DECREF(m);
1277 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001278 }
Barry Warsaw92971171997-01-03 00:14:25 +00001279
Barry Warsaw92971171997-01-03 00:14:25 +00001280 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001281 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +00001282}
1283
1284static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001285finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 int i;
1288 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 PyOS_setsig(SIGINT, old_siginthandler);
1291 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 for (i = 1; i < NSIG; i++) {
1294 func = Handlers[i].func;
1295 Handlers[i].tripped = 0;
1296 Handlers[i].func = NULL;
1297 if (i != SIGINT && func != NULL && func != Py_None &&
1298 func != DefaultHandler && func != IgnoreHandler)
1299 PyOS_setsig(i, SIG_DFL);
1300 Py_XDECREF(func);
1301 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 Py_XDECREF(IntHandler);
1304 IntHandler = NULL;
1305 Py_XDECREF(DefaultHandler);
1306 DefaultHandler = NULL;
1307 Py_XDECREF(IgnoreHandler);
1308 IgnoreHandler = NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001309}
1310
Barry Warsaw92971171997-01-03 00:14:25 +00001311
Barry Warsaw92971171997-01-03 00:14:25 +00001312/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001313int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001314PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 int i;
1317 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 if (!is_tripped)
1320 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001321
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001322#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 if (PyThread_get_thread_ident() != main_thread)
1324 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001325#endif
Christian Heimesb76922a2007-12-11 01:06:40 +00001326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 /*
1328 * The is_tripped variable is meant to speed up the calls to
1329 * PyErr_CheckSignals (both directly or via pending calls) when no
1330 * signal has arrived. This variable is set to 1 when a signal arrives
1331 * and it is set to 0 here, when we know some signals arrived. This way
1332 * we can run the registered handlers with no signals blocked.
1333 *
1334 * NOTE: with this approach we can have a situation where is_tripped is
1335 * 1 but we have no more signals to handle (Handlers[i].tripped
1336 * is 0 for every signal i). This won't do us any harm (except
1337 * we're gonna spent some cycles for nothing). This happens when
1338 * we receive a signal i after we zero is_tripped and before we
1339 * check Handlers[i].tripped.
1340 */
1341 is_tripped = 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 if (!(f = (PyObject *)PyEval_GetFrame()))
1344 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 for (i = 1; i < NSIG; i++) {
1347 if (Handlers[i].tripped) {
1348 PyObject *result = NULL;
1349 PyObject *arglist = Py_BuildValue("(iO)", i, f);
1350 Handlers[i].tripped = 0;
Barry Warsaw92971171997-01-03 00:14:25 +00001351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 if (arglist) {
1353 result = PyEval_CallObject(Handlers[i].func,
1354 arglist);
1355 Py_DECREF(arglist);
1356 }
1357 if (!result)
1358 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +00001359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 Py_DECREF(result);
1361 }
1362 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001365}
1366
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001367
Barry Warsaw92971171997-01-03 00:14:25 +00001368/* Replacements for intrcheck.c functionality
1369 * Declared in pyerrors.h
1370 */
1371void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001372PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001373{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001374 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001375}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001376
1377void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001378PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001379{
Brett Cannon0ecd30b2013-02-01 14:04:12 -05001380 PyObject *m = PyImport_ImportModule("signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 if (m) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 Py_DECREF(m);
1383 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001384}
1385
1386void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001387PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001390}
1391
1392int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001393PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001396#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 if (PyThread_get_thread_ident() != main_thread)
1398 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 Handlers[SIGINT].tripped = 0;
1401 return 1;
1402 }
1403 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001404}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001405
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001406static void
1407_clear_pending_signals(void)
1408{
1409 int i;
1410 if (!is_tripped)
1411 return;
1412 is_tripped = 0;
1413 for (i = 1; i < NSIG; ++i) {
1414 Handlers[i].tripped = 0;
1415 }
1416}
1417
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001418void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001419PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001420{
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001421 /* Clear the signal flags after forking so that they aren't handled
1422 * in both processes if they came in just before the fork() but before
1423 * the interpreter had an opportunity to call the handlers. issue9535. */
1424 _clear_pending_signals();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001425#ifdef WITH_THREAD
Charles-François Natali6d0d24e2012-02-02 20:31:42 +01001426 /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API
1427 * can be called safely. */
1428 PyThread_ReInitTLS();
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001429 _PyGILState_Reinit();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 PyEval_ReInitThreads();
1431 main_thread = PyThread_get_thread_ident();
1432 main_pid = getpid();
1433 _PyImport_ReInitLock();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001434#endif
1435}
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001436
1437int
1438_PyOS_IsMainThread(void)
1439{
1440#ifdef WITH_THREAD
1441 return PyThread_get_thread_ident() == main_thread;
1442#else
1443 return 1;
1444#endif
1445}
1446
1447#ifdef MS_WINDOWS
1448void *_PyOS_SigintEvent(void)
1449{
1450 /* Returns a manual-reset event which gets tripped whenever
1451 SIGINT is received.
1452
1453 Python.h does not include windows.h so we do cannot use HANDLE
1454 as the return type of this function. We use void* instead. */
1455 return sigint_event;
1456}
1457#endif