summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-03-29 22:58:08 (GMT)
committerGitHub <noreply@github.com>2024-03-29 22:58:08 (GMT)
commitbfc57d43d8766120ba0c8f3f6d7b2ac681a81d8a (patch)
tree33ad4298aa1f2532c876a08244e387a9e8cfb572
parent05e0b67a43c5c1778dc2643c8b7c12864e135999 (diff)
downloadcpython-bfc57d43d8766120ba0c8f3f6d7b2ac681a81d8a.zip
cpython-bfc57d43d8766120ba0c8f3f6d7b2ac681a81d8a.tar.gz
cpython-bfc57d43d8766120ba0c8f3f6d7b2ac681a81d8a.tar.bz2
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.
-rw-r--r--Python/pystate.c2
1 files changed, 0 insertions, 2 deletions
diff --git a/Python/pystate.c b/Python/pystate.c
index 8bec727..925d1cf 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);