summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Python/lock.c
diff options
context:
space:
mode:
authorYDBot <[email protected]>2026-07-01 16:23:57 +0000
committerYDBot <[email protected]>2026-07-01 16:23:57 +0000
commite9b445a7f111ee5ba5c58672d767833df25ba262 (patch)
tree1b8bdb84d3fd994ff3ac60e36c30f93fbfce1243 /contrib/tools/python3/Python/lock.c
parent1cfcce4de55cd075cfba845abf02c1554f141e01 (diff)
parentc98b5dbfe575ba628d7c3427854e7bd26030eb2c (diff)
Merge pull request #44637 from ydb-platform/merge-rightlib-260626-1120
Diffstat (limited to 'contrib/tools/python3/Python/lock.c')
-rw-r--r--contrib/tools/python3/Python/lock.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/contrib/tools/python3/Python/lock.c b/contrib/tools/python3/Python/lock.c
index 24c404a1246..6def8567b11 100644
--- a/contrib/tools/python3/Python/lock.c
+++ b/contrib/tools/python3/Python/lock.c
@@ -210,7 +210,16 @@ _PyRawMutex_LockSlow(_PyRawMutex *m)
// Wait for us to be woken up. Note that we still have to lock the
// mutex ourselves: it is NOT handed off to us.
- _PySemaphore_Wait(&waiter.sema, -1, /*detach=*/0);
+ //
+ // Loop until we observe an actual wakeup. A return of Py_PARK_INTR
+ // could otherwise let us exit _PySemaphore_Wait and destroy
+ // `waiter.sema` while _PyRawMutex_UnlockSlow's matching
+ // _PySemaphore_Wakeup is still pending, since the unlocker has
+ // already CAS-removed us from the waiter list without any handshake.
+ int res;
+ do {
+ res = _PySemaphore_Wait(&waiter.sema, -1, /*detach=*/0);
+ } while (res != Py_PARK_OK);
}
_PySemaphore_Destroy(&waiter.sema);