diff options
author | Victor Stinner <vstinner@python.org> | 2020-11-17 15:22:23 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-17 15:22:23 (GMT) |
commit | 296a796951032f678d063008f588ccc6958d0df1 (patch) | |
tree | 91fa9ac02ef9786aeb741d13d07a0cd027d34d02 | |
parent | 975022b77b0024ea1548f19d5f91aba5ba1eed59 (diff) | |
download | cpython-296a796951032f678d063008f588ccc6958d0df1.zip cpython-296a796951032f678d063008f588ccc6958d0df1.tar.gz cpython-296a796951032f678d063008f588ccc6958d0df1.tar.bz2 |
bpo-41713: Remove PyOS_InitInterrupts() function (GH-23342)
Remove the undocumented PyOS_InitInterrupts() C function.
* Rename PyOS_InitInterrupts() to _PySignal_Init(). It now installs
other signal handlers, not only SIGINT.
* Rename PyOS_FiniInterrupts() to _PySignal_Fini()
-rw-r--r-- | Doc/whatsnew/3.10.rst | 5 | ||||
-rw-r--r-- | Include/internal/pycore_pylifecycle.h | 3 | ||||
-rw-r--r-- | Include/intrcheck.h | 1 | ||||
-rw-r--r-- | Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst | 3 | ||||
-rw-r--r-- | Modules/signalmodule.c | 37 | ||||
-rw-r--r-- | Python/pylifecycle.c | 29 |
6 files changed, 38 insertions, 40 deletions
diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 25b736e..ffc34d7 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -583,3 +583,8 @@ Removed ``Py_END_ALLOW_RECURSION`` and the ``recursion_critical`` field of the :c:type:`PyInterpreterState` structure. (Contributed by Serhiy Storchaka in :issue:`41936`.) + +* Removed the undocumented ``PyOS_InitInterrupts()`` function. Initializing + Python already implicitly installs signal handlers: see + :c:member:`PyConfig.install_signal_handlers`. + (Contributed by Victor Stinner in :issue:`41713`.) diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index e748112..b691e63 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -68,7 +68,8 @@ extern void _PyFloat_Fini(PyThreadState *tstate); extern void _PySlice_Fini(PyThreadState *tstate); extern void _PyAsyncGen_Fini(PyThreadState *tstate); -extern void PyOS_FiniInterrupts(void); +extern int _PySignal_Init(int install_signal_handlers); +extern void _PySignal_Fini(void); extern void _PyExc_Fini(PyThreadState *tstate); extern void _PyImport_Fini(void); diff --git a/Include/intrcheck.h b/Include/intrcheck.h index 88f2a70..b8cc656 100644 --- a/Include/intrcheck.h +++ b/Include/intrcheck.h @@ -5,7 +5,6 @@ extern "C" { #endif PyAPI_FUNC(int) PyOS_InterruptOccurred(void); -PyAPI_FUNC(void) PyOS_InitInterrupts(void); #ifdef HAVE_FORK #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 PyAPI_FUNC(void) PyOS_BeforeFork(void); diff --git a/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst b/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst new file mode 100644 index 0000000..5373595 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-11-17-15-39-10.bpo-41713.Rq99Vc.rst @@ -0,0 +1,3 @@ +Removed the undocumented ``PyOS_InitInterrupts()`` function. Initializing +Python already implicitly installs signal handlers: see +:c:member:`PyConfig.install_signal_handlers`. Patch by Victor Stinner. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 0ab3a71..c0b2117 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1674,8 +1674,8 @@ PyInit__signal(void) } -static void -finisignal(void) +void +_PySignal_Fini(void) { int i; PyObject *func; @@ -1792,19 +1792,32 @@ PyErr_SetInterrupt(void) } } -void -PyOS_InitInterrupts(void) +int +_PySignal_Init(int install_signal_handlers) { - PyObject *m = PyImport_ImportModule("_signal"); - if (m) { - Py_DECREF(m); + if (!install_signal_handlers) { + // Nothing to do + return 0; } -} -void -PyOS_FiniInterrupts(void) -{ - finisignal(); +#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; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 33deafb..77a18e1 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -54,7 +54,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); @@ -1047,11 +1046,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) { @@ -1702,7 +1698,7 @@ Py_FinalizeEx(void) } /* Disable signal handling */ - PyOS_FiniInterrupts(); + _PySignal_Fini(); /* Collect garbage. This may call finalizers; it's nice to call these * before all modules are destroyed. @@ -2730,25 +2726,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. * |