diff options
author | Jeremy Maitin-Shepard <jeremy@jeremyms.com> | 2024-10-02 16:17:49 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-02 16:17:49 (GMT) |
commit | 8cc5aa47ee464ddfd8da5461edecf4a5c72df2ff (patch) | |
tree | 41cdda0e2be153a4363cec9d616856444b306273 /Python/pylifecycle.c | |
parent | 113b2d7583cdbf79da18e696f299a9aca24b599b (diff) | |
download | cpython-8cc5aa47ee464ddfd8da5461edecf4a5c72df2ff.zip cpython-8cc5aa47ee464ddfd8da5461edecf4a5c72df2ff.tar.gz cpython-8cc5aa47ee464ddfd8da5461edecf4a5c72df2ff.tar.bz2 |
gh-87135: Hang non-main threads that attempt to acquire the GIL during finalization (GH-105805)
Instead of surprise crashes and memory corruption, we now hang threads that attempt to re-enter the Python interpreter after Python runtime finalization has started. These are typically daemon threads (our long standing mis-feature) but could also be threads spawned by extension modules that then try to call into Python. This marks the `PyThread_exit_thread` public C API as deprecated as there is no plausible safe way to accomplish that on any supported platform in the face of things like C++ code with finalizers anywhere on a thread's stack. Doing this was the least bad option.
Co-authored-by: Gregory P. Smith <greg@krypto.org>
Diffstat (limited to 'Python/pylifecycle.c')
-rw-r--r-- | Python/pylifecycle.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index d9e89ed..ebeee4f 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2020,7 +2020,7 @@ _Py_Finalize(_PyRuntimeState *runtime) /* Ensure that remaining threads are detached */ _PyEval_StopTheWorldAll(runtime); - /* Remaining daemon threads will automatically exit + /* Remaining daemon threads will be trapped in PyThread_hang_thread when they attempt to take the GIL (ex: PyEval_RestoreThread()). */ _PyInterpreterState_SetFinalizing(tstate->interp, tstate); _PyRuntimeState_SetFinalizing(runtime, tstate); |