summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-03-13 18:56:28 (GMT)
committerGitHub <noreply@github.com>2024-03-13 18:56:28 (GMT)
commit98ab21cce6d4c7bd2b5a0a1521b50b1ce2566a44 (patch)
tree6f41df0b53447c065c838b2214ef8b7487ebb2e4 /Lib
parent25684e71310642ffd20b45eea9b5226a1fa809a5 (diff)
downloadcpython-98ab21cce6d4c7bd2b5a0a1521b50b1ce2566a44.zip
cpython-98ab21cce6d4c7bd2b5a0a1521b50b1ce2566a44.tar.gz
cpython-98ab21cce6d4c7bd2b5a0a1521b50b1ce2566a44.tar.bz2
gh-116631: Fix race condition in `test_shutdown_immediate_put_join` (#116670)
The test case had a race condition: if `q.task_done()` was executed after `shutdown(immediate=True)`, then it would raise an exception because the immediate shutdown already emptied the queue. This happened rarely with the GIL (due to the switching interval), but frequently in the free-threaded build.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_queue.py17
1 files changed, 11 insertions, 6 deletions
diff --git a/Lib/test/test_queue.py b/Lib/test/test_queue.py
index 92d670c..ad31ba1 100644
--- a/Lib/test/test_queue.py
+++ b/Lib/test/test_queue.py
@@ -567,7 +567,6 @@ class BaseQueueTestMixin(BlockingTestMixin):
results = []
go = threading.Event()
q.put("Y")
- nb = q.qsize()
# queue not fulled
thrds = (
@@ -578,13 +577,19 @@ class BaseQueueTestMixin(BlockingTestMixin):
for func, params in thrds:
threads.append(threading.Thread(target=func, args=params))
threads[-1].start()
- self.assertEqual(q.unfinished_tasks, nb)
- for i in range(nb):
- t = threading.Thread(target=q.task_done)
- t.start()
- threads.append(t)
+ self.assertEqual(q.unfinished_tasks, 1)
+
q.shutdown(immediate)
go.set()
+
+ if immediate:
+ with self.assertRaises(self.queue.ShutDown):
+ q.get_nowait()
+ else:
+ result = q.get()
+ self.assertEqual(result, "Y")
+ q.task_done()
+
for t in threads:
t.join()