summaryrefslogtreecommitdiffstats
path: root/Modules/signalmodule.c
diff options
context:
space:
mode:
authorJeroen Demeyer <J.Demeyer@UGent.be>2019-05-10 01:28:57 (GMT)
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-05-10 01:28:56 (GMT)
commitd237b3f0f61990c972b84c45eb4fe137db51a6a7 (patch)
tree68f1220b79ca14dcfa10b648b9f2b0ba446bce4e /Modules/signalmodule.c
parentd267ac20c309e37d85a986b4417aa8ab4d05dabc (diff)
downloadcpython-d237b3f0f61990c972b84c45eb4fe137db51a6a7.zip
cpython-d237b3f0f61990c972b84c45eb4fe137db51a6a7.tar.gz
cpython-d237b3f0f61990c972b84c45eb4fe137db51a6a7.tar.bz2
bpo-36601: clarify signal handler comment and remove unnecessary pid check. (GH-12784)
https://bugs.python.org/issue36601
Diffstat (limited to 'Modules/signalmodule.c')
-rw-r--r--Modules/signalmodule.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index 8c5a0d0..43a4da1 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -73,11 +73,12 @@ class sigset_t_converter(CConverter):
/*
NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
- When threads are supported, we want the following semantics:
+ We want the following semantics:
- only the main thread can set a signal handler
+ - only the main thread runs the signal handler
+ - signals can be delivered to any thread
- any thread can get a signal handler
- - signals are only delivered to the main thread
I.e. we don't support "synchronous signals" like SIGFPE (catching
this doesn't make much sense in Python anyway) nor do we support
@@ -88,17 +89,17 @@ class sigset_t_converter(CConverter):
We still have the problem that in some implementations signals
generated by the keyboard (e.g. SIGINT) are delivered to all
threads (e.g. SGI), while in others (e.g. Solaris) such signals are
- delivered to one random thread (an intermediate possibility would
- be to deliver it to the main thread -- POSIX?). For now, we have
- a working implementation that works in all three cases -- the
- handler ignores signals if getpid() isn't the same as in the main
- thread. XXX This is a hack.
+ delivered to one random thread. On Linux, signals are delivered to
+ the main thread (unless the main thread is blocking the signal, for
+ example because it's already handling the same signal). Since we
+ allow signals to be delivered to any thread, this works fine. The
+ only oddity is that the thread executing the Python signal handler
+ may not be the thread that received the signal.
*/
#include <sys/types.h> /* For pid_t */
#include "pythread.h"
static unsigned long main_thread;
-static pid_t main_pid;
static PyInterpreterState *main_interp;
static volatile struct {
@@ -326,11 +327,7 @@ signal_handler(int sig_num)
{
int save_errno = errno;
- /* See NOTES section above */
- if (getpid() == main_pid)
- {
- trip_signal(sig_num);
- }
+ trip_signal(sig_num);
#ifndef HAVE_SIGACTION
#ifdef SIGCHLD
@@ -1328,7 +1325,6 @@ PyInit__signal(void)
int i;
main_thread = PyThread_get_thread_ident();
- main_pid = getpid();
main_interp = _PyInterpreterState_Get();
/* Create the module and add the functions */
@@ -1739,7 +1735,6 @@ _PySignal_AfterFork(void)
* the interpreter had an opportunity to call the handlers. issue9535. */
_clear_pending_signals();
main_thread = PyThread_get_thread_ident();
- main_pid = getpid();
main_interp = _PyInterpreterState_Get();
}