diff options
Diffstat (limited to 'bitbake/lib/bb/event.py')
-rw-r--r-- | bitbake/lib/bb/event.py | 23 |
1 files changed, 18 insertions, 5 deletions
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 | ||
68 | def execute_handler(name, handler, event, d): | 70 | def 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 | ||
96 | ui_queue = [] | 101 | ui_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 | ||
162 | noop = lambda _: None | 167 | noop = lambda _: None |
163 | def register(name, handler): | 168 | def 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 | ||
190 | def remove(name, handler): | 203 | def remove(name, handler): |