blob: a1fda3eb315a24c2f68a3898fac5c3d6827c00b2 [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
Victor Stinner11517102014-07-29 23:31:34 +020010#ifdef MS_WINDOWS
11#include "socketmodule.h" /* needed for SOCKET_T */
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 Stinner11517102014-07-29 23:31:34 +020093#ifdef MS_WINDOWS
94#define INVALID_FD ((SOCKET_T)-1)
95
96static volatile struct {
97 SOCKET_T fd;
98 int use_send;
99 int send_err_set;
100 int send_errno;
101 int send_win_error;
102} wakeup = {INVALID_FD, 0, 0};
103#else
104#define INVALID_FD (-1)
Victor Stinner2ec6b172011-05-15 10:21:59 +0200105static volatile sig_atomic_t wakeup_fd = -1;
Victor Stinner11517102014-07-29 23:31:34 +0200106#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000107
Christian Heimesb76922a2007-12-11 01:06:40 +0000108/* Speed up sigcheck() when none tripped */
109static volatile sig_atomic_t is_tripped = 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000110
Barry Warsaw92971171997-01-03 00:14:25 +0000111static PyObject *DefaultHandler;
112static PyObject *IgnoreHandler;
113static PyObject *IntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000114
Martin v. Löwisf58de1b2001-03-06 12:13:56 +0000115/* On Solaris 8, gcc will produce a warning that the function
116 declaration is not a prototype. This is caused by the definition of
117 SIG_DFL as (void (*)())0; the correct declaration would have been
118 (void (*)(int))0. */
119
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000120static PyOS_sighandler_t old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +0000121
Antoine Pitrou6dd381e2011-11-21 21:26:56 +0100122#ifdef MS_WINDOWS
123static HANDLE sigint_event = NULL;
124#endif
125
Martin v. Löwis823725e2008-03-24 13:39:54 +0000126#ifdef HAVE_GETITIMER
127static PyObject *ItimerError;
128
129/* auxiliary functions for setitimer/getitimer */
130static void
131timeval_from_double(double d, struct timeval *tv)
132{
133 tv->tv_sec = floor(d);
134 tv->tv_usec = fmod(d, 1.0) * 1000000.0;
135}
136
Christian Heimes1a8501c2008-10-02 19:56:01 +0000137Py_LOCAL_INLINE(double)
Martin v. Löwis823725e2008-03-24 13:39:54 +0000138double_from_timeval(struct timeval *tv)
139{
140 return tv->tv_sec + (double)(tv->tv_usec / 1000000.0);
141}
142
143static PyObject *
144itimer_retval(struct itimerval *iv)
145{
146 PyObject *r, *v;
147
148 r = PyTuple_New(2);
149 if (r == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000151
152 if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_value)))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 Py_DECREF(r);
154 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000155 }
156
157 PyTuple_SET_ITEM(r, 0, v);
158
159 if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_interval)))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 Py_DECREF(r);
161 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000162 }
163
164 PyTuple_SET_ITEM(r, 1, v);
165
166 return r;
167}
168#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000169
Guido van Rossume4485b01994-09-07 14:32:49 +0000170static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000171signal_default_int_handler(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 PyErr_SetNone(PyExc_KeyboardInterrupt);
174 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000175}
176
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000177PyDoc_STRVAR(default_int_handler_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000178"default_int_handler(...)\n\
179\n\
Michael W. Hudson24ec2112004-06-17 15:55:53 +0000180The default handler for SIGINT installed by Python.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000181It raises KeyboardInterrupt.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000182
Thomas Wouters0796b002000-07-22 23:49:30 +0000183
184static int
185checksignals_witharg(void * unused)
186{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 return PyErr_CheckSignals();
Thomas Wouters0796b002000-07-22 23:49:30 +0000188}
189
Antoine Pitrou6f6ec372013-08-17 20:27:56 +0200190static int
Victor Stinner11517102014-07-29 23:31:34 +0200191report_wakeup_write_error(void *data)
Antoine Pitrou6f6ec372013-08-17 20:27:56 +0200192{
193 int save_errno = errno;
194 errno = (int) (Py_intptr_t) data;
195 PyErr_SetFromErrno(PyExc_OSError);
196 PySys_WriteStderr("Exception ignored when trying to write to the "
197 "signal wakeup fd:\n");
198 PyErr_WriteUnraisable(NULL);
199 errno = save_errno;
200 return 0;
201}
202
Victor Stinner11517102014-07-29 23:31:34 +0200203#ifdef MS_WINDOWS
204static int
205report_wakeup_send_error(void* Py_UNUSED(data))
206{
207 PyObject *res;
208
209 if (wakeup.send_win_error) {
210 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
211 recognizes the error codes used by both GetLastError() and
212 WSAGetLastError */
213 res = PyErr_SetExcFromWindowsErr(PyExc_OSError, wakeup.send_win_error);
214 }
215 else {
216 errno = wakeup.send_errno;
217 res = PyErr_SetFromErrno(PyExc_OSError);
218 }
219
220 assert(res == NULL);
221 wakeup.send_err_set = 0;
222
223 PySys_WriteStderr("Exception ignored when trying to send to the "
224 "signal wakeup fd:\n");
225 PyErr_WriteUnraisable(NULL);
226
227 return 0;
228}
229#endif /* MS_WINDOWS */
230
Tim Peters4f1b2082000-07-23 21:18:09 +0000231static void
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200232trip_signal(int sig_num)
233{
Victor Stinnerd49b1f12011-05-08 02:03:15 +0200234 unsigned char byte;
Victor Stinner11517102014-07-29 23:31:34 +0200235 int fd;
236 Py_ssize_t rc;
Victor Stinnerc13ef662011-05-25 02:35:58 +0200237
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200238 Handlers[sig_num].tripped = 1;
Victor Stinner11517102014-07-29 23:31:34 +0200239
240#ifdef MS_WINDOWS
241 fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int);
242#else
243 fd = wakeup_fd;
244#endif
245
246 if (fd != INVALID_FD) {
Victor Stinnerc13ef662011-05-25 02:35:58 +0200247 byte = (unsigned char)sig_num;
Victor Stinner11517102014-07-29 23:31:34 +0200248#ifdef MS_WINDOWS
249 if (wakeup.use_send) {
250 do {
251 rc = send(fd, &byte, 1, 0);
252 } while (rc < 0 && errno == EINTR);
253
254 /* we only have a storage for one error in the wakeup structure */
255 if (rc < 0 && !wakeup.send_err_set) {
256 wakeup.send_err_set = 1;
257 wakeup.send_errno = errno;
258 wakeup.send_win_error = GetLastError();
259 Py_AddPendingCall(report_wakeup_send_error, NULL);
260 }
261 }
262 else
263#endif
264 {
265 byte = (unsigned char)sig_num;
266 do {
267 rc = write(fd, &byte, 1);
268 } while (rc < 0 && errno == EINTR);
269
270 if (rc < 0) {
271 Py_AddPendingCall(report_wakeup_write_error,
272 (void *)(Py_intptr_t)errno);
273 }
274 }
Victor Stinnerc13ef662011-05-25 02:35:58 +0200275 }
Victor Stinner11517102014-07-29 23:31:34 +0200276
277 if (!is_tripped) {
278 /* Set is_tripped after setting .tripped, as it gets
279 cleared in PyErr_CheckSignals() before .tripped. */
280 is_tripped = 1;
281 Py_AddPendingCall(checksignals_witharg, NULL);
282 }
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200283}
284
285static void
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000286signal_handler(int sig_num)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000287{
Antoine Pitrou39a65912010-11-05 19:47:27 +0000288 int save_errno = errno;
289
Antoine Pitrou39a65912010-11-05 19:47:27 +0000290#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 /* See NOTES section above */
Antoine Pitrou39a65912010-11-05 19:47:27 +0000292 if (getpid() == main_pid)
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000293#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000294 {
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200295 trip_signal(sig_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 }
Antoine Pitrou39a65912010-11-05 19:47:27 +0000297
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000298#ifndef HAVE_SIGACTION
Antoine Pitrou39a65912010-11-05 19:47:27 +0000299#ifdef SIGCHLD
300 /* To avoid infinite recursion, this signal remains
301 reset until explicit re-instated.
302 Don't clear the 'func' field as it is our pointer
303 to the Python handler... */
304 if (sig_num != SIGCHLD)
305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 /* If the handler was not set up with sigaction, reinstall it. See
Nick Coghland6009512014-11-20 21:39:37 +1000307 * Python/pylifecycle.c for the implementation of PyOS_setsig which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 * makes this true. See also issue8354. */
309 PyOS_setsig(sig_num, signal_handler);
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000310#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000311
312 /* Issue #10311: asynchronously executing signal handlers should not
313 mutate errno under the feet of unsuspecting C code. */
314 errno = save_errno;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +0100315
316#ifdef MS_WINDOWS
317 if (sig_num == SIGINT)
318 SetEvent(sigint_event);
319#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000320}
Guido van Rossume4485b01994-09-07 14:32:49 +0000321
Guido van Rossum06d511d1995-03-10 15:13:48 +0000322
Guido van Rossum1171ee61997-08-22 20:42:00 +0000323#ifdef HAVE_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000324static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000325signal_alarm(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 int t;
328 if (!PyArg_ParseTuple(args, "i:alarm", &t))
329 return NULL;
330 /* alarm() returns the number of seconds remaining */
331 return PyLong_FromLong((long)alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000332}
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000333
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000334PyDoc_STRVAR(alarm_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000335"alarm(seconds)\n\
336\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000337Arrange for SIGALRM to arrive after the given number of seconds.");
Guido van Rossum06d511d1995-03-10 15:13:48 +0000338#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000339
Guido van Rossum1171ee61997-08-22 20:42:00 +0000340#ifdef HAVE_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000341static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +0000342signal_pause(PyObject *self)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 Py_BEGIN_ALLOW_THREADS
345 (void)pause();
346 Py_END_ALLOW_THREADS
347 /* make sure that any exceptions that got raised are propagated
348 * back into Python
349 */
350 if (PyErr_CheckSignals())
351 return NULL;
Barry Warsaw92971171997-01-03 00:14:25 +0000352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 Py_INCREF(Py_None);
354 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000355}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000356PyDoc_STRVAR(pause_doc,
Barry Warsaw1ee36ff1998-07-21 22:41:18 +0000357"pause()\n\
358\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000359Wait until a signal arrives.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000360
Guido van Rossum06d511d1995-03-10 15:13:48 +0000361#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000362
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000363
Guido van Rossume4485b01994-09-07 14:32:49 +0000364static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000365signal_signal(PyObject *self, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 PyObject *obj;
368 int sig_num;
369 PyObject *old_handler;
370 void (*func)(int);
371 if (!PyArg_ParseTuple(args, "iO:signal", &sig_num, &obj))
372 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000373#ifdef MS_WINDOWS
374 /* Validate that sig_num is one of the allowable signals */
Brian Curtinc734b312010-09-06 16:04:10 +0000375 switch (sig_num) {
376 case SIGABRT: break;
Brian Curtin9e88b5a2010-10-01 14:49:24 +0000377#ifdef SIGBREAK
378 /* Issue #10003: SIGBREAK is not documented as permitted, but works
379 and corresponds to CTRL_BREAK_EVENT. */
380 case SIGBREAK: break;
381#endif
Brian Curtinc734b312010-09-06 16:04:10 +0000382 case SIGFPE: break;
383 case SIGILL: break;
384 case SIGINT: break;
385 case SIGSEGV: break;
386 case SIGTERM: break;
387 default:
388 PyErr_SetString(PyExc_ValueError, "invalid signal value");
389 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000390 }
391#endif
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000392#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 if (PyThread_get_thread_ident() != main_thread) {
394 PyErr_SetString(PyExc_ValueError,
395 "signal only works in main thread");
396 return NULL;
397 }
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 if (sig_num < 1 || sig_num >= NSIG) {
400 PyErr_SetString(PyExc_ValueError,
401 "signal number out of range");
402 return NULL;
403 }
404 if (obj == IgnoreHandler)
405 func = SIG_IGN;
406 else if (obj == DefaultHandler)
407 func = SIG_DFL;
408 else if (!PyCallable_Check(obj)) {
409 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000410"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 return NULL;
412 }
413 else
414 func = signal_handler;
415 if (PyOS_setsig(sig_num, func) == SIG_ERR) {
Victor Stinner388196e2011-05-10 17:13:00 +0200416 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 return NULL;
418 }
419 old_handler = Handlers[sig_num].func;
420 Handlers[sig_num].tripped = 0;
421 Py_INCREF(obj);
422 Handlers[sig_num].func = obj;
Antoine Pitrouc8c952c2013-05-04 23:16:59 +0200423 if (old_handler != NULL)
424 return old_handler;
425 else
426 Py_RETURN_NONE;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000427}
428
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000429PyDoc_STRVAR(signal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000430"signal(sig, action) -> action\n\
431\n\
432Set the action for the given signal. The action can be SIG_DFL,\n\
433SIG_IGN, or a callable Python object. The previous action is\n\
434returned. See getsignal() for possible return values.\n\
435\n\
436*** IMPORTANT NOTICE ***\n\
437A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000438the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000439
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000440
Guido van Rossume4485b01994-09-07 14:32:49 +0000441static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000442signal_getsignal(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 int sig_num;
445 PyObject *old_handler;
446 if (!PyArg_ParseTuple(args, "i:getsignal", &sig_num))
447 return NULL;
448 if (sig_num < 1 || sig_num >= NSIG) {
449 PyErr_SetString(PyExc_ValueError,
450 "signal number out of range");
451 return NULL;
452 }
453 old_handler = Handlers[sig_num].func;
Antoine Pitrouc8c952c2013-05-04 23:16:59 +0200454 if (old_handler != NULL) {
455 Py_INCREF(old_handler);
456 return old_handler;
457 }
458 else {
459 Py_RETURN_NONE;
460 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000461}
462
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000463PyDoc_STRVAR(getsignal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000464"getsignal(sig) -> action\n\
465\n\
466Return the current action for the given signal. The return value can be:\n\
467SIG_IGN -- if the signal is being ignored\n\
468SIG_DFL -- if the default action for the signal is in effect\n\
469None -- if an unknown handler is in effect\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000470anything else -- the callable Python object used as a handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000471
Christian Heimes8640e742008-02-23 16:23:06 +0000472#ifdef HAVE_SIGINTERRUPT
473PyDoc_STRVAR(siginterrupt_doc,
474"siginterrupt(sig, flag) -> None\n\
475change system call restart behaviour: if flag is False, system calls\n\
476will be restarted when interrupted by signal sig, else system calls\n\
477will be interrupted.");
478
479static PyObject *
480signal_siginterrupt(PyObject *self, PyObject *args)
481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 int sig_num;
483 int flag;
Christian Heimes8640e742008-02-23 16:23:06 +0000484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 if (!PyArg_ParseTuple(args, "ii:siginterrupt", &sig_num, &flag))
486 return NULL;
487 if (sig_num < 1 || sig_num >= NSIG) {
488 PyErr_SetString(PyExc_ValueError,
489 "signal number out of range");
490 return NULL;
491 }
492 if (siginterrupt(sig_num, flag)<0) {
Victor Stinner388196e2011-05-10 17:13:00 +0200493 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 return NULL;
495 }
Christian Heimes8640e742008-02-23 16:23:06 +0000496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 Py_INCREF(Py_None);
498 return Py_None;
Christian Heimes8640e742008-02-23 16:23:06 +0000499}
500
501#endif
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000502
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000503static PyObject *
504signal_set_wakeup_fd(PyObject *self, PyObject *args)
505{
Victor Stinnere134a7f2015-03-30 10:09:31 +0200506 struct _Py_stat_struct status;
Victor Stinner11517102014-07-29 23:31:34 +0200507#ifdef MS_WINDOWS
508 PyObject *fdobj;
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100509 SOCKET_T sockfd, old_sockfd;
Victor Stinner11517102014-07-29 23:31:34 +0200510 int res;
511 int res_size = sizeof res;
512 PyObject *mod;
Victor Stinner11517102014-07-29 23:31:34 +0200513 int is_socket;
514
515 if (!PyArg_ParseTuple(args, "O:set_wakeup_fd", &fdobj))
516 return NULL;
517
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100518 sockfd = PyLong_AsSocket_t(fdobj);
519 if (sockfd == (SOCKET_T)(-1) && PyErr_Occurred())
Victor Stinner11517102014-07-29 23:31:34 +0200520 return NULL;
521#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 int fd, old_fd;
Victor Stinner11517102014-07-29 23:31:34 +0200523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 if (!PyArg_ParseTuple(args, "i:set_wakeup_fd", &fd))
525 return NULL;
Victor Stinner11517102014-07-29 23:31:34 +0200526#endif
527
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000528#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 if (PyThread_get_thread_ident() != main_thread) {
530 PyErr_SetString(PyExc_ValueError,
531 "set_wakeup_fd only works in main thread");
532 return NULL;
533 }
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000534#endif
Victor Stinner0bffc942014-07-21 16:28:54 +0200535
Victor Stinner11517102014-07-29 23:31:34 +0200536#ifdef MS_WINDOWS
537 is_socket = 0;
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100538 if (sockfd != INVALID_FD) {
Victor Stinner11517102014-07-29 23:31:34 +0200539 /* Import the _socket module to call WSAStartup() */
540 mod = PyImport_ImportModuleNoBlock("_socket");
541 if (mod == NULL)
542 return NULL;
543 Py_DECREF(mod);
544
545 /* test the socket */
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100546 if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
Victor Stinner11517102014-07-29 23:31:34 +0200547 (char *)&res, &res_size) != 0) {
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100548 int fd, err;
549
550 err = WSAGetLastError();
Victor Stinner11517102014-07-29 23:31:34 +0200551 if (err != WSAENOTSOCK) {
552 PyErr_SetExcFromWindowsErr(PyExc_OSError, err);
553 return NULL;
554 }
555
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100556 fd = (int)sockfd;
557 if ((SOCKET_T)fd != sockfd || !_PyVerify_fd(fd)) {
Victor Stinner11517102014-07-29 23:31:34 +0200558 PyErr_SetString(PyExc_ValueError, "invalid fd");
559 return NULL;
560 }
561
Victor Stinnere134a7f2015-03-30 10:09:31 +0200562 if (_Py_fstat(fd, &status) != 0)
Victor Stinner11517102014-07-29 23:31:34 +0200563 return NULL;
Victor Stinner38227602014-08-27 12:59:44 +0200564
565 /* on Windows, a file cannot be set to non-blocking mode */
Victor Stinner11517102014-07-29 23:31:34 +0200566 }
Victor Stinner38227602014-08-27 12:59:44 +0200567 else {
Victor Stinner11517102014-07-29 23:31:34 +0200568 is_socket = 1;
Victor Stinner38227602014-08-27 12:59:44 +0200569
570 /* Windows does not provide a function to test if a socket
571 is in non-blocking mode */
572 }
Victor Stinner11517102014-07-29 23:31:34 +0200573 }
574
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100575 old_sockfd = wakeup.fd;
576 wakeup.fd = sockfd;
Victor Stinner11517102014-07-29 23:31:34 +0200577 wakeup.use_send = is_socket;
578
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100579 if (old_sockfd != INVALID_FD)
580 return PyLong_FromSocket_t(old_sockfd);
Victor Stinner11517102014-07-29 23:31:34 +0200581 else
582 return PyLong_FromLong(-1);
583#else
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200584 if (fd != -1) {
Victor Stinner38227602014-08-27 12:59:44 +0200585 int blocking;
586
Victor Stinner1d8948e2014-07-24 22:51:05 +0200587 if (!_PyVerify_fd(fd)) {
588 PyErr_SetString(PyExc_ValueError, "invalid fd");
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200589 return NULL;
590 }
Victor Stinner1d8948e2014-07-24 22:51:05 +0200591
Victor Stinnere134a7f2015-03-30 10:09:31 +0200592 if (_Py_fstat(fd, &status) != 0)
Victor Stinner11517102014-07-29 23:31:34 +0200593 return NULL;
Victor Stinner38227602014-08-27 12:59:44 +0200594
595 blocking = _Py_get_blocking(fd);
596 if (blocking < 0)
597 return NULL;
598 if (blocking) {
599 PyErr_Format(PyExc_ValueError,
600 "the fd %i must be in non-blocking mode",
601 fd);
602 return NULL;
603 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 }
Victor Stinner0bffc942014-07-21 16:28:54 +0200605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 old_fd = wakeup_fd;
607 wakeup_fd = fd;
Victor Stinner0bffc942014-07-21 16:28:54 +0200608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 return PyLong_FromLong(old_fd);
Victor Stinner11517102014-07-29 23:31:34 +0200610#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000611}
612
613PyDoc_STRVAR(set_wakeup_fd_doc,
614"set_wakeup_fd(fd) -> fd\n\
615\n\
Victor Stinner11517102014-07-29 23:31:34 +0200616Sets the fd to be written to (with the signal number) when a signal\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000617comes in. A library can use this to wakeup select or poll.\n\
Victor Stinner11517102014-07-29 23:31:34 +0200618The previous fd or -1 is returned.\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000619\n\
620The fd must be non-blocking.");
621
622/* C API for the same, without all the error checking */
623int
624PySignal_SetWakeupFd(int fd)
625{
Victor Stinner11517102014-07-29 23:31:34 +0200626 int old_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 if (fd < 0)
628 fd = -1;
Victor Stinner11517102014-07-29 23:31:34 +0200629
630#ifdef MS_WINDOWS
631 old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int);
632 wakeup.fd = fd;
633#else
634 old_fd = wakeup_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 wakeup_fd = fd;
Victor Stinner11517102014-07-29 23:31:34 +0200636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 return old_fd;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000638}
639
640
Martin v. Löwis823725e2008-03-24 13:39:54 +0000641#ifdef HAVE_SETITIMER
642static PyObject *
643signal_setitimer(PyObject *self, PyObject *args)
644{
645 double first;
646 double interval = 0;
647 int which;
648 struct itimerval new, old;
649
650 if(!PyArg_ParseTuple(args, "id|d:setitimer", &which, &first, &interval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000652
653 timeval_from_double(first, &new.it_value);
654 timeval_from_double(interval, &new.it_interval);
655 /* Let OS check "which" value */
656 if (setitimer(which, &new, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 PyErr_SetFromErrno(ItimerError);
658 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000659 }
660
661 return itimer_retval(&old);
662}
663
664PyDoc_STRVAR(setitimer_doc,
665"setitimer(which, seconds[, interval])\n\
666\n\
667Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL\n\
668or ITIMER_PROF) to fire after value seconds and after\n\
669that every interval seconds.\n\
670The itimer can be cleared by setting seconds to zero.\n\
671\n\
672Returns old values as a tuple: (delay, interval).");
673#endif
674
675
676#ifdef HAVE_GETITIMER
677static PyObject *
678signal_getitimer(PyObject *self, PyObject *args)
679{
680 int which;
681 struct itimerval old;
682
683 if (!PyArg_ParseTuple(args, "i:getitimer", &which))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000685
686 if (getitimer(which, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 PyErr_SetFromErrno(ItimerError);
688 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000689 }
690
691 return itimer_retval(&old);
692}
693
694PyDoc_STRVAR(getitimer_doc,
695"getitimer(which)\n\
696\n\
697Returns current value of given itimer.");
698#endif
699
Ross Lagerwallbc808222011-06-25 12:13:40 +0200700#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \
701 defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinnera9293352011-04-30 15:21:58 +0200702/* Convert an iterable to a sigset.
703 Return 0 on success, return -1 and raise an exception on error. */
704
705static int
706iterable_to_sigset(PyObject *iterable, sigset_t *mask)
707{
708 int result = -1;
709 PyObject *iterator, *item;
710 long signum;
711 int err;
712
713 sigemptyset(mask);
714
715 iterator = PyObject_GetIter(iterable);
716 if (iterator == NULL)
717 goto error;
718
719 while (1)
720 {
721 item = PyIter_Next(iterator);
722 if (item == NULL) {
723 if (PyErr_Occurred())
724 goto error;
725 else
726 break;
727 }
728
729 signum = PyLong_AsLong(item);
730 Py_DECREF(item);
731 if (signum == -1 && PyErr_Occurred())
732 goto error;
733 if (0 < signum && signum < NSIG)
734 err = sigaddset(mask, (int)signum);
735 else
736 err = 1;
737 if (err) {
738 PyErr_Format(PyExc_ValueError,
739 "signal number %ld out of range", signum);
740 goto error;
741 }
742 }
743 result = 0;
744
745error:
746 Py_XDECREF(iterator);
747 return result;
748}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200749#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200750
Victor Stinnerb3e72192011-05-08 01:46:11 +0200751#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
Victor Stinner35b300c2011-05-04 13:20:35 +0200752static PyObject*
753sigset_to_set(sigset_t mask)
754{
755 PyObject *signum, *result;
756 int sig;
757
758 result = PySet_New(0);
759 if (result == NULL)
760 return NULL;
761
762 for (sig = 1; sig < NSIG; sig++) {
763 if (sigismember(&mask, sig) != 1)
764 continue;
765
766 /* Handle the case where it is a member by adding the signal to
767 the result list. Ignore the other cases because they mean the
768 signal isn't a member of the mask or the signal was invalid,
769 and an invalid signal must have been our fault in constructing
770 the loop boundaries. */
771 signum = PyLong_FromLong(sig);
772 if (signum == NULL) {
773 Py_DECREF(result);
774 return NULL;
775 }
776 if (PySet_Add(result, signum) == -1) {
777 Py_DECREF(signum);
778 Py_DECREF(result);
779 return NULL;
780 }
781 Py_DECREF(signum);
782 }
783 return result;
784}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200785#endif
Victor Stinner35b300c2011-05-04 13:20:35 +0200786
Victor Stinnerb3e72192011-05-08 01:46:11 +0200787#ifdef PYPTHREAD_SIGMASK
Victor Stinnera9293352011-04-30 15:21:58 +0200788static PyObject *
789signal_pthread_sigmask(PyObject *self, PyObject *args)
790{
Victor Stinner35b300c2011-05-04 13:20:35 +0200791 int how;
792 PyObject *signals;
Victor Stinnera9293352011-04-30 15:21:58 +0200793 sigset_t mask, previous;
794 int err;
795
796 if (!PyArg_ParseTuple(args, "iO:pthread_sigmask", &how, &signals))
797 return NULL;
798
799 if (iterable_to_sigset(signals, &mask))
800 return NULL;
801
802 err = pthread_sigmask(how, &mask, &previous);
803 if (err != 0) {
804 errno = err;
Victor Stinnerb3e72192011-05-08 01:46:11 +0200805 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera9293352011-04-30 15:21:58 +0200806 return NULL;
807 }
808
Victor Stinnerd0e516d2011-05-03 14:57:12 +0200809 /* if signals was unblocked, signal handlers have been called */
810 if (PyErr_CheckSignals())
811 return NULL;
812
Victor Stinner35b300c2011-05-04 13:20:35 +0200813 return sigset_to_set(previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200814}
815
816PyDoc_STRVAR(signal_pthread_sigmask_doc,
817"pthread_sigmask(how, mask) -> old mask\n\
818\n\
819Fetch and/or change the signal mask of the calling thread.");
820#endif /* #ifdef PYPTHREAD_SIGMASK */
821
Martin v. Löwis823725e2008-03-24 13:39:54 +0000822
Victor Stinnerb3e72192011-05-08 01:46:11 +0200823#ifdef HAVE_SIGPENDING
824static PyObject *
825signal_sigpending(PyObject *self)
826{
827 int err;
828 sigset_t mask;
829 err = sigpending(&mask);
830 if (err)
831 return PyErr_SetFromErrno(PyExc_OSError);
832 return sigset_to_set(mask);
833}
834
835PyDoc_STRVAR(signal_sigpending_doc,
836"sigpending() -> list\n\
837\n\
838Examine pending signals.");
839#endif /* #ifdef HAVE_SIGPENDING */
840
841
842#ifdef HAVE_SIGWAIT
843static PyObject *
844signal_sigwait(PyObject *self, PyObject *args)
845{
846 PyObject *signals;
847 sigset_t set;
848 int err, signum;
849
850 if (!PyArg_ParseTuple(args, "O:sigwait", &signals))
851 return NULL;
852
853 if (iterable_to_sigset(signals, &set))
854 return NULL;
855
Victor Stinner10c30d62011-06-10 01:39:53 +0200856 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200857 err = sigwait(&set, &signum);
Victor Stinner10c30d62011-06-10 01:39:53 +0200858 Py_END_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200859 if (err) {
860 errno = err;
861 return PyErr_SetFromErrno(PyExc_OSError);
862 }
863
864 return PyLong_FromLong(signum);
865}
866
867PyDoc_STRVAR(signal_sigwait_doc,
868"sigwait(sigset) -> signum\n\
869\n\
870Wait a signal.");
871#endif /* #ifdef HAVE_SIGPENDING */
872
Ross Lagerwallbc808222011-06-25 12:13:40 +0200873#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
874static int initialized;
875static PyStructSequence_Field struct_siginfo_fields[] = {
876 {"si_signo", "signal number"},
877 {"si_code", "signal code"},
878 {"si_errno", "errno associated with this signal"},
879 {"si_pid", "sending process ID"},
880 {"si_uid", "real user ID of sending process"},
881 {"si_status", "exit value or signal"},
882 {"si_band", "band event for SIGPOLL"},
883 {0}
884};
885
886PyDoc_STRVAR(struct_siginfo__doc__,
887"struct_siginfo: Result from sigwaitinfo or sigtimedwait.\n\n\
888This object may be accessed either as a tuple of\n\
889(si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band),\n\
890or via the attributes si_signo, si_code, and so on.");
891
892static PyStructSequence_Desc struct_siginfo_desc = {
893 "signal.struct_siginfo", /* name */
894 struct_siginfo__doc__, /* doc */
895 struct_siginfo_fields, /* fields */
896 7 /* n_in_sequence */
897};
898
899static PyTypeObject SiginfoType;
900
901static PyObject *
902fill_siginfo(siginfo_t *si)
903{
904 PyObject *result = PyStructSequence_New(&SiginfoType);
905 if (!result)
906 return NULL;
907
908 PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo)));
909 PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code)));
910 PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno)));
911 PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid));
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200912 PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid));
Ross Lagerwallbc808222011-06-25 12:13:40 +0200913 PyStructSequence_SET_ITEM(result, 5,
914 PyLong_FromLong((long)(si->si_status)));
915 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
916 if (PyErr_Occurred()) {
917 Py_DECREF(result);
918 return NULL;
919 }
920
921 return result;
922}
923#endif
924
925#ifdef HAVE_SIGWAITINFO
926static PyObject *
927signal_sigwaitinfo(PyObject *self, PyObject *args)
928{
929 PyObject *signals;
930 sigset_t set;
931 siginfo_t si;
932 int err;
Victor Stinnera453cd82015-03-20 12:54:28 +0100933 int async_err = 0;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200934
935 if (!PyArg_ParseTuple(args, "O:sigwaitinfo", &signals))
936 return NULL;
937
938 if (iterable_to_sigset(signals, &set))
939 return NULL;
940
Victor Stinnera453cd82015-03-20 12:54:28 +0100941 do {
942 Py_BEGIN_ALLOW_THREADS
943 err = sigwaitinfo(&set, &si);
944 Py_END_ALLOW_THREADS
945 } while (err == -1
946 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Ross Lagerwallbc808222011-06-25 12:13:40 +0200947 if (err == -1)
Victor Stinnera453cd82015-03-20 12:54:28 +0100948 return (!async_err) ? PyErr_SetFromErrno(PyExc_OSError) : NULL;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200949
950 return fill_siginfo(&si);
951}
952
953PyDoc_STRVAR(signal_sigwaitinfo_doc,
954"sigwaitinfo(sigset) -> struct_siginfo\n\
955\n\
956Wait synchronously for a signal until one of the signals in *sigset* is\n\
957delivered.\n\
958Returns a struct_siginfo containing information about the signal.");
959#endif /* #ifdef HAVE_SIGWAITINFO */
960
961#ifdef HAVE_SIGTIMEDWAIT
962static PyObject *
963signal_sigtimedwait(PyObject *self, PyObject *args)
964{
Victor Stinner34dc0f42015-03-27 18:19:03 +0100965 PyObject *signals, *timeout_obj;
Victor Stinnera453cd82015-03-20 12:54:28 +0100966 struct timespec ts;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200967 sigset_t set;
968 siginfo_t si;
Victor Stinnera453cd82015-03-20 12:54:28 +0100969 int res;
Victor Stinner34dc0f42015-03-27 18:19:03 +0100970 _PyTime_t timeout, deadline, monotonic;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200971
Victor Stinner34dc0f42015-03-27 18:19:03 +0100972 if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
973 &signals, &timeout_obj))
974 return NULL;
975
Victor Stinner869e1772015-03-30 03:49:14 +0200976 if (_PyTime_FromSecondsObject(&timeout,
977 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Ross Lagerwallbc808222011-06-25 12:13:40 +0200978 return NULL;
979
Victor Stinnera453cd82015-03-20 12:54:28 +0100980 if (timeout < 0) {
Ross Lagerwallbc808222011-06-25 12:13:40 +0200981 PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
982 return NULL;
983 }
984
985 if (iterable_to_sigset(signals, &set))
986 return NULL;
987
Victor Stinner34dc0f42015-03-27 18:19:03 +0100988 deadline = _PyTime_GetMonotonicClock() + timeout;
Victor Stinnera453cd82015-03-20 12:54:28 +0100989
990 do {
Victor Stinner34dc0f42015-03-27 18:19:03 +0100991 if (_PyTime_AsTimespec(timeout, &ts) < 0)
992 return NULL;
Victor Stinnera453cd82015-03-20 12:54:28 +0100993
994 Py_BEGIN_ALLOW_THREADS
995 res = sigtimedwait(&set, &si, &ts);
996 Py_END_ALLOW_THREADS
997
998 if (res != -1)
999 break;
1000
1001 if (errno != EINTR) {
1002 if (errno == EAGAIN)
1003 Py_RETURN_NONE;
1004 else
1005 return PyErr_SetFromErrno(PyExc_OSError);
1006 }
1007
1008 /* sigtimedwait() was interrupted by a signal (EINTR) */
1009 if (PyErr_CheckSignals())
1010 return NULL;
1011
Victor Stinner34dc0f42015-03-27 18:19:03 +01001012 monotonic = _PyTime_GetMonotonicClock();
1013 timeout = deadline - monotonic;
Victor Stinner6aa446c2015-03-30 21:33:51 +02001014 if (timeout < 0)
Victor Stinnera453cd82015-03-20 12:54:28 +01001015 break;
1016 } while (1);
Ross Lagerwallbc808222011-06-25 12:13:40 +02001017
1018 return fill_siginfo(&si);
1019}
1020
1021PyDoc_STRVAR(signal_sigtimedwait_doc,
1022"sigtimedwait(sigset, (timeout_sec, timeout_nsec)) -> struct_siginfo\n\
1023\n\
1024Like sigwaitinfo(), but with a timeout specified as a tuple of (seconds,\n\
1025nanoseconds).");
1026#endif /* #ifdef HAVE_SIGTIMEDWAIT */
1027
Victor Stinnerb3e72192011-05-08 01:46:11 +02001028
1029#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
1030static PyObject *
1031signal_pthread_kill(PyObject *self, PyObject *args)
1032{
1033 long tid;
1034 int signum;
1035 int err;
1036
1037 if (!PyArg_ParseTuple(args, "li:pthread_kill", &tid, &signum))
1038 return NULL;
1039
Victor Stinner86e104a2011-05-09 14:45:38 +02001040 err = pthread_kill((pthread_t)tid, signum);
Victor Stinnerb3e72192011-05-08 01:46:11 +02001041 if (err != 0) {
1042 errno = err;
1043 PyErr_SetFromErrno(PyExc_OSError);
1044 return NULL;
1045 }
1046
1047 /* the signal may have been send to the current thread */
1048 if (PyErr_CheckSignals())
1049 return NULL;
1050
1051 Py_RETURN_NONE;
1052}
1053
1054PyDoc_STRVAR(signal_pthread_kill_doc,
1055"pthread_kill(thread_id, signum)\n\
1056\n\
1057Send a signal to a thread.");
1058#endif /* #if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD) */
1059
1060
1061
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001062/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +00001063static PyMethodDef signal_methods[] = {
Guido van Rossum1171ee61997-08-22 20:42:00 +00001064#ifdef HAVE_ALARM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 {"alarm", signal_alarm, METH_VARARGS, alarm_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +00001066#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001067#ifdef HAVE_SETITIMER
1068 {"setitimer", signal_setitimer, METH_VARARGS, setitimer_doc},
1069#endif
1070#ifdef HAVE_GETITIMER
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 {"getitimer", signal_getitimer, METH_VARARGS, getitimer_doc},
Martin v. Löwis823725e2008-03-24 13:39:54 +00001072#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 {"signal", signal_signal, METH_VARARGS, signal_doc},
1074 {"getsignal", signal_getsignal, METH_VARARGS, getsignal_doc},
1075 {"set_wakeup_fd", signal_set_wakeup_fd, METH_VARARGS, set_wakeup_fd_doc},
Christian Heimes8640e742008-02-23 16:23:06 +00001076#ifdef HAVE_SIGINTERRUPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 {"siginterrupt", signal_siginterrupt, METH_VARARGS, siginterrupt_doc},
Christian Heimes8640e742008-02-23 16:23:06 +00001078#endif
Guido van Rossum1171ee61997-08-22 20:42:00 +00001079#ifdef HAVE_PAUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 {"pause", (PyCFunction)signal_pause,
Victor Stinnera9293352011-04-30 15:21:58 +02001081 METH_NOARGS, pause_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +00001082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 {"default_int_handler", signal_default_int_handler,
1084 METH_VARARGS, default_int_handler_doc},
Victor Stinnerb3e72192011-05-08 01:46:11 +02001085#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
1086 {"pthread_kill", (PyCFunction)signal_pthread_kill,
1087 METH_VARARGS, signal_pthread_kill_doc},
1088#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001089#ifdef PYPTHREAD_SIGMASK
1090 {"pthread_sigmask", (PyCFunction)signal_pthread_sigmask,
1091 METH_VARARGS, signal_pthread_sigmask_doc},
1092#endif
Victor Stinnerb3e72192011-05-08 01:46:11 +02001093#ifdef HAVE_SIGPENDING
1094 {"sigpending", (PyCFunction)signal_sigpending,
1095 METH_NOARGS, signal_sigpending_doc},
1096#endif
1097#ifdef HAVE_SIGWAIT
1098 {"sigwait", (PyCFunction)signal_sigwait,
1099 METH_VARARGS, signal_sigwait_doc},
1100#endif
Ross Lagerwallbc808222011-06-25 12:13:40 +02001101#ifdef HAVE_SIGWAITINFO
1102 {"sigwaitinfo", (PyCFunction)signal_sigwaitinfo,
1103 METH_VARARGS, signal_sigwaitinfo_doc},
1104#endif
1105#ifdef HAVE_SIGTIMEDWAIT
1106 {"sigtimedwait", (PyCFunction)signal_sigtimedwait,
1107 METH_VARARGS, signal_sigtimedwait_doc},
1108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001110};
1111
Barry Warsaw92971171997-01-03 00:14:25 +00001112
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001113PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001114"This module provides mechanisms to use signal handlers in Python.\n\
1115\n\
1116Functions:\n\
1117\n\
1118alarm() -- cause SIGALRM after a specified time [Unix only]\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001119setitimer() -- cause a signal (described below) after a specified\n\
1120 float time and the timer may restart then [Unix only]\n\
1121getitimer() -- get current value of timer [Unix only]\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001122signal() -- set the action for a given signal\n\
1123getsignal() -- get the signal action for a given signal\n\
1124pause() -- wait until a signal arrives [Unix only]\n\
1125default_int_handler() -- default SIGINT handler\n\
1126\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001127signal constants:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001128SIG_DFL -- used to refer to the system default handler\n\
1129SIG_IGN -- used to ignore the signal\n\
1130NSIG -- number of defined signals\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001131SIGINT, SIGTERM, etc. -- signal numbers\n\
1132\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001133itimer constants:\n\
1134ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
1135 expiration\n\
1136ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
1137 and delivers SIGVTALRM upon expiration\n\
1138ITIMER_PROF -- decrements both when the process is executing and\n\
1139 when the system is executing on behalf of the process.\n\
1140 Coupled with ITIMER_VIRTUAL, this timer is usually\n\
1141 used to profile the time spent by the application\n\
1142 in user and kernel space. SIGPROF is delivered upon\n\
1143 expiration.\n\
1144\n\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001145*** IMPORTANT NOTICE ***\n\
1146A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001147the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001148
Martin v. Löwis1a214512008-06-11 05:26:20 +00001149static struct PyModuleDef signalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 PyModuleDef_HEAD_INIT,
Brett Cannon815a6f32014-04-04 10:20:28 -04001151 "_signal",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 module_doc,
1153 -1,
1154 signal_methods,
1155 NULL,
1156 NULL,
1157 NULL,
1158 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001159};
1160
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001161PyMODINIT_FUNC
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001162PyInit__signal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 PyObject *m, *d, *x;
1165 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001166
1167#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 main_thread = PyThread_get_thread_ident();
1169 main_pid = getpid();
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001170#endif
1171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 /* Create the module and add the functions */
1173 m = PyModule_Create(&signalmodule);
1174 if (m == NULL)
1175 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001176
Ross Lagerwallbc808222011-06-25 12:13:40 +02001177#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinner1c8f0592013-07-22 22:24:54 +02001178 if (!initialized) {
1179 if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0)
1180 return NULL;
1181 }
Ross Lagerwallbc808222011-06-25 12:13:40 +02001182 Py_INCREF((PyObject*) &SiginfoType);
1183 PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
1184 initialized = 1;
1185#endif
1186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 /* Add some symbolic constants to the module */
1188 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
1191 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
1192 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
1195 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
1196 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +00001197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 x = PyLong_FromLong((long)NSIG);
1199 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
1200 goto finally;
1201 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +00001202
Victor Stinnera9293352011-04-30 15:21:58 +02001203#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001204 if (PyModule_AddIntMacro(m, SIG_BLOCK))
1205 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001206#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001207#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001208 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
1209 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001210#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001211#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +02001212 if (PyModule_AddIntMacro(m, SIG_SETMASK))
1213 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001214#endif
1215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
1217 if (!x)
1218 goto finally;
1219 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +00001220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 Handlers[0].tripped = 0;
1222 for (i = 1; i < NSIG; i++) {
1223 void (*t)(int);
1224 t = PyOS_getsig(i);
1225 Handlers[i].tripped = 0;
1226 if (t == SIG_DFL)
1227 Handlers[i].func = DefaultHandler;
1228 else if (t == SIG_IGN)
1229 Handlers[i].func = IgnoreHandler;
1230 else
1231 Handlers[i].func = Py_None; /* None of our business */
1232 Py_INCREF(Handlers[i].func);
1233 }
1234 if (Handlers[SIGINT].func == DefaultHandler) {
1235 /* Install default int handler */
1236 Py_INCREF(IntHandler);
1237 Py_DECREF(Handlers[SIGINT].func);
1238 Handlers[SIGINT].func = IntHandler;
1239 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
1240 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001241
1242#ifdef SIGHUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 x = PyLong_FromLong(SIGHUP);
1244 PyDict_SetItemString(d, "SIGHUP", x);
1245 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001246#endif
1247#ifdef SIGINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 x = PyLong_FromLong(SIGINT);
1249 PyDict_SetItemString(d, "SIGINT", x);
1250 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001251#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +00001252#ifdef SIGBREAK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 x = PyLong_FromLong(SIGBREAK);
1254 PyDict_SetItemString(d, "SIGBREAK", x);
1255 Py_XDECREF(x);
Tim Peters1ce3cf72001-10-01 17:58:40 +00001256#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001257#ifdef SIGQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 x = PyLong_FromLong(SIGQUIT);
1259 PyDict_SetItemString(d, "SIGQUIT", x);
1260 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001261#endif
1262#ifdef SIGILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 x = PyLong_FromLong(SIGILL);
1264 PyDict_SetItemString(d, "SIGILL", x);
1265 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001266#endif
1267#ifdef SIGTRAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 x = PyLong_FromLong(SIGTRAP);
1269 PyDict_SetItemString(d, "SIGTRAP", x);
1270 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001271#endif
1272#ifdef SIGIOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 x = PyLong_FromLong(SIGIOT);
1274 PyDict_SetItemString(d, "SIGIOT", x);
1275 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001276#endif
1277#ifdef SIGABRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 x = PyLong_FromLong(SIGABRT);
1279 PyDict_SetItemString(d, "SIGABRT", x);
1280 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001281#endif
1282#ifdef SIGEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 x = PyLong_FromLong(SIGEMT);
1284 PyDict_SetItemString(d, "SIGEMT", x);
1285 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001286#endif
1287#ifdef SIGFPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 x = PyLong_FromLong(SIGFPE);
1289 PyDict_SetItemString(d, "SIGFPE", x);
1290 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001291#endif
1292#ifdef SIGKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 x = PyLong_FromLong(SIGKILL);
1294 PyDict_SetItemString(d, "SIGKILL", x);
1295 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001296#endif
1297#ifdef SIGBUS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 x = PyLong_FromLong(SIGBUS);
1299 PyDict_SetItemString(d, "SIGBUS", x);
1300 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001301#endif
1302#ifdef SIGSEGV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 x = PyLong_FromLong(SIGSEGV);
1304 PyDict_SetItemString(d, "SIGSEGV", x);
1305 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001306#endif
1307#ifdef SIGSYS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 x = PyLong_FromLong(SIGSYS);
1309 PyDict_SetItemString(d, "SIGSYS", x);
1310 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001311#endif
1312#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 x = PyLong_FromLong(SIGPIPE);
1314 PyDict_SetItemString(d, "SIGPIPE", x);
1315 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001316#endif
1317#ifdef SIGALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 x = PyLong_FromLong(SIGALRM);
1319 PyDict_SetItemString(d, "SIGALRM", x);
1320 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001321#endif
1322#ifdef SIGTERM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 x = PyLong_FromLong(SIGTERM);
1324 PyDict_SetItemString(d, "SIGTERM", x);
1325 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001326#endif
1327#ifdef SIGUSR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 x = PyLong_FromLong(SIGUSR1);
1329 PyDict_SetItemString(d, "SIGUSR1", x);
1330 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001331#endif
1332#ifdef SIGUSR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 x = PyLong_FromLong(SIGUSR2);
1334 PyDict_SetItemString(d, "SIGUSR2", x);
1335 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001336#endif
1337#ifdef SIGCLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 x = PyLong_FromLong(SIGCLD);
1339 PyDict_SetItemString(d, "SIGCLD", x);
1340 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001341#endif
1342#ifdef SIGCHLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 x = PyLong_FromLong(SIGCHLD);
1344 PyDict_SetItemString(d, "SIGCHLD", x);
1345 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001346#endif
1347#ifdef SIGPWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 x = PyLong_FromLong(SIGPWR);
1349 PyDict_SetItemString(d, "SIGPWR", x);
1350 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001351#endif
1352#ifdef SIGIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 x = PyLong_FromLong(SIGIO);
1354 PyDict_SetItemString(d, "SIGIO", x);
1355 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001356#endif
1357#ifdef SIGURG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 x = PyLong_FromLong(SIGURG);
1359 PyDict_SetItemString(d, "SIGURG", x);
1360 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001361#endif
1362#ifdef SIGWINCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 x = PyLong_FromLong(SIGWINCH);
1364 PyDict_SetItemString(d, "SIGWINCH", x);
1365 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001366#endif
1367#ifdef SIGPOLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 x = PyLong_FromLong(SIGPOLL);
1369 PyDict_SetItemString(d, "SIGPOLL", x);
1370 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001371#endif
1372#ifdef SIGSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 x = PyLong_FromLong(SIGSTOP);
1374 PyDict_SetItemString(d, "SIGSTOP", x);
1375 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001376#endif
1377#ifdef SIGTSTP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 x = PyLong_FromLong(SIGTSTP);
1379 PyDict_SetItemString(d, "SIGTSTP", x);
1380 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001381#endif
1382#ifdef SIGCONT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 x = PyLong_FromLong(SIGCONT);
1384 PyDict_SetItemString(d, "SIGCONT", x);
1385 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001386#endif
1387#ifdef SIGTTIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 x = PyLong_FromLong(SIGTTIN);
1389 PyDict_SetItemString(d, "SIGTTIN", x);
1390 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001391#endif
1392#ifdef SIGTTOU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 x = PyLong_FromLong(SIGTTOU);
1394 PyDict_SetItemString(d, "SIGTTOU", x);
1395 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001396#endif
1397#ifdef SIGVTALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 x = PyLong_FromLong(SIGVTALRM);
1399 PyDict_SetItemString(d, "SIGVTALRM", x);
1400 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001401#endif
1402#ifdef SIGPROF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 x = PyLong_FromLong(SIGPROF);
1404 PyDict_SetItemString(d, "SIGPROF", x);
1405 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001406#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001407#ifdef SIGXCPU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 x = PyLong_FromLong(SIGXCPU);
1409 PyDict_SetItemString(d, "SIGXCPU", x);
1410 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001411#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001412#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 x = PyLong_FromLong(SIGXFSZ);
1414 PyDict_SetItemString(d, "SIGXFSZ", x);
1415 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001416#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001417#ifdef SIGRTMIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 x = PyLong_FromLong(SIGRTMIN);
1419 PyDict_SetItemString(d, "SIGRTMIN", x);
1420 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001421#endif
1422#ifdef SIGRTMAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 x = PyLong_FromLong(SIGRTMAX);
1424 PyDict_SetItemString(d, "SIGRTMAX", x);
1425 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001426#endif
Martin v. Löwis175af252002-01-12 11:43:25 +00001427#ifdef SIGINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 x = PyLong_FromLong(SIGINFO);
1429 PyDict_SetItemString(d, "SIGINFO", x);
1430 Py_XDECREF(x);
Martin v. Löwis175af252002-01-12 11:43:25 +00001431#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001432
1433#ifdef ITIMER_REAL
1434 x = PyLong_FromLong(ITIMER_REAL);
1435 PyDict_SetItemString(d, "ITIMER_REAL", x);
1436 Py_DECREF(x);
1437#endif
1438#ifdef ITIMER_VIRTUAL
1439 x = PyLong_FromLong(ITIMER_VIRTUAL);
1440 PyDict_SetItemString(d, "ITIMER_VIRTUAL", x);
1441 Py_DECREF(x);
1442#endif
1443#ifdef ITIMER_PROF
1444 x = PyLong_FromLong(ITIMER_PROF);
1445 PyDict_SetItemString(d, "ITIMER_PROF", x);
1446 Py_DECREF(x);
1447#endif
1448
1449#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 ItimerError = PyErr_NewException("signal.ItimerError",
1451 PyExc_IOError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +00001452 if (ItimerError != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +00001454#endif
1455
Brian Curtineb24d742010-04-12 17:16:38 +00001456#ifdef CTRL_C_EVENT
1457 x = PyLong_FromLong(CTRL_C_EVENT);
1458 PyDict_SetItemString(d, "CTRL_C_EVENT", x);
1459 Py_DECREF(x);
1460#endif
1461
1462#ifdef CTRL_BREAK_EVENT
1463 x = PyLong_FromLong(CTRL_BREAK_EVENT);
1464 PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x);
1465 Py_DECREF(x);
1466#endif
1467
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001468#ifdef MS_WINDOWS
1469 /* Create manual-reset event, initially unset */
1470 sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
1471#endif
1472
Martin v. Löwis1a214512008-06-11 05:26:20 +00001473 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 Py_DECREF(m);
1475 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001476 }
Barry Warsaw92971171997-01-03 00:14:25 +00001477
Barry Warsaw92971171997-01-03 00:14:25 +00001478 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001479 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +00001480}
1481
1482static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001483finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 int i;
1486 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 PyOS_setsig(SIGINT, old_siginthandler);
1489 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 for (i = 1; i < NSIG; i++) {
1492 func = Handlers[i].func;
1493 Handlers[i].tripped = 0;
1494 Handlers[i].func = NULL;
1495 if (i != SIGINT && func != NULL && func != Py_None &&
1496 func != DefaultHandler && func != IgnoreHandler)
1497 PyOS_setsig(i, SIG_DFL);
1498 Py_XDECREF(func);
1499 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001500
Serhiy Storchaka505ff752014-02-09 13:33:53 +02001501 Py_CLEAR(IntHandler);
1502 Py_CLEAR(DefaultHandler);
1503 Py_CLEAR(IgnoreHandler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001504}
1505
Barry Warsaw92971171997-01-03 00:14:25 +00001506
Barry Warsaw92971171997-01-03 00:14:25 +00001507/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001508int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001509PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 int i;
1512 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 if (!is_tripped)
1515 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001516
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001517#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 if (PyThread_get_thread_ident() != main_thread)
1519 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001520#endif
Christian Heimesb76922a2007-12-11 01:06:40 +00001521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 /*
1523 * The is_tripped variable is meant to speed up the calls to
1524 * PyErr_CheckSignals (both directly or via pending calls) when no
1525 * signal has arrived. This variable is set to 1 when a signal arrives
1526 * and it is set to 0 here, when we know some signals arrived. This way
1527 * we can run the registered handlers with no signals blocked.
1528 *
1529 * NOTE: with this approach we can have a situation where is_tripped is
1530 * 1 but we have no more signals to handle (Handlers[i].tripped
1531 * is 0 for every signal i). This won't do us any harm (except
1532 * we're gonna spent some cycles for nothing). This happens when
1533 * we receive a signal i after we zero is_tripped and before we
1534 * check Handlers[i].tripped.
1535 */
1536 is_tripped = 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 if (!(f = (PyObject *)PyEval_GetFrame()))
1539 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 for (i = 1; i < NSIG; i++) {
1542 if (Handlers[i].tripped) {
1543 PyObject *result = NULL;
1544 PyObject *arglist = Py_BuildValue("(iO)", i, f);
1545 Handlers[i].tripped = 0;
Barry Warsaw92971171997-01-03 00:14:25 +00001546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 if (arglist) {
1548 result = PyEval_CallObject(Handlers[i].func,
1549 arglist);
1550 Py_DECREF(arglist);
1551 }
1552 if (!result)
1553 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +00001554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 Py_DECREF(result);
1556 }
1557 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001560}
1561
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001562
Barry Warsaw92971171997-01-03 00:14:25 +00001563/* Replacements for intrcheck.c functionality
1564 * Declared in pyerrors.h
1565 */
1566void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001567PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001568{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001569 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001570}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001571
1572void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001573PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001574{
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001575 PyObject *m = PyImport_ImportModule("_signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 if (m) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 Py_DECREF(m);
1578 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001579}
1580
1581void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001582PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001585}
1586
1587int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001588PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001591#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 if (PyThread_get_thread_ident() != main_thread)
1593 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 Handlers[SIGINT].tripped = 0;
1596 return 1;
1597 }
1598 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001599}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001600
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001601static void
1602_clear_pending_signals(void)
1603{
1604 int i;
1605 if (!is_tripped)
1606 return;
1607 is_tripped = 0;
1608 for (i = 1; i < NSIG; ++i) {
1609 Handlers[i].tripped = 0;
1610 }
1611}
1612
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001613void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001614PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001615{
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001616 /* Clear the signal flags after forking so that they aren't handled
1617 * in both processes if they came in just before the fork() but before
1618 * the interpreter had an opportunity to call the handlers. issue9535. */
1619 _clear_pending_signals();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001620#ifdef WITH_THREAD
Charles-François Natali6d0d24e2012-02-02 20:31:42 +01001621 /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API
1622 * can be called safely. */
1623 PyThread_ReInitTLS();
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001624 _PyGILState_Reinit();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 PyEval_ReInitThreads();
1626 main_thread = PyThread_get_thread_ident();
1627 main_pid = getpid();
1628 _PyImport_ReInitLock();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001629#endif
1630}
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001631
1632int
1633_PyOS_IsMainThread(void)
1634{
1635#ifdef WITH_THREAD
1636 return PyThread_get_thread_ident() == main_thread;
1637#else
1638 return 1;
1639#endif
1640}
1641
1642#ifdef MS_WINDOWS
1643void *_PyOS_SigintEvent(void)
1644{
1645 /* Returns a manual-reset event which gets tripped whenever
1646 SIGINT is received.
1647
1648 Python.h does not include windows.h so we do cannot use HANDLE
1649 as the return type of this function. We use void* instead. */
1650 return sigint_event;
1651}
1652#endif