diff options
author | Sam Gross <colesbury@gmail.com> | 2024-03-13 18:56:28 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-13 18:56:28 (GMT) |
commit | 98ab21cce6d4c7bd2b5a0a1521b50b1ce2566a44 (patch) | |
tree | 6f41df0b53447c065c838b2214ef8b7487ebb2e4 /Lib | |
parent | 25684e71310642ffd20b45eea9b5226a1fa809a5 (diff) | |
download | cpython-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.py | 17 |
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() |