Skip to content

Commit 031f1e6

Browse files
authored
gh-90623: signal.raise_signal() calls PyErr_CheckSignals() (#91756)
signal.raise_signal() and os.kill() now call PyErr_CheckSignals() to check immediately for pending signals.
1 parent c77953b commit 031f1e6

File tree

3 files changed

+19
-1
lines changed

3 files changed

+19
-1
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
:func:`signal.raise_signal` and :func:`os.kill` now check immediately for
2+
pending signals. Patch by Victor Stinner.

Modules/posixmodule.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7929,8 +7929,17 @@ os_kill_impl(PyObject *module, pid_t pid, Py_ssize_t signal)
79297929
return NULL;
79307930
}
79317931
#ifndef MS_WINDOWS
7932-
if (kill(pid, (int)signal) == -1)
7932+
if (kill(pid, (int)signal) == -1) {
79337933
return posix_error();
7934+
}
7935+
7936+
// Check immediately if the signal was sent to the current process.
7937+
// Don't micro-optimize pid == getpid(), since PyErr_SetString() check
7938+
// is cheap.
7939+
if (PyErr_CheckSignals()) {
7940+
return NULL;
7941+
}
7942+
79347943
Py_RETURN_NONE;
79357944
#else /* !MS_WINDOWS */
79367945
PyObject *result;

Modules/signalmodule.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,13 @@ signal_raise_signal_impl(PyObject *module, int signalnum)
481481
if (err) {
482482
return PyErr_SetFromErrno(PyExc_OSError);
483483
}
484+
485+
// If the current thread can handle signals, handle immediately
486+
// the raised signal.
487+
if (PyErr_CheckSignals()) {
488+
return NULL;
489+
}
490+
484491
Py_RETURN_NONE;
485492
}
486493

0 commit comments

Comments
 (0)