diff options
| author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-03-09 10:04:41 -0700 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-03-10 11:09:59 -0700 |
| commit | 6f3a537dda7ea84379fc11c1ec42cfdfeaf68bd4 (patch) | |
| tree | 506953ce4cc454423808c375856c4e96bb1cc3de /bitbake/lib/bb/server/process.py | |
| parent | 8fbe21845c67a81e79039268717941312fbc7d30 (diff) | |
| download | poky-6f3a537dda7ea84379fc11c1ec42cfdfeaf68bd4.tar.gz | |
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>
Diffstat (limited to 'bitbake/lib/bb/server/process.py')
| -rw-r--r-- | bitbake/lib/bb/server/process.py | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index 6db6a2326d..f4cb32c8aa 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
| @@ -157,6 +157,10 @@ class BitBakeProcessServerConnection(BitBakeBaseServerConnection): | |||
| 157 | self.connection = ServerCommunicator(self.ui_channel, self.procserver.event_handle) | 157 | self.connection = ServerCommunicator(self.ui_channel, self.procserver.event_handle) |
| 158 | self.events = self.event_queue | 158 | self.events = self.event_queue |
| 159 | 159 | ||
| 160 | def sigterm_terminate(self): | ||
| 161 | bb.error("UI received SIGTERM") | ||
| 162 | self.terminate() | ||
| 163 | |||
| 160 | def terminate(self): | 164 | def terminate(self): |
| 161 | def flushevents(): | 165 | def flushevents(): |
| 162 | while True: | 166 | while True: |
| @@ -176,10 +180,20 @@ class BitBakeProcessServerConnection(BitBakeBaseServerConnection): | |||
| 176 | 180 | ||
| 177 | self.ui_channel.close() | 181 | self.ui_channel.close() |
| 178 | self.event_queue.close() | 182 | self.event_queue.close() |
| 183 | self.event_queue.setexit() | ||
| 179 | 184 | ||
| 180 | # Wrap Queue to provide API which isn't server implementation specific | 185 | # Wrap Queue to provide API which isn't server implementation specific |
| 181 | class ProcessEventQueue(multiprocessing.queues.Queue): | 186 | class ProcessEventQueue(multiprocessing.queues.Queue): |
| 187 | def __init__(self, maxsize): | ||
| 188 | multiprocessing.queues.Queue.__init__(self, maxsize) | ||
| 189 | self.exit = False | ||
| 190 | |||
| 191 | def setexit(self): | ||
| 192 | self.exit = True | ||
| 193 | |||
| 182 | def waitEvent(self, timeout): | 194 | def waitEvent(self, timeout): |
| 195 | if self.exit: | ||
| 196 | raise KeyboardInterrupt() | ||
| 183 | try: | 197 | try: |
| 184 | return self.get(True, timeout) | 198 | return self.get(True, timeout) |
| 185 | except Empty: | 199 | except Empty: |
| @@ -214,5 +228,5 @@ class BitBakeServer(BitBakeBaseServer): | |||
| 214 | if error: | 228 | if error: |
| 215 | logger.error("Unable to set the cooker to the correct featureset: %s" % error) | 229 | logger.error("Unable to set the cooker to the correct featureset: %s" % error) |
| 216 | raise BaseException(error) | 230 | raise BaseException(error) |
| 217 | signal.signal(signal.SIGTERM, lambda i, s: self.connection.terminate()) | 231 | signal.signal(signal.SIGTERM, lambda i, s: self.connection.sigterm_terminate()) |
| 218 | return self.connection | 232 | return self.connection |
