]> granicus.if.org Git - python/commitdiff
[2.7] bpo-30727: Fix a race condition in test_threading. (GH-2334). (#2353)
authorSerhiy Storchaka <storchaka@gmail.com>
Fri, 23 Jun 2017 11:13:39 +0000 (14:13 +0300)
committerGitHub <noreply@github.com>
Fri, 23 Jun 2017 11:13:39 +0000 (14:13 +0300)
(cherry picked from commit 32cb968a2edd482891c33b6f2ebae10f1d305424)

Lib/test/lock_tests.py

index 46ff753df08f8cab3f6566541b124be721b7fa92..836f3e9a3de3592dc70e7a762299582056cd282c 100644 (file)
@@ -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()