summaryrefslogtreecommitdiffstats
path: root/Lib/threading.py
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-11-09 16:00:11 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2009-11-09 16:00:11 (GMT)
commitd7158d4c628a88486475b3da333eace7b650ef77 (patch)
tree082fb878bdec2ea88ee04d6c8351de778a9ef8a4 /Lib/threading.py
parentd19915ed76e31534f4f075c1c37c4972ace8fc42 (diff)
downloadcpython-d7158d4c628a88486475b3da333eace7b650ef77.zip
cpython-d7158d4c628a88486475b3da333eace7b650ef77.tar.gz
cpython-d7158d4c628a88486475b3da333eace7b650ef77.tar.bz2
Issue #7282: Fix a memory leak when an RLock was used in a thread other
than those started through `threading.Thread` (for example, using `thread.start_new_thread()`.
Diffstat (limited to 'Lib/threading.py')
-rw-r--r--Lib/threading.py18
1 files changed, 10 insertions, 8 deletions
diff --git a/Lib/threading.py b/Lib/threading.py
index 9ad5122..4f6ec4b 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -106,14 +106,16 @@ class _RLock(_Verbose):
def __repr__(self):
owner = self.__owner
- return "<%s(%s, %d)>" % (
- self.__class__.__name__,
- owner and owner.name,
- self.__count)
+ try:
+ owner = _active[owner].name
+ except KeyError:
+ pass
+ return "<%s owner=%r count=%d>" % (
+ self.__class__.__name__, owner, self.__count)
def acquire(self, blocking=1):
- me = current_thread()
- if self.__owner is me:
+ me = _get_ident()
+ if self.__owner == me:
self.__count = self.__count + 1
if __debug__:
self._note("%s.acquire(%s): recursive success", self, blocking)
@@ -132,7 +134,7 @@ class _RLock(_Verbose):
__enter__ = acquire
def release(self):
- if self.__owner is not current_thread():
+ if self.__owner != _get_ident():
raise RuntimeError("cannot release un-acquired lock")
self.__count = count = self.__count - 1
if not count:
@@ -168,7 +170,7 @@ class _RLock(_Verbose):
return (count, owner)
def _is_owned(self):
- return self.__owner is current_thread()
+ return self.__owner == _get_ident()
def Condition(*args, **kwargs):