Skip to content

Commit

Permalink
gh-108724: Fix _PySemaphore_Wait call during thread deletion (#116483)
Browse files Browse the repository at this point in the history
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 <ericsnowcurrently@gmail.com>
  • Loading branch information
colesbury and ericsnowcurrently authored Mar 8, 2024
1 parent 601f3a7 commit 3cdfdc0
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions Python/parking_lot.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 3cdfdc0

Please sign in to comment.