diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2017-08-10 14:01:47 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-10 14:01:47 (GMT) |
commit | b5011479808b80545bdd1246725fc7940691b084 (patch) | |
tree | d173af1620fb279835d0a134ac164bd3eb46d557 /Lib/test/support | |
parent | aa8ec34ad52bb3b274ce91169e1bc4a598655049 (diff) | |
download | cpython-b5011479808b80545bdd1246725fc7940691b084.zip cpython-b5011479808b80545bdd1246725fc7940691b084.tar.gz cpython-b5011479808b80545bdd1246725fc7940691b084.tar.bz2 |
Enhance support.reap_children() (#3036)
* reap_children() now sets environment_altered to True to detect bugs
using python3 -m test --fail-env-changed
* Replace bare "except:" with "except OSError:" in reap_children()
* Write an unit test for reap_children() using a timeout of 60
seconds
Diffstat (limited to 'Lib/test/support')
-rw-r--r-- | Lib/test/support/__init__.py | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 7a4671c..0235498 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2073,26 +2073,35 @@ def reap_threads(func): threading_cleanup(*key) return decorator + def reap_children(): """Use this function at the end of test_main() whenever sub-processes are started. This will help ensure that no extra children (zombies) stick around to hog resources and create problems when looking for refleaks. """ + global environment_altered + + # Need os.waitpid(-1, os.WNOHANG): Windows is not supported + if not (hasattr(os, 'waitpid') and hasattr(os, 'WNOHANG')): + return + # Reap all our dead child processes so we don't leave zombies around. # These hog resources and might be causing some of the buildbots to die. - if hasattr(os, 'waitpid'): - any_process = -1 - while True: - try: - # This will raise an exception on Windows. That's ok. - pid, status = os.waitpid(any_process, os.WNOHANG) - if pid == 0: - break - print("Warning -- reap_children() reaped child process %s" - % pid, file=sys.stderr) - except: - break + while True: + try: + # Read the exit status of any child process which already completed + pid, status = os.waitpid(-1, os.WNOHANG) + except OSError: + break + + if pid == 0: + break + + print("Warning -- reap_children() reaped child process %s" + % pid, file=sys.stderr) + environment_altered = True + @contextlib.contextmanager def start_threads(threads, unlock=None): |