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
# killing a process and all its children so we need
# to roll our own.
if is_windows():
subprocess.run(['taskkill', '/F', '/T', '/PID', str(p.pid)])
else:
try:
if is_windows():
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:
""" sends a signal to a process group """
# Make sure the termination signal actually kills the process
# group, otherwise retry with a SIGKILL.
try:
os.killpg(pgid, signum)
except ProcessLookupError:
# Sometimes (e.g. with Wine) this happens.
# 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()
p.communicate(timeout=0.5)
except subprocess.TimeoutExpired:
os.killpg(p.pid, signal.SIGKILL)
try:
p.communicate(timeout=1)
except subprocess.TimeoutExpired:
additional_error = 'Test process could not be killed.'
except ValueError:
additional_error = 'Could not read output. Maybe the process has redirected its stdout/stderr?'
return additional_error
# 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:
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
if self.options.gdb:

Loading…
Cancel
Save