blob: 61b3330d3fa0d4ed7ef2e27bcca2c628f14f3e93 [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 }
564 }
565 else
566 is_socket = 1;
567 }
568
569 old_fd = wakeup.fd;
570 wakeup.fd = fd;
571 wakeup.use_send = is_socket;
572
573 if (old_fd != INVALID_FD)
574 return PyLong_FromSocket_t(old_fd);
575 else
576 return PyLong_FromLong(-1);
577#else
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200578 if (fd != -1) {
Victor Stinner1d8948e2014-07-24 22:51:05 +0200579 if (!_PyVerify_fd(fd)) {
580 PyErr_SetString(PyExc_ValueError, "invalid fd");
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200581 return NULL;
582 }
Victor Stinner1d8948e2014-07-24 22:51:05 +0200583
Victor Stinner11517102014-07-29 23:31:34 +0200584 if (fstat(fd, &st) != 0) {
585 PyErr_SetFromErrno(PyExc_OSError);
586 return NULL;
587 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 }
Victor Stinner0bffc942014-07-21 16:28:54 +0200589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 old_fd = wakeup_fd;
591 wakeup_fd = fd;
Victor Stinner0bffc942014-07-21 16:28:54 +0200592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 return PyLong_FromLong(old_fd);
Victor Stinner11517102014-07-29 23:31:34 +0200594#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000595}
596
597PyDoc_STRVAR(set_wakeup_fd_doc,
598"set_wakeup_fd(fd) -> fd\n\
599\n\
Victor Stinner11517102014-07-29 23:31:34 +0200600Sets the fd to be written to (with the signal number) when a signal\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000601comes in. A library can use this to wakeup select or poll.\n\
Victor Stinner11517102014-07-29 23:31:34 +0200602The previous fd or -1 is returned.\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000603\n\
604The fd must be non-blocking.");
605
606/* C API for the same, without all the error checking */
607int
608PySignal_SetWakeupFd(int fd)
609{
Victor Stinner11517102014-07-29 23:31:34 +0200610 int old_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 if (fd < 0)
612 fd = -1;
Victor Stinner11517102014-07-29 23:31:34 +0200613
614#ifdef MS_WINDOWS
615 old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int);
616 wakeup.fd = fd;
617#else
618 old_fd = wakeup_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 wakeup_fd = fd;
Victor Stinner11517102014-07-29 23:31:34 +0200620#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 return old_fd;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000622}
623
624
Martin v. Löwis823725e2008-03-24 13:39:54 +0000625#ifdef HAVE_SETITIMER
626static PyObject *
627signal_setitimer(PyObject *self, PyObject *args)
628{
629 double first;
630 double interval = 0;
631 int which;
632 struct itimerval new, old;
633
634 if(!PyArg_ParseTuple(args, "id|d:setitimer", &which, &first, &interval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000636
637 timeval_from_double(first, &new.it_value);
638 timeval_from_double(interval, &new.it_interval);
639 /* Let OS check "which" value */
640 if (setitimer(which, &new, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 PyErr_SetFromErrno(ItimerError);
642 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000643 }
644
645 return itimer_retval(&old);
646}
647
648PyDoc_STRVAR(setitimer_doc,
649"setitimer(which, seconds[, interval])\n\
650\n\
651Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL\n\
652or ITIMER_PROF) to fire after value seconds and after\n\
653that every interval seconds.\n\
654The itimer can be cleared by setting seconds to zero.\n\
655\n\
656Returns old values as a tuple: (delay, interval).");
657#endif
658
659
660#ifdef HAVE_GETITIMER
661static PyObject *
662signal_getitimer(PyObject *self, PyObject *args)
663{
664 int which;
665 struct itimerval old;
666
667 if (!PyArg_ParseTuple(args, "i:getitimer", &which))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000669
670 if (getitimer(which, &old) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 PyErr_SetFromErrno(ItimerError);
672 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000673 }
674
675 return itimer_retval(&old);
676}
677
678PyDoc_STRVAR(getitimer_doc,
679"getitimer(which)\n\
680\n\
681Returns current value of given itimer.");
682#endif
683
Ross Lagerwallbc808222011-06-25 12:13:40 +0200684#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \
685 defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinnera9293352011-04-30 15:21:58 +0200686/* Convert an iterable to a sigset.
687 Return 0 on success, return -1 and raise an exception on error. */
688
689static int
690iterable_to_sigset(PyObject *iterable, sigset_t *mask)
691{
692 int result = -1;
693 PyObject *iterator, *item;
694 long signum;
695 int err;
696
697 sigemptyset(mask);
698
699 iterator = PyObject_GetIter(iterable);
700 if (iterator == NULL)
701 goto error;
702
703 while (1)
704 {
705 item = PyIter_Next(iterator);
706 if (item == NULL) {
707 if (PyErr_Occurred())
708 goto error;
709 else
710 break;
711 }
712
713 signum = PyLong_AsLong(item);
714 Py_DECREF(item);
715 if (signum == -1 && PyErr_Occurred())
716 goto error;
717 if (0 < signum && signum < NSIG)
718 err = sigaddset(mask, (int)signum);
719 else
720 err = 1;
721 if (err) {
722 PyErr_Format(PyExc_ValueError,
723 "signal number %ld out of range", signum);
724 goto error;
725 }
726 }
727 result = 0;
728
729error:
730 Py_XDECREF(iterator);
731 return result;
732}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200733#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200734
Victor Stinnerb3e72192011-05-08 01:46:11 +0200735#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
Victor Stinner35b300c2011-05-04 13:20:35 +0200736static PyObject*
737sigset_to_set(sigset_t mask)
738{
739 PyObject *signum, *result;
740 int sig;
741
742 result = PySet_New(0);
743 if (result == NULL)
744 return NULL;
745
746 for (sig = 1; sig < NSIG; sig++) {
747 if (sigismember(&mask, sig) != 1)
748 continue;
749
750 /* Handle the case where it is a member by adding the signal to
751 the result list. Ignore the other cases because they mean the
752 signal isn't a member of the mask or the signal was invalid,
753 and an invalid signal must have been our fault in constructing
754 the loop boundaries. */
755 signum = PyLong_FromLong(sig);
756 if (signum == NULL) {
757 Py_DECREF(result);
758 return NULL;
759 }
760 if (PySet_Add(result, signum) == -1) {
761 Py_DECREF(signum);
762 Py_DECREF(result);
763 return NULL;
764 }
765 Py_DECREF(signum);
766 }
767 return result;
768}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200769#endif
Victor Stinner35b300c2011-05-04 13:20:35 +0200770
Victor Stinnerb3e72192011-05-08 01:46:11 +0200771#ifdef PYPTHREAD_SIGMASK
Victor Stinnera9293352011-04-30 15:21:58 +0200772static PyObject *
773signal_pthread_sigmask(PyObject *self, PyObject *args)
774{
Victor Stinner35b300c2011-05-04 13:20:35 +0200775 int how;
776 PyObject *signals;
Victor Stinnera9293352011-04-30 15:21:58 +0200777 sigset_t mask, previous;
778 int err;
779
780 if (!PyArg_ParseTuple(args, "iO:pthread_sigmask", &how, &signals))
781 return NULL;
782
783 if (iterable_to_sigset(signals, &mask))
784 return NULL;
785
786 err = pthread_sigmask(how, &mask, &previous);
787 if (err != 0) {
788 errno = err;
Victor Stinnerb3e72192011-05-08 01:46:11 +0200789 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera9293352011-04-30 15:21:58 +0200790 return NULL;
791 }
792
Victor Stinnerd0e516d2011-05-03 14:57:12 +0200793 /* if signals was unblocked, signal handlers have been called */
794 if (PyErr_CheckSignals())
795 return NULL;
796
Victor Stinner35b300c2011-05-04 13:20:35 +0200797 return sigset_to_set(previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200798}
799
800PyDoc_STRVAR(signal_pthread_sigmask_doc,
801"pthread_sigmask(how, mask) -> old mask\n\
802\n\
803Fetch and/or change the signal mask of the calling thread.");
804#endif /* #ifdef PYPTHREAD_SIGMASK */
805
Martin v. Löwis823725e2008-03-24 13:39:54 +0000806
Victor Stinnerb3e72192011-05-08 01:46:11 +0200807#ifdef HAVE_SIGPENDING
808static PyObject *
809signal_sigpending(PyObject *self)
810{
811 int err;
812 sigset_t mask;
813 err = sigpending(&mask);
814 if (err)
815 return PyErr_SetFromErrno(PyExc_OSError);
816 return sigset_to_set(mask);
817}
818
819PyDoc_STRVAR(signal_sigpending_doc,
820"sigpending() -> list\n\
821\n\
822Examine pending signals.");
823#endif /* #ifdef HAVE_SIGPENDING */
824
825
826#ifdef HAVE_SIGWAIT
827static PyObject *
828signal_sigwait(PyObject *self, PyObject *args)
829{
830 PyObject *signals;
831 sigset_t set;
832 int err, signum;
833
834 if (!PyArg_ParseTuple(args, "O:sigwait", &signals))
835 return NULL;
836
837 if (iterable_to_sigset(signals, &set))
838 return NULL;
839
Victor Stinner10c30d62011-06-10 01:39:53 +0200840 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200841 err = sigwait(&set, &signum);
Victor Stinner10c30d62011-06-10 01:39:53 +0200842 Py_END_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200843 if (err) {
844 errno = err;
845 return PyErr_SetFromErrno(PyExc_OSError);
846 }
847
848 return PyLong_FromLong(signum);
849}
850
851PyDoc_STRVAR(signal_sigwait_doc,
852"sigwait(sigset) -> signum\n\
853\n\
854Wait a signal.");
855#endif /* #ifdef HAVE_SIGPENDING */
856
Ross Lagerwallbc808222011-06-25 12:13:40 +0200857#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
858static int initialized;
859static PyStructSequence_Field struct_siginfo_fields[] = {
860 {"si_signo", "signal number"},
861 {"si_code", "signal code"},
862 {"si_errno", "errno associated with this signal"},
863 {"si_pid", "sending process ID"},
864 {"si_uid", "real user ID of sending process"},
865 {"si_status", "exit value or signal"},
866 {"si_band", "band event for SIGPOLL"},
867 {0}
868};
869
870PyDoc_STRVAR(struct_siginfo__doc__,
871"struct_siginfo: Result from sigwaitinfo or sigtimedwait.\n\n\
872This object may be accessed either as a tuple of\n\
873(si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band),\n\
874or via the attributes si_signo, si_code, and so on.");
875
876static PyStructSequence_Desc struct_siginfo_desc = {
877 "signal.struct_siginfo", /* name */
878 struct_siginfo__doc__, /* doc */
879 struct_siginfo_fields, /* fields */
880 7 /* n_in_sequence */
881};
882
883static PyTypeObject SiginfoType;
884
885static PyObject *
886fill_siginfo(siginfo_t *si)
887{
888 PyObject *result = PyStructSequence_New(&SiginfoType);
889 if (!result)
890 return NULL;
891
892 PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo)));
893 PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code)));
894 PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno)));
895 PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid));
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200896 PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid));
Ross Lagerwallbc808222011-06-25 12:13:40 +0200897 PyStructSequence_SET_ITEM(result, 5,
898 PyLong_FromLong((long)(si->si_status)));
899 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
900 if (PyErr_Occurred()) {
901 Py_DECREF(result);
902 return NULL;
903 }
904
905 return result;
906}
907#endif
908
909#ifdef HAVE_SIGWAITINFO
910static PyObject *
911signal_sigwaitinfo(PyObject *self, PyObject *args)
912{
913 PyObject *signals;
914 sigset_t set;
915 siginfo_t si;
916 int err;
917
918 if (!PyArg_ParseTuple(args, "O:sigwaitinfo", &signals))
919 return NULL;
920
921 if (iterable_to_sigset(signals, &set))
922 return NULL;
923
924 Py_BEGIN_ALLOW_THREADS
925 err = sigwaitinfo(&set, &si);
926 Py_END_ALLOW_THREADS
927 if (err == -1)
928 return PyErr_SetFromErrno(PyExc_OSError);
929
930 return fill_siginfo(&si);
931}
932
933PyDoc_STRVAR(signal_sigwaitinfo_doc,
934"sigwaitinfo(sigset) -> struct_siginfo\n\
935\n\
936Wait synchronously for a signal until one of the signals in *sigset* is\n\
937delivered.\n\
938Returns a struct_siginfo containing information about the signal.");
939#endif /* #ifdef HAVE_SIGWAITINFO */
940
941#ifdef HAVE_SIGTIMEDWAIT
942static PyObject *
943signal_sigtimedwait(PyObject *self, PyObject *args)
944{
945 PyObject *signals, *timeout;
946 struct timespec buf;
947 sigset_t set;
948 siginfo_t si;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200949 time_t tv_sec;
950 long tv_nsec;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200951 int err;
952
Victor Stinner643cd682012-03-02 22:54:03 +0100953 if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
954 &signals, &timeout))
Ross Lagerwallbc808222011-06-25 12:13:40 +0200955 return NULL;
956
Victor Stinner3c1b3792014-02-17 00:02:43 +0100957 if (_PyTime_ObjectToTimespec(timeout, &tv_sec, &tv_nsec,
958 _PyTime_ROUND_DOWN) == -1)
Ross Lagerwallbc808222011-06-25 12:13:40 +0200959 return NULL;
Antoine Pitroucf8a1e52013-04-17 22:06:44 +0200960 buf.tv_sec = tv_sec;
961 buf.tv_nsec = tv_nsec;
Ross Lagerwallbc808222011-06-25 12:13:40 +0200962
963 if (buf.tv_sec < 0 || buf.tv_nsec < 0) {
964 PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
965 return NULL;
966 }
967
968 if (iterable_to_sigset(signals, &set))
969 return NULL;
970
971 Py_BEGIN_ALLOW_THREADS
972 err = sigtimedwait(&set, &si, &buf);
973 Py_END_ALLOW_THREADS
974 if (err == -1) {
975 if (errno == EAGAIN)
976 Py_RETURN_NONE;
977 else
978 return PyErr_SetFromErrno(PyExc_OSError);
979 }
980
981 return fill_siginfo(&si);
982}
983
984PyDoc_STRVAR(signal_sigtimedwait_doc,
985"sigtimedwait(sigset, (timeout_sec, timeout_nsec)) -> struct_siginfo\n\
986\n\
987Like sigwaitinfo(), but with a timeout specified as a tuple of (seconds,\n\
988nanoseconds).");
989#endif /* #ifdef HAVE_SIGTIMEDWAIT */
990
Victor Stinnerb3e72192011-05-08 01:46:11 +0200991
992#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
993static PyObject *
994signal_pthread_kill(PyObject *self, PyObject *args)
995{
996 long tid;
997 int signum;
998 int err;
999
1000 if (!PyArg_ParseTuple(args, "li:pthread_kill", &tid, &signum))
1001 return NULL;
1002
Victor Stinner86e104a2011-05-09 14:45:38 +02001003 err = pthread_kill((pthread_t)tid, signum);
Victor Stinnerb3e72192011-05-08 01:46:11 +02001004 if (err != 0) {
1005 errno = err;
1006 PyErr_SetFromErrno(PyExc_OSError);
1007 return NULL;
1008 }
1009
1010 /* the signal may have been send to the current thread */
1011 if (PyErr_CheckSignals())
1012 return NULL;
1013
1014 Py_RETURN_NONE;
1015}
1016
1017PyDoc_STRVAR(signal_pthread_kill_doc,
1018"pthread_kill(thread_id, signum)\n\
1019\n\
1020Send a signal to a thread.");
1021#endif /* #if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD) */
1022
1023
1024
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001025/* List of functions defined in the module */
Barry Warsaw92971171997-01-03 00:14:25 +00001026static PyMethodDef signal_methods[] = {
Guido van Rossum1171ee61997-08-22 20:42:00 +00001027#ifdef HAVE_ALARM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 {"alarm", signal_alarm, METH_VARARGS, alarm_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +00001029#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001030#ifdef HAVE_SETITIMER
1031 {"setitimer", signal_setitimer, METH_VARARGS, setitimer_doc},
1032#endif
1033#ifdef HAVE_GETITIMER
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 {"getitimer", signal_getitimer, METH_VARARGS, getitimer_doc},
Martin v. Löwis823725e2008-03-24 13:39:54 +00001035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 {"signal", signal_signal, METH_VARARGS, signal_doc},
1037 {"getsignal", signal_getsignal, METH_VARARGS, getsignal_doc},
1038 {"set_wakeup_fd", signal_set_wakeup_fd, METH_VARARGS, set_wakeup_fd_doc},
Christian Heimes8640e742008-02-23 16:23:06 +00001039#ifdef HAVE_SIGINTERRUPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 {"siginterrupt", signal_siginterrupt, METH_VARARGS, siginterrupt_doc},
Christian Heimes8640e742008-02-23 16:23:06 +00001041#endif
Guido van Rossum1171ee61997-08-22 20:42:00 +00001042#ifdef HAVE_PAUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 {"pause", (PyCFunction)signal_pause,
Victor Stinnera9293352011-04-30 15:21:58 +02001044 METH_NOARGS, pause_doc},
Guido van Rossum06d511d1995-03-10 15:13:48 +00001045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 {"default_int_handler", signal_default_int_handler,
1047 METH_VARARGS, default_int_handler_doc},
Victor Stinnerb3e72192011-05-08 01:46:11 +02001048#if defined(HAVE_PTHREAD_KILL) && defined(WITH_THREAD)
1049 {"pthread_kill", (PyCFunction)signal_pthread_kill,
1050 METH_VARARGS, signal_pthread_kill_doc},
1051#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001052#ifdef PYPTHREAD_SIGMASK
1053 {"pthread_sigmask", (PyCFunction)signal_pthread_sigmask,
1054 METH_VARARGS, signal_pthread_sigmask_doc},
1055#endif
Victor Stinnerb3e72192011-05-08 01:46:11 +02001056#ifdef HAVE_SIGPENDING
1057 {"sigpending", (PyCFunction)signal_sigpending,
1058 METH_NOARGS, signal_sigpending_doc},
1059#endif
1060#ifdef HAVE_SIGWAIT
1061 {"sigwait", (PyCFunction)signal_sigwait,
1062 METH_VARARGS, signal_sigwait_doc},
1063#endif
Ross Lagerwallbc808222011-06-25 12:13:40 +02001064#ifdef HAVE_SIGWAITINFO
1065 {"sigwaitinfo", (PyCFunction)signal_sigwaitinfo,
1066 METH_VARARGS, signal_sigwaitinfo_doc},
1067#endif
1068#ifdef HAVE_SIGTIMEDWAIT
1069 {"sigtimedwait", (PyCFunction)signal_sigtimedwait,
1070 METH_VARARGS, signal_sigtimedwait_doc},
1071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001073};
1074
Barry Warsaw92971171997-01-03 00:14:25 +00001075
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001076PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001077"This module provides mechanisms to use signal handlers in Python.\n\
1078\n\
1079Functions:\n\
1080\n\
1081alarm() -- cause SIGALRM after a specified time [Unix only]\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001082setitimer() -- cause a signal (described below) after a specified\n\
1083 float time and the timer may restart then [Unix only]\n\
1084getitimer() -- get current value of timer [Unix only]\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001085signal() -- set the action for a given signal\n\
1086getsignal() -- get the signal action for a given signal\n\
1087pause() -- wait until a signal arrives [Unix only]\n\
1088default_int_handler() -- default SIGINT handler\n\
1089\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001090signal constants:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001091SIG_DFL -- used to refer to the system default handler\n\
1092SIG_IGN -- used to ignore the signal\n\
1093NSIG -- number of defined signals\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001094SIGINT, SIGTERM, etc. -- signal numbers\n\
1095\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001096itimer constants:\n\
1097ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
1098 expiration\n\
1099ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
1100 and delivers SIGVTALRM upon expiration\n\
1101ITIMER_PROF -- decrements both when the process is executing and\n\
1102 when the system is executing on behalf of the process.\n\
1103 Coupled with ITIMER_VIRTUAL, this timer is usually\n\
1104 used to profile the time spent by the application\n\
1105 in user and kernel space. SIGPROF is delivered upon\n\
1106 expiration.\n\
1107\n\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001108*** IMPORTANT NOTICE ***\n\
1109A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001110the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001111
Martin v. Löwis1a214512008-06-11 05:26:20 +00001112static struct PyModuleDef signalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 PyModuleDef_HEAD_INIT,
Brett Cannon815a6f32014-04-04 10:20:28 -04001114 "_signal",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 module_doc,
1116 -1,
1117 signal_methods,
1118 NULL,
1119 NULL,
1120 NULL,
1121 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001122};
1123
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001124PyMODINIT_FUNC
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001125PyInit__signal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 PyObject *m, *d, *x;
1128 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001129
1130#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 main_thread = PyThread_get_thread_ident();
1132 main_pid = getpid();
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001133#endif
1134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 /* Create the module and add the functions */
1136 m = PyModule_Create(&signalmodule);
1137 if (m == NULL)
1138 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001139
Ross Lagerwallbc808222011-06-25 12:13:40 +02001140#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinner1c8f0592013-07-22 22:24:54 +02001141 if (!initialized) {
1142 if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0)
1143 return NULL;
1144 }
Ross Lagerwallbc808222011-06-25 12:13:40 +02001145 Py_INCREF((PyObject*) &SiginfoType);
1146 PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
1147 initialized = 1;
1148#endif
1149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 /* Add some symbolic constants to the module */
1151 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
1154 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
1155 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
1158 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
1159 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +00001160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 x = PyLong_FromLong((long)NSIG);
1162 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
1163 goto finally;
1164 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +00001165
Victor Stinnera9293352011-04-30 15:21:58 +02001166#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001167 if (PyModule_AddIntMacro(m, SIG_BLOCK))
1168 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001169#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001170#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001171 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
1172 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001173#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001174#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +02001175 if (PyModule_AddIntMacro(m, SIG_SETMASK))
1176 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001177#endif
1178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
1180 if (!x)
1181 goto finally;
1182 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +00001183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 Handlers[0].tripped = 0;
1185 for (i = 1; i < NSIG; i++) {
1186 void (*t)(int);
1187 t = PyOS_getsig(i);
1188 Handlers[i].tripped = 0;
1189 if (t == SIG_DFL)
1190 Handlers[i].func = DefaultHandler;
1191 else if (t == SIG_IGN)
1192 Handlers[i].func = IgnoreHandler;
1193 else
1194 Handlers[i].func = Py_None; /* None of our business */
1195 Py_INCREF(Handlers[i].func);
1196 }
1197 if (Handlers[SIGINT].func == DefaultHandler) {
1198 /* Install default int handler */
1199 Py_INCREF(IntHandler);
1200 Py_DECREF(Handlers[SIGINT].func);
1201 Handlers[SIGINT].func = IntHandler;
1202 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
1203 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001204
1205#ifdef SIGHUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 x = PyLong_FromLong(SIGHUP);
1207 PyDict_SetItemString(d, "SIGHUP", x);
1208 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001209#endif
1210#ifdef SIGINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 x = PyLong_FromLong(SIGINT);
1212 PyDict_SetItemString(d, "SIGINT", x);
1213 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001214#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +00001215#ifdef SIGBREAK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 x = PyLong_FromLong(SIGBREAK);
1217 PyDict_SetItemString(d, "SIGBREAK", x);
1218 Py_XDECREF(x);
Tim Peters1ce3cf72001-10-01 17:58:40 +00001219#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001220#ifdef SIGQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 x = PyLong_FromLong(SIGQUIT);
1222 PyDict_SetItemString(d, "SIGQUIT", x);
1223 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001224#endif
1225#ifdef SIGILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 x = PyLong_FromLong(SIGILL);
1227 PyDict_SetItemString(d, "SIGILL", x);
1228 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001229#endif
1230#ifdef SIGTRAP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 x = PyLong_FromLong(SIGTRAP);
1232 PyDict_SetItemString(d, "SIGTRAP", x);
1233 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001234#endif
1235#ifdef SIGIOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 x = PyLong_FromLong(SIGIOT);
1237 PyDict_SetItemString(d, "SIGIOT", x);
1238 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001239#endif
1240#ifdef SIGABRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 x = PyLong_FromLong(SIGABRT);
1242 PyDict_SetItemString(d, "SIGABRT", x);
1243 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001244#endif
1245#ifdef SIGEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 x = PyLong_FromLong(SIGEMT);
1247 PyDict_SetItemString(d, "SIGEMT", x);
1248 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001249#endif
1250#ifdef SIGFPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 x = PyLong_FromLong(SIGFPE);
1252 PyDict_SetItemString(d, "SIGFPE", x);
1253 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001254#endif
1255#ifdef SIGKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 x = PyLong_FromLong(SIGKILL);
1257 PyDict_SetItemString(d, "SIGKILL", x);
1258 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001259#endif
1260#ifdef SIGBUS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 x = PyLong_FromLong(SIGBUS);
1262 PyDict_SetItemString(d, "SIGBUS", x);
1263 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001264#endif
1265#ifdef SIGSEGV
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 x = PyLong_FromLong(SIGSEGV);
1267 PyDict_SetItemString(d, "SIGSEGV", x);
1268 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001269#endif
1270#ifdef SIGSYS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 x = PyLong_FromLong(SIGSYS);
1272 PyDict_SetItemString(d, "SIGSYS", x);
1273 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001274#endif
1275#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 x = PyLong_FromLong(SIGPIPE);
1277 PyDict_SetItemString(d, "SIGPIPE", x);
1278 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001279#endif
1280#ifdef SIGALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 x = PyLong_FromLong(SIGALRM);
1282 PyDict_SetItemString(d, "SIGALRM", x);
1283 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001284#endif
1285#ifdef SIGTERM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 x = PyLong_FromLong(SIGTERM);
1287 PyDict_SetItemString(d, "SIGTERM", x);
1288 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001289#endif
1290#ifdef SIGUSR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 x = PyLong_FromLong(SIGUSR1);
1292 PyDict_SetItemString(d, "SIGUSR1", x);
1293 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001294#endif
1295#ifdef SIGUSR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 x = PyLong_FromLong(SIGUSR2);
1297 PyDict_SetItemString(d, "SIGUSR2", x);
1298 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001299#endif
1300#ifdef SIGCLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 x = PyLong_FromLong(SIGCLD);
1302 PyDict_SetItemString(d, "SIGCLD", x);
1303 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001304#endif
1305#ifdef SIGCHLD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 x = PyLong_FromLong(SIGCHLD);
1307 PyDict_SetItemString(d, "SIGCHLD", x);
1308 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001309#endif
1310#ifdef SIGPWR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 x = PyLong_FromLong(SIGPWR);
1312 PyDict_SetItemString(d, "SIGPWR", x);
1313 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001314#endif
1315#ifdef SIGIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 x = PyLong_FromLong(SIGIO);
1317 PyDict_SetItemString(d, "SIGIO", x);
1318 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001319#endif
1320#ifdef SIGURG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 x = PyLong_FromLong(SIGURG);
1322 PyDict_SetItemString(d, "SIGURG", x);
1323 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001324#endif
1325#ifdef SIGWINCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 x = PyLong_FromLong(SIGWINCH);
1327 PyDict_SetItemString(d, "SIGWINCH", x);
1328 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001329#endif
1330#ifdef SIGPOLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 x = PyLong_FromLong(SIGPOLL);
1332 PyDict_SetItemString(d, "SIGPOLL", x);
1333 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001334#endif
1335#ifdef SIGSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 x = PyLong_FromLong(SIGSTOP);
1337 PyDict_SetItemString(d, "SIGSTOP", x);
1338 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001339#endif
1340#ifdef SIGTSTP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 x = PyLong_FromLong(SIGTSTP);
1342 PyDict_SetItemString(d, "SIGTSTP", x);
1343 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001344#endif
1345#ifdef SIGCONT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 x = PyLong_FromLong(SIGCONT);
1347 PyDict_SetItemString(d, "SIGCONT", x);
1348 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001349#endif
1350#ifdef SIGTTIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 x = PyLong_FromLong(SIGTTIN);
1352 PyDict_SetItemString(d, "SIGTTIN", x);
1353 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001354#endif
1355#ifdef SIGTTOU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 x = PyLong_FromLong(SIGTTOU);
1357 PyDict_SetItemString(d, "SIGTTOU", x);
1358 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001359#endif
1360#ifdef SIGVTALRM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 x = PyLong_FromLong(SIGVTALRM);
1362 PyDict_SetItemString(d, "SIGVTALRM", x);
1363 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001364#endif
1365#ifdef SIGPROF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 x = PyLong_FromLong(SIGPROF);
1367 PyDict_SetItemString(d, "SIGPROF", x);
1368 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001369#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001370#ifdef SIGXCPU
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 x = PyLong_FromLong(SIGXCPU);
1372 PyDict_SetItemString(d, "SIGXCPU", x);
1373 Py_XDECREF(x);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001374#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001375#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 x = PyLong_FromLong(SIGXFSZ);
1377 PyDict_SetItemString(d, "SIGXFSZ", x);
1378 Py_XDECREF(x);
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001379#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001380#ifdef SIGRTMIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 x = PyLong_FromLong(SIGRTMIN);
1382 PyDict_SetItemString(d, "SIGRTMIN", x);
1383 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001384#endif
1385#ifdef SIGRTMAX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 x = PyLong_FromLong(SIGRTMAX);
1387 PyDict_SetItemString(d, "SIGRTMAX", x);
1388 Py_XDECREF(x);
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001389#endif
Martin v. Löwis175af252002-01-12 11:43:25 +00001390#ifdef SIGINFO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 x = PyLong_FromLong(SIGINFO);
1392 PyDict_SetItemString(d, "SIGINFO", x);
1393 Py_XDECREF(x);
Martin v. Löwis175af252002-01-12 11:43:25 +00001394#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001395
1396#ifdef ITIMER_REAL
1397 x = PyLong_FromLong(ITIMER_REAL);
1398 PyDict_SetItemString(d, "ITIMER_REAL", x);
1399 Py_DECREF(x);
1400#endif
1401#ifdef ITIMER_VIRTUAL
1402 x = PyLong_FromLong(ITIMER_VIRTUAL);
1403 PyDict_SetItemString(d, "ITIMER_VIRTUAL", x);
1404 Py_DECREF(x);
1405#endif
1406#ifdef ITIMER_PROF
1407 x = PyLong_FromLong(ITIMER_PROF);
1408 PyDict_SetItemString(d, "ITIMER_PROF", x);
1409 Py_DECREF(x);
1410#endif
1411
1412#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 ItimerError = PyErr_NewException("signal.ItimerError",
1414 PyExc_IOError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +00001415 if (ItimerError != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +00001417#endif
1418
Brian Curtineb24d742010-04-12 17:16:38 +00001419#ifdef CTRL_C_EVENT
1420 x = PyLong_FromLong(CTRL_C_EVENT);
1421 PyDict_SetItemString(d, "CTRL_C_EVENT", x);
1422 Py_DECREF(x);
1423#endif
1424
1425#ifdef CTRL_BREAK_EVENT
1426 x = PyLong_FromLong(CTRL_BREAK_EVENT);
1427 PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x);
1428 Py_DECREF(x);
1429#endif
1430
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001431#ifdef MS_WINDOWS
1432 /* Create manual-reset event, initially unset */
1433 sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
1434#endif
1435
Martin v. Löwis1a214512008-06-11 05:26:20 +00001436 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 Py_DECREF(m);
1438 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001439 }
Barry Warsaw92971171997-01-03 00:14:25 +00001440
Barry Warsaw92971171997-01-03 00:14:25 +00001441 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001442 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +00001443}
1444
1445static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001446finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 int i;
1449 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 PyOS_setsig(SIGINT, old_siginthandler);
1452 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 for (i = 1; i < NSIG; i++) {
1455 func = Handlers[i].func;
1456 Handlers[i].tripped = 0;
1457 Handlers[i].func = NULL;
1458 if (i != SIGINT && func != NULL && func != Py_None &&
1459 func != DefaultHandler && func != IgnoreHandler)
1460 PyOS_setsig(i, SIG_DFL);
1461 Py_XDECREF(func);
1462 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001463
Serhiy Storchaka505ff752014-02-09 13:33:53 +02001464 Py_CLEAR(IntHandler);
1465 Py_CLEAR(DefaultHandler);
1466 Py_CLEAR(IgnoreHandler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001467}
1468
Barry Warsaw92971171997-01-03 00:14:25 +00001469
Barry Warsaw92971171997-01-03 00:14:25 +00001470/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001471int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001472PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 int i;
1475 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 if (!is_tripped)
1478 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001479
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001480#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 if (PyThread_get_thread_ident() != main_thread)
1482 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001483#endif
Christian Heimesb76922a2007-12-11 01:06:40 +00001484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 /*
1486 * The is_tripped variable is meant to speed up the calls to
1487 * PyErr_CheckSignals (both directly or via pending calls) when no
1488 * signal has arrived. This variable is set to 1 when a signal arrives
1489 * and it is set to 0 here, when we know some signals arrived. This way
1490 * we can run the registered handlers with no signals blocked.
1491 *
1492 * NOTE: with this approach we can have a situation where is_tripped is
1493 * 1 but we have no more signals to handle (Handlers[i].tripped
1494 * is 0 for every signal i). This won't do us any harm (except
1495 * we're gonna spent some cycles for nothing). This happens when
1496 * we receive a signal i after we zero is_tripped and before we
1497 * check Handlers[i].tripped.
1498 */
1499 is_tripped = 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 if (!(f = (PyObject *)PyEval_GetFrame()))
1502 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 for (i = 1; i < NSIG; i++) {
1505 if (Handlers[i].tripped) {
1506 PyObject *result = NULL;
1507 PyObject *arglist = Py_BuildValue("(iO)", i, f);
1508 Handlers[i].tripped = 0;
Barry Warsaw92971171997-01-03 00:14:25 +00001509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 if (arglist) {
1511 result = PyEval_CallObject(Handlers[i].func,
1512 arglist);
1513 Py_DECREF(arglist);
1514 }
1515 if (!result)
1516 return -1;
Barry Warsaw92971171997-01-03 00:14:25 +00001517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 Py_DECREF(result);
1519 }
1520 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001523}
1524
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001525
Barry Warsaw92971171997-01-03 00:14:25 +00001526/* Replacements for intrcheck.c functionality
1527 * Declared in pyerrors.h
1528 */
1529void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001530PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001531{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001532 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001533}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001534
1535void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001536PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001537{
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001538 PyObject *m = PyImport_ImportModule("_signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 if (m) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 Py_DECREF(m);
1541 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001542}
1543
1544void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001545PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001548}
1549
1550int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001551PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 if (Handlers[SIGINT].tripped) {
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001554#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 if (PyThread_get_thread_ident() != main_thread)
1556 return 0;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 Handlers[SIGINT].tripped = 0;
1559 return 1;
1560 }
1561 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001562}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001563
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001564static void
1565_clear_pending_signals(void)
1566{
1567 int i;
1568 if (!is_tripped)
1569 return;
1570 is_tripped = 0;
1571 for (i = 1; i < NSIG; ++i) {
1572 Handlers[i].tripped = 0;
1573 }
1574}
1575
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001576void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001577PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001578{
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001579 /* Clear the signal flags after forking so that they aren't handled
1580 * in both processes if they came in just before the fork() but before
1581 * the interpreter had an opportunity to call the handlers. issue9535. */
1582 _clear_pending_signals();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001583#ifdef WITH_THREAD
Charles-François Natali6d0d24e2012-02-02 20:31:42 +01001584 /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API
1585 * can be called safely. */
1586 PyThread_ReInitTLS();
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001587 _PyGILState_Reinit();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 PyEval_ReInitThreads();
1589 main_thread = PyThread_get_thread_ident();
1590 main_pid = getpid();
1591 _PyImport_ReInitLock();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001592#endif
1593}
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001594
1595int
1596_PyOS_IsMainThread(void)
1597{
1598#ifdef WITH_THREAD
1599 return PyThread_get_thread_ident() == main_thread;
1600#else
1601 return 1;
1602#endif
1603}
1604
1605#ifdef MS_WINDOWS
1606void *_PyOS_SigintEvent(void)
1607{
1608 /* Returns a manual-reset event which gets tripped whenever
1609 SIGINT is received.
1610
1611 Python.h does not include windows.h so we do cannot use HANDLE
1612 as the return type of this function. We use void* instead. */
1613 return sigint_event;
1614}
1615#endif