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