diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2009-11-10 18:46:01 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-11-10 18:46:01 (GMT) |
commit | 434736a1a621f785858e58efe682320178de7993 (patch) | |
tree | cbd08641338319c3c8d6c85d3680ee6c8dad279a /Lib/threading.py | |
parent | 0e31201848f45db86bea6bf5bd196e2db88fbfbe (diff) | |
download | cpython-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/threading.py')
-rw-r--r-- | Lib/threading.py | 14 |
1 files changed, 12 insertions, 2 deletions
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) |