diff options
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 109 |
1 files changed, 34 insertions, 75 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 2bf19b9778..29786c400b 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -1730,7 +1730,9 @@ class RunQueueExecute: | |||
| 1730 | self.tasks_notcovered = set() | 1730 | self.tasks_notcovered = set() |
| 1731 | self.scenequeue_notneeded = set() | 1731 | self.scenequeue_notneeded = set() |
| 1732 | 1732 | ||
| 1733 | self.coveredtopocess = set() | 1733 | # We can't skip specified target tasks which aren't setscene tasks |
| 1734 | self.cantskip = set(self.rqdata.target_tids) | ||
| 1735 | self.cantskip.difference_update(self.rqdata.runq_setscene_tids) | ||
| 1734 | 1736 | ||
| 1735 | schedulers = self.get_schedulers() | 1737 | schedulers = self.get_schedulers() |
| 1736 | for scheduler in schedulers: | 1738 | for scheduler in schedulers: |
| @@ -2235,12 +2237,12 @@ class RunQueueExecute: | |||
| 2235 | if not valid: | 2237 | if not valid: |
| 2236 | continue | 2238 | continue |
| 2237 | 2239 | ||
| 2240 | if tid in self.tasks_scenequeue_done: | ||
| 2241 | self.tasks_scenequeue_done.remove(tid) | ||
| 2238 | for dep in self.sqdata.sq_covered_tasks[tid]: | 2242 | for dep in self.sqdata.sq_covered_tasks[tid]: |
| 2239 | if dep not in self.runq_complete: | 2243 | if dep not in self.runq_complete: |
| 2240 | if dep in self.tasks_scenequeue_done: | 2244 | if dep in self.tasks_scenequeue_done and dep not in self.sqdata.unskippable: |
| 2241 | self.tasks_scenequeue_done.remove(dep) | 2245 | self.tasks_scenequeue_done.remove(dep) |
| 2242 | if dep in self.tasks_notcovered: | ||
| 2243 | self.tasks_notcovered.remove(dep) | ||
| 2244 | 2246 | ||
| 2245 | if tid in self.sq_buildable: | 2247 | if tid in self.sq_buildable: |
| 2246 | self.sq_buildable.remove(tid) | 2248 | self.sq_buildable.remove(tid) |
| @@ -2254,6 +2256,8 @@ class RunQueueExecute: | |||
| 2254 | self.sqdata.outrightfail.remove(tid) | 2256 | self.sqdata.outrightfail.remove(tid) |
| 2255 | if tid in self.scenequeue_notcovered: | 2257 | if tid in self.scenequeue_notcovered: |
| 2256 | self.scenequeue_notcovered.remove(tid) | 2258 | self.scenequeue_notcovered.remove(tid) |
| 2259 | if tid in self.scenequeue_covered: | ||
| 2260 | self.scenequeue_covered.remove(tid) | ||
| 2257 | 2261 | ||
| 2258 | (mc, fn, taskname, taskfn) = split_tid_mcfn(tid) | 2262 | (mc, fn, taskname, taskfn) = split_tid_mcfn(tid) |
| 2259 | self.sqdata.stamps[tid] = bb.build.stampfile(taskname + "_setscene", self.rqdata.dataCaches[mc], taskfn, noextra=True) | 2263 | self.sqdata.stamps[tid] = bb.build.stampfile(taskname + "_setscene", self.rqdata.dataCaches[mc], taskfn, noextra=True) |
| @@ -2269,41 +2273,8 @@ class RunQueueExecute: | |||
| 2269 | if changes: | 2273 | if changes: |
| 2270 | self.update_holdofftasks() | 2274 | self.update_holdofftasks() |
| 2271 | 2275 | ||
| 2272 | def scenequeue_process_notcovered(self, task): | ||
| 2273 | if len(self.rqdata.runtaskentries[task].depends) == 0: | ||
| 2274 | self.setbuildable(task) | ||
| 2275 | notcovered = set([task]) | ||
| 2276 | while notcovered: | ||
| 2277 | new = set() | ||
| 2278 | for t in sorted(notcovered): | ||
| 2279 | for deptask in sorted(self.rqdata.runtaskentries[t].depends): | ||
| 2280 | if deptask in notcovered or deptask in new or deptask in self.rqdata.runq_setscene_tids or deptask in self.tasks_notcovered: | ||
| 2281 | continue | ||
| 2282 | logger.debug(1, 'Task %s depends on non-setscene task %s so not skipping' % (t, deptask)) | ||
| 2283 | new.add(deptask) | ||
| 2284 | self.tasks_notcovered.add(deptask) | ||
| 2285 | if len(self.rqdata.runtaskentries[deptask].depends) == 0: | ||
| 2286 | self.setbuildable(deptask) | ||
| 2287 | notcovered = new | ||
| 2288 | |||
| 2289 | def scenequeue_process_unskippable(self, task): | ||
| 2290 | # Look up the dependency chain for non-setscene things which depend on this task | ||
| 2291 | # and mark as 'done'/notcovered | ||
| 2292 | ready = set([task]) | ||
| 2293 | while ready: | ||
| 2294 | new = set() | ||
| 2295 | for t in sorted(ready): | ||
| 2296 | for deptask in sorted(self.rqdata.runtaskentries[t].revdeps): | ||
| 2297 | if deptask in ready or deptask in new or deptask in self.tasks_scenequeue_done or deptask in self.rqdata.runq_setscene_tids: | ||
| 2298 | continue | ||
| 2299 | if deptask in self.sqdata.unskippable: | ||
| 2300 | new.add(deptask) | ||
| 2301 | self.tasks_scenequeue_done.add(deptask) | ||
| 2302 | self.tasks_notcovered.add(deptask) | ||
| 2303 | #logger.warning("Up: " + str(deptask)) | ||
| 2304 | ready = new | ||
| 2305 | |||
| 2306 | def scenequeue_updatecounters(self, task, fail=False): | 2276 | def scenequeue_updatecounters(self, task, fail=False): |
| 2277 | |||
| 2307 | for dep in sorted(self.sqdata.sq_deps[task]): | 2278 | for dep in sorted(self.sqdata.sq_deps[task]): |
| 2308 | if fail and task in self.sqdata.sq_harddeps and dep in self.sqdata.sq_harddeps[task]: | 2279 | if fail and task in self.sqdata.sq_harddeps and dep in self.sqdata.sq_harddeps[task]: |
| 2309 | logger.debug(2, "%s was unavailable and is a hard dependency of %s so skipping" % (task, dep)) | 2280 | logger.debug(2, "%s was unavailable and is a hard dependency of %s so skipping" % (task, dep)) |
| @@ -2325,39 +2296,30 @@ class RunQueueExecute: | |||
| 2325 | continue | 2296 | continue |
| 2326 | if self.rqdata.runtaskentries[dep].revdeps.issubset(self.tasks_scenequeue_done): | 2297 | if self.rqdata.runtaskentries[dep].revdeps.issubset(self.tasks_scenequeue_done): |
| 2327 | new.add(dep) | 2298 | new.add(dep) |
| 2328 | #logger.warning(" Down: " + dep) | ||
| 2329 | next = new | 2299 | next = new |
| 2330 | 2300 | ||
| 2331 | if task in self.sqdata.unskippable: | 2301 | notcovered = set(self.scenequeue_notcovered) |
| 2332 | self.scenequeue_process_unskippable(task) | 2302 | notcovered |= self.cantskip |
| 2333 | 2303 | for tid in self.scenequeue_notcovered: | |
| 2334 | if task in self.scenequeue_notcovered: | 2304 | notcovered |= self.sqdata.sq_covered_tasks[tid] |
| 2335 | logger.debug(1, 'Not skipping setscene task %s', task) | 2305 | notcovered |= self.sqdata.unskippable.difference(self.rqdata.runq_setscene_tids) |
| 2336 | self.scenequeue_process_notcovered(task) | 2306 | notcovered.intersection_update(self.tasks_scenequeue_done) |
| 2337 | elif task in self.scenequeue_covered: | 2307 | |
| 2338 | logger.debug(1, 'Queued setscene task %s', task) | 2308 | covered = set(self.scenequeue_covered) |
| 2339 | self.coveredtopocess.add(task) | 2309 | for tid in self.scenequeue_covered: |
| 2340 | 2310 | covered |= self.sqdata.sq_covered_tasks[tid] | |
| 2341 | for task in sorted(self.coveredtopocess.copy()): | 2311 | covered.difference_update(notcovered) |
| 2342 | if self.sqdata.sq_covered_tasks[task].issubset(self.tasks_scenequeue_done): | 2312 | covered.intersection_update(self.tasks_scenequeue_done) |
| 2343 | logger.debug(1, 'Processing setscene task %s', task) | 2313 | |
| 2344 | covered = self.sqdata.sq_covered_tasks[task] | 2314 | for tid in notcovered | covered: |
| 2345 | covered.add(task) | 2315 | if len(self.rqdata.runtaskentries[tid].depends) == 0: |
| 2346 | 2316 | self.setbuildable(tid) | |
| 2347 | # If a task is in target_tids and isn't a setscene task, we can't skip it. | 2317 | elif self.rqdata.runtaskentries[tid].depends.issubset(self.runq_complete): |
| 2348 | cantskip = covered.intersection(self.rqdata.target_tids).difference(self.rqdata.runq_setscene_tids) | 2318 | self.setbuildable(tid) |
| 2349 | for tid in sorted(cantskip): | 2319 | |
| 2350 | self.tasks_notcovered.add(tid) | 2320 | self.tasks_covered = covered |
| 2351 | self.scenequeue_process_notcovered(tid) | 2321 | self.tasks_notcovered = notcovered |
| 2352 | covered.difference_update(cantskip) | 2322 | |
| 2353 | |||
| 2354 | # Remove notcovered tasks | ||
| 2355 | covered.difference_update(self.tasks_notcovered) | ||
| 2356 | self.tasks_covered.update(covered) | ||
| 2357 | self.coveredtopocess.remove(task) | ||
| 2358 | for tid in sorted(covered): | ||
| 2359 | if self.rqdata.runtaskentries[tid].depends.issubset(self.runq_complete): | ||
| 2360 | self.setbuildable(tid) | ||
| 2361 | self.update_holdofftasks() | 2323 | self.update_holdofftasks() |
| 2362 | 2324 | ||
| 2363 | def sq_task_completeoutright(self, task): | 2325 | def sq_task_completeoutright(self, task): |
| @@ -2369,7 +2331,6 @@ class RunQueueExecute: | |||
| 2369 | 2331 | ||
| 2370 | logger.debug(1, 'Found task %s which could be accelerated', task) | 2332 | logger.debug(1, 'Found task %s which could be accelerated', task) |
| 2371 | self.scenequeue_covered.add(task) | 2333 | self.scenequeue_covered.add(task) |
| 2372 | self.tasks_covered.add(task) | ||
| 2373 | self.scenequeue_updatecounters(task) | 2334 | self.scenequeue_updatecounters(task) |
| 2374 | 2335 | ||
| 2375 | def sq_check_taskfail(self, task): | 2336 | def sq_check_taskfail(self, task): |
| @@ -2390,7 +2351,6 @@ class RunQueueExecute: | |||
| 2390 | self.sq_stats.taskFailed() | 2351 | self.sq_stats.taskFailed() |
| 2391 | bb.event.fire(sceneQueueTaskFailed(task, self.sq_stats, result, self), self.cfgData) | 2352 | bb.event.fire(sceneQueueTaskFailed(task, self.sq_stats, result, self), self.cfgData) |
| 2392 | self.scenequeue_notcovered.add(task) | 2353 | self.scenequeue_notcovered.add(task) |
| 2393 | self.tasks_notcovered.add(task) | ||
| 2394 | self.scenequeue_updatecounters(task, True) | 2354 | self.scenequeue_updatecounters(task, True) |
| 2395 | self.sq_check_taskfail(task) | 2355 | self.sq_check_taskfail(task) |
| 2396 | 2356 | ||
| @@ -2400,7 +2360,6 @@ class RunQueueExecute: | |||
| 2400 | self.sq_stats.taskSkipped() | 2360 | self.sq_stats.taskSkipped() |
| 2401 | self.sq_stats.taskCompleted() | 2361 | self.sq_stats.taskCompleted() |
| 2402 | self.scenequeue_notcovered.add(task) | 2362 | self.scenequeue_notcovered.add(task) |
| 2403 | self.tasks_notcovered.add(task) | ||
| 2404 | self.scenequeue_updatecounters(task, True) | 2363 | self.scenequeue_updatecounters(task, True) |
| 2405 | 2364 | ||
| 2406 | def sq_task_skip(self, task): | 2365 | def sq_task_skip(self, task): |
| @@ -2564,6 +2523,7 @@ def build_scenequeue_data(sqdata, rqdata, rq, cooker, stampcache, sqrq): | |||
| 2564 | for tid in rqdata.runtaskentries: | 2523 | for tid in rqdata.runtaskentries: |
| 2565 | if len(rqdata.runtaskentries[tid].revdeps) == 0: | 2524 | if len(rqdata.runtaskentries[tid].revdeps) == 0: |
| 2566 | sqdata.unskippable.add(tid) | 2525 | sqdata.unskippable.add(tid) |
| 2526 | sqdata.unskippable |= sqrq.cantskip | ||
| 2567 | while new: | 2527 | while new: |
| 2568 | new = False | 2528 | new = False |
| 2569 | orig = sqdata.unskippable.copy() | 2529 | orig = sqdata.unskippable.copy() |
| @@ -2572,14 +2532,13 @@ def build_scenequeue_data(sqdata, rqdata, rq, cooker, stampcache, sqrq): | |||
| 2572 | continue | 2532 | continue |
| 2573 | if len(rqdata.runtaskentries[tid].depends) == 0: | 2533 | if len(rqdata.runtaskentries[tid].depends) == 0: |
| 2574 | # These are tasks which have no setscene tasks in their chain, need to mark as directly buildable | 2534 | # These are tasks which have no setscene tasks in their chain, need to mark as directly buildable |
| 2575 | sqrq.tasks_notcovered.add(tid) | ||
| 2576 | sqrq.tasks_scenequeue_done.add(tid) | ||
| 2577 | sqrq.setbuildable(tid) | 2535 | sqrq.setbuildable(tid) |
| 2578 | sqrq.scenequeue_process_unskippable(tid) | ||
| 2579 | sqdata.unskippable |= rqdata.runtaskentries[tid].depends | 2536 | sqdata.unskippable |= rqdata.runtaskentries[tid].depends |
| 2580 | if sqdata.unskippable != orig: | 2537 | if sqdata.unskippable != orig: |
| 2581 | new = True | 2538 | new = True |
| 2582 | 2539 | ||
| 2540 | sqrq.tasks_scenequeue_done |= sqdata.unskippable.difference(rqdata.runq_setscene_tids) | ||
| 2541 | |||
| 2583 | rqdata.init_progress_reporter.next_stage(len(rqdata.runtaskentries)) | 2542 | rqdata.init_progress_reporter.next_stage(len(rqdata.runtaskentries)) |
| 2584 | 2543 | ||
| 2585 | # Sanity check all dependencies could be changed to setscene task references | 2544 | # Sanity check all dependencies could be changed to setscene task references |
