From 71a0451f67b41e326a14f4ae1481cb72e462881d Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Sat, 19 Jan 2008 13:46:06 +0000 Subject: Added unit test to verify that threading.local doesn't cause ref leaks. It seems that the thread local storage always keeps the storage of the last stopped thread alive. Can anybody comment on it, please? --- Lib/test/test_threading_local.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_threading_local.py b/Lib/test/test_threading_local.py index 0aaedbc..7c2b9f4 100644 --- a/Lib/test/test_threading_local.py +++ b/Lib/test/test_threading_local.py @@ -1,9 +1,35 @@ import unittest from doctest import DocTestSuite from test import test_support +import threading +import weakref + +class Weak(object): + pass + +def target(local, weaklist): + weak = Weak() + local.weak = weak + weaklist.append(weakref.ref(weak)) + +class ThreadingLocalTest(unittest.TestCase): + def test_local_refs(self): + local = threading.local() + weaklist = [] + n = 20 + for i in range(n): + t = threading.Thread(target=target, args=(local, weaklist)) + t.start() + t.join() + self.assertEqual(len(weaklist), n) + deadlist = [weak for weak in weaklist if weak() is None] + # XXX threading.local keeps the local of the last stopped thread alive + self.assertEqual(len(deadlist), n-1) def test_main(): - suite = DocTestSuite('_threading_local') + suite = unittest.TestSuite() + suite.addTest(DocTestSuite('_threading_local')) + suite.addTest(unittest.makeSuite(ThreadingLocalTest)) try: from thread import _local -- cgit v0.12