summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/runqueue.py46
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