aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2013-08-23 16:16:50 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-08-26 10:39:00 +0100
commitba5a6c88785d9889d4172ec79937ac2a5555327e (patch)
tree8c80c4af65efc8015e162e8b8a3d650befd0c184 /lib
parent8c01cff94787abbb64fbdf0c16cd63f8f97a7e03 (diff)
downloadbitbake-ba5a6c88785d9889d4172ec79937ac2a5555327e.tar.gz
bitbake: Add ui event handlers filtering
Add functionality to allow UIs to update and change the types of events they recieve. To do this we need to add a new command and also need to be able to obtain the current event hander ID. In the case of xmlrpc, this is straightforward, in the case of the process server we need to save the result in a multiprocessing.Value() so we can retrive it. An excplit command was added to the server API to facilitate this. The same function can also be used to mask or unmask specific log messages, allowing the UI to optionally differ from the standard set of message filtering. Based upon work by Cristiana Voicu <cristiana.voicu@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/bb/command.py7
-rw-r--r--lib/bb/event.py17
-rw-r--r--lib/bb/server/process.py12
-rw-r--r--lib/bb/server/xmlrpc.py6
-rw-r--r--lib/bb/ui/knotty.py12
5 files changed, 46 insertions, 8 deletions
diff --git a/lib/bb/command.py b/lib/bb/command.py
index 33a24406b..bdf1c3663 100644
--- a/lib/bb/command.py
+++ b/lib/bb/command.py
@@ -240,6 +240,13 @@ class CommandsSync:
name = params[0]
command.cooker.createConfigFile(name)
+ def setEventMask(self, command, params):
+ handlerNum = params[0]
+ llevel = params[1]
+ debug_domains = params[2]
+ mask = params[3]
+ return bb.event.set_UIHmask(handlerNum, llevel, debug_domains, mask)
+
class CommandsAsync:
"""
A class of asynchronous commands
diff --git a/lib/bb/event.py b/lib/bb/event.py
index 8ffd2c3e1..1169cbfb2 100644
--- a/lib/bb/event.py
+++ b/lib/bb/event.py
@@ -193,7 +193,7 @@ def register(name, handler, mask=[]):
else:
_handlers[name] = handler
- if not mask:
+ if not mask or '*' in mask:
_catchall_handlers[name] = True
else:
for m in mask:
@@ -225,7 +225,7 @@ class UIEventFilter(object):
self.update(None, level, debug_domains)
def update(self, eventmask, level, debug_domains):
- self.eventmask = None
+ self.eventmask = eventmask
self.stdlevel = level
self.debug_domains = debug_domains
@@ -236,9 +236,20 @@ class UIEventFilter(object):
if event.name in self.debug_domains and event.levelno >= self.debug_domains[event.name]:
return True
return False
- # Implement other event masking here on self.eventmask
+ eid = str(event.__class__)[8:-2]
+ if eid not in self.eventmask:
+ return False
return True
+def set_UIHmask(handlerNum, level, debug_domains, mask):
+ if not handlerNum in _ui_handlers:
+ return False
+ if '*' in mask:
+ _ui_logfilters[handlerNum].update(None, level, debug_domains)
+ else:
+ _ui_logfilters[handlerNum].update(mask, level, debug_domains)
+ return True
+
def getName(e):
"""Returns the name of a class or class instance"""
if getattr(e, "__name__", None) == None:
diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py
index 99a6bf55c..e2cec49b7 100644
--- a/lib/bb/server/process.py
+++ b/lib/bb/server/process.py
@@ -37,8 +37,9 @@ from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer
logger = logging.getLogger('BitBake')
class ServerCommunicator():
- def __init__(self, connection):
+ def __init__(self, connection, event_handle):
self.connection = connection
+ self.event_handle = event_handle
def runCommand(self, command):
# @todo try/except
@@ -54,6 +55,8 @@ class ServerCommunicator():
except KeyboardInterrupt:
pass
+ def getEventHandle(self):
+ return self.event_handle.value
class EventAdapter():
"""
@@ -84,11 +87,12 @@ class ProcessServer(Process, BaseImplServer):
self.keep_running = Event()
self.keep_running.set()
+ self.event_handle = multiprocessing.Value("i")
def run(self):
for event in bb.event.ui_queue:
self.event_queue.put(event)
- self.event_handle = bb.event.register_UIHhandler(self)
+ self.event_handle.value = bb.event.register_UIHhandler(self)
bb.cooker.server_main(self.cooker, self.main)
def main(self):
@@ -106,7 +110,7 @@ class ProcessServer(Process, BaseImplServer):
logger.exception('Running command %s', command)
self.event_queue.close()
- bb.event.unregister_UIHhandler(self.event_handle)
+ bb.event.unregister_UIHhandler(self.event_handle.value)
self.command_channel.close()
self.cooker.stop()
self.idle_commands(.1)
@@ -147,7 +151,7 @@ class BitBakeProcessServerConnection(BitBakeBaseServerConnection):
self.procserver = serverImpl
self.ui_channel = ui_channel
self.event_queue = event_queue
- self.connection = ServerCommunicator(self.ui_channel)
+ self.connection = ServerCommunicator(self.ui_channel, self.procserver.event_handle)
self.events = self.event_queue
def terminate(self):
diff --git a/lib/bb/server/xmlrpc.py b/lib/bb/server/xmlrpc.py
index d290550e9..4dee5d9fe 100644
--- a/lib/bb/server/xmlrpc.py
+++ b/lib/bb/server/xmlrpc.py
@@ -95,7 +95,8 @@ class BitBakeServerCommands():
"""
s, t = _create_server(host, port)
- return bb.event.register_UIHhandler(s)
+ self.event_handle = bb.event.register_UIHhandler(s)
+ return self.event_handle
def unregisterEventHandler(self, handlerNum):
"""
@@ -109,6 +110,9 @@ class BitBakeServerCommands():
"""
return self.cooker.command.runCommand(command, self.server.readonly)
+ def getEventHandle(self):
+ return self.event_handle
+
def terminateServer(self):
"""
Trigger the server to quit
diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py
index 09ad99ebe..1692e3295 100644
--- a/lib/bb/ui/knotty.py
+++ b/lib/bb/ui/knotty.py
@@ -232,6 +232,15 @@ def _log_settings_from_server(server):
raise BaseException(error)
return includelogs, loglines, consolelogfile
+_evt_list = [ "bb.runqueue.runQueueExitWait", "bb.event.LogExecTTY", "logging.LogRecord",
+ "bb.build.TaskFailed", "bb.build.TaskBase", "bb.event.ParseStarted",
+ "bb.event.ParseProgress", "bb.event.ParseCompleted", "bb.event.CacheLoadStarted",
+ "bb.event.CacheLoadProgress", "bb.event.CacheLoadCompleted", "bb.command.CommandFailed",
+ "bb.command.CommandExit", "bb.command.CommandCompleted", "bb.cooker.CookerExit",
+ "bb.event.MultipleProviders", "bb.event.NoProvider", "bb.runqueue.sceneQueueTaskStarted",
+ "bb.runqueue.runQueueTaskStarted", "bb.runqueue.runQueueTaskFailed", "bb.runqueue.sceneQueueTaskFailed",
+ "bb.event.BuildBase", "bb.build.TaskStarted", "bb.build.TaskSucceeded", "bb.build.TaskFailedSilent"]
+
def main(server, eventHandler, params, tf = TerminalFilter):
includelogs, loglines, consolelogfile = _log_settings_from_server(server)
@@ -262,6 +271,9 @@ def main(server, eventHandler, params, tf = TerminalFilter):
consolelog.setFormatter(conlogformat)
logger.addHandler(consolelog)
+ llevel, debug_domains = bb.msg.constructLogOptions()
+ server.runCommand(["setEventMask", server.getEventHandle(), llevel, debug_domains, _evt_list])
+
if not params.observe_only:
params.updateFromServer(server)
cmdline = params.parseActions()