bpo-36601: clarify signal handler comment and remove unnecessary pid check. (GH-12784)
https://bugs.python.org/issue36601
This commit is contained in:
parent
d267ac20c3
commit
d237b3f0f6
|
@ -0,0 +1,2 @@
|
|||
A long-since-meaningless check for ``getpid() == main_pid`` was removed
|
||||
from Python's internal C signal handler.
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue