bitbake/event.py: Run class eventhandlers in the task context but ensure UI handlers run in the server context

Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
This commit is contained in:
Richard Purdie 2010-03-25 17:33:41 +00:00
parent 871f731e57
commit d3d36d9f44
1 changed files with 17 additions and 8 deletions

View File

@ -48,13 +48,7 @@ _handlers = {}
_ui_handlers = {}
_ui_handler_seq = 0
def fire(event, d):
"""Fire off an Event"""
if worker_pid != 0:
worker_fire(event, d)
return
def fire_class_handlers(event, d):
for handler in _handlers:
h = _handlers[handler]
event.data = d
@ -65,6 +59,7 @@ def fire(event, d):
h(event)
del event.data
def fire_ui_handlers(event, d):
errors = []
for h in _ui_handlers:
#print "Sending event %s" % event
@ -78,6 +73,20 @@ def fire(event, d):
for h in errors:
del _ui_handlers[h]
def fire(event, d):
"""Fire off an Event"""
# We can fire class handlers in the worker process context and this is
# desired so they get the task based datastore.
# UI handlers need to be fired in the server context so we defer this. They
# don't have a datastore so the datastore context isn't a problem.
fire_class_handlers(event, d)
if worker_pid != 0:
worker_fire(event, d)
else:
fire_ui_handlers(event, d)
def worker_fire(event, d):
data = "<event>" + pickle.dumps(event) + "</event>"
try:
@ -91,7 +100,7 @@ def fire_from_worker(event, d):
print "Error, not an event"
return
event = pickle.loads(event[7:-8])
bb.event.fire(event, d)
fire_ui_handlers(event, d)
def register(name, handler):
"""Register an Event handler"""