blob: 7916160143840c59eefcfb01a408a33baa125283 [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
Antoine Pietri5d2a27d2018-03-12 14:42:34 +0100507
508/*[clinic input]
509signal.strsignal
510
511 signalnum: int
512 /
513
514Return the system description of the given signal.
515
516The return values can be such as "Interrupt", "Segmentation fault", etc.
517Returns None if the signal is not recognized.
518[clinic start generated code]*/
519
520static PyObject *
521signal_strsignal_impl(PyObject *module, int signalnum)
522/*[clinic end generated code: output=44e12e1e3b666261 input=b77914b03f856c74]*/
523{
524 char *res;
525
526 if (signalnum < 1 || signalnum >= NSIG) {
527 PyErr_SetString(PyExc_ValueError,
528 "signal number out of range");
529 return NULL;
530 }
531
532#ifdef MS_WINDOWS
533 /* Custom redefinition of POSIX signals allowed on Windows */
534 switch (signalnum) {
535 case SIGINT:
536 res = "Interrupt";
537 break;
538 case SIGILL:
539 res = "Illegal instruction";
540 break;
541 case SIGABRT:
542 res = "Aborted";
543 break;
544 case SIGFPE:
545 res = "Floating point exception";
546 break;
547 case SIGSEGV:
548 res = "Segmentation fault";
549 break;
550 case SIGTERM:
551 res = "Terminated";
552 break;
553 default:
554 Py_RETURN_NONE;
555 }
556#else
557 errno = 0;
558 res = strsignal(signalnum);
559
560 if (errno || res == NULL || strstr(res, "Unknown signal") != NULL)
561 Py_RETURN_NONE;
562#endif
563
564 return Py_BuildValue("s", res);
565}
566
Christian Heimes8640e742008-02-23 16:23:06 +0000567#ifdef HAVE_SIGINTERRUPT
Tal Einatc7027b72015-05-16 14:14:49 +0300568
569/*[clinic input]
570signal.siginterrupt
571
572 signalnum: int
573 flag: int
574 /
575
576Change system call restart behaviour.
577
578If flag is False, system calls will be restarted when interrupted by
579signal sig, else system calls will be interrupted.
580[clinic start generated code]*/
Christian Heimes8640e742008-02-23 16:23:06 +0000581
582static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300583signal_siginterrupt_impl(PyObject *module, int signalnum, int flag)
584/*[clinic end generated code: output=063816243d85dd19 input=4160acacca3e2099]*/
Christian Heimes8640e742008-02-23 16:23:06 +0000585{
Tal Einatc7027b72015-05-16 14:14:49 +0300586 if (signalnum < 1 || signalnum >= NSIG) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 PyErr_SetString(PyExc_ValueError,
588 "signal number out of range");
589 return NULL;
590 }
Tal Einatc7027b72015-05-16 14:14:49 +0300591 if (siginterrupt(signalnum, flag)<0) {
Victor Stinner388196e2011-05-10 17:13:00 +0200592 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 return NULL;
594 }
Tal Einatc7027b72015-05-16 14:14:49 +0300595 Py_RETURN_NONE;
Christian Heimes8640e742008-02-23 16:23:06 +0000596}
597
598#endif
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +0000599
Tal Einatc7027b72015-05-16 14:14:49 +0300600
601static PyObject*
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800602signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds)
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000603{
Victor Stinnere134a7f2015-03-30 10:09:31 +0200604 struct _Py_stat_struct status;
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800605 static char *kwlist[] = {
606 "", "warn_on_full_buffer", NULL,
607 };
608 int warn_on_full_buffer = 1;
Victor Stinner11517102014-07-29 23:31:34 +0200609#ifdef MS_WINDOWS
610 PyObject *fdobj;
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100611 SOCKET_T sockfd, old_sockfd;
Victor Stinner11517102014-07-29 23:31:34 +0200612 int res;
613 int res_size = sizeof res;
614 PyObject *mod;
Victor Stinner11517102014-07-29 23:31:34 +0200615 int is_socket;
616
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800617 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|$p:set_wakeup_fd", kwlist,
618 &fdobj, &warn_on_full_buffer))
Victor Stinner11517102014-07-29 23:31:34 +0200619 return NULL;
620
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100621 sockfd = PyLong_AsSocket_t(fdobj);
622 if (sockfd == (SOCKET_T)(-1) && PyErr_Occurred())
Victor Stinner11517102014-07-29 23:31:34 +0200623 return NULL;
624#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 int fd, old_fd;
Victor Stinner11517102014-07-29 23:31:34 +0200626
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800627 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i|$p:set_wakeup_fd", kwlist,
628 &fd, &warn_on_full_buffer))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 return NULL;
Victor Stinner11517102014-07-29 23:31:34 +0200630#endif
631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 if (PyThread_get_thread_ident() != main_thread) {
633 PyErr_SetString(PyExc_ValueError,
634 "set_wakeup_fd only works in main thread");
635 return NULL;
636 }
Victor Stinner0bffc942014-07-21 16:28:54 +0200637
Victor Stinner11517102014-07-29 23:31:34 +0200638#ifdef MS_WINDOWS
639 is_socket = 0;
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100640 if (sockfd != INVALID_FD) {
Victor Stinner11517102014-07-29 23:31:34 +0200641 /* Import the _socket module to call WSAStartup() */
642 mod = PyImport_ImportModuleNoBlock("_socket");
643 if (mod == NULL)
644 return NULL;
645 Py_DECREF(mod);
646
647 /* test the socket */
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100648 if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
Victor Stinner11517102014-07-29 23:31:34 +0200649 (char *)&res, &res_size) != 0) {
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100650 int fd, err;
651
652 err = WSAGetLastError();
Victor Stinner11517102014-07-29 23:31:34 +0200653 if (err != WSAENOTSOCK) {
654 PyErr_SetExcFromWindowsErr(PyExc_OSError, err);
655 return NULL;
656 }
657
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100658 fd = (int)sockfd;
Steve Dower940f33a2016-09-08 11:21:54 -0700659 if ((SOCKET_T)fd != sockfd) {
Victor Stinner11517102014-07-29 23:31:34 +0200660 PyErr_SetString(PyExc_ValueError, "invalid fd");
661 return NULL;
662 }
663
Victor Stinnere134a7f2015-03-30 10:09:31 +0200664 if (_Py_fstat(fd, &status) != 0)
Victor Stinner11517102014-07-29 23:31:34 +0200665 return NULL;
Victor Stinner38227602014-08-27 12:59:44 +0200666
667 /* on Windows, a file cannot be set to non-blocking mode */
Victor Stinner11517102014-07-29 23:31:34 +0200668 }
Victor Stinner38227602014-08-27 12:59:44 +0200669 else {
Victor Stinner11517102014-07-29 23:31:34 +0200670 is_socket = 1;
Victor Stinner38227602014-08-27 12:59:44 +0200671
672 /* Windows does not provide a function to test if a socket
673 is in non-blocking mode */
674 }
Victor Stinner11517102014-07-29 23:31:34 +0200675 }
676
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100677 old_sockfd = wakeup.fd;
678 wakeup.fd = sockfd;
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800679 wakeup.warn_on_full_buffer = warn_on_full_buffer;
Victor Stinner11517102014-07-29 23:31:34 +0200680 wakeup.use_send = is_socket;
681
Victor Stinnercf40a9e2015-02-12 16:34:54 +0100682 if (old_sockfd != INVALID_FD)
683 return PyLong_FromSocket_t(old_sockfd);
Victor Stinner11517102014-07-29 23:31:34 +0200684 else
685 return PyLong_FromLong(-1);
686#else
Victor Stinnerd18ccd12014-07-24 21:58:53 +0200687 if (fd != -1) {
Victor Stinner38227602014-08-27 12:59:44 +0200688 int blocking;
689
Victor Stinnere134a7f2015-03-30 10:09:31 +0200690 if (_Py_fstat(fd, &status) != 0)
Victor Stinner11517102014-07-29 23:31:34 +0200691 return NULL;
Victor Stinner38227602014-08-27 12:59:44 +0200692
693 blocking = _Py_get_blocking(fd);
694 if (blocking < 0)
695 return NULL;
696 if (blocking) {
697 PyErr_Format(PyExc_ValueError,
698 "the fd %i must be in non-blocking mode",
699 fd);
700 return NULL;
701 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 }
Victor Stinner0bffc942014-07-21 16:28:54 +0200703
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800704 old_fd = wakeup.fd;
705 wakeup.fd = fd;
706 wakeup.warn_on_full_buffer = warn_on_full_buffer;
Victor Stinner0bffc942014-07-21 16:28:54 +0200707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 return PyLong_FromLong(old_fd);
Victor Stinner11517102014-07-29 23:31:34 +0200709#endif
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000710}
711
712PyDoc_STRVAR(set_wakeup_fd_doc,
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800713"set_wakeup_fd(fd, *, warn_on_full_buffer=True) -> fd\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000714\n\
Victor Stinner11517102014-07-29 23:31:34 +0200715Sets the fd to be written to (with the signal number) when a signal\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000716comes in. A library can use this to wakeup select or poll.\n\
Victor Stinner11517102014-07-29 23:31:34 +0200717The previous fd or -1 is returned.\n\
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000718\n\
719The fd must be non-blocking.");
720
721/* C API for the same, without all the error checking */
722int
723PySignal_SetWakeupFd(int fd)
724{
Victor Stinner11517102014-07-29 23:31:34 +0200725 int old_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 if (fd < 0)
727 fd = -1;
Victor Stinner11517102014-07-29 23:31:34 +0200728
729#ifdef MS_WINDOWS
730 old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int);
Victor Stinner11517102014-07-29 23:31:34 +0200731#else
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800732 old_fd = wakeup.fd;
Victor Stinner11517102014-07-29 23:31:34 +0200733#endif
Nathaniel J. Smith902ab802017-12-17 20:10:18 -0800734 wakeup.fd = fd;
735 wakeup.warn_on_full_buffer = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 return old_fd;
Christian Heimes5fb7c2a2007-12-24 08:52:31 +0000737}
738
739
Martin v. Löwis823725e2008-03-24 13:39:54 +0000740#ifdef HAVE_SETITIMER
Tal Einatc7027b72015-05-16 14:14:49 +0300741
742/*[clinic input]
743signal.setitimer
744
745 which: int
Victor Stinneref611c92017-10-13 13:49:43 -0700746 seconds: object
747 interval: object(c_default="NULL") = 0.0
Tal Einatc7027b72015-05-16 14:14:49 +0300748 /
749
750Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL or ITIMER_PROF).
751
752The timer will fire after value seconds and after that every interval seconds.
753The itimer can be cleared by setting seconds to zero.
754
755Returns old values as a tuple: (delay, interval).
756[clinic start generated code]*/
757
Martin v. Löwis823725e2008-03-24 13:39:54 +0000758static PyObject *
Victor Stinneref611c92017-10-13 13:49:43 -0700759signal_setitimer_impl(PyObject *module, int which, PyObject *seconds,
760 PyObject *interval)
761/*[clinic end generated code: output=65f9dcbddc35527b input=de43daf194e6f66f]*/
Martin v. Löwis823725e2008-03-24 13:39:54 +0000762{
Martin v. Löwis823725e2008-03-24 13:39:54 +0000763 struct itimerval new, old;
764
Victor Stinneref611c92017-10-13 13:49:43 -0700765 if (timeval_from_double(seconds, &new.it_value) < 0) {
766 return NULL;
767 }
768 if (timeval_from_double(interval, &new.it_interval) < 0) {
769 return NULL;
770 }
771
Martin v. Löwis823725e2008-03-24 13:39:54 +0000772 /* Let OS check "which" value */
773 if (setitimer(which, &new, &old) != 0) {
Tal Einatc7027b72015-05-16 14:14:49 +0300774 PyErr_SetFromErrno(ItimerError);
775 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000776 }
777
778 return itimer_retval(&old);
779}
780
Martin v. Löwis823725e2008-03-24 13:39:54 +0000781#endif
782
783
784#ifdef HAVE_GETITIMER
Tal Einatc7027b72015-05-16 14:14:49 +0300785
786/*[clinic input]
787signal.getitimer
788
789 which: int
790 /
791
792Returns current value of given itimer.
793[clinic start generated code]*/
794
Martin v. Löwis823725e2008-03-24 13:39:54 +0000795static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300796signal_getitimer_impl(PyObject *module, int which)
797/*[clinic end generated code: output=9e053175d517db40 input=f7d21d38f3490627]*/
Martin v. Löwis823725e2008-03-24 13:39:54 +0000798{
Martin v. Löwis823725e2008-03-24 13:39:54 +0000799 struct itimerval old;
800
Martin v. Löwis823725e2008-03-24 13:39:54 +0000801 if (getitimer(which, &old) != 0) {
Tal Einatc7027b72015-05-16 14:14:49 +0300802 PyErr_SetFromErrno(ItimerError);
803 return NULL;
Martin v. Löwis823725e2008-03-24 13:39:54 +0000804 }
805
806 return itimer_retval(&old);
807}
808
Martin v. Löwis823725e2008-03-24 13:39:54 +0000809#endif
810
Ross Lagerwallbc808222011-06-25 12:13:40 +0200811#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \
812 defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinnera9293352011-04-30 15:21:58 +0200813/* Convert an iterable to a sigset.
814 Return 0 on success, return -1 and raise an exception on error. */
815
816static int
817iterable_to_sigset(PyObject *iterable, sigset_t *mask)
818{
819 int result = -1;
820 PyObject *iterator, *item;
821 long signum;
822 int err;
823
824 sigemptyset(mask);
825
826 iterator = PyObject_GetIter(iterable);
827 if (iterator == NULL)
828 goto error;
829
830 while (1)
831 {
832 item = PyIter_Next(iterator);
833 if (item == NULL) {
834 if (PyErr_Occurred())
835 goto error;
836 else
837 break;
838 }
839
840 signum = PyLong_AsLong(item);
841 Py_DECREF(item);
842 if (signum == -1 && PyErr_Occurred())
843 goto error;
844 if (0 < signum && signum < NSIG)
845 err = sigaddset(mask, (int)signum);
846 else
847 err = 1;
848 if (err) {
849 PyErr_Format(PyExc_ValueError,
850 "signal number %ld out of range", signum);
851 goto error;
852 }
853 }
854 result = 0;
855
856error:
857 Py_XDECREF(iterator);
858 return result;
859}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200860#endif
Victor Stinnera9293352011-04-30 15:21:58 +0200861
Victor Stinnerb3e72192011-05-08 01:46:11 +0200862#if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGPENDING)
Victor Stinner35b300c2011-05-04 13:20:35 +0200863static PyObject*
864sigset_to_set(sigset_t mask)
865{
866 PyObject *signum, *result;
867 int sig;
868
869 result = PySet_New(0);
870 if (result == NULL)
871 return NULL;
872
873 for (sig = 1; sig < NSIG; sig++) {
874 if (sigismember(&mask, sig) != 1)
875 continue;
876
877 /* Handle the case where it is a member by adding the signal to
878 the result list. Ignore the other cases because they mean the
879 signal isn't a member of the mask or the signal was invalid,
880 and an invalid signal must have been our fault in constructing
881 the loop boundaries. */
882 signum = PyLong_FromLong(sig);
883 if (signum == NULL) {
884 Py_DECREF(result);
885 return NULL;
886 }
887 if (PySet_Add(result, signum) == -1) {
888 Py_DECREF(signum);
889 Py_DECREF(result);
890 return NULL;
891 }
892 Py_DECREF(signum);
893 }
894 return result;
895}
Victor Stinnerb3e72192011-05-08 01:46:11 +0200896#endif
Victor Stinner35b300c2011-05-04 13:20:35 +0200897
Victor Stinnerb3e72192011-05-08 01:46:11 +0200898#ifdef PYPTHREAD_SIGMASK
Tal Einatc7027b72015-05-16 14:14:49 +0300899
900/*[clinic input]
901signal.pthread_sigmask
902
903 how: int
904 mask: object
905 /
906
907Fetch and/or change the signal mask of the calling thread.
908[clinic start generated code]*/
909
Victor Stinnera9293352011-04-30 15:21:58 +0200910static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300911signal_pthread_sigmask_impl(PyObject *module, int how, PyObject *mask)
912/*[clinic end generated code: output=ff640fe092bc9181 input=f3b7d7a61b7b8283]*/
Victor Stinnera9293352011-04-30 15:21:58 +0200913{
Tal Einatc7027b72015-05-16 14:14:49 +0300914 sigset_t newmask, previous;
Victor Stinnera9293352011-04-30 15:21:58 +0200915 int err;
916
Tal Einatc7027b72015-05-16 14:14:49 +0300917 if (iterable_to_sigset(mask, &newmask))
Victor Stinnera9293352011-04-30 15:21:58 +0200918 return NULL;
919
Tal Einatc7027b72015-05-16 14:14:49 +0300920 err = pthread_sigmask(how, &newmask, &previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200921 if (err != 0) {
922 errno = err;
Victor Stinnerb3e72192011-05-08 01:46:11 +0200923 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnera9293352011-04-30 15:21:58 +0200924 return NULL;
925 }
926
Victor Stinnerd0e516d2011-05-03 14:57:12 +0200927 /* if signals was unblocked, signal handlers have been called */
928 if (PyErr_CheckSignals())
929 return NULL;
930
Victor Stinner35b300c2011-05-04 13:20:35 +0200931 return sigset_to_set(previous);
Victor Stinnera9293352011-04-30 15:21:58 +0200932}
933
Victor Stinnera9293352011-04-30 15:21:58 +0200934#endif /* #ifdef PYPTHREAD_SIGMASK */
935
Martin v. Löwis823725e2008-03-24 13:39:54 +0000936
Victor Stinnerb3e72192011-05-08 01:46:11 +0200937#ifdef HAVE_SIGPENDING
Tal Einatc7027b72015-05-16 14:14:49 +0300938
939/*[clinic input]
940signal.sigpending
941
942Examine pending signals.
943
944Returns a set of signal numbers that are pending for delivery to
945the calling thread.
946[clinic start generated code]*/
947
Victor Stinnerb3e72192011-05-08 01:46:11 +0200948static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300949signal_sigpending_impl(PyObject *module)
950/*[clinic end generated code: output=53375ffe89325022 input=e0036c016f874e29]*/
Victor Stinnerb3e72192011-05-08 01:46:11 +0200951{
952 int err;
953 sigset_t mask;
954 err = sigpending(&mask);
955 if (err)
956 return PyErr_SetFromErrno(PyExc_OSError);
957 return sigset_to_set(mask);
958}
959
Victor Stinnerb3e72192011-05-08 01:46:11 +0200960#endif /* #ifdef HAVE_SIGPENDING */
961
962
963#ifdef HAVE_SIGWAIT
Tal Einatc7027b72015-05-16 14:14:49 +0300964
965/*[clinic input]
966signal.sigwait
967
968 sigset: object
969 /
970
971Wait for a signal.
972
973Suspend execution of the calling thread until the delivery of one of the
974signals specified in the signal set sigset. The function accepts the signal
975and returns the signal number.
976[clinic start generated code]*/
977
Victor Stinnerb3e72192011-05-08 01:46:11 +0200978static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300979signal_sigwait(PyObject *module, PyObject *sigset)
980/*[clinic end generated code: output=557173647424f6e4 input=11af2d82d83c2e94]*/
Victor Stinnerb3e72192011-05-08 01:46:11 +0200981{
Victor Stinnerb3e72192011-05-08 01:46:11 +0200982 sigset_t set;
983 int err, signum;
984
Tal Einatc7027b72015-05-16 14:14:49 +0300985 if (iterable_to_sigset(sigset, &set))
Victor Stinnerb3e72192011-05-08 01:46:11 +0200986 return NULL;
987
Victor Stinner10c30d62011-06-10 01:39:53 +0200988 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200989 err = sigwait(&set, &signum);
Victor Stinner10c30d62011-06-10 01:39:53 +0200990 Py_END_ALLOW_THREADS
Victor Stinnerb3e72192011-05-08 01:46:11 +0200991 if (err) {
992 errno = err;
993 return PyErr_SetFromErrno(PyExc_OSError);
994 }
995
996 return PyLong_FromLong(signum);
997}
998
Tal Einatc7027b72015-05-16 14:14:49 +0300999#endif /* #ifdef HAVE_SIGWAIT */
1000
Victor Stinnerb3e72192011-05-08 01:46:11 +02001001
Ross Lagerwallbc808222011-06-25 12:13:40 +02001002#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
1003static int initialized;
1004static PyStructSequence_Field struct_siginfo_fields[] = {
1005 {"si_signo", "signal number"},
1006 {"si_code", "signal code"},
1007 {"si_errno", "errno associated with this signal"},
1008 {"si_pid", "sending process ID"},
1009 {"si_uid", "real user ID of sending process"},
1010 {"si_status", "exit value or signal"},
1011 {"si_band", "band event for SIGPOLL"},
1012 {0}
1013};
1014
1015PyDoc_STRVAR(struct_siginfo__doc__,
1016"struct_siginfo: Result from sigwaitinfo or sigtimedwait.\n\n\
1017This object may be accessed either as a tuple of\n\
1018(si_signo, si_code, si_errno, si_pid, si_uid, si_status, si_band),\n\
1019or via the attributes si_signo, si_code, and so on.");
1020
1021static PyStructSequence_Desc struct_siginfo_desc = {
1022 "signal.struct_siginfo", /* name */
1023 struct_siginfo__doc__, /* doc */
1024 struct_siginfo_fields, /* fields */
1025 7 /* n_in_sequence */
1026};
1027
1028static PyTypeObject SiginfoType;
1029
1030static PyObject *
1031fill_siginfo(siginfo_t *si)
1032{
1033 PyObject *result = PyStructSequence_New(&SiginfoType);
1034 if (!result)
1035 return NULL;
1036
1037 PyStructSequence_SET_ITEM(result, 0, PyLong_FromLong((long)(si->si_signo)));
1038 PyStructSequence_SET_ITEM(result, 1, PyLong_FromLong((long)(si->si_code)));
1039 PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong((long)(si->si_errno)));
1040 PyStructSequence_SET_ITEM(result, 3, PyLong_FromPid(si->si_pid));
Serhiy Storchaka7cf55992013-02-10 21:56:49 +02001041 PyStructSequence_SET_ITEM(result, 4, _PyLong_FromUid(si->si_uid));
Ross Lagerwallbc808222011-06-25 12:13:40 +02001042 PyStructSequence_SET_ITEM(result, 5,
1043 PyLong_FromLong((long)(si->si_status)));
Zachary Ware6a6967e2016-10-01 00:47:27 -05001044#ifdef HAVE_SIGINFO_T_SI_BAND
Ross Lagerwallbc808222011-06-25 12:13:40 +02001045 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
Zachary Ware6a6967e2016-10-01 00:47:27 -05001046#else
1047 PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(0L));
1048#endif
Ross Lagerwallbc808222011-06-25 12:13:40 +02001049 if (PyErr_Occurred()) {
1050 Py_DECREF(result);
1051 return NULL;
1052 }
1053
1054 return result;
1055}
1056#endif
1057
1058#ifdef HAVE_SIGWAITINFO
Tal Einatc7027b72015-05-16 14:14:49 +03001059
1060/*[clinic input]
1061signal.sigwaitinfo
1062
1063 sigset: object
1064 /
1065
1066Wait synchronously until one of the signals in *sigset* is delivered.
1067
1068Returns a struct_siginfo containing information about the signal.
1069[clinic start generated code]*/
1070
Ross Lagerwallbc808222011-06-25 12:13:40 +02001071static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001072signal_sigwaitinfo(PyObject *module, PyObject *sigset)
1073/*[clinic end generated code: output=c40f27b269cd2309 input=f3779a74a991e171]*/
Ross Lagerwallbc808222011-06-25 12:13:40 +02001074{
Ross Lagerwallbc808222011-06-25 12:13:40 +02001075 sigset_t set;
1076 siginfo_t si;
1077 int err;
Victor Stinnera453cd82015-03-20 12:54:28 +01001078 int async_err = 0;
Ross Lagerwallbc808222011-06-25 12:13:40 +02001079
Tal Einatc7027b72015-05-16 14:14:49 +03001080 if (iterable_to_sigset(sigset, &set))
Ross Lagerwallbc808222011-06-25 12:13:40 +02001081 return NULL;
1082
Victor Stinnera453cd82015-03-20 12:54:28 +01001083 do {
1084 Py_BEGIN_ALLOW_THREADS
1085 err = sigwaitinfo(&set, &si);
1086 Py_END_ALLOW_THREADS
1087 } while (err == -1
1088 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Ross Lagerwallbc808222011-06-25 12:13:40 +02001089 if (err == -1)
Victor Stinnera453cd82015-03-20 12:54:28 +01001090 return (!async_err) ? PyErr_SetFromErrno(PyExc_OSError) : NULL;
Ross Lagerwallbc808222011-06-25 12:13:40 +02001091
1092 return fill_siginfo(&si);
1093}
1094
Ross Lagerwallbc808222011-06-25 12:13:40 +02001095#endif /* #ifdef HAVE_SIGWAITINFO */
1096
1097#ifdef HAVE_SIGTIMEDWAIT
Tal Einatc7027b72015-05-16 14:14:49 +03001098
1099/*[clinic input]
1100signal.sigtimedwait
1101
1102 sigset: object
Serhiy Storchaka6b680cd2015-05-16 15:57:56 +03001103 timeout as timeout_obj: object
Tal Einatc7027b72015-05-16 14:14:49 +03001104 /
1105
1106Like sigwaitinfo(), but with a timeout.
1107
1108The timeout is specified in seconds, with floating point numbers allowed.
1109[clinic start generated code]*/
1110
Ross Lagerwallbc808222011-06-25 12:13:40 +02001111static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001112signal_sigtimedwait_impl(PyObject *module, PyObject *sigset,
Serhiy Storchaka6b680cd2015-05-16 15:57:56 +03001113 PyObject *timeout_obj)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001114/*[clinic end generated code: output=f7eff31e679f4312 input=53fd4ea3e3724eb8]*/
Ross Lagerwallbc808222011-06-25 12:13:40 +02001115{
Victor Stinnera453cd82015-03-20 12:54:28 +01001116 struct timespec ts;
Ross Lagerwallbc808222011-06-25 12:13:40 +02001117 sigset_t set;
1118 siginfo_t si;
Victor Stinnera453cd82015-03-20 12:54:28 +01001119 int res;
Victor Stinner34dc0f42015-03-27 18:19:03 +01001120 _PyTime_t timeout, deadline, monotonic;
Ross Lagerwallbc808222011-06-25 12:13:40 +02001121
Victor Stinner869e1772015-03-30 03:49:14 +02001122 if (_PyTime_FromSecondsObject(&timeout,
1123 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Ross Lagerwallbc808222011-06-25 12:13:40 +02001124 return NULL;
1125
Victor Stinnera453cd82015-03-20 12:54:28 +01001126 if (timeout < 0) {
Ross Lagerwallbc808222011-06-25 12:13:40 +02001127 PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
1128 return NULL;
1129 }
1130
Tal Einatc7027b72015-05-16 14:14:49 +03001131 if (iterable_to_sigset(sigset, &set))
Ross Lagerwallbc808222011-06-25 12:13:40 +02001132 return NULL;
1133
Victor Stinner34dc0f42015-03-27 18:19:03 +01001134 deadline = _PyTime_GetMonotonicClock() + timeout;
Victor Stinnera453cd82015-03-20 12:54:28 +01001135
1136 do {
Victor Stinner34dc0f42015-03-27 18:19:03 +01001137 if (_PyTime_AsTimespec(timeout, &ts) < 0)
1138 return NULL;
Victor Stinnera453cd82015-03-20 12:54:28 +01001139
1140 Py_BEGIN_ALLOW_THREADS
1141 res = sigtimedwait(&set, &si, &ts);
1142 Py_END_ALLOW_THREADS
1143
1144 if (res != -1)
1145 break;
1146
1147 if (errno != EINTR) {
1148 if (errno == EAGAIN)
1149 Py_RETURN_NONE;
1150 else
1151 return PyErr_SetFromErrno(PyExc_OSError);
1152 }
1153
1154 /* sigtimedwait() was interrupted by a signal (EINTR) */
1155 if (PyErr_CheckSignals())
1156 return NULL;
1157
Victor Stinner34dc0f42015-03-27 18:19:03 +01001158 monotonic = _PyTime_GetMonotonicClock();
1159 timeout = deadline - monotonic;
Victor Stinner6aa446c2015-03-30 21:33:51 +02001160 if (timeout < 0)
Victor Stinnera453cd82015-03-20 12:54:28 +01001161 break;
1162 } while (1);
Ross Lagerwallbc808222011-06-25 12:13:40 +02001163
1164 return fill_siginfo(&si);
1165}
1166
Ross Lagerwallbc808222011-06-25 12:13:40 +02001167#endif /* #ifdef HAVE_SIGTIMEDWAIT */
1168
Victor Stinnerb3e72192011-05-08 01:46:11 +02001169
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02001170#if defined(HAVE_PTHREAD_KILL)
Tal Einatc7027b72015-05-16 14:14:49 +03001171
1172/*[clinic input]
1173signal.pthread_kill
1174
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001175 thread_id: unsigned_long(bitwise=True)
Tal Einatc7027b72015-05-16 14:14:49 +03001176 signalnum: int
1177 /
1178
1179Send a signal to a thread.
1180[clinic start generated code]*/
1181
Victor Stinnerb3e72192011-05-08 01:46:11 +02001182static PyObject *
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001183signal_pthread_kill_impl(PyObject *module, unsigned long thread_id,
1184 int signalnum)
1185/*[clinic end generated code: output=7629919b791bc27f input=1d901f2c7bb544ff]*/
Victor Stinnerb3e72192011-05-08 01:46:11 +02001186{
Victor Stinnerb3e72192011-05-08 01:46:11 +02001187 int err;
1188
Tal Einatc7027b72015-05-16 14:14:49 +03001189 err = pthread_kill((pthread_t)thread_id, signalnum);
Victor Stinnerb3e72192011-05-08 01:46:11 +02001190 if (err != 0) {
1191 errno = err;
1192 PyErr_SetFromErrno(PyExc_OSError);
1193 return NULL;
1194 }
1195
1196 /* the signal may have been send to the current thread */
1197 if (PyErr_CheckSignals())
1198 return NULL;
1199
1200 Py_RETURN_NONE;
1201}
1202
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02001203#endif /* #if defined(HAVE_PTHREAD_KILL) */
Victor Stinnerb3e72192011-05-08 01:46:11 +02001204
1205
1206
Tal Einatc7027b72015-05-16 14:14:49 +03001207/* List of functions defined in the module -- some of the methoddefs are
1208 defined to nothing if the corresponding C function is not available. */
Barry Warsaw92971171997-01-03 00:14:25 +00001209static PyMethodDef signal_methods[] = {
Tal Einatc7027b72015-05-16 14:14:49 +03001210 {"default_int_handler", signal_default_int_handler, METH_VARARGS, default_int_handler_doc},
1211 SIGNAL_ALARM_METHODDEF
1212 SIGNAL_SETITIMER_METHODDEF
1213 SIGNAL_GETITIMER_METHODDEF
1214 SIGNAL_SIGNAL_METHODDEF
Antoine Pietri5d2a27d2018-03-12 14:42:34 +01001215 SIGNAL_STRSIGNAL_METHODDEF
Tal Einatc7027b72015-05-16 14:14:49 +03001216 SIGNAL_GETSIGNAL_METHODDEF
Nathaniel J. Smith902ab802017-12-17 20:10:18 -08001217 {"set_wakeup_fd", (PyCFunction)signal_set_wakeup_fd, METH_VARARGS | METH_KEYWORDS, set_wakeup_fd_doc},
Tal Einatc7027b72015-05-16 14:14:49 +03001218 SIGNAL_SIGINTERRUPT_METHODDEF
1219 SIGNAL_PAUSE_METHODDEF
1220 SIGNAL_PTHREAD_KILL_METHODDEF
1221 SIGNAL_PTHREAD_SIGMASK_METHODDEF
1222 SIGNAL_SIGPENDING_METHODDEF
1223 SIGNAL_SIGWAIT_METHODDEF
1224 SIGNAL_SIGWAITINFO_METHODDEF
1225 SIGNAL_SIGTIMEDWAIT_METHODDEF
1226 {NULL, NULL} /* sentinel */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001227};
1228
Barry Warsaw92971171997-01-03 00:14:25 +00001229
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001230PyDoc_STRVAR(module_doc,
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001231"This module provides mechanisms to use signal handlers in Python.\n\
1232\n\
1233Functions:\n\
1234\n\
1235alarm() -- cause SIGALRM after a specified time [Unix only]\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001236setitimer() -- cause a signal (described below) after a specified\n\
1237 float time and the timer may restart then [Unix only]\n\
1238getitimer() -- get current value of timer [Unix only]\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001239signal() -- set the action for a given signal\n\
1240getsignal() -- get the signal action for a given signal\n\
1241pause() -- wait until a signal arrives [Unix only]\n\
1242default_int_handler() -- default SIGINT handler\n\
1243\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001244signal constants:\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001245SIG_DFL -- used to refer to the system default handler\n\
1246SIG_IGN -- used to ignore the signal\n\
1247NSIG -- number of defined signals\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001248SIGINT, SIGTERM, etc. -- signal numbers\n\
1249\n\
Martin v. Löwis823725e2008-03-24 13:39:54 +00001250itimer constants:\n\
1251ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\
1252 expiration\n\
1253ITIMER_VIRTUAL -- decrements only when the process is executing,\n\
1254 and delivers SIGVTALRM upon expiration\n\
1255ITIMER_PROF -- decrements both when the process is executing and\n\
1256 when the system is executing on behalf of the process.\n\
1257 Coupled with ITIMER_VIRTUAL, this timer is usually\n\
1258 used to profile the time spent by the application\n\
1259 in user and kernel space. SIGPROF is delivered upon\n\
1260 expiration.\n\
1261\n\n\
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001262*** IMPORTANT NOTICE ***\n\
1263A signal handler function is called with two arguments:\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001264the first is the signal number, the second is the interrupted stack frame.");
Guido van Rossum1d8fb2d1998-06-28 16:54:49 +00001265
Martin v. Löwis1a214512008-06-11 05:26:20 +00001266static struct PyModuleDef signalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 PyModuleDef_HEAD_INIT,
Brett Cannon815a6f32014-04-04 10:20:28 -04001268 "_signal",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 module_doc,
1270 -1,
1271 signal_methods,
1272 NULL,
1273 NULL,
1274 NULL,
1275 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001276};
1277
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001278PyMODINIT_FUNC
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001279PyInit__signal(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 PyObject *m, *d, *x;
1282 int i;
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 main_thread = PyThread_get_thread_ident();
1285 main_pid = getpid();
Guido van Rossumbb4ba121994-06-23 11:25:45 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 /* Create the module and add the functions */
1288 m = PyModule_Create(&signalmodule);
1289 if (m == NULL)
1290 return NULL;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001291
Ross Lagerwallbc808222011-06-25 12:13:40 +02001292#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
Victor Stinner1c8f0592013-07-22 22:24:54 +02001293 if (!initialized) {
1294 if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0)
1295 return NULL;
1296 }
Ross Lagerwallbc808222011-06-25 12:13:40 +02001297 Py_INCREF((PyObject*) &SiginfoType);
1298 PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
1299 initialized = 1;
1300#endif
1301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 /* Add some symbolic constants to the module */
1303 d = PyModule_GetDict(m);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);
1306 if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)
1307 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
1310 if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
1311 goto finally;
Barry Warsaw92971171997-01-03 00:14:25 +00001312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 x = PyLong_FromLong((long)NSIG);
1314 if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
1315 goto finally;
1316 Py_DECREF(x);
Barry Warsaw92971171997-01-03 00:14:25 +00001317
Victor Stinnera9293352011-04-30 15:21:58 +02001318#ifdef SIG_BLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001319 if (PyModule_AddIntMacro(m, SIG_BLOCK))
1320 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001321#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001322#ifdef SIG_UNBLOCK
Victor Stinner72c53b52011-05-02 16:15:43 +02001323 if (PyModule_AddIntMacro(m, SIG_UNBLOCK))
1324 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001325#endif
Victor Stinnera9293352011-04-30 15:21:58 +02001326#ifdef SIG_SETMASK
Victor Stinner72c53b52011-05-02 16:15:43 +02001327 if (PyModule_AddIntMacro(m, SIG_SETMASK))
1328 goto finally;
Victor Stinnera9293352011-04-30 15:21:58 +02001329#endif
1330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
1332 if (!x)
1333 goto finally;
1334 Py_INCREF(IntHandler);
Barry Warsaw92971171997-01-03 00:14:25 +00001335
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001336 _Py_atomic_store_relaxed(&Handlers[0].tripped, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 for (i = 1; i < NSIG; i++) {
1338 void (*t)(int);
1339 t = PyOS_getsig(i);
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001340 _Py_atomic_store_relaxed(&Handlers[i].tripped, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 if (t == SIG_DFL)
1342 Handlers[i].func = DefaultHandler;
1343 else if (t == SIG_IGN)
1344 Handlers[i].func = IgnoreHandler;
1345 else
1346 Handlers[i].func = Py_None; /* None of our business */
1347 Py_INCREF(Handlers[i].func);
1348 }
1349 if (Handlers[SIGINT].func == DefaultHandler) {
1350 /* Install default int handler */
1351 Py_INCREF(IntHandler);
Serhiy Storchaka57a01d32016-04-10 18:05:40 +03001352 Py_SETREF(Handlers[SIGINT].func, IntHandler);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
1354 }
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001355
1356#ifdef SIGHUP
Christian Heimes6782b142016-09-09 00:11:45 +02001357 if (PyModule_AddIntMacro(m, SIGHUP))
1358 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001359#endif
1360#ifdef SIGINT
Christian Heimes6782b142016-09-09 00:11:45 +02001361 if (PyModule_AddIntMacro(m, SIGINT))
1362 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001363#endif
Tim Peters1ce3cf72001-10-01 17:58:40 +00001364#ifdef SIGBREAK
Christian Heimes6782b142016-09-09 00:11:45 +02001365 if (PyModule_AddIntMacro(m, SIGBREAK))
1366 goto finally;
Tim Peters1ce3cf72001-10-01 17:58:40 +00001367#endif
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001368#ifdef SIGQUIT
Christian Heimes6782b142016-09-09 00:11:45 +02001369 if (PyModule_AddIntMacro(m, SIGQUIT))
1370 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001371#endif
1372#ifdef SIGILL
Christian Heimes6782b142016-09-09 00:11:45 +02001373 if (PyModule_AddIntMacro(m, SIGILL))
1374 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001375#endif
1376#ifdef SIGTRAP
Christian Heimes6782b142016-09-09 00:11:45 +02001377 if (PyModule_AddIntMacro(m, SIGTRAP))
1378 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001379#endif
1380#ifdef SIGIOT
Christian Heimes6782b142016-09-09 00:11:45 +02001381 if (PyModule_AddIntMacro(m, SIGIOT))
1382 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001383#endif
1384#ifdef SIGABRT
Christian Heimes6782b142016-09-09 00:11:45 +02001385 if (PyModule_AddIntMacro(m, SIGABRT))
1386 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001387#endif
1388#ifdef SIGEMT
Christian Heimes6782b142016-09-09 00:11:45 +02001389 if (PyModule_AddIntMacro(m, SIGEMT))
1390 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001391#endif
1392#ifdef SIGFPE
Christian Heimes6782b142016-09-09 00:11:45 +02001393 if (PyModule_AddIntMacro(m, SIGFPE))
1394 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001395#endif
1396#ifdef SIGKILL
Christian Heimes6782b142016-09-09 00:11:45 +02001397 if (PyModule_AddIntMacro(m, SIGKILL))
1398 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001399#endif
1400#ifdef SIGBUS
Christian Heimes6782b142016-09-09 00:11:45 +02001401 if (PyModule_AddIntMacro(m, SIGBUS))
1402 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001403#endif
1404#ifdef SIGSEGV
Christian Heimes6782b142016-09-09 00:11:45 +02001405 if (PyModule_AddIntMacro(m, SIGSEGV))
1406 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001407#endif
1408#ifdef SIGSYS
Christian Heimes6782b142016-09-09 00:11:45 +02001409 if (PyModule_AddIntMacro(m, SIGSYS))
1410 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001411#endif
1412#ifdef SIGPIPE
Christian Heimes6782b142016-09-09 00:11:45 +02001413 if (PyModule_AddIntMacro(m, SIGPIPE))
1414 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001415#endif
1416#ifdef SIGALRM
Christian Heimes6782b142016-09-09 00:11:45 +02001417 if (PyModule_AddIntMacro(m, SIGALRM))
1418 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001419#endif
1420#ifdef SIGTERM
Christian Heimes6782b142016-09-09 00:11:45 +02001421 if (PyModule_AddIntMacro(m, SIGTERM))
1422 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001423#endif
1424#ifdef SIGUSR1
Christian Heimes6782b142016-09-09 00:11:45 +02001425 if (PyModule_AddIntMacro(m, SIGUSR1))
1426 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001427#endif
1428#ifdef SIGUSR2
Christian Heimes6782b142016-09-09 00:11:45 +02001429 if (PyModule_AddIntMacro(m, SIGUSR2))
1430 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001431#endif
1432#ifdef SIGCLD
Christian Heimes6782b142016-09-09 00:11:45 +02001433 if (PyModule_AddIntMacro(m, SIGCLD))
1434 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001435#endif
1436#ifdef SIGCHLD
Christian Heimes6782b142016-09-09 00:11:45 +02001437 if (PyModule_AddIntMacro(m, SIGCHLD))
1438 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001439#endif
1440#ifdef SIGPWR
Christian Heimes6782b142016-09-09 00:11:45 +02001441 if (PyModule_AddIntMacro(m, SIGPWR))
1442 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001443#endif
1444#ifdef SIGIO
Christian Heimes6782b142016-09-09 00:11:45 +02001445 if (PyModule_AddIntMacro(m, SIGIO))
1446 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001447#endif
1448#ifdef SIGURG
Christian Heimes6782b142016-09-09 00:11:45 +02001449 if (PyModule_AddIntMacro(m, SIGURG))
1450 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001451#endif
1452#ifdef SIGWINCH
Christian Heimes6782b142016-09-09 00:11:45 +02001453 if (PyModule_AddIntMacro(m, SIGWINCH))
1454 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001455#endif
1456#ifdef SIGPOLL
Christian Heimes6782b142016-09-09 00:11:45 +02001457 if (PyModule_AddIntMacro(m, SIGPOLL))
1458 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001459#endif
1460#ifdef SIGSTOP
Christian Heimes6782b142016-09-09 00:11:45 +02001461 if (PyModule_AddIntMacro(m, SIGSTOP))
1462 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001463#endif
1464#ifdef SIGTSTP
Christian Heimes6782b142016-09-09 00:11:45 +02001465 if (PyModule_AddIntMacro(m, SIGTSTP))
1466 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001467#endif
1468#ifdef SIGCONT
Christian Heimes6782b142016-09-09 00:11:45 +02001469 if (PyModule_AddIntMacro(m, SIGCONT))
1470 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001471#endif
1472#ifdef SIGTTIN
Christian Heimes6782b142016-09-09 00:11:45 +02001473 if (PyModule_AddIntMacro(m, SIGTTIN))
1474 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001475#endif
1476#ifdef SIGTTOU
Christian Heimes6782b142016-09-09 00:11:45 +02001477 if (PyModule_AddIntMacro(m, SIGTTOU))
1478 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001479#endif
1480#ifdef SIGVTALRM
Christian Heimes6782b142016-09-09 00:11:45 +02001481 if (PyModule_AddIntMacro(m, SIGVTALRM))
1482 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001483#endif
1484#ifdef SIGPROF
Christian Heimes6782b142016-09-09 00:11:45 +02001485 if (PyModule_AddIntMacro(m, SIGPROF))
1486 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001487#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001488#ifdef SIGXCPU
Christian Heimes6782b142016-09-09 00:11:45 +02001489 if (PyModule_AddIntMacro(m, SIGXCPU))
1490 goto finally;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001491#endif
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001492#ifdef SIGXFSZ
Christian Heimes6782b142016-09-09 00:11:45 +02001493 if (PyModule_AddIntMacro(m, SIGXFSZ))
1494 goto finally;
Barry Warsaw14ed5fb1996-12-16 20:24:22 +00001495#endif
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001496#ifdef SIGRTMIN
Christian Heimes6782b142016-09-09 00:11:45 +02001497 if (PyModule_AddIntMacro(m, SIGRTMIN))
1498 goto finally;
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001499#endif
1500#ifdef SIGRTMAX
Christian Heimes6782b142016-09-09 00:11:45 +02001501 if (PyModule_AddIntMacro(m, SIGRTMAX))
1502 goto finally;
Anthony Baxterf37f37d2003-07-31 10:35:29 +00001503#endif
Martin v. Löwis175af252002-01-12 11:43:25 +00001504#ifdef SIGINFO
Christian Heimes6782b142016-09-09 00:11:45 +02001505 if (PyModule_AddIntMacro(m, SIGINFO))
1506 goto finally;
Martin v. Löwis175af252002-01-12 11:43:25 +00001507#endif
Martin v. Löwis823725e2008-03-24 13:39:54 +00001508
1509#ifdef ITIMER_REAL
Christian Heimes6782b142016-09-09 00:11:45 +02001510 if (PyModule_AddIntMacro(m, ITIMER_REAL))
1511 goto finally;
Martin v. Löwis823725e2008-03-24 13:39:54 +00001512#endif
1513#ifdef ITIMER_VIRTUAL
Christian Heimes6782b142016-09-09 00:11:45 +02001514 if (PyModule_AddIntMacro(m, ITIMER_VIRTUAL))
1515 goto finally;
Martin v. Löwis823725e2008-03-24 13:39:54 +00001516#endif
1517#ifdef ITIMER_PROF
Christian Heimes6782b142016-09-09 00:11:45 +02001518 if (PyModule_AddIntMacro(m, ITIMER_PROF))
1519 goto finally;
Martin v. Löwis823725e2008-03-24 13:39:54 +00001520#endif
1521
1522#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 ItimerError = PyErr_NewException("signal.ItimerError",
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03001524 PyExc_OSError, NULL);
Neal Norwitz2f99b242008-08-24 05:48:10 +00001525 if (ItimerError != NULL)
Martin Panter6d57fe12016-09-17 03:26:16 +00001526 PyDict_SetItemString(d, "ItimerError", ItimerError);
Martin v. Löwis823725e2008-03-24 13:39:54 +00001527#endif
1528
Brian Curtineb24d742010-04-12 17:16:38 +00001529#ifdef CTRL_C_EVENT
Christian Heimes6782b142016-09-09 00:11:45 +02001530 if (PyModule_AddIntMacro(m, CTRL_C_EVENT))
1531 goto finally;
Brian Curtineb24d742010-04-12 17:16:38 +00001532#endif
1533
1534#ifdef CTRL_BREAK_EVENT
Christian Heimes6782b142016-09-09 00:11:45 +02001535 if (PyModule_AddIntMacro(m, CTRL_BREAK_EVENT))
1536 goto finally;
Brian Curtineb24d742010-04-12 17:16:38 +00001537#endif
1538
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001539#ifdef MS_WINDOWS
1540 /* Create manual-reset event, initially unset */
1541 sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
1542#endif
1543
Martin v. Löwis1a214512008-06-11 05:26:20 +00001544 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 Py_DECREF(m);
1546 m = NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001547 }
Barry Warsaw92971171997-01-03 00:14:25 +00001548
Barry Warsaw92971171997-01-03 00:14:25 +00001549 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001550 return m;
Guido van Rossum08c16611997-08-02 03:01:42 +00001551}
1552
1553static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001554finisignal(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001555{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 int i;
1557 PyObject *func;
Guido van Rossum08c16611997-08-02 03:01:42 +00001558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 PyOS_setsig(SIGINT, old_siginthandler);
1560 old_siginthandler = SIG_DFL;
Guido van Rossum08c16611997-08-02 03:01:42 +00001561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 for (i = 1; i < NSIG; i++) {
1563 func = Handlers[i].func;
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001564 _Py_atomic_store_relaxed(&Handlers[i].tripped, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 Handlers[i].func = NULL;
1566 if (i != SIGINT && func != NULL && func != Py_None &&
1567 func != DefaultHandler && func != IgnoreHandler)
1568 PyOS_setsig(i, SIG_DFL);
1569 Py_XDECREF(func);
1570 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001571
Serhiy Storchaka505ff752014-02-09 13:33:53 +02001572 Py_CLEAR(IntHandler);
1573 Py_CLEAR(DefaultHandler);
1574 Py_CLEAR(IgnoreHandler);
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001575}
1576
Barry Warsaw92971171997-01-03 00:14:25 +00001577
Barry Warsaw92971171997-01-03 00:14:25 +00001578/* Declared in pyerrors.h */
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001579int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001580PyErr_CheckSignals(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 int i;
1583 PyObject *f;
Barry Warsaw92971171997-01-03 00:14:25 +00001584
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001585 if (!_Py_atomic_load(&is_tripped))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 if (PyThread_get_thread_ident() != main_thread)
1589 return 0;
Christian Heimesb76922a2007-12-11 01:06:40 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 /*
1592 * The is_tripped variable is meant to speed up the calls to
1593 * PyErr_CheckSignals (both directly or via pending calls) when no
1594 * signal has arrived. This variable is set to 1 when a signal arrives
1595 * and it is set to 0 here, when we know some signals arrived. This way
1596 * we can run the registered handlers with no signals blocked.
1597 *
1598 * NOTE: with this approach we can have a situation where is_tripped is
1599 * 1 but we have no more signals to handle (Handlers[i].tripped
1600 * is 0 for every signal i). This won't do us any harm (except
1601 * we're gonna spent some cycles for nothing). This happens when
1602 * we receive a signal i after we zero is_tripped and before we
1603 * check Handlers[i].tripped.
1604 */
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001605 _Py_atomic_store(&is_tripped, 0);
Christian Heimesb76922a2007-12-11 01:06:40 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 if (!(f = (PyObject *)PyEval_GetFrame()))
1608 f = Py_None;
Christian Heimesb76922a2007-12-11 01:06:40 +00001609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 for (i = 1; i < NSIG; i++) {
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001611 if (_Py_atomic_load_relaxed(&Handlers[i].tripped)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 PyObject *result = NULL;
1613 PyObject *arglist = Py_BuildValue("(iO)", i, f);
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001614 _Py_atomic_store_relaxed(&Handlers[i].tripped, 0);
Barry Warsaw92971171997-01-03 00:14:25 +00001615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 if (arglist) {
1617 result = PyEval_CallObject(Handlers[i].func,
1618 arglist);
1619 Py_DECREF(arglist);
1620 }
Antoine Pitrouc08177a2017-06-28 23:29:29 +02001621 if (!result) {
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001622 _Py_atomic_store(&is_tripped, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 return -1;
Antoine Pitrouc08177a2017-06-28 23:29:29 +02001624 }
Barry Warsaw92971171997-01-03 00:14:25 +00001625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 Py_DECREF(result);
1627 }
1628 }
Christian Heimesb76922a2007-12-11 01:06:40 +00001629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001631}
1632
Guido van Rossumd2cd7ad2000-09-16 16:35:28 +00001633
Barry Warsaw92971171997-01-03 00:14:25 +00001634/* Replacements for intrcheck.c functionality
1635 * Declared in pyerrors.h
1636 */
1637void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001638PyErr_SetInterrupt(void)
Barry Warsaw92971171997-01-03 00:14:25 +00001639{
Victor Stinner6c9b35b2011-04-18 16:25:56 +02001640 trip_signal(SIGINT);
Barry Warsaw92971171997-01-03 00:14:25 +00001641}
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001642
1643void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001644PyOS_InitInterrupts(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001645{
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001646 PyObject *m = PyImport_ImportModule("_signal");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 if (m) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 Py_DECREF(m);
1649 }
Guido van Rossum08c16611997-08-02 03:01:42 +00001650}
1651
1652void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001653PyOS_FiniInterrupts(void)
Guido van Rossum08c16611997-08-02 03:01:42 +00001654{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 finisignal();
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001656}
1657
1658int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001659PyOS_InterruptOccurred(void)
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001660{
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001661 if (_Py_atomic_load_relaxed(&Handlers[SIGINT].tripped)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 if (PyThread_get_thread_ident() != main_thread)
1663 return 0;
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001664 _Py_atomic_store_relaxed(&Handlers[SIGINT].tripped, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 return 1;
1666 }
1667 return 0;
Guido van Rossum398d9fe1994-05-11 08:59:13 +00001668}
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001669
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001670static void
1671_clear_pending_signals(void)
1672{
1673 int i;
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001674 if (!_Py_atomic_load(&is_tripped))
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001675 return;
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001676 _Py_atomic_store(&is_tripped, 0);
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001677 for (i = 1; i < NSIG; ++i) {
Antoine Pitrou2c8a5e42017-07-17 12:25:19 +02001678 _Py_atomic_store_relaxed(&Handlers[i].tripped, 0);
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001679 }
1680}
1681
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001682void
Antoine Pitrou346cbd32017-05-27 17:50:54 +02001683_PySignal_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001684{
Gregory P. Smith9463e3a2012-11-10 20:33:07 -08001685 /* Clear the signal flags after forking so that they aren't handled
1686 * in both processes if they came in just before the fork() but before
1687 * the interpreter had an opportunity to call the handlers. issue9535. */
1688 _clear_pending_signals();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 main_thread = PyThread_get_thread_ident();
1690 main_pid = getpid();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001691}
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001692
1693int
1694_PyOS_IsMainThread(void)
1695{
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001696 return PyThread_get_thread_ident() == main_thread;
Antoine Pitrou6dd381e2011-11-21 21:26:56 +01001697}
1698
1699#ifdef MS_WINDOWS
1700void *_PyOS_SigintEvent(void)
1701{
1702 /* Returns a manual-reset event which gets tripped whenever
1703 SIGINT is received.
1704
1705 Python.h does not include windows.h so we do cannot use HANDLE
1706 as the return type of this function. We use void* instead. */
1707 return sigint_event;
1708}
1709#endif