mirror of
https://github.com/python/cpython.git
synced 2025-11-01 10:45:30 +00:00
Merged revisions 83918 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r83918 | antoine.pitrou | 2010-08-10 00:38:19 +0200 (mar., 10 août 2010) | 5 lines 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
7a956cc74e
commit
87d5260362
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
|
||||
|
|
@ -116,6 +116,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