From: Serhiy Storchaka Date: Fri, 23 Jun 2017 11:13:39 +0000 (+0300) Subject: [2.7] bpo-30727: Fix a race condition in test_threading. (GH-2334). (#2353) X-Git-Tag: v2.7.14rc1~82 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7709b4d57b433ef027a2e7e63b4cab3fc9ad910d;p=python [2.7] bpo-30727: Fix a race condition in test_threading. (GH-2334). (#2353) (cherry picked from commit 32cb968a2edd482891c33b6f2ebae10f1d305424) --- diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index 46ff753df0..836f3e9a3d 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -359,21 +359,28 @@ class ConditionTests(BaseTestCase): # construct. In particular, it is possible that this can no longer # be conveniently guaranteed should their implementation ever change. N = 5 + ready = [] results1 = [] results2 = [] phase_num = 0 def f(): cond.acquire() + ready.append(phase_num) cond.wait() cond.release() results1.append(phase_num) cond.acquire() + ready.append(phase_num) cond.wait() cond.release() results2.append(phase_num) b = Bunch(f, N) b.wait_for_started() - _wait() + # first wait, to ensure all workers settle into cond.wait() before + # we continue. See issues #8799 and #30727. + while len(ready) < 5: + _wait() + ready = [] self.assertEqual(results1, []) # Notify 3 threads at first cond.acquire() @@ -385,9 +392,9 @@ class ConditionTests(BaseTestCase): _wait() self.assertEqual(results1, [1] * 3) self.assertEqual(results2, []) - # first wait, to ensure all workers settle into cond.wait() before - # we continue. See issue #8799 - _wait() + # make sure all awaken workers settle into cond.wait() + while len(ready) < 3: + _wait() # Notify 5 threads: they might be in their first or second wait cond.acquire() cond.notify(5) @@ -398,7 +405,9 @@ class ConditionTests(BaseTestCase): _wait() self.assertEqual(results1, [1] * 3 + [2] * 2) self.assertEqual(results2, [2] * 3) - _wait() # make sure all workers settle into cond.wait() + # make sure all workers settle into cond.wait() + while len(ready) < 5: + _wait() # Notify all threads: they are all in their second wait cond.acquire() cond.notify_all()