mirror of
https://github.com/python/cpython.git
synced 2025-08-27 12:16:04 +00:00
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:
parent
ac472b316c
commit
05a5d697f4
4 changed files with 54 additions and 30 deletions
|
@ -68,6 +68,7 @@ extern void _PyFloat_Fini(void);
|
||||||
extern void _PySlice_Fini(void);
|
extern void _PySlice_Fini(void);
|
||||||
extern void _PyAsyncGen_Fini(void);
|
extern void _PyAsyncGen_Fini(void);
|
||||||
|
|
||||||
|
extern int _PySignal_Init(int install_signal_handlers);
|
||||||
extern void PyOS_FiniInterrupts(void);
|
extern void PyOS_FiniInterrupts(void);
|
||||||
|
|
||||||
extern void _PyExc_Fini(void);
|
extern void _PyExc_Fini(void);
|
||||||
|
|
|
@ -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)``).
|
|
@ -1632,11 +1632,6 @@ PyInit__signal(void)
|
||||||
goto finally;
|
goto finally;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MS_WINDOWS
|
|
||||||
/* Create manual-reset event, initially unset */
|
|
||||||
sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (PyErr_Occurred()) {
|
if (PyErr_Occurred()) {
|
||||||
Py_DECREF(m);
|
Py_DECREF(m);
|
||||||
m = NULL;
|
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
|
void
|
||||||
PyOS_FiniInterrupts(void)
|
PyOS_FiniInterrupts(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,7 +57,6 @@ static PyStatus add_main_module(PyInterpreterState *interp);
|
||||||
static PyStatus init_import_site(void);
|
static PyStatus init_import_site(void);
|
||||||
static PyStatus init_set_builtins_open(void);
|
static PyStatus init_set_builtins_open(void);
|
||||||
static PyStatus init_sys_streams(PyThreadState *tstate);
|
static PyStatus init_sys_streams(PyThreadState *tstate);
|
||||||
static PyStatus init_signals(PyThreadState *tstate);
|
|
||||||
static void call_py_exitfuncs(PyThreadState *tstate);
|
static void call_py_exitfuncs(PyThreadState *tstate);
|
||||||
static void wait_for_thread_shutdown(PyThreadState *tstate);
|
static void wait_for_thread_shutdown(PyThreadState *tstate);
|
||||||
static void call_ll_exitfuncs(_PyRuntimeState *runtime);
|
static void call_ll_exitfuncs(_PyRuntimeState *runtime);
|
||||||
|
@ -1013,11 +1012,8 @@ init_interp_main(PyThreadState *tstate)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_main_interp) {
|
if (is_main_interp) {
|
||||||
if (config->install_signal_handlers) {
|
if (_PySignal_Init(config->install_signal_handlers) < 0) {
|
||||||
status = init_signals(tstate);
|
return _PyStatus_ERR("can't initialize signals");
|
||||||
if (_PyStatus_EXCEPTION(status)) {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_PyTraceMalloc_Init(config->tracemalloc) < 0) {
|
if (_PyTraceMalloc_Init(config->tracemalloc) < 0) {
|
||||||
|
@ -2442,25 +2438,6 @@ Py_Exit(int sts)
|
||||||
exit(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.
|
/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue