mirror of
https://github.com/python/cpython
synced 2024-09-05 00:05:39 +00:00
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.
This commit is contained in:
parent
25684e7131
commit
98ab21cce6
|
@ -567,7 +567,6 @@ def _shutdown_put_join(self, immediate):
|
|||
results = []
|
||||
go = threading.Event()
|
||||
q.put("Y")
|
||||
nb = q.qsize()
|
||||
# queue not fulled
|
||||
|
||||
thrds = (
|
||||
|
@ -578,13 +577,19 @@ def _shutdown_put_join(self, immediate):
|
|||
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()
|
||||
|
||||
|
|
Loading…
Reference in a new issue