diff options
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 99 |
1 files changed, 43 insertions, 56 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index c6f45a345f..517684c3ff 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -1407,7 +1407,6 @@ class RunQueue: | |||
| 1407 | retval = True | 1407 | retval = True |
| 1408 | 1408 | ||
| 1409 | if self.state is runQueuePrepare: | 1409 | if self.state is runQueuePrepare: |
| 1410 | self.rqexe = RunQueueExecuteDummy(self) | ||
| 1411 | # NOTE: if you add, remove or significantly refactor the stages of this | 1410 | # NOTE: if you add, remove or significantly refactor the stages of this |
| 1412 | # process then you should recalculate the weightings here. This is quite | 1411 | # process then you should recalculate the weightings here. This is quite |
| 1413 | # easy to do - just change the next line temporarily to pass debug=True as | 1412 | # easy to do - just change the next line temporarily to pass debug=True as |
| @@ -1449,7 +1448,9 @@ class RunQueue: | |||
| 1449 | self.rqdata.init_progress_reporter.next_stage() | 1448 | self.rqdata.init_progress_reporter.next_stage() |
| 1450 | self.start_worker() | 1449 | self.start_worker() |
| 1451 | self.rqdata.init_progress_reporter.next_stage() | 1450 | self.rqdata.init_progress_reporter.next_stage() |
| 1452 | self.rqexe = RunQueueExecuteScenequeue(self) | 1451 | if not self.rqexe: |
| 1452 | self.rqexe = RunQueueExecute(self) | ||
| 1453 | start_scenequeue_tasks(self.rqexe) | ||
| 1453 | 1454 | ||
| 1454 | if self.state is runQueueSceneRun: | 1455 | if self.state is runQueueSceneRun: |
| 1455 | retval = self.rqexe.sq_execute() | 1456 | retval = self.rqexe.sq_execute() |
| @@ -1461,7 +1462,9 @@ class RunQueue: | |||
| 1461 | # Just in case we didn't setscene | 1462 | # Just in case we didn't setscene |
| 1462 | self.rqdata.init_progress_reporter.finish() | 1463 | self.rqdata.init_progress_reporter.finish() |
| 1463 | logger.info("Executing RunQueue Tasks") | 1464 | logger.info("Executing RunQueue Tasks") |
| 1464 | self.rqexe = RunQueueExecuteTasks(self) | 1465 | if not self.rqexe: |
| 1466 | self.rqexe = RunQueueExecute(self) | ||
| 1467 | start_runqueue_tasks(self.rqexe) | ||
| 1465 | self.state = runQueueRunning | 1468 | self.state = runQueueRunning |
| 1466 | 1469 | ||
| 1467 | if self.state is runQueueRunning: | 1470 | if self.state is runQueueRunning: |
| @@ -1478,11 +1481,12 @@ class RunQueue: | |||
| 1478 | 1481 | ||
| 1479 | if build_done and self.rqexe: | 1482 | if build_done and self.rqexe: |
| 1480 | self.teardown_workers() | 1483 | self.teardown_workers() |
| 1481 | if self.rqexe.stats.failed: | 1484 | if self.rqexe: |
| 1482 | logger.info("Tasks Summary: Attempted %d tasks of which %d didn't need to be rerun and %d failed.", self.rqexe.stats.completed + self.rqexe.stats.failed, self.rqexe.stats.skipped, self.rqexe.stats.failed) | 1485 | if self.rqexe.stats.failed: |
| 1483 | else: | 1486 | logger.info("Tasks Summary: Attempted %d tasks of which %d didn't need to be rerun and %d failed.", self.rqexe.stats.completed + self.rqexe.stats.failed, self.rqexe.stats.skipped, self.rqexe.stats.failed) |
| 1484 | # Let's avoid the word "failed" if nothing actually did | 1487 | else: |
| 1485 | logger.info("Tasks Summary: Attempted %d tasks of which %d didn't need to be rerun and all succeeded.", self.rqexe.stats.completed, self.rqexe.stats.skipped) | 1488 | # Let's avoid the word "failed" if nothing actually did |
| 1489 | logger.info("Tasks Summary: Attempted %d tasks of which %d didn't need to be rerun and all succeeded.", self.rqexe.stats.completed, self.rqexe.stats.skipped) | ||
| 1486 | 1490 | ||
| 1487 | if self.state is runQueueFailed: | 1491 | if self.state is runQueueFailed: |
| 1488 | raise bb.runqueue.TaskFailure(self.rqexe.failed_tids) | 1492 | raise bb.runqueue.TaskFailure(self.rqexe.failed_tids) |
| @@ -2483,88 +2487,71 @@ def build_scenequeue_data(sqdata, rqdata, rq, cooker, stampcache, sqrq): | |||
| 2483 | logger.debug(2, 'No package found, so skipping setscene task %s', tid) | 2487 | logger.debug(2, 'No package found, so skipping setscene task %s', tid) |
| 2484 | sqdata.outrightfail.append(tid) | 2488 | sqdata.outrightfail.append(tid) |
| 2485 | 2489 | ||
| 2486 | 2490 | def start_runqueue_tasks(rqexec): | |
| 2487 | class RunQueueExecuteDummy(RunQueueExecute): | ||
| 2488 | def __init__(self, rq): | ||
| 2489 | self.rq = rq | ||
| 2490 | self.stats = RunQueueStats(0) | ||
| 2491 | |||
| 2492 | def finish(self): | ||
| 2493 | self.rq.state = runQueueComplete | ||
| 2494 | return | ||
| 2495 | |||
| 2496 | class RunQueueExecuteTasks(RunQueueExecute): | ||
| 2497 | def __init__(self, rq): | ||
| 2498 | RunQueueExecute.__init__(self, rq) | ||
| 2499 | |||
| 2500 | self.stampcache = {} | ||
| 2501 | 2491 | ||
| 2502 | # Mark initial buildable tasks | 2492 | # Mark initial buildable tasks |
| 2503 | for tid in self.rqdata.runtaskentries: | 2493 | for tid in rqexec.rqdata.runtaskentries: |
| 2504 | if len(self.rqdata.runtaskentries[tid].depends) == 0: | 2494 | if len(rqexec.rqdata.runtaskentries[tid].depends) == 0: |
| 2505 | self.runq_buildable.add(tid) | 2495 | rqexec.runq_buildable.add(tid) |
| 2506 | if len(self.rqdata.runtaskentries[tid].revdeps) > 0 and self.rqdata.runtaskentries[tid].revdeps.issubset(self.rq.scenequeue_covered): | 2496 | if len(rqexec.rqdata.runtaskentries[tid].revdeps) > 0 and rqexec.rqdata.runtaskentries[tid].revdeps.issubset(rqexec.rq.scenequeue_covered): |
| 2507 | self.rq.scenequeue_covered.add(tid) | 2497 | rqexec.rq.scenequeue_covered.add(tid) |
| 2508 | 2498 | ||
| 2509 | found = True | 2499 | found = True |
| 2510 | while found: | 2500 | while found: |
| 2511 | found = False | 2501 | found = False |
| 2512 | for tid in self.rqdata.runtaskentries: | 2502 | for tid in rqexec.rqdata.runtaskentries: |
| 2513 | if tid in self.rq.scenequeue_covered: | 2503 | if tid in rqexec.rq.scenequeue_covered: |
| 2514 | continue | 2504 | continue |
| 2515 | logger.debug(1, 'Considering %s: %s' % (tid, str(self.rqdata.runtaskentries[tid].revdeps))) | 2505 | logger.debug(1, 'Considering %s: %s' % (tid, str(rqexec.rqdata.runtaskentries[tid].revdeps))) |
| 2516 | 2506 | ||
| 2517 | if len(self.rqdata.runtaskentries[tid].revdeps) > 0 and self.rqdata.runtaskentries[tid].revdeps.issubset(self.rq.scenequeue_covered): | 2507 | if len(rqexec.rqdata.runtaskentries[tid].revdeps) > 0 and rqexec.rqdata.runtaskentries[tid].revdeps.issubset(rqexec.rq.scenequeue_covered): |
| 2518 | if tid in self.rq.scenequeue_notcovered: | 2508 | if tid in rqexec.rq.scenequeue_notcovered: |
| 2519 | continue | 2509 | continue |
| 2520 | found = True | 2510 | found = True |
| 2521 | self.rq.scenequeue_covered.add(tid) | 2511 | rqexec.rq.scenequeue_covered.add(tid) |
| 2522 | 2512 | ||
| 2523 | logger.debug(1, 'Skip list %s', sorted(self.rq.scenequeue_covered)) | 2513 | logger.debug(1, 'Skip list %s', sorted(rqexec.rq.scenequeue_covered)) |
| 2524 | 2514 | ||
| 2525 | for task in self.rq.scenequeue_notcovered: | 2515 | for task in self.rq.scenequeue_notcovered: |
| 2526 | logger.debug(1, 'Not skipping task %s', task) | 2516 | logger.debug(1, 'Not skipping task %s', task) |
| 2527 | 2517 | ||
| 2528 | for mc in self.rqdata.dataCaches: | 2518 | for mc in rqexec.rqdata.dataCaches: |
| 2529 | target_pairs = [] | 2519 | target_pairs = [] |
| 2530 | for tid in self.rqdata.target_tids: | 2520 | for tid in rqexec.rqdata.target_tids: |
| 2531 | (tidmc, fn, taskname, _) = split_tid_mcfn(tid) | 2521 | (tidmc, fn, taskname, _) = split_tid_mcfn(tid) |
| 2532 | if tidmc == mc: | 2522 | if tidmc == mc: |
| 2533 | target_pairs.append((fn, taskname)) | 2523 | target_pairs.append((fn, taskname)) |
| 2534 | 2524 | ||
| 2535 | event.fire(bb.event.StampUpdate(target_pairs, self.rqdata.dataCaches[mc].stamp), self.cfgData) | 2525 | event.fire(bb.event.StampUpdate(target_pairs, rqexec.rqdata.dataCaches[mc].stamp), rqexec.cfgData) |
| 2536 | 2526 | ||
| 2537 | schedulers = self.get_schedulers() | 2527 | schedulers = rqexec.get_schedulers() |
| 2538 | for scheduler in schedulers: | 2528 | for scheduler in schedulers: |
| 2539 | if self.scheduler == scheduler.name: | 2529 | if rqexec.scheduler == scheduler.name: |
| 2540 | self.sched = scheduler(self, self.rqdata) | 2530 | rqexec.sched = scheduler(rqexec, rqexec.rqdata) |
| 2541 | logger.debug(1, "Using runqueue scheduler '%s'", scheduler.name) | 2531 | logger.debug(1, "Using runqueue scheduler '%s'", scheduler.name) |
| 2542 | break | 2532 | break |
| 2543 | else: | 2533 | else: |
| 2544 | bb.fatal("Invalid scheduler '%s'. Available schedulers: %s" % | 2534 | bb.fatal("Invalid scheduler '%s'. Available schedulers: %s" % |
| 2545 | (self.scheduler, ", ".join(obj.name for obj in schedulers))) | 2535 | (rqexec.scheduler, ", ".join(obj.name for obj in schedulers))) |
| 2546 | |||
| 2547 | class RunQueueExecuteScenequeue(RunQueueExecute): | ||
| 2548 | def __init__(self, rq): | ||
| 2549 | RunQueueExecute.__init__(self, rq) | ||
| 2550 | 2536 | ||
| 2551 | self.scenequeue_covered = set() | 2537 | def start_scenequeue_tasks(rqexec): |
| 2552 | self.scenequeue_notcovered = set() | 2538 | rqexec.scenequeue_covered = set() |
| 2553 | self.scenequeue_notneeded = set() | 2539 | rqexec.scenequeue_notcovered = set() |
| 2540 | rqexec.scenequeue_notneeded = set() | ||
| 2554 | 2541 | ||
| 2555 | # If we don't have any setscene functions, skip this step | 2542 | # If we don't have any setscene functions, skip this step |
| 2556 | if len(self.rqdata.runq_setscene_tids) == 0: | 2543 | if len(rqexec.rqdata.runq_setscene_tids) == 0: |
| 2557 | rq.scenequeue_covered = set() | 2544 | rqexec.rq.scenequeue_covered = set() |
| 2558 | rq.scenequeue_notcovered = set() | 2545 | rqexec.rq.scenequeue_notcovered = set() |
| 2559 | rq.state = runQueueRunInit | 2546 | rqexec.rq.state = runQueueRunInit |
| 2560 | return | 2547 | return |
| 2561 | 2548 | ||
| 2562 | self.sqdata = SQData() | 2549 | rqexec.sqdata = SQData() |
| 2563 | build_scenequeue_data(self.sqdata, self.rqdata, self.rq, self.cooker, self.stampcache, self) | 2550 | build_scenequeue_data(rqexec.sqdata, rqexec.rqdata, rqexec.rq, rqexec.cooker, rqexec.stampcache, rqexec) |
| 2564 | 2551 | ||
| 2565 | logger.info('Executing SetScene Tasks') | 2552 | logger.info('Executing SetScene Tasks') |
| 2566 | 2553 | ||
| 2567 | self.rq.state = runQueueSceneRun | 2554 | rqexec.rq.state = runQueueSceneRun |
| 2568 | 2555 | ||
| 2569 | class TaskFailure(Exception): | 2556 | class TaskFailure(Exception): |
| 2570 | """ | 2557 | """ |
