annotate Lib/test/lock_tests.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents b36cb4602e21
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
57159
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
2 Various tests for synchronization primitives.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
3 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
4
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
5 import sys
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
6 import time
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
7 from thread import start_new_thread, get_ident
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
8 import threading
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
9 import unittest
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
10
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
11 from test import test_support as support
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
12
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
13
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
14 def _wait():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
15 # A crude wait/yield function not relying on synchronization primitives.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
16 time.sleep(0.01)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
17
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
18 class Bunch(object):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
19 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
20 A bunch of threads.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
21 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
22 def __init__(self, f, n, wait_before_exit=False):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
23 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
24 Construct a bunch of `n` threads running the same function `f`.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
25 If `wait_before_exit` is True, the threads won't terminate until
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
26 do_finish() is called.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
27 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
28 self.f = f
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
29 self.n = n
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
30 self.started = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
31 self.finished = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
32 self._can_exit = not wait_before_exit
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
33 def task():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
34 tid = get_ident()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
35 self.started.append(tid)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
36 try:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
37 f()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
38 finally:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
39 self.finished.append(tid)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
40 while not self._can_exit:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
41 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
42 for i in range(n):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
43 start_new_thread(task, ())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
44
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
45 def wait_for_started(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
46 while len(self.started) < self.n:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
47 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
48
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
49 def wait_for_finished(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
50 while len(self.finished) < self.n:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
51 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
52
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
53 def do_finish(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
54 self._can_exit = True
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
55
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
56
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
57 class BaseTestCase(unittest.TestCase):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
58 def setUp(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
59 self._threads = support.threading_setup()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
60
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
61 def tearDown(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
62 support.threading_cleanup(*self._threads)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
63 support.reap_children()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
64
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
65
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
66 class BaseLockTests(BaseTestCase):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
67 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
68 Tests for both recursive and non-recursive locks.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
69 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
70
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
71 def test_constructor(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
72 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
73 del lock
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
74
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
75 def test_acquire_destroy(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
76 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
77 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
78 del lock
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
79
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
80 def test_acquire_release(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
81 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
82 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
83 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
84 del lock
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
85
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
86 def test_try_acquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
87 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
88 self.assertTrue(lock.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
89 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
90
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
91 def test_try_acquire_contended(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
92 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
93 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
94 result = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
95 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
96 result.append(lock.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
97 Bunch(f, 1).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
98 self.assertFalse(result[0])
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
99 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
100
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
101 def test_acquire_contended(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
102 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
103 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
104 N = 5
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
105 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
106 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
107 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
108
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
109 b = Bunch(f, N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
110 b.wait_for_started()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
111 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
112 self.assertEqual(len(b.finished), 0)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
113 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
114 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
115 self.assertEqual(len(b.finished), N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
116
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
117 def test_with(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
118 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
119 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
120 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
121 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
122 def _with(err=None):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
123 with lock:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
124 if err is not None:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
125 raise err
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
126 _with()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
127 # Check the lock is unacquired
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
128 Bunch(f, 1).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
129 self.assertRaises(TypeError, _with, TypeError)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
130 # Check the lock is unacquired
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
131 Bunch(f, 1).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
132
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
133 def test_thread_leak(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
134 # The lock shouldn't leak a Thread instance when used from a foreign
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
135 # (non-threading) thread.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
136 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
137 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
138 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
139 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
140 n = len(threading.enumerate())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
141 # We run many threads in the hope that existing threads ids won't
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
142 # be recycled.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
143 Bunch(f, 15).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
144 self.assertEqual(n, len(threading.enumerate()))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
145
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
146
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
147 class LockTests(BaseLockTests):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
148 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
149 Tests for non-recursive, weak locks
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
150 (which can be acquired and released from different threads).
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
151 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
152 def test_reacquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
153 # Lock needs to be released before re-acquiring.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
154 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
155 phase = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
156 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
157 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
158 phase.append(None)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
159 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
160 phase.append(None)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
161 start_new_thread(f, ())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
162 while len(phase) == 0:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
163 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
164 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
165 self.assertEqual(len(phase), 1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
166 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
167 while len(phase) == 1:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
168 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
169 self.assertEqual(len(phase), 2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
170
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
171 def test_different_thread(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
172 # Lock can be released from a different thread.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
173 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
174 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
175 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
176 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
177 b = Bunch(f, 1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
178 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
179 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
180 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
181
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
182
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
183 class RLockTests(BaseLockTests):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
184 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
185 Tests for recursive locks.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
186 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
187 def test_reacquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
188 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
189 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
190 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
191 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
192 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
193 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
194 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
195
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
196 def test_release_unacquired(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
197 # Cannot release an unacquired lock
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
198 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
199 self.assertRaises(RuntimeError, lock.release)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
200 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
201 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
202 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
203 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
204 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
205 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
206 self.assertRaises(RuntimeError, lock.release)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
207
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
208 def test_different_thread(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
209 # Cannot release from a different thread
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
210 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
211 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
212 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
213 b = Bunch(f, 1, True)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
214 try:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
215 self.assertRaises(RuntimeError, lock.release)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
216 finally:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
217 b.do_finish()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
218
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
219 def test__is_owned(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
220 lock = self.locktype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
221 self.assertFalse(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
222 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
223 self.assertTrue(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
224 lock.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
225 self.assertTrue(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
226 result = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
227 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
228 result.append(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
229 Bunch(f, 1).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
230 self.assertFalse(result[0])
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
231 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
232 self.assertTrue(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
233 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
234 self.assertFalse(lock._is_owned())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
235
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
236
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
237 class EventTests(BaseTestCase):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
238 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
239 Tests for Event objects.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
240 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
241
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
242 def test_is_set(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
243 evt = self.eventtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
244 self.assertFalse(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
245 evt.set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
246 self.assertTrue(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
247 evt.set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
248 self.assertTrue(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
249 evt.clear()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
250 self.assertFalse(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
251 evt.clear()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
252 self.assertFalse(evt.is_set())
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
253
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
254 def _check_notify(self, evt):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
255 # All threads get notified
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
256 N = 5
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
257 results1 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
258 results2 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
259 def f():
57129
cd360ac58cd2 Issue #7270: Add some dedicated unit tests for multi-thread synchronization
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
260 results1.append(evt.wait())
cd360ac58cd2 Issue #7270: Add some dedicated unit tests for multi-thread synchronization
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
261 results2.append(evt.wait())
57159
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
262 b = Bunch(f, N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
263 b.wait_for_started()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
264 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
265 self.assertEqual(len(results1), 0)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
266 evt.set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
267 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
268 self.assertEqual(results1, [True] * N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
269 self.assertEqual(results2, [True] * N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
270
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
271 def test_notify(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
272 evt = self.eventtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
273 self._check_notify(evt)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
274 # Another time, after an explicit clear()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
275 evt.set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
276 evt.clear()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
277 self._check_notify(evt)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
278
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
279 def test_timeout(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
280 evt = self.eventtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
281 results1 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
282 results2 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
283 N = 5
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
284 def f():
57129
cd360ac58cd2 Issue #7270: Add some dedicated unit tests for multi-thread synchronization
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
285 results1.append(evt.wait(0.0))
57159
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
286 t1 = time.time()
57129
cd360ac58cd2 Issue #7270: Add some dedicated unit tests for multi-thread synchronization
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
287 r = evt.wait(0.2)
57159
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
288 t2 = time.time()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
289 results2.append((r, t2 - t1))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
290 Bunch(f, N).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
291 self.assertEqual(results1, [False] * N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
292 for r, dt in results2:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
293 self.assertFalse(r)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
294 self.assertTrue(dt >= 0.2, dt)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
295 # The event is set
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
296 results1 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
297 results2 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
298 evt.set()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
299 Bunch(f, N).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
300 self.assertEqual(results1, [True] * N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
301 for r, dt in results2:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
302 self.assertTrue(r)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
303
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
304
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
305 class ConditionTests(BaseTestCase):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
306 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
307 Tests for condition variables.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
308 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
309
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
310 def test_acquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
311 cond = self.condtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
312 # Be default we have an RLock: the condition can be acquired multiple
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
313 # times.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
314 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
315 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
316 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
317 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
318 lock = threading.Lock()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
319 cond = self.condtype(lock)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
320 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
321 self.assertFalse(lock.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
322 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
323 self.assertTrue(lock.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
324 self.assertFalse(cond.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
325 lock.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
326 with cond:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
327 self.assertFalse(lock.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
328
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
329 def test_unacquired_wait(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
330 cond = self.condtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
331 self.assertRaises(RuntimeError, cond.wait)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
332
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
333 def test_unacquired_notify(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
334 cond = self.condtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
335 self.assertRaises(RuntimeError, cond.notify)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
336
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
337 def _check_notify(self, cond):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
338 N = 5
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
339 results1 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
340 results2 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
341 phase_num = 0
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
342 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
343 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
344 cond.wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
345 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
346 results1.append(phase_num)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
347 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
348 cond.wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
349 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
350 results2.append(phase_num)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
351 b = Bunch(f, N)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
352 b.wait_for_started()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
353 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
354 self.assertEqual(results1, [])
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
355 # Notify 3 threads at first
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
356 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
357 cond.notify(3)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
358 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
359 phase_num = 1
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
360 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
361 while len(results1) < 3:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
362 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
363 self.assertEqual(results1, [1] * 3)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
364 self.assertEqual(results2, [])
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
365 # Notify 5 threads: they might be in their first or second wait
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
366 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
367 cond.notify(5)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
368 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
369 phase_num = 2
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
370 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
371 while len(results1) + len(results2) < 8:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
372 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
373 self.assertEqual(results1, [1] * 3 + [2] * 2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
374 self.assertEqual(results2, [2] * 3)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
375 # Notify all threads: they are all in their second wait
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
376 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
377 cond.notify_all()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
378 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
379 phase_num = 3
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
380 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
381 while len(results2) < 5:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
382 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
383 self.assertEqual(results1, [1] * 3 + [2] * 2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
384 self.assertEqual(results2, [2] * 3 + [3] * 2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
385 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
386
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
387 def test_notify(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
388 cond = self.condtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
389 self._check_notify(cond)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
390 # A second time, to check internal state is still ok.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
391 self._check_notify(cond)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
392
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
393 def test_timeout(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
394 cond = self.condtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
395 results = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
396 N = 5
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
397 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
398 cond.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
399 t1 = time.time()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
400 cond.wait(0.2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
401 t2 = time.time()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
402 cond.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
403 results.append(t2 - t1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
404 Bunch(f, N).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
405 self.assertEqual(len(results), 5)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
406 for dt in results:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
407 self.assertTrue(dt >= 0.2, dt)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
408
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
409
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
410 class BaseSemaphoreTests(BaseTestCase):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
411 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
412 Common tests for {bounded, unbounded} semaphore objects.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
413 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
414
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
415 def test_constructor(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
416 self.assertRaises(ValueError, self.semtype, value = -1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
417 self.assertRaises(ValueError, self.semtype, value = -sys.maxint)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
418
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
419 def test_acquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
420 sem = self.semtype(1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
421 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
422 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
423 sem = self.semtype(2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
424 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
425 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
426 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
427 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
428
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
429 def test_acquire_destroy(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
430 sem = self.semtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
431 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
432 del sem
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
433
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
434 def test_acquire_contended(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
435 sem = self.semtype(7)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
436 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
437 N = 10
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
438 results1 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
439 results2 = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
440 phase_num = 0
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
441 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
442 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
443 results1.append(phase_num)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
444 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
445 results2.append(phase_num)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
446 b = Bunch(f, 10)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
447 b.wait_for_started()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
448 while len(results1) + len(results2) < 6:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
449 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
450 self.assertEqual(results1 + results2, [0] * 6)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
451 phase_num = 1
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
452 for i in range(7):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
453 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
454 while len(results1) + len(results2) < 13:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
455 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
456 self.assertEqual(sorted(results1 + results2), [0] * 6 + [1] * 7)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
457 phase_num = 2
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
458 for i in range(6):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
459 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
460 while len(results1) + len(results2) < 19:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
461 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
462 self.assertEqual(sorted(results1 + results2), [0] * 6 + [1] * 7 + [2] * 6)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
463 # The semaphore is still locked
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
464 self.assertFalse(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
465 # Final release, to let the last thread finish
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
466 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
467 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
468
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
469 def test_try_acquire(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
470 sem = self.semtype(2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
471 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
472 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
473 self.assertFalse(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
474 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
475 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
476
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
477 def test_try_acquire_contended(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
478 sem = self.semtype(4)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
479 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
480 results = []
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
481 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
482 results.append(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
483 results.append(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
484 Bunch(f, 5).wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
485 # There can be a thread switch between acquiring the semaphore and
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
486 # appending the result, therefore results will not necessarily be
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
487 # ordered.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
488 self.assertEqual(sorted(results), [False] * 7 + [True] * 3 )
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
489
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
490 def test_default_value(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
491 # The default initial value is 1.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
492 sem = self.semtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
493 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
494 def f():
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
495 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
496 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
497 b = Bunch(f, 1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
498 b.wait_for_started()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
499 _wait()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
500 self.assertFalse(b.finished)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
501 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
502 b.wait_for_finished()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
503
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
504 def test_with(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
505 sem = self.semtype(2)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
506 def _with(err=None):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
507 with sem:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
508 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
509 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
510 with sem:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
511 self.assertFalse(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
512 if err:
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
513 raise err
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
514 _with()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
515 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
516 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
517 self.assertRaises(TypeError, _with, TypeError)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
518 self.assertTrue(sem.acquire(False))
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
519 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
520
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
521 class SemaphoreTests(BaseSemaphoreTests):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
522 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
523 Tests for unbounded semaphores.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
524 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
525
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
526 def test_release_unacquired(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
527 # Unbounded releases are allowed and increment the semaphore's value
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
528 sem = self.semtype(1)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
529 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
530 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
531 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
532 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
533
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
534
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
535 class BoundedSemaphoreTests(BaseSemaphoreTests):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
536 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
537 Tests for bounded semaphores.
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
538 """
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
539
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
540 def test_release_unacquired(self):
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
541 # Cannot go past the initial value
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
542 sem = self.semtype()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
543 self.assertRaises(ValueError, sem.release)
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
544 sem.acquire()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
545 sem.release()
0eb56a8e6262 Merged revisions 76137,76172 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
546 self.assertRaises(ValueError, sem.release)