import thread
import time
import unittest
+import weakref
# A trivial mutable counter.
class Counter(object):
finally:
sys.setcheckinterval(old_interval)
+ def test_no_refcycle_through_target(self):
+ class RunSelfFunction(object):
+ def __init__(self):
+ # The links in this refcycle from Thread back to self
+ # should be cleaned up when the thread completes.
+ self.thread = threading.Thread(target=self._run,
+ args=(self,),
+ kwargs={'yet_another':self})
+ self.thread.start()
+
+ def _run(self, other_ref, yet_another):
+ pass
+
+ cyclic_object = RunSelfFunction()
+ weak_cyclic_object = weakref.ref(cyclic_object)
+ cyclic_object.thread.join()
+ del cyclic_object
+ self.assertEquals(None, weak_cyclic_object())
+
class ThreadingExceptionTests(unittest.TestCase):
# A RuntimeError should be raised if Thread.start() is called
def run(self):
if self.__target:
self.__target(*self.__args, **self.__kwargs)
+ # Avoid a refcycle if the thread is running a function with an
+ # argument that has a member that points to the thread.
+ del self.__target, self.__args, self.__kwargs
def __bootstrap(self):
# Wrapper around the real bootstrap code that ignores