[Python-checkins] r45498 - in python/trunk: Lib/_threading_local.py Misc/NEWS

tim.peters python-checkins at python.org
Mon Apr 17 23:12:34 CEST 2006


Author: tim.peters
Date: Mon Apr 17 23:12:33 2006
New Revision: 45498

Modified:
   python/trunk/Lib/_threading_local.py
   python/trunk/Misc/NEWS
Log:
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.


Modified: python/trunk/Lib/_threading_local.py
==============================================================================
--- python/trunk/Lib/_threading_local.py	(original)
+++ python/trunk/Lib/_threading_local.py	Mon Apr 17 23:12:33 2006
@@ -133,7 +133,7 @@
 >>> 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 @@
             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
+                __dict__ = thread.__dict__
+            except AttributeError:
+                # Thread is dying, rest in peace.
+                continue
 
-            for thread in threads:
+            if key in __dict__:
                 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
-
-        return __del__
-    __del__ = __del__()
-
-from threading import currentThread, enumerate, RLock
+                    del __dict__[key]
+                except KeyError:
+                    pass # didn't have anything in this thread

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Mon Apr 17 23:12:33 2006
@@ -72,6 +72,9 @@
 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().


More information about the Python-checkins mailing list