[bitbake-devel] server/process: Use a pipe for quit events instead of Event()

Submitted by Richard Purdie on March 10, 2014, 12:58 a.m. | Patch ID: 68347


Message ID 1394413082.7883.19.camel@ted
State New
Headers show

Commit Message

Richard Purdie March 10, 2014, 12:58 a.m.
Its not possible to notice the change of status of an Event() in
the select call we sleep in. It would be possible in python 3.3 but
for now use a pipe instead. This removes small latency when bitbake
commands finish since the system doesn't sit in the select call.

(Debugging these kind of issues is apparent by setting a long sleep
for the select call)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>

Patch hide | download patch | download mbox

diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py
index f4cb32c..386294f 100644
--- a/bitbake/lib/bb/server/process.py
+++ b/bitbake/lib/bb/server/process.py
@@ -87,8 +87,7 @@  class ProcessServer(Process, BaseImplServer):
         self.featurelist = featurelist
         self.quit = False
-        self.keep_running = Event()
-        self.keep_running.set()
+        self.quitin, self.quitout = Pipe()
         self.event_handle = multiprocessing.Value("i")
     def run(self):
@@ -101,14 +100,18 @@  class ProcessServer(Process, BaseImplServer):
     def main(self):
         # Ignore SIGINT within the server, as all SIGINT handling is done by
         # the UI and communicated to us
+        self.quitin.close()
         signal.signal(signal.SIGINT, signal.SIG_IGN)
-        while self.keep_running.is_set():
+        while not self.quit:
                 if self.command_channel.poll():
                     command = self.command_channel.recv()
+                if self.quitout.poll():
+                    self.quitout.recv()
+                    self.quit = True
-                self.idle_commands(.1, [self.event_queue._reader, self.command_channel])
+                self.idle_commands(.1, [self.event_queue._reader, self.command_channel, self.quitout])
             except Exception:
                 logger.exception('Running command %s', command)
@@ -147,7 +150,8 @@  class ProcessServer(Process, BaseImplServer):
     def stop(self):
-        self.keep_running.clear()
+        self.quitin.send("quit")
+        self.quitin.close()
 class BitBakeProcessServerConnection(BitBakeBaseServerConnection):
     def __init__(self, serverImpl, ui_channel, event_queue):