diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2010-08-09 22:38:19 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2010-08-09 22:38:19 (GMT) |
commit | 5af4f4b9832411476caf8cf3f571f974056d4f1b (patch) | |
tree | 942e1de0ae5082a3687c1eadc411b12610ff42c4 /Lib | |
parent | 6e451df800af66eefe68ea15938bd65029af06c5 (diff) | |
download | cpython-5af4f4b9832411476caf8cf3f571f974056d4f1b.zip cpython-5af4f4b9832411476caf8cf3f571f974056d4f1b.tar.gz cpython-5af4f4b9832411476caf8cf3f571f974056d4f1b.tar.bz2 |
Issue #3757: thread-local objects now support cyclic garbage collection.
Thread-local objects involved in reference cycles will be deallocated
timely by the cyclic GC, even if the underlying thread is still running.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_threading_local.py | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/Lib/test/test_threading_local.py b/Lib/test/test_threading_local.py index 391bf00..0a0a008 100644 --- a/Lib/test/test_threading_local.py +++ b/Lib/test/test_threading_local.py @@ -38,9 +38,9 @@ class BaseLocalTest: gc.collect() self.assertEqual(len(weaklist), n) - # XXX threading.local keeps the local of the last stopped thread alive. + # XXX _threading_local keeps the local of the last stopped thread alive. deadlist = [weak for weak in weaklist if weak() is None] - self.assertEqual(len(deadlist), n-1) + self.assertIn(len(deadlist), (n-1, n)) # Assignment to the same thread local frees it sometimes (!) local.someothervar = None @@ -127,6 +127,20 @@ class BaseLocalTest: class ThreadLocalTest(unittest.TestCase, BaseLocalTest): _local = _thread._local + # Fails for the pure Python implementation + def test_cycle_collection(self): + class X: + pass + + x = X() + x.local = self._local() + x.local.x = x + wr = weakref.ref(x) + del x + gc.collect() + self.assertIs(wr(), None) + + class PyThreadingLocalTest(unittest.TestCase, BaseLocalTest): _local = _threading_local.local |