Skip to content
Open
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
gh-158090: Fix hang at shutdown when a daemon thread resets the GIL d…
…rop request
  • Loading branch information
lazerg committed Sep 24, 2026
commit 145cf80b799f1ecd67e00e11f214ec649148b01d
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix a race condition at interpreter shutdown where a daemon thread waiting
for the GIL could leave the main thread blocked forever in ``drop_gil()``.
2 changes: 1 addition & 1 deletion Python/ceval_gil.c
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,6 @@ take_gil(PyThreadState *tstate)
PyThreadState *holder_tstate =
(PyThreadState*)_Py_atomic_load_ptr_relaxed(&gil->last_holder);
if (_PyThreadState_MustExit(tstate)) {
MUTEX_UNLOCK(gil->mutex);
// gh-96387: If the loop requested a drop request in a previous
// iteration, reset the request. Otherwise, drop_gil() can
// block forever waiting for the thread which exited. Drop
Expand All @@ -353,6 +352,7 @@ take_gil(PyThreadState *tstate)
if (drop_requested) {
_Py_unset_eval_breaker_bit(holder_tstate, _PY_GIL_DROP_REQUEST_BIT);
}
MUTEX_UNLOCK(gil->mutex);
// gh-87135: hang the thread as *thread_exit() is not a safe
// API. It lacks stack unwind and local variable destruction.
_PyThreadState_HangThread(tstate);
Expand Down
Loading