Attempt at fixing #2852, no solution was found

This commit is contained in:
Mathieu Comandon 2020-10-06 00:44:34 -07:00
parent dafadf9f5b
commit f7d999eab6
2 changed files with 14 additions and 14 deletions

View file

@ -171,14 +171,16 @@ class MonitoredCommand:
sys.stdout.write(line)
sys.stdout.flush()
def on_stop(self, _pid, returncode):
def on_stop(self, pid, _user_data):
"""Callback registered on game process termination"""
if self.prevent_on_stop: # stop() already in progress
return False
logger.debug("The process has terminated with code %s", returncode)
if self.game_process.returncode is None:
logger.debug("Process hasn't terminated yet")
self.game_process.wait()
logger.debug("Process %s has terminated with code %s", pid, self.game_process.returncode)
self.is_running = False
self.return_code = returncode
self.return_code = self.game_process.returncode
resume_stop = self.stop()
if not resume_stop:
@ -238,7 +240,6 @@ class MonitoredCommand:
logger.error("Failed to create working directory, falling back to %s", self.fallback_cwd)
self.cwd = "/tmp"
try:
return subprocess.Popen(
command,
stdout=subprocess.PIPE,
@ -257,8 +258,9 @@ class MonitoredCommand:
try:
self.game_process.terminate()
except ProcessLookupError: # process already dead.
logger.debug("Management process looks dead already.")
except ProcessLookupError:
# process already dead.
pass
if hasattr(self, "stop_func"):
resume_stop = self.stop_func()

View file

@ -141,18 +141,18 @@ def main():
while True:
try:
dead_pid, dead_returncode, _ = os.wait3(os.WNOHANG)
dead_pid, dead_returncode, usage = os.wait3(os.WNOHANG)
except ChildProcessError:
# No processes remain. No need to check monitor.
raise NoMoreChildren from None
if returncode is None and dead_pid == initial_pid:
returncode = dead_returncode
log("Initial process has exited (return code: %s)" % dead_returncode)
if dead_pid == 0:
break
if returncode is None and dead_pid == initial_pid:
log("Initial process has exited.")
returncode = dead_returncode
try:
# While we are inside this try..except, if at the time of any
# call to async_reap_children there are no children left, we
@ -184,7 +184,6 @@ def main():
log("Monitored process exited.")
async_reap_children()
# The exit wait loop:
# The game is no longer running. We ask monitored processes
# to exit and wait 30 seconds before sending more SIGTERMs.
@ -198,7 +197,6 @@ def main():
except ProcessLookupError: # process already dead
pass
# Spend 60 seconds waiting for processes to clean up.
async_reap_children()
for _ in range(600):