bpo-41686: Always create the SIGINT event on Windows (GH-23344) (GH-23347)

bpo-41686, bpo-41713: On Windows, the SIGINT event,
_PyOS_SigintEvent(), is now created even if Python is configured to
not install signal handlers (PyConfig.install_signal_handlers=0 or
Py_InitializeEx(0)).
This commit is contained in:
Victor Stinner 2020-11-17 18:58:12 +01:00 committed by GitHub
parent ac472b316c
commit 05a5d697f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 30 deletions

View File

@ -68,6 +68,7 @@ extern void _PyFloat_Fini(void);
extern void _PySlice_Fini(void);
extern void _PyAsyncGen_Fini(void);
extern int _PySignal_Init(int install_signal_handlers);
extern void PyOS_FiniInterrupts(void);
extern void _PyExc_Fini(void);

View File

@ -0,0 +1,4 @@
On Windows, the ``SIGINT`` event, ``_PyOS_SigintEvent()``, is now created
even if Python is configured to not install signal handlers (if
:c:member:`PyConfig.install_signal_handlers` equals to 0, or
``Py_InitializeEx(0)``).

View File

@ -1632,11 +1632,6 @@ PyInit__signal(void)
goto finally;
#endif
#ifdef MS_WINDOWS
/* Create manual-reset event, initially unset */
sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
#endif
if (PyErr_Occurred()) {
Py_DECREF(m);
m = NULL;
@ -1773,6 +1768,53 @@ PyOS_InitInterrupts(void)
}
}
static int
signal_install_handlers(void)
{
#ifdef SIGPIPE
PyOS_setsig(SIGPIPE, SIG_IGN);
#endif
#ifdef SIGXFZ
PyOS_setsig(SIGXFZ, SIG_IGN);
#endif
#ifdef SIGXFSZ
PyOS_setsig(SIGXFSZ, SIG_IGN);
#endif
// Import _signal to install the Python SIGINT handler
PyObject *module = PyImport_ImportModule("_signal");
if (!module) {
return -1;
}
Py_DECREF(module);
return 0;
}
int
_PySignal_Init(int install_signal_handlers)
{
#ifdef MS_WINDOWS
/* Create manual-reset event, initially unset */
sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
if (sigint_event == NULL) {
PyErr_SetFromWindowsErr(0);
return -1;
}
#endif
if (install_signal_handlers) {
if (signal_install_handlers() < 0) {
return -1;
}
}
return 0;
}
void
PyOS_FiniInterrupts(void)
{

View File

@ -57,7 +57,6 @@ static PyStatus add_main_module(PyInterpreterState *interp);
static PyStatus init_import_site(void);
static PyStatus init_set_builtins_open(void);
static PyStatus init_sys_streams(PyThreadState *tstate);
static PyStatus init_signals(PyThreadState *tstate);
static void call_py_exitfuncs(PyThreadState *tstate);
static void wait_for_thread_shutdown(PyThreadState *tstate);
static void call_ll_exitfuncs(_PyRuntimeState *runtime);
@ -1013,11 +1012,8 @@ init_interp_main(PyThreadState *tstate)
}
if (is_main_interp) {
if (config->install_signal_handlers) {
status = init_signals(tstate);
if (_PyStatus_EXCEPTION(status)) {
return status;
}
if (_PySignal_Init(config->install_signal_handlers) < 0) {
return _PyStatus_ERR("can't initialize signals");
}
if (_PyTraceMalloc_Init(config->tracemalloc) < 0) {
@ -2442,25 +2438,6 @@ Py_Exit(int sts)
exit(sts);
}
static PyStatus
init_signals(PyThreadState *tstate)
{
#ifdef SIGPIPE
PyOS_setsig(SIGPIPE, SIG_IGN);
#endif
#ifdef SIGXFZ
PyOS_setsig(SIGXFZ, SIG_IGN);
#endif
#ifdef SIGXFSZ
PyOS_setsig(SIGXFSZ, SIG_IGN);
#endif
PyOS_InitInterrupts(); /* May imply init_signals() */
if (_PyErr_Occurred(tstate)) {
return _PyStatus_ERR("can't import signal");
}
return _PyStatus_OK();
}
/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
*