Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Doc/whatsnew/3.10.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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`.)
3 changes: 2 additions & 1 deletion Include/internal/pycore_pylifecycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
1 change: 0 additions & 1 deletion Include/intrcheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
37 changes: 25 additions & 12 deletions Modules/signalmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1674,8 +1674,8 @@ PyInit__signal(void)
}


static void
finisignal(void)
void
_PySignal_Fini(void)
{
int i;
PyObject *func;
Expand Down Expand Up @@ -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;
}


Expand Down
29 changes: 3 additions & 26 deletions Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.
*
Expand Down