mirror of
https://github.com/lutris/lutris
synced 2024-09-18 15:22:27 +00:00
Attempt at fixing #2852, no solution was found
This commit is contained in:
parent
dafadf9f5b
commit
f7d999eab6
|
@ -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()
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in a new issue