From: Raymond Hettinger <python@rcn.com>
Date: Fri, 1 Mar 2013 11:47:57 +0000 (-0800)
Subject: Don't deadlock on a reentrant call.
X-Git-Tag: v3.3.1rc1~110
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fd54117a682224200ce057a60b0205b0e13948d2;p=python

Don't deadlock on a reentrant call.
---

diff --git a/Lib/functools.py b/Lib/functools.py
index 226a46eb21..71022e53c8 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -14,9 +14,9 @@ __all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES',
 from _functools import partial, reduce
 from collections import namedtuple
 try:
-    from _thread import allocate_lock as Lock
+    from _thread import RLock
 except:
-    from _dummy_thread import allocate_lock as Lock
+    from dummy_threading import RLock
 
 
 ################################################################################
@@ -207,7 +207,7 @@ def lru_cache(maxsize=128, typed=False):
         hits = misses = currsize = 0
         full = False
         cache_get = cache.get    # bound method to lookup a key or return None
-        lock = Lock()            # because linkedlist updates aren't threadsafe
+        lock = RLock()           # because linkedlist updates aren't threadsafe
         root = []                # root of the circular doubly linked list
         root[:] = [root, root, None, None]     # initialize by pointing to self