diff options
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 103 |
1 files changed, 56 insertions, 47 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index cb499a1cba..a45b27ce51 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -2248,6 +2248,7 @@ class RunQueueExecute: | |||
2248 | def process_possible_migrations(self): | 2248 | def process_possible_migrations(self): |
2249 | 2249 | ||
2250 | changed = set() | 2250 | changed = set() |
2251 | toprocess = set() | ||
2251 | for tid, unihash in self.updated_taskhash_queue.copy(): | 2252 | for tid, unihash in self.updated_taskhash_queue.copy(): |
2252 | if tid in self.runq_running and tid not in self.runq_complete: | 2253 | if tid in self.runq_running and tid not in self.runq_complete: |
2253 | continue | 2254 | continue |
@@ -2258,53 +2259,61 @@ class RunQueueExecute: | |||
2258 | logger.info("Task %s unihash changed to %s" % (tid, unihash)) | 2259 | logger.info("Task %s unihash changed to %s" % (tid, unihash)) |
2259 | self.rqdata.runtaskentries[tid].unihash = unihash | 2260 | self.rqdata.runtaskentries[tid].unihash = unihash |
2260 | bb.parse.siggen.set_unihash(tid, unihash) | 2261 | bb.parse.siggen.set_unihash(tid, unihash) |
2261 | 2262 | toprocess.add(tid) | |
2262 | # Work out all tasks which depend on this one | 2263 | |
2263 | total = set() | 2264 | # Work out all tasks which depend upon these |
2264 | next = set(self.rqdata.runtaskentries[tid].revdeps) | 2265 | total = set() |
2265 | while next: | 2266 | for p in toprocess: |
2266 | current = next.copy() | 2267 | next = set(self.rqdata.runtaskentries[p].revdeps) |
2267 | total = total |next | 2268 | while next: |
2268 | next = set() | 2269 | current = next.copy() |
2269 | for ntid in current: | 2270 | total = total | next |
2270 | next |= self.rqdata.runtaskentries[ntid].revdeps | 2271 | next = set() |
2271 | next.difference_update(total) | 2272 | for ntid in current: |
2272 | 2273 | next |= self.rqdata.runtaskentries[ntid].revdeps | |
2273 | # Now iterate those tasks in dependency order to regenerate their taskhash/unihash | 2274 | next.difference_update(total) |
2274 | done = set() | 2275 | |
2275 | next = set(self.rqdata.runtaskentries[tid].revdeps) | 2276 | # Now iterate those tasks in dependency order to regenerate their taskhash/unihash |
2276 | while next: | 2277 | next = set() |
2277 | current = next.copy() | 2278 | for p in total: |
2278 | next = set() | 2279 | if len(self.rqdata.runtaskentries[p].depends) == 0: |
2279 | for tid in current: | 2280 | next.add(p) |
2280 | if not self.rqdata.runtaskentries[tid].depends.isdisjoint(total): | 2281 | elif self.rqdata.runtaskentries[p].depends.isdisjoint(total): |
2281 | continue | 2282 | next.add(p) |
2282 | procdep = [] | 2283 | |
2283 | for dep in self.rqdata.runtaskentries[tid].depends: | 2284 | # When an item doesn't have dependencies in total, we can process it. Drop items from total when handled |
2284 | procdep.append(dep) | 2285 | while next: |
2285 | orighash = self.rqdata.runtaskentries[tid].hash | 2286 | current = next.copy() |
2286 | newhash = bb.parse.siggen.get_taskhash(tid, procdep, self.rqdata.dataCaches[mc_from_tid(tid)]) | 2287 | next = set() |
2287 | origuni = self.rqdata.runtaskentries[tid].unihash | 2288 | for tid in current: |
2288 | newuni = bb.parse.siggen.get_unihash(tid) | 2289 | if not self.rqdata.runtaskentries[tid].depends.isdisjoint(total): |
2289 | # FIXME, need to check it can come from sstate at all for determinism? | 2290 | continue |
2290 | remapped = False | 2291 | procdep = [] |
2291 | if newuni == origuni: | 2292 | for dep in self.rqdata.runtaskentries[tid].depends: |
2292 | # Nothing to do, we match, skip code below | 2293 | procdep.append(dep) |
2293 | remapped = True | 2294 | orighash = self.rqdata.runtaskentries[tid].hash |
2294 | elif tid in self.scenequeue_covered or tid in self.sq_live: | 2295 | newhash = bb.parse.siggen.get_taskhash(tid, procdep, self.rqdata.dataCaches[mc_from_tid(tid)]) |
2295 | # Already ran this setscene task or it running. Report the new taskhash | 2296 | origuni = self.rqdata.runtaskentries[tid].unihash |
2296 | remapped = bb.parse.siggen.report_unihash_equiv(tid, newhash, origuni, newuni, self.rqdata.dataCaches) | 2297 | newuni = bb.parse.siggen.get_unihash(tid) |
2297 | logger.info("Already covered setscene for %s so ignoring rehash (remap)" % (tid)) | 2298 | # FIXME, need to check it can come from sstate at all for determinism? |
2298 | 2299 | remapped = False | |
2299 | if not remapped: | 2300 | if newuni == origuni: |
2300 | logger.debug(1, "Task %s hash changes: %s->%s %s->%s" % (tid, orighash, newhash, origuni, newuni)) | 2301 | # Nothing to do, we match, skip code below |
2301 | self.rqdata.runtaskentries[tid].hash = newhash | 2302 | remapped = True |
2302 | self.rqdata.runtaskentries[tid].unihash = newuni | 2303 | elif tid in self.scenequeue_covered or tid in self.sq_live: |
2303 | changed.add(tid) | 2304 | # Already ran this setscene task or it running. Report the new taskhash |
2304 | 2305 | remapped = bb.parse.siggen.report_unihash_equiv(tid, newhash, origuni, newuni, self.rqdata.dataCaches) | |
2305 | next |= self.rqdata.runtaskentries[tid].revdeps | 2306 | logger.info("Already covered setscene for %s so ignoring rehash (remap)" % (tid)) |
2306 | total.remove(tid) | 2307 | |
2307 | next.intersection_update(total) | 2308 | if not remapped: |
2309 | #logger.debug(1, "Task %s hash changes: %s->%s %s->%s" % (tid, orighash, newhash, origuni, newuni)) | ||
2310 | self.rqdata.runtaskentries[tid].hash = newhash | ||
2311 | self.rqdata.runtaskentries[tid].unihash = newuni | ||
2312 | changed.add(tid) | ||
2313 | |||
2314 | next |= self.rqdata.runtaskentries[tid].revdeps | ||
2315 | total.remove(tid) | ||
2316 | next.intersection_update(total) | ||
2308 | 2317 | ||
2309 | if changed: | 2318 | if changed: |
2310 | for mc in self.rq.worker: | 2319 | for mc in self.rq.worker: |