]> granicus.if.org Git - python/commitdiff
local.__del__(): This didn't actually do anything, because of too
authorTim Peters <tim.peters@gmail.com>
Mon, 17 Apr 2006 21:12:33 +0000 (21:12 +0000)
committerTim Peters <tim.peters@gmail.com>
Mon, 17 Apr 2006 21:12:33 +0000 (21:12 +0000)
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.

Lib/_threading_local.py
Misc/NEWS

index 90717a8d84c99bd37138c0c51c211388537f81a8..1350ddfc141501116ddc88b35a81304de83eccc8 100644 (file)
@@ -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
index 94398138c70ce1375427877695d5c656646ffd32..2af861680df0897b91a5a0efe64f1ae6733a322d 100644 (file)
--- 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().