summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/event.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/event.py')
-rw-r--r--bitbake/lib/bb/event.py44
1 files changed, 28 insertions, 16 deletions
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py
index cbe6d2a11a..b1d12177c4 100644
--- a/bitbake/lib/bb/event.py
+++ b/bitbake/lib/bb/event.py
@@ -44,7 +44,13 @@ class Event:
44 44
45NotHandled = 0 45NotHandled = 0
46Handled = 1 46Handled = 1
47handlers = [] 47
48Registered = 10
49AlreadyRegistered = 14
50
51# Internal
52_handlers = []
53_handlers_dict = {}
48 54
49def tmpHandler(event): 55def tmpHandler(event):
50 """Default handler for code events""" 56 """Default handler for code events"""
@@ -57,7 +63,7 @@ def defaultTmpHandler():
57 63
58def fire(event): 64def fire(event):
59 """Fire off an Event""" 65 """Fire off an Event"""
60 for h in handlers: 66 for h in _handlers:
61 if type(h).__name__ == "code": 67 if type(h).__name__ == "code":
62 exec(h) 68 exec(h)
63 if tmpHandler(event) == Handled: 69 if tmpHandler(event) == Handled:
@@ -67,15 +73,22 @@ def fire(event):
67 return Handled 73 return Handled
68 return NotHandled 74 return NotHandled
69 75
70def register(handler): 76def register(name, handler):
71 """Register an Event handler""" 77 """Register an Event handler"""
78
79 # already registered
80 if name in _handlers_dict:
81 return AlreadyRegistered
82
72 if handler is not None: 83 if handler is not None:
73# handle string containing python code 84# handle string containing python code
74 if type(handler).__name__ == "str": 85 if type(handler).__name__ == "str":
75 return _registerCode(handler) 86 _registerCode(handler)
76# prevent duplicate registration 87 else:
77 if not handler in handlers: 88 _handlers.append(handler)
78 handlers.append(handler) 89
90 _handlers_dict[name] = 1
91 return Registered
79 92
80def _registerCode(handlerStr): 93def _registerCode(handlerStr):
81 """Register a 'code' Event. 94 """Register a 'code' Event.
@@ -88,24 +101,23 @@ def _registerCode(handlerStr):
88 tmp = "def tmpHandler(e):\n%s" % handlerStr 101 tmp = "def tmpHandler(e):\n%s" % handlerStr
89 comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._registerCode") 102 comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._registerCode")
90# prevent duplicate registration 103# prevent duplicate registration
91 if not comp in handlers: 104 _handlers.append(comp)
92 handlers.append(comp)
93 105
94def remove(handler): 106def remove(name, handler):
95 """Remove an Event handler""" 107 """Remove an Event handler"""
96 for h in handlers:
97 if type(handler).__name__ == "str":
98 return _removeCode(handler)
99 108
100 if handler is h: 109 _handlers_dict.pop(name)
101 handlers.remove(handler) 110 if type(handler).__name__ == "str":
111 return _removeCode(handler)
112 else:
113 _handlers.remove(handler)
102 114
103def _removeCode(handlerStr): 115def _removeCode(handlerStr):
104 """Remove a 'code' Event handler 116 """Remove a 'code' Event handler
105 Deprecated interface; call remove instead.""" 117 Deprecated interface; call remove instead."""
106 tmp = "def tmpHandler(e):\n%s" % handlerStr 118 tmp = "def tmpHandler(e):\n%s" % handlerStr
107 comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._removeCode") 119 comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._removeCode")
108 handlers.remove(comp) 120 _handlers.remove(comp)
109 121
110def getName(e): 122def getName(e):
111 """Returns the name of a class or class instance""" 123 """Returns the name of a class or class instance"""