blob: a315f23a038e7ebdf098b34421a677b72846ead5 [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"
Victor Stinnerd18ccd12014-07-24 21:58:53 +02007#ifdef MS_WINDOWS
8#include "socketmodule.h" /* needed for SOCKET_T */
9#endif
Serhiy Storchaka7cf55992013-02-10 21:56:49 +020010#ifndef MS_WINDOWS
11#include "posixmodule.h"
12#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +000013
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000014#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +020015#include <windows.h>
Benjamin Peterson2614cda2010-03-21 22:36:19 +000016#ifdef HAVE_PROCESS_H
Guido van Rossum644a12b1997-04-09 19:24:53 +000017#include <process.h>
18#endif
Benjamin Peterson2614cda2010-03-21 22:36:19 +000019#endif
Guido van Rossum644a12b1997-04-09 19:24:53 +000020
Benjamin Peterson2614cda2010-03-21 22:36:19 +000021#ifdef HAVE_SIGNAL_H
Guido van Rossum398d9fe1994-05-11 08:59:13 +000022#include <signal.h>
Benjamin Peterson2614cda2010-03-21 22:36:19 +000023#endif
24#ifdef HAVE_SYS_STAT_H
Christian Heimes5fb7c2a2007-12-24 08:52:31 +000025#include <sys/stat.h>
Benjamin Peterson2614cda2010-03-21 22:36:19 +000026#endif
Martin v. Löwis3bf3cc02008-03-24 14:05:07 +000027#ifdef HAVE_SYS_TIME_H
Martin v. Löwis823725e2008-03-24 13:39:54 +000028#include <sys/time.h>
Martin v. Löwis3bf3cc02008-03-24 14:05:07 +000029#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +000030
Victor Stinnera9293352011-04-30 15:21:58 +020031#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
32# define PYPTHREAD_SIGMASK
33#endif
34
35#if defined(PYPTHREAD_SIGMASK) && defined(HAVE_PTHREAD_H)
36# include <pthread.h>
37#endif
38
Guido van Rossumbb4ba121994-06-23 11:25:45 +000039#ifndef SIG_ERR
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +000040#define SIG_ERR ((PyOS_sighandler_t)(-1))
Guido van Rossumbb4ba121994-06-23 11:25:45 +000041#endif
42
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000043#ifndef NSIG
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000044# if defined(_NSIG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045# define NSIG _NSIG /* For BSD/SysV */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000046# elif defined(_SIGMAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047# define NSIG (_SIGMAX + 1) /* For QNX */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000048# elif defined(SIGMAX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049# define NSIG (SIGMAX + 1) /* For djgpp */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000050# else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051# define NSIG 64 /* Use a reasonable default value */
Marc-André Lemburg8bcfb8a2000-07-04 14:17:33 +000052# endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000053#endif
54
55
Guido van Rossumbb4ba121994-06-23 11:25:45 +000056/*
57 NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
58
59 When threads are supported, we want the following semantics:
60
61 - only the main thread can set a signal handler
62 - any thread can get a signal handler
63 - signals are only delivered to the main thread
64
65 I.e. we don't support "synchronous signals" like SIGFPE (catching
66 this doesn't make much sense in Python anyway) nor do we support
67 signals as a means of inter-thread communication, since not all
68 thread implementations support that (at least our thread library
69 doesn't).
70
71 We still have the problem that in some implementations signals
72 generated by the keyboard (e.g. SIGINT) are delivered to all
73 threads (e.g. SGI), while in others (e.g. Solaris) such signals are
74 delivered to one random thread (an intermediate possibility would
Guido van Rossuma3c04b01995-01-12 11:29:01 +000075 be to deliver it to the main thread -- POSIX?). For now, we have
Guido van Rossumbb4ba121994-06-23 11:25:45 +000076 a working implementation that works in all three cases -- the
77 handler ignores signals if getpid() isn't the same as in the main
78 thread. XXX This is a hack.
Guido van Rossumbb4ba121994-06-23 11:25:45 +000079*/
80
81#ifdef WITH_THREAD
Guido van Rossum295b8e51997-06-06 21:16:41 +000082#include <sys/types.h> /* For pid_t */
Guido van Rossum49b56061998-10-01 20:42:43 +000083#include "pythread.h"
Guido van Rossumbb4ba121994-06-23 11:25:45 +000084static long main_thread;
85static pid_t main_pid;
86#endif
87
Victor Stinner2ec6b172011-05-15 10:21:59 +020088static volatile struct {
89 sig_atomic_t tripped;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 PyObject *func;
Barry Warsaw92971171997-01-03 00:14:25 +000091} Handlers[NSIG];
Guido van Rossum398d9fe1994-05-11 08:59:13 +000092
Victor Stinnerd18ccd12014-07-24 21:58:53 +020093#ifdef MS_WINDOWS
94#define INVALID_SOCKET ((SOCKET_T)-1)
95
96static volatile struct {
97 SOCKET_T fd;
98 int send_err_set;
99 int send_errno;
100 int send_win_error;
101} wakeup = {INVALID_SOCKET, 0, 0};
102#else
Victor Stinner2ec6b172011-05-15 10:21:59 +0200103static volatile sig_atomic_t wakeup_fd = -1;
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200104#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000105
Christian Heimesb76922a2007-12-11 01:06:40 +0000106/* Speed up sigcheck() when none tripped */
107static volatile sig_atomic_t is_tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000108
Barry Warsaw92971171997-01-03 00:14:25 +0000109static PyObject *DefaultHandler;
110static PyObject *IgnoreHandler;
111static PyObject *IntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000112
Martin v. Löwisf58de1b2001-03-06 12:13:56 +0000113/* On Solaris 8, gcc will produce a warning that the function
114 declaration is not a prototype. This is caused by the definition of
115 SIG_DFL as (void (*)())0; the correct declaration would have been
116 (void (*)(int))0. */
117
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000118static PyOS_sighandler_t old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +0000119
Antoine Pitrou6dd381e2011-11-21 21:26:56 +0100120#ifdef MS_WINDOWS
121static HANDLE sigint_event = NULL;
122#endif
123
Martin v. Löwis823725e2008-03-24 13:39:54 +0000124#ifdef HAVE_GETITIMER
125static PyObject *ItimerError;
126
127/* auxiliary functions for setitimer/getitimer */
128static void
129timeval_from_double(double d, struct timeval *tv)
130{
131 tv->tv_sec = floor(d);
132 tv->tv_usec = fmod(d, 1.0) * 1000000.0;
133}
134
Christian Heimes1a8501c2008-10-02 19:56:01 +0000135Py_LOCAL_INLINE(double)
Martin v. Löwis823725e2008-03-24 13:39:54 +0000136double_from_timeval(struct timeval *tv)
137{
138 return tv->tv_sec + (double)(tv->tv_usec / 1000000.0);
139}
140
141static PyObject *
142itimer_retval(struct itimerval *iv)
143{
144 PyObject *r, *v;
145
146 r = PyTuple_New(2);
147 if (r == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000149
150 if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_value)))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 Py_DECREF(r);
152 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000153 }
154
155 PyTuple_SET_ITEM(r, 0, v);
156
157 if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_interval)))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 Py_DECREF(r);
159 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000160 }
161
162 PyTuple_SET_ITEM(r, 1, v);
163
164 return r;
165}
166#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000167
Guido van Rossume4485b01994-09-07 14:32:49 +0000168static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000169signal_default_int_handler(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 PyErr_SetNone(PyExc_KeyboardInterrupt);
172 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000173}
174
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000175PyDoc_STRVAR(default_int_handler_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000176"default_int_handler(...)\n\
177\n\
Michael W. Hudson24ec2112004-06-17 15:55:53 +0000178The default handler for SIGINT installed by Python.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000179It raises KeyboardInterrupt.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000180
Thomas Wouters0796b002000-07-22 23:49:30 +0000181
182static int
183checksignals_witharg(void * unused)
184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 return PyErr_CheckSignals();
Thomas Wouters0796b002000-07-22 23:49:30 +0000186}
187
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200188#ifdef MS_WINDOWS
189static int
190report_wakeup_error(void* Py_UNUSED(data))
191{
192 PyObject *res;
193
194 if (wakeup.send_win_error) {
195 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
196 recognizes the error codes used by both GetLastError() and
197 WSAGetLastError */
198 res = PyErr_SetExcFromWindowsErr(PyExc_OSError, wakeup.send_win_error);
199 }
200 else {
201 errno = wakeup.send_errno;
202 res = PyErr_SetFromErrno(PyExc_OSError);
203 }
204
205 assert(res == NULL);
206 wakeup.send_err_set = 0;
207
208 PySys_WriteStderr("Exception ignored when trying to send to the "
209 "signal wakeup fd:\n");
210 PyErr_WriteUnraisable(NULL);
211
212 return 0;
213}
214#else
Antoine Pitrou6f6ec372013-08-17 20:27:56 +0200215static int
216report_wakeup_error(void *data)
217{
218 int save_errno = errno;
219 errno = (int) (Py_intptr_t) data;
220 PyErr_SetFromErrno(PyExc_OSError);
221 PySys_WriteStderr("Exception ignored when trying to write to the "
222 "signal wakeup fd:\n");
223 PyErr_WriteUnraisable(NULL);
224 errno = save_errno;
225 return 0;
226}
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200227#endif
Antoine Pitrou6f6ec372013-08-17 20:27:56 +0200228
Tim Peters4f1b2082000-07-23 21:18:09 +0000229static void
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200230trip_signal(int sig_num)
231{
Victor Stinnerd49b1f12011-05-08 02:03:15 +0200232 unsigned char byte;
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200233 Py_ssize_t rc;
Victor Stinnerc13ef662011-05-25 02:35:58 +0200234
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200235 Handlers[sig_num].tripped = 1;
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200236
237#ifdef MS_WINDOWS
238 if (wakeup.fd != INVALID_SOCKET) {
239 byte = (unsigned char)sig_num;
240 do {
241 rc = send(wakeup.fd, &byte, 1, 0);
242 } while (rc < 0 && errno == EINTR);
243
244 /* we only have a storage for one error in the wakeup structure */
245 if (rc < 0 && !wakeup.send_err_set) {
246 wakeup.send_err_set = 1;
247 wakeup.send_errno = errno;
248 wakeup.send_win_error = GetLastError();
249 Py_AddPendingCall(report_wakeup_error, NULL);
250 }
251 }
252#else
Victor Stinnerc13ef662011-05-25 02:35:58 +0200253 if (wakeup_fd != -1) {
254 byte = (unsigned char)sig_num;
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200255 do {
256 rc = write(wakeup_fd, &byte, 1);
257 } while (rc < 0 && errno == EINTR);
258
259 if (rc < 0) {
260 Py_AddPendingCall(report_wakeup_error,
261 (void *)(Py_intptr_t)errno);
262 }
Victor Stinnerc13ef662011-05-25 02:35:58 +0200263 }
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200264#endif
265
266 if (!is_tripped) {
267 /* Set is_tripped after setting .tripped, as it gets
268 cleared in PyErr_CheckSignals() before .tripped. */
269 is_tripped = 1;
270 Py_AddPendingCall(checksignals_witharg, NULL);
271 }
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200272}
273
274static void
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000275signal_handler(int sig_num)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000276{
Antoine Pitrou39a65912010-11-05 19:47:27 +0000277 int save_errno = errno;
278
Antoine Pitrou39a65912010-11-05 19:47:27 +0000279#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 /* See NOTES section above */
Antoine Pitrou39a65912010-11-05 19:47:27 +0000281 if (getpid() == main_pid)
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000282#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000283 {
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200284 trip_signal(sig_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 }
Antoine Pitrou39a65912010-11-05 19:47:27 +0000286
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000287#ifndef HAVE_SIGACTION
Antoine Pitrou39a65912010-11-05 19:47:27 +0000288#ifdef SIGCHLD
289 /* To avoid infinite recursion, this signal remains
290 reset until explicit re-instated.
291 Don't clear the 'func' field as it is our pointer
292 to the Python handler... */
293 if (sig_num != SIGCHLD)
294#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 /* If the handler was not set up with sigaction, reinstall it. See
296 * Python/pythonrun.c for the implementation of PyOS_setsig which
297 * makes this true. See also issue8354. */
298 PyOS_setsig(sig_num, signal_handler);
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000299#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000300
301 /* Issue #10311: asynchronously executing signal handlers should not
302 mutate errno under the feet of unsuspecting C code. */
303 errno = save_errno;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +0100304
305#ifdef MS_WINDOWS
306 if (sig_num == SIGINT)
307 SetEvent(sigint_event);
308#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000309}
Guido van Rossume4485b01994-09-07 14:32:49 +0000310
Guido van Rossum06d511d1995-03-10 15:13:48 +0000311
Guido van Rossum1171ee61997-08-22 20:42:00 +0000312#ifdef HAVE_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000313static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000314signal_alarm(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 int t;
317 if (!PyArg_ParseTuple(args, "i:alarm", &t))
318 return NULL;
319 /* alarm() returns the number of seconds remaining */
320 return PyLong_FromLong((long)alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000321}
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000322
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000323PyDoc_STRVAR(alarm_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000324"alarm(seconds)\n\
325\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000326Arrange for SIGALRM to arrive after the given number of seconds.");
Guido van Rossum06d511d1995-03-10 15:13:48 +0000327#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000328
Guido van Rossum1171ee61997-08-22 20:42:00 +0000329#ifdef HAVE_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000330static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +0000331signal_pause(PyObject *self)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 Py_BEGIN_ALLOW_THREADS
334 (void)pause();
335 Py_END_ALLOW_THREADS
336 /* make sure that any exceptions that got raised are propagated
337 * back into Python
338 */
339 if (PyErr_CheckSignals())
340 return NULL;
Barry Warsaw92971171997-01-03 00:14:25 +0000341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 Py_INCREF(Py_None);
343 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000344}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000345PyDoc_STRVAR(pause_doc,
Barry Warsaw1ee36ff1998-07-21 22:41:18 +0000346"pause()\n\
347\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000348Wait until a signal arrives.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000349
Guido van Rossum06d511d1995-03-10 15:13:48 +0000350#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000351
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000352
Guido van Rossume4485b01994-09-07 14:32:49 +0000353static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000354signal_signal(PyObject *self, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 PyObject *obj;
357 int sig_num;
358 PyObject *old_handler;
359 void (*func)(int);
360 if (!PyArg_ParseTuple(args, "iO:signal", &sig_num, &obj))
361 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000362#ifdef MS_WINDOWS
363 /* Validate that sig_num is one of the allowable signals */
Brian Curtinc734b312010-09-06 16:04:10 +0000364 switch (sig_num) {
365 case SIGABRT: break;
Brian Curtin9e88b5a2010-10-01 14:49:24 +0000366#ifdef SIGBREAK
367 /* Issue #10003: SIGBREAK is not documented as permitted, but works
368 and corresponds to CTRL_BREAK_EVENT. */
369 case SIGBREAK: break;
370#endif
Brian Curtinc734b312010-09-06 16:04:10 +0000371 case SIGFPE: break;
372 case SIGILL: break;
373 case SIGINT: break;
374 case SIGSEGV: break;
375 case SIGTERM: break;
376 default:
377 PyErr_SetString(PyExc_ValueError, "invalid signal value");
378 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000379 }
380#endif
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000381#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 if (PyThread_get_thread_ident() != main_thread) {
383 PyErr_SetString(PyExc_ValueError,
384 "signal only works in main thread");
385 return NULL;
386 }
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 if (sig_num < 1 || sig_num >= NSIG) {
389 PyErr_SetString(PyExc_ValueError,
390 "signal number out of range");
391 return NULL;
392 }
393 if (obj == IgnoreHandler)
394 func = SIG_IGN;
395 else if (obj == DefaultHandler)
396 func = SIG_DFL;
397 else if (!PyCallable_Check(obj)) {
398 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000399"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 return NULL;
401 }
402 else
403 func = signal_handler;
404 if (PyOS_setsig(sig_num, func) == SIG_ERR) {
Victor Stinner388196e2011-05-10 17:13:00 +0200405 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 return NULL;
407 }
408 old_handler = Handlers[sig_num].func;
409 Handlers[sig_num].tripped = 0;
410 Py_INCREF(obj);
411 Handlers[sig_num].func = obj;
Antoine Pitrouc8c952c2013-05-04 23:16:59 +0200412 if (old_handler != NULL)
413 return old_handler;
414 else
415 Py_RETURN_NONE;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000416}
417
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000418PyDoc_STRVAR(signal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000419"signal(sig, action) -> action\n\
420\n\
421Set the action for the given signal. The action can be SIG_DFL,\n\
422SIG_IGN, or a callable Python object. The previous action is\n\
423returned. See getsignal() for possible return values.\n\
424\n\
425*** IMPORTANT NOTICE ***\n\
426A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000427the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000428
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000429
Guido van Rossume4485b01994-09-07 14:32:49 +0000430static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000431signal_getsignal(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 int sig_num;
434 PyObject *old_handler;
435 if (!PyArg_ParseTuple(args, "i:getsignal", &sig_num))
436 return NULL;
437 if (sig_num < 1 || sig_num >= NSIG) {
438 PyErr_SetString(PyExc_ValueError,
439 "signal number out of range");
440 return NULL;
441 }
442 old_handler = Handlers[sig_num].func;
Antoine Pitrouc8c952c2013-05-04 23:16:59 +0200443 if (old_handler != NULL) {
444 Py_INCREF(old_handler);
445 return old_handler;
446 }
447 else {
448 Py_RETURN_NONE;
449 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000450}
451
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000452PyDoc_STRVAR(getsignal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000453"getsignal(sig) -> action\n\
454\n\
455Return the current action for the given signal. The return value can be:\n\
456SIG_IGN -- if the signal is being ignored\n\
457SIG_DFL -- if the default action for the signal is in effect\n\
458None -- if an unknown handler is in effect\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000459anything else -- the callable Python object used as a handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000460
Christian Heimes8640e742008-02-23 16:23:06 +0000461#ifdef HAVE_SIGINTERRUPT
462PyDoc_STRVAR(siginterrupt_doc,
463"siginterrupt(sig, flag) -> None\n\
464change system call restart behaviour: if flag is False, system calls\n\
465will be restarted when interrupted by signal sig, else system calls\n\
466will be interrupted.");
467
468static PyObject *
469signal_siginterrupt(PyObject *self, PyObject *args)
470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 int sig_num;
472 int flag;
Christian Heimes8640e742008-02-23 16:23:06 +0000473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 if (!PyArg_ParseTuple(args, "ii:siginterrupt", &sig_num, &flag))
475 return NULL;
476 if (sig_num < 1 || sig_num >= NSIG) {
477 PyErr_SetString(PyExc_ValueError,
478 "signal number out of range");
479 return NULL;
480 }
481 if (siginterrupt(sig_num, flag)<0) {
Victor Stinner388196e2011-05-10 17:13:00 +0200482 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 return NULL;
484 }
Christian Heimes8640e742008-02-23 16:23:06 +0000485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 Py_INCREF(Py_None);
487 return Py_None;
Christian Heimes8640e742008-02-23 16:23:06 +0000488}
489
490#endif
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000491
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000492static PyObject *
493signal_set_wakeup_fd(PyObject *self, PyObject *args)
494{
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200495#ifdef MS_WINDOWS
496 PyObject *fdobj;
497 SOCKET_T fd, old_fd;
498 int res;
499 int res_size = sizeof res;
500 PyObject *mod;
501 struct stat st;
502
503 if (!PyArg_ParseTuple(args, "O:set_wakeup_fd", &fdobj))
504 return NULL;
505
506 fd = PyLong_AsSocket_t(fdobj);
507 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
508 return NULL;
509#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 int fd, old_fd;
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200511 struct stat st;
512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 if (!PyArg_ParseTuple(args, "i:set_wakeup_fd", &fd))
514 return NULL;
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200515#endif
516
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000517#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 if (PyThread_get_thread_ident() != main_thread) {
519 PyErr_SetString(PyExc_ValueError,
520 "set_wakeup_fd only works in main thread");
521 return NULL;
522 }
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000523#endif
Victor Stinner0bffc942014-07-21 16:28:54 +0200524
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200525#ifdef MS_WINDOWS
526 if (fd != INVALID_SOCKET) {
527 /* Import the _socket module to call WSAStartup() */
528 mod = PyImport_ImportModuleNoBlock("_socket");
529 if (mod == NULL)
530 return NULL;
531 Py_DECREF(mod);
532
533 /* test the socket */
534 if (getsockopt(fd, SOL_SOCKET, SO_ERROR,
535 (char *)&res, &res_size) != 0) {
536 int err = WSAGetLastError();
537 if (err == WSAENOTSOCK)
538 PyErr_SetString(PyExc_ValueError, "fd is not a socket");
539 else
540 PyErr_SetExcFromWindowsErr(PyExc_OSError, err);
Victor Stinner0bffc942014-07-21 16:28:54 +0200541 return NULL;
542 }
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200543 }
Victor Stinner0bffc942014-07-21 16:28:54 +0200544
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200545 old_fd = wakeup.fd;
546 wakeup.fd = fd;
547
548 if (old_fd != INVALID_SOCKET)
549 return PyLong_FromSocket_t(old_fd);
550 else
551 return PyLong_FromLong(-1);
552#else
553 if (fd != -1) {
554 if (fstat(fd, &st) != 0) {
555 PyErr_SetFromErrno(PyExc_OSError);
556 return NULL;
557 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 }
Victor Stinner0bffc942014-07-21 16:28:54 +0200559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 old_fd = wakeup_fd;
561 wakeup_fd = fd;
Victor Stinner0bffc942014-07-21 16:28:54 +0200562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 return PyLong_FromLong(old_fd);
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200564#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000565}
566
567PyDoc_STRVAR(set_wakeup_fd_doc,
568"set_wakeup_fd(fd) -> fd\n\
569\n\
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200570Sets the fd to be written to (with the signal number) when a signal\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000571comes in. A library can use this to wakeup select or poll.\n\
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200572The previous fd or -1 is returned.\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000573\n\
574The fd must be non-blocking.");
575
576/* C API for the same, without all the error checking */
577int
578PySignal_SetWakeupFd(int fd)
579{
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200580 int old_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 if (fd < 0)
582 fd = -1;
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200583
584#ifdef MS_WINDOWS
585 old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int);
586 wakeup.fd = fd;
587#else
588 old_fd = wakeup_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 wakeup_fd = fd;
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 return old_fd;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000592}
593
594
Martin v. Löwis823725e2008-03-24 13:39:54 +0000595#ifdef HAVE_SETITIMER
596static PyObject *
597signal_setitimer(PyObject *self, PyObject *args)
598{
599 double first;
600 double interval = 0;
601 int which;
602 struct itimerval new, old;
603
604 if(!PyArg_ParseTuple(args, "id|d:setitimer", &which, &first, &interval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000606
607 timeval_from_double(first, &new.it_value);
608 timeval_from_double(interval, &new.it_interval);
609 /* Let OS check "which" value */
610 if (setitimer(which, &new, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 PyErr_SetFromErrno(ItimerError);
612 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000613 }
614
615 return itimer_retval(&old);
616}
617
618PyDoc_STRVAR(setitimer_doc,
619"setitimer(which, seconds[, interval])\n\
620\n\
621Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL\n\
622or ITIMER_PROF) to fire after value seconds and after\n\
623that every interval seconds.\n\
624The itimer can be cleared by setting seconds to zero.\n\
625\n\
626Returns old values as a tuple: (delay, interval).");
627#endif
628
629
630#ifdef HAVE_GETITIMER
631static PyObject *
632signal_getitimer(PyObject *self, PyObject *args)
633{
634 int which;
635 struct itimerval old;
636
637 if (!PyArg_ParseTuple(args, "i:getitimer", &which))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000639
640 if (getitimer(which, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 PyErr_SetFromErrno(ItimerError);
642 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000643 }
644
645 return itimer_retval(&old);
646}
647
648PyDoc_STRVAR(getitimer_doc,
649"getitimer(which)\n\
650\n\
651Returns current value of given itimer.");
652#endif
653
Ross Lagerwallbc808222011-06-25 12:13:40 +0200654#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \
655 defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinnera9293352011-04-30 15:21:58 +0200656/* Convert an iterable to a sigset.
657 Return 0 on success, return -1 and raise an exception on error. */
658
659static int
660iterable_to_sigset(PyObject *iterable, sigset_t *mask)
661{
662 int result = -1;
663 PyObject *iterator, *item;
664 long signum;
665 int err;
666
667 sigemptyset(mask);
668
669 iterator = PyObject_GetIter(iterable);
670 if (iterator == NULL)
671 goto error;
672
673 while (1)
674 {
675 item = PyIter_Next(iterator);
676 if (item == NULL) {
677 if (PyErr_Occurred())
678 goto error;
679 else
680 break;
681 }
682
683 signum = PyLong_AsLong(item);
684 Py_DECREF(item);
685 if (signum == -1 && PyErr_Occurred())
686 goto error;
687 if (0 < signum && signum < NSIG)
688 err = sigaddset(mask, (int)signum);
689 else
690 err = 1;
691 if (err) {
692 PyErr_Format(PyExc_ValueError,
693 "signal number %ld out of range", signum);
694 goto error;
695 }
696 }
697 result = 0;
698
699error:
700 Py_XDECREF(iterator);
701 return result;
702}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200703#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200704
Victor Stinnerb3e72192011-05-08 01:46:11 +0200705#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
Victor Stinner35b300c2011-05-04 13:20:35 +0200706static PyObject*
707sigset_to_set(sigset_t mask)
708{
709 PyObject *signum, *result;
710 int sig;
711
712 result = PySet_New(0);
713 if (result == NULL)
714 return NULL;
715
716 for (sig = 1; sig < NSIG; sig++) {
717 if (sigismember(&mask, sig) != 1)
718 continue;
719
720 /* Handle the case where it is a member by adding the signal to
721 the result list. Ignore the other cases because they mean the
722 signal isn't a member of the mask or the signal was invalid,
723 and an invalid signal must have been our fault in constructing
724 the loop boundaries. */
725 signum = PyLong_FromLong(sig);
726 if (signum == NULL) {
727 Py_DECREF(result);
728 return NULL;
729 }
730 if (PySet_Add(result, signum) == -1) {
731 Py_DECREF(signum);
732 Py_DECREF(result);
733 return NULL;
734 }
735 Py_DECREF(signum);
736 }
737 return result;
738}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200739#endif
Victor Stinner35b300c2011-05-04 13:20:35 +0200740
Victor Stinnerb3e72192011-05-08 01:46:11 +0200741#ifdef PYPTHREAD_SIGMASK
Victor Stinnera9293352011-04-30 15:21:58 +0200742static PyObject *
743signal_pthread_sigmask(PyObject *self, PyObject *args)
744{
Victor Stinner35b300c2011-05-04 13:20:35 +0200745 int how;
746 PyObject *signals;
Victor Stinnera9293352011-04-30 15:21:58 +0200747 sigset_t mask, previous;
748 int err;
749
750 if (!PyArg_ParseTuple(args, "iO:pthread_sigmask", &how, &signals))
751 return NULL;
752
753 if (iterable_to_sigset(signals, &mask))
754 return NULL;
755
756 err = pthread_sigmask(how, &mask, &previous);
757 if (err != 0) {
758 errno = err;
Victor Stinnerb3e72192011-05-08 01:46:11 +0200759 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera9293352011-04-30 15:21:58 +0200760 return NULL;
761 }
762
Victor Stinnerd0e516d2011-05-03 14:57:12 +0200763 /* if signals was unblocked, signal handlers have been called */
764 if (PyErr_CheckSignals())
765 return NULL;
766
Victor Stinner35b300c2011-05-04 13:20:35 +0200767 return sigset_to_set(previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200768}
769
770PyDoc_STRVAR(signal_pthread_sigmask_doc,
771"pthread_sigmask(how, mask) -> old mask\n\
772\n\
773Fetch and/or change the signal mask of the calling thread.");
774#endif /* #ifdef PYPTHREAD_SIGMASK */
775
Martin v. Löwis823725e2008-03-24 13:39:54 +0000776
Victor Stinnerb3e72192011-05-08 01:46:11 +0200777#ifdef HAVE_SIGPENDING
778static PyObject *
779signal_sigpending(PyObject *self)
780{
781 int err;
782 sigset_t mask;
783 err = sigpending(&mask);
784 if (err)
785 return PyErr_SetFromErrno(PyExc_OSError);
786 return sigset_to_set(mask);
787}
788
789PyDoc_STRVAR(signal_sigpending_doc,
790"sigpending() -> list\n\
791\n\
792Examine pending signals.");
793#endif /* #ifdef HAVE_SIGPENDING */
794
795
796#ifdef HAVE_SIGWAIT
797static PyObject *
798signal_sigwait(PyObject *self, PyObject *args)
799{
800 PyObject *signals;
801 sigset_t set;
802 int err, signum;
803
804 if (!PyArg_ParseTuple(args, "O:sigwait", &signals))
805 return NULL;
806
807 if (iterable_to_sigset(signals, &set))
808 return NULL;
809
Victor Stinner10c30d62011-06-10 01:39:53 +0200810 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200811 err = sigwait(&set, &signum);
Victor Stinner10c30d62011-06-10 01:39:53 +0200812 Py_END_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200813 if (err) {
814 errno = err;
815 return PyErr_SetFromErrno(PyExc_OSError);
816 }
817
818 return PyLong_FromLong(signum);
819}
820
821PyDoc_STRVAR(signal_sigwait_doc,
822"sigwait(sigset) -> signum\n\
823\n\
824Wait a signal.");
825#endif /* #ifdef HAVE_SIGPENDING */
826
Ross Lagerwallbc808222011-06-25 12:13:40 +0200827#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
828static int initialized;
829static PyStructSequence_Field struct_siginfo_fields[] = {
830 {"si_signo", "signal number"},
831 {"si_code", "signal code"},
832 {"si_errno", "errno associated with this signal"},
833 {"si_pid", "sending process ID"},
834 {"si_uid", "real user ID of sending process"},
835 {"si_status", "exit value or signal"},
836 {"si_band", "band event for SIGPOLL"},
837 {0}
838};
839
840PyDoc_STRVAR(struct_siginfo__doc__,
841"struct_siginfo: Result from sigwaitinfo or sigtimedwait.\n\n\
842This object may be accessed either as a tuple of\n\
843(si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band),\n\
844or via the attributes si_signo, si_code, and so on.");
845
846static PyStructSequence_Desc struct_siginfo_desc = {
847 "signal.struct_siginfo", /* name */
848 struct_siginfo__doc__, /* doc */
849 struct_siginfo_fields, /* fields */
850 7 /* n_in_sequence */
851};
852
853static PyTypeObject SiginfoType;
854
855static PyObject *
856fill_siginfo(siginfo_t *si)
857{
858 PyObject *result = PyStructSequence_New(&SiginfoType);
859 if (!result)
860 return NULL;
861
862 PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo)));
863 PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code)));
864 PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno)));
865 PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid));
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200866 PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid));
Ross Lagerwallbc808222011-06-25 12:13:40 +0200867 PyStructSequence_SET_ITEM(result, 5,
868 PyLong_FromLong((long)(si->si_status)));
869 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
870 if (PyErr_Occurred()) {
871 Py_DECREF(result);
872 return NULL;
873 }
874
875 return result;
876}
877#endif
878
879#ifdef HAVE_SIGWAITINFO
880static PyObject *
881signal_sigwaitinfo(PyObject *self, PyObject *args)
882{
883 PyObject *signals;
884 sigset_t set;
885 siginfo_t si;
886 int err;
887
888 if (!PyArg_ParseTuple(args, "O:sigwaitinfo", &signals))
889 return NULL;
890
891 if (iterable_to_sigset(signals, &set))
892 return NULL;
893
894 Py_BEGIN_ALLOW_THREADS
895 err = sigwaitinfo(&set, &si);
896 Py_END_ALLOW_THREADS
897 if (err == -1)
898 return PyErr_SetFromErrno(PyExc_OSError);
899
900 return fill_siginfo(&si);
901}
902
903PyDoc_STRVAR(signal_sigwaitinfo_doc,
904"sigwaitinfo(sigset) -> struct_siginfo\n\
905\n\
906Wait synchronously for a signal until one of the signals in *sigset* is\n\
907delivered.\n\
908Returns a struct_siginfo containing information about the signal.");
909#endif /* #ifdef HAVE_SIGWAITINFO */
910
911#ifdef HAVE_SIGTIMEDWAIT
912static PyObject *
913signal_sigtimedwait(PyObject *self, PyObject *args)
914{
915 PyObject *signals, *timeout;
916 struct timespec buf;
917 sigset_t set;
918 siginfo_t si;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200919 time_t tv_sec;
920 long tv_nsec;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200921 int err;
922
Victor Stinner643cd682012-03-02 22:54:03 +0100923 if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
924 &signals, &timeout))
Ross Lagerwallbc808222011-06-25 12:13:40 +0200925 return NULL;
926
Victor Stinner3c1b3792014-02-17 00:02:43 +0100927 if (_PyTime_ObjectToTimespec(timeout, &tv_sec, &tv_nsec,
928 _PyTime_ROUND_DOWN) == -1)
Ross Lagerwallbc808222011-06-25 12:13:40 +0200929 return NULL;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200930 buf.tv_sec = tv_sec;
931 buf.tv_nsec = tv_nsec;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200932
933 if (buf.tv_sec < 0 || buf.tv_nsec < 0) {
934 PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
935 return NULL;
936 }
937
938 if (iterable_to_sigset(signals, &set))
939 return NULL;
940
941 Py_BEGIN_ALLOW_THREADS
942 err = sigtimedwait(&set, &si, &buf);
943 Py_END_ALLOW_THREADS
944 if (err == -1) {
945 if (errno == EAGAIN)
946 Py_RETURN_NONE;
947 else
948 return PyErr_SetFromErrno(PyExc_OSError);
949 }
950
951 return fill_siginfo(&si);
952}
953
954PyDoc_STRVAR(signal_sigtimedwait_doc,
955"sigtimedwait(sigset, (timeout_sec, timeout_nsec)) -> struct_siginfo\n\
956\n\
957Like sigwaitinfo(), but with a timeout specified as a tuple of (seconds,\n\
958nanoseconds).");
959#endif /* #ifdef HAVE_SIGTIMEDWAIT */
960
Victor Stinnerb3e72192011-05-08 01:46:11 +0200961
962#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
963static PyObject *
964signal_pthread_kill(PyObject *self, PyObject *args)
965{
966 long tid;
967 int signum;
968 int err;
969
970 if (!PyArg_ParseTuple(args, "li:pthread_kill", &tid, &signum))
971 return NULL;
972
Victor Stinner86e104a2011-05-09 14:45:38 +0200973 err = pthread_kill((pthread_t)tid, signum);
Victor Stinnerb3e72192011-05-08 01:46:11 +0200974 if (err != 0) {
975 errno = err;
976 PyErr_SetFromErrno(PyExc_OSError);
977 return NULL;
978 }
979
980 /* the signal may have been send to the current thread */
981 if (PyErr_CheckSignals())
982 return NULL;
983
984 Py_RETURN_NONE;
985}
986
987PyDoc_STRVAR(signal_pthread_kill_doc,
988"pthread_kill(thread_id, signum)\n\
989\n\
990Send a signal to a thread.");
991#endif /* #if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD) */
992
993
994
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000995/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +0000996static PyMethodDef signal_methods[] = {
Guido van Rossum1171ee61997-08-22 20:42:00 +0000997#ifdef HAVE_ALARM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 {"alarm", signal_alarm, METH_VARARGS, alarm_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +0000999#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001000#ifdef HAVE_SETITIMER
1001 {"setitimer", signal_setitimer, METH_VARARGS, setitimer_doc},
1002#endif
1003#ifdef HAVE_GETITIMER
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 {"getitimer", signal_getitimer, METH_VARARGS, getitimer_doc},
Martin v. Löwis823725e2008-03-24 13:39:54 +00001005#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 {"signal", signal_signal, METH_VARARGS, signal_doc},
1007 {"getsignal", signal_getsignal, METH_VARARGS, getsignal_doc},
1008 {"set_wakeup_fd", signal_set_wakeup_fd, METH_VARARGS, set_wakeup_fd_doc},
Christian Heimes8640e742008-02-23 16:23:06 +00001009#ifdef HAVE_SIGINTERRUPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 {"siginterrupt", signal_siginterrupt, METH_VARARGS, siginterrupt_doc},
Christian Heimes8640e742008-02-23 16:23:06 +00001011#endif
Guido van Rossum1171ee61997-08-22 20:42:00 +00001012#ifdef HAVE_PAUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 {"pause", (PyCFunction)signal_pause,
Victor Stinnera9293352011-04-30 15:21:58 +02001014 METH_NOARGS, pause_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +00001015#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 {"default_int_handler", signal_default_int_handler,
1017 METH_VARARGS, default_int_handler_doc},
Victor Stinnerb3e72192011-05-08 01:46:11 +02001018#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
1019 {"pthread_kill", (PyCFunction)signal_pthread_kill,
1020 METH_VARARGS, signal_pthread_kill_doc},
1021#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001022#ifdef PYPTHREAD_SIGMASK
1023 {"pthread_sigmask", (PyCFunction)signal_pthread_sigmask,
1024 METH_VARARGS, signal_pthread_sigmask_doc},
1025#endif
Victor Stinnerb3e72192011-05-08 01:46:11 +02001026#ifdef HAVE_SIGPENDING
1027 {"sigpending", (PyCFunction)signal_sigpending,
1028 METH_NOARGS, signal_sigpending_doc},
1029#endif
1030#ifdef HAVE_SIGWAIT
1031 {"sigwait", (PyCFunction)signal_sigwait,
1032 METH_VARARGS, signal_sigwait_doc},
1033#endif
Ross Lagerwallbc808222011-06-25 12:13:40 +02001034#ifdef HAVE_SIGWAITINFO
1035 {"sigwaitinfo", (PyCFunction)signal_sigwaitinfo,
1036 METH_VARARGS, signal_sigwaitinfo_doc},
1037#endif
1038#ifdef HAVE_SIGTIMEDWAIT
1039 {"sigtimedwait", (PyCFunction)signal_sigtimedwait,
1040 METH_VARARGS, signal_sigtimedwait_doc},
1041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001043};
1044
Barry Warsaw92971171997-01-03 00:14:25 +00001045
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001046PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001047"This module provides mechanisms to use signal handlers in Python.\n\
1048\n\
1049Functions:\n\
1050\n\
1051alarm() -- cause SIGALRM after a specified time [Unix only]\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001052setitimer() -- cause a signal (described below) after a specified\n\
1053 float time and the timer may restart then [Unix only]\n\
1054getitimer() -- get current value of timer [Unix only]\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001055signal() -- set the action for a given signal\n\
1056getsignal() -- get the signal action for a given signal\n\
1057pause() -- wait until a signal arrives [Unix only]\n\
1058default_int_handler() -- default SIGINT handler\n\
1059\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001060signal constants:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001061SIG_DFL -- used to refer to the system default handler\n\
1062SIG_IGN -- used to ignore the signal\n\
1063NSIG -- number of defined signals\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001064SIGINT, SIGTERM, etc. -- signal numbers\n\
1065\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001066itimer constants:\n\
1067ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
1068 expiration\n\
1069ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
1070 and delivers SIGVTALRM upon expiration\n\
1071ITIMER_PROF -- decrements both when the process is executing and\n\
1072 when the system is executing on behalf of the process.\n\
1073 Coupled with ITIMER_VIRTUAL, this timer is usually\n\
1074 used to profile the time spent by the application\n\
1075 in user and kernel space. SIGPROF is delivered upon\n\
1076 expiration.\n\
1077\n\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001078*** IMPORTANT NOTICE ***\n\
1079A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001080the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001081
Martin v. Löwis1a214512008-06-11 05:26:20 +00001082static struct PyModuleDef signalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 PyModuleDef_HEAD_INIT,
Brett Cannon815a6f32014-04-04 10:20:28 -04001084 "_signal",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 module_doc,
1086 -1,
1087 signal_methods,
1088 NULL,
1089 NULL,
1090 NULL,
1091 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001092};
1093
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001094PyMODINIT_FUNC
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001095PyInit__signal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 PyObject *m, *d, *x;
1098 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001099
1100#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 main_thread = PyThread_get_thread_ident();
1102 main_pid = getpid();
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001103#endif
1104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 /* Create the module and add the functions */
1106 m = PyModule_Create(&signalmodule);
1107 if (m == NULL)
1108 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001109
Ross Lagerwallbc808222011-06-25 12:13:40 +02001110#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinner1c8f0592013-07-22 22:24:54 +02001111 if (!initialized) {
1112 if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0)
1113 return NULL;
1114 }
Ross Lagerwallbc808222011-06-25 12:13:40 +02001115 Py_INCREF((PyObject*) &SiginfoType);
1116 PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
1117 initialized = 1;
1118#endif
1119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 /* Add some symbolic constants to the module */
1121 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
1124 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
1125 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
1128 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
1129 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +00001130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 x = PyLong_FromLong((long)NSIG);
1132 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
1133 goto finally;
1134 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +00001135
Victor Stinnera9293352011-04-30 15:21:58 +02001136#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001137 if (PyModule_AddIntMacro(m, SIG_BLOCK))
1138 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001139#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001140#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001141 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
1142 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001143#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001144#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +02001145 if (PyModule_AddIntMacro(m, SIG_SETMASK))
1146 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001147#endif
1148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
1150 if (!x)
1151 goto finally;
1152 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +00001153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 Handlers[0].tripped = 0;
1155 for (i = 1; i < NSIG; i++) {
1156 void (*t)(int);
1157 t = PyOS_getsig(i);
1158 Handlers[i].tripped = 0;
1159 if (t == SIG_DFL)
1160 Handlers[i].func = DefaultHandler;
1161 else if (t == SIG_IGN)
1162 Handlers[i].func = IgnoreHandler;
1163 else
1164 Handlers[i].func = Py_None; /* None of our business */
1165 Py_INCREF(Handlers[i].func);
1166 }
1167 if (Handlers[SIGINT].func == DefaultHandler) {
1168 /* Install default int handler */
1169 Py_INCREF(IntHandler);
1170 Py_DECREF(Handlers[SIGINT].func);
1171 Handlers[SIGINT].func = IntHandler;
1172 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
1173 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001174
1175#ifdef SIGHUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 x = PyLong_FromLong(SIGHUP);
1177 PyDict_SetItemString(d, "SIGHUP", x);
1178 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001179#endif
1180#ifdef SIGINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 x = PyLong_FromLong(SIGINT);
1182 PyDict_SetItemString(d, "SIGINT", x);
1183 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001184#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +00001185#ifdef SIGBREAK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 x = PyLong_FromLong(SIGBREAK);
1187 PyDict_SetItemString(d, "SIGBREAK", x);
1188 Py_XDECREF(x);
Tim Peters1ce3cf72001-10-01 17:58:40 +00001189#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001190#ifdef SIGQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 x = PyLong_FromLong(SIGQUIT);
1192 PyDict_SetItemString(d, "SIGQUIT", x);
1193 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001194#endif
1195#ifdef SIGILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 x = PyLong_FromLong(SIGILL);
1197 PyDict_SetItemString(d, "SIGILL", x);
1198 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001199#endif
1200#ifdef SIGTRAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 x = PyLong_FromLong(SIGTRAP);
1202 PyDict_SetItemString(d, "SIGTRAP", x);
1203 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001204#endif
1205#ifdef SIGIOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 x = PyLong_FromLong(SIGIOT);
1207 PyDict_SetItemString(d, "SIGIOT", x);
1208 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001209#endif
1210#ifdef SIGABRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 x = PyLong_FromLong(SIGABRT);
1212 PyDict_SetItemString(d, "SIGABRT", x);
1213 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001214#endif
1215#ifdef SIGEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 x = PyLong_FromLong(SIGEMT);
1217 PyDict_SetItemString(d, "SIGEMT", x);
1218 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001219#endif
1220#ifdef SIGFPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 x = PyLong_FromLong(SIGFPE);
1222 PyDict_SetItemString(d, "SIGFPE", x);
1223 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001224#endif
1225#ifdef SIGKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 x = PyLong_FromLong(SIGKILL);
1227 PyDict_SetItemString(d, "SIGKILL", x);
1228 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001229#endif
1230#ifdef SIGBUS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 x = PyLong_FromLong(SIGBUS);
1232 PyDict_SetItemString(d, "SIGBUS", x);
1233 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001234#endif
1235#ifdef SIGSEGV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 x = PyLong_FromLong(SIGSEGV);
1237 PyDict_SetItemString(d, "SIGSEGV", x);
1238 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001239#endif
1240#ifdef SIGSYS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 x = PyLong_FromLong(SIGSYS);
1242 PyDict_SetItemString(d, "SIGSYS", x);
1243 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001244#endif
1245#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 x = PyLong_FromLong(SIGPIPE);
1247 PyDict_SetItemString(d, "SIGPIPE", x);
1248 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001249#endif
1250#ifdef SIGALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 x = PyLong_FromLong(SIGALRM);
1252 PyDict_SetItemString(d, "SIGALRM", x);
1253 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001254#endif
1255#ifdef SIGTERM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 x = PyLong_FromLong(SIGTERM);
1257 PyDict_SetItemString(d, "SIGTERM", x);
1258 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001259#endif
1260#ifdef SIGUSR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 x = PyLong_FromLong(SIGUSR1);
1262 PyDict_SetItemString(d, "SIGUSR1", x);
1263 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001264#endif
1265#ifdef SIGUSR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 x = PyLong_FromLong(SIGUSR2);
1267 PyDict_SetItemString(d, "SIGUSR2", x);
1268 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001269#endif
1270#ifdef SIGCLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 x = PyLong_FromLong(SIGCLD);
1272 PyDict_SetItemString(d, "SIGCLD", x);
1273 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001274#endif
1275#ifdef SIGCHLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 x = PyLong_FromLong(SIGCHLD);
1277 PyDict_SetItemString(d, "SIGCHLD", x);
1278 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001279#endif
1280#ifdef SIGPWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 x = PyLong_FromLong(SIGPWR);
1282 PyDict_SetItemString(d, "SIGPWR", x);
1283 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001284#endif
1285#ifdef SIGIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 x = PyLong_FromLong(SIGIO);
1287 PyDict_SetItemString(d, "SIGIO", x);
1288 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001289#endif
1290#ifdef SIGURG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 x = PyLong_FromLong(SIGURG);
1292 PyDict_SetItemString(d, "SIGURG", x);
1293 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001294#endif
1295#ifdef SIGWINCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 x = PyLong_FromLong(SIGWINCH);
1297 PyDict_SetItemString(d, "SIGWINCH", x);
1298 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001299#endif
1300#ifdef SIGPOLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 x = PyLong_FromLong(SIGPOLL);
1302 PyDict_SetItemString(d, "SIGPOLL", x);
1303 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001304#endif
1305#ifdef SIGSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 x = PyLong_FromLong(SIGSTOP);
1307 PyDict_SetItemString(d, "SIGSTOP", x);
1308 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001309#endif
1310#ifdef SIGTSTP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 x = PyLong_FromLong(SIGTSTP);
1312 PyDict_SetItemString(d, "SIGTSTP", x);
1313 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001314#endif
1315#ifdef SIGCONT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 x = PyLong_FromLong(SIGCONT);
1317 PyDict_SetItemString(d, "SIGCONT", x);
1318 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001319#endif
1320#ifdef SIGTTIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 x = PyLong_FromLong(SIGTTIN);
1322 PyDict_SetItemString(d, "SIGTTIN", x);
1323 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001324#endif
1325#ifdef SIGTTOU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 x = PyLong_FromLong(SIGTTOU);
1327 PyDict_SetItemString(d, "SIGTTOU", x);
1328 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001329#endif
1330#ifdef SIGVTALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 x = PyLong_FromLong(SIGVTALRM);
1332 PyDict_SetItemString(d, "SIGVTALRM", x);
1333 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001334#endif
1335#ifdef SIGPROF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 x = PyLong_FromLong(SIGPROF);
1337 PyDict_SetItemString(d, "SIGPROF", x);
1338 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001339#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001340#ifdef SIGXCPU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 x = PyLong_FromLong(SIGXCPU);
1342 PyDict_SetItemString(d, "SIGXCPU", x);
1343 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001344#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001345#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 x = PyLong_FromLong(SIGXFSZ);
1347 PyDict_SetItemString(d, "SIGXFSZ", x);
1348 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001349#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001350#ifdef SIGRTMIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 x = PyLong_FromLong(SIGRTMIN);
1352 PyDict_SetItemString(d, "SIGRTMIN", x);
1353 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001354#endif
1355#ifdef SIGRTMAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 x = PyLong_FromLong(SIGRTMAX);
1357 PyDict_SetItemString(d, "SIGRTMAX", x);
1358 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001359#endif
Martin v. Löwis175af252002-01-12 11:43:25 +00001360#ifdef SIGINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 x = PyLong_FromLong(SIGINFO);
1362 PyDict_SetItemString(d, "SIGINFO", x);
1363 Py_XDECREF(x);
Martin v. Löwis175af252002-01-12 11:43:25 +00001364#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001365
1366#ifdef ITIMER_REAL
1367 x = PyLong_FromLong(ITIMER_REAL);
1368 PyDict_SetItemString(d, "ITIMER_REAL", x);
1369 Py_DECREF(x);
1370#endif
1371#ifdef ITIMER_VIRTUAL
1372 x = PyLong_FromLong(ITIMER_VIRTUAL);
1373 PyDict_SetItemString(d, "ITIMER_VIRTUAL", x);
1374 Py_DECREF(x);
1375#endif
1376#ifdef ITIMER_PROF
1377 x = PyLong_FromLong(ITIMER_PROF);
1378 PyDict_SetItemString(d, "ITIMER_PROF", x);
1379 Py_DECREF(x);
1380#endif
1381
1382#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 ItimerError = PyErr_NewException("signal.ItimerError",
1384 PyExc_IOError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +00001385 if (ItimerError != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +00001387#endif
1388
Brian Curtineb24d742010-04-12 17:16:38 +00001389#ifdef CTRL_C_EVENT
1390 x = PyLong_FromLong(CTRL_C_EVENT);
1391 PyDict_SetItemString(d, "CTRL_C_EVENT", x);
1392 Py_DECREF(x);
1393#endif
1394
1395#ifdef CTRL_BREAK_EVENT
1396 x = PyLong_FromLong(CTRL_BREAK_EVENT);
1397 PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x);
1398 Py_DECREF(x);
1399#endif
1400
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001401#ifdef MS_WINDOWS
1402 /* Create manual-reset event, initially unset */
1403 sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
1404#endif
1405
Martin v. Löwis1a214512008-06-11 05:26:20 +00001406 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 Py_DECREF(m);
1408 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001409 }
Barry Warsaw92971171997-01-03 00:14:25 +00001410
Barry Warsaw92971171997-01-03 00:14:25 +00001411 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001412 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +00001413}
1414
1415static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001416finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 int i;
1419 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 PyOS_setsig(SIGINT, old_siginthandler);
1422 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 for (i = 1; i < NSIG; i++) {
1425 func = Handlers[i].func;
1426 Handlers[i].tripped = 0;
1427 Handlers[i].func = NULL;
1428 if (i != SIGINT && func != NULL && func != Py_None &&
1429 func != DefaultHandler && func != IgnoreHandler)
1430 PyOS_setsig(i, SIG_DFL);
1431 Py_XDECREF(func);
1432 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001433
Serhiy Storchaka505ff752014-02-09 13:33:53 +02001434 Py_CLEAR(IntHandler);
1435 Py_CLEAR(DefaultHandler);
1436 Py_CLEAR(IgnoreHandler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001437}
1438
Barry Warsaw92971171997-01-03 00:14:25 +00001439
Barry Warsaw92971171997-01-03 00:14:25 +00001440/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001441int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001442PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 int i;
1445 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 if (!is_tripped)
1448 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001449
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001450#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 if (PyThread_get_thread_ident() != main_thread)
1452 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001453#endif
Christian Heimesb76922a2007-12-11 01:06:40 +00001454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 /*
1456 * The is_tripped variable is meant to speed up the calls to
1457 * PyErr_CheckSignals (both directly or via pending calls) when no
1458 * signal has arrived. This variable is set to 1 when a signal arrives
1459 * and it is set to 0 here, when we know some signals arrived. This way
1460 * we can run the registered handlers with no signals blocked.
1461 *
1462 * NOTE: with this approach we can have a situation where is_tripped is
1463 * 1 but we have no more signals to handle (Handlers[i].tripped
1464 * is 0 for every signal i). This won't do us any harm (except
1465 * we're gonna spent some cycles for nothing). This happens when
1466 * we receive a signal i after we zero is_tripped and before we
1467 * check Handlers[i].tripped.
1468 */
1469 is_tripped = 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 if (!(f = (PyObject *)PyEval_GetFrame()))
1472 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 for (i = 1; i < NSIG; i++) {
1475 if (Handlers[i].tripped) {
1476 PyObject *result = NULL;
1477 PyObject *arglist = Py_BuildValue("(iO)", i, f);
1478 Handlers[i].tripped = 0;
Barry Warsaw92971171997-01-03 00:14:25 +00001479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 if (arglist) {
1481 result = PyEval_CallObject(Handlers[i].func,
1482 arglist);
1483 Py_DECREF(arglist);
1484 }
1485 if (!result)
1486 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +00001487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 Py_DECREF(result);
1489 }
1490 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001493}
1494
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001495
Barry Warsaw92971171997-01-03 00:14:25 +00001496/* Replacements for intrcheck.c functionality
1497 * Declared in pyerrors.h
1498 */
1499void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001500PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001501{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001502 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001503}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001504
1505void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001506PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001507{
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001508 PyObject *m = PyImport_ImportModule("_signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 if (m) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 Py_DECREF(m);
1511 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001512}
1513
1514void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001515PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001518}
1519
1520int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001521PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001524#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 if (PyThread_get_thread_ident() != main_thread)
1526 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 Handlers[SIGINT].tripped = 0;
1529 return 1;
1530 }
1531 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001532}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001533
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001534static void
1535_clear_pending_signals(void)
1536{
1537 int i;
1538 if (!is_tripped)
1539 return;
1540 is_tripped = 0;
1541 for (i = 1; i < NSIG; ++i) {
1542 Handlers[i].tripped = 0;
1543 }
1544}
1545
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001546void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001547PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001548{
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001549 /* Clear the signal flags after forking so that they aren't handled
1550 * in both processes if they came in just before the fork() but before
1551 * the interpreter had an opportunity to call the handlers. issue9535. */
1552 _clear_pending_signals();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001553#ifdef WITH_THREAD
Charles-François Natali6d0d24e2012-02-02 20:31:42 +01001554 /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API
1555 * can be called safely. */
1556 PyThread_ReInitTLS();
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001557 _PyGILState_Reinit();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 PyEval_ReInitThreads();
1559 main_thread = PyThread_get_thread_ident();
1560 main_pid = getpid();
1561 _PyImport_ReInitLock();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001562#endif
1563}
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001564
1565int
1566_PyOS_IsMainThread(void)
1567{
1568#ifdef WITH_THREAD
1569 return PyThread_get_thread_ident() == main_thread;
1570#else
1571 return 1;
1572#endif
1573}
1574
1575#ifdef MS_WINDOWS
1576void *_PyOS_SigintEvent(void)
1577{
1578 /* Returns a manual-reset event which gets tripped whenever
1579 SIGINT is received.
1580
1581 Python.h does not include windows.h so we do cannot use HANDLE
1582 as the return type of this function. We use void* instead. */
1583 return sigint_event;
1584}
1585#endif