qemurunner: Fix a bug with fork/exit handling

If you send this forked process a SIGTERM, it will execute all of the
parent's exit code leading to two sets of console/exit output which is
extremely confusing. Wrap the code in a try/finally to ensure we always
call os._exit() to avoid this.

I spent far too long trying to work out the crazy console output from this.

(From OE-Core rev: 652e40bfae24b8e23bbf7a7f35d900d2ab8d0f92)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie 2025-03-03 13:13:31 +00:00
parent 171da2fa9c
commit ab830b19ee

View File

@ -267,12 +267,15 @@ class QemuRunner:
self.monitorpipe = os.fdopen(w, "w")
else:
# child process
os.setpgrp()
os.close(w)
r = os.fdopen(r)
x = r.read()
os.killpg(os.getpgid(self.runqemu.pid), signal.SIGTERM)
os._exit(0)
try:
os.setpgrp()
os.close(w)
r = os.fdopen(r)
x = r.read()
os.killpg(os.getpgid(self.runqemu.pid), signal.SIGTERM)
finally:
# We must exit under all circumstances
os._exit(0)
self.logger.debug("runqemu started, pid is %s" % self.runqemu.pid)
self.logger.debug("waiting at most %d seconds for qemu pid (%s)" %