summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/server/process.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/server/process.py')
-rw-r--r--bitbake/lib/bb/server/process.py36
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
176class ProcessEventQueue(multiprocessing.queues.Queue): 174class 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