blob: cc13194dfaca6187ba39fa1b5c9bcc3ed0aa756c [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;
Victor Stinnere72fe392015-04-01 18:35:22 +0200266
267 /* _Py_write_noraise() retries write() if write() is interrupted by
268 a signal (fails with EINTR). */
269 rc = _Py_write_noraise(fd, &byte, 1);
Victor Stinner11517102014-07-29 23:31:34 +0200270
271 if (rc < 0) {
272 Py_AddPendingCall(report_wakeup_write_error,
273 (void *)(Py_intptr_t)errno);
274 }
275 }
Victor Stinnerc13ef662011-05-25 02:35:58 +0200276 }
Victor Stinner11517102014-07-29 23:31:34 +0200277
278 if (!is_tripped) {
279 /* Set is_tripped after setting .tripped, as it gets
280 cleared in PyErr_CheckSignals() before .tripped. */
281 is_tripped = 1;
282 Py_AddPendingCall(checksignals_witharg, NULL);
283 }
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200284}
285
286static void
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000287signal_handler(int sig_num)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000288{
Antoine Pitrou39a65912010-11-05 19:47:27 +0000289 int save_errno = errno;
290
Antoine Pitrou39a65912010-11-05 19:47:27 +0000291#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 /* See NOTES section above */
Antoine Pitrou39a65912010-11-05 19:47:27 +0000293 if (getpid() == main_pid)
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000294#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000295 {
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200296 trip_signal(sig_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 }
Antoine Pitrou39a65912010-11-05 19:47:27 +0000298
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000299#ifndef HAVE_SIGACTION
Antoine Pitrou39a65912010-11-05 19:47:27 +0000300#ifdef SIGCHLD
301 /* To avoid infinite recursion, this signal remains
302 reset until explicit re-instated.
303 Don't clear the 'func' field as it is our pointer
304 to the Python handler... */
305 if (sig_num != SIGCHLD)
306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 /* If the handler was not set up with sigaction, reinstall it. See
Nick Coghland6009512014-11-20 21:39:37 +1000308 * Python/pylifecycle.c for the implementation of PyOS_setsig which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 * makes this true. See also issue8354. */
310 PyOS_setsig(sig_num, signal_handler);
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000311#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000312
313 /* Issue #10311: asynchronously executing signal handlers should not
314 mutate errno under the feet of unsuspecting C code. */
315 errno = save_errno;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +0100316
317#ifdef MS_WINDOWS
318 if (sig_num == SIGINT)
319 SetEvent(sigint_event);
320#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000321}
Guido van Rossume4485b01994-09-07 14:32:49 +0000322
Guido van Rossum06d511d1995-03-10 15:13:48 +0000323
Guido van Rossum1171ee61997-08-22 20:42:00 +0000324#ifdef HAVE_ALARM
Guido van Rossume4485b01994-09-07 14:32:49 +0000325static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000326signal_alarm(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 int t;
329 if (!PyArg_ParseTuple(args, "i:alarm", &t))
330 return NULL;
331 /* alarm() returns the number of seconds remaining */
332 return PyLong_FromLong((long)alarm(t));
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000333}
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000334
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000335PyDoc_STRVAR(alarm_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000336"alarm(seconds)\n\
337\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000338Arrange for SIGALRM to arrive after the given number of seconds.");
Guido van Rossum06d511d1995-03-10 15:13:48 +0000339#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000340
Guido van Rossum1171ee61997-08-22 20:42:00 +0000341#ifdef HAVE_PAUSE
Guido van Rossuma597dde1995-01-10 20:56:29 +0000342static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +0000343signal_pause(PyObject *self)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000344{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 Py_BEGIN_ALLOW_THREADS
346 (void)pause();
347 Py_END_ALLOW_THREADS
348 /* make sure that any exceptions that got raised are propagated
349 * back into Python
350 */
351 if (PyErr_CheckSignals())
352 return NULL;
Barry Warsaw92971171997-01-03 00:14:25 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 Py_INCREF(Py_None);
355 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000356}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000357PyDoc_STRVAR(pause_doc,
Barry Warsaw1ee36ff1998-07-21 22:41:18 +0000358"pause()\n\
359\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000360Wait until a signal arrives.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000361
Guido van Rossum06d511d1995-03-10 15:13:48 +0000362#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000363
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000364
Guido van Rossume4485b01994-09-07 14:32:49 +0000365static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000366signal_signal(PyObject *self, PyObject *args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 PyObject *obj;
369 int sig_num;
370 PyObject *old_handler;
371 void (*func)(int);
372 if (!PyArg_ParseTuple(args, "iO:signal", &sig_num, &obj))
373 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000374#ifdef MS_WINDOWS
375 /* Validate that sig_num is one of the allowable signals */
Brian Curtinc734b312010-09-06 16:04:10 +0000376 switch (sig_num) {
377 case SIGABRT: break;
Brian Curtin9e88b5a2010-10-01 14:49:24 +0000378#ifdef SIGBREAK
379 /* Issue #10003: SIGBREAK is not documented as permitted, but works
380 and corresponds to CTRL_BREAK_EVENT. */
381 case SIGBREAK: break;
382#endif
Brian Curtinc734b312010-09-06 16:04:10 +0000383 case SIGFPE: break;
384 case SIGILL: break;
385 case SIGINT: break;
386 case SIGSEGV: break;
387 case SIGTERM: break;
388 default:
389 PyErr_SetString(PyExc_ValueError, "invalid signal value");
390 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000391 }
392#endif
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000393#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 if (PyThread_get_thread_ident() != main_thread) {
395 PyErr_SetString(PyExc_ValueError,
396 "signal only works in main thread");
397 return NULL;
398 }
Guido van Rossumbb4ba121994-06-23 11:25:45 +0000399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 if (sig_num < 1 || sig_num >= NSIG) {
401 PyErr_SetString(PyExc_ValueError,
402 "signal number out of range");
403 return NULL;
404 }
405 if (obj == IgnoreHandler)
406 func = SIG_IGN;
407 else if (obj == DefaultHandler)
408 func = SIG_DFL;
409 else if (!PyCallable_Check(obj)) {
410 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000411"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 return NULL;
413 }
414 else
415 func = signal_handler;
416 if (PyOS_setsig(sig_num, func) == SIG_ERR) {
Victor Stinner388196e2011-05-10 17:13:00 +0200417 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 return NULL;
419 }
420 old_handler = Handlers[sig_num].func;
421 Handlers[sig_num].tripped = 0;
422 Py_INCREF(obj);
423 Handlers[sig_num].func = obj;
Antoine Pitrouc8c952c2013-05-04 23:16:59 +0200424 if (old_handler != NULL)
425 return old_handler;
426 else
427 Py_RETURN_NONE;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000428}
429
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000430PyDoc_STRVAR(signal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000431"signal(sig, action) -> action\n\
432\n\
433Set the action for the given signal. The action can be SIG_DFL,\n\
434SIG_IGN, or a callable Python object. The previous action is\n\
435returned. See getsignal() for possible return values.\n\
436\n\
437*** IMPORTANT NOTICE ***\n\
438A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000439the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000440
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000441
Guido van Rossume4485b01994-09-07 14:32:49 +0000442static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000443signal_getsignal(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 int sig_num;
446 PyObject *old_handler;
447 if (!PyArg_ParseTuple(args, "i:getsignal", &sig_num))
448 return NULL;
449 if (sig_num < 1 || sig_num >= NSIG) {
450 PyErr_SetString(PyExc_ValueError,
451 "signal number out of range");
452 return NULL;
453 }
454 old_handler = Handlers[sig_num].func;
Antoine Pitrouc8c952c2013-05-04 23:16:59 +0200455 if (old_handler != NULL) {
456 Py_INCREF(old_handler);
457 return old_handler;
458 }
459 else {
460 Py_RETURN_NONE;
461 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000462}
463
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000464PyDoc_STRVAR(getsignal_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000465"getsignal(sig) -> action\n\
466\n\
467Return the current action for the given signal. The return value can be:\n\
468SIG_IGN -- if the signal is being ignored\n\
469SIG_DFL -- if the default action for the signal is in effect\n\
470None -- if an unknown handler is in effect\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000471anything else -- the callable Python object used as a handler");
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000472
Christian Heimes8640e742008-02-23 16:23:06 +0000473#ifdef HAVE_SIGINTERRUPT
474PyDoc_STRVAR(siginterrupt_doc,
475"siginterrupt(sig, flag) -> None\n\
476change system call restart behaviour: if flag is False, system calls\n\
477will be restarted when interrupted by signal sig, else system calls\n\
478will be interrupted.");
479
480static PyObject *
481signal_siginterrupt(PyObject *self, PyObject *args)
482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 int sig_num;
484 int flag;
Christian Heimes8640e742008-02-23 16:23:06 +0000485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 if (!PyArg_ParseTuple(args, "ii:siginterrupt", &sig_num, &flag))
487 return NULL;
488 if (sig_num < 1 || sig_num >= NSIG) {
489 PyErr_SetString(PyExc_ValueError,
490 "signal number out of range");
491 return NULL;
492 }
493 if (siginterrupt(sig_num, flag)<0) {
Victor Stinner388196e2011-05-10 17:13:00 +0200494 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 return NULL;
496 }
Christian Heimes8640e742008-02-23 16:23:06 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 Py_INCREF(Py_None);
499 return Py_None;
Christian Heimes8640e742008-02-23 16:23:06 +0000500}
501
502#endif
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000503
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000504static PyObject *
505signal_set_wakeup_fd(PyObject *self, PyObject *args)
506{
Victor Stinnere134a7f2015-03-30 10:09:31 +0200507 struct _Py_stat_struct status;
Victor Stinner11517102014-07-29 23:31:34 +0200508#ifdef MS_WINDOWS
509 PyObject *fdobj;
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100510 SOCKET_T sockfd, old_sockfd;
Victor Stinner11517102014-07-29 23:31:34 +0200511 int res;
512 int res_size = sizeof res;
513 PyObject *mod;
Victor Stinner11517102014-07-29 23:31:34 +0200514 int is_socket;
515
516 if (!PyArg_ParseTuple(args, "O:set_wakeup_fd", &fdobj))
517 return NULL;
518
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100519 sockfd = PyLong_AsSocket_t(fdobj);
520 if (sockfd == (SOCKET_T)(-1) && PyErr_Occurred())
Victor Stinner11517102014-07-29 23:31:34 +0200521 return NULL;
522#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 int fd, old_fd;
Victor Stinner11517102014-07-29 23:31:34 +0200524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 if (!PyArg_ParseTuple(args, "i:set_wakeup_fd", &fd))
526 return NULL;
Victor Stinner11517102014-07-29 23:31:34 +0200527#endif
528
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000529#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 if (PyThread_get_thread_ident() != main_thread) {
531 PyErr_SetString(PyExc_ValueError,
532 "set_wakeup_fd only works in main thread");
533 return NULL;
534 }
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000535#endif
Victor Stinner0bffc942014-07-21 16:28:54 +0200536
Victor Stinner11517102014-07-29 23:31:34 +0200537#ifdef MS_WINDOWS
538 is_socket = 0;
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100539 if (sockfd != INVALID_FD) {
Victor Stinner11517102014-07-29 23:31:34 +0200540 /* Import the _socket module to call WSAStartup() */
541 mod = PyImport_ImportModuleNoBlock("_socket");
542 if (mod == NULL)
543 return NULL;
544 Py_DECREF(mod);
545
546 /* test the socket */
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100547 if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
Victor Stinner11517102014-07-29 23:31:34 +0200548 (char *)&res, &res_size) != 0) {
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100549 int fd, err;
550
551 err = WSAGetLastError();
Victor Stinner11517102014-07-29 23:31:34 +0200552 if (err != WSAENOTSOCK) {
553 PyErr_SetExcFromWindowsErr(PyExc_OSError, err);
554 return NULL;
555 }
556
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100557 fd = (int)sockfd;
558 if ((SOCKET_T)fd != sockfd || !_PyVerify_fd(fd)) {
Victor Stinner11517102014-07-29 23:31:34 +0200559 PyErr_SetString(PyExc_ValueError, "invalid fd");
560 return NULL;
561 }
562
Victor Stinnere134a7f2015-03-30 10:09:31 +0200563 if (_Py_fstat(fd, &status) != 0)
Victor Stinner11517102014-07-29 23:31:34 +0200564 return NULL;
Victor Stinner38227602014-08-27 12:59:44 +0200565
566 /* on Windows, a file cannot be set to non-blocking mode */
Victor Stinner11517102014-07-29 23:31:34 +0200567 }
Victor Stinner38227602014-08-27 12:59:44 +0200568 else {
Victor Stinner11517102014-07-29 23:31:34 +0200569 is_socket = 1;
Victor Stinner38227602014-08-27 12:59:44 +0200570
571 /* Windows does not provide a function to test if a socket
572 is in non-blocking mode */
573 }
Victor Stinner11517102014-07-29 23:31:34 +0200574 }
575
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100576 old_sockfd = wakeup.fd;
577 wakeup.fd = sockfd;
Victor Stinner11517102014-07-29 23:31:34 +0200578 wakeup.use_send = is_socket;
579
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100580 if (old_sockfd != INVALID_FD)
581 return PyLong_FromSocket_t(old_sockfd);
Victor Stinner11517102014-07-29 23:31:34 +0200582 else
583 return PyLong_FromLong(-1);
584#else
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200585 if (fd != -1) {
Victor Stinner38227602014-08-27 12:59:44 +0200586 int blocking;
587
Victor Stinner1d8948e2014-07-24 22:51:05 +0200588 if (!_PyVerify_fd(fd)) {
589 PyErr_SetString(PyExc_ValueError, "invalid fd");
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200590 return NULL;
591 }
Victor Stinner1d8948e2014-07-24 22:51:05 +0200592
Victor Stinnere134a7f2015-03-30 10:09:31 +0200593 if (_Py_fstat(fd, &status) != 0)
Victor Stinner11517102014-07-29 23:31:34 +0200594 return NULL;
Victor Stinner38227602014-08-27 12:59:44 +0200595
596 blocking = _Py_get_blocking(fd);
597 if (blocking < 0)
598 return NULL;
599 if (blocking) {
600 PyErr_Format(PyExc_ValueError,
601 "the fd %i must be in non-blocking mode",
602 fd);
603 return NULL;
604 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 }
Victor Stinner0bffc942014-07-21 16:28:54 +0200606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 old_fd = wakeup_fd;
608 wakeup_fd = fd;
Victor Stinner0bffc942014-07-21 16:28:54 +0200609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 return PyLong_FromLong(old_fd);
Victor Stinner11517102014-07-29 23:31:34 +0200611#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000612}
613
614PyDoc_STRVAR(set_wakeup_fd_doc,
615"set_wakeup_fd(fd) -> fd\n\
616\n\
Victor Stinner11517102014-07-29 23:31:34 +0200617Sets the fd to be written to (with the signal number) when a signal\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000618comes in. A library can use this to wakeup select or poll.\n\
Victor Stinner11517102014-07-29 23:31:34 +0200619The previous fd or -1 is returned.\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000620\n\
621The fd must be non-blocking.");
622
623/* C API for the same, without all the error checking */
624int
625PySignal_SetWakeupFd(int fd)
626{
Victor Stinner11517102014-07-29 23:31:34 +0200627 int old_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 if (fd < 0)
629 fd = -1;
Victor Stinner11517102014-07-29 23:31:34 +0200630
631#ifdef MS_WINDOWS
632 old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int);
633 wakeup.fd = fd;
634#else
635 old_fd = wakeup_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 wakeup_fd = fd;
Victor Stinner11517102014-07-29 23:31:34 +0200637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 return old_fd;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000639}
640
641
Martin v. Löwis823725e2008-03-24 13:39:54 +0000642#ifdef HAVE_SETITIMER
643static PyObject *
644signal_setitimer(PyObject *self, PyObject *args)
645{
646 double first;
647 double interval = 0;
648 int which;
649 struct itimerval new, old;
650
651 if(!PyArg_ParseTuple(args, "id|d:setitimer", &which, &first, &interval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000653
654 timeval_from_double(first, &new.it_value);
655 timeval_from_double(interval, &new.it_interval);
656 /* Let OS check "which" value */
657 if (setitimer(which, &new, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 PyErr_SetFromErrno(ItimerError);
659 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000660 }
661
662 return itimer_retval(&old);
663}
664
665PyDoc_STRVAR(setitimer_doc,
666"setitimer(which, seconds[, interval])\n\
667\n\
668Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL\n\
669or ITIMER_PROF) to fire after value seconds and after\n\
670that every interval seconds.\n\
671The itimer can be cleared by setting seconds to zero.\n\
672\n\
673Returns old values as a tuple: (delay, interval).");
674#endif
675
676
677#ifdef HAVE_GETITIMER
678static PyObject *
679signal_getitimer(PyObject *self, PyObject *args)
680{
681 int which;
682 struct itimerval old;
683
684 if (!PyArg_ParseTuple(args, "i:getitimer", &which))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000686
687 if (getitimer(which, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 PyErr_SetFromErrno(ItimerError);
689 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000690 }
691
692 return itimer_retval(&old);
693}
694
695PyDoc_STRVAR(getitimer_doc,
696"getitimer(which)\n\
697\n\
698Returns current value of given itimer.");
699#endif
700
Ross Lagerwallbc808222011-06-25 12:13:40 +0200701#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \
702 defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinnera9293352011-04-30 15:21:58 +0200703/* Convert an iterable to a sigset.
704 Return 0 on success, return -1 and raise an exception on error. */
705
706static int
707iterable_to_sigset(PyObject *iterable, sigset_t *mask)
708{
709 int result = -1;
710 PyObject *iterator, *item;
711 long signum;
712 int err;
713
714 sigemptyset(mask);
715
716 iterator = PyObject_GetIter(iterable);
717 if (iterator == NULL)
718 goto error;
719
720 while (1)
721 {
722 item = PyIter_Next(iterator);
723 if (item == NULL) {
724 if (PyErr_Occurred())
725 goto error;
726 else
727 break;
728 }
729
730 signum = PyLong_AsLong(item);
731 Py_DECREF(item);
732 if (signum == -1 && PyErr_Occurred())
733 goto error;
734 if (0 < signum && signum < NSIG)
735 err = sigaddset(mask, (int)signum);
736 else
737 err = 1;
738 if (err) {
739 PyErr_Format(PyExc_ValueError,
740 "signal number %ld out of range", signum);
741 goto error;
742 }
743 }
744 result = 0;
745
746error:
747 Py_XDECREF(iterator);
748 return result;
749}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200750#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200751
Victor Stinnerb3e72192011-05-08 01:46:11 +0200752#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
Victor Stinner35b300c2011-05-04 13:20:35 +0200753static PyObject*
754sigset_to_set(sigset_t mask)
755{
756 PyObject *signum, *result;
757 int sig;
758
759 result = PySet_New(0);
760 if (result == NULL)
761 return NULL;
762
763 for (sig = 1; sig < NSIG; sig++) {
764 if (sigismember(&mask, sig) != 1)
765 continue;
766
767 /* Handle the case where it is a member by adding the signal to
768 the result list. Ignore the other cases because they mean the
769 signal isn't a member of the mask or the signal was invalid,
770 and an invalid signal must have been our fault in constructing
771 the loop boundaries. */
772 signum = PyLong_FromLong(sig);
773 if (signum == NULL) {
774 Py_DECREF(result);
775 return NULL;
776 }
777 if (PySet_Add(result, signum) == -1) {
778 Py_DECREF(signum);
779 Py_DECREF(result);
780 return NULL;
781 }
782 Py_DECREF(signum);
783 }
784 return result;
785}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200786#endif
Victor Stinner35b300c2011-05-04 13:20:35 +0200787
Victor Stinnerb3e72192011-05-08 01:46:11 +0200788#ifdef PYPTHREAD_SIGMASK
Victor Stinnera9293352011-04-30 15:21:58 +0200789static PyObject *
790signal_pthread_sigmask(PyObject *self, PyObject *args)
791{
Victor Stinner35b300c2011-05-04 13:20:35 +0200792 int how;
793 PyObject *signals;
Victor Stinnera9293352011-04-30 15:21:58 +0200794 sigset_t mask, previous;
795 int err;
796
797 if (!PyArg_ParseTuple(args, "iO:pthread_sigmask", &how, &signals))
798 return NULL;
799
800 if (iterable_to_sigset(signals, &mask))
801 return NULL;
802
803 err = pthread_sigmask(how, &mask, &previous);
804 if (err != 0) {
805 errno = err;
Victor Stinnerb3e72192011-05-08 01:46:11 +0200806 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera9293352011-04-30 15:21:58 +0200807 return NULL;
808 }
809
Victor Stinnerd0e516d2011-05-03 14:57:12 +0200810 /* if signals was unblocked, signal handlers have been called */
811 if (PyErr_CheckSignals())
812 return NULL;
813
Victor Stinner35b300c2011-05-04 13:20:35 +0200814 return sigset_to_set(previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200815}
816
817PyDoc_STRVAR(signal_pthread_sigmask_doc,
818"pthread_sigmask(how, mask) -> old mask\n\
819\n\
820Fetch and/or change the signal mask of the calling thread.");
821#endif /* #ifdef PYPTHREAD_SIGMASK */
822
Martin v. Löwis823725e2008-03-24 13:39:54 +0000823
Victor Stinnerb3e72192011-05-08 01:46:11 +0200824#ifdef HAVE_SIGPENDING
825static PyObject *
826signal_sigpending(PyObject *self)
827{
828 int err;
829 sigset_t mask;
830 err = sigpending(&mask);
831 if (err)
832 return PyErr_SetFromErrno(PyExc_OSError);
833 return sigset_to_set(mask);
834}
835
836PyDoc_STRVAR(signal_sigpending_doc,
837"sigpending() -> list\n\
838\n\
839Examine pending signals.");
840#endif /* #ifdef HAVE_SIGPENDING */
841
842
843#ifdef HAVE_SIGWAIT
844static PyObject *
845signal_sigwait(PyObject *self, PyObject *args)
846{
847 PyObject *signals;
848 sigset_t set;
849 int err, signum;
850
851 if (!PyArg_ParseTuple(args, "O:sigwait", &signals))
852 return NULL;
853
854 if (iterable_to_sigset(signals, &set))
855 return NULL;
856
Victor Stinner10c30d62011-06-10 01:39:53 +0200857 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200858 err = sigwait(&set, &signum);
Victor Stinner10c30d62011-06-10 01:39:53 +0200859 Py_END_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200860 if (err) {
861 errno = err;
862 return PyErr_SetFromErrno(PyExc_OSError);
863 }
864
865 return PyLong_FromLong(signum);
866}
867
868PyDoc_STRVAR(signal_sigwait_doc,
869"sigwait(sigset) -> signum\n\
870\n\
871Wait a signal.");
872#endif /* #ifdef HAVE_SIGPENDING */
873
Ross Lagerwallbc808222011-06-25 12:13:40 +0200874#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
875static int initialized;
876static PyStructSequence_Field struct_siginfo_fields[] = {
877 {"si_signo", "signal number"},
878 {"si_code", "signal code"},
879 {"si_errno", "errno associated with this signal"},
880 {"si_pid", "sending process ID"},
881 {"si_uid", "real user ID of sending process"},
882 {"si_status", "exit value or signal"},
883 {"si_band", "band event for SIGPOLL"},
884 {0}
885};
886
887PyDoc_STRVAR(struct_siginfo__doc__,
888"struct_siginfo: Result from sigwaitinfo or sigtimedwait.\n\n\
889This object may be accessed either as a tuple of\n\
890(si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band),\n\
891or via the attributes si_signo, si_code, and so on.");
892
893static PyStructSequence_Desc struct_siginfo_desc = {
894 "signal.struct_siginfo", /* name */
895 struct_siginfo__doc__, /* doc */
896 struct_siginfo_fields, /* fields */
897 7 /* n_in_sequence */
898};
899
900static PyTypeObject SiginfoType;
901
902static PyObject *
903fill_siginfo(siginfo_t *si)
904{
905 PyObject *result = PyStructSequence_New(&SiginfoType);
906 if (!result)
907 return NULL;
908
909 PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo)));
910 PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code)));
911 PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno)));
912 PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid));
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200913 PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid));
Ross Lagerwallbc808222011-06-25 12:13:40 +0200914 PyStructSequence_SET_ITEM(result, 5,
915 PyLong_FromLong((long)(si->si_status)));
916 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
917 if (PyErr_Occurred()) {
918 Py_DECREF(result);
919 return NULL;
920 }
921
922 return result;
923}
924#endif
925
926#ifdef HAVE_SIGWAITINFO
927static PyObject *
928signal_sigwaitinfo(PyObject *self, PyObject *args)
929{
930 PyObject *signals;
931 sigset_t set;
932 siginfo_t si;
933 int err;
Victor Stinnera453cd82015-03-20 12:54:28 +0100934 int async_err = 0;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200935
936 if (!PyArg_ParseTuple(args, "O:sigwaitinfo", &signals))
937 return NULL;
938
939 if (iterable_to_sigset(signals, &set))
940 return NULL;
941
Victor Stinnera453cd82015-03-20 12:54:28 +0100942 do {
943 Py_BEGIN_ALLOW_THREADS
944 err = sigwaitinfo(&set, &si);
945 Py_END_ALLOW_THREADS
946 } while (err == -1
947 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Ross Lagerwallbc808222011-06-25 12:13:40 +0200948 if (err == -1)
Victor Stinnera453cd82015-03-20 12:54:28 +0100949 return (!async_err) ? PyErr_SetFromErrno(PyExc_OSError) : NULL;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200950
951 return fill_siginfo(&si);
952}
953
954PyDoc_STRVAR(signal_sigwaitinfo_doc,
955"sigwaitinfo(sigset) -> struct_siginfo\n\
956\n\
957Wait synchronously for a signal until one of the signals in *sigset* is\n\
958delivered.\n\
959Returns a struct_siginfo containing information about the signal.");
960#endif /* #ifdef HAVE_SIGWAITINFO */
961
962#ifdef HAVE_SIGTIMEDWAIT
963static PyObject *
964signal_sigtimedwait(PyObject *self, PyObject *args)
965{
Victor Stinner34dc0f42015-03-27 18:19:03 +0100966 PyObject *signals, *timeout_obj;
Victor Stinnera453cd82015-03-20 12:54:28 +0100967 struct timespec ts;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200968 sigset_t set;
969 siginfo_t si;
Victor Stinnera453cd82015-03-20 12:54:28 +0100970 int res;
Victor Stinner34dc0f42015-03-27 18:19:03 +0100971 _PyTime_t timeout, deadline, monotonic;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200972
Victor Stinner34dc0f42015-03-27 18:19:03 +0100973 if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
974 &signals, &timeout_obj))
975 return NULL;
976
Victor Stinner869e1772015-03-30 03:49:14 +0200977 if (_PyTime_FromSecondsObject(&timeout,
978 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Ross Lagerwallbc808222011-06-25 12:13:40 +0200979 return NULL;
980
Victor Stinnera453cd82015-03-20 12:54:28 +0100981 if (timeout < 0) {
Ross Lagerwallbc808222011-06-25 12:13:40 +0200982 PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
983 return NULL;
984 }
985
986 if (iterable_to_sigset(signals, &set))
987 return NULL;
988
Victor Stinner34dc0f42015-03-27 18:19:03 +0100989 deadline = _PyTime_GetMonotonicClock() + timeout;
Victor Stinnera453cd82015-03-20 12:54:28 +0100990
991 do {
Victor Stinner34dc0f42015-03-27 18:19:03 +0100992 if (_PyTime_AsTimespec(timeout, &ts) < 0)
993 return NULL;
Victor Stinnera453cd82015-03-20 12:54:28 +0100994
995 Py_BEGIN_ALLOW_THREADS
996 res = sigtimedwait(&set, &si, &ts);
997 Py_END_ALLOW_THREADS
998
999 if (res != -1)
1000 break;
1001
1002 if (errno != EINTR) {
1003 if (errno == EAGAIN)
1004 Py_RETURN_NONE;
1005 else
1006 return PyErr_SetFromErrno(PyExc_OSError);
1007 }
1008
1009 /* sigtimedwait() was interrupted by a signal (EINTR) */
1010 if (PyErr_CheckSignals())
1011 return NULL;
1012
Victor Stinner34dc0f42015-03-27 18:19:03 +01001013 monotonic = _PyTime_GetMonotonicClock();
1014 timeout = deadline - monotonic;
Victor Stinner6aa446c2015-03-30 21:33:51 +02001015 if (timeout < 0)
Victor Stinnera453cd82015-03-20 12:54:28 +01001016 break;
1017 } while (1);
Ross Lagerwallbc808222011-06-25 12:13:40 +02001018
1019 return fill_siginfo(&si);
1020}
1021
1022PyDoc_STRVAR(signal_sigtimedwait_doc,
1023"sigtimedwait(sigset, (timeout_sec, timeout_nsec)) -> struct_siginfo\n\
1024\n\
1025Like sigwaitinfo(), but with a timeout specified as a tuple of (seconds,\n\
1026nanoseconds).");
1027#endif /* #ifdef HAVE_SIGTIMEDWAIT */
1028
Victor Stinnerb3e72192011-05-08 01:46:11 +02001029
1030#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
1031static PyObject *
1032signal_pthread_kill(PyObject *self, PyObject *args)
1033{
1034 long tid;
1035 int signum;
1036 int err;
1037
1038 if (!PyArg_ParseTuple(args, "li:pthread_kill", &tid, &signum))
1039 return NULL;
1040
Victor Stinner86e104a2011-05-09 14:45:38 +02001041 err = pthread_kill((pthread_t)tid, signum);
Victor Stinnerb3e72192011-05-08 01:46:11 +02001042 if (err != 0) {
1043 errno = err;
1044 PyErr_SetFromErrno(PyExc_OSError);
1045 return NULL;
1046 }
1047
1048 /* the signal may have been send to the current thread */
1049 if (PyErr_CheckSignals())
1050 return NULL;
1051
1052 Py_RETURN_NONE;
1053}
1054
1055PyDoc_STRVAR(signal_pthread_kill_doc,
1056"pthread_kill(thread_id, signum)\n\
1057\n\
1058Send a signal to a thread.");
1059#endif /* #if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD) */
1060
1061
1062
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001063/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +00001064static PyMethodDef signal_methods[] = {
Guido van Rossum1171ee61997-08-22 20:42:00 +00001065#ifdef HAVE_ALARM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 {"alarm", signal_alarm, METH_VARARGS, alarm_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +00001067#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001068#ifdef HAVE_SETITIMER
1069 {"setitimer", signal_setitimer, METH_VARARGS, setitimer_doc},
1070#endif
1071#ifdef HAVE_GETITIMER
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 {"getitimer", signal_getitimer, METH_VARARGS, getitimer_doc},
Martin v. Löwis823725e2008-03-24 13:39:54 +00001073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 {"signal", signal_signal, METH_VARARGS, signal_doc},
1075 {"getsignal", signal_getsignal, METH_VARARGS, getsignal_doc},
1076 {"set_wakeup_fd", signal_set_wakeup_fd, METH_VARARGS, set_wakeup_fd_doc},
Christian Heimes8640e742008-02-23 16:23:06 +00001077#ifdef HAVE_SIGINTERRUPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 {"siginterrupt", signal_siginterrupt, METH_VARARGS, siginterrupt_doc},
Christian Heimes8640e742008-02-23 16:23:06 +00001079#endif
Guido van Rossum1171ee61997-08-22 20:42:00 +00001080#ifdef HAVE_PAUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 {"pause", (PyCFunction)signal_pause,
Victor Stinnera9293352011-04-30 15:21:58 +02001082 METH_NOARGS, pause_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +00001083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 {"default_int_handler", signal_default_int_handler,
1085 METH_VARARGS, default_int_handler_doc},
Victor Stinnerb3e72192011-05-08 01:46:11 +02001086#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
1087 {"pthread_kill", (PyCFunction)signal_pthread_kill,
1088 METH_VARARGS, signal_pthread_kill_doc},
1089#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001090#ifdef PYPTHREAD_SIGMASK
1091 {"pthread_sigmask", (PyCFunction)signal_pthread_sigmask,
1092 METH_VARARGS, signal_pthread_sigmask_doc},
1093#endif
Victor Stinnerb3e72192011-05-08 01:46:11 +02001094#ifdef HAVE_SIGPENDING
1095 {"sigpending", (PyCFunction)signal_sigpending,
1096 METH_NOARGS, signal_sigpending_doc},
1097#endif
1098#ifdef HAVE_SIGWAIT
1099 {"sigwait", (PyCFunction)signal_sigwait,
1100 METH_VARARGS, signal_sigwait_doc},
1101#endif
Ross Lagerwallbc808222011-06-25 12:13:40 +02001102#ifdef HAVE_SIGWAITINFO
1103 {"sigwaitinfo", (PyCFunction)signal_sigwaitinfo,
1104 METH_VARARGS, signal_sigwaitinfo_doc},
1105#endif
1106#ifdef HAVE_SIGTIMEDWAIT
1107 {"sigtimedwait", (PyCFunction)signal_sigtimedwait,
1108 METH_VARARGS, signal_sigtimedwait_doc},
1109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001111};
1112
Barry Warsaw92971171997-01-03 00:14:25 +00001113
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001114PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001115"This module provides mechanisms to use signal handlers in Python.\n\
1116\n\
1117Functions:\n\
1118\n\
1119alarm() -- cause SIGALRM after a specified time [Unix only]\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001120setitimer() -- cause a signal (described below) after a specified\n\
1121 float time and the timer may restart then [Unix only]\n\
1122getitimer() -- get current value of timer [Unix only]\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001123signal() -- set the action for a given signal\n\
1124getsignal() -- get the signal action for a given signal\n\
1125pause() -- wait until a signal arrives [Unix only]\n\
1126default_int_handler() -- default SIGINT handler\n\
1127\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001128signal constants:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001129SIG_DFL -- used to refer to the system default handler\n\
1130SIG_IGN -- used to ignore the signal\n\
1131NSIG -- number of defined signals\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001132SIGINT, SIGTERM, etc. -- signal numbers\n\
1133\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001134itimer constants:\n\
1135ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
1136 expiration\n\
1137ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
1138 and delivers SIGVTALRM upon expiration\n\
1139ITIMER_PROF -- decrements both when the process is executing and\n\
1140 when the system is executing on behalf of the process.\n\
1141 Coupled with ITIMER_VIRTUAL, this timer is usually\n\
1142 used to profile the time spent by the application\n\
1143 in user and kernel space. SIGPROF is delivered upon\n\
1144 expiration.\n\
1145\n\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001146*** IMPORTANT NOTICE ***\n\
1147A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001148the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001149
Martin v. Löwis1a214512008-06-11 05:26:20 +00001150static struct PyModuleDef signalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 PyModuleDef_HEAD_INIT,
Brett Cannon815a6f32014-04-04 10:20:28 -04001152 "_signal",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 module_doc,
1154 -1,
1155 signal_methods,
1156 NULL,
1157 NULL,
1158 NULL,
1159 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001160};
1161
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001162PyMODINIT_FUNC
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001163PyInit__signal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 PyObject *m, *d, *x;
1166 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001167
1168#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 main_thread = PyThread_get_thread_ident();
1170 main_pid = getpid();
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001171#endif
1172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 /* Create the module and add the functions */
1174 m = PyModule_Create(&signalmodule);
1175 if (m == NULL)
1176 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001177
Ross Lagerwallbc808222011-06-25 12:13:40 +02001178#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinner1c8f0592013-07-22 22:24:54 +02001179 if (!initialized) {
1180 if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0)
1181 return NULL;
1182 }
Ross Lagerwallbc808222011-06-25 12:13:40 +02001183 Py_INCREF((PyObject*) &SiginfoType);
1184 PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
1185 initialized = 1;
1186#endif
1187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 /* Add some symbolic constants to the module */
1189 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
1192 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
1193 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
1196 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
1197 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 x = PyLong_FromLong((long)NSIG);
1200 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
1201 goto finally;
1202 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +00001203
Victor Stinnera9293352011-04-30 15:21:58 +02001204#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001205 if (PyModule_AddIntMacro(m, SIG_BLOCK))
1206 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001207#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001208#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001209 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
1210 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001211#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001212#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +02001213 if (PyModule_AddIntMacro(m, SIG_SETMASK))
1214 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001215#endif
1216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
1218 if (!x)
1219 goto finally;
1220 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +00001221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 Handlers[0].tripped = 0;
1223 for (i = 1; i < NSIG; i++) {
1224 void (*t)(int);
1225 t = PyOS_getsig(i);
1226 Handlers[i].tripped = 0;
1227 if (t == SIG_DFL)
1228 Handlers[i].func = DefaultHandler;
1229 else if (t == SIG_IGN)
1230 Handlers[i].func = IgnoreHandler;
1231 else
1232 Handlers[i].func = Py_None; /* None of our business */
1233 Py_INCREF(Handlers[i].func);
1234 }
1235 if (Handlers[SIGINT].func == DefaultHandler) {
1236 /* Install default int handler */
1237 Py_INCREF(IntHandler);
1238 Py_DECREF(Handlers[SIGINT].func);
1239 Handlers[SIGINT].func = IntHandler;
1240 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
1241 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001242
1243#ifdef SIGHUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 x = PyLong_FromLong(SIGHUP);
1245 PyDict_SetItemString(d, "SIGHUP", x);
1246 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001247#endif
1248#ifdef SIGINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 x = PyLong_FromLong(SIGINT);
1250 PyDict_SetItemString(d, "SIGINT", x);
1251 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001252#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +00001253#ifdef SIGBREAK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 x = PyLong_FromLong(SIGBREAK);
1255 PyDict_SetItemString(d, "SIGBREAK", x);
1256 Py_XDECREF(x);
Tim Peters1ce3cf72001-10-01 17:58:40 +00001257#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001258#ifdef SIGQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 x = PyLong_FromLong(SIGQUIT);
1260 PyDict_SetItemString(d, "SIGQUIT", x);
1261 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001262#endif
1263#ifdef SIGILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 x = PyLong_FromLong(SIGILL);
1265 PyDict_SetItemString(d, "SIGILL", x);
1266 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001267#endif
1268#ifdef SIGTRAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 x = PyLong_FromLong(SIGTRAP);
1270 PyDict_SetItemString(d, "SIGTRAP", x);
1271 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001272#endif
1273#ifdef SIGIOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 x = PyLong_FromLong(SIGIOT);
1275 PyDict_SetItemString(d, "SIGIOT", x);
1276 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001277#endif
1278#ifdef SIGABRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 x = PyLong_FromLong(SIGABRT);
1280 PyDict_SetItemString(d, "SIGABRT", x);
1281 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001282#endif
1283#ifdef SIGEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 x = PyLong_FromLong(SIGEMT);
1285 PyDict_SetItemString(d, "SIGEMT", x);
1286 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001287#endif
1288#ifdef SIGFPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 x = PyLong_FromLong(SIGFPE);
1290 PyDict_SetItemString(d, "SIGFPE", x);
1291 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001292#endif
1293#ifdef SIGKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 x = PyLong_FromLong(SIGKILL);
1295 PyDict_SetItemString(d, "SIGKILL", x);
1296 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001297#endif
1298#ifdef SIGBUS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 x = PyLong_FromLong(SIGBUS);
1300 PyDict_SetItemString(d, "SIGBUS", x);
1301 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001302#endif
1303#ifdef SIGSEGV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 x = PyLong_FromLong(SIGSEGV);
1305 PyDict_SetItemString(d, "SIGSEGV", x);
1306 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001307#endif
1308#ifdef SIGSYS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 x = PyLong_FromLong(SIGSYS);
1310 PyDict_SetItemString(d, "SIGSYS", x);
1311 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001312#endif
1313#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 x = PyLong_FromLong(SIGPIPE);
1315 PyDict_SetItemString(d, "SIGPIPE", x);
1316 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001317#endif
1318#ifdef SIGALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 x = PyLong_FromLong(SIGALRM);
1320 PyDict_SetItemString(d, "SIGALRM", x);
1321 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001322#endif
1323#ifdef SIGTERM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 x = PyLong_FromLong(SIGTERM);
1325 PyDict_SetItemString(d, "SIGTERM", x);
1326 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001327#endif
1328#ifdef SIGUSR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 x = PyLong_FromLong(SIGUSR1);
1330 PyDict_SetItemString(d, "SIGUSR1", x);
1331 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001332#endif
1333#ifdef SIGUSR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 x = PyLong_FromLong(SIGUSR2);
1335 PyDict_SetItemString(d, "SIGUSR2", x);
1336 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001337#endif
1338#ifdef SIGCLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 x = PyLong_FromLong(SIGCLD);
1340 PyDict_SetItemString(d, "SIGCLD", x);
1341 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001342#endif
1343#ifdef SIGCHLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 x = PyLong_FromLong(SIGCHLD);
1345 PyDict_SetItemString(d, "SIGCHLD", x);
1346 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001347#endif
1348#ifdef SIGPWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 x = PyLong_FromLong(SIGPWR);
1350 PyDict_SetItemString(d, "SIGPWR", x);
1351 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001352#endif
1353#ifdef SIGIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 x = PyLong_FromLong(SIGIO);
1355 PyDict_SetItemString(d, "SIGIO", x);
1356 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001357#endif
1358#ifdef SIGURG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 x = PyLong_FromLong(SIGURG);
1360 PyDict_SetItemString(d, "SIGURG", x);
1361 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001362#endif
1363#ifdef SIGWINCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 x = PyLong_FromLong(SIGWINCH);
1365 PyDict_SetItemString(d, "SIGWINCH", x);
1366 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001367#endif
1368#ifdef SIGPOLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 x = PyLong_FromLong(SIGPOLL);
1370 PyDict_SetItemString(d, "SIGPOLL", x);
1371 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001372#endif
1373#ifdef SIGSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 x = PyLong_FromLong(SIGSTOP);
1375 PyDict_SetItemString(d, "SIGSTOP", x);
1376 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001377#endif
1378#ifdef SIGTSTP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 x = PyLong_FromLong(SIGTSTP);
1380 PyDict_SetItemString(d, "SIGTSTP", x);
1381 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001382#endif
1383#ifdef SIGCONT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 x = PyLong_FromLong(SIGCONT);
1385 PyDict_SetItemString(d, "SIGCONT", x);
1386 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001387#endif
1388#ifdef SIGTTIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 x = PyLong_FromLong(SIGTTIN);
1390 PyDict_SetItemString(d, "SIGTTIN", x);
1391 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001392#endif
1393#ifdef SIGTTOU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 x = PyLong_FromLong(SIGTTOU);
1395 PyDict_SetItemString(d, "SIGTTOU", x);
1396 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001397#endif
1398#ifdef SIGVTALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 x = PyLong_FromLong(SIGVTALRM);
1400 PyDict_SetItemString(d, "SIGVTALRM", x);
1401 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001402#endif
1403#ifdef SIGPROF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 x = PyLong_FromLong(SIGPROF);
1405 PyDict_SetItemString(d, "SIGPROF", x);
1406 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001407#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001408#ifdef SIGXCPU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 x = PyLong_FromLong(SIGXCPU);
1410 PyDict_SetItemString(d, "SIGXCPU", x);
1411 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001412#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001413#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 x = PyLong_FromLong(SIGXFSZ);
1415 PyDict_SetItemString(d, "SIGXFSZ", x);
1416 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001417#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001418#ifdef SIGRTMIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 x = PyLong_FromLong(SIGRTMIN);
1420 PyDict_SetItemString(d, "SIGRTMIN", x);
1421 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001422#endif
1423#ifdef SIGRTMAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 x = PyLong_FromLong(SIGRTMAX);
1425 PyDict_SetItemString(d, "SIGRTMAX", x);
1426 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001427#endif
Martin v. Löwis175af252002-01-12 11:43:25 +00001428#ifdef SIGINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 x = PyLong_FromLong(SIGINFO);
1430 PyDict_SetItemString(d, "SIGINFO", x);
1431 Py_XDECREF(x);
Martin v. Löwis175af252002-01-12 11:43:25 +00001432#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001433
1434#ifdef ITIMER_REAL
1435 x = PyLong_FromLong(ITIMER_REAL);
1436 PyDict_SetItemString(d, "ITIMER_REAL", x);
1437 Py_DECREF(x);
1438#endif
1439#ifdef ITIMER_VIRTUAL
1440 x = PyLong_FromLong(ITIMER_VIRTUAL);
1441 PyDict_SetItemString(d, "ITIMER_VIRTUAL", x);
1442 Py_DECREF(x);
1443#endif
1444#ifdef ITIMER_PROF
1445 x = PyLong_FromLong(ITIMER_PROF);
1446 PyDict_SetItemString(d, "ITIMER_PROF", x);
1447 Py_DECREF(x);
1448#endif
1449
1450#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 ItimerError = PyErr_NewException("signal.ItimerError",
1452 PyExc_IOError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +00001453 if (ItimerError != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +00001455#endif
1456
Brian Curtineb24d742010-04-12 17:16:38 +00001457#ifdef CTRL_C_EVENT
1458 x = PyLong_FromLong(CTRL_C_EVENT);
1459 PyDict_SetItemString(d, "CTRL_C_EVENT", x);
1460 Py_DECREF(x);
1461#endif
1462
1463#ifdef CTRL_BREAK_EVENT
1464 x = PyLong_FromLong(CTRL_BREAK_EVENT);
1465 PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x);
1466 Py_DECREF(x);
1467#endif
1468
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001469#ifdef MS_WINDOWS
1470 /* Create manual-reset event, initially unset */
1471 sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
1472#endif
1473
Martin v. Löwis1a214512008-06-11 05:26:20 +00001474 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 Py_DECREF(m);
1476 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001477 }
Barry Warsaw92971171997-01-03 00:14:25 +00001478
Barry Warsaw92971171997-01-03 00:14:25 +00001479 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001480 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +00001481}
1482
1483static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001484finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001485{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 int i;
1487 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 PyOS_setsig(SIGINT, old_siginthandler);
1490 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 for (i = 1; i < NSIG; i++) {
1493 func = Handlers[i].func;
1494 Handlers[i].tripped = 0;
1495 Handlers[i].func = NULL;
1496 if (i != SIGINT && func != NULL && func != Py_None &&
1497 func != DefaultHandler && func != IgnoreHandler)
1498 PyOS_setsig(i, SIG_DFL);
1499 Py_XDECREF(func);
1500 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001501
Serhiy Storchaka505ff752014-02-09 13:33:53 +02001502 Py_CLEAR(IntHandler);
1503 Py_CLEAR(DefaultHandler);
1504 Py_CLEAR(IgnoreHandler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001505}
1506
Barry Warsaw92971171997-01-03 00:14:25 +00001507
Barry Warsaw92971171997-01-03 00:14:25 +00001508/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001509int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001510PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 int i;
1513 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 if (!is_tripped)
1516 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001517
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001518#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 if (PyThread_get_thread_ident() != main_thread)
1520 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001521#endif
Christian Heimesb76922a2007-12-11 01:06:40 +00001522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 /*
1524 * The is_tripped variable is meant to speed up the calls to
1525 * PyErr_CheckSignals (both directly or via pending calls) when no
1526 * signal has arrived. This variable is set to 1 when a signal arrives
1527 * and it is set to 0 here, when we know some signals arrived. This way
1528 * we can run the registered handlers with no signals blocked.
1529 *
1530 * NOTE: with this approach we can have a situation where is_tripped is
1531 * 1 but we have no more signals to handle (Handlers[i].tripped
1532 * is 0 for every signal i). This won't do us any harm (except
1533 * we're gonna spent some cycles for nothing). This happens when
1534 * we receive a signal i after we zero is_tripped and before we
1535 * check Handlers[i].tripped.
1536 */
1537 is_tripped = 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 if (!(f = (PyObject *)PyEval_GetFrame()))
1540 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 for (i = 1; i < NSIG; i++) {
1543 if (Handlers[i].tripped) {
1544 PyObject *result = NULL;
1545 PyObject *arglist = Py_BuildValue("(iO)", i, f);
1546 Handlers[i].tripped = 0;
Barry Warsaw92971171997-01-03 00:14:25 +00001547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 if (arglist) {
1549 result = PyEval_CallObject(Handlers[i].func,
1550 arglist);
1551 Py_DECREF(arglist);
1552 }
1553 if (!result)
1554 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +00001555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 Py_DECREF(result);
1557 }
1558 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001561}
1562
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001563
Barry Warsaw92971171997-01-03 00:14:25 +00001564/* Replacements for intrcheck.c functionality
1565 * Declared in pyerrors.h
1566 */
1567void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001568PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001569{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001570 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001571}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001572
1573void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001574PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001575{
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001576 PyObject *m = PyImport_ImportModule("_signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 if (m) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 Py_DECREF(m);
1579 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001580}
1581
1582void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001583PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001584{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001586}
1587
1588int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001589PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001592#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 if (PyThread_get_thread_ident() != main_thread)
1594 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001595#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 Handlers[SIGINT].tripped = 0;
1597 return 1;
1598 }
1599 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001600}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001601
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001602static void
1603_clear_pending_signals(void)
1604{
1605 int i;
1606 if (!is_tripped)
1607 return;
1608 is_tripped = 0;
1609 for (i = 1; i < NSIG; ++i) {
1610 Handlers[i].tripped = 0;
1611 }
1612}
1613
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001614void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001615PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001616{
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001617 /* Clear the signal flags after forking so that they aren't handled
1618 * in both processes if they came in just before the fork() but before
1619 * the interpreter had an opportunity to call the handlers. issue9535. */
1620 _clear_pending_signals();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001621#ifdef WITH_THREAD
Charles-François Natali6d0d24e2012-02-02 20:31:42 +01001622 /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API
1623 * can be called safely. */
1624 PyThread_ReInitTLS();
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001625 _PyGILState_Reinit();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 PyEval_ReInitThreads();
1627 main_thread = PyThread_get_thread_ident();
1628 main_pid = getpid();
1629 _PyImport_ReInitLock();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001630#endif
1631}
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001632
1633int
1634_PyOS_IsMainThread(void)
1635{
1636#ifdef WITH_THREAD
1637 return PyThread_get_thread_ident() == main_thread;
1638#else
1639 return 1;
1640#endif
1641}
1642
1643#ifdef MS_WINDOWS
1644void *_PyOS_SigintEvent(void)
1645{
1646 /* Returns a manual-reset event which gets tripped whenever
1647 SIGINT is received.
1648
1649 Python.h does not include windows.h so we do cannot use HANDLE
1650 as the return type of this function. We use void* instead. */
1651 return sigint_event;
1652}
1653#endif