From: Antoine Pitrou <pitrou@free.fr>
Date: Wed, 28 Jun 2017 09:21:52 +0000 (+0200)
Subject: bpo-30775: Fix refleaks in test_multiprocessing (#2467)
X-Git-Tag: v3.7.0a1~500
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a79f8faccf5e26f55e8b9496ad49d2071b5e299c;p=python

bpo-30775: Fix refleaks in test_multiprocessing (#2467)

Forgetting to call Process.join() can keep some resources alive.
---

diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index d4a461dc5e..7dae3c498d 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -1253,10 +1253,19 @@ class Bunch(object):
         self._can_exit = namespace.Event()
         if not wait_before_exit:
             self._can_exit.set()
+
+        threads = []
         for i in range(n):
             p = namespace.Process(target=self.task)
             p.daemon = True
             p.start()
+            threads.append(p)
+
+        def finalize(threads):
+            for p in threads:
+                p.join()
+
+        self._finalizer = weakref.finalize(self, finalize, threads)
 
     def task(self):
         pid = os.getpid()
@@ -1279,6 +1288,9 @@ class Bunch(object):
     def do_finish(self):
         self._can_exit.set()
 
+    def close(self):
+        self._finalizer()
+
 
 class AppendTrue(object):
     def __init__(self, obj):
@@ -1311,8 +1323,11 @@ class _TestBarrier(BaseTestCase):
 
     def run_threads(self, f, args):
         b = Bunch(self, f, args, self.N-1)
-        f(*args)
-        b.wait_for_finished()
+        try:
+            f(*args)
+            b.wait_for_finished()
+        finally:
+            b.close()
 
     @classmethod
     def multipass(cls, barrier, results, n):