summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-11-10 18:46:01 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2009-11-10 18:46:01 (GMT)
commit434736a1a621f785858e58efe682320178de7993 (patch)
treecbd08641338319c3c8d6c85d3680ee6c8dad279a /Lib
parent0e31201848f45db86bea6bf5bd196e2db88fbfbe (diff)
downloadcpython-434736a1a621f785858e58efe682320178de7993.zip
cpython-434736a1a621f785858e58efe682320178de7993.tar.gz
cpython-434736a1a621f785858e58efe682320178de7993.tar.bz2
Issue #3001: Add a C implementation of recursive locks which is used by
default when instantiating a `Threading.RLock` object. This makes recursive locks as fast as regular non-recursive locks (previously, they were slower by 10x to 15x).
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_threading.py9
-rw-r--r--Lib/threading.py14
2 files changed, 18 insertions, 5 deletions
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index 41f57dc..330a2c5 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -506,8 +506,11 @@ class ThreadingExceptionTests(BaseTestCase):
class LockTests(lock_tests.LockTests):
locktype = staticmethod(threading.Lock)
-class RLockTests(lock_tests.RLockTests):
- locktype = staticmethod(threading.RLock)
+class PyRLockTests(lock_tests.RLockTests):
+ locktype = staticmethod(threading._PyRLock)
+
+class CRLockTests(lock_tests.RLockTests):
+ locktype = staticmethod(threading._CRLock)
class EventTests(lock_tests.EventTests):
eventtype = staticmethod(threading.Event)
@@ -527,7 +530,7 @@ class BoundedSemaphoreTests(lock_tests.BoundedSemaphoreTests):
def test_main():
- test.support.run_unittest(LockTests, RLockTests, EventTests,
+ test.support.run_unittest(LockTests, PyRLockTests, CRLockTests, EventTests,
ConditionAsRLockTests, ConditionTests,
SemaphoreTests, BoundedSemaphoreTests,
ThreadTests,
diff --git a/Lib/threading.py b/Lib/threading.py
index 4bb0182..0e77060 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -27,6 +27,10 @@ _start_new_thread = _thread.start_new_thread
_allocate_lock = _thread.allocate_lock
_get_ident = _thread.get_ident
ThreadError = _thread.error
+try:
+ _CRLock = _thread.RLock
+except AttributeError:
+ _CRLock = None
del _thread
@@ -79,8 +83,12 @@ def settrace(func):
Lock = _allocate_lock
-def RLock(*args, **kwargs):
- return _RLock(*args, **kwargs)
+def RLock(verbose=None, *args, **kwargs):
+ if verbose is None:
+ verbose = _VERBOSE
+ if (__debug__ and verbose) or _CRLock is None:
+ return _PyRLock(verbose, *args, **kwargs)
+ return _CRLock(*args, **kwargs)
class _RLock(_Verbose):
@@ -156,6 +164,8 @@ class _RLock(_Verbose):
def _is_owned(self):
return self._owner == _get_ident()
+_PyRLock = _RLock
+
def Condition(*args, **kwargs):
return _Condition(*args, **kwargs)