bitbake: bitbake: Add event mask flag support

Add a flag to event handlers which lists the events a given handler wishes to
process. By default event handlers recieve all events but this means
we can stop running code in many cases if we know it doesn't want the event.

This is part of the fix for YOCTO #3812, but implements filtering only
for class event handlers; the other part (events filter for UIs) will be
the subject of a different patch.

(Bitbake rev: 074003a4e7530a72863b9c685fc5c31b0f08c039)

Signed-off-by: Bogdan Marinescu <bogdan.a.marinescu@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Bogdan Marinescu 2013-05-31 14:19:14 +00:00 committed by Richard Purdie
parent 542d6a87db
commit 5aa5fc470e
3 changed files with 20 additions and 8 deletions

View File

@ -269,7 +269,7 @@ class CookerDataBuilder(object):
# Nomally we only register event handlers at the end of parsing .bb files
# We register any handlers we've found so far here...
for var in data.getVar('__BBHANDLERS') or []:
bb.event.register(var, data.getVar(var))
bb.event.register(var, data.getVar(var), (data.getVarFlag(var, "eventmask", True) or "").split())
if data.getVar("BB_WORKERCONTEXT", False) is None:
bb.fetch.fetcher_init(data)

View File

@ -64,6 +64,8 @@ def clean_class_handlers():
_handlers = clean_class_handlers()
_ui_handlers = {}
_ui_handler_seq = 0
_event_handler_map = {}
_catchall_handlers = {}
def execute_handler(name, handler, event, d):
event.data = d
@ -87,11 +89,14 @@ def fire_class_handlers(event, d):
if isinstance(event, logging.LogRecord):
return
eid = str(event.__class__)[8:-2]
evt_hmap = _event_handler_map.get(eid, {})
for name, handler in _handlers.iteritems():
try:
execute_handler(name, handler, event, d)
except Exception:
continue
if name in _catchall_handlers or name in evt_hmap:
try:
execute_handler(name, handler, event, d)
except Exception:
continue
ui_queue = []
@atexit.register
@ -160,7 +165,7 @@ def fire_from_worker(event, d):
fire_ui_handlers(event, d)
noop = lambda _: None
def register(name, handler):
def register(name, handler, mask=[]):
"""Register an Event handler"""
# already registered
@ -185,6 +190,14 @@ def register(name, handler):
else:
_handlers[name] = handler
if not mask:
_catchall_handlers[name] = True
else:
for m in mask:
if _event_handler_map.get(m, None) is None:
_event_handler_map[m] = {}
_event_handler_map[m][name] = True
return Registered
def remove(name, handler):

View File

@ -320,8 +320,7 @@ def finalize(fn, d, variant = None):
all_handlers = {}
for var in d.getVar('__BBHANDLERS') or []:
# try to add the handler
handler = d.getVar(var)
bb.event.register(var, handler)
bb.event.register(var, d.getVar(var), (d.getVarFlag(var, "eventmask", True) or "").split())
bb.event.fire(bb.event.RecipePreFinalise(fn), d)