summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
authorBogdan Marinescu <bogdan.a.marinescu@intel.com>2013-05-31 14:19:14 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-06-14 12:52:58 +0100
commit5aa5fc470ef20a3eda761d7dd8899732cb799ca4 (patch)
tree14a59dd1e48548477dab05f6852b6bac713fc8ee /bitbake/lib
parent542d6a87db0bab1210f2b5b51c0becdafe4d1b83 (diff)
downloadpoky-5aa5fc470ef20a3eda761d7dd8899732cb799ca4.tar.gz
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>
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/bb/cookerdata.py2
-rw-r--r--bitbake/lib/bb/event.py23
-rw-r--r--bitbake/lib/bb/parse/ast.py3
3 files changed, 20 insertions, 8 deletions
diff --git a/bitbake/lib/bb/cookerdata.py b/bitbake/lib/bb/cookerdata.py
index 1bed455d16..4ddc2a5144 100644
--- a/bitbake/lib/bb/cookerdata.py
+++ b/bitbake/lib/bb/cookerdata.py
@@ -269,7 +269,7 @@ class CookerDataBuilder(object):
269 # Nomally we only register event handlers at the end of parsing .bb files 269 # Nomally we only register event handlers at the end of parsing .bb files
270 # We register any handlers we've found so far here... 270 # We register any handlers we've found so far here...
271 for var in data.getVar('__BBHANDLERS') or []: 271 for var in data.getVar('__BBHANDLERS') or []:
272 bb.event.register(var, data.getVar(var)) 272 bb.event.register(var, data.getVar(var), (data.getVarFlag(var, "eventmask", True) or "").split())
273 273
274 if data.getVar("BB_WORKERCONTEXT", False) is None: 274 if data.getVar("BB_WORKERCONTEXT", False) is None:
275 bb.fetch.fetcher_init(data) 275 bb.fetch.fetcher_init(data)
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py
index d73067fcf9..9c134eed0d 100644
--- a/bitbake/lib/bb/event.py
+++ b/bitbake/lib/bb/event.py
@@ -64,6 +64,8 @@ def clean_class_handlers():
64_handlers = clean_class_handlers() 64_handlers = clean_class_handlers()
65_ui_handlers = {} 65_ui_handlers = {}
66_ui_handler_seq = 0 66_ui_handler_seq = 0
67_event_handler_map = {}
68_catchall_handlers = {}
67 69
68def execute_handler(name, handler, event, d): 70def execute_handler(name, handler, event, d):
69 event.data = d 71 event.data = d
@@ -87,11 +89,14 @@ def fire_class_handlers(event, d):
87 if isinstance(event, logging.LogRecord): 89 if isinstance(event, logging.LogRecord):
88 return 90 return
89 91
92 eid = str(event.__class__)[8:-2]
93 evt_hmap = _event_handler_map.get(eid, {})
90 for name, handler in _handlers.iteritems(): 94 for name, handler in _handlers.iteritems():
91 try: 95 if name in _catchall_handlers or name in evt_hmap:
92 execute_handler(name, handler, event, d) 96 try:
93 except Exception: 97 execute_handler(name, handler, event, d)
94 continue 98 except Exception:
99 continue
95 100
96ui_queue = [] 101ui_queue = []
97@atexit.register 102@atexit.register
@@ -160,7 +165,7 @@ def fire_from_worker(event, d):
160 fire_ui_handlers(event, d) 165 fire_ui_handlers(event, d)
161 166
162noop = lambda _: None 167noop = lambda _: None
163def register(name, handler): 168def register(name, handler, mask=[]):
164 """Register an Event handler""" 169 """Register an Event handler"""
165 170
166 # already registered 171 # already registered
@@ -185,6 +190,14 @@ def register(name, handler):
185 else: 190 else:
186 _handlers[name] = handler 191 _handlers[name] = handler
187 192
193 if not mask:
194 _catchall_handlers[name] = True
195 else:
196 for m in mask:
197 if _event_handler_map.get(m, None) is None:
198 _event_handler_map[m] = {}
199 _event_handler_map[m][name] = True
200
188 return Registered 201 return Registered
189 202
190def remove(name, handler): 203def remove(name, handler):
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py
index 713bef1cc2..6e7fd84b16 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):
320 all_handlers = {} 320 all_handlers = {}
321 for var in d.getVar('__BBHANDLERS') or []: 321 for var in d.getVar('__BBHANDLERS') or []:
322 # try to add the handler 322 # try to add the handler
323 handler = d.getVar(var) 323 bb.event.register(var, d.getVar(var), (d.getVarFlag(var, "eventmask", True) or "").split())
324 bb.event.register(var, handler)
325 324
326 bb.event.fire(bb.event.RecipePreFinalise(fn), d) 325 bb.event.fire(bb.event.RecipePreFinalise(fn), d)
327 326