summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/ui/buildinfohelper.py64
-rw-r--r--bitbake/lib/bb/ui/toasterui.py2
2 files changed, 21 insertions, 45 deletions
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py
index b2e21ef2a6..fef849d9a0 100644
--- a/bitbake/lib/bb/ui/buildinfohelper.py
+++ b/bitbake/lib/bb/ui/buildinfohelper.py
@@ -319,23 +319,16 @@ class BuildInfoHelper(object):
319 assert False 319 assert False
320 return None 320 return None
321 321
322 def _get_recipe_information_from_build_event(self, event): 322 def _get_recipe_information_from_taskfile(self, taskfile):
323 323
324 layer_version_obj = self._get_layer_version_for_path(re.split(':', event.taskfile)[-1]) 324 layer_version_obj = self._get_layer_version_for_path(re.split(':', taskfile)[-1])
325 325
326 recipe_info = {} 326 recipe_info = {}
327 recipe_info['layer_version'] = layer_version_obj 327 recipe_info['layer_version'] = layer_version_obj
328 recipe_info['file_path'] = re.split(':', event.taskfile)[-1] 328 recipe_info['file_path'] = re.split(':', taskfile)[-1]
329 329
330 return recipe_info 330 return recipe_info
331 331
332 def _get_task_build_stats(self, task_object):
333 bs_path = self._get_path_information(task_object)
334 for bp in bs_path: # TODO: split for each target
335 task_build_stats = self._get_build_stats_from_file(bp, task_object.task_name)
336
337 return task_build_stats
338
339 def _get_path_information(self, task_object): 332 def _get_path_information(self, task_object):
340 build_stats_format = "{tmpdir}/buildstats/{target}-{machine}/{buildname}/{package}/" 333 build_stats_format = "{tmpdir}/buildstats/{target}-{machine}/{buildname}/{package}/"
341 build_stats_path = [] 334 build_stats_path = []
@@ -356,36 +349,6 @@ class BuildInfoHelper(object):
356 349
357 return build_stats_path 350 return build_stats_path
358 351
359 def _get_build_stats_from_file(self, bs_path, task_name):
360
361 task_bs_filename = str(bs_path) + str(task_name)
362 task_bs = open(task_bs_filename, 'r')
363
364 cpu_usage = 0
365 disk_io = 0
366 startio = ''
367 endio = ''
368
369 for line in task_bs.readlines():
370 if line.startswith('CPU usage: '):
371 cpu_usage = line[11:]
372 elif line.startswith('EndTimeIO: '):
373 endio = line[11:]
374 elif line.startswith('StartTimeIO: '):
375 startio = line[13:]
376
377 task_bs.close()
378
379 if startio and endio:
380 disk_io = int(endio.strip('\n ')) - int(startio.strip('\n '))
381
382 if cpu_usage:
383 cpu_usage = float(cpu_usage.strip('% \n'))
384
385 task_build_stats = {'cpu_usage': cpu_usage, 'disk_io': disk_io}
386
387 return task_build_stats
388
389 def _remove_redundant(self, string): 352 def _remove_redundant(self, string):
390 ret = [] 353 ret = []
391 for i in string.split(): 354 for i in string.split():
@@ -435,7 +398,7 @@ class BuildInfoHelper(object):
435 def store_started_task(self, event): 398 def store_started_task(self, event):
436 identifier = event.taskfile + event.taskname 399 identifier = event.taskfile + event.taskname
437 400
438 recipe_information = self._get_recipe_information_from_build_event(event) 401 recipe_information = self._get_recipe_information_from_taskfile(event.taskfile)
439 recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) 402 recipe = self.orm_wrapper.get_update_recipe_object(recipe_information)
440 403
441 task_information = self._get_task_information(event, recipe) 404 task_information = self._get_task_information(event, recipe)
@@ -458,9 +421,23 @@ class BuildInfoHelper(object):
458 421
459 self.internal_state[identifier] = {'start_time': datetime.datetime.now()} 422 self.internal_state[identifier] = {'start_time': datetime.datetime.now()}
460 423
424
425 def store_tasks_stats(self, event):
426 for (taskfile, taskname, taskstats) in event.data:
427 recipe_information = self._get_recipe_information_from_taskfile(taskfile)
428 recipe = self.orm_wrapper.get_update_recipe_object(recipe_information)
429
430 task_information = {}
431 task_information['build'] = self.internal_state['build']
432 task_information['recipe'] = recipe
433 task_information['task_name'] = taskname
434 task_information['cpu_usage'] = taskstats['cpu_usage']
435 task_information['disk_io'] = taskstats['disk_io']
436 task_obj = self.orm_wrapper.get_update_task_object(task_information)
437
461 def update_and_store_task(self, event): 438 def update_and_store_task(self, event):
462 identifier = event.taskfile + event.taskname 439 identifier = event.taskfile + event.taskname
463 recipe_information = self._get_recipe_information_from_build_event(event) 440 recipe_information = self._get_recipe_information_from_taskfile(event.taskfile)
464 recipe = self.orm_wrapper.get_update_recipe_object(recipe_information) 441 recipe = self.orm_wrapper.get_update_recipe_object(recipe_information)
465 task_information = self._get_task_information(event,recipe) 442 task_information = self._get_task_information(event,recipe)
466 try: 443 try:
@@ -483,9 +460,6 @@ class BuildInfoHelper(object):
483 460
484 if isinstance(event, (bb.runqueue.runQueueTaskCompleted, bb.runqueue.sceneQueueTaskCompleted)): 461 if isinstance(event, (bb.runqueue.runQueueTaskCompleted, bb.runqueue.sceneQueueTaskCompleted)):
485 task_information['outcome'] = Task.OUTCOME_SUCCESS 462 task_information['outcome'] = Task.OUTCOME_SUCCESS
486 task_build_stats = self._get_task_build_stats(self.orm_wrapper.get_update_task_object(task_information))
487 task_information['cpu_usage'] = task_build_stats['cpu_usage']
488 task_information['disk_io'] = task_build_stats['disk_io']
489 del self.internal_state[identifier] 463 del self.internal_state[identifier]
490 464
491 if isinstance(event, (bb.runqueue.runQueueTaskFailed, bb.runqueue.sceneQueueTaskFailed)): 465 if isinstance(event, (bb.runqueue.runQueueTaskFailed, bb.runqueue.sceneQueueTaskFailed)):
diff --git a/bitbake/lib/bb/ui/toasterui.py b/bitbake/lib/bb/ui/toasterui.py
index 50493e7b0d..318fc28adb 100644
--- a/bitbake/lib/bb/ui/toasterui.py
+++ b/bitbake/lib/bb/ui/toasterui.py
@@ -238,6 +238,8 @@ def main(server, eventHandler, params ):
238 buildinfohelper.store_build_package_information(event) 238 buildinfohelper.store_build_package_information(event)
239 if event.type == "LayerInfo": 239 if event.type == "LayerInfo":
240 buildinfohelper.store_layer_info(event) 240 buildinfohelper.store_layer_info(event)
241 if event.type == "BuildStatsList":
242 buildinfohelper.store_tasks_stats(event)
241 continue 243 continue
242 244
243 # ignore 245 # ignore