diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2017-08-10 14:02:00 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-10 14:02:00 (GMT) |
commit | 719a15b32587de6c4add4385ee3f84a20711340f (patch) | |
tree | 5efcc479e576699f3f7466c6cd1ecac6bf01e3e7 | |
parent | 646f6c3096abfe5bde13f039ebf32bce5baf083a (diff) | |
download | cpython-719a15b32587de6c4add4385ee3f84a20711340f.zip cpython-719a15b32587de6c4add4385ee3f84a20711340f.tar.gz cpython-719a15b32587de6c4add4385ee3f84a20711340f.tar.bz2 |
[3.6] bpo-31160: Backport reap_children() fixes from master to 3.6 (#3060)
* bpo-31160: Fix test_builtin for zombie process (#3043)
PtyTests.run_child() now calls os.waitpid() to read the exit status
of the child process to avoid creating zombie process and leaking
processes in the background.
(cherry picked from commit 4baca1b0f7325032598cd38e7ceffc79b616d255)
* 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_builtin: don't check waitpid() status (#3050)
(cherry picked from commit 3ca9f50f96cfa5c1b7aa56639042531b57f07fbb)
* 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)
-rw-r--r-- | Lib/test/libregrtest/runtest.py | 5 | ||||
-rw-r--r-- | Lib/test/test_builtin.py | 4 | ||||
-rw-r--r-- | Lib/test/test_tempfile.py | 8 |
3 files changed, 16 insertions, 1 deletions
diff --git a/Lib/test/libregrtest/runtest.py b/Lib/test/libregrtest/runtest.py index fda4ca1..d716b83 100644 --- a/Lib/test/libregrtest/runtest.py +++ b/Lib/test/libregrtest/runtest.py @@ -143,6 +143,10 @@ def runtest(ns, test): runtest.stringio = None +def post_test_cleanup(): + support.reap_children() + + def runtest_inner(ns, test, display_failure=True): support.unload(test) @@ -170,6 +174,7 @@ def runtest_inner(ns, test, display_failure=True): if ns.huntrleaks: refleak = dash_R(the_module, test, test_runner, ns.huntrleaks) test_time = time.time() - start_time + post_test_cleanup() except support.ResourceDenied as msg: if not ns.quiet and not ns.pgo: print(test, "skipped --", msg, flush=True) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 7a4b7eb..49c4a53 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1560,6 +1560,10 @@ class PtyTests(unittest.TestCase): self.fail("got %d lines in pipe but expected 2, child output was:\n%s" % (len(lines), child_output)) os.close(fd) + + # Wait until the child process completes + os.waitpid(pid, 0) + return lines def check_input_tty(self, prompt, terminal_input, stdio_encoding=None): diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index d0cf04b..710756b 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -78,7 +78,6 @@ class BaseTestCase(unittest.TestCase): def tearDown(self): self._warnings_manager.__exit__(None, None, None) - def nameCheck(self, name, dir, pre, suf): (ndir, nbase) = os.path.split(name) npre = nbase[:len(pre)] @@ -184,12 +183,15 @@ class TestRandomNameSequence(BaseTestCase): 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: @@ -200,6 +202,10 @@ class TestRandomNameSequence(BaseTestCase): os.kill(pid, signal.SIGKILL) except OSError: 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) |