From 384533bdb47af2c3a0f3faea8879e8f3cb6f39f9 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Mon, 7 Sep 2015 15:48:16 +0000 Subject: bitbake: server/process: Handle SIGTERM more gracefully Currently if you send a SIGTERM to the bitbake UI process, the system basically hangs if tasks are executing. This is because the server process doesn't actually try any kind of shutdown before exiting. This patch trys executing a stateForceShutdown command first, which is enough to stop any active tasks before the system exits. I also noticed that terminate can execute multiple times, once at SIGTERM from the handler and once from the real exit. Double execution leads to stack traces and potential hangs (writes to dead pipes), so ensure the code only can run once. With these fixes, bitbake much more correctly deals with SIGTERM to the UI process. (Bitbake rev: 1032ddddbe3241da02ebb3608a1c40f9123b9e80) Signed-off-by: Richard Purdie --- bitbake/lib/bb/server/process.py | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'bitbake/lib/bb/server/process.py') diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index f022b86c94..5fca3508b1 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py @@ -114,6 +114,10 @@ class ProcessServer(Process, BaseImplServer): if self.quitout.poll(): self.quitout.recv() self.quit = True + try: + self.runCommand(["stateForceShutdown"]) + except: + pass self.idle_commands(.1, [self.command_channel, self.quitout]) except Exception: @@ -123,6 +127,7 @@ class ProcessServer(Process, BaseImplServer): bb.event.unregister_UIHhandler(self.event_handle.value) self.command_channel.close() self.cooker.shutdown(True) + self.quitout.close() def idle_commands(self, delay, fds=None): nextsleep = delay @@ -172,12 +177,16 @@ class BitBakeProcessServerConnection(BitBakeBaseServerConnection): self.event_queue = event_queue self.connection = ServerCommunicator(self.ui_channel, self.procserver.event_handle, self.procserver) self.events = self.event_queue + self.terminated = False def sigterm_terminate(self): bb.error("UI received SIGTERM") self.terminate() def terminate(self): + if self.terminated: + return + self.terminated = True def flushevents(): while True: try: -- cgit v1.2.3-54-g00ecf