diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2009-11-09 16:00:11 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-11-09 16:00:11 (GMT) |
commit | d7158d4c628a88486475b3da333eace7b650ef77 (patch) | |
tree | 082fb878bdec2ea88ee04d6c8351de778a9ef8a4 /Lib/threading.py | |
parent | d19915ed76e31534f4f075c1c37c4972ace8fc42 (diff) | |
download | cpython-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.py | 18 |
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): |