summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_concurrent_futures
diff options
context:
space:
mode:
authorelfstrom <elfstrom@users.noreply.github.com>2023-10-03 21:59:49 (GMT)
committerGitHub <noreply@github.com>2023-10-03 21:59:49 (GMT)
commita376a72bd92cd7c9930467dd1aba40045fb75e3b (patch)
treeafbdd4bb2cb85e4f63c3cfdfbccd04948589f9e3 /Lib/test/test_concurrent_futures
parent4467d2c3ac728f21af02594df5f151f29422c3a5 (diff)
downloadcpython-a376a72bd92cd7c9930467dd1aba40045fb75e3b.zip
cpython-a376a72bd92cd7c9930467dd1aba40045fb75e3b.tar.gz
cpython-a376a72bd92cd7c9930467dd1aba40045fb75e3b.tar.bz2
gh-109917: Fix test instability in test_concurrent_futures (#110306)
The test had an instability issue due to the ordering of the dummy queue operation and the real wakeup pipe operations. Both primitives are thread safe but not done atomically as a single update and may interleave arbitrarily. With the old order of operations this can lead to an incorrect state where the dummy queue is full but the wakeup pipe is empty. By swapping the order in clear() I think this can no longer happen in any possible operation interleaving (famous last words).
Diffstat (limited to 'Lib/test/test_concurrent_futures')
-rw-r--r--Lib/test/test_concurrent_futures/test_deadlock.py3
1 files changed, 2 insertions, 1 deletions
diff --git a/Lib/test/test_concurrent_futures/test_deadlock.py b/Lib/test/test_concurrent_futures/test_deadlock.py
index af70254..3c30c45 100644
--- a/Lib/test/test_concurrent_futures/test_deadlock.py
+++ b/Lib/test/test_concurrent_futures/test_deadlock.py
@@ -286,11 +286,12 @@ class ExecutorDeadlockTest:
super().wakeup()
def clear(self):
+ super().clear()
try:
while True:
self._dummy_queue.get_nowait()
except queue.Empty:
- super().clear()
+ pass
with (unittest.mock.patch.object(futures.process._ExecutorManagerThread,
'run', mock_run),