diff options
Diffstat (limited to 'bitbake/lib/bb/runqueue.py')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 22 |
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 | |||
14 | import sys | 14 | import sys |
15 | import stat | 15 | import stat |
16 | import errno | 16 | import errno |
17 | import itertools | ||
17 | import logging | 18 | import logging |
18 | import re | 19 | import re |
19 | import bb | 20 | import 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 | ||