mtest: always ignore ProcessLookupError

ProcessLookupError can also happen from p.kill().  There is also
nothing we can do in that case, so move the "try" for that
exception to the entire kill_process function.

The ValueError case seems like dead code, so get rid of it.
pull/7836/head
Paolo Bonzini 4 years ago
parent 57b918f281
commit bd526ec2dc
  1. 59
      mesonbuild/mtest.py

@ -672,44 +672,37 @@ class SingleTestRunner:
# Python does not provide multiplatform support for # Python does not provide multiplatform support for
# killing a process and all its children so we need # killing a process and all its children so we need
# to roll our own. # to roll our own.
if is_windows(): try:
subprocess.run(['taskkill', '/F', '/T', '/PID', str(p.pid)]) if is_windows():
else: subprocess.run(['taskkill', '/F', '/T', '/PID', str(p.pid)])
else:
# Send a termination signal to the process group that setsid()
# created - giving it a chance to perform any cleanup.
os.killpg(p.pid, signal.SIGTERM)
def _send_signal_to_process_group(pgid: int, signum: int) -> None: # Make sure the termination signal actually kills the process
""" sends a signal to a process group """ # group, otherwise retry with a SIGKILL.
try: try:
os.killpg(pgid, signum) p.communicate(timeout=0.5)
except ProcessLookupError: except subprocess.TimeoutExpired:
# Sometimes (e.g. with Wine) this happens. os.killpg(p.pid, signal.SIGKILL)
# There's nothing we can do (maybe the process
# already died) so carry on.
pass
# Send a termination signal to the process group that setsid()
# created - giving it a chance to perform any cleanup.
_send_signal_to_process_group(p.pid, signal.SIGTERM)
# Make sure the termination signal actually kills the process
# group, otherwise retry with a SIGKILL.
try:
p.communicate(timeout=0.5)
except subprocess.TimeoutExpired:
_send_signal_to_process_group(p.pid, signal.SIGKILL)
try:
p.communicate(timeout=1)
except subprocess.TimeoutExpired:
# An earlier kill attempt has not worked for whatever reason.
# Try to kill it one last time with a direct call.
# If the process has spawned children, they will remain around.
p.kill()
try: try:
p.communicate(timeout=1) p.communicate(timeout=1)
except subprocess.TimeoutExpired: except subprocess.TimeoutExpired:
additional_error = 'Test process could not be killed.' # An earlier kill attempt has not worked for whatever reason.
except ValueError: # Try to kill it one last time with a direct call.
additional_error = 'Could not read output. Maybe the process has redirected its stdout/stderr?' # If the process has spawned children, they will remain around.
return additional_error p.kill()
try:
p.communicate(timeout=1)
except subprocess.TimeoutExpired:
return 'Test process could not be killed.'
except ProcessLookupError:
# Sometimes (e.g. with Wine) this happens.
# There's nothing we can do (probably the process
# already died) so carry on.
pass
return None
# Let gdb handle ^C instead of us # Let gdb handle ^C instead of us
if self.options.gdb: if self.options.gdb:

Loading…
Cancel
Save