From d278633c0bebe89ab2490856f57540fe263bb545 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 22 Mar 2006 13:48:02 +0000 Subject: 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 --- lib/bb/event.py | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) (limited to 'lib/bb/event.py') diff --git a/lib/bb/event.py b/lib/bb/event.py index cbe6d2a11..6e5bf2ff1 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""" -- cgit 1.2.3-korg