summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-08-10 14:02:00 (GMT)
committerGitHub <noreply@github.com>2017-08-10 14:02:00 (GMT)
commit719a15b32587de6c4add4385ee3f84a20711340f (patch)
tree5efcc479e576699f3f7466c6cd1ecac6bf01e3e7
parent646f6c3096abfe5bde13f039ebf32bce5baf083a (diff)
downloadcpython-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.py5
-rw-r--r--Lib/test/test_builtin.py4
-rw-r--r--Lib/test/test_tempfile.py8
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)