diff options
author | Victor Stinner <vstinner@python.org> | 2022-04-21 01:14:57 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-21 01:14:57 (GMT) |
commit | 031f1e6040d1bb0454bd6da417fd9e38aad4fc89 (patch) | |
tree | ccca4d8d9d29e30c7d40dac590974356df7f2d7a | |
parent | c77953b23e4b864129edf7983eaa6a0d22414ec6 (diff) | |
download | cpython-031f1e6040d1bb0454bd6da417fd9e38aad4fc89.zip cpython-031f1e6040d1bb0454bd6da417fd9e38aad4fc89.tar.gz cpython-031f1e6040d1bb0454bd6da417fd9e38aad4fc89.tar.bz2 |
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.
-rw-r--r-- | Misc/NEWS.d/next/Library/2022-04-20-18-47-27.gh-issue-90623.5fROpX.rst | 2 | ||||
-rw-r--r-- | Modules/posixmodule.c | 11 | ||||
-rw-r--r-- | Modules/signalmodule.c | 7 |
3 files changed, 19 insertions, 1 deletions
diff --git a/Misc/NEWS.d/next/Library/2022-04-20-18-47-27.gh-issue-90623.5fROpX.rst b/Misc/NEWS.d/next/Library/2022-04-20-18-47-27.gh-issue-90623.5fROpX.rst new file mode 100644 index 0000000..566cf35 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-20-18-47-27.gh-issue-90623.5fROpX.rst @@ -0,0 +1,2 @@ +:func:`signal.raise_signal` and :func:`os.kill` now check immediately for +pending signals. Patch by Victor Stinner. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 345ed71..a9132a7 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -7929,8 +7929,17 @@ os_kill_impl(PyObject *module, pid_t pid, Py_ssize_t signal) return NULL; } #ifndef MS_WINDOWS - if (kill(pid, (int)signal) == -1) + if (kill(pid, (int)signal) == -1) { return posix_error(); + } + + // Check immediately if the signal was sent to the current process. + // Don't micro-optimize pid == getpid(), since PyErr_SetString() check + // is cheap. + if (PyErr_CheckSignals()) { + return NULL; + } + Py_RETURN_NONE; #else /* !MS_WINDOWS */ PyObject *result; diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 1ee5c66..02c58ff 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -481,6 +481,13 @@ signal_raise_signal_impl(PyObject *module, int signalnum) if (err) { return PyErr_SetFromErrno(PyExc_OSError); } + + // If the current thread can handle signals, handle immediately + // the raised signal. + if (PyErr_CheckSignals()) { + return NULL; + } + Py_RETURN_NONE; } |