https://github.com/python/cpython/commit/bfc57d43d8766120ba0c8f3f6d7b2ac681a81d8a
commit: bfc57d43d8766120ba0c8f3f6d7b2ac681a81d8a
branch: main
author: Sam Gross <[email protected]>
committer: colesbury <[email protected]>
date: 2024-03-29T18:58:08-04:00
summary:
gh-117303: Don't detach in `PyThreadState_DeleteCurrent()` (#117304)
This fixes a crash in `test_threading.test_reinit_tls_after_fork()` when
running with the GIL disabled. We already properly handle the case where
the thread state is `_Py_THREAD_ATTACHED` in `tstate_delete_common()` --
we just need to remove an assertion.
Keeping the thread attached means that a stop-the-world pause, such as
for a `fork()`, won't commence until we remove our thread state from the
interpreter's linked list. This prevents a crash when the child process
tries to clean up the dead thread states.
files:
M Python/pystate.c
diff --git a/Python/pystate.c b/Python/pystate.c
index 8bec72779b2c24..925d1cff866f18 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -1660,7 +1660,6 @@ static void
tstate_delete_common(PyThreadState *tstate)
{
assert(tstate->_status.cleared && !tstate->_status.finalized);
- assert(tstate->state != _Py_THREAD_ATTACHED);
tstate_verify_not_active(tstate);
assert(!_PyThreadState_IsRunningMain(tstate));
@@ -1740,7 +1739,6 @@ _PyThreadState_DeleteCurrent(PyThreadState *tstate)
#ifdef Py_GIL_DISABLED
_Py_qsbr_detach(((_PyThreadStateImpl *)tstate)->qsbr);
#endif
- tstate_set_detached(tstate, _Py_THREAD_DETACHED);
current_fast_clear(tstate->interp->runtime);
tstate_delete_common(tstate);
_PyEval_ReleaseLock(tstate->interp, NULL);
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]