Index: lib/bb/build.py
===================================================================
--- lib/bb/build.py.orig
+++ lib/bb/build.py
@@ -54,6 +54,11 @@ class TaskBase(event.Event):
def __init__(self, t, d ):
self._task = t
+ self._data = {}
+
+ for i in ('PV' ,'PR', 'PN', 'PF', 'DEFAULT_PREFERENCE'):
+ self._data[i] = bb.data.getVar(i, d, True)
+
self._package = bb.data.getVar("PF", d, 1)
event.Event.__init__(self)
self._message = "package %s: task %s: %s" % (bb.data.getVar("PF", d, 1), t, bb.event.getName(self)[4:])
@@ -278,15 +283,20 @@ def exec_task(task, d):
if not data.getVarFlag(task, 'task', d):
raise EventException("No such task", InvalidTask(task, d))
+ localdata = data.createCopy(d)
+
try:
bb.msg.debug(1, bb.msg.domain.Build, "Executing task %s" % task)
- old_overrides = data.getVar('OVERRIDES', d, 0)
- localdata = data.createCopy(d)
+ old_overrides = data.getVar('OVERRIDES', localdata, 0)
data.setVar('OVERRIDES', 'task-%s:%s' % (task[3:], old_overrides), localdata)
data.update_data(localdata)
data.expandKeys(localdata)
+ utils.record_resources('task_start', localdata)
event.fire(TaskStarted(task, localdata), localdata)
- exec_func(task, localdata)
+ try:
+ exec_func(task, localdata)
+ finally:
+ utils.record_resources('task_end', localdata)
event.fire(TaskSucceeded(task, localdata), localdata)
except FuncFailed, message:
# Try to extract the optional logfile
@@ -296,8 +306,8 @@ def exec_task(task, d):
logfile = None
msg = message
bb.msg.note(1, bb.msg.domain.Build, "Task failed: %s" % message )
- failedevent = TaskFailed(msg, logfile, task, d)
- event.fire(failedevent, d)
+ failedevent = TaskFailed(msg, logfile, task, localdata)
+ event.fire(failedevent, localdata)
raise EventException("Function failed in task: %s" % message, failedevent)
# make stamp, or cause event and raise exception
Index: lib/bb/cooker.py
===================================================================
--- lib/bb/cooker.py.orig
+++ lib/bb/cooker.py
@@ -659,6 +659,7 @@ class BBCooker:
taskdata.add_provider(self.configuration.data, self.status, item)
buildname = bb.data.getVar("BUILDNAME", self.configuration.data)
+ utils.record_resources('build_start', self.configuration.event_data)
bb.event.fire(bb.event.BuildStarted(buildname, [item]), self.configuration.event_data)
# Execute the runqueue
@@ -682,6 +683,7 @@ class BBCooker:
retval = False
if not retval:
self.command.finishAsyncCommand()
+ utils.record_resources('build_end', self.configuration.event_data)
bb.event.fire(bb.event.BuildCompleted(buildname, item, failures), self.configuration.event_data)
return False
return 0.5
@@ -718,6 +720,7 @@ class BBCooker:
retval = False
if not retval:
self.command.finishAsyncCommand()
+ utils.record_resources('build_end', self.configuration.event_data)
bb.event.fire(bb.event.BuildCompleted(buildname, targets, failures), self.configuration.event_data)
return None
return 0.5
@@ -725,6 +728,7 @@ class BBCooker:
self.buildSetVars()
buildname = bb.data.getVar("BUILDNAME", self.configuration.data)
+ utils.record_resources('build_start', self.configuration.event_data)
bb.event.fire(bb.event.BuildStarted(buildname, targets), self.configuration.event_data)
localdata = data.createCopy(self.configuration.data)
Index: lib/bb/utils.py
===================================================================
--- lib/bb/utils.py.orig
+++ lib/bb/utils.py
@@ -1188,3 +1188,14 @@ def dep_opconvert(mysplit, myuse):
mypos += 1
return newsplit
+def record_resources(prop, d):
+ import resource, time, os
+
+ ev_data = (bb.data.getVarFlag('_event_info', 'resources', d) or {})
+ ev_data[prop] = { 'res_chld' : resource.getrusage(resource.RUSAGE_CHILDREN),
+ 'res_self' : resource.getrusage(resource.RUSAGE_SELF),
+ 'clock' : time.clock(),
+ 'time' : time.time(),
+ 'pid' : os.getpid() }
+
+ bb.data.setVarFlag('_event_info', 'resources', ev_data, d)
Index: lib/bb/event.py
===================================================================
--- lib/bb/event.py.orig
+++ lib/bb/event.py
@@ -48,16 +48,12 @@ _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(event, info, d):
for handler in _handlers:
h = _handlers[handler]
event.data = d
+ event.info = info
+
if type(h).__name__ == "code":
exec(h)
tmpHandler(event)
@@ -78,8 +74,21 @@ def fire(event, d):
for h in errors:
del _ui_handlers[h]
+def fire(event, d, *args):
+ """Fire off an Event"""
+
+ if worker_pid != 0:
+ worker_fire(event, d)
+ else:
+ _fire(event, d != None and bb.data.getVarFlags('_event_info', d), d)
+
def worker_fire(event, d):
- data = "" + pickle.dumps(event) + ""
+ if d != None:
+ info = bb.data.getVarFlags('_event_info', d)
+ else:
+ info = None
+
+ data = "" + pickle.dumps([event, info]) + ""
try:
if os.write(worker_pipe, data) != len (data):
print "Error sending event to server (short write)"
@@ -90,8 +99,8 @@ def fire_from_worker(event, d):
if not event.startswith("") or not event.endswith(""):
print "Error, not an event"
return
- event = pickle.loads(event[7:-8])
- bb.event.fire(event, d)
+ info = pickle.loads(event[7:-8])
+ _fire(info[0], info[1], d)
def register(name, handler):
"""Register an Event handler"""