From cd3c4292e7ccc8934f229fcf010f8615398b87b5 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Wed, 8 Jun 2011 09:34:12 +0100 Subject: bitbake: Cleanup bitbake server init process to be clearer to follow Create a standard format server class instance with method calls for each step in the server setup. There should be enough hooks for each of the different server types. Signed-off-by: Richard Purdie --- bitbake/bin/bitbake | 23 +++++++++------- bitbake/lib/bb/command.py | 2 +- bitbake/lib/bb/cooker.py | 11 ++++---- bitbake/lib/bb/server/none.py | 59 +++++++++++++++++++++++++---------------- bitbake/lib/bb/server/xmlrpc.py | 50 ++++++++++++++++++++++++---------- 5 files changed, 92 insertions(+), 53 deletions(-) (limited to 'bitbake') diff --git a/bitbake/bin/bitbake b/bitbake/bin/bitbake index acd086753f..8f2fece2ca 100755 --- a/bitbake/bin/bitbake +++ b/bitbake/bin/bitbake @@ -40,7 +40,7 @@ from bb import cooker from bb import ui from bb import server from bb.server import none -#from bb.server import xmlrpc +from bb.server import xmlrpc __version__ = "1.13.0" logger = logging.getLogger("BitBake") @@ -173,9 +173,6 @@ Default BBFILES are the .bb files in the current directory.""") ui_main = get_ui(configuration) - #server = bb.server.xmlrpc - server = bb.server.none - # Save a logfile for cooker into the current working directory. When the # server is daemonized this logfile will be truncated. cooker_logfile = os.path.join(os.getcwd(), "cooker.log") @@ -192,21 +189,29 @@ Default BBFILES are the .bb files in the current directory.""") # of the UIs (e.g. for DISPLAY, etc.) bb.utils.clean_environment() - cooker = bb.cooker.BBCooker(configuration, server) + #server = bb.server.xmlrpc.BitBakeServer() + server = bb.server.none.BitBakeServer() + + server.initServer() + idle = server.getServerIdleCB() + + cooker = bb.cooker.BBCooker(configuration, idle) cooker.parseCommandLine() - serverinfo = server.BitbakeServerInfo(cooker.server) + server.addcooker(cooker) + server.saveConnectionDetails() + server.detach(cooker_logfile) - server.BitBakeServerFork(cooker, cooker.server, serverinfo, cooker_logfile) + # Should no longer need to ever reference cooker del cooker logger.removeHandler(handler) # Setup a connection to the server (cooker) - server_connection = server.BitBakeServerConnection(serverinfo) + server_connection = server.establishConnection() try: - return server.BitbakeUILauch().launch(serverinfo, ui_main, server_connection.connection, server_connection.events) + return server.launchUI(ui_main, server_connection.connection, server_connection.events) finally: server_connection.terminate() diff --git a/bitbake/lib/bb/command.py b/bitbake/lib/bb/command.py index e83751a2fa..9841e6874e 100644 --- a/bitbake/lib/bb/command.py +++ b/bitbake/lib/bb/command.py @@ -82,7 +82,7 @@ class Command: if command not in CommandsAsync.__dict__: return "No such command" self.currentAsyncCommand = (command, commandline) - self.cooker.server.register_idle_function(self.cooker.runCommands, self.cooker) + self.cooker.server_registration_cb(self.cooker.runCommands, self.cooker) return True except: import traceback diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 8379d0caf1..94495e1399 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -63,12 +63,11 @@ class BBCooker: Manages one bitbake build run """ - def __init__(self, configuration, server): + def __init__(self, configuration, server_registration_cb): self.status = None self.appendlist = {} - if server: - self.server = server.BitBakeServer(self) + self.server_registration_cb = server_registration_cb self.configuration = configuration @@ -109,7 +108,7 @@ class BBCooker: self.configuration.data = bb.data.init() - if not server: + if not self.server_registration_cb: bb.data.setVar("BB_WORKERCONTEXT", "1", self.configuration.data) bb.data.inheritFromOS(self.configuration.data) @@ -831,7 +830,7 @@ class BBCooker: return True return retval - self.server.register_idle_function(buildFileIdle, rq) + self.server_registration_cb(buildFileIdle, rq) def buildTargets(self, targets, task): """ @@ -890,7 +889,7 @@ class BBCooker: rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) - self.server.register_idle_function(buildTargetsIdle, rq) + self.server_registration_cb(buildTargetsIdle, rq) def updateCache(self): if self.state == state.running: diff --git a/bitbake/lib/bb/server/none.py b/bitbake/lib/bb/server/none.py index 45cda2f5f4..6083631fe7 100644 --- a/bitbake/lib/bb/server/none.py +++ b/bitbake/lib/bb/server/none.py @@ -36,8 +36,7 @@ DEBUG = False import inspect, select class BitBakeServerCommands(): - def __init__(self, server, cooker): - self.cooker = cooker + def __init__(self, server): self.server = server def runCommand(self, command): @@ -106,13 +105,17 @@ class BBUIEventQueue: def chldhandler(signum, stackframe): pass -class BitBakeServer(): +class BitBakeNoneServer(): # remove this when you're done with debugging # allow_reuse_address = True - def __init__(self, cooker): + def __init__(self): self._idlefuns = {} - self.commands = BitBakeServerCommands(self, cooker) + self.commands = BitBakeServerCommands(self) + + def addcooker(self, cooker): + self.cooker = cooker + self.commands.cooker = cooker def register_idle_function(self, function, data): """Register a function to be called while the server is idle""" @@ -157,25 +160,10 @@ class BitBakeServer(): except: pass -class BitbakeServerInfo(): - def __init__(self, server): - self.server = server - self.commands = server.commands - -class BitBakeServerFork(): - def __init__(self, cooker, server, serverinfo, logfile): - serverinfo.logfile = logfile - serverinfo.cooker = cooker - serverinfo.server = server - -class BitbakeUILauch(): - def launch(self, serverinfo, uifunc, *args): - return bb.cooker.server_main(serverinfo.cooker, uifunc, *args) - class BitBakeServerConnection(): - def __init__(self, serverinfo): - self.server = serverinfo.server - self.connection = serverinfo.commands + def __init__(self, server): + self.server = server.server + self.connection = self.server.commands self.events = bb.server.none.BBUIEventQueue(self.server) for event in bb.event.ui_queue: self.events.queue_event(event) @@ -189,3 +177,28 @@ class BitBakeServerConnection(): self.connection.terminateServer() except: pass + +class BitBakeServer(object): + def initServer(self): + self.server = BitBakeNoneServer() + + def addcooker(self, cooker): + self.cooker = cooker + self.server.addcooker(cooker) + + def getServerIdleCB(self): + return self.server.register_idle_function + + def saveConnectionDetails(self): + return + + def detach(self, cooker_logfile): + self.logfile = cooker_logfile + + def establishConnection(self): + self.connection = BitBakeServerConnection(self) + return self.connection + + def launchUI(self, uifunc, *args): + return bb.cooker.server_main(self.cooker, uifunc, *args) + diff --git a/bitbake/lib/bb/server/xmlrpc.py b/bitbake/lib/bb/server/xmlrpc.py index e7b6010874..4a16f9d525 100644 --- a/bitbake/lib/bb/server/xmlrpc.py +++ b/bitbake/lib/bb/server/xmlrpc.py @@ -122,8 +122,7 @@ def _create_server(host, port): return s class BitBakeServerCommands(): - def __init__(self, server, cooker): - self.cooker = cooker + def __init__(self, server): self.server = server def registerEventHandler(self, host, port): @@ -160,11 +159,11 @@ class BitBakeServerCommands(): """ return True -class BitBakeServer(SimpleXMLRPCServer): +class BitBakeXMLRPCServer(SimpleXMLRPCServer): # remove this when you're done with debugging # allow_reuse_address = True - def __init__(self, cooker, interface = ("localhost", 0)): + def __init__(self, interface = ("localhost", 0)): """ Constructor """ @@ -174,9 +173,12 @@ class BitBakeServer(SimpleXMLRPCServer): self._idlefuns = {} self.host, self.port = self.socket.getsockname() #self.register_introspection_functions() - commands = BitBakeServerCommands(self, cooker) - self.autoregister_all_functions(commands, "") + self.commands = BitBakeServerCommands(self) + self.autoregister_all_functions(self.commands, "") + + def addcooker(self, cooker): self.cooker = cooker + self.commands.cooker = cooker def autoregister_all_functions(self, context, prefix): """ @@ -244,14 +246,6 @@ class BitbakeServerInfo(): self.host = server.host self.port = server.port -class BitBakeServerFork(): - def __init__(self, cooker, server, serverinfo, logfile): - daemonize.createDaemon(server.serve_forever, logfile) - -class BitbakeUILauch(): - def launch(self, serverinfo, uifunc, *args): - return uifunc(*args) - class BitBakeServerConnection(): def __init__(self, serverinfo): self.connection = _create_server(serverinfo.host, serverinfo.port) @@ -271,3 +265,31 @@ class BitBakeServerConnection(): self.connection.terminateServer() except: pass + +class BitBakeServer(object): + def initServer(self): + self.server = BitBakeXMLRPCServer() + + def addcooker(self, cooker): + self.cooker = cooker + self.server.addcooker(cooker) + + def getServerIdleCB(self): + return self.server.register_idle_function + + def saveConnectionDetails(self): + self.serverinfo = BitbakeServerInfo(self.server) + + def detach(self, cooker_logfile): + daemonize.createDaemon(self.server.serve_forever, cooker_logfile) + del self.cooker + del self.server + + def establishConnection(self): + self.connection = BitBakeServerConnection(self.serverinfo) + return self.connection + + def launchUI(self, uifunc, *args): + return uifunc(*args) + + -- cgit v1.2.3-54-g00ecf