mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
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.
This commit is contained in:
parent
6e451df800
commit
5af4f4b983
3 changed files with 244 additions and 47 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue