[Python-checkins] cpython (merge 3.2 -> default): Issue #11867: Make test_mailbox.test_lock_conflict deterministic (and fix a

charles-francois.natali python-checkins at python.org
Mon Dec 19 12:20:25 CET 2011


http://hg.python.org/cpython/rev/020260ec44f2
changeset: 74074:020260ec44f2
parent: 74071:6452edbc5f12
parent: 74073:0053b7c68a02
user: Charles-François Natali <neologix at free.fr>
date: Mon Dec 19 12:19:52 2011 +0100
summary:
 Issue #11867: Make test_mailbox.test_lock_conflict deterministic (and fix a
race condition).
files:
 Lib/test/test_mailbox.py | 30 +++++++++++++++++++--------
 1 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py
--- a/Lib/test/test_mailbox.py
+++ b/Lib/test/test_mailbox.py
@@ -17,6 +17,10 @@
 import fcntl
 except ImportError:
 pass
+try:
+ import multiprocessing
+except ImportError:
+ multiprocessing = None
 
 
 class TestBase(unittest.TestCase):
@@ -993,28 +997,36 @@
 self.assertEqual(contents, f.read())
 self._box = self._factory(self._path)
 
+ @unittest.skipUnless(hasattr(os, 'fork'), "Test needs fork().")
+ @unittest.skipUnless(multiprocessing, "Test needs multiprocessing.")
 def test_lock_conflict(self):
- # Fork off a subprocess that will lock the file for 2 seconds,
- # unlock it, and then exit.
- if not hasattr(os, 'fork'):
- return
+ # Fork off a child process that will lock the mailbox temporarily,
+ # unlock it and exit.
+ ready = multiprocessing.Event()
+ done = multiprocessing.Event()
+
 pid = os.fork()
 if pid == 0:
- # In the child, lock the mailbox.
+ # child
 try:
+ # lock the mailbox, and signal the parent it can proceed
 self._box.lock()
- time.sleep(2)
+ ready.set()
+
+ # wait until the parent is done, and unlock the mailbox
+ done.wait(5)
 self._box.unlock()
 finally:
 os._exit(0)
 
- # In the parent, sleep a bit to give the child time to acquire
- # the lock.
- time.sleep(0.5)
+ # In the parent, wait until the child signals it locked the mailbox.
+ ready.wait(5)
 try:
 self.assertRaises(mailbox.ExternalClashError,
 self._box.lock)
 finally:
+ # Signal the child it can now release the lock and exit.
+ done.set()
 # Wait for child to exit. Locking should now succeed.
 exited_pid, status = os.waitpid(pid, 0)
 
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /