From 93059e36200b61f87f61578d9774172212446644 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Wed, 8 Jun 2011 13:01:34 +0100 Subject: bitbake/server/process: Move implementation knowledge of event queue into the server Signed-off-by: Richard Purdie --- bin/bitbake | 4 ++-- lib/bb/server/process.py | 20 +++++++++++++++++++- lib/bb/ui/depexp.py | 8 +------- lib/bb/ui/goggle.py | 10 ++++------ lib/bb/ui/knotty.py | 5 +++-- lib/bb/ui/ncurses.py | 4 +++- 6 files changed, 32 insertions(+), 19 deletions(-) diff --git a/bin/bitbake b/bin/bitbake index 483b986c2..c22e29ad1 100755 --- a/bin/bitbake +++ b/bin/bitbake @@ -40,7 +40,7 @@ import bb.msg from bb import cooker from bb import ui from bb import server -from bb.server.process import ProcessServer, ServerCommunicator +from bb.server.process import ProcessServer, ServerCommunicator, ProcessEventQueue from Queue import Empty from multiprocessing import Queue, Pipe @@ -192,7 +192,7 @@ Default BBFILES are the .bb files in the current directory.""") # and a queue for server -> ui event notifications # ui_channel, server_channel = Pipe() - event_queue = Queue() + event_queue = ProcessEventQueue() server = ProcessServer(server_channel, event_queue, configuration) server.start() diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py index 88f819106..a5239400c 100644 --- a/lib/bb/server/process.py +++ b/lib/bb/server/process.py @@ -30,7 +30,8 @@ import signal import sys import time from bb.cooker import BBCooker -from multiprocessing import Event, Process, util +from Queue import Empty +from multiprocessing import Event, Process, util, Queue, Pipe, queues logger = logging.getLogger('BitBake') @@ -193,3 +194,20 @@ class ProcessServer(Process): # which can result in a bitbake server hang during the parsing process if (2, 6, 0) <= sys.version_info < (2, 6, 3): _bootstrap = bootstrap_2_6_6 + +# Wrap Queue to provide API which isn't server implementation specific +class ProcessEventQueue(multiprocessing.queues.Queue): + def waitEvent(self, timeout): + try: + return self.get(True, timeout) + except Empty: + return None + + def getEvent(self): + try: + return self.get(False) + except Empty: + return None + + + diff --git a/lib/bb/ui/depexp.py b/lib/bb/ui/depexp.py index a0737ee0b..f11166fbd 100644 --- a/lib/bb/ui/depexp.py +++ b/lib/bb/ui/depexp.py @@ -223,13 +223,7 @@ def main(server, eventHandler): progress_total = 0 while True: try: - try: - # We must get nonblocking here, else we'll never check the - # quit signal - event = eventHandler.get(False, 0.25) - except Queue.Empty: - pass - + event = eventHandler.waitEvent(0.25) if gtkthread.quit.isSet(): server.runCommand(["stateStop"]) break diff --git a/lib/bb/ui/goggle.py b/lib/bb/ui/goggle.py index 6278a4cbf..86ab2f473 100644 --- a/lib/bb/ui/goggle.py +++ b/lib/bb/ui/goggle.py @@ -30,12 +30,10 @@ import Queue def event_handle_idle_func (eventHandler, build, pbar): # Consume as many messages as we can in the time available to us - try: - while 1: - event = eventHandler.get(False) - build.handle_event (event, pbar) - except Queue.Empty: - pass + event = eventHandler.getEvent() + while event: + build.handle_event (event, pbar) + event = eventHandler.getEvent() return True diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py index 1396939fc..44d1c1dc9 100644 --- a/lib/bb/ui/knotty.py +++ b/lib/bb/ui/knotty.py @@ -96,8 +96,9 @@ def main(server, eventHandler): return_value = 0 while True: try: - event = eventHandler.get() - + event = eventHandler.waitEvent(0.25) + if event is None: + continue helper.eventHandler(event) if isinstance(event, bb.runqueue.runQueueExitWait): if not shutdown: diff --git a/lib/bb/ui/ncurses.py b/lib/bb/ui/ncurses.py index ab626c9df..469f1b730 100644 --- a/lib/bb/ui/ncurses.py +++ b/lib/bb/ui/ncurses.py @@ -244,7 +244,9 @@ class NCursesUI: exitflag = False while not exitflag: try: - event = eventHandler.get() + event = eventHandler.waitEvent(0.25) + if not event: + continue helper.eventHandler(event) if isinstance(event, bb.build.TaskBase): -- cgit 1.2.3-korg