summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-08-09 22:38:19 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-08-09 22:38:19 (GMT)
commit5af4f4b9832411476caf8cf3f571f974056d4f1b (patch)
tree942e1de0ae5082a3687c1eadc411b12610ff42c4 /Lib
parent6e451df800af66eefe68ea15938bd65029af06c5 (diff)
downloadcpython-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.py18
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