mirror of
https://github.com/python/cpython.git
synced 2025-09-13 12:17:24 +00:00
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.
This commit is contained in:
parent
ab1d245871
commit
c7605f21ae
2 changed files with 26 additions and 28 deletions
|
@ -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
|
||||
__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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue