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.py103
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: