summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/runqueue.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/runqueue.py')
-rw-r--r--bitbake/lib/bb/runqueue.py22
1 files changed, 17 insertions, 5 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 93079a9776..439da2bb44 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -14,6 +14,7 @@ import os
14import sys 14import sys
15import stat 15import stat
16import errno 16import errno
17import itertools
17import logging 18import logging
18import re 19import re
19import bb 20import bb
@@ -2189,12 +2190,20 @@ class RunQueueExecute:
2189 if not hasattr(self, "sorted_setscene_tids"): 2190 if not hasattr(self, "sorted_setscene_tids"):
2190 # Don't want to sort this set every execution 2191 # Don't want to sort this set every execution
2191 self.sorted_setscene_tids = sorted(self.rqdata.runq_setscene_tids) 2192 self.sorted_setscene_tids = sorted(self.rqdata.runq_setscene_tids)
2193 # Resume looping where we left off when we returned to feed the mainloop
2194 self.setscene_tids_generator = itertools.cycle(self.rqdata.runq_setscene_tids)
2192 2195
2193 task = None 2196 task = None
2194 if not self.sqdone and self.can_start_task(): 2197 if not self.sqdone and self.can_start_task():
2195 # Find the next setscene to run 2198 loopcount = 0
2196 for nexttask in self.sorted_setscene_tids: 2199 # Find the next setscene to run, exit the loop when we've processed all tids or found something to execute
2200 while loopcount < len(self.rqdata.runq_setscene_tids):
2201 loopcount += 1
2202 nexttask = next(self.setscene_tids_generator)
2197 if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values() and nexttask not in self.sq_harddep_deferred: 2203 if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values() and nexttask not in self.sq_harddep_deferred:
2204 if nexttask in self.sq_deferred and self.sq_deferred[nexttask] not in self.runq_complete:
2205 # Skip deferred tasks quickly before the 'expensive' tests below - this is key to performant multiconfig builds
2206 continue
2198 if nexttask not in self.sqdata.unskippable and self.sqdata.sq_revdeps[nexttask] and \ 2207 if nexttask not in self.sqdata.unskippable and self.sqdata.sq_revdeps[nexttask] and \
2199 nexttask not in self.sq_needed_harddeps and \ 2208 nexttask not in self.sq_needed_harddeps and \
2200 self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and \ 2209 self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and \
@@ -2224,8 +2233,7 @@ class RunQueueExecute:
2224 if t in self.runq_running and t not in self.runq_complete: 2233 if t in self.runq_running and t not in self.runq_complete:
2225 continue 2234 continue
2226 if nexttask in self.sq_deferred: 2235 if nexttask in self.sq_deferred:
2227 if self.sq_deferred[nexttask] not in self.runq_complete: 2236 # Deferred tasks that were still deferred were skipped above so we now need to process
2228 continue
2229 logger.debug("Task %s no longer deferred" % nexttask) 2237 logger.debug("Task %s no longer deferred" % nexttask)
2230 del self.sq_deferred[nexttask] 2238 del self.sq_deferred[nexttask]
2231 valid = self.rq.validate_hashes(set([nexttask]), self.cooker.data, 0, False, summary=False) 2239 valid = self.rq.validate_hashes(set([nexttask]), self.cooker.data, 0, False, summary=False)
@@ -2751,8 +2759,12 @@ class RunQueueExecute:
2751 logger.debug2("%s was unavailable and is a hard dependency of %s so skipping" % (task, dep)) 2759 logger.debug2("%s was unavailable and is a hard dependency of %s so skipping" % (task, dep))
2752 self.sq_task_failoutright(dep) 2760 self.sq_task_failoutright(dep)
2753 continue 2761 continue
2762
2763 # For performance, only compute allcovered once if needed
2764 if self.sqdata.sq_deps[task]:
2765 allcovered = self.scenequeue_covered | self.scenequeue_notcovered
2754 for dep in sorted(self.sqdata.sq_deps[task]): 2766 for dep in sorted(self.sqdata.sq_deps[task]):
2755 if self.sqdata.sq_revdeps[dep].issubset(self.scenequeue_covered | self.scenequeue_notcovered): 2767 if self.sqdata.sq_revdeps[dep].issubset(allcovered):
2756 if dep not in self.sq_buildable: 2768 if dep not in self.sq_buildable:
2757 self.sq_buildable.add(dep) 2769 self.sq_buildable.add(dep)
2758 2770