]> granicus.if.org Git - python/commitdiff
Added unit test to verify that threading.local doesn't cause ref leaks. It seems...
authorChristian Heimes <christian@cheimes.de>
Sat, 19 Jan 2008 13:46:06 +0000 (13:46 +0000)
committerChristian Heimes <christian@cheimes.de>
Sat, 19 Jan 2008 13:46:06 +0000 (13:46 +0000)
Lib/test/test_threading_local.py

index 0aaedbc93b53828757199d9b6c6f8e9c696833b1..7c2b9f43fe4f7bed850e61dc4bb8d26ea8f5f708 100644 (file)
@@ -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