aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/lock_tests.py36
-rw-r--r--Lib/test/test_importlib/test_locks.py2
-rw-r--r--Lib/test/test_threading.py3
3 files changed, 41 insertions, 0 deletions
diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py
index 0890ec87afd..e53e24b18f2 100644
--- a/Lib/test/lock_tests.py
+++ b/Lib/test/lock_tests.py
@@ -330,6 +330,42 @@ class RLockTests(BaseLockTests):
lock.release()
self.assertRaises(RuntimeError, lock._release_save)
+ def test_recursion_count(self):
+ lock = self.locktype()
+ self.assertEqual(0, lock._recursion_count())
+ lock.acquire()
+ self.assertEqual(1, lock._recursion_count())
+ lock.acquire()
+ lock.acquire()
+ self.assertEqual(3, lock._recursion_count())
+ lock.release()
+ self.assertEqual(2, lock._recursion_count())
+ lock.release()
+ lock.release()
+ self.assertEqual(0, lock._recursion_count())
+
+ phase = []
+
+ def f():
+ lock.acquire()
+ phase.append(None)
+ while len(phase) == 1:
+ _wait()
+ lock.release()
+ phase.append(None)
+
+ with threading_helper.wait_threads_exit():
+ start_new_thread(f, ())
+ while len(phase) == 0:
+ _wait()
+ self.assertEqual(len(phase), 1)
+ self.assertEqual(0, lock._recursion_count())
+ phase.append(None)
+ while len(phase) == 2:
+ _wait()
+ self.assertEqual(len(phase), 3)
+ self.assertEqual(0, lock._recursion_count())
+
def test_different_thread(self):
# Cannot release from a different thread
lock = self.locktype()
diff --git a/Lib/test/test_importlib/test_locks.py b/Lib/test/test_importlib/test_locks.py
index ba9cf51c261..7091c36aaaf 100644
--- a/Lib/test/test_importlib/test_locks.py
+++ b/Lib/test/test_importlib/test_locks.py
@@ -29,6 +29,8 @@ class ModuleLockAsRLockTests:
test_timeout = None
# _release_save() unsupported
test_release_save_unacquired = None
+ # _recursion_count() unsupported
+ test_recursion_count = None
# lock status in repr unsupported
test_repr = None
test_locked_repr = None
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index 9c16c4044f6..71fcad268b8 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -1783,6 +1783,9 @@ class ConditionAsRLockTests(lock_tests.RLockTests):
# Condition uses an RLock by default and exports its API.
locktype = staticmethod(threading.Condition)
+ def test_recursion_count(self):
+ self.skipTest("Condition does not expose _recursion_count()")
+
class ConditionTests(lock_tests.ConditionTests):
condtype = staticmethod(threading.Condition)