annotate Lib/test/lock_tests.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents eb39d862a250
children 0fe63bb20e74
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
1 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
2 Various tests for synchronization primitives.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
3 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
4
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
5 import sys
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
6 import time
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
7 from _thread import start_new_thread, get_ident, TIMEOUT_MAX
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
8 import threading
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
9 import unittest
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
10
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
11 from test import support
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
12
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
13
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
14 def _wait():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
15 # A crude wait/yield function not relying on synchronization primitives.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
16 time.sleep(0.01)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
17
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
18 class Bunch(object):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
19 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
20 A bunch of threads.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
21 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
22 def __init__(self, f, n, wait_before_exit=False):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
23 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
24 Construct a bunch of `n` threads running the same function `f`.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
25 If `wait_before_exit` is True, the threads won't terminate until
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
26 do_finish() is called.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
27 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
28 self.f = f
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
29 self.n = n
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
30 self.started = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
31 self.finished = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
32 self._can_exit = not wait_before_exit
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
33 def task():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
34 tid = get_ident()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
35 self.started.append(tid)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
36 try:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
37 f()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
38 finally:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
39 self.finished.append(tid)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
40 while not self._can_exit:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
41 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
42 for i in range(n):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
43 start_new_thread(task, ())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
44
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
45 def wait_for_started(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
46 while len(self.started) < self.n:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
47 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
48
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
49 def wait_for_finished(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
50 while len(self.finished) < self.n:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
51 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
52
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
53 def do_finish(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
54 self._can_exit = True
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
55
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
56
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
57 class BaseTestCase(unittest.TestCase):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
58 def setUp(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
59 self._threads = support.threading_setup()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
60
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
61 def tearDown(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
62 support.threading_cleanup(*self._threads)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
63 support.reap_children()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
64
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
65 def assertTimeout(self, actual, expected):
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
66 # The waiting and/or time.time() can be imprecise, which
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
67 # is why comparing to the expected value would sometimes fail
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
68 # (especially under Windows).
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
69 self.assertGreaterEqual(actual, expected * 0.6)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
70 # Test nothing insane happened
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
71 self.assertLess(actual, expected * 10.0)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
72
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
73
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
74 class BaseLockTests(BaseTestCase):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
75 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
76 Tests for both recursive and non-recursive locks.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
77 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
78
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
79 def test_constructor(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
80 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
81 del lock
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
82
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
83 def test_acquire_destroy(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
84 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
85 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
86 del lock
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
87
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
88 def test_acquire_release(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
89 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
90 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
91 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
92 del lock
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
93
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
94 def test_try_acquire(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
95 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
96 self.assertTrue(lock.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
97 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
98
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
99 def test_try_acquire_contended(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
100 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
101 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
102 result = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
103 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
104 result.append(lock.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
105 Bunch(f, 1).wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
106 self.assertFalse(result[0])
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
107 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
108
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
109 def test_acquire_contended(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
110 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
111 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
112 N = 5
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
113 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
114 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
115 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
116
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
117 b = Bunch(f, N)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
118 b.wait_for_started()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
119 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
120 self.assertEqual(len(b.finished), 0)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
121 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
122 b.wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
123 self.assertEqual(len(b.finished), N)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
124
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
125 def test_with(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
126 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
127 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
128 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
129 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
130 def _with(err=None):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
131 with lock:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
132 if err is not None:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
133 raise err
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
134 _with()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
135 # Check the lock is unacquired
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
136 Bunch(f, 1).wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
137 self.assertRaises(TypeError, _with, TypeError)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
138 # Check the lock is unacquired
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
139 Bunch(f, 1).wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
140
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
141 def test_thread_leak(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
142 # The lock shouldn't leak a Thread instance when used from a foreign
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
143 # (non-threading) thread.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
144 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
145 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
146 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
147 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
148 n = len(threading.enumerate())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
149 # We run many threads in the hope that existing threads ids won't
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
150 # be recycled.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
151 Bunch(f, 15).wait_for_finished()
69142
04b5cd2f8c87 Try to fix sporadic failure in test_thread/test_threading
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
152 if len(threading.enumerate()) != n:
04b5cd2f8c87 Try to fix sporadic failure in test_thread/test_threading
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
153 # There is a small window during which a Thread instance's
04b5cd2f8c87 Try to fix sporadic failure in test_thread/test_threading
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
154 # target function has finished running, but the Thread is still
04b5cd2f8c87 Try to fix sporadic failure in test_thread/test_threading
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
155 # alive and registered. Avoid spurious failures by waiting a
04b5cd2f8c87 Try to fix sporadic failure in test_thread/test_threading
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
156 # bit more (seen on a buildbot).
04b5cd2f8c87 Try to fix sporadic failure in test_thread/test_threading
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
157 time.sleep(0.4)
04b5cd2f8c87 Try to fix sporadic failure in test_thread/test_threading
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
158 self.assertEqual(n, len(threading.enumerate()))
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
159
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
160 def test_timeout(self):
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
161 lock = self.locktype()
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
162 # Can't set timeout if not blocking
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
163 self.assertRaises(ValueError, lock.acquire, 0, 1)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
164 # Invalid timeout values
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
165 self.assertRaises(ValueError, lock.acquire, timeout=-100)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
166 self.assertRaises(OverflowError, lock.acquire, timeout=1e100)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
167 self.assertRaises(OverflowError, lock.acquire, timeout=TIMEOUT_MAX + 1)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
168 # TIMEOUT_MAX is ok
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
169 lock.acquire(timeout=TIMEOUT_MAX)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
170 lock.release()
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
171 t1 = time.time()
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
172 self.assertTrue(lock.acquire(timeout=5))
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
173 t2 = time.time()
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
174 # Just a sanity test that it didn't actually wait for the timeout.
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
175 self.assertLess(t2 - t1, 5)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
176 results = []
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
177 def f():
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
178 t1 = time.time()
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
179 results.append(lock.acquire(timeout=0.5))
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
180 t2 = time.time()
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
181 results.append(t2 - t1)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
182 Bunch(f, 1).wait_for_finished()
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
183 self.assertFalse(results[0])
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
184 self.assertTimeout(results[1], 0.5)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
185
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
186
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
187 class LockTests(BaseLockTests):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
188 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
189 Tests for non-recursive, weak locks
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
190 (which can be acquired and released from different threads).
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
191 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
192 def test_reacquire(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
193 # Lock needs to be released before re-acquiring.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
194 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
195 phase = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
196 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
197 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
198 phase.append(None)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
199 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
200 phase.append(None)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
201 start_new_thread(f, ())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
202 while len(phase) == 0:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
203 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
204 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
205 self.assertEqual(len(phase), 1)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
206 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
207 while len(phase) == 1:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
208 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
209 self.assertEqual(len(phase), 2)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
210
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
211 def test_different_thread(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
212 # Lock can be released from a different thread.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
213 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
214 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
215 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
216 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
217 b = Bunch(f, 1)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
218 b.wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
219 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
220 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
221
69068
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
222 def test_state_after_timeout(self):
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
223 # Issue #11618: check that lock is in a proper state after a
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
224 # (non-zero) timeout.
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
225 lock = self.locktype()
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
226 lock.acquire()
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
227 self.assertFalse(lock.acquire(timeout=0.01))
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
228 lock.release()
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
229 self.assertFalse(lock.locked())
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
230 self.assertTrue(lock.acquire(blocking=False))
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
231
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
232
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
233 class RLockTests(BaseLockTests):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
234 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
235 Tests for recursive locks.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
236 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
237 def test_reacquire(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
238 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
239 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
240 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
241 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
242 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
243 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
244 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
245
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
246 def test_release_unacquired(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
247 # Cannot release an unacquired lock
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
248 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
249 self.assertRaises(RuntimeError, lock.release)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
250 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
251 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
252 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
253 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
254 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
255 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
256 self.assertRaises(RuntimeError, lock.release)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
257
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
258 def test_different_thread(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
259 # Cannot release from a different thread
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
260 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
261 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
262 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
263 b = Bunch(f, 1, True)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
264 try:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
265 self.assertRaises(RuntimeError, lock.release)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
266 finally:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
267 b.do_finish()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
268
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
269 def test__is_owned(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
270 lock = self.locktype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
271 self.assertFalse(lock._is_owned())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
272 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
273 self.assertTrue(lock._is_owned())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
274 lock.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
275 self.assertTrue(lock._is_owned())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
276 result = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
277 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
278 result.append(lock._is_owned())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
279 Bunch(f, 1).wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
280 self.assertFalse(result[0])
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
281 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
282 self.assertTrue(lock._is_owned())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
283 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
284 self.assertFalse(lock._is_owned())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
285
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
286
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
287 class EventTests(BaseTestCase):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
288 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
289 Tests for Event objects.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
290 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
291
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
292 def test_is_set(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
293 evt = self.eventtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
294 self.assertFalse(evt.is_set())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
295 evt.set()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
296 self.assertTrue(evt.is_set())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
297 evt.set()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
298 self.assertTrue(evt.is_set())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
299 evt.clear()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
300 self.assertFalse(evt.is_set())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
301 evt.clear()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
302 self.assertFalse(evt.is_set())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
303
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
304 def _check_notify(self, evt):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
305 # All threads get notified
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
306 N = 5
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
307 results1 = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
308 results2 = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
309 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
310 results1.append(evt.wait())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
311 results2.append(evt.wait())
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
312 b = Bunch(f, N)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
313 b.wait_for_started()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
314 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
315 self.assertEqual(len(results1), 0)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
316 evt.set()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
317 b.wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
318 self.assertEqual(results1, [True] * N)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
319 self.assertEqual(results2, [True] * N)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
320
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
321 def test_notify(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
322 evt = self.eventtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
323 self._check_notify(evt)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
324 # Another time, after an explicit clear()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
325 evt.set()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
326 evt.clear()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
327 self._check_notify(evt)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
328
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
329 def test_timeout(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
330 evt = self.eventtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
331 results1 = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
332 results2 = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
333 N = 5
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
334 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
335 results1.append(evt.wait(0.0))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
336 t1 = time.time()
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
337 r = evt.wait(0.5)
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
338 t2 = time.time()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
339 results2.append((r, t2 - t1))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
340 Bunch(f, N).wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
341 self.assertEqual(results1, [False] * N)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
342 for r, dt in results2:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
343 self.assertFalse(r)
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
344 self.assertTimeout(dt, 0.5)
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
345 # The event is set
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
346 results1 = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
347 results2 = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
348 evt.set()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
349 Bunch(f, N).wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
350 self.assertEqual(results1, [True] * N)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
351 for r, dt in results2:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
352 self.assertTrue(r)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
353
74292
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
354 def test_set_and_clear(self):
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
355 # Issue #13502: check that wait() returns true even when the event is
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
356 # cleared before the waiting thread is woken up.
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
357 evt = self.eventtype()
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
358 results = []
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
359 N = 5
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
360 def f():
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
361 results.append(evt.wait(1))
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
362 b = Bunch(f, N)
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
363 b.wait_for_started()
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
364 time.sleep(0.5)
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
365 evt.set()
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
366 evt.clear()
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
367 b.wait_for_finished()
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
368 self.assertEqual(results, [True] * N)
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 71537
diff changeset
369
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
370
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
371 class ConditionTests(BaseTestCase):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
372 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
373 Tests for condition variables.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
374 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
375
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
376 def test_acquire(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
377 cond = self.condtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
378 # Be default we have an RLock: the condition can be acquired multiple
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
379 # times.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
380 cond.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
381 cond.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
382 cond.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
383 cond.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
384 lock = threading.Lock()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
385 cond = self.condtype(lock)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
386 cond.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
387 self.assertFalse(lock.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
388 cond.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
389 self.assertTrue(lock.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
390 self.assertFalse(cond.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
391 lock.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
392 with cond:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
393 self.assertFalse(lock.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
394
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
395 def test_unacquired_wait(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
396 cond = self.condtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
397 self.assertRaises(RuntimeError, cond.wait)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
398
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
399 def test_unacquired_notify(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
400 cond = self.condtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
401 self.assertRaises(RuntimeError, cond.notify)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
402
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
403 def _check_notify(self, cond):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
404 N = 5
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
405 results1 = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
406 results2 = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
407 phase_num = 0
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
408 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
409 cond.acquire()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
410 result = cond.wait()
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
411 cond.release()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
412 results1.append((result, phase_num))
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
413 cond.acquire()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
414 result = cond.wait()
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
415 cond.release()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
416 results2.append((result, phase_num))
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
417 b = Bunch(f, N)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
418 b.wait_for_started()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
419 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
420 self.assertEqual(results1, [])
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
421 # Notify 3 threads at first
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
422 cond.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
423 cond.notify(3)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
424 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
425 phase_num = 1
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
426 cond.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
427 while len(results1) < 3:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
428 _wait()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
429 self.assertEqual(results1, [(True, 1)] * 3)
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
430 self.assertEqual(results2, [])
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
431 # Notify 5 threads: they might be in their first or second wait
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
432 cond.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
433 cond.notify(5)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
434 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
435 phase_num = 2
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
436 cond.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
437 while len(results1) + len(results2) < 8:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
438 _wait()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
439 self.assertEqual(results1, [(True, 1)] * 3 + [(True, 2)] * 2)
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
440 self.assertEqual(results2, [(True, 2)] * 3)
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
441 # Notify all threads: they are all in their second wait
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
442 cond.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
443 cond.notify_all()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
444 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
445 phase_num = 3
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
446 cond.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
447 while len(results2) < 5:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
448 _wait()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
449 self.assertEqual(results1, [(True, 1)] * 3 + [(True,2)] * 2)
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
450 self.assertEqual(results2, [(True, 2)] * 3 + [(True, 3)] * 2)
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
451 b.wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
452
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
453 def test_notify(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
454 cond = self.condtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
455 self._check_notify(cond)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
456 # A second time, to check internal state is still ok.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
457 self._check_notify(cond)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
458
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
459 def test_timeout(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
460 cond = self.condtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
461 results = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
462 N = 5
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
463 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
464 cond.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
465 t1 = time.time()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
466 result = cond.wait(0.5)
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
467 t2 = time.time()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
468 cond.release()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
469 results.append((t2 - t1, result))
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
470 Bunch(f, N).wait_for_finished()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
471 self.assertEqual(len(results), N)
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
472 for dt, result in results:
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 57158
diff changeset
473 self.assertTimeout(dt, 0.5)
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
474 # Note that conceptually (that"s the condition variable protocol)
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
475 # a wait() may succeed even if no one notifies us and before any
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
476 # timeout occurs. Spurious wakeups can occur.
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
477 # This makes it hard to verify the result value.
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
478 # In practice, this implementation has no spurious wakeups.
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 60665
diff changeset
479 self.assertFalse(result)
57130
e0ddeda0d9c3 Merged revisions 76137 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
480
66229
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
481 def test_waitfor(self):
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
482 cond = self.condtype()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
483 state = 0
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
484 def f():
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
485 with cond:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
486 result = cond.wait_for(lambda : state==4)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
487 self.assertTrue(result)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
488 self.assertEqual(state, 4)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
489 b = Bunch(f, 1)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
490 b.wait_for_started()
70179
a6b4a00fb1c7 Issue #12096: Fix a race condition in test_threading.test_waitfor(). Patch
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69143
diff changeset
491 for i in range(4):
66229
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
492 time.sleep(0.01)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
493 with cond:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
494 state += 1
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
495 cond.notify()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
496 b.wait_for_finished()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
497
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
498 def test_waitfor_timeout(self):
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
499 cond = self.condtype()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
500 state = 0
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
501 success = []
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
502 def f():
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
503 with cond:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
504 dt = time.time()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
505 result = cond.wait_for(lambda : state==4, timeout=0.1)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
506 dt = time.time() - dt
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
507 self.assertFalse(result)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
508 self.assertTimeout(dt, 0.1)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
509 success.append(None)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
510 b = Bunch(f, 1)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
511 b.wait_for_started()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
512 # Only increment 3 times, so state == 4 is never reached.
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
513 for i in range(3):
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
514 time.sleep(0.01)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
515 with cond:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
516 state += 1
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
517 cond.notify()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
518 b.wait_for_finished()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 66219
diff changeset
519 self.assertEqual(len(success), 1)
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
520
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
521
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
522 class BaseSemaphoreTests(BaseTestCase):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
523 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
524 Common tests for {bounded, unbounded} semaphore objects.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
525 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
526
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
527 def test_constructor(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
528 self.assertRaises(ValueError, self.semtype, value = -1)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
529 self.assertRaises(ValueError, self.semtype, value = -sys.maxsize)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
530
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
531 def test_acquire(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
532 sem = self.semtype(1)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
533 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
534 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
535 sem = self.semtype(2)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
536 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
537 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
538 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
539 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
540
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
541 def test_acquire_destroy(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
542 sem = self.semtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
543 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
544 del sem
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
545
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
546 def test_acquire_contended(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
547 sem = self.semtype(7)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
548 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
549 N = 10
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
550 results1 = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
551 results2 = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
552 phase_num = 0
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
553 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
554 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
555 results1.append(phase_num)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
556 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
557 results2.append(phase_num)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
558 b = Bunch(f, 10)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
559 b.wait_for_started()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
560 while len(results1) + len(results2) < 6:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
561 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
562 self.assertEqual(results1 + results2, [0] * 6)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
563 phase_num = 1
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
564 for i in range(7):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
565 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
566 while len(results1) + len(results2) < 13:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
567 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
568 self.assertEqual(sorted(results1 + results2), [0] * 6 + [1] * 7)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
569 phase_num = 2
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
570 for i in range(6):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
571 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
572 while len(results1) + len(results2) < 19:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
573 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
574 self.assertEqual(sorted(results1 + results2), [0] * 6 + [1] * 7 + [2] * 6)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
575 # The semaphore is still locked
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
576 self.assertFalse(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
577 # Final release, to let the last thread finish
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
578 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
579 b.wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
580
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
581 def test_try_acquire(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
582 sem = self.semtype(2)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
583 self.assertTrue(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
584 self.assertTrue(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
585 self.assertFalse(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
586 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
587 self.assertTrue(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
588
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
589 def test_try_acquire_contended(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
590 sem = self.semtype(4)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
591 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
592 results = []
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
593 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
594 results.append(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
595 results.append(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
596 Bunch(f, 5).wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
597 # There can be a thread switch between acquiring the semaphore and
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
598 # appending the result, therefore results will not necessarily be
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
599 # ordered.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
600 self.assertEqual(sorted(results), [False] * 7 + [True] * 3 )
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
601
60665
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
602 def test_acquire_timeout(self):
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
603 sem = self.semtype(2)
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
604 self.assertRaises(ValueError, sem.acquire, False, timeout=1.0)
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
605 self.assertTrue(sem.acquire(timeout=0.005))
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
606 self.assertTrue(sem.acquire(timeout=0.005))
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
607 self.assertFalse(sem.acquire(timeout=0.005))
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
608 sem.release()
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
609 self.assertTrue(sem.acquire(timeout=0.005))
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
610 t = time.time()
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
611 self.assertFalse(sem.acquire(timeout=0.5))
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
612 dt = time.time() - t
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
613 self.assertTimeout(dt, 0.5)
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
614
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
615 def test_default_value(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
616 # The default initial value is 1.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
617 sem = self.semtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
618 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
619 def f():
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
620 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
621 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
622 b = Bunch(f, 1)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
623 b.wait_for_started()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
624 _wait()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
625 self.assertFalse(b.finished)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
626 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
627 b.wait_for_finished()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
628
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
629 def test_with(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
630 sem = self.semtype(2)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
631 def _with(err=None):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
632 with sem:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
633 self.assertTrue(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
634 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
635 with sem:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
636 self.assertFalse(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
637 if err:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
638 raise err
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
639 _with()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
640 self.assertTrue(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
641 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
642 self.assertRaises(TypeError, _with, TypeError)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
643 self.assertTrue(sem.acquire(False))
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
644 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
645
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
646 class SemaphoreTests(BaseSemaphoreTests):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
647 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
648 Tests for unbounded semaphores.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
649 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
650
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
651 def test_release_unacquired(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
652 # Unbounded releases are allowed and increment the semaphore's value
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
653 sem = self.semtype(1)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
654 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
655 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
656 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
657 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
658
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
659
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
660 class BoundedSemaphoreTests(BaseSemaphoreTests):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
661 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
662 Tests for bounded semaphores.
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
663 """
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
664
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
665 def test_release_unacquired(self):
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
666 # Cannot go past the initial value
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
667 sem = self.semtype()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
668 self.assertRaises(ValueError, sem.release)
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
669 sem.acquire()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
670 sem.release()
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff changeset
671 self.assertRaises(ValueError, sem.release)
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
672
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
673
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
674 class BarrierTests(BaseTestCase):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
675 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
676 Tests for Barrier objects.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
677 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
678 N = 5
66219
75a82fe274a7 Use laxer timeouts in barrier tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 65800
diff changeset
679 defaultTimeout = 2.0
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
680
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
681 def setUp(self):
65800
0ec3170faa95 issue 10237
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65751
diff changeset
682 self.barrier = self.barriertype(self.N, timeout=self.defaultTimeout)
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
683 def tearDown(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
684 self.barrier.abort()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
685
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
686 def run_threads(self, f):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
687 b = Bunch(f, self.N-1)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
688 f()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
689 b.wait_for_finished()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
690
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
691 def multipass(self, results, n):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
692 m = self.barrier.parties
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
693 self.assertEqual(m, self.N)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
694 for i in range(n):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
695 results[0].append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
696 self.assertEqual(len(results[1]), i * m)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
697 self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
698 results[1].append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
699 self.assertEqual(len(results[0]), (i + 1) * m)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
700 self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
701 self.assertEqual(self.barrier.n_waiting, 0)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
702 self.assertFalse(self.barrier.broken)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
703
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
704 def test_barrier(self, passes=1):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
705 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
706 Test that a barrier is passed in lockstep
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
707 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
708 results = [[],[]]
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
709 def f():
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
710 self.multipass(results, passes)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
711 self.run_threads(f)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
712
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
713 def test_barrier_10(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
714 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
715 Test that a barrier works for 10 consecutive runs
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
716 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
717 return self.test_barrier(10)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
718
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
719 def test_wait_return(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
720 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
721 test the return value from barrier.wait
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
722 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
723 results = []
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
724 def f():
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
725 r = self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
726 results.append(r)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
727
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
728 self.run_threads(f)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
729 self.assertEqual(sum(results), sum(range(self.N)))
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
730
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
731 def test_action(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
732 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
733 Test the 'action' callback
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
734 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
735 results = []
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
736 def action():
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
737 results.append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
738 barrier = self.barriertype(self.N, action)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
739 def f():
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
740 barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
741 self.assertEqual(len(results), 1)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
742
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
743 self.run_threads(f)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
744
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
745 def test_abort(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
746 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
747 Test that an abort will put the barrier in a broken state
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
748 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
749 results1 = []
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
750 results2 = []
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
751 def f():
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
752 try:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
753 i = self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
754 if i == self.N//2:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
755 raise RuntimeError
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
756 self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
757 results1.append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
758 except threading.BrokenBarrierError:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
759 results2.append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
760 except RuntimeError:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
761 self.barrier.abort()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
762 pass
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
763
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
764 self.run_threads(f)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
765 self.assertEqual(len(results1), 0)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
766 self.assertEqual(len(results2), self.N-1)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
767 self.assertTrue(self.barrier.broken)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
768
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
769 def test_reset(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
770 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
771 Test that a 'reset' on a barrier frees the waiting threads
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
772 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
773 results1 = []
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
774 results2 = []
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
775 results3 = []
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
776 def f():
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
777 i = self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
778 if i == self.N//2:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
779 # Wait until the other threads are all in the barrier.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
780 while self.barrier.n_waiting < self.N-1:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
781 time.sleep(0.001)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
782 self.barrier.reset()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
783 else:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
784 try:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
785 self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
786 results1.append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
787 except threading.BrokenBarrierError:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
788 results2.append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
789 # Now, pass the barrier again
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
790 self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
791 results3.append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
792
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
793 self.run_threads(f)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
794 self.assertEqual(len(results1), 0)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
795 self.assertEqual(len(results2), self.N-1)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
796 self.assertEqual(len(results3), self.N)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
797
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
798
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
799 def test_abort_and_reset(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
800 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
801 Test that a barrier can be reset after being broken.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
802 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
803 results1 = []
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
804 results2 = []
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
805 results3 = []
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
806 barrier2 = self.barriertype(self.N)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
807 def f():
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
808 try:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
809 i = self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
810 if i == self.N//2:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
811 raise RuntimeError
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
812 self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
813 results1.append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
814 except threading.BrokenBarrierError:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
815 results2.append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
816 except RuntimeError:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
817 self.barrier.abort()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
818 pass
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
819 # Synchronize and reset the barrier. Must synchronize first so
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
820 # that everyone has left it when we reset, and after so that no
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
821 # one enters it before the reset.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
822 if barrier2.wait() == self.N//2:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
823 self.barrier.reset()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
824 barrier2.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
825 self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
826 results3.append(True)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
827
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
828 self.run_threads(f)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
829 self.assertEqual(len(results1), 0)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
830 self.assertEqual(len(results2), self.N-1)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
831 self.assertEqual(len(results3), self.N)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
832
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
833 def test_timeout(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
834 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
835 Test wait(timeout)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
836 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
837 def f():
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
838 i = self.barrier.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
839 if i == self.N // 2:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
840 # One thread is late!
66219
75a82fe274a7 Use laxer timeouts in barrier tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 65800
diff changeset
841 time.sleep(1.0)
75a82fe274a7 Use laxer timeouts in barrier tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 65800
diff changeset
842 # Default timeout is 2.0, so this is shorter.
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
843 self.assertRaises(threading.BrokenBarrierError,
66219
75a82fe274a7 Use laxer timeouts in barrier tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 65800
diff changeset
844 self.barrier.wait, 0.5)
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
845 self.run_threads(f)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
846
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
847 def test_default_timeout(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
848 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
849 Test the barrier's default timeout
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
850 """
71537
aa9c0fdf2143 Issue #11871: In test_threading.BarrierTests, bump the default barrier timeout
Charles-François Natali <neologix@free.fr>
parents: 70179
diff changeset
851 # create a barrier with a low default timeout
aa9c0fdf2143 Issue #11871: In test_threading.BarrierTests, bump the default barrier timeout
Charles-François Natali <neologix@free.fr>
parents: 70179
diff changeset
852 barrier = self.barriertype(self.N, timeout=0.3)
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
853 def f():
65800
0ec3170faa95 issue 10237
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65751
diff changeset
854 i = barrier.wait()
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
855 if i == self.N // 2:
71537
aa9c0fdf2143 Issue #11871: In test_threading.BarrierTests, bump the default barrier timeout
Charles-François Natali <neologix@free.fr>
parents: 70179
diff changeset
856 # One thread is later than the default timeout of 0.3s.
66219
75a82fe274a7 Use laxer timeouts in barrier tests
Antoine Pitrou <solipsis@pitrou.net>
parents: 65800
diff changeset
857 time.sleep(1.0)
65800
0ec3170faa95 issue 10237
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65751
diff changeset
858 self.assertRaises(threading.BrokenBarrierError, barrier.wait)
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
859 self.run_threads(f)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
860
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
861 def test_single_thread(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
862 b = self.barriertype(1)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
863 b.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
864 b.wait()