https://github.com/python/cpython/commit/3cdfdc07a9dd39bcd6855b8c104584f9c34624f2 commit: 3cdfdc07a9dd39bcd6855b8c104584f9c34624f2 branch: main author: Sam Gross <[email protected]> committer: colesbury <[email protected]> date: 2024-03-08T15:26:36-05:00 summary:
gh-108724: Fix _PySemaphore_Wait call during thread deletion (#116483) In general, when `_PyThreadState_GET()` is non-NULL then the current thread is "attached", but there is a small window during `PyThreadState_DeleteCurrent()` where that's not true: tstate_delete_common() is called when the thread is detached, but before current_fast_clear(). Co-authored-by: Eric Snow <[email protected]> files: M Python/parking_lot.c diff --git a/Python/parking_lot.c b/Python/parking_lot.c index 0a897f9952f648..d5877fef56e4d0 100644 --- a/Python/parking_lot.c +++ b/Python/parking_lot.c @@ -194,14 +194,16 @@ _PySemaphore_Wait(_PySemaphore *sema, PyTime_t timeout, int detach) PyThreadState *tstate = NULL; if (detach) { tstate = _PyThreadState_GET(); - if (tstate) { + if (tstate && tstate->state == _Py_THREAD_ATTACHED) { + // Only detach if we are attached PyEval_ReleaseThread(tstate); } + else { + tstate = NULL; + } } - int res = _PySemaphore_PlatformWait(sema, timeout); - - if (detach && tstate) { + if (tstate) { PyEval_AcquireThread(tstate); } return res; _______________________________________________ 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]
