diff options
Diffstat (limited to 'bitbake/lib/bb/server/process.py')
| -rw-r--r-- | bitbake/lib/bb/server/process.py | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index 0d4a26ced0..99a6bf55cc 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
| @@ -105,7 +105,7 @@ class ProcessServer(Process, BaseImplServer): | |||
| 105 | except Exception: | 105 | except Exception: |
| 106 | logger.exception('Running command %s', command) | 106 | logger.exception('Running command %s', command) |
| 107 | 107 | ||
| 108 | self.event_queue.cancel_join_thread() | 108 | self.event_queue.close() |
| 109 | bb.event.unregister_UIHhandler(self.event_handle) | 109 | bb.event.unregister_UIHhandler(self.event_handle) |
| 110 | self.command_channel.close() | 110 | self.command_channel.close() |
| 111 | self.cooker.stop() | 111 | self.cooker.stop() |
| @@ -150,27 +150,25 @@ class BitBakeProcessServerConnection(BitBakeBaseServerConnection): | |||
| 150 | self.connection = ServerCommunicator(self.ui_channel) | 150 | self.connection = ServerCommunicator(self.ui_channel) |
| 151 | self.events = self.event_queue | 151 | self.events = self.event_queue |
| 152 | 152 | ||
| 153 | def terminate(self, force = False): | 153 | def terminate(self): |
| 154 | def flushevents(): | ||
| 155 | while True: | ||
| 156 | try: | ||
| 157 | event = self.event_queue.get(block=False) | ||
| 158 | except (Empty, IOError): | ||
| 159 | break | ||
| 160 | if isinstance(event, logging.LogRecord): | ||
| 161 | logger.handle(event) | ||
| 162 | |||
| 154 | signal.signal(signal.SIGINT, signal.SIG_IGN) | 163 | signal.signal(signal.SIGINT, signal.SIG_IGN) |
| 155 | self.procserver.stop() | 164 | self.procserver.stop() |
| 156 | if force: | 165 | |
| 157 | self.procserver.join(0.5) | 166 | while self.procserver.is_alive(): |
| 158 | if self.procserver.is_alive(): | 167 | flushevents() |
| 159 | self.procserver.terminate() | 168 | self.procserver.join(0.1) |
| 160 | self.procserver.join() | 169 | |
| 161 | else: | ||
| 162 | self.procserver.join() | ||
| 163 | while True: | ||
| 164 | try: | ||
| 165 | event = self.event_queue.get(block=False) | ||
| 166 | except (Empty, IOError): | ||
| 167 | break | ||
| 168 | if isinstance(event, logging.LogRecord): | ||
| 169 | logger.handle(event) | ||
| 170 | self.ui_channel.close() | 170 | self.ui_channel.close() |
| 171 | self.event_queue.close() | 171 | self.event_queue.close() |
| 172 | if force: | ||
| 173 | sys.exit(1) | ||
| 174 | 172 | ||
| 175 | # Wrap Queue to provide API which isn't server implementation specific | 173 | # Wrap Queue to provide API which isn't server implementation specific |
| 176 | class ProcessEventQueue(multiprocessing.queues.Queue): | 174 | class ProcessEventQueue(multiprocessing.queues.Queue): |
| @@ -203,5 +201,5 @@ class BitBakeServer(BitBakeBaseServer): | |||
| 203 | 201 | ||
| 204 | def establishConnection(self): | 202 | def establishConnection(self): |
| 205 | self.connection = BitBakeProcessServerConnection(self.serverImpl, self.ui_channel, self.event_queue) | 203 | self.connection = BitBakeProcessServerConnection(self.serverImpl, self.ui_channel, self.event_queue) |
| 206 | signal.signal(signal.SIGTERM, lambda i, s: self.connection.terminate(force=True)) | 204 | signal.signal(signal.SIGTERM, lambda i, s: self.connection.terminate()) |
| 207 | return self.connection | 205 | return self.connection |
