blob: b553eedc0f2c3e8a9f4a2d63cf3098f82a090cd0 [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
Tal Einatc7027b72015-05-16 14:14:49 +030055#include "clinic/signalmodule.c.h"
56
57/*[clinic input]
58module signal
59[clinic start generated code]*/
60/*[clinic end generated code: output=da39a3ee5e6b4b0d input=b0301a3bde5fe9d3]*/
61
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000062
Guido van Rossumbb4ba121994-06-23 11:25:45 +000063/*
64 NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
65
66 When threads are supported, we want the following semantics:
67
68 - only the main thread can set a signal handler
69 - any thread can get a signal handler
70 - signals are only delivered to the main thread
71
72 I.e. we don't support "synchronous signals" like SIGFPE (catching
73 this doesn't make much sense in Python anyway) nor do we support
74 signals as a means of inter-thread communication, since not all
75 thread implementations support that (at least our thread library
76 doesn't).
77
78 We still have the problem that in some implementations signals
79 generated by the keyboard (e.g. SIGINT) are delivered to all
80 threads (e.g. SGI), while in others (e.g. Solaris) such signals are
81 delivered to one random thread (an intermediate possibility would
Guido van Rossuma3c04b01995-01-12 11:29:01 +000082 be to deliver it to the main thread -- POSIX?). For now, we have
Guido van Rossumbb4ba121994-06-23 11:25:45 +000083 a working implementation that works in all three cases -- the
84 handler ignores signals if getpid() isn't the same as in the main
85 thread. XXX This is a hack.
Guido van Rossumbb4ba121994-06-23 11:25:45 +000086*/
87
Guido van Rossum295b8e51997-06-06 21:16:41 +000088#include <sys/types.h> /* For pid_t */
Guido van Rossum49b56061998-10-01 20:42:43 +000089#include "pythread.h"
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +020090static unsigned long main_thread;
Guido van Rossumbb4ba121994-06-23 11:25:45 +000091static pid_t main_pid;
Guido van Rossumbb4ba121994-06-23 11:25:45 +000092
Victor Stinner2ec6b172011-05-15 10:21:59 +020093static volatile struct {
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +020094 _Py_atomic_int tripped;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095 PyObject *func;
Barry Warsaw92971171997-01-03 00:14:25 +000096} Handlers[NSIG];
Guido van Rossum398d9fe1994-05-11 08:59:13 +000097
Victor Stinner11517102014-07-29 23:31:34 +020098#ifdef MS_WINDOWS
99#define INVALID_FD ((SOCKET_T)-1)
100
101static volatile struct {
102 SOCKET_T fd;
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800103 int warn_on_full_buffer;
Victor Stinner11517102014-07-29 23:31:34 +0200104 int use_send;
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800105} wakeup = {.fd = INVALID_FD, .warn_on_full_buffer = 1, .use_send = 0};
Victor Stinner11517102014-07-29 23:31:34 +0200106#else
107#define INVALID_FD (-1)
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800108static volatile struct {
109 sig_atomic_t fd;
110 int warn_on_full_buffer;
111} wakeup = {.fd = INVALID_FD, .warn_on_full_buffer = 1};
Victor Stinner11517102014-07-29 23:31:34 +0200112#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000113
Christian Heimesb76922a2007-12-11 01:06:40 +0000114/* Speed up sigcheck() when none tripped */
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +0200115static _Py_atomic_int is_tripped;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000116
Barry Warsaw92971171997-01-03 00:14:25 +0000117static PyObject *DefaultHandler;
118static PyObject *IgnoreHandler;
119static PyObject *IntHandler;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000120
Martin v. Löwisf58de1b2001-03-06 12:13:56 +0000121/* On Solaris 8, gcc will produce a warning that the function
122 declaration is not a prototype. This is caused by the definition of
123 SIG_DFL as (void (*)())0; the correct declaration would have been
124 (void (*)(int))0. */
125
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000126static PyOS_sighandler_t old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +0000127
Antoine Pitrou6dd381e2011-11-21 21:26:56 +0100128#ifdef MS_WINDOWS
129static HANDLE sigint_event = NULL;
130#endif
131
Martin v. Löwis823725e2008-03-24 13:39:54 +0000132#ifdef HAVE_GETITIMER
133static PyObject *ItimerError;
134
Victor Stinneref611c92017-10-13 13:49:43 -0700135/* auxiliary functions for setitimer */
136static int
137timeval_from_double(PyObject *obj, struct timeval *tv)
Martin v. Löwis823725e2008-03-24 13:39:54 +0000138{
Victor Stinneref611c92017-10-13 13:49:43 -0700139 if (obj == NULL) {
140 tv->tv_sec = 0;
141 tv->tv_usec = 0;
142 return 0;
Antoine Pitrou729780a2017-06-30 10:01:05 +0200143 }
Victor Stinneref611c92017-10-13 13:49:43 -0700144
145 _PyTime_t t;
146 if (_PyTime_FromSecondsObject(&t, obj, _PyTime_ROUND_CEILING) < 0) {
147 return -1;
148 }
149 return _PyTime_AsTimeval(t, tv, _PyTime_ROUND_CEILING);
Martin v. Löwis823725e2008-03-24 13:39:54 +0000150}
151
Christian Heimes1a8501c2008-10-02 19:56:01 +0000152Py_LOCAL_INLINE(double)
Martin v. Löwis823725e2008-03-24 13:39:54 +0000153double_from_timeval(struct timeval *tv)
154{
155 return tv->tv_sec + (double)(tv->tv_usec / 1000000.0);
156}
157
158static PyObject *
159itimer_retval(struct itimerval *iv)
160{
161 PyObject *r, *v;
162
163 r = PyTuple_New(2);
164 if (r == NULL)
Martin Panter6d57fe12016-09-17 03:26:16 +0000165 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000166
167 if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_value)))) {
Martin Panter6d57fe12016-09-17 03:26:16 +0000168 Py_DECREF(r);
169 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000170 }
171
172 PyTuple_SET_ITEM(r, 0, v);
173
174 if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_interval)))) {
Martin Panter6d57fe12016-09-17 03:26:16 +0000175 Py_DECREF(r);
176 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000177 }
178
179 PyTuple_SET_ITEM(r, 1, v);
180
181 return r;
182}
183#endif
Barry Warsaw92971171997-01-03 00:14:25 +0000184
Guido van Rossume4485b01994-09-07 14:32:49 +0000185static PyObject *
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000186signal_default_int_handler(PyObject *self, PyObject *args)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000187{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 PyErr_SetNone(PyExc_KeyboardInterrupt);
189 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000190}
191
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000192PyDoc_STRVAR(default_int_handler_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000193"default_int_handler(...)\n\
194\n\
Michael W. Hudson24ec2112004-06-17 15:55:53 +0000195The default handler for SIGINT installed by Python.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000196It raises KeyboardInterrupt.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000197
Thomas Wouters0796b002000-07-22 23:49:30 +0000198
199static int
Victor Stinner11517102014-07-29 23:31:34 +0200200report_wakeup_write_error(void *data)
Antoine Pitrou6f6ec372013-08-17 20:27:56 +0200201{
202 int save_errno = errno;
Benjamin Petersonca470632016-09-06 13:47:26 -0700203 errno = (int) (intptr_t) data;
Antoine Pitrou6f6ec372013-08-17 20:27:56 +0200204 PyErr_SetFromErrno(PyExc_OSError);
205 PySys_WriteStderr("Exception ignored when trying to write to the "
206 "signal wakeup fd:\n");
207 PyErr_WriteUnraisable(NULL);
208 errno = save_errno;
209 return 0;
210}
211
Victor Stinner11517102014-07-29 23:31:34 +0200212#ifdef MS_WINDOWS
213static int
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800214report_wakeup_send_error(void* data)
Victor Stinner11517102014-07-29 23:31:34 +0200215{
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800216 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
217 recognizes the error codes used by both GetLastError() and
218 WSAGetLastError */
219 PyErr_SetExcFromWindowsErr(PyExc_OSError, (int) (intptr_t) data);
Victor Stinner11517102014-07-29 23:31:34 +0200220 PySys_WriteStderr("Exception ignored when trying to send to the "
221 "signal wakeup fd:\n");
222 PyErr_WriteUnraisable(NULL);
Victor Stinner11517102014-07-29 23:31:34 +0200223 return 0;
224}
225#endif /* MS_WINDOWS */
226
Tim Peters4f1b2082000-07-23 21:18:09 +0000227static void
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200228trip_signal(int sig_num)
229{
Victor Stinnerd49b1f12011-05-08 02:03:15 +0200230 unsigned char byte;
Victor Stinner11517102014-07-29 23:31:34 +0200231 int fd;
232 Py_ssize_t rc;
Victor Stinnerc13ef662011-05-25 02:35:58 +0200233
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +0200234 _Py_atomic_store_relaxed(&Handlers[sig_num].tripped, 1);
Victor Stinner11517102014-07-29 23:31:34 +0200235
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200236 /* Set is_tripped after setting .tripped, as it gets
237 cleared in PyErr_CheckSignals() before .tripped. */
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +0200238 _Py_atomic_store(&is_tripped, 1);
239
240 /* Notify ceval.c */
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200241 _PyEval_SignalReceived();
Nathaniel J. Smith4ae01492017-05-16 14:12:11 -0700242
243 /* And then write to the wakeup fd *after* setting all the globals and
Antoine Pitrouc08177a2017-06-28 23:29:29 +0200244 doing the _PyEval_SignalReceived. We used to write to the wakeup fd
245 and then set the flag, but this allowed the following sequence of events
246 (especially on windows, where trip_signal may run in a new thread):
Nathaniel J. Smith4ae01492017-05-16 14:12:11 -0700247
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800248 - main thread blocks on select([wakeup.fd], ...)
Nathaniel J. Smith4ae01492017-05-16 14:12:11 -0700249 - signal arrives
250 - trip_signal writes to the wakeup fd
251 - the main thread wakes up
252 - the main thread checks the signal flags, sees that they're unset
253 - the main thread empties the wakeup fd
254 - the main thread goes back to sleep
255 - trip_signal sets the flags to request the Python-level signal handler
256 be run
257 - the main thread doesn't notice, because it's asleep
258
259 See bpo-30038 for more details.
260 */
261
Victor Stinner11517102014-07-29 23:31:34 +0200262#ifdef MS_WINDOWS
263 fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int);
264#else
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800265 fd = wakeup.fd;
Victor Stinner11517102014-07-29 23:31:34 +0200266#endif
267
268 if (fd != INVALID_FD) {
Victor Stinnerc13ef662011-05-25 02:35:58 +0200269 byte = (unsigned char)sig_num;
Victor Stinner11517102014-07-29 23:31:34 +0200270#ifdef MS_WINDOWS
271 if (wakeup.use_send) {
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800272 rc = send(fd, &byte, 1, 0);
Victor Stinner11517102014-07-29 23:31:34 +0200273
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800274 if (rc < 0) {
275 int last_error = GetLastError();
276 if (wakeup.warn_on_full_buffer ||
277 last_error != WSAEWOULDBLOCK)
278 {
279 /* Py_AddPendingCall() isn't signal-safe, but we
280 still use it for this exceptional case. */
281 Py_AddPendingCall(report_wakeup_send_error,
282 (void *)(intptr_t) last_error);
283 }
Victor Stinner11517102014-07-29 23:31:34 +0200284 }
285 }
286 else
287#endif
288 {
Victor Stinnere72fe392015-04-01 18:35:22 +0200289 /* _Py_write_noraise() retries write() if write() is interrupted by
290 a signal (fails with EINTR). */
291 rc = _Py_write_noraise(fd, &byte, 1);
Victor Stinner11517102014-07-29 23:31:34 +0200292
293 if (rc < 0) {
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800294 if (wakeup.warn_on_full_buffer ||
295 (errno != EWOULDBLOCK && errno != EAGAIN))
296 {
297 /* Py_AddPendingCall() isn't signal-safe, but we
298 still use it for this exceptional case. */
299 Py_AddPendingCall(report_wakeup_write_error,
300 (void *)(intptr_t)errno);
301 }
Victor Stinner11517102014-07-29 23:31:34 +0200302 }
303 }
Victor Stinnerc13ef662011-05-25 02:35:58 +0200304 }
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200305}
306
307static void
Peter Schneider-Kampe89b1562000-07-10 12:04:18 +0000308signal_handler(int sig_num)
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000309{
Antoine Pitrou39a65912010-11-05 19:47:27 +0000310 int save_errno = errno;
311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 /* See NOTES section above */
Antoine Pitrou39a65912010-11-05 19:47:27 +0000313 if (getpid() == main_pid)
Antoine Pitrou39a65912010-11-05 19:47:27 +0000314 {
Victor Stinner6c9b35b2011-04-18 16:25:56 +0200315 trip_signal(sig_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 }
Antoine Pitrou39a65912010-11-05 19:47:27 +0000317
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000318#ifndef HAVE_SIGACTION
Antoine Pitrou39a65912010-11-05 19:47:27 +0000319#ifdef SIGCHLD
320 /* To avoid infinite recursion, this signal remains
321 reset until explicit re-instated.
322 Don't clear the 'func' field as it is our pointer
323 to the Python handler... */
324 if (sig_num != SIGCHLD)
325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 /* If the handler was not set up with sigaction, reinstall it. See
Nick Coghland6009512014-11-20 21:39:37 +1000327 * Python/pylifecycle.c for the implementation of PyOS_setsig which
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 * makes this true. See also issue8354. */
329 PyOS_setsig(sig_num, signal_handler);
Jean-Paul Calderone6f137ca2010-05-09 03:18:57 +0000330#endif
Antoine Pitrou39a65912010-11-05 19:47:27 +0000331
332 /* Issue #10311: asynchronously executing signal handlers should not
333 mutate errno under the feet of unsuspecting C code. */
334 errno = save_errno;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +0100335
336#ifdef MS_WINDOWS
337 if (sig_num == SIGINT)
338 SetEvent(sigint_event);
339#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000340}
Guido van Rossume4485b01994-09-07 14:32:49 +0000341
Guido van Rossum06d511d1995-03-10 15:13:48 +0000342
Guido van Rossum1171ee61997-08-22 20:42:00 +0000343#ifdef HAVE_ALARM
Tal Einatc7027b72015-05-16 14:14:49 +0300344
345/*[clinic input]
346signal.alarm -> long
347
348 seconds: int
349 /
350
351Arrange for SIGALRM to arrive after the given number of seconds.
352[clinic start generated code]*/
353
354static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300355signal_alarm_impl(PyObject *module, int seconds)
356/*[clinic end generated code: output=144232290814c298 input=0d5e97e0e6f39e86]*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 /* alarm() returns the number of seconds remaining */
Tal Einatc7027b72015-05-16 14:14:49 +0300359 return (long)alarm(seconds);
Guido van Rossumaa0f4c71994-08-23 13:49:37 +0000360}
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000361
Guido van Rossum06d511d1995-03-10 15:13:48 +0000362#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000363
Guido van Rossum1171ee61997-08-22 20:42:00 +0000364#ifdef HAVE_PAUSE
Tal Einatc7027b72015-05-16 14:14:49 +0300365
366/*[clinic input]
367signal.pause
368
369Wait until a signal arrives.
370[clinic start generated code]*/
371
Guido van Rossuma597dde1995-01-10 20:56:29 +0000372static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300373signal_pause_impl(PyObject *module)
374/*[clinic end generated code: output=391656788b3c3929 input=f03de0f875752062]*/
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 Py_BEGIN_ALLOW_THREADS
377 (void)pause();
378 Py_END_ALLOW_THREADS
379 /* make sure that any exceptions that got raised are propagated
380 * back into Python
381 */
382 if (PyErr_CheckSignals())
383 return NULL;
Barry Warsaw92971171997-01-03 00:14:25 +0000384
Tal Einatc7027b72015-05-16 14:14:49 +0300385 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +0000386}
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000387
Guido van Rossum06d511d1995-03-10 15:13:48 +0000388#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000389
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000390
Tal Einatc7027b72015-05-16 14:14:49 +0300391/*[clinic input]
392signal.signal
393
394 signalnum: int
395 handler: object
396 /
397
398Set the action for the given signal.
399
400The action can be SIG_DFL, SIG_IGN, or a callable Python object.
401The previous action is returned. See getsignal() for possible return values.
402
403*** IMPORTANT NOTICE ***
404A signal handler function is called with two arguments:
405the first is the signal number, the second is the interrupted stack frame.
406[clinic start generated code]*/
407
Guido van Rossume4485b01994-09-07 14:32:49 +0000408static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300409signal_signal_impl(PyObject *module, int signalnum, PyObject *handler)
410/*[clinic end generated code: output=b44cfda43780f3a1 input=deee84af5fa0432c]*/
Guido van Rossume4485b01994-09-07 14:32:49 +0000411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 PyObject *old_handler;
413 void (*func)(int);
Brian Curtinef9efbd2010-08-06 19:27:32 +0000414#ifdef MS_WINDOWS
Tal Einatc7027b72015-05-16 14:14:49 +0300415 /* Validate that signalnum is one of the allowable signals */
416 switch (signalnum) {
Brian Curtinc734b312010-09-06 16:04:10 +0000417 case SIGABRT: break;
Brian Curtin9e88b5a2010-10-01 14:49:24 +0000418#ifdef SIGBREAK
419 /* Issue #10003: SIGBREAK is not documented as permitted, but works
420 and corresponds to CTRL_BREAK_EVENT. */
421 case SIGBREAK: break;
422#endif
Brian Curtinc734b312010-09-06 16:04:10 +0000423 case SIGFPE: break;
424 case SIGILL: break;
425 case SIGINT: break;
426 case SIGSEGV: break;
427 case SIGTERM: break;
428 default:
429 PyErr_SetString(PyExc_ValueError, "invalid signal value");
430 return NULL;
Brian Curtinef9efbd2010-08-06 19:27:32 +0000431 }
432#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 if (PyThread_get_thread_ident() != main_thread) {
434 PyErr_SetString(PyExc_ValueError,
435 "signal only works in main thread");
436 return NULL;
437 }
Tal Einatc7027b72015-05-16 14:14:49 +0300438 if (signalnum < 1 || signalnum >= NSIG) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 PyErr_SetString(PyExc_ValueError,
440 "signal number out of range");
441 return NULL;
442 }
Tal Einatc7027b72015-05-16 14:14:49 +0300443 if (handler == IgnoreHandler)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 func = SIG_IGN;
Tal Einatc7027b72015-05-16 14:14:49 +0300445 else if (handler == DefaultHandler)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 func = SIG_DFL;
Tal Einatc7027b72015-05-16 14:14:49 +0300447 else if (!PyCallable_Check(handler)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 PyErr_SetString(PyExc_TypeError,
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000449"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 return NULL;
451 }
452 else
453 func = signal_handler;
Antoine Pitrouf6f90ff2017-11-03 19:58:46 +0100454 /* Check for pending signals before changing signal handler */
455 if (PyErr_CheckSignals()) {
456 return NULL;
457 }
Tal Einatc7027b72015-05-16 14:14:49 +0300458 if (PyOS_setsig(signalnum, func) == SIG_ERR) {
Victor Stinner388196e2011-05-10 17:13:00 +0200459 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 return NULL;
461 }
Tal Einatc7027b72015-05-16 14:14:49 +0300462 old_handler = Handlers[signalnum].func;
Tal Einatc7027b72015-05-16 14:14:49 +0300463 Py_INCREF(handler);
464 Handlers[signalnum].func = handler;
Antoine Pitrouc8c952c2013-05-04 23:16:59 +0200465 if (old_handler != NULL)
466 return old_handler;
467 else
468 Py_RETURN_NONE;
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000469}
470
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +0000471
Tal Einatc7027b72015-05-16 14:14:49 +0300472/*[clinic input]
473signal.getsignal
474
475 signalnum: int
476 /
477
478Return the current action for the given signal.
479
480The return value can be:
481 SIG_IGN -- if the signal is being ignored
482 SIG_DFL -- if the default action for the signal is in effect
483 None -- if an unknown handler is in effect
484 anything else -- the callable Python object used as a handler
485[clinic start generated code]*/
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000486
Guido van Rossume4485b01994-09-07 14:32:49 +0000487static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300488signal_getsignal_impl(PyObject *module, int signalnum)
489/*[clinic end generated code: output=35b3e0e796fd555e input=ac23a00f19dfa509]*/
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 PyObject *old_handler;
Tal Einatc7027b72015-05-16 14:14:49 +0300492 if (signalnum < 1 || signalnum >= NSIG) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 PyErr_SetString(PyExc_ValueError,
494 "signal number out of range");
495 return NULL;
496 }
Tal Einatc7027b72015-05-16 14:14:49 +0300497 old_handler = Handlers[signalnum].func;
Antoine Pitrouc8c952c2013-05-04 23:16:59 +0200498 if (old_handler != NULL) {
499 Py_INCREF(old_handler);
500 return old_handler;
501 }
502 else {
503 Py_RETURN_NONE;
504 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +0000505}
506
Christian Heimes8640e742008-02-23 16:23:06 +0000507#ifdef HAVE_SIGINTERRUPT
Tal Einatc7027b72015-05-16 14:14:49 +0300508
509/*[clinic input]
510signal.siginterrupt
511
512 signalnum: int
513 flag: int
514 /
515
516Change system call restart behaviour.
517
518If flag is False, system calls will be restarted when interrupted by
519signal sig, else system calls will be interrupted.
520[clinic start generated code]*/
Christian Heimes8640e742008-02-23 16:23:06 +0000521
522static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300523signal_siginterrupt_impl(PyObject *module, int signalnum, int flag)
524/*[clinic end generated code: output=063816243d85dd19 input=4160acacca3e2099]*/
Christian Heimes8640e742008-02-23 16:23:06 +0000525{
Tal Einatc7027b72015-05-16 14:14:49 +0300526 if (signalnum < 1 || signalnum >= NSIG) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 PyErr_SetString(PyExc_ValueError,
528 "signal number out of range");
529 return NULL;
530 }
Tal Einatc7027b72015-05-16 14:14:49 +0300531 if (siginterrupt(signalnum, flag)<0) {
Victor Stinner388196e2011-05-10 17:13:00 +0200532 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 return NULL;
534 }
Tal Einatc7027b72015-05-16 14:14:49 +0300535 Py_RETURN_NONE;
Christian Heimes8640e742008-02-23 16:23:06 +0000536}
537
538#endif
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000539
Tal Einatc7027b72015-05-16 14:14:49 +0300540
541static PyObject*
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800542signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds)
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000543{
Victor Stinnere134a7f2015-03-30 10:09:31 +0200544 struct _Py_stat_struct status;
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800545 static char *kwlist[] = {
546 "", "warn_on_full_buffer", NULL,
547 };
548 int warn_on_full_buffer = 1;
Victor Stinner11517102014-07-29 23:31:34 +0200549#ifdef MS_WINDOWS
550 PyObject *fdobj;
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100551 SOCKET_T sockfd, old_sockfd;
Victor Stinner11517102014-07-29 23:31:34 +0200552 int res;
553 int res_size = sizeof res;
554 PyObject *mod;
Victor Stinner11517102014-07-29 23:31:34 +0200555 int is_socket;
556
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800557 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|$p:set_wakeup_fd", kwlist,
558 &fdobj, &warn_on_full_buffer))
Victor Stinner11517102014-07-29 23:31:34 +0200559 return NULL;
560
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100561 sockfd = PyLong_AsSocket_t(fdobj);
562 if (sockfd == (SOCKET_T)(-1) && PyErr_Occurred())
Victor Stinner11517102014-07-29 23:31:34 +0200563 return NULL;
564#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 int fd, old_fd;
Victor Stinner11517102014-07-29 23:31:34 +0200566
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800567 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i|$p:set_wakeup_fd", kwlist,
568 &fd, &warn_on_full_buffer))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 return NULL;
Victor Stinner11517102014-07-29 23:31:34 +0200570#endif
571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 if (PyThread_get_thread_ident() != main_thread) {
573 PyErr_SetString(PyExc_ValueError,
574 "set_wakeup_fd only works in main thread");
575 return NULL;
576 }
Victor Stinner0bffc942014-07-21 16:28:54 +0200577
Victor Stinner11517102014-07-29 23:31:34 +0200578#ifdef MS_WINDOWS
579 is_socket = 0;
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100580 if (sockfd != INVALID_FD) {
Victor Stinner11517102014-07-29 23:31:34 +0200581 /* Import the _socket module to call WSAStartup() */
582 mod = PyImport_ImportModuleNoBlock("_socket");
583 if (mod == NULL)
584 return NULL;
585 Py_DECREF(mod);
586
587 /* test the socket */
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100588 if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
Victor Stinner11517102014-07-29 23:31:34 +0200589 (char *)&res, &res_size) != 0) {
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100590 int fd, err;
591
592 err = WSAGetLastError();
Victor Stinner11517102014-07-29 23:31:34 +0200593 if (err != WSAENOTSOCK) {
594 PyErr_SetExcFromWindowsErr(PyExc_OSError, err);
595 return NULL;
596 }
597
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100598 fd = (int)sockfd;
Steve Dower940f33a2016-09-08 11:21:54 -0700599 if ((SOCKET_T)fd != sockfd) {
Victor Stinner11517102014-07-29 23:31:34 +0200600 PyErr_SetString(PyExc_ValueError, "invalid fd");
601 return NULL;
602 }
603
Victor Stinnere134a7f2015-03-30 10:09:31 +0200604 if (_Py_fstat(fd, &status) != 0)
Victor Stinner11517102014-07-29 23:31:34 +0200605 return NULL;
Victor Stinner38227602014-08-27 12:59:44 +0200606
607 /* on Windows, a file cannot be set to non-blocking mode */
Victor Stinner11517102014-07-29 23:31:34 +0200608 }
Victor Stinner38227602014-08-27 12:59:44 +0200609 else {
Victor Stinner11517102014-07-29 23:31:34 +0200610 is_socket = 1;
Victor Stinner38227602014-08-27 12:59:44 +0200611
612 /* Windows does not provide a function to test if a socket
613 is in non-blocking mode */
614 }
Victor Stinner11517102014-07-29 23:31:34 +0200615 }
616
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100617 old_sockfd = wakeup.fd;
618 wakeup.fd = sockfd;
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800619 wakeup.warn_on_full_buffer = warn_on_full_buffer;
Victor Stinner11517102014-07-29 23:31:34 +0200620 wakeup.use_send = is_socket;
621
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100622 if (old_sockfd != INVALID_FD)
623 return PyLong_FromSocket_t(old_sockfd);
Victor Stinner11517102014-07-29 23:31:34 +0200624 else
625 return PyLong_FromLong(-1);
626#else
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200627 if (fd != -1) {
Victor Stinner38227602014-08-27 12:59:44 +0200628 int blocking;
629
Victor Stinnere134a7f2015-03-30 10:09:31 +0200630 if (_Py_fstat(fd, &status) != 0)
Victor Stinner11517102014-07-29 23:31:34 +0200631 return NULL;
Victor Stinner38227602014-08-27 12:59:44 +0200632
633 blocking = _Py_get_blocking(fd);
634 if (blocking < 0)
635 return NULL;
636 if (blocking) {
637 PyErr_Format(PyExc_ValueError,
638 "the fd %i must be in non-blocking mode",
639 fd);
640 return NULL;
641 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 }
Victor Stinner0bffc942014-07-21 16:28:54 +0200643
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800644 old_fd = wakeup.fd;
645 wakeup.fd = fd;
646 wakeup.warn_on_full_buffer = warn_on_full_buffer;
Victor Stinner0bffc942014-07-21 16:28:54 +0200647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 return PyLong_FromLong(old_fd);
Victor Stinner11517102014-07-29 23:31:34 +0200649#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000650}
651
652PyDoc_STRVAR(set_wakeup_fd_doc,
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800653"set_wakeup_fd(fd, *, warn_on_full_buffer=True) -> fd\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000654\n\
Victor Stinner11517102014-07-29 23:31:34 +0200655Sets the fd to be written to (with the signal number) when a signal\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000656comes in. A library can use this to wakeup select or poll.\n\
Victor Stinner11517102014-07-29 23:31:34 +0200657The previous fd or -1 is returned.\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000658\n\
659The fd must be non-blocking.");
660
661/* C API for the same, without all the error checking */
662int
663PySignal_SetWakeupFd(int fd)
664{
Victor Stinner11517102014-07-29 23:31:34 +0200665 int old_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 if (fd < 0)
667 fd = -1;
Victor Stinner11517102014-07-29 23:31:34 +0200668
669#ifdef MS_WINDOWS
670 old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int);
Victor Stinner11517102014-07-29 23:31:34 +0200671#else
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800672 old_fd = wakeup.fd;
Victor Stinner11517102014-07-29 23:31:34 +0200673#endif
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800674 wakeup.fd = fd;
675 wakeup.warn_on_full_buffer = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 return old_fd;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000677}
678
679
Martin v. Löwis823725e2008-03-24 13:39:54 +0000680#ifdef HAVE_SETITIMER
Tal Einatc7027b72015-05-16 14:14:49 +0300681
682/*[clinic input]
683signal.setitimer
684
685 which: int
Victor Stinneref611c92017-10-13 13:49:43 -0700686 seconds: object
687 interval: object(c_default="NULL") = 0.0
Tal Einatc7027b72015-05-16 14:14:49 +0300688 /
689
690Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL or ITIMER_PROF).
691
692The timer will fire after value seconds and after that every interval seconds.
693The itimer can be cleared by setting seconds to zero.
694
695Returns old values as a tuple: (delay, interval).
696[clinic start generated code]*/
697
Martin v. Löwis823725e2008-03-24 13:39:54 +0000698static PyObject *
Victor Stinneref611c92017-10-13 13:49:43 -0700699signal_setitimer_impl(PyObject *module, int which, PyObject *seconds,
700 PyObject *interval)
701/*[clinic end generated code: output=65f9dcbddc35527b input=de43daf194e6f66f]*/
Martin v. Löwis823725e2008-03-24 13:39:54 +0000702{
Martin v. Löwis823725e2008-03-24 13:39:54 +0000703 struct itimerval new, old;
704
Victor Stinneref611c92017-10-13 13:49:43 -0700705 if (timeval_from_double(seconds, &new.it_value) < 0) {
706 return NULL;
707 }
708 if (timeval_from_double(interval, &new.it_interval) < 0) {
709 return NULL;
710 }
711
Martin v. Löwis823725e2008-03-24 13:39:54 +0000712 /* Let OS check "which" value */
713 if (setitimer(which, &new, &old) != 0) {
Tal Einatc7027b72015-05-16 14:14:49 +0300714 PyErr_SetFromErrno(ItimerError);
715 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000716 }
717
718 return itimer_retval(&old);
719}
720
Martin v. Löwis823725e2008-03-24 13:39:54 +0000721#endif
722
723
724#ifdef HAVE_GETITIMER
Tal Einatc7027b72015-05-16 14:14:49 +0300725
726/*[clinic input]
727signal.getitimer
728
729 which: int
730 /
731
732Returns current value of given itimer.
733[clinic start generated code]*/
734
Martin v. Löwis823725e2008-03-24 13:39:54 +0000735static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300736signal_getitimer_impl(PyObject *module, int which)
737/*[clinic end generated code: output=9e053175d517db40 input=f7d21d38f3490627]*/
Martin v. Löwis823725e2008-03-24 13:39:54 +0000738{
Martin v. Löwis823725e2008-03-24 13:39:54 +0000739 struct itimerval old;
740
Martin v. Löwis823725e2008-03-24 13:39:54 +0000741 if (getitimer(which, &old) != 0) {
Tal Einatc7027b72015-05-16 14:14:49 +0300742 PyErr_SetFromErrno(ItimerError);
743 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000744 }
745
746 return itimer_retval(&old);
747}
748
Martin v. Löwis823725e2008-03-24 13:39:54 +0000749#endif
750
Ross Lagerwallbc808222011-06-25 12:13:40 +0200751#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \
752 defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinnera9293352011-04-30 15:21:58 +0200753/* Convert an iterable to a sigset.
754 Return 0 on success, return -1 and raise an exception on error. */
755
756static int
757iterable_to_sigset(PyObject *iterable, sigset_t *mask)
758{
759 int result = -1;
760 PyObject *iterator, *item;
761 long signum;
762 int err;
763
764 sigemptyset(mask);
765
766 iterator = PyObject_GetIter(iterable);
767 if (iterator == NULL)
768 goto error;
769
770 while (1)
771 {
772 item = PyIter_Next(iterator);
773 if (item == NULL) {
774 if (PyErr_Occurred())
775 goto error;
776 else
777 break;
778 }
779
780 signum = PyLong_AsLong(item);
781 Py_DECREF(item);
782 if (signum == -1 && PyErr_Occurred())
783 goto error;
784 if (0 < signum && signum < NSIG)
785 err = sigaddset(mask, (int)signum);
786 else
787 err = 1;
788 if (err) {
789 PyErr_Format(PyExc_ValueError,
790 "signal number %ld out of range", signum);
791 goto error;
792 }
793 }
794 result = 0;
795
796error:
797 Py_XDECREF(iterator);
798 return result;
799}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200800#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200801
Victor Stinnerb3e72192011-05-08 01:46:11 +0200802#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
Victor Stinner35b300c2011-05-04 13:20:35 +0200803static PyObject*
804sigset_to_set(sigset_t mask)
805{
806 PyObject *signum, *result;
807 int sig;
808
809 result = PySet_New(0);
810 if (result == NULL)
811 return NULL;
812
813 for (sig = 1; sig < NSIG; sig++) {
814 if (sigismember(&mask, sig) != 1)
815 continue;
816
817 /* Handle the case where it is a member by adding the signal to
818 the result list. Ignore the other cases because they mean the
819 signal isn't a member of the mask or the signal was invalid,
820 and an invalid signal must have been our fault in constructing
821 the loop boundaries. */
822 signum = PyLong_FromLong(sig);
823 if (signum == NULL) {
824 Py_DECREF(result);
825 return NULL;
826 }
827 if (PySet_Add(result, signum) == -1) {
828 Py_DECREF(signum);
829 Py_DECREF(result);
830 return NULL;
831 }
832 Py_DECREF(signum);
833 }
834 return result;
835}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200836#endif
Victor Stinner35b300c2011-05-04 13:20:35 +0200837
Victor Stinnerb3e72192011-05-08 01:46:11 +0200838#ifdef PYPTHREAD_SIGMASK
Tal Einatc7027b72015-05-16 14:14:49 +0300839
840/*[clinic input]
841signal.pthread_sigmask
842
843 how: int
844 mask: object
845 /
846
847Fetch and/or change the signal mask of the calling thread.
848[clinic start generated code]*/
849
Victor Stinnera9293352011-04-30 15:21:58 +0200850static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300851signal_pthread_sigmask_impl(PyObject *module, int how, PyObject *mask)
852/*[clinic end generated code: output=ff640fe092bc9181 input=f3b7d7a61b7b8283]*/
Victor Stinnera9293352011-04-30 15:21:58 +0200853{
Tal Einatc7027b72015-05-16 14:14:49 +0300854 sigset_t newmask, previous;
Victor Stinnera9293352011-04-30 15:21:58 +0200855 int err;
856
Tal Einatc7027b72015-05-16 14:14:49 +0300857 if (iterable_to_sigset(mask, &newmask))
Victor Stinnera9293352011-04-30 15:21:58 +0200858 return NULL;
859
Tal Einatc7027b72015-05-16 14:14:49 +0300860 err = pthread_sigmask(how, &newmask, &previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200861 if (err != 0) {
862 errno = err;
Victor Stinnerb3e72192011-05-08 01:46:11 +0200863 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera9293352011-04-30 15:21:58 +0200864 return NULL;
865 }
866
Victor Stinnerd0e516d2011-05-03 14:57:12 +0200867 /* if signals was unblocked, signal handlers have been called */
868 if (PyErr_CheckSignals())
869 return NULL;
870
Victor Stinner35b300c2011-05-04 13:20:35 +0200871 return sigset_to_set(previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200872}
873
Victor Stinnera9293352011-04-30 15:21:58 +0200874#endif /* #ifdef PYPTHREAD_SIGMASK */
875
Martin v. Löwis823725e2008-03-24 13:39:54 +0000876
Victor Stinnerb3e72192011-05-08 01:46:11 +0200877#ifdef HAVE_SIGPENDING
Tal Einatc7027b72015-05-16 14:14:49 +0300878
879/*[clinic input]
880signal.sigpending
881
882Examine pending signals.
883
884Returns a set of signal numbers that are pending for delivery to
885the calling thread.
886[clinic start generated code]*/
887
Victor Stinnerb3e72192011-05-08 01:46:11 +0200888static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300889signal_sigpending_impl(PyObject *module)
890/*[clinic end generated code: output=53375ffe89325022 input=e0036c016f874e29]*/
Victor Stinnerb3e72192011-05-08 01:46:11 +0200891{
892 int err;
893 sigset_t mask;
894 err = sigpending(&mask);
895 if (err)
896 return PyErr_SetFromErrno(PyExc_OSError);
897 return sigset_to_set(mask);
898}
899
Victor Stinnerb3e72192011-05-08 01:46:11 +0200900#endif /* #ifdef HAVE_SIGPENDING */
901
902
903#ifdef HAVE_SIGWAIT
Tal Einatc7027b72015-05-16 14:14:49 +0300904
905/*[clinic input]
906signal.sigwait
907
908 sigset: object
909 /
910
911Wait for a signal.
912
913Suspend execution of the calling thread until the delivery of one of the
914signals specified in the signal set sigset. The function accepts the signal
915and returns the signal number.
916[clinic start generated code]*/
917
Victor Stinnerb3e72192011-05-08 01:46:11 +0200918static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300919signal_sigwait(PyObject *module, PyObject *sigset)
920/*[clinic end generated code: output=557173647424f6e4 input=11af2d82d83c2e94]*/
Victor Stinnerb3e72192011-05-08 01:46:11 +0200921{
Victor Stinnerb3e72192011-05-08 01:46:11 +0200922 sigset_t set;
923 int err, signum;
924
Tal Einatc7027b72015-05-16 14:14:49 +0300925 if (iterable_to_sigset(sigset, &set))
Victor Stinnerb3e72192011-05-08 01:46:11 +0200926 return NULL;
927
Victor Stinner10c30d62011-06-10 01:39:53 +0200928 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200929 err = sigwait(&set, &signum);
Victor Stinner10c30d62011-06-10 01:39:53 +0200930 Py_END_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200931 if (err) {
932 errno = err;
933 return PyErr_SetFromErrno(PyExc_OSError);
934 }
935
936 return PyLong_FromLong(signum);
937}
938
Tal Einatc7027b72015-05-16 14:14:49 +0300939#endif /* #ifdef HAVE_SIGWAIT */
940
Victor Stinnerb3e72192011-05-08 01:46:11 +0200941
Ross Lagerwallbc808222011-06-25 12:13:40 +0200942#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
943static int initialized;
944static PyStructSequence_Field struct_siginfo_fields[] = {
945 {"si_signo", "signal number"},
946 {"si_code", "signal code"},
947 {"si_errno", "errno associated with this signal"},
948 {"si_pid", "sending process ID"},
949 {"si_uid", "real user ID of sending process"},
950 {"si_status", "exit value or signal"},
951 {"si_band", "band event for SIGPOLL"},
952 {0}
953};
954
955PyDoc_STRVAR(struct_siginfo__doc__,
956"struct_siginfo: Result from sigwaitinfo or sigtimedwait.\n\n\
957This object may be accessed either as a tuple of\n\
958(si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band),\n\
959or via the attributes si_signo, si_code, and so on.");
960
961static PyStructSequence_Desc struct_siginfo_desc = {
962 "signal.struct_siginfo", /* name */
963 struct_siginfo__doc__, /* doc */
964 struct_siginfo_fields, /* fields */
965 7 /* n_in_sequence */
966};
967
968static PyTypeObject SiginfoType;
969
970static PyObject *
971fill_siginfo(siginfo_t *si)
972{
973 PyObject *result = PyStructSequence_New(&SiginfoType);
974 if (!result)
975 return NULL;
976
977 PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo)));
978 PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code)));
979 PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno)));
980 PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid));
Serhiy Storchaka7cf55992013-02-10 21:56:49 +0200981 PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid));
Ross Lagerwallbc808222011-06-25 12:13:40 +0200982 PyStructSequence_SET_ITEM(result, 5,
983 PyLong_FromLong((long)(si->si_status)));
Zachary Ware6a6967e2016-10-01 00:47:27 -0500984#ifdef HAVE_SIGINFO_T_SI_BAND
Ross Lagerwallbc808222011-06-25 12:13:40 +0200985 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
Zachary Ware6a6967e2016-10-01 00:47:27 -0500986#else
987 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(0L));
988#endif
Ross Lagerwallbc808222011-06-25 12:13:40 +0200989 if (PyErr_Occurred()) {
990 Py_DECREF(result);
991 return NULL;
992 }
993
994 return result;
995}
996#endif
997
998#ifdef HAVE_SIGWAITINFO
Tal Einatc7027b72015-05-16 14:14:49 +0300999
1000/*[clinic input]
1001signal.sigwaitinfo
1002
1003 sigset: object
1004 /
1005
1006Wait synchronously until one of the signals in *sigset* is delivered.
1007
1008Returns a struct_siginfo containing information about the signal.
1009[clinic start generated code]*/
1010
Ross Lagerwallbc808222011-06-25 12:13:40 +02001011static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001012signal_sigwaitinfo(PyObject *module, PyObject *sigset)
1013/*[clinic end generated code: output=c40f27b269cd2309 input=f3779a74a991e171]*/
Ross Lagerwallbc808222011-06-25 12:13:40 +02001014{
Ross Lagerwallbc808222011-06-25 12:13:40 +02001015 sigset_t set;
1016 siginfo_t si;
1017 int err;
Victor Stinnera453cd82015-03-20 12:54:28 +01001018 int async_err = 0;
Ross Lagerwallbc808222011-06-25 12:13:40 +02001019
Tal Einatc7027b72015-05-16 14:14:49 +03001020 if (iterable_to_sigset(sigset, &set))
Ross Lagerwallbc808222011-06-25 12:13:40 +02001021 return NULL;
1022
Victor Stinnera453cd82015-03-20 12:54:28 +01001023 do {
1024 Py_BEGIN_ALLOW_THREADS
1025 err = sigwaitinfo(&set, &si);
1026 Py_END_ALLOW_THREADS
1027 } while (err == -1
1028 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Ross Lagerwallbc808222011-06-25 12:13:40 +02001029 if (err == -1)
Victor Stinnera453cd82015-03-20 12:54:28 +01001030 return (!async_err) ? PyErr_SetFromErrno(PyExc_OSError) : NULL;
Ross Lagerwallbc808222011-06-25 12:13:40 +02001031
1032 return fill_siginfo(&si);
1033}
1034
Ross Lagerwallbc808222011-06-25 12:13:40 +02001035#endif /* #ifdef HAVE_SIGWAITINFO */
1036
1037#ifdef HAVE_SIGTIMEDWAIT
Tal Einatc7027b72015-05-16 14:14:49 +03001038
1039/*[clinic input]
1040signal.sigtimedwait
1041
1042 sigset: object
Serhiy Storchaka6b680cd2015-05-16 15:57:56 +03001043 timeout as timeout_obj: object
Tal Einatc7027b72015-05-16 14:14:49 +03001044 /
1045
1046Like sigwaitinfo(), but with a timeout.
1047
1048The timeout is specified in seconds, with floating point numbers allowed.
1049[clinic start generated code]*/
1050
Ross Lagerwallbc808222011-06-25 12:13:40 +02001051static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001052signal_sigtimedwait_impl(PyObject *module, PyObject *sigset,
Serhiy Storchaka6b680cd2015-05-16 15:57:56 +03001053 PyObject *timeout_obj)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001054/*[clinic end generated code: output=f7eff31e679f4312 input=53fd4ea3e3724eb8]*/
Ross Lagerwallbc808222011-06-25 12:13:40 +02001055{
Victor Stinnera453cd82015-03-20 12:54:28 +01001056 struct timespec ts;
Ross Lagerwallbc808222011-06-25 12:13:40 +02001057 sigset_t set;
1058 siginfo_t si;
Victor Stinnera453cd82015-03-20 12:54:28 +01001059 int res;
Victor Stinner34dc0f42015-03-27 18:19:03 +01001060 _PyTime_t timeout, deadline, monotonic;
Ross Lagerwallbc808222011-06-25 12:13:40 +02001061
Victor Stinner869e1772015-03-30 03:49:14 +02001062 if (_PyTime_FromSecondsObject(&timeout,
1063 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Ross Lagerwallbc808222011-06-25 12:13:40 +02001064 return NULL;
1065
Victor Stinnera453cd82015-03-20 12:54:28 +01001066 if (timeout < 0) {
Ross Lagerwallbc808222011-06-25 12:13:40 +02001067 PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
1068 return NULL;
1069 }
1070
Tal Einatc7027b72015-05-16 14:14:49 +03001071 if (iterable_to_sigset(sigset, &set))
Ross Lagerwallbc808222011-06-25 12:13:40 +02001072 return NULL;
1073
Victor Stinner34dc0f42015-03-27 18:19:03 +01001074 deadline = _PyTime_GetMonotonicClock() + timeout;
Victor Stinnera453cd82015-03-20 12:54:28 +01001075
1076 do {
Victor Stinner34dc0f42015-03-27 18:19:03 +01001077 if (_PyTime_AsTimespec(timeout, &ts) < 0)
1078 return NULL;
Victor Stinnera453cd82015-03-20 12:54:28 +01001079
1080 Py_BEGIN_ALLOW_THREADS
1081 res = sigtimedwait(&set, &si, &ts);
1082 Py_END_ALLOW_THREADS
1083
1084 if (res != -1)
1085 break;
1086
1087 if (errno != EINTR) {
1088 if (errno == EAGAIN)
1089 Py_RETURN_NONE;
1090 else
1091 return PyErr_SetFromErrno(PyExc_OSError);
1092 }
1093
1094 /* sigtimedwait() was interrupted by a signal (EINTR) */
1095 if (PyErr_CheckSignals())
1096 return NULL;
1097
Victor Stinner34dc0f42015-03-27 18:19:03 +01001098 monotonic = _PyTime_GetMonotonicClock();
1099 timeout = deadline - monotonic;
Victor Stinner6aa446c2015-03-30 21:33:51 +02001100 if (timeout < 0)
Victor Stinnera453cd82015-03-20 12:54:28 +01001101 break;
1102 } while (1);
Ross Lagerwallbc808222011-06-25 12:13:40 +02001103
1104 return fill_siginfo(&si);
1105}
1106
Ross Lagerwallbc808222011-06-25 12:13:40 +02001107#endif /* #ifdef HAVE_SIGTIMEDWAIT */
1108
Victor Stinnerb3e72192011-05-08 01:46:11 +02001109
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02001110#if defined(HAVE_PTHREAD_KILL)
Tal Einatc7027b72015-05-16 14:14:49 +03001111
1112/*[clinic input]
1113signal.pthread_kill
1114
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001115 thread_id: unsigned_long(bitwise=True)
Tal Einatc7027b72015-05-16 14:14:49 +03001116 signalnum: int
1117 /
1118
1119Send a signal to a thread.
1120[clinic start generated code]*/
1121
Victor Stinnerb3e72192011-05-08 01:46:11 +02001122static PyObject *
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001123signal_pthread_kill_impl(PyObject *module, unsigned long thread_id,
1124 int signalnum)
1125/*[clinic end generated code: output=7629919b791bc27f input=1d901f2c7bb544ff]*/
Victor Stinnerb3e72192011-05-08 01:46:11 +02001126{
Victor Stinnerb3e72192011-05-08 01:46:11 +02001127 int err;
1128
Tal Einatc7027b72015-05-16 14:14:49 +03001129 err = pthread_kill((pthread_t)thread_id, signalnum);
Victor Stinnerb3e72192011-05-08 01:46:11 +02001130 if (err != 0) {
1131 errno = err;
1132 PyErr_SetFromErrno(PyExc_OSError);
1133 return NULL;
1134 }
1135
1136 /* the signal may have been send to the current thread */
1137 if (PyErr_CheckSignals())
1138 return NULL;
1139
1140 Py_RETURN_NONE;
1141}
1142
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02001143#endif /* #if defined(HAVE_PTHREAD_KILL) */
Victor Stinnerb3e72192011-05-08 01:46:11 +02001144
1145
1146
Tal Einatc7027b72015-05-16 14:14:49 +03001147/* List of functions defined in the module -- some of the methoddefs are
1148 defined to nothing if the corresponding C function is not available. */
Barry Warsaw92971171997-01-03 00:14:25 +00001149static PyMethodDef signal_methods[] = {
Tal Einatc7027b72015-05-16 14:14:49 +03001150 {"default_int_handler", signal_default_int_handler, METH_VARARGS, default_int_handler_doc},
1151 SIGNAL_ALARM_METHODDEF
1152 SIGNAL_SETITIMER_METHODDEF
1153 SIGNAL_GETITIMER_METHODDEF
1154 SIGNAL_SIGNAL_METHODDEF
1155 SIGNAL_GETSIGNAL_METHODDEF
Nathaniel J. Smith902ab802017-12-17 20:10:18 -08001156 {"set_wakeup_fd", (PyCFunction)signal_set_wakeup_fd, METH_VARARGS | METH_KEYWORDS, set_wakeup_fd_doc},
Tal Einatc7027b72015-05-16 14:14:49 +03001157 SIGNAL_SIGINTERRUPT_METHODDEF
1158 SIGNAL_PAUSE_METHODDEF
1159 SIGNAL_PTHREAD_KILL_METHODDEF
1160 SIGNAL_PTHREAD_SIGMASK_METHODDEF
1161 SIGNAL_SIGPENDING_METHODDEF
1162 SIGNAL_SIGWAIT_METHODDEF
1163 SIGNAL_SIGWAITINFO_METHODDEF
1164 SIGNAL_SIGTIMEDWAIT_METHODDEF
1165 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001166};
1167
Barry Warsaw92971171997-01-03 00:14:25 +00001168
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001169PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001170"This module provides mechanisms to use signal handlers in Python.\n\
1171\n\
1172Functions:\n\
1173\n\
1174alarm() -- cause SIGALRM after a specified time [Unix only]\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001175setitimer() -- cause a signal (described below) after a specified\n\
1176 float time and the timer may restart then [Unix only]\n\
1177getitimer() -- get current value of timer [Unix only]\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001178signal() -- set the action for a given signal\n\
1179getsignal() -- get the signal action for a given signal\n\
1180pause() -- wait until a signal arrives [Unix only]\n\
1181default_int_handler() -- default SIGINT handler\n\
1182\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001183signal constants:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001184SIG_DFL -- used to refer to the system default handler\n\
1185SIG_IGN -- used to ignore the signal\n\
1186NSIG -- number of defined signals\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001187SIGINT, SIGTERM, etc. -- signal numbers\n\
1188\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001189itimer constants:\n\
1190ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
1191 expiration\n\
1192ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
1193 and delivers SIGVTALRM upon expiration\n\
1194ITIMER_PROF -- decrements both when the process is executing and\n\
1195 when the system is executing on behalf of the process.\n\
1196 Coupled with ITIMER_VIRTUAL, this timer is usually\n\
1197 used to profile the time spent by the application\n\
1198 in user and kernel space. SIGPROF is delivered upon\n\
1199 expiration.\n\
1200\n\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001201*** IMPORTANT NOTICE ***\n\
1202A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001203the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001204
Martin v. Löwis1a214512008-06-11 05:26:20 +00001205static struct PyModuleDef signalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 PyModuleDef_HEAD_INIT,
Brett Cannon815a6f32014-04-04 10:20:28 -04001207 "_signal",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 module_doc,
1209 -1,
1210 signal_methods,
1211 NULL,
1212 NULL,
1213 NULL,
1214 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001215};
1216
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001217PyMODINIT_FUNC
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001218PyInit__signal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 PyObject *m, *d, *x;
1221 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 main_thread = PyThread_get_thread_ident();
1224 main_pid = getpid();
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 /* Create the module and add the functions */
1227 m = PyModule_Create(&signalmodule);
1228 if (m == NULL)
1229 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001230
Ross Lagerwallbc808222011-06-25 12:13:40 +02001231#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinner1c8f0592013-07-22 22:24:54 +02001232 if (!initialized) {
1233 if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0)
1234 return NULL;
1235 }
Ross Lagerwallbc808222011-06-25 12:13:40 +02001236 Py_INCREF((PyObject*) &SiginfoType);
1237 PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
1238 initialized = 1;
1239#endif
1240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 /* Add some symbolic constants to the module */
1242 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
1245 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
1246 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
1249 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
1250 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +00001251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 x = PyLong_FromLong((long)NSIG);
1253 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
1254 goto finally;
1255 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +00001256
Victor Stinnera9293352011-04-30 15:21:58 +02001257#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001258 if (PyModule_AddIntMacro(m, SIG_BLOCK))
1259 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001260#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001261#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001262 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
1263 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001264#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001265#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +02001266 if (PyModule_AddIntMacro(m, SIG_SETMASK))
1267 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001268#endif
1269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
1271 if (!x)
1272 goto finally;
1273 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +00001274
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001275 _Py_atomic_store_relaxed(&Handlers[0].tripped, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 for (i = 1; i < NSIG; i++) {
1277 void (*t)(int);
1278 t = PyOS_getsig(i);
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001279 _Py_atomic_store_relaxed(&Handlers[i].tripped, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 if (t == SIG_DFL)
1281 Handlers[i].func = DefaultHandler;
1282 else if (t == SIG_IGN)
1283 Handlers[i].func = IgnoreHandler;
1284 else
1285 Handlers[i].func = Py_None; /* None of our business */
1286 Py_INCREF(Handlers[i].func);
1287 }
1288 if (Handlers[SIGINT].func == DefaultHandler) {
1289 /* Install default int handler */
1290 Py_INCREF(IntHandler);
Serhiy Storchaka57a01d32016-04-10 18:05:40 +03001291 Py_SETREF(Handlers[SIGINT].func, IntHandler);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
1293 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001294
1295#ifdef SIGHUP
Christian Heimes6782b142016-09-09 00:11:45 +02001296 if (PyModule_AddIntMacro(m, SIGHUP))
1297 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001298#endif
1299#ifdef SIGINT
Christian Heimes6782b142016-09-09 00:11:45 +02001300 if (PyModule_AddIntMacro(m, SIGINT))
1301 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001302#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +00001303#ifdef SIGBREAK
Christian Heimes6782b142016-09-09 00:11:45 +02001304 if (PyModule_AddIntMacro(m, SIGBREAK))
1305 goto finally;
Tim Peters1ce3cf72001-10-01 17:58:40 +00001306#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001307#ifdef SIGQUIT
Christian Heimes6782b142016-09-09 00:11:45 +02001308 if (PyModule_AddIntMacro(m, SIGQUIT))
1309 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001310#endif
1311#ifdef SIGILL
Christian Heimes6782b142016-09-09 00:11:45 +02001312 if (PyModule_AddIntMacro(m, SIGILL))
1313 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001314#endif
1315#ifdef SIGTRAP
Christian Heimes6782b142016-09-09 00:11:45 +02001316 if (PyModule_AddIntMacro(m, SIGTRAP))
1317 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001318#endif
1319#ifdef SIGIOT
Christian Heimes6782b142016-09-09 00:11:45 +02001320 if (PyModule_AddIntMacro(m, SIGIOT))
1321 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001322#endif
1323#ifdef SIGABRT
Christian Heimes6782b142016-09-09 00:11:45 +02001324 if (PyModule_AddIntMacro(m, SIGABRT))
1325 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001326#endif
1327#ifdef SIGEMT
Christian Heimes6782b142016-09-09 00:11:45 +02001328 if (PyModule_AddIntMacro(m, SIGEMT))
1329 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001330#endif
1331#ifdef SIGFPE
Christian Heimes6782b142016-09-09 00:11:45 +02001332 if (PyModule_AddIntMacro(m, SIGFPE))
1333 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001334#endif
1335#ifdef SIGKILL
Christian Heimes6782b142016-09-09 00:11:45 +02001336 if (PyModule_AddIntMacro(m, SIGKILL))
1337 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001338#endif
1339#ifdef SIGBUS
Christian Heimes6782b142016-09-09 00:11:45 +02001340 if (PyModule_AddIntMacro(m, SIGBUS))
1341 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001342#endif
1343#ifdef SIGSEGV
Christian Heimes6782b142016-09-09 00:11:45 +02001344 if (PyModule_AddIntMacro(m, SIGSEGV))
1345 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001346#endif
1347#ifdef SIGSYS
Christian Heimes6782b142016-09-09 00:11:45 +02001348 if (PyModule_AddIntMacro(m, SIGSYS))
1349 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001350#endif
1351#ifdef SIGPIPE
Christian Heimes6782b142016-09-09 00:11:45 +02001352 if (PyModule_AddIntMacro(m, SIGPIPE))
1353 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001354#endif
1355#ifdef SIGALRM
Christian Heimes6782b142016-09-09 00:11:45 +02001356 if (PyModule_AddIntMacro(m, SIGALRM))
1357 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001358#endif
1359#ifdef SIGTERM
Christian Heimes6782b142016-09-09 00:11:45 +02001360 if (PyModule_AddIntMacro(m, SIGTERM))
1361 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001362#endif
1363#ifdef SIGUSR1
Christian Heimes6782b142016-09-09 00:11:45 +02001364 if (PyModule_AddIntMacro(m, SIGUSR1))
1365 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001366#endif
1367#ifdef SIGUSR2
Christian Heimes6782b142016-09-09 00:11:45 +02001368 if (PyModule_AddIntMacro(m, SIGUSR2))
1369 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001370#endif
1371#ifdef SIGCLD
Christian Heimes6782b142016-09-09 00:11:45 +02001372 if (PyModule_AddIntMacro(m, SIGCLD))
1373 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001374#endif
1375#ifdef SIGCHLD
Christian Heimes6782b142016-09-09 00:11:45 +02001376 if (PyModule_AddIntMacro(m, SIGCHLD))
1377 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001378#endif
1379#ifdef SIGPWR
Christian Heimes6782b142016-09-09 00:11:45 +02001380 if (PyModule_AddIntMacro(m, SIGPWR))
1381 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001382#endif
1383#ifdef SIGIO
Christian Heimes6782b142016-09-09 00:11:45 +02001384 if (PyModule_AddIntMacro(m, SIGIO))
1385 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001386#endif
1387#ifdef SIGURG
Christian Heimes6782b142016-09-09 00:11:45 +02001388 if (PyModule_AddIntMacro(m, SIGURG))
1389 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001390#endif
1391#ifdef SIGWINCH
Christian Heimes6782b142016-09-09 00:11:45 +02001392 if (PyModule_AddIntMacro(m, SIGWINCH))
1393 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001394#endif
1395#ifdef SIGPOLL
Christian Heimes6782b142016-09-09 00:11:45 +02001396 if (PyModule_AddIntMacro(m, SIGPOLL))
1397 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001398#endif
1399#ifdef SIGSTOP
Christian Heimes6782b142016-09-09 00:11:45 +02001400 if (PyModule_AddIntMacro(m, SIGSTOP))
1401 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001402#endif
1403#ifdef SIGTSTP
Christian Heimes6782b142016-09-09 00:11:45 +02001404 if (PyModule_AddIntMacro(m, SIGTSTP))
1405 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001406#endif
1407#ifdef SIGCONT
Christian Heimes6782b142016-09-09 00:11:45 +02001408 if (PyModule_AddIntMacro(m, SIGCONT))
1409 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001410#endif
1411#ifdef SIGTTIN
Christian Heimes6782b142016-09-09 00:11:45 +02001412 if (PyModule_AddIntMacro(m, SIGTTIN))
1413 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001414#endif
1415#ifdef SIGTTOU
Christian Heimes6782b142016-09-09 00:11:45 +02001416 if (PyModule_AddIntMacro(m, SIGTTOU))
1417 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001418#endif
1419#ifdef SIGVTALRM
Christian Heimes6782b142016-09-09 00:11:45 +02001420 if (PyModule_AddIntMacro(m, SIGVTALRM))
1421 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001422#endif
1423#ifdef SIGPROF
Christian Heimes6782b142016-09-09 00:11:45 +02001424 if (PyModule_AddIntMacro(m, SIGPROF))
1425 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001426#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001427#ifdef SIGXCPU
Christian Heimes6782b142016-09-09 00:11:45 +02001428 if (PyModule_AddIntMacro(m, SIGXCPU))
1429 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001430#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001431#ifdef SIGXFSZ
Christian Heimes6782b142016-09-09 00:11:45 +02001432 if (PyModule_AddIntMacro(m, SIGXFSZ))
1433 goto finally;
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001434#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001435#ifdef SIGRTMIN
Christian Heimes6782b142016-09-09 00:11:45 +02001436 if (PyModule_AddIntMacro(m, SIGRTMIN))
1437 goto finally;
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001438#endif
1439#ifdef SIGRTMAX
Christian Heimes6782b142016-09-09 00:11:45 +02001440 if (PyModule_AddIntMacro(m, SIGRTMAX))
1441 goto finally;
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001442#endif
Martin v. Löwis175af252002-01-12 11:43:25 +00001443#ifdef SIGINFO
Christian Heimes6782b142016-09-09 00:11:45 +02001444 if (PyModule_AddIntMacro(m, SIGINFO))
1445 goto finally;
Martin v. Löwis175af252002-01-12 11:43:25 +00001446#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001447
1448#ifdef ITIMER_REAL
Christian Heimes6782b142016-09-09 00:11:45 +02001449 if (PyModule_AddIntMacro(m, ITIMER_REAL))
1450 goto finally;
Martin v. Löwis823725e2008-03-24 13:39:54 +00001451#endif
1452#ifdef ITIMER_VIRTUAL
Christian Heimes6782b142016-09-09 00:11:45 +02001453 if (PyModule_AddIntMacro(m, ITIMER_VIRTUAL))
1454 goto finally;
Martin v. Löwis823725e2008-03-24 13:39:54 +00001455#endif
1456#ifdef ITIMER_PROF
Christian Heimes6782b142016-09-09 00:11:45 +02001457 if (PyModule_AddIntMacro(m, ITIMER_PROF))
1458 goto finally;
Martin v. Löwis823725e2008-03-24 13:39:54 +00001459#endif
1460
1461#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 ItimerError = PyErr_NewException("signal.ItimerError",
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03001463 PyExc_OSError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +00001464 if (ItimerError != NULL)
Martin Panter6d57fe12016-09-17 03:26:16 +00001465 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +00001466#endif
1467
Brian Curtineb24d742010-04-12 17:16:38 +00001468#ifdef CTRL_C_EVENT
Christian Heimes6782b142016-09-09 00:11:45 +02001469 if (PyModule_AddIntMacro(m, CTRL_C_EVENT))
1470 goto finally;
Brian Curtineb24d742010-04-12 17:16:38 +00001471#endif
1472
1473#ifdef CTRL_BREAK_EVENT
Christian Heimes6782b142016-09-09 00:11:45 +02001474 if (PyModule_AddIntMacro(m, CTRL_BREAK_EVENT))
1475 goto finally;
Brian Curtineb24d742010-04-12 17:16:38 +00001476#endif
1477
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001478#ifdef MS_WINDOWS
1479 /* Create manual-reset event, initially unset */
1480 sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
1481#endif
1482
Martin v. Löwis1a214512008-06-11 05:26:20 +00001483 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 Py_DECREF(m);
1485 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001486 }
Barry Warsaw92971171997-01-03 00:14:25 +00001487
Barry Warsaw92971171997-01-03 00:14:25 +00001488 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001489 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +00001490}
1491
1492static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001493finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 int i;
1496 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 PyOS_setsig(SIGINT, old_siginthandler);
1499 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 for (i = 1; i < NSIG; i++) {
1502 func = Handlers[i].func;
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001503 _Py_atomic_store_relaxed(&Handlers[i].tripped, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 Handlers[i].func = NULL;
1505 if (i != SIGINT && func != NULL && func != Py_None &&
1506 func != DefaultHandler && func != IgnoreHandler)
1507 PyOS_setsig(i, SIG_DFL);
1508 Py_XDECREF(func);
1509 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001510
Serhiy Storchaka505ff752014-02-09 13:33:53 +02001511 Py_CLEAR(IntHandler);
1512 Py_CLEAR(DefaultHandler);
1513 Py_CLEAR(IgnoreHandler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001514}
1515
Barry Warsaw92971171997-01-03 00:14:25 +00001516
Barry Warsaw92971171997-01-03 00:14:25 +00001517/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001518int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001519PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 int i;
1522 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001523
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001524 if (!_Py_atomic_load(&is_tripped))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 if (PyThread_get_thread_ident() != main_thread)
1528 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 /*
1531 * The is_tripped variable is meant to speed up the calls to
1532 * PyErr_CheckSignals (both directly or via pending calls) when no
1533 * signal has arrived. This variable is set to 1 when a signal arrives
1534 * and it is set to 0 here, when we know some signals arrived. This way
1535 * we can run the registered handlers with no signals blocked.
1536 *
1537 * NOTE: with this approach we can have a situation where is_tripped is
1538 * 1 but we have no more signals to handle (Handlers[i].tripped
1539 * is 0 for every signal i). This won't do us any harm (except
1540 * we're gonna spent some cycles for nothing). This happens when
1541 * we receive a signal i after we zero is_tripped and before we
1542 * check Handlers[i].tripped.
1543 */
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001544 _Py_atomic_store(&is_tripped, 0);
Christian Heimesb76922a2007-12-11 01:06:40 +00001545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 if (!(f = (PyObject *)PyEval_GetFrame()))
1547 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 for (i = 1; i < NSIG; i++) {
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001550 if (_Py_atomic_load_relaxed(&Handlers[i].tripped)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 PyObject *result = NULL;
1552 PyObject *arglist = Py_BuildValue("(iO)", i, f);
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001553 _Py_atomic_store_relaxed(&Handlers[i].tripped, 0);
Barry Warsaw92971171997-01-03 00:14:25 +00001554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 if (arglist) {
1556 result = PyEval_CallObject(Handlers[i].func,
1557 arglist);
1558 Py_DECREF(arglist);
1559 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +02001560 if (!result) {
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001561 _Py_atomic_store(&is_tripped, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 return -1;
Antoine Pitrouc08177a2017-06-28 23:29:29 +02001563 }
Barry Warsaw92971171997-01-03 00:14:25 +00001564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 Py_DECREF(result);
1566 }
1567 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001570}
1571
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001572
Barry Warsaw92971171997-01-03 00:14:25 +00001573/* Replacements for intrcheck.c functionality
1574 * Declared in pyerrors.h
1575 */
1576void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001577PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001578{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001579 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001580}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001581
1582void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001583PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001584{
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001585 PyObject *m = PyImport_ImportModule("_signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 if (m) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 Py_DECREF(m);
1588 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001589}
1590
1591void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001592PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001595}
1596
1597int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001598PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001599{
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001600 if (_Py_atomic_load_relaxed(&Handlers[SIGINT].tripped)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 if (PyThread_get_thread_ident() != main_thread)
1602 return 0;
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001603 _Py_atomic_store_relaxed(&Handlers[SIGINT].tripped, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 return 1;
1605 }
1606 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001607}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001608
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001609static void
1610_clear_pending_signals(void)
1611{
1612 int i;
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001613 if (!_Py_atomic_load(&is_tripped))
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001614 return;
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001615 _Py_atomic_store(&is_tripped, 0);
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001616 for (i = 1; i < NSIG; ++i) {
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001617 _Py_atomic_store_relaxed(&Handlers[i].tripped, 0);
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001618 }
1619}
1620
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001621void
Antoine Pitrou346cbd32017-05-27 17:50:54 +02001622_PySignal_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001623{
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001624 /* Clear the signal flags after forking so that they aren't handled
1625 * in both processes if they came in just before the fork() but before
1626 * the interpreter had an opportunity to call the handlers. issue9535. */
1627 _clear_pending_signals();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 main_thread = PyThread_get_thread_ident();
1629 main_pid = getpid();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001630}
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001631
1632int
1633_PyOS_IsMainThread(void)
1634{
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001635 return PyThread_get_thread_ident() == main_thread;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001636}
1637
1638#ifdef MS_WINDOWS
1639void *_PyOS_SigintEvent(void)
1640{
1641 /* Returns a manual-reset event which gets tripped whenever
1642 SIGINT is received.
1643
1644 Python.h does not include windows.h so we do cannot use HANDLE
1645 as the return type of this function. We use void* instead. */
1646 return sigint_event;
1647}
1648#endif