Mercurial > cpython-lru_cache-weakref
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 |
| 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() |
