From d278633c0bebe89ab2490856f57540fe263bb545 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 22 Mar 2006 13:48:02 +0000 Subject: [PATCH] bin/bitbake: -Do not add handlers again. It is 'fast' enough to iterate over them in the BBHandler do not add them in bitbake again. This temporarily breaks the cache - which will be fixed shortly lib/bb/event.py: -Have a data structure that operates faster on lookups -Change register/remove to take a 'name' parameter lib/bb/parse/parse_py/BBHandler.py: -Update to the new event.register syntax --- bin/bitbake | 3 --- lib/bb/event.py | 38 ++++++++++++++++++++++---------------- lib/bb/parse/parse_py/BBHandler.py | 3 +-- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/bin/bitbake b/bin/bitbake index 59caf07..ac5a8b7 100755 --- a/bin/bitbake +++ b/bin/bitbake @@ -1057,9 +1057,6 @@ class BBCooker: if not os.path.isabs(aof): aof = os.path.join(os.path.dirname(f),aof) files.append(aof) - for var in bb_data.keys(): - if data.getVarFlag(var, "handler", bb_data) and data.getVar(var, bb_data): - event.register(data.getVar(var, bb_data)) self.pkgdata[f] = bb_data # now inform the caller diff --git a/lib/bb/event.py b/lib/bb/event.py index cbe6d2a..6e5bf2f 100644 --- a/lib/bb/event.py +++ b/lib/bb/event.py @@ -44,7 +44,8 @@ class Event: NotHandled = 0 Handled = 1 -handlers = [] +_handlers = [] +_handlers_dict = {} def tmpHandler(event): """Default handler for code events""" @@ -57,7 +58,7 @@ def defaultTmpHandler(): def fire(event): """Fire off an Event""" - for h in handlers: + for h in _handlers: if type(h).__name__ == "code": exec(h) if tmpHandler(event) == Handled: @@ -67,15 +68,21 @@ def fire(event): return Handled return NotHandled -def register(handler): +def register(name, handler): """Register an Event handler""" + + # already registered + if name in _handlers_dict: + return; + if handler is not None: # handle string containing python code if type(handler).__name__ == "str": - return _registerCode(handler) -# prevent duplicate registration - if not handler in handlers: - handlers.append(handler) + _registerCode(handler) + else: + _handlers.append(handler) + + _handlers_dict[name] = 1 def _registerCode(handlerStr): """Register a 'code' Event. @@ -88,24 +95,23 @@ def _registerCode(handlerStr): tmp = "def tmpHandler(e):\n%s" % handlerStr comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._registerCode") # prevent duplicate registration - if not comp in handlers: - handlers.append(comp) + _handlers.append(comp) -def remove(handler): +def remove(name, handler): """Remove an Event handler""" - for h in handlers: - if type(handler).__name__ == "str": - return _removeCode(handler) - if handler is h: - handlers.remove(handler) + _handlers_dict.pop(name) + if type(handler).__name__ == "str": + return _removeCode(handler) + else: + _handlers.remove(handler) def _removeCode(handlerStr): """Remove a 'code' Event handler Deprecated interface; call remove instead.""" tmp = "def tmpHandler(e):\n%s" % handlerStr comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._removeCode") - handlers.remove(comp) + _handlers.remove(comp) def getName(e): """Returns the name of a class or class instance""" diff --git a/lib/bb/parse/parse_py/BBHandler.py b/lib/bb/parse/parse_py/BBHandler.py index 17941d9..92ff6c5 100644 --- a/lib/bb/parse/parse_py/BBHandler.py +++ b/lib/bb/parse/parse_py/BBHandler.py @@ -167,7 +167,7 @@ def handle(fn, d, include = 0): for var in data.keys(d): if data.getVarFlag(var, 'handler', d): - bb.event.register(data.getVar(var, d)) + bb.event.register(var, data.getVar(var, d)) continue if not data.getVarFlag(var, 'task', d): @@ -225,7 +225,6 @@ def feeder(lineno, s, fn, root, d): bb.utils.better_exec(comp, __builtins__, text, fn) funcs = data.getVar('__functions__', d) or "" data.setVar('__functions__', "%s\n%s" % (funcs, text), d) - __body__ = [] __inpython__ = False -- 2.7.4