]> granicus.if.org Git - python/commitdiff
[2.7] bpo-31160: Backport reap_children fixes from master to 2.7 (#3063)
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 10 Aug 2017 14:45:38 +0000 (16:45 +0200)
committerGitHub <noreply@github.com>
Thu, 10 Aug 2017 14:45:38 +0000 (16:45 +0200)
* bpo-31160: regrtest now reaps child processes (#3044)

Add a post_test_cleanup() function which currently only calls
support.reap_children().
(cherry picked from commit e3510d74aacc477c30f42f2b941d69689bbc478e)

* bpo-31160: test_tempfile: Fix reap_children() warning (#3056)

TestRandomNameSequence.test_process_awareness() now calls
os.waitpid() to avoid leaking a zombie process.
(cherry picked from commit 6c8c2943d996b59a48d331f61f22cbe72933910e)

Lib/test/regrtest.py
Lib/test/test_tempfile.py

index 7a48475ee8af447c87847660a6df09f91bf3c533..7096de8469ab182d005fde28078af207ccc98fd7 100755 (executable)
@@ -1172,6 +1172,9 @@ class saved_test_environment:
         return False
 
 
+def post_test_cleanup():
+    test_support.reap_children()
+
 def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=None):
     test_support.unload(test)
     if verbose:
@@ -1205,6 +1208,7 @@ def runtest_inner(test, verbose, quiet, huntrleaks=False, pgo=False, testdir=Non
                     refleak = dash_R(the_module, test, indirect_test,
                         huntrleaks)
                 test_time = time.time() - start_time
+            post_test_cleanup()
         finally:
             sys.stdout = save_stdout
     except test_support.ResourceDenied, msg:
index 5c85cc9bd306d4d16abcb24fb5c7f6a421f10468..5c111a29ca60be1e8e8bc79870a39b083e2a34a4 100644 (file)
@@ -141,12 +141,15 @@ class test__RandomNameSequence(TC):
         try:
             pid = os.fork()
             if not pid:
+                # child process
                 os.close(read_fd)
                 os.write(write_fd, next(self.r).encode("ascii"))
                 os.close(write_fd)
                 # bypass the normal exit handlers- leave those to
                 # the parent.
                 os._exit(0)
+
+            # parent process
             parent_value = next(self.r)
             child_value = os.read(read_fd, len(parent_value)).decode("ascii")
         finally:
@@ -157,6 +160,10 @@ class test__RandomNameSequence(TC):
                     os.kill(pid, signal.SIGKILL)
                 except EnvironmentError:
                     pass
+
+                # Read the process exit status to avoid zombie process
+                os.waitpid(pid, 0)
+
             os.close(read_fd)
             os.close(write_fd)
         self.assertNotEqual(child_value, parent_value)