From: Tim Peters Date: Mon, 17 Apr 2006 21:12:33 +0000 (+0000) Subject: local.__del__(): This didn't actually do anything, because of too X-Git-Tag: v2.5a2~152 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c7605f21ae5c5b9e695c8a2346bc21357a84c6b3;p=python local.__del__(): This didn't actually do anything, because of too much convolution <0.5 wink>. Simplified to the point that it works, and test_threading_local no longer reports leaks under -R. Thanks to Thomas Wouters for initial analysis. --- diff --git a/Lib/_threading_local.py b/Lib/_threading_local.py index 90717a8d84..1350ddfc14 100644 --- a/Lib/_threading_local.py +++ b/Lib/_threading_local.py @@ -133,7 +133,7 @@ affects what we see: >>> del mydata """ -# Threading import is at end +from threading import currentThread, RLock, enumerate class _localbase(object): __slots__ = '_local__key', '_local__args', '_local__lock' @@ -203,35 +203,30 @@ class local(_localbase): lock.release() - def __del__(): - threading_enumerate = enumerate - __getattribute__ = object.__getattribute__ + # The default argument is a hack, to give __del__ a local name for + # threading.enumerate (sidestepping problems with Python None'ing-out + # module globals at shutdown time). + def __del__(self, _threading_enumerate=enumerate): - def __del__(self): - key = __getattribute__(self, '_local__key') + key = object.__getattribute__(self, '_local__key') + try: + threads = list(_threading_enumerate()) + except: + # If enumerate fails, as it seems to do during + # shutdown, we'll skip cleanup under the assumption + # that there is nothing to clean up. + return + + for thread in threads: try: - threads = list(threading_enumerate()) - except: - # if enumerate fails, as it seems to do during - # shutdown, we'll skip cleanup under the assumption - # that there is nothing to clean up - return - - for thread in threads: - try: - __dict__ = thread.__dict__ - except AttributeError: - # Thread is dying, rest in peace - continue - - if key in __dict__: - try: - del __dict__[key] - except KeyError: - pass # didn't have anything in this thread + __dict__ = thread.__dict__ + except AttributeError: + # Thread is dying, rest in peace. + continue - return __del__ - __del__ = __del__() - -from threading import currentThread, enumerate, RLock + if key in __dict__: + try: + del __dict__[key] + except KeyError: + pass # didn't have anything in this thread diff --git a/Misc/NEWS b/Misc/NEWS index 94398138c7..2af861680d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -72,6 +72,9 @@ Extension Modules Library ------- +- The ``__del__`` method of class ``local`` in module ``_threading_local`` + returned before accomplishing any of its intended cleanup. + - Patch #790710: Add breakpoint command lists in pdb. - Patch #1063914: Add Tkinter.Misc.clipboard_get().