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_handlers = {}
_ui_handler_seq = 0 _ui_handler_seq = 0
def fire(event, d): def fire_class_handlers(event, d):
"""Fire off an Event"""
if worker_pid != 0:
worker_fire(event, d)
return
for handler in _handlers: for handler in _handlers:
h = _handlers[handler] h = _handlers[handler]
event.data = d event.data = d
@ -65,6 +59,7 @@ def fire(event, d):
h(event) h(event)
del event.data del event.data
def fire_ui_handlers(event, d):
errors = [] errors = []
for h in _ui_handlers: for h in _ui_handlers:
#print "Sending event %s" % event #print "Sending event %s" % event
@ -78,6 +73,20 @@ def fire(event, d):
for h in errors: for h in errors:
del _ui_handlers[h] 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): def worker_fire(event, d):
data = "<event>" + pickle.dumps(event) + "</event>" data = "<event>" + pickle.dumps(event) + "</event>"
try: try:
@ -91,7 +100,7 @@ def fire_from_worker(event, d):
print "Error, not an event" print "Error, not an event"
return return
event = pickle.loads(event[7:-8]) event = pickle.loads(event[7:-8])
bb.event.fire(event, d) fire_ui_handlers(event, d)
def register(name, handler): def register(name, handler):
"""Register an Event handler""" """Register an Event handler"""