1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-30 12:29:55 +00:00

bitbake: server/process: Deal more gracefully with SIGTERM

Currently a SIGTERM to the UI process causes the UI simply to lock up.

By setting an exit flag, the waitEvent can raise a SIGINT, allowing the
UI to break out the event loop and exit. Currently this is results in a
traceback but that is more desirable than a hanging process.

(Bitbake rev: 0d12041eceeae6bba2034b04913bb13abd67bd15)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie
2014-03-09 10:04:41 -07:00
parent 8fbe21845c
commit 6f3a537dda
+15 -1
View File
@@ -157,6 +157,10 @@ class BitBakeProcessServerConnection(BitBakeBaseServerConnection):
self.connection = ServerCommunicator(self.ui_channel, self.procserver.event_handle) self.connection = ServerCommunicator(self.ui_channel, self.procserver.event_handle)
self.events = self.event_queue self.events = self.event_queue
def sigterm_terminate(self):
bb.error("UI received SIGTERM")
self.terminate()
def terminate(self): def terminate(self):
def flushevents(): def flushevents():
while True: while True:
@@ -176,10 +180,20 @@ class BitBakeProcessServerConnection(BitBakeBaseServerConnection):
self.ui_channel.close() self.ui_channel.close()
self.event_queue.close() self.event_queue.close()
self.event_queue.setexit()
# Wrap Queue to provide API which isn't server implementation specific # Wrap Queue to provide API which isn't server implementation specific
class ProcessEventQueue(multiprocessing.queues.Queue): class ProcessEventQueue(multiprocessing.queues.Queue):
def __init__(self, maxsize):
multiprocessing.queues.Queue.__init__(self, maxsize)
self.exit = False
def setexit(self):
self.exit = True
def waitEvent(self, timeout): def waitEvent(self, timeout):
if self.exit:
raise KeyboardInterrupt()
try: try:
return self.get(True, timeout) return self.get(True, timeout)
except Empty: except Empty:
@@ -214,5 +228,5 @@ class BitBakeServer(BitBakeBaseServer):
if error: if error:
logger.error("Unable to set the cooker to the correct featureset: %s" % error) logger.error("Unable to set the cooker to the correct featureset: %s" % error)
raise BaseException(error) raise BaseException(error)
signal.signal(signal.SIGTERM, lambda i, s: self.connection.terminate()) signal.signal(signal.SIGTERM, lambda i, s: self.connection.sigterm_terminate())
return self.connection return self.connection