[Python-checkins] [2.7] bpo-31160: Backport reap_children fixes from master to 2.7 (#3063)

Victor Stinner webhook-mailer at python.org
Thu Aug 10 10:45:43 EDT 2017


https://github.com/python/cpython/commit/1247e2cda514d7a73187e0b53ec8c35d87a34a84
commit: 1247e2cda514d7a73187e0b53ec8c35d87a34a84
branch: 2.7
author: Victor Stinner <victor.stinner at gmail.com>
committer: GitHub <noreply at github.com>
date: 2017年08月10日T16:45:38+02:00
summary:
[2.7] bpo-31160: Backport reap_children fixes from master to 2.7 (#3063)
* 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)
files:
M Lib/test/regrtest.py
M Lib/test/test_tempfile.py
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index 7a48475ee8a..7096de8469a 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -1172,6 +1172,9 @@ def __exit__(self, exc_type, exc_val, exc_tb):
 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:
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
index 5c85cc9bd30..5c111a29ca6 100644
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -141,12 +141,15 @@ def test_process_awareness(self):
 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 @@ def test_process_awareness(self):
 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)


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /