blob: 38c5d21cba13cb87ca32340a98587925a85039ae [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
307 * Python/pythonrun.c for the implementation of PyOS_setsig which
308 * 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 Stinner11517102014-07-29 23:31:34 +0200506#ifdef MS_WINDOWS
507 PyObject *fdobj;
508 SOCKET_T fd, old_fd;
509 int res;
510 int res_size = sizeof res;
511 PyObject *mod;
512 struct stat st;
513 int is_socket;
514
515 if (!PyArg_ParseTuple(args, "O:set_wakeup_fd", &fdobj))
516 return NULL;
517
518 fd = PyLong_AsSocket_t(fdobj);
519 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
520 return NULL;
521#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 int fd, old_fd;
Victor Stinner11517102014-07-29 23:31:34 +0200523 struct stat st;
524
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;
539 if (fd != INVALID_FD) {
540 /* 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 */
547 if (getsockopt(fd, SOL_SOCKET, SO_ERROR,
548 (char *)&res, &res_size) != 0) {
549 int err = WSAGetLastError();
550 if (err != WSAENOTSOCK) {
551 PyErr_SetExcFromWindowsErr(PyExc_OSError, err);
552 return NULL;
553 }
554
555 if (!_PyVerify_fd(fd)) {
556 PyErr_SetString(PyExc_ValueError, "invalid fd");
557 return NULL;
558 }
559
560 if (fstat(fd, &st) != 0) {
561 PyErr_SetFromErrno(PyExc_OSError);
562 return NULL;
563 }
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
575 old_fd = wakeup.fd;
576 wakeup.fd = fd;
577 wakeup.use_send = is_socket;
578
579 if (old_fd != INVALID_FD)
580 return PyLong_FromSocket_t(old_fd);
581 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 Stinner11517102014-07-29 23:31:34 +0200592 if (fstat(fd, &st) != 0) {
593 PyErr_SetFromErrno(PyExc_OSError);
594 return NULL;
595 }
Victor Stinner38227602014-08-27 12:59:44 +0200596
597 blocking = _Py_get_blocking(fd);
598 if (blocking < 0)
599 return NULL;
600 if (blocking) {
601 PyErr_Format(PyExc_ValueError,
602 "the fd %i must be in non-blocking mode",
603 fd);
604 return NULL;
605 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 }
Victor Stinner0bffc942014-07-21 16:28:54 +0200607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 old_fd = wakeup_fd;
609 wakeup_fd = fd;
Victor Stinner0bffc942014-07-21 16:28:54 +0200610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 return PyLong_FromLong(old_fd);
Victor Stinner11517102014-07-29 23:31:34 +0200612#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000613}
614
615PyDoc_STRVAR(set_wakeup_fd_doc,
616"set_wakeup_fd(fd) -> fd\n\
617\n\
Victor Stinner11517102014-07-29 23:31:34 +0200618Sets the fd to be written to (with the signal number) when a signal\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000619comes in. A library can use this to wakeup select or poll.\n\
Victor Stinner11517102014-07-29 23:31:34 +0200620The previous fd or -1 is returned.\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000621\n\
622The fd must be non-blocking.");
623
624/* C API for the same, without all the error checking */
625int
626PySignal_SetWakeupFd(int fd)
627{
Victor Stinner11517102014-07-29 23:31:34 +0200628 int old_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 if (fd < 0)
630 fd = -1;
Victor Stinner11517102014-07-29 23:31:34 +0200631
632#ifdef MS_WINDOWS
633 old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int);
634 wakeup.fd = fd;
635#else
636 old_fd = wakeup_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 wakeup_fd = fd;
Victor Stinner11517102014-07-29 23:31:34 +0200638#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 return old_fd;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000640}
641
642
Martin v. Löwis823725e2008-03-24 13:39:54 +0000643#ifdef HAVE_SETITIMER
644static PyObject *
645signal_setitimer(PyObject *self, PyObject *args)
646{
647 double first;
648 double interval = 0;
649 int which;
650 struct itimerval new, old;
651
652 if(!PyArg_ParseTuple(args, "id|d:setitimer", &which, &first, &interval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000654
655 timeval_from_double(first, &new.it_value);
656 timeval_from_double(interval, &new.it_interval);
657 /* Let OS check "which" value */
658 if (setitimer(which, &new, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 PyErr_SetFromErrno(ItimerError);
660 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000661 }
662
663 return itimer_retval(&old);
664}
665
666PyDoc_STRVAR(setitimer_doc,
667"setitimer(which, seconds[, interval])\n\
668\n\
669Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL\n\
670or ITIMER_PROF) to fire after value seconds and after\n\
671that every interval seconds.\n\
672The itimer can be cleared by setting seconds to zero.\n\
673\n\
674Returns old values as a tuple: (delay, interval).");
675#endif
676
677
678#ifdef HAVE_GETITIMER
679static PyObject *
680signal_getitimer(PyObject *self, PyObject *args)
681{
682 int which;
683 struct itimerval old;
684
685 if (!PyArg_ParseTuple(args, "i:getitimer", &which))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000687
688 if (getitimer(which, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 PyErr_SetFromErrno(ItimerError);
690 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000691 }
692
693 return itimer_retval(&old);
694}
695
696PyDoc_STRVAR(getitimer_doc,
697"getitimer(which)\n\
698\n\
699Returns current value of given itimer.");
700#endif
701
Ross Lagerwallbc808222011-06-25 12:13:40 +0200702#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \
703 defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinnera9293352011-04-30 15:21:58 +0200704/* Convert an iterable to a sigset.
705 Return 0 on success, return -1 and raise an exception on error. */
706
707static int
708iterable_to_sigset(PyObject *iterable, sigset_t *mask)
709{
710 int result = -1;
711 PyObject *iterator, *item;
712 long signum;
713 int err;
714
715 sigemptyset(mask);
716
717 iterator = PyObject_GetIter(iterable);
718 if (iterator == NULL)
719 goto error;
720
721 while (1)
722 {
723 item = PyIter_Next(iterator);
724 if (item == NULL) {
725 if (PyErr_Occurred())
726 goto error;
727 else
728 break;
729 }
730
731 signum = PyLong_AsLong(item);
732 Py_DECREF(item);
733 if (signum == -1 && PyErr_Occurred())
734 goto error;
735 if (0 < signum && signum < NSIG)
736 err = sigaddset(mask, (int)signum);
737 else
738 err = 1;
739 if (err) {
740 PyErr_Format(PyExc_ValueError,
741 "signal number %ld out of range", signum);
742 goto error;
743 }
744 }
745 result = 0;
746
747error:
748 Py_XDECREF(iterator);
749 return result;
750}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200751#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200752
Victor Stinnerb3e72192011-05-08 01:46:11 +0200753#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
Victor Stinner35b300c2011-05-04 13:20:35 +0200754static PyObject*
755sigset_to_set(sigset_t mask)
756{
757 PyObject *signum, *result;
758 int sig;
759
760 result = PySet_New(0);
761 if (result == NULL)
762 return NULL;
763
764 for (sig = 1; sig < NSIG; sig++) {
765 if (sigismember(&mask, sig) != 1)
766 continue;
767
768 /* Handle the case where it is a member by adding the signal to
769 the result list. Ignore the other cases because they mean the
770 signal isn't a member of the mask or the signal was invalid,
771 and an invalid signal must have been our fault in constructing
772 the loop boundaries. */
773 signum = PyLong_FromLong(sig);
774 if (signum == NULL) {
775 Py_DECREF(result);
776 return NULL;
777 }
778 if (PySet_Add(result, signum) == -1) {
779 Py_DECREF(signum);
780 Py_DECREF(result);
781 return NULL;
782 }
783 Py_DECREF(signum);
784 }
785 return result;
786}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200787#endif
Victor Stinner35b300c2011-05-04 13:20:35 +0200788
Victor Stinnerb3e72192011-05-08 01:46:11 +0200789#ifdef PYPTHREAD_SIGMASK
Victor Stinnera9293352011-04-30 15:21:58 +0200790static PyObject *
791signal_pthread_sigmask(PyObject *self, PyObject *args)
792{
Victor Stinner35b300c2011-05-04 13:20:35 +0200793 int how;
794 PyObject *signals;
Victor Stinnera9293352011-04-30 15:21:58 +0200795 sigset_t mask, previous;
796 int err;
797
798 if (!PyArg_ParseTuple(args, "iO:pthread_sigmask", &how, &signals))
799 return NULL;
800
801 if (iterable_to_sigset(signals, &mask))
802 return NULL;
803
804 err = pthread_sigmask(how, &mask, &previous);
805 if (err != 0) {
806 errno = err;
Victor Stinnerb3e72192011-05-08 01:46:11 +0200807 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera9293352011-04-30 15:21:58 +0200808 return NULL;
809 }
810
Victor Stinnerd0e516d2011-05-03 14:57:12 +0200811 /* if signals was unblocked, signal handlers have been called */
812 if (PyErr_CheckSignals())
813 return NULL;
814
Victor Stinner35b300c2011-05-04 13:20:35 +0200815 return sigset_to_set(previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200816}
817
818PyDoc_STRVAR(signal_pthread_sigmask_doc,
819"pthread_sigmask(how, mask) -> old mask\n\
820\n\
821Fetch and/or change the signal mask of the calling thread.");
822#endif /* #ifdef PYPTHREAD_SIGMASK */
823
Martin v. Löwis823725e2008-03-24 13:39:54 +0000824
Victor Stinnerb3e72192011-05-08 01:46:11 +0200825#ifdef HAVE_SIGPENDING
826static PyObject *
827signal_sigpending(PyObject *self)
828{
829 int err;
830 sigset_t mask;
831 err = sigpending(&mask);
832 if (err)
833 return PyErr_SetFromErrno(PyExc_OSError);
834 return sigset_to_set(mask);
835}
836
837PyDoc_STRVAR(signal_sigpending_doc,
838"sigpending() -> list\n\
839\n\
840Examine pending signals.");
841#endif /* #ifdef HAVE_SIGPENDING */
842
843
844#ifdef HAVE_SIGWAIT
845static PyObject *
846signal_sigwait(PyObject *self, PyObject *args)
847{
848 PyObject *signals;
849 sigset_t set;
850 int err, signum;
851
852 if (!PyArg_ParseTuple(args, "O:sigwait", &signals))
853 return NULL;
854
855 if (iterable_to_sigset(signals, &set))
856 return NULL;
857
Victor Stinner10c30d62011-06-10 01:39:53 +0200858 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200859 err = sigwait(&set, &signum);
Victor Stinner10c30d62011-06-10 01:39:53 +0200860 Py_END_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200861 if (err) {
862 errno = err;
863 return PyErr_SetFromErrno(PyExc_OSError);
864 }
865
866 return PyLong_FromLong(signum);
867}
868
869PyDoc_STRVAR(signal_sigwait_doc,
870"sigwait(sigset) -> signum\n\
871\n\
872Wait a signal.");
873#endif /* #ifdef HAVE_SIGPENDING */
874
Ross Lagerwallbc808222011-06-25 12:13:40 +0200875#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
876static int initialized;
877static PyStructSequence_Field struct_siginfo_fields[] = {
878 {"si_signo", "signal number"},
879 {"si_code", "signal code"},
880 {"si_errno", "errno associated with this signal"},
881 {"si_pid", "sending process ID"},
882 {"si_uid", "real user ID of sending process"},
883 {"si_status", "exit value or signal"},
884 {"si_band", "band event for SIGPOLL"},
885 {0}
886};
887
888PyDoc_STRVAR(struct_siginfo__doc__,
889"struct_siginfo: Result from sigwaitinfo or sigtimedwait.\n\n\
890This object may be accessed either as a tuple of\n\
891(si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band),\n\
892or via the attributes si_signo, si_code, and so on.");
893
894static PyStructSequence_Desc struct_siginfo_desc = {
895 "signal.struct_siginfo", /* name */
896 struct_siginfo__doc__, /* doc */
897 struct_siginfo_fields, /* fields */
898 7 /* n_in_sequence */
899};
900
901static PyTypeObject SiginfoType;
902
903static PyObject *
904fill_siginfo(siginfo_t *si)
905{
906 PyObject *result = PyStructSequence_New(&SiginfoType);
907 if (!result)
908 return NULL;
909
910 PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo)));
911 PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code)));
912 PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno)));
913 PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid));
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200914 PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid));
Ross Lagerwallbc808222011-06-25 12:13:40 +0200915 PyStructSequence_SET_ITEM(result, 5,
916 PyLong_FromLong((long)(si->si_status)));
917 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
918 if (PyErr_Occurred()) {
919 Py_DECREF(result);
920 return NULL;
921 }
922
923 return result;
924}
925#endif
926
927#ifdef HAVE_SIGWAITINFO
928static PyObject *
929signal_sigwaitinfo(PyObject *self, PyObject *args)
930{
931 PyObject *signals;
932 sigset_t set;
933 siginfo_t si;
934 int err;
935
936 if (!PyArg_ParseTuple(args, "O:sigwaitinfo", &signals))
937 return NULL;
938
939 if (iterable_to_sigset(signals, &set))
940 return NULL;
941
942 Py_BEGIN_ALLOW_THREADS
943 err = sigwaitinfo(&set, &si);
944 Py_END_ALLOW_THREADS
945 if (err == -1)
946 return PyErr_SetFromErrno(PyExc_OSError);
947
948 return fill_siginfo(&si);
949}
950
951PyDoc_STRVAR(signal_sigwaitinfo_doc,
952"sigwaitinfo(sigset) -> struct_siginfo\n\
953\n\
954Wait synchronously for a signal until one of the signals in *sigset* is\n\
955delivered.\n\
956Returns a struct_siginfo containing information about the signal.");
957#endif /* #ifdef HAVE_SIGWAITINFO */
958
959#ifdef HAVE_SIGTIMEDWAIT
960static PyObject *
961signal_sigtimedwait(PyObject *self, PyObject *args)
962{
963 PyObject *signals, *timeout;
964 struct timespec buf;
965 sigset_t set;
966 siginfo_t si;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200967 time_t tv_sec;
968 long tv_nsec;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200969 int err;
970
Victor Stinner643cd682012-03-02 22:54:03 +0100971 if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
972 &signals, &timeout))
Ross Lagerwallbc808222011-06-25 12:13:40 +0200973 return NULL;
974
Victor Stinner3c1b3792014-02-17 00:02:43 +0100975 if (_PyTime_ObjectToTimespec(timeout, &tv_sec, &tv_nsec,
976 _PyTime_ROUND_DOWN) == -1)
Ross Lagerwallbc808222011-06-25 12:13:40 +0200977 return NULL;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200978 buf.tv_sec = tv_sec;
979 buf.tv_nsec = tv_nsec;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200980
981 if (buf.tv_sec < 0 || buf.tv_nsec < 0) {
982 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
989 Py_BEGIN_ALLOW_THREADS
990 err = sigtimedwait(&set, &si, &buf);
991 Py_END_ALLOW_THREADS
992 if (err == -1) {
993 if (errno == EAGAIN)
994 Py_RETURN_NONE;
995 else
996 return PyErr_SetFromErrno(PyExc_OSError);
997 }
998
999 return fill_siginfo(&si);
1000}
1001
1002PyDoc_STRVAR(signal_sigtimedwait_doc,
1003"sigtimedwait(sigset, (timeout_sec, timeout_nsec)) -> struct_siginfo\n\
1004\n\
1005Like sigwaitinfo(), but with a timeout specified as a tuple of (seconds,\n\
1006nanoseconds).");
1007#endif /* #ifdef HAVE_SIGTIMEDWAIT */
1008
Victor Stinnerb3e72192011-05-08 01:46:11 +02001009
1010#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
1011static PyObject *
1012signal_pthread_kill(PyObject *self, PyObject *args)
1013{
1014 long tid;
1015 int signum;
1016 int err;
1017
1018 if (!PyArg_ParseTuple(args, "li:pthread_kill", &tid, &signum))
1019 return NULL;
1020
Victor Stinner86e104a2011-05-09 14:45:38 +02001021 err = pthread_kill((pthread_t)tid, signum);
Victor Stinnerb3e72192011-05-08 01:46:11 +02001022 if (err != 0) {
1023 errno = err;
1024 PyErr_SetFromErrno(PyExc_OSError);
1025 return NULL;
1026 }
1027
1028 /* the signal may have been send to the current thread */
1029 if (PyErr_CheckSignals())
1030 return NULL;
1031
1032 Py_RETURN_NONE;
1033}
1034
1035PyDoc_STRVAR(signal_pthread_kill_doc,
1036"pthread_kill(thread_id, signum)\n\
1037\n\
1038Send a signal to a thread.");
1039#endif /* #if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD) */
1040
1041
1042
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001043/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +00001044static PyMethodDef signal_methods[] = {
Guido van Rossum1171ee61997-08-22 20:42:00 +00001045#ifdef HAVE_ALARM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 {"alarm", signal_alarm, METH_VARARGS, alarm_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +00001047#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001048#ifdef HAVE_SETITIMER
1049 {"setitimer", signal_setitimer, METH_VARARGS, setitimer_doc},
1050#endif
1051#ifdef HAVE_GETITIMER
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 {"getitimer", signal_getitimer, METH_VARARGS, getitimer_doc},
Martin v. Löwis823725e2008-03-24 13:39:54 +00001053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 {"signal", signal_signal, METH_VARARGS, signal_doc},
1055 {"getsignal", signal_getsignal, METH_VARARGS, getsignal_doc},
1056 {"set_wakeup_fd", signal_set_wakeup_fd, METH_VARARGS, set_wakeup_fd_doc},
Christian Heimes8640e742008-02-23 16:23:06 +00001057#ifdef HAVE_SIGINTERRUPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 {"siginterrupt", signal_siginterrupt, METH_VARARGS, siginterrupt_doc},
Christian Heimes8640e742008-02-23 16:23:06 +00001059#endif
Guido van Rossum1171ee61997-08-22 20:42:00 +00001060#ifdef HAVE_PAUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 {"pause", (PyCFunction)signal_pause,
Victor Stinnera9293352011-04-30 15:21:58 +02001062 METH_NOARGS, pause_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +00001063#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 {"default_int_handler", signal_default_int_handler,
1065 METH_VARARGS, default_int_handler_doc},
Victor Stinnerb3e72192011-05-08 01:46:11 +02001066#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
1067 {"pthread_kill", (PyCFunction)signal_pthread_kill,
1068 METH_VARARGS, signal_pthread_kill_doc},
1069#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001070#ifdef PYPTHREAD_SIGMASK
1071 {"pthread_sigmask", (PyCFunction)signal_pthread_sigmask,
1072 METH_VARARGS, signal_pthread_sigmask_doc},
1073#endif
Victor Stinnerb3e72192011-05-08 01:46:11 +02001074#ifdef HAVE_SIGPENDING
1075 {"sigpending", (PyCFunction)signal_sigpending,
1076 METH_NOARGS, signal_sigpending_doc},
1077#endif
1078#ifdef HAVE_SIGWAIT
1079 {"sigwait", (PyCFunction)signal_sigwait,
1080 METH_VARARGS, signal_sigwait_doc},
1081#endif
Ross Lagerwallbc808222011-06-25 12:13:40 +02001082#ifdef HAVE_SIGWAITINFO
1083 {"sigwaitinfo", (PyCFunction)signal_sigwaitinfo,
1084 METH_VARARGS, signal_sigwaitinfo_doc},
1085#endif
1086#ifdef HAVE_SIGTIMEDWAIT
1087 {"sigtimedwait", (PyCFunction)signal_sigtimedwait,
1088 METH_VARARGS, signal_sigtimedwait_doc},
1089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001091};
1092
Barry Warsaw92971171997-01-03 00:14:25 +00001093
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001094PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001095"This module provides mechanisms to use signal handlers in Python.\n\
1096\n\
1097Functions:\n\
1098\n\
1099alarm() -- cause SIGALRM after a specified time [Unix only]\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001100setitimer() -- cause a signal (described below) after a specified\n\
1101 float time and the timer may restart then [Unix only]\n\
1102getitimer() -- get current value of timer [Unix only]\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001103signal() -- set the action for a given signal\n\
1104getsignal() -- get the signal action for a given signal\n\
1105pause() -- wait until a signal arrives [Unix only]\n\
1106default_int_handler() -- default SIGINT handler\n\
1107\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001108signal constants:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001109SIG_DFL -- used to refer to the system default handler\n\
1110SIG_IGN -- used to ignore the signal\n\
1111NSIG -- number of defined signals\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001112SIGINT, SIGTERM, etc. -- signal numbers\n\
1113\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001114itimer constants:\n\
1115ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
1116 expiration\n\
1117ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
1118 and delivers SIGVTALRM upon expiration\n\
1119ITIMER_PROF -- decrements both when the process is executing and\n\
1120 when the system is executing on behalf of the process.\n\
1121 Coupled with ITIMER_VIRTUAL, this timer is usually\n\
1122 used to profile the time spent by the application\n\
1123 in user and kernel space. SIGPROF is delivered upon\n\
1124 expiration.\n\
1125\n\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001126*** IMPORTANT NOTICE ***\n\
1127A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001128the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001129
Martin v. Löwis1a214512008-06-11 05:26:20 +00001130static struct PyModuleDef signalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 PyModuleDef_HEAD_INIT,
Brett Cannon815a6f32014-04-04 10:20:28 -04001132 "_signal",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 module_doc,
1134 -1,
1135 signal_methods,
1136 NULL,
1137 NULL,
1138 NULL,
1139 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001140};
1141
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001142PyMODINIT_FUNC
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001143PyInit__signal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 PyObject *m, *d, *x;
1146 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001147
1148#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 main_thread = PyThread_get_thread_ident();
1150 main_pid = getpid();
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001151#endif
1152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 /* Create the module and add the functions */
1154 m = PyModule_Create(&signalmodule);
1155 if (m == NULL)
1156 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001157
Ross Lagerwallbc808222011-06-25 12:13:40 +02001158#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinner1c8f0592013-07-22 22:24:54 +02001159 if (!initialized) {
1160 if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0)
1161 return NULL;
1162 }
Ross Lagerwallbc808222011-06-25 12:13:40 +02001163 Py_INCREF((PyObject*) &SiginfoType);
1164 PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
1165 initialized = 1;
1166#endif
1167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 /* Add some symbolic constants to the module */
1169 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
1172 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
1173 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
1176 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
1177 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +00001178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 x = PyLong_FromLong((long)NSIG);
1180 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
1181 goto finally;
1182 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +00001183
Victor Stinnera9293352011-04-30 15:21:58 +02001184#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001185 if (PyModule_AddIntMacro(m, SIG_BLOCK))
1186 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001187#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001188#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001189 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
1190 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001191#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001192#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +02001193 if (PyModule_AddIntMacro(m, SIG_SETMASK))
1194 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001195#endif
1196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
1198 if (!x)
1199 goto finally;
1200 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +00001201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 Handlers[0].tripped = 0;
1203 for (i = 1; i < NSIG; i++) {
1204 void (*t)(int);
1205 t = PyOS_getsig(i);
1206 Handlers[i].tripped = 0;
1207 if (t == SIG_DFL)
1208 Handlers[i].func = DefaultHandler;
1209 else if (t == SIG_IGN)
1210 Handlers[i].func = IgnoreHandler;
1211 else
1212 Handlers[i].func = Py_None; /* None of our business */
1213 Py_INCREF(Handlers[i].func);
1214 }
1215 if (Handlers[SIGINT].func == DefaultHandler) {
1216 /* Install default int handler */
1217 Py_INCREF(IntHandler);
1218 Py_DECREF(Handlers[SIGINT].func);
1219 Handlers[SIGINT].func = IntHandler;
1220 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
1221 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001222
1223#ifdef SIGHUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 x = PyLong_FromLong(SIGHUP);
1225 PyDict_SetItemString(d, "SIGHUP", x);
1226 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001227#endif
1228#ifdef SIGINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 x = PyLong_FromLong(SIGINT);
1230 PyDict_SetItemString(d, "SIGINT", x);
1231 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001232#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +00001233#ifdef SIGBREAK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 x = PyLong_FromLong(SIGBREAK);
1235 PyDict_SetItemString(d, "SIGBREAK", x);
1236 Py_XDECREF(x);
Tim Peters1ce3cf72001-10-01 17:58:40 +00001237#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001238#ifdef SIGQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 x = PyLong_FromLong(SIGQUIT);
1240 PyDict_SetItemString(d, "SIGQUIT", x);
1241 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001242#endif
1243#ifdef SIGILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 x = PyLong_FromLong(SIGILL);
1245 PyDict_SetItemString(d, "SIGILL", x);
1246 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001247#endif
1248#ifdef SIGTRAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 x = PyLong_FromLong(SIGTRAP);
1250 PyDict_SetItemString(d, "SIGTRAP", x);
1251 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001252#endif
1253#ifdef SIGIOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 x = PyLong_FromLong(SIGIOT);
1255 PyDict_SetItemString(d, "SIGIOT", x);
1256 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001257#endif
1258#ifdef SIGABRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 x = PyLong_FromLong(SIGABRT);
1260 PyDict_SetItemString(d, "SIGABRT", x);
1261 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001262#endif
1263#ifdef SIGEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 x = PyLong_FromLong(SIGEMT);
1265 PyDict_SetItemString(d, "SIGEMT", x);
1266 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001267#endif
1268#ifdef SIGFPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 x = PyLong_FromLong(SIGFPE);
1270 PyDict_SetItemString(d, "SIGFPE", x);
1271 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001272#endif
1273#ifdef SIGKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 x = PyLong_FromLong(SIGKILL);
1275 PyDict_SetItemString(d, "SIGKILL", x);
1276 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001277#endif
1278#ifdef SIGBUS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 x = PyLong_FromLong(SIGBUS);
1280 PyDict_SetItemString(d, "SIGBUS", x);
1281 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001282#endif
1283#ifdef SIGSEGV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 x = PyLong_FromLong(SIGSEGV);
1285 PyDict_SetItemString(d, "SIGSEGV", x);
1286 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001287#endif
1288#ifdef SIGSYS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 x = PyLong_FromLong(SIGSYS);
1290 PyDict_SetItemString(d, "SIGSYS", x);
1291 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001292#endif
1293#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 x = PyLong_FromLong(SIGPIPE);
1295 PyDict_SetItemString(d, "SIGPIPE", x);
1296 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001297#endif
1298#ifdef SIGALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 x = PyLong_FromLong(SIGALRM);
1300 PyDict_SetItemString(d, "SIGALRM", x);
1301 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001302#endif
1303#ifdef SIGTERM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 x = PyLong_FromLong(SIGTERM);
1305 PyDict_SetItemString(d, "SIGTERM", x);
1306 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001307#endif
1308#ifdef SIGUSR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 x = PyLong_FromLong(SIGUSR1);
1310 PyDict_SetItemString(d, "SIGUSR1", x);
1311 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001312#endif
1313#ifdef SIGUSR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 x = PyLong_FromLong(SIGUSR2);
1315 PyDict_SetItemString(d, "SIGUSR2", x);
1316 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001317#endif
1318#ifdef SIGCLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 x = PyLong_FromLong(SIGCLD);
1320 PyDict_SetItemString(d, "SIGCLD", x);
1321 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001322#endif
1323#ifdef SIGCHLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 x = PyLong_FromLong(SIGCHLD);
1325 PyDict_SetItemString(d, "SIGCHLD", x);
1326 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001327#endif
1328#ifdef SIGPWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 x = PyLong_FromLong(SIGPWR);
1330 PyDict_SetItemString(d, "SIGPWR", x);
1331 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001332#endif
1333#ifdef SIGIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 x = PyLong_FromLong(SIGIO);
1335 PyDict_SetItemString(d, "SIGIO", x);
1336 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001337#endif
1338#ifdef SIGURG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 x = PyLong_FromLong(SIGURG);
1340 PyDict_SetItemString(d, "SIGURG", x);
1341 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001342#endif
1343#ifdef SIGWINCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 x = PyLong_FromLong(SIGWINCH);
1345 PyDict_SetItemString(d, "SIGWINCH", x);
1346 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001347#endif
1348#ifdef SIGPOLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 x = PyLong_FromLong(SIGPOLL);
1350 PyDict_SetItemString(d, "SIGPOLL", x);
1351 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001352#endif
1353#ifdef SIGSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 x = PyLong_FromLong(SIGSTOP);
1355 PyDict_SetItemString(d, "SIGSTOP", x);
1356 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001357#endif
1358#ifdef SIGTSTP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 x = PyLong_FromLong(SIGTSTP);
1360 PyDict_SetItemString(d, "SIGTSTP", x);
1361 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001362#endif
1363#ifdef SIGCONT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 x = PyLong_FromLong(SIGCONT);
1365 PyDict_SetItemString(d, "SIGCONT", x);
1366 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001367#endif
1368#ifdef SIGTTIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 x = PyLong_FromLong(SIGTTIN);
1370 PyDict_SetItemString(d, "SIGTTIN", x);
1371 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001372#endif
1373#ifdef SIGTTOU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 x = PyLong_FromLong(SIGTTOU);
1375 PyDict_SetItemString(d, "SIGTTOU", x);
1376 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001377#endif
1378#ifdef SIGVTALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 x = PyLong_FromLong(SIGVTALRM);
1380 PyDict_SetItemString(d, "SIGVTALRM", x);
1381 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001382#endif
1383#ifdef SIGPROF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 x = PyLong_FromLong(SIGPROF);
1385 PyDict_SetItemString(d, "SIGPROF", x);
1386 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001387#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001388#ifdef SIGXCPU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 x = PyLong_FromLong(SIGXCPU);
1390 PyDict_SetItemString(d, "SIGXCPU", x);
1391 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001392#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001393#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 x = PyLong_FromLong(SIGXFSZ);
1395 PyDict_SetItemString(d, "SIGXFSZ", x);
1396 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001397#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001398#ifdef SIGRTMIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 x = PyLong_FromLong(SIGRTMIN);
1400 PyDict_SetItemString(d, "SIGRTMIN", x);
1401 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001402#endif
1403#ifdef SIGRTMAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 x = PyLong_FromLong(SIGRTMAX);
1405 PyDict_SetItemString(d, "SIGRTMAX", x);
1406 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001407#endif
Martin v. Löwis175af252002-01-12 11:43:25 +00001408#ifdef SIGINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 x = PyLong_FromLong(SIGINFO);
1410 PyDict_SetItemString(d, "SIGINFO", x);
1411 Py_XDECREF(x);
Martin v. Löwis175af252002-01-12 11:43:25 +00001412#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001413
1414#ifdef ITIMER_REAL
1415 x = PyLong_FromLong(ITIMER_REAL);
1416 PyDict_SetItemString(d, "ITIMER_REAL", x);
1417 Py_DECREF(x);
1418#endif
1419#ifdef ITIMER_VIRTUAL
1420 x = PyLong_FromLong(ITIMER_VIRTUAL);
1421 PyDict_SetItemString(d, "ITIMER_VIRTUAL", x);
1422 Py_DECREF(x);
1423#endif
1424#ifdef ITIMER_PROF
1425 x = PyLong_FromLong(ITIMER_PROF);
1426 PyDict_SetItemString(d, "ITIMER_PROF", x);
1427 Py_DECREF(x);
1428#endif
1429
1430#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 ItimerError = PyErr_NewException("signal.ItimerError",
1432 PyExc_IOError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +00001433 if (ItimerError != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +00001435#endif
1436
Brian Curtineb24d742010-04-12 17:16:38 +00001437#ifdef CTRL_C_EVENT
1438 x = PyLong_FromLong(CTRL_C_EVENT);
1439 PyDict_SetItemString(d, "CTRL_C_EVENT", x);
1440 Py_DECREF(x);
1441#endif
1442
1443#ifdef CTRL_BREAK_EVENT
1444 x = PyLong_FromLong(CTRL_BREAK_EVENT);
1445 PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x);
1446 Py_DECREF(x);
1447#endif
1448
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001449#ifdef MS_WINDOWS
1450 /* Create manual-reset event, initially unset */
1451 sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
1452#endif
1453
Martin v. Löwis1a214512008-06-11 05:26:20 +00001454 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 Py_DECREF(m);
1456 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001457 }
Barry Warsaw92971171997-01-03 00:14:25 +00001458
Barry Warsaw92971171997-01-03 00:14:25 +00001459 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001460 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +00001461}
1462
1463static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001464finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 int i;
1467 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 PyOS_setsig(SIGINT, old_siginthandler);
1470 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 for (i = 1; i < NSIG; i++) {
1473 func = Handlers[i].func;
1474 Handlers[i].tripped = 0;
1475 Handlers[i].func = NULL;
1476 if (i != SIGINT && func != NULL && func != Py_None &&
1477 func != DefaultHandler && func != IgnoreHandler)
1478 PyOS_setsig(i, SIG_DFL);
1479 Py_XDECREF(func);
1480 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001481
Serhiy Storchaka505ff752014-02-09 13:33:53 +02001482 Py_CLEAR(IntHandler);
1483 Py_CLEAR(DefaultHandler);
1484 Py_CLEAR(IgnoreHandler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001485}
1486
Barry Warsaw92971171997-01-03 00:14:25 +00001487
Barry Warsaw92971171997-01-03 00:14:25 +00001488/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001489int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001490PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 int i;
1493 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 if (!is_tripped)
1496 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001497
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001498#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 if (PyThread_get_thread_ident() != main_thread)
1500 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001501#endif
Christian Heimesb76922a2007-12-11 01:06:40 +00001502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 /*
1504 * The is_tripped variable is meant to speed up the calls to
1505 * PyErr_CheckSignals (both directly or via pending calls) when no
1506 * signal has arrived. This variable is set to 1 when a signal arrives
1507 * and it is set to 0 here, when we know some signals arrived. This way
1508 * we can run the registered handlers with no signals blocked.
1509 *
1510 * NOTE: with this approach we can have a situation where is_tripped is
1511 * 1 but we have no more signals to handle (Handlers[i].tripped
1512 * is 0 for every signal i). This won't do us any harm (except
1513 * we're gonna spent some cycles for nothing). This happens when
1514 * we receive a signal i after we zero is_tripped and before we
1515 * check Handlers[i].tripped.
1516 */
1517 is_tripped = 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 if (!(f = (PyObject *)PyEval_GetFrame()))
1520 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 for (i = 1; i < NSIG; i++) {
1523 if (Handlers[i].tripped) {
1524 PyObject *result = NULL;
1525 PyObject *arglist = Py_BuildValue("(iO)", i, f);
1526 Handlers[i].tripped = 0;
Barry Warsaw92971171997-01-03 00:14:25 +00001527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 if (arglist) {
1529 result = PyEval_CallObject(Handlers[i].func,
1530 arglist);
1531 Py_DECREF(arglist);
1532 }
1533 if (!result)
1534 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +00001535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 Py_DECREF(result);
1537 }
1538 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001541}
1542
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001543
Barry Warsaw92971171997-01-03 00:14:25 +00001544/* Replacements for intrcheck.c functionality
1545 * Declared in pyerrors.h
1546 */
1547void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001548PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001549{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001550 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001551}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001552
1553void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001554PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001555{
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001556 PyObject *m = PyImport_ImportModule("_signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 if (m) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 Py_DECREF(m);
1559 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001560}
1561
1562void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001563PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001566}
1567
1568int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001569PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001570{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001572#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 if (PyThread_get_thread_ident() != main_thread)
1574 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 Handlers[SIGINT].tripped = 0;
1577 return 1;
1578 }
1579 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001580}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001581
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001582static void
1583_clear_pending_signals(void)
1584{
1585 int i;
1586 if (!is_tripped)
1587 return;
1588 is_tripped = 0;
1589 for (i = 1; i < NSIG; ++i) {
1590 Handlers[i].tripped = 0;
1591 }
1592}
1593
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001594void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001595PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001596{
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001597 /* Clear the signal flags after forking so that they aren't handled
1598 * in both processes if they came in just before the fork() but before
1599 * the interpreter had an opportunity to call the handlers. issue9535. */
1600 _clear_pending_signals();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001601#ifdef WITH_THREAD
Charles-François Natali6d0d24e2012-02-02 20:31:42 +01001602 /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API
1603 * can be called safely. */
1604 PyThread_ReInitTLS();
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001605 _PyGILState_Reinit();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 PyEval_ReInitThreads();
1607 main_thread = PyThread_get_thread_ident();
1608 main_pid = getpid();
1609 _PyImport_ReInitLock();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001610#endif
1611}
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001612
1613int
1614_PyOS_IsMainThread(void)
1615{
1616#ifdef WITH_THREAD
1617 return PyThread_get_thread_ident() == main_thread;
1618#else
1619 return 1;
1620#endif
1621}
1622
1623#ifdef MS_WINDOWS
1624void *_PyOS_SigintEvent(void)
1625{
1626 /* Returns a manual-reset event which gets tripped whenever
1627 SIGINT is received.
1628
1629 Python.h does not include windows.h so we do cannot use HANDLE
1630 as the return type of this function. We use void* instead. */
1631 return sigint_event;
1632}
1633#endif