mirror of
https://github.com/python/cpython.git
synced 2025-09-23 00:43:12 +00:00
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
2 changed files with 12 additions and 15 deletions
|
@ -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
|
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 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
|
- 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
|
I.e. we don't support "synchronous signals" like SIGFPE (catching
|
||||||
this doesn't make much sense in Python anyway) nor do we support
|
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
|
We still have the problem that in some implementations signals
|
||||||
generated by the keyboard (e.g. SIGINT) are delivered to all
|
generated by the keyboard (e.g. SIGINT) are delivered to all
|
||||||
threads (e.g. SGI), while in others (e.g. Solaris) such signals are
|
threads (e.g. SGI), while in others (e.g. Solaris) such signals are
|
||||||
delivered to one random thread (an intermediate possibility would
|
delivered to one random thread. On Linux, signals are delivered to
|
||||||
be to deliver it to the main thread -- POSIX?). For now, we have
|
the main thread (unless the main thread is blocking the signal, for
|
||||||
a working implementation that works in all three cases -- the
|
example because it's already handling the same signal). Since we
|
||||||
handler ignores signals if getpid() isn't the same as in the main
|
allow signals to be delivered to any thread, this works fine. The
|
||||||
thread. XXX This is a hack.
|
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 <sys/types.h> /* For pid_t */
|
||||||
#include "pythread.h"
|
#include "pythread.h"
|
||||||
static unsigned long main_thread;
|
static unsigned long main_thread;
|
||||||
static pid_t main_pid;
|
|
||||||
static PyInterpreterState *main_interp;
|
static PyInterpreterState *main_interp;
|
||||||
|
|
||||||
static volatile struct {
|
static volatile struct {
|
||||||
|
@ -326,11 +327,7 @@ signal_handler(int sig_num)
|
||||||
{
|
{
|
||||||
int save_errno = errno;
|
int save_errno = errno;
|
||||||
|
|
||||||
/* See NOTES section above */
|
trip_signal(sig_num);
|
||||||
if (getpid() == main_pid)
|
|
||||||
{
|
|
||||||
trip_signal(sig_num);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef HAVE_SIGACTION
|
#ifndef HAVE_SIGACTION
|
||||||
#ifdef SIGCHLD
|
#ifdef SIGCHLD
|
||||||
|
@ -1328,7 +1325,6 @@ PyInit__signal(void)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
main_thread = PyThread_get_thread_ident();
|
main_thread = PyThread_get_thread_ident();
|
||||||
main_pid = getpid();
|
|
||||||
main_interp = _PyInterpreterState_Get();
|
main_interp = _PyInterpreterState_Get();
|
||||||
|
|
||||||
/* Create the module and add the functions */
|
/* Create the module and add the functions */
|
||||||
|
@ -1739,7 +1735,6 @@ _PySignal_AfterFork(void)
|
||||||
* the interpreter had an opportunity to call the handlers. issue9535. */
|
* the interpreter had an opportunity to call the handlers. issue9535. */
|
||||||
_clear_pending_signals();
|
_clear_pending_signals();
|
||||||
main_thread = PyThread_get_thread_ident();
|
main_thread = PyThread_get_thread_ident();
|
||||||
main_pid = getpid();
|
|
||||||
main_interp = _PyInterpreterState_Get();
|
main_interp = _PyInterpreterState_Get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue