bin/bitbake:
authorHolger Hans Peter Freyther <zecke@selfish.org>
Wed, 22 Mar 2006 13:48:02 +0000 (13:48 +0000)
committerHolger Hans Peter Freyther <zecke@selfish.org>
Wed, 22 Mar 2006 13:48:02 +0000 (13:48 +0000)
    -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
lib/bb/event.py
lib/bb/parse/parse_py/BBHandler.py

index 59caf07..ac5a8b7 100755 (executable)
@@ -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
index cbe6d2a..6e5bf2f 100644 (file)
@@ -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"""
index 17941d9..92ff6c5 100644 (file)
@@ -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