diff options
-rw-r--r-- | bitbake/lib/bb/build.py | 25 | ||||
-rw-r--r-- | bitbake/lib/bb/ui/knotty.py | 12 | ||||
-rw-r--r-- | bitbake/lib/bb/ui/uihelper.py | 39 |
3 files changed, 43 insertions, 33 deletions
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py index 30a2ba236f..3d9cc10c8c 100644 --- a/bitbake/lib/bb/build.py +++ b/bitbake/lib/bb/build.py | |||
@@ -57,8 +57,9 @@ builtins['os'] = os | |||
57 | class TaskBase(event.Event): | 57 | class TaskBase(event.Event): |
58 | """Base class for task events""" | 58 | """Base class for task events""" |
59 | 59 | ||
60 | def __init__(self, t, logfile, d): | 60 | def __init__(self, t, fn, logfile, d): |
61 | self._task = t | 61 | self._task = t |
62 | self._fn = fn | ||
62 | self._package = d.getVar("PF") | 63 | self._package = d.getVar("PF") |
63 | self._mc = d.getVar("BB_CURRENT_MC") | 64 | self._mc = d.getVar("BB_CURRENT_MC") |
64 | self.taskfile = d.getVar("FILE") | 65 | self.taskfile = d.getVar("FILE") |
@@ -81,8 +82,8 @@ class TaskBase(event.Event): | |||
81 | 82 | ||
82 | class TaskStarted(TaskBase): | 83 | class TaskStarted(TaskBase): |
83 | """Task execution started""" | 84 | """Task execution started""" |
84 | def __init__(self, t, logfile, taskflags, d): | 85 | def __init__(self, t, fn, logfile, taskflags, d): |
85 | super(TaskStarted, self).__init__(t, logfile, d) | 86 | super(TaskStarted, self).__init__(t, fn, logfile, d) |
86 | self.taskflags = taskflags | 87 | self.taskflags = taskflags |
87 | 88 | ||
88 | class TaskSucceeded(TaskBase): | 89 | class TaskSucceeded(TaskBase): |
@@ -91,9 +92,9 @@ class TaskSucceeded(TaskBase): | |||
91 | class TaskFailed(TaskBase): | 92 | class TaskFailed(TaskBase): |
92 | """Task execution failed""" | 93 | """Task execution failed""" |
93 | 94 | ||
94 | def __init__(self, task, logfile, metadata, errprinted = False): | 95 | def __init__(self, task, fn, logfile, metadata, errprinted = False): |
95 | self.errprinted = errprinted | 96 | self.errprinted = errprinted |
96 | super(TaskFailed, self).__init__(task, logfile, metadata) | 97 | super(TaskFailed, self).__init__(task, fn, logfile, metadata) |
97 | 98 | ||
98 | class TaskFailedSilent(TaskBase): | 99 | class TaskFailedSilent(TaskBase): |
99 | """Task execution failed (silently)""" | 100 | """Task execution failed (silently)""" |
@@ -103,8 +104,8 @@ class TaskFailedSilent(TaskBase): | |||
103 | 104 | ||
104 | class TaskInvalid(TaskBase): | 105 | class TaskInvalid(TaskBase): |
105 | 106 | ||
106 | def __init__(self, task, metadata): | 107 | def __init__(self, task, fn, metadata): |
107 | super(TaskInvalid, self).__init__(task, None, metadata) | 108 | super(TaskInvalid, self).__init__(task, fn, None, metadata) |
108 | self._message = "No such task '%s'" % task | 109 | self._message = "No such task '%s'" % task |
109 | 110 | ||
110 | class TaskProgress(event.Event): | 111 | class TaskProgress(event.Event): |
@@ -572,7 +573,7 @@ def _exec_task(fn, task, d, quieterr): | |||
572 | 573 | ||
573 | try: | 574 | try: |
574 | try: | 575 | try: |
575 | event.fire(TaskStarted(task, logfn, flags, localdata), localdata) | 576 | event.fire(TaskStarted(task, fn, logfn, flags, localdata), localdata) |
576 | except (bb.BBHandledException, SystemExit): | 577 | except (bb.BBHandledException, SystemExit): |
577 | return 1 | 578 | return 1 |
578 | 579 | ||
@@ -583,15 +584,15 @@ def _exec_task(fn, task, d, quieterr): | |||
583 | for func in (postfuncs or '').split(): | 584 | for func in (postfuncs or '').split(): |
584 | exec_func(func, localdata) | 585 | exec_func(func, localdata) |
585 | except bb.BBHandledException: | 586 | except bb.BBHandledException: |
586 | event.fire(TaskFailed(task, logfn, localdata, True), localdata) | 587 | event.fire(TaskFailed(task, fn, logfn, localdata, True), localdata) |
587 | return 1 | 588 | return 1 |
588 | except Exception as exc: | 589 | except Exception as exc: |
589 | if quieterr: | 590 | if quieterr: |
590 | event.fire(TaskFailedSilent(task, logfn, localdata), localdata) | 591 | event.fire(TaskFailedSilent(task, fn, logfn, localdata), localdata) |
591 | else: | 592 | else: |
592 | errprinted = errchk.triggered | 593 | errprinted = errchk.triggered |
593 | logger.error(str(exc)) | 594 | logger.error(str(exc)) |
594 | event.fire(TaskFailed(task, logfn, localdata, errprinted), localdata) | 595 | event.fire(TaskFailed(task, fn, logfn, localdata, errprinted), localdata) |
595 | return 1 | 596 | return 1 |
596 | finally: | 597 | finally: |
597 | sys.stdout.flush() | 598 | sys.stdout.flush() |
@@ -614,7 +615,7 @@ def _exec_task(fn, task, d, quieterr): | |||
614 | logger.debug(2, "Zero size logfn %s, removing", logfn) | 615 | logger.debug(2, "Zero size logfn %s, removing", logfn) |
615 | bb.utils.remove(logfn) | 616 | bb.utils.remove(logfn) |
616 | bb.utils.remove(loglink) | 617 | bb.utils.remove(loglink) |
617 | event.fire(TaskSucceeded(task, logfn, localdata), localdata) | 618 | event.fire(TaskSucceeded(task, fn, logfn, localdata), localdata) |
618 | 619 | ||
619 | if not localdata.getVarFlag(task, 'nostamp', False) and not localdata.getVarFlag(task, 'selfstamp', False): | 620 | if not localdata.getVarFlag(task, 'nostamp', False) and not localdata.getVarFlag(task, 'selfstamp', False): |
620 | make_stamp(task, localdata) | 621 | make_stamp(task, localdata) |
diff --git a/bitbake/lib/bb/ui/knotty.py b/bitbake/lib/bb/ui/knotty.py index 35736ade03..bd9911cf6f 100644 --- a/bitbake/lib/bb/ui/knotty.py +++ b/bitbake/lib/bb/ui/knotty.py | |||
@@ -255,19 +255,19 @@ class TerminalFilter(object): | |||
255 | start_time = activetasks[t].get("starttime", None) | 255 | start_time = activetasks[t].get("starttime", None) |
256 | if not pbar or pbar.bouncing != (progress < 0): | 256 | if not pbar or pbar.bouncing != (progress < 0): |
257 | if progress < 0: | 257 | if progress < 0: |
258 | pbar = BBProgress("0: %s (pid %s) " % (activetasks[t]["title"], t), 100, widgets=[progressbar.BouncingSlider(), ''], extrapos=2, resize_handler=self.sigwinch_handle) | 258 | pbar = BBProgress("0: %s (pid %s) " % (activetasks[t]["title"], activetasks[t]["pid"]), 100, widgets=[progressbar.BouncingSlider(), ''], extrapos=2, resize_handler=self.sigwinch_handle) |
259 | pbar.bouncing = True | 259 | pbar.bouncing = True |
260 | else: | 260 | else: |
261 | pbar = BBProgress("0: %s (pid %s) " % (activetasks[t]["title"], t), 100, widgets=[progressbar.Percentage(), ' ', progressbar.Bar(), ''], extrapos=4, resize_handler=self.sigwinch_handle) | 261 | pbar = BBProgress("0: %s (pid %s) " % (activetasks[t]["title"], activetasks[t]["pid"]), 100, widgets=[progressbar.Percentage(), ' ', progressbar.Bar(), ''], extrapos=4, resize_handler=self.sigwinch_handle) |
262 | pbar.bouncing = False | 262 | pbar.bouncing = False |
263 | activetasks[t]["progressbar"] = pbar | 263 | activetasks[t]["progressbar"] = pbar |
264 | tasks.append((pbar, progress, rate, start_time)) | 264 | tasks.append((pbar, progress, rate, start_time)) |
265 | else: | 265 | else: |
266 | start_time = activetasks[t].get("starttime", None) | 266 | start_time = activetasks[t].get("starttime", None) |
267 | if start_time: | 267 | if start_time: |
268 | tasks.append("%s - %s (pid %s)" % (activetasks[t]["title"], self.elapsed(currenttime - start_time), t)) | 268 | tasks.append("%s - %s (pid %s)" % (activetasks[t]["title"], self.elapsed(currenttime - start_time), activetasks[t]["pid"])) |
269 | else: | 269 | else: |
270 | tasks.append("%s (pid %s)" % (activetasks[t]["title"], t)) | 270 | tasks.append("%s (pid %s)" % (activetasks[t]["title"], activetasks[t]["pid"])) |
271 | 271 | ||
272 | if self.main.shutdown: | 272 | if self.main.shutdown: |
273 | content = "Waiting for %s running tasks to finish:" % len(activetasks) | 273 | content = "Waiting for %s running tasks to finish:" % len(activetasks) |
@@ -517,8 +517,8 @@ def main(server, eventHandler, params, tf = TerminalFilter): | |||
517 | continue | 517 | continue |
518 | 518 | ||
519 | # Prefix task messages with recipe/task | 519 | # Prefix task messages with recipe/task |
520 | if event.taskpid in helper.running_tasks and event.levelno != format.PLAIN: | 520 | if event.taskpid in helper.pidmap and event.levelno != format.PLAIN: |
521 | taskinfo = helper.running_tasks[event.taskpid] | 521 | taskinfo = helper.running_tasks[helper.pidmap[event.taskpid]] |
522 | event.msg = taskinfo['title'] + ': ' + event.msg | 522 | event.msg = taskinfo['title'] + ': ' + event.msg |
523 | if hasattr(event, 'fn'): | 523 | if hasattr(event, 'fn'): |
524 | event.msg = event.fn + ': ' + event.msg | 524 | event.msg = event.fn + ': ' + event.msg |
diff --git a/bitbake/lib/bb/ui/uihelper.py b/bitbake/lib/bb/ui/uihelper.py index c8dd7df087..48d808ae28 100644 --- a/bitbake/lib/bb/ui/uihelper.py +++ b/bitbake/lib/bb/ui/uihelper.py | |||
@@ -15,39 +15,48 @@ class BBUIHelper: | |||
15 | # Running PIDs preserves the order tasks were executed in | 15 | # Running PIDs preserves the order tasks were executed in |
16 | self.running_pids = [] | 16 | self.running_pids = [] |
17 | self.failed_tasks = [] | 17 | self.failed_tasks = [] |
18 | self.pidmap = {} | ||
18 | self.tasknumber_current = 0 | 19 | self.tasknumber_current = 0 |
19 | self.tasknumber_total = 0 | 20 | self.tasknumber_total = 0 |
20 | 21 | ||
21 | def eventHandler(self, event): | 22 | def eventHandler(self, event): |
23 | # PIDs are a bad idea as they can be reused before we process all UI events. | ||
24 | # We maintain a 'fuzzy' match for TaskProgress since there is no other way to match | ||
25 | def removetid(pid, tid): | ||
26 | self.running_pids.remove(tid) | ||
27 | del self.running_tasks[tid] | ||
28 | if self.pidmap[pid] == tid: | ||
29 | del self.pidmap[pid] | ||
30 | self.needUpdate = True | ||
31 | |||
22 | if isinstance(event, bb.build.TaskStarted): | 32 | if isinstance(event, bb.build.TaskStarted): |
33 | tid = event._fn + ":" + event._task | ||
23 | if event._mc != "default": | 34 | if event._mc != "default": |
24 | self.running_tasks[event.pid] = { 'title' : "mc:%s:%s %s" % (event._mc, event._package, event._task), 'starttime' : time.time() } | 35 | self.running_tasks[tid] = { 'title' : "mc:%s:%s %s" % (event._mc, event._package, event._task), 'starttime' : time.time(), 'pid' : event.pid } |
25 | else: | 36 | else: |
26 | self.running_tasks[event.pid] = { 'title' : "%s %s" % (event._package, event._task), 'starttime' : time.time() } | 37 | self.running_tasks[tid] = { 'title' : "%s %s" % (event._package, event._task), 'starttime' : time.time(), 'pid' : event.pid } |
27 | self.running_pids.append(event.pid) | 38 | self.running_pids.append(tid) |
39 | self.pidmap[event.pid] = tid | ||
28 | self.needUpdate = True | 40 | self.needUpdate = True |
29 | elif isinstance(event, bb.build.TaskSucceeded): | 41 | elif isinstance(event, bb.build.TaskSucceeded): |
30 | del self.running_tasks[event.pid] | 42 | tid = event._fn + ":" + event._task |
31 | self.running_pids.remove(event.pid) | 43 | removetid(event.pid, tid) |
32 | self.needUpdate = True | ||
33 | elif isinstance(event, bb.build.TaskFailedSilent): | 44 | elif isinstance(event, bb.build.TaskFailedSilent): |
34 | del self.running_tasks[event.pid] | 45 | tid = event._fn + ":" + event._task |
35 | self.running_pids.remove(event.pid) | 46 | removetid(event.pid, tid) |
36 | # Don't add to the failed tasks list since this is e.g. a setscene task failure | 47 | # Don't add to the failed tasks list since this is e.g. a setscene task failure |
37 | self.needUpdate = True | ||
38 | elif isinstance(event, bb.build.TaskFailed): | 48 | elif isinstance(event, bb.build.TaskFailed): |
39 | del self.running_tasks[event.pid] | 49 | tid = event._fn + ":" + event._task |
40 | self.running_pids.remove(event.pid) | 50 | removetid(event.pid, tid) |
41 | self.failed_tasks.append( { 'title' : "%s %s" % (event._package, event._task)}) | 51 | self.failed_tasks.append( { 'title' : "%s %s" % (event._package, event._task)}) |
42 | self.needUpdate = True | ||
43 | elif isinstance(event, bb.runqueue.runQueueTaskStarted): | 52 | elif isinstance(event, bb.runqueue.runQueueTaskStarted): |
44 | self.tasknumber_current = event.stats.completed + event.stats.active + event.stats.failed + 1 | 53 | self.tasknumber_current = event.stats.completed + event.stats.active + event.stats.failed + 1 |
45 | self.tasknumber_total = event.stats.total | 54 | self.tasknumber_total = event.stats.total |
46 | self.needUpdate = True | 55 | self.needUpdate = True |
47 | elif isinstance(event, bb.build.TaskProgress): | 56 | elif isinstance(event, bb.build.TaskProgress): |
48 | if event.pid > 0: | 57 | if event.pid > 0 and event.pid in self.pidmap: |
49 | self.running_tasks[event.pid]['progress'] = event.progress | 58 | self.running_tasks[self.pidmap[event.pid]]['progress'] = event.progress |
50 | self.running_tasks[event.pid]['rate'] = event.rate | 59 | self.running_tasks[self.pidmap[event.pid]]['rate'] = event.rate |
51 | self.needUpdate = True | 60 | self.needUpdate = True |
52 | else: | 61 | else: |
53 | return False | 62 | return False |