diff options
| author | Tim Peters <tim.peters@gmail.com> | 2006-04-17 21:12:33 +0000 |
|---|---|---|
| committer | Tim Peters <tim.peters@gmail.com> | 2006-04-17 21:12:33 +0000 |
| commit | f980a8289ceec5c347f76c97f16ec2c405bbf34d (patch) | |
| tree | fe6c4e9f24abd593314cbdb1b2b609e16cc64d08 /Lib/_threading_local.py | |
| parent | 3c5364917d435ae15cbb87f74173d9eedca8efe4 (diff) | |
| download | cpython-f980a8289ceec5c347f76c97f16ec2c405bbf34d.tar.gz | |
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.
Diffstat (limited to 'Lib/_threading_local.py')
| -rw-r--r-- | Lib/_threading_local.py | 53 |
1 files changed, 24 insertions, 29 deletions
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 |
