diff options
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index eb29780ce22..a81356857e3 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py @@ -209,7 +209,7 @@ class RunQueueScheduler(object): self.buildable.add(task) def removebuildable(self, task): - self.buildable.discard(task) + self.buildable.remove(task) def describe_task(self, taskid): result = 'ID %s' % taskid @@ -1739,6 +1739,7 @@ class RunQueueExecute: self.scenequeue_covered = set() # List of tasks which are covered (including setscene ones) self.tasks_covered = set() + self.tasks_scenequeue_done = set() self.scenequeue_notcovered = set() self.tasks_notcovered = set() self.scenequeue_notneeded = set() @@ -1871,13 +1872,6 @@ class RunQueueExecute: self.runq_buildable.add(task) self.sched.newbuildable(task) - def setnotbuildable(self, task): - if task in self.runq_running: - logger.warn("Can't remove already running task %s" % task) - return - self.runq_buildable.discard(task) - self.sched.removebuildable(task) - def task_completeoutright(self, task): """ Mark a task as completed @@ -1955,6 +1949,9 @@ class RunQueueExecute: if x not in self.tasks_covered and x not in self.tasks_notcovered: logger.error("Task %s was never moved from the setscene queue" % x) err = True + if x not in self.tasks_scenequeue_done: + logger.error("Task %s was never processed by the setscene code" % x) + err = True if len(self.rqdata.runtaskentries[x].depends) == 0 and x not in self.runq_buildable: logger.error("Task %s was never marked as buildable by the setscene code" % x) err = True @@ -2226,17 +2223,15 @@ class RunQueueExecute: for tid in self.scenequeue_notcovered: notcovered |= self.sqdata.sq_covered_tasks[tid] notcovered |= self.sqdata.unskippable.difference(self.rqdata.runq_setscene_tids) + notcovered.intersection_update(self.tasks_scenequeue_done) covered = set() for tid in self.scenequeue_covered: - if self.sqdata.sq_revdeps[tid].issubset(self.scenequeue_notcovered | self.scenequeue_covered): + if self.sqdata.sq_revdeps[tid].issubset(self.tasks_scenequeue_done): covered.add(tid) covered |= self.sqdata.sq_covered_tasks[tid] covered.difference_update(notcovered) - - # Need to remove any covered_tasks from covered that haven't run yet - for tid in self.rqdata.runq_setscene_tids.difference(self.scenequeue_notcovered | self.scenequeue_covered): - covered.difference_update(self.sqdata.sq_covered_tasks[tid]) + covered.intersection_update(self.tasks_scenequeue_done) for tid in notcovered | covered: if len(self.rqdata.runtaskentries[tid].depends) == 0: @@ -2244,9 +2239,6 @@ class RunQueueExecute: elif self.rqdata.runtaskentries[tid].depends.issubset(self.runq_complete): self.setbuildable(tid) - for tid in (self.tasks_covered | self.tasks_notcovered) - (notcovered | covered): - self.setnotbuildable(tid) - self.tasks_covered = covered self.tasks_notcovered = notcovered @@ -2366,6 +2358,8 @@ class RunQueueExecute: self.pending_migrations.remove(tid) changed = True + if tid in self.tasks_scenequeue_done: + self.tasks_scenequeue_done.remove(tid) for dep in self.sqdata.sq_covered_tasks[tid]: if dep in self.runq_complete and dep not in self.runq_tasksrun: bb.error("Task %s marked as completed but now needing to rerun? Aborting build." % dep) @@ -2373,6 +2367,10 @@ class RunQueueExecute: self.rq.state = runQueueCleanUp return + if dep not in self.runq_complete: + if dep in self.tasks_scenequeue_done and dep not in self.sqdata.unskippable: + self.tasks_scenequeue_done.remove(dep) + if tid in self.sq_buildable: self.sq_buildable.remove(tid) if tid in self.sq_running: @@ -2435,6 +2433,20 @@ class RunQueueExecute: if dep not in self.sq_buildable: self.sq_buildable.add(dep) + next = set([task]) + while next: + new = set() + for t in sorted(next): + self.tasks_scenequeue_done.add(t) + # Look down the dependency chain for non-setscene things which this task depends on + # and mark as 'done' + for dep in self.rqdata.runtaskentries[t].depends: + if dep in self.rqdata.runq_setscene_tids or dep in self.tasks_scenequeue_done: + continue + if self.rqdata.runtaskentries[dep].revdeps.issubset(self.tasks_scenequeue_done): + new.add(dep) + next = new + self.holdoff_need_update = True def sq_task_completeoutright(self, task): @@ -2654,6 +2666,8 @@ def build_scenequeue_data(sqdata, rqdata, rq, cooker, stampcache, sqrq): if sqdata.unskippable != orig: new = True + sqrq.tasks_scenequeue_done |= sqdata.unskippable.difference(rqdata.runq_setscene_tids) + rqdata.init_progress_reporter.next_stage(len(rqdata.runtaskentries)) # Sanity check all dependencies could be changed to setscene task references |