# 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)
_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
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
fire_ui_handlers(event, d)
noop = lambda _: None
-def register(name, handler):
+def register(name, handler, mask=[]):
"""Register an Event handler"""
# already registered
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):
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)