diff options
-rw-r--r-- | bitbake/lib/bb/cookerdata.py | 2 | ||||
-rw-r--r-- | bitbake/lib/bb/event.py | 23 | ||||
-rw-r--r-- | bitbake/lib/bb/parse/ast.py | 3 |
3 files changed, 20 insertions, 8 deletions
diff --git a/bitbake/lib/bb/cookerdata.py b/bitbake/lib/bb/cookerdata.py index 1bed455..4ddc2a5 100644 --- a/bitbake/lib/bb/cookerdata.py +++ b/bitbake/lib/bb/cookerdata.py @@ -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) diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index d73067f..9c134ee 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py @@ -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): diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index 713bef1..6e7fd84 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py @@ -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) |