summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
authorChris Laplante <chris.laplante@agilent.com>2025-08-06 10:53:08 -0400
committerRichard Purdie <richard.purdie@linuxfoundation.org>2025-08-12 10:05:11 +0100
commit6083700993c70f89f6fe66f84c9ad373085a6b53 (patch)
tree73f4a50e5722003b362d1ea315b8eb9762388b67 /bitbake/lib
parentf4a8ddd6c80ff13cf5715d632e01fdc148e6b9e2 (diff)
downloadpoky-6083700993c70f89f6fe66f84c9ad373085a6b53.tar.gz
bitbake: runqueue: use enum to represent runQueue state to improve readability
(Bitbake rev: e61265570f5415d647666891d806836437330219) Signed-off-by: Chris Laplante <chris.laplante@agilent.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/bb/runqueue.py90
1 files changed, 46 insertions, 44 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index f37a0a7062..63d4edd892 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -10,6 +10,7 @@ Handles preparation and execution of a queue of tasks
10# 10#
11 11
12import copy 12import copy
13import enum
13import os 14import os
14import sys 15import sys
15import stat 16import stat
@@ -125,15 +126,16 @@ class RunQueueStats:
125 def updateActiveSetscene(self, active): 126 def updateActiveSetscene(self, active):
126 self.setscene_active = active 127 self.setscene_active = active
127 128
128# These values indicate the next step due to be run in the 129
129# runQueue state machine 130# Indicates the next step due to run in the runQueue state machine
130runQueuePrepare = 2 131class RunQueueState(enum.Enum):
131runQueueSceneInit = 3 132 PREPARE = 0
132runQueueDumpSigs = 4 133 SCENE_INIT = 1
133runQueueRunning = 6 134 DUMP_SIGS = 2
134runQueueFailed = 7 135 RUNNING = 3
135runQueueCleanUp = 8 136 FAILED = 4
136runQueueComplete = 9 137 CLEAN_UP = 5
138 COMPLETE = 6
137 139
138class RunQueueScheduler(object): 140class RunQueueScheduler(object):
139 """ 141 """
@@ -1337,13 +1339,13 @@ class RunQueue:
1337 self.hashvalidate = cfgData.getVar("BB_HASHCHECK_FUNCTION") or None 1339 self.hashvalidate = cfgData.getVar("BB_HASHCHECK_FUNCTION") or None
1338 self.depvalidate = cfgData.getVar("BB_SETSCENE_DEPVALID") or None 1340 self.depvalidate = cfgData.getVar("BB_SETSCENE_DEPVALID") or None
1339 1341
1340 self.state = runQueuePrepare 1342 self.state = RunQueueState.PREPARE
1341 1343
1342 # For disk space monitor 1344 # For disk space monitor
1343 # Invoked at regular time intervals via the bitbake heartbeat event 1345 # Invoked at regular time intervals via the bitbake heartbeat event
1344 # while the build is running. We generate a unique name for the handler 1346 # while the build is running. We generate a unique name for the handler
1345 # here, just in case that there ever is more than one RunQueue instance, 1347 # here, just in case that there ever is more than one RunQueue instance,
1346 # start the handler when reaching runQueueSceneInit, and stop it when 1348 # start the handler when reaching RunQueueState.SCENE_INIT, and stop it when
1347 # done with the build. 1349 # done with the build.
1348 self.dm = monitordisk.diskMonitor(cfgData) 1350 self.dm = monitordisk.diskMonitor(cfgData)
1349 self.dm_event_handler_name = '_bb_diskmonitor_' + str(id(self)) 1351 self.dm_event_handler_name = '_bb_diskmonitor_' + str(id(self))
@@ -1557,7 +1559,7 @@ class RunQueue:
1557 retval = True 1559 retval = True
1558 bb.event.check_for_interrupts() 1560 bb.event.check_for_interrupts()
1559 1561
1560 if self.state is runQueuePrepare: 1562 if self.state == RunQueueState.PREPARE:
1561 # NOTE: if you add, remove or significantly refactor the stages of this 1563 # NOTE: if you add, remove or significantly refactor the stages of this
1562 # process then you should recalculate the weightings here. This is quite 1564 # process then you should recalculate the weightings here. This is quite
1563 # easy to do - just change the next line temporarily to pass debug=True as 1565 # easy to do - just change the next line temporarily to pass debug=True as
@@ -1568,12 +1570,12 @@ class RunQueue:
1568 "Initialising tasks", 1570 "Initialising tasks",
1569 [43, 967, 4, 3, 1, 5, 3, 7, 13, 1, 2, 1, 1, 246, 35, 1, 38, 1, 35, 2, 338, 204, 142, 3, 3, 37, 244]) 1571 [43, 967, 4, 3, 1, 5, 3, 7, 13, 1, 2, 1, 1, 246, 35, 1, 38, 1, 35, 2, 338, 204, 142, 3, 3, 37, 244])
1570 if self.rqdata.prepare() == 0: 1572 if self.rqdata.prepare() == 0:
1571 self.state = runQueueComplete 1573 self.state = RunQueueState.COMPLETE
1572 else: 1574 else:
1573 self.state = runQueueSceneInit 1575 self.state = RunQueueState.SCENE_INIT
1574 bb.parse.siggen.save_unitaskhashes() 1576 bb.parse.siggen.save_unitaskhashes()
1575 1577
1576 if self.state is runQueueSceneInit: 1578 if self.state == RunQueueState.SCENE_INIT:
1577 self.rqdata.init_progress_reporter.next_stage() 1579 self.rqdata.init_progress_reporter.next_stage()
1578 1580
1579 # we are ready to run, emit dependency info to any UI or class which 1581 # we are ready to run, emit dependency info to any UI or class which
@@ -1584,7 +1586,7 @@ class RunQueue:
1584 1586
1585 if not self.dm_event_handler_registered: 1587 if not self.dm_event_handler_registered:
1586 res = bb.event.register(self.dm_event_handler_name, 1588 res = bb.event.register(self.dm_event_handler_name,
1587 lambda x, y: self.dm.check(self) if self.state in [runQueueRunning, runQueueCleanUp] else False, 1589 lambda x, y: self.dm.check(self) if self.state in [RunQueueState.RUNNING, RunQueueState.CLEAN_UP] else False,
1588 ('bb.event.HeartbeatEvent',), data=self.cfgData) 1590 ('bb.event.HeartbeatEvent',), data=self.cfgData)
1589 self.dm_event_handler_registered = True 1591 self.dm_event_handler_registered = True
1590 1592
@@ -1596,17 +1598,17 @@ class RunQueue:
1596 self.rqdata.init_progress_reporter.finish() 1598 self.rqdata.init_progress_reporter.finish()
1597 if 'printdiff' in dumpsigs: 1599 if 'printdiff' in dumpsigs:
1598 self.invalidtasks_dump = self.print_diffscenetasks() 1600 self.invalidtasks_dump = self.print_diffscenetasks()
1599 self.state = runQueueDumpSigs 1601 self.state = RunQueueState.DUMP_SIGS
1600 1602
1601 if self.state is runQueueDumpSigs: 1603 if self.state == RunQueueState.DUMP_SIGS:
1602 dumpsigs = self.cooker.configuration.dump_signatures 1604 dumpsigs = self.cooker.configuration.dump_signatures
1603 retval = self.dump_signatures(dumpsigs) 1605 retval = self.dump_signatures(dumpsigs)
1604 if retval is False: 1606 if retval is False:
1605 if 'printdiff' in dumpsigs: 1607 if 'printdiff' in dumpsigs:
1606 self.write_diffscenetasks(self.invalidtasks_dump) 1608 self.write_diffscenetasks(self.invalidtasks_dump)
1607 self.state = runQueueComplete 1609 self.state = RunQueueState.COMPLETE
1608 1610
1609 if self.state is runQueueSceneInit: 1611 if self.state == RunQueueState.SCENE_INIT:
1610 self.start_worker(self.rqexe) 1612 self.start_worker(self.rqexe)
1611 self.rqdata.init_progress_reporter.finish() 1613 self.rqdata.init_progress_reporter.finish()
1612 1614
@@ -1619,15 +1621,15 @@ class RunQueue:
1619 self.rqexe.tasks_notcovered.add(tid) 1621 self.rqexe.tasks_notcovered.add(tid)
1620 self.rqexe.sqdone = True 1622 self.rqexe.sqdone = True
1621 logger.info('Executing Tasks') 1623 logger.info('Executing Tasks')
1622 self.state = runQueueRunning 1624 self.state = RunQueueState.RUNNING
1623 1625
1624 if self.state is runQueueRunning: 1626 if self.state == RunQueueState.RUNNING:
1625 retval = self.rqexe.execute() 1627 retval = self.rqexe.execute()
1626 1628
1627 if self.state is runQueueCleanUp: 1629 if self.state == RunQueueState.CLEAN_UP:
1628 retval = self.rqexe.finish() 1630 retval = self.rqexe.finish()
1629 1631
1630 build_done = self.state is runQueueComplete or self.state is runQueueFailed 1632 build_done = self.state in [RunQueueState.COMPLETE, RunQueueState.FAILED]
1631 1633
1632 if build_done and self.dm_event_handler_registered: 1634 if build_done and self.dm_event_handler_registered:
1633 bb.event.remove(self.dm_event_handler_name, None, data=self.cfgData) 1635 bb.event.remove(self.dm_event_handler_name, None, data=self.cfgData)
@@ -1643,10 +1645,10 @@ class RunQueue:
1643 # Let's avoid the word "failed" if nothing actually did 1645 # Let's avoid the word "failed" if nothing actually did
1644 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) 1646 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)
1645 1647
1646 if self.state is runQueueFailed: 1648 if self.state == RunQueueState.FAILED:
1647 raise bb.runqueue.TaskFailure(self.rqexe.failed_tids) 1649 raise bb.runqueue.TaskFailure(self.rqexe.failed_tids)
1648 1650
1649 if self.state is runQueueComplete: 1651 if self.state == RunQueueState.COMPLETE:
1650 # All done 1652 # All done
1651 return False 1653 return False
1652 1654
@@ -1666,7 +1668,7 @@ class RunQueue:
1666 self.teardown_workers() 1668 self.teardown_workers()
1667 except: 1669 except:
1668 pass 1670 pass
1669 self.state = runQueueComplete 1671 self.state = RunQueueState.COMPLETE
1670 raise 1672 raise
1671 except Exception as err: 1673 except Exception as err:
1672 logger.exception("An uncaught exception occurred in runqueue") 1674 logger.exception("An uncaught exception occurred in runqueue")
@@ -1674,12 +1676,12 @@ class RunQueue:
1674 self.teardown_workers() 1676 self.teardown_workers()
1675 except: 1677 except:
1676 pass 1678 pass
1677 self.state = runQueueComplete 1679 self.state = RunQueueState.COMPLETE
1678 raise 1680 raise
1679 1681
1680 def finish_runqueue(self, now = False): 1682 def finish_runqueue(self, now = False):
1681 if not self.rqexe: 1683 if not self.rqexe:
1682 self.state = runQueueComplete 1684 self.state = RunQueueState.COMPLETE
1683 return 1685 return
1684 1686
1685 if now: 1687 if now:
@@ -2002,14 +2004,14 @@ class RunQueueExecute:
2002 pass 2004 pass
2003 2005
2004 if self.failed_tids: 2006 if self.failed_tids:
2005 self.rq.state = runQueueFailed 2007 self.rq.state = RunQueueState.FAILED
2006 return 2008 return
2007 2009
2008 self.rq.state = runQueueComplete 2010 self.rq.state = RunQueueState.COMPLETE
2009 return 2011 return
2010 2012
2011 def finish(self): 2013 def finish(self):
2012 self.rq.state = runQueueCleanUp 2014 self.rq.state = RunQueueState.CLEAN_UP
2013 2015
2014 active = self.stats.active + len(self.sq_live) 2016 active = self.stats.active + len(self.sq_live)
2015 if active > 0: 2017 if active > 0:
@@ -2018,10 +2020,10 @@ class RunQueueExecute:
2018 return self.rq.active_fds() 2020 return self.rq.active_fds()
2019 2021
2020 if self.failed_tids: 2022 if self.failed_tids:
2021 self.rq.state = runQueueFailed 2023 self.rq.state = RunQueueState.FAILED
2022 return True 2024 return True
2023 2025
2024 self.rq.state = runQueueComplete 2026 self.rq.state = RunQueueState.COMPLETE
2025 return True 2027 return True
2026 2028
2027 # Used by setscene only 2029 # Used by setscene only
@@ -2140,7 +2142,7 @@ class RunQueueExecute:
2140 bb.event.fire(runQueueTaskFailed(task, self.stats, exitcode, self.rq, fakeroot_log=("".join(fakeroot_log) or None)), self.cfgData) 2142 bb.event.fire(runQueueTaskFailed(task, self.stats, exitcode, self.rq, fakeroot_log=("".join(fakeroot_log) or None)), self.cfgData)
2141 2143
2142 if self.rqdata.taskData[''].halt: 2144 if self.rqdata.taskData[''].halt:
2143 self.rq.state = runQueueCleanUp 2145 self.rq.state = RunQueueState.CLEAN_UP
2144 2146
2145 def task_skip(self, task, reason): 2147 def task_skip(self, task, reason):
2146 self.runq_running.add(task) 2148 self.runq_running.add(task)
@@ -2334,17 +2336,17 @@ class RunQueueExecute:
2334 2336
2335 err = self.summarise_scenequeue_errors() 2337 err = self.summarise_scenequeue_errors()
2336 if err: 2338 if err:
2337 self.rq.state = runQueueFailed 2339 self.rq.state = RunQueueState.FAILED
2338 return True 2340 return True
2339 2341
2340 if self.cooker.configuration.setsceneonly: 2342 if self.cooker.configuration.setsceneonly:
2341 self.rq.state = runQueueComplete 2343 self.rq.state = RunQueueState.COMPLETE
2342 return True 2344 return True
2343 self.sqdone = True 2345 self.sqdone = True
2344 2346
2345 if self.stats.total == 0: 2347 if self.stats.total == 0:
2346 # nothing to do 2348 # nothing to do
2347 self.rq.state = runQueueComplete 2349 self.rq.state = RunQueueState.COMPLETE
2348 return True 2350 return True
2349 2351
2350 if self.cooker.configuration.setsceneonly: 2352 if self.cooker.configuration.setsceneonly:
@@ -2411,7 +2413,7 @@ class RunQueueExecute:
2411 self.rq.start_fakeworker(self, mc) 2413 self.rq.start_fakeworker(self, mc)
2412 except OSError as exc: 2414 except OSError as exc:
2413 logger.critical("Failed to spawn fakeroot worker to run %s: %s" % (task, str(exc))) 2415 logger.critical("Failed to spawn fakeroot worker to run %s: %s" % (task, str(exc)))
2414 self.rq.state = runQueueFailed 2416 self.rq.state = RunQueueState.FAILED
2415 self.stats.taskFailed() 2417 self.stats.taskFailed()
2416 return True 2418 return True
2417 RunQueue.send_pickled_data(self.rq.fakeworker[mc].process, runtask, "runtask") 2419 RunQueue.send_pickled_data(self.rq.fakeworker[mc].process, runtask, "runtask")
@@ -2439,7 +2441,7 @@ class RunQueueExecute:
2439 return True 2441 return True
2440 2442
2441 if self.failed_tids: 2443 if self.failed_tids:
2442 self.rq.state = runQueueFailed 2444 self.rq.state = RunQueueState.FAILED
2443 return True 2445 return True
2444 2446
2445 # Sanity Checks 2447 # Sanity Checks
@@ -2456,9 +2458,9 @@ class RunQueueExecute:
2456 err = True 2458 err = True
2457 2459
2458 if err: 2460 if err:
2459 self.rq.state = runQueueFailed 2461 self.rq.state = RunQueueState.FAILED
2460 else: 2462 else:
2461 self.rq.state = runQueueComplete 2463 self.rq.state = RunQueueState.COMPLETE
2462 2464
2463 return True 2465 return True
2464 2466
@@ -2688,7 +2690,7 @@ class RunQueueExecute:
2688 if dep in self.runq_complete and dep not in self.runq_tasksrun: 2690 if dep in self.runq_complete and dep not in self.runq_tasksrun:
2689 bb.error("Task %s marked as completed but now needing to rerun? Halting build." % dep) 2691 bb.error("Task %s marked as completed but now needing to rerun? Halting build." % dep)
2690 self.failed_tids.append(tid) 2692 self.failed_tids.append(tid)
2691 self.rq.state = runQueueCleanUp 2693 self.rq.state = RunQueueState.CLEAN_UP
2692 return 2694 return
2693 2695
2694 if dep not in self.runq_complete: 2696 if dep not in self.runq_complete:
@@ -2823,7 +2825,7 @@ class RunQueueExecute:
2823 pn = self.rqdata.dataCaches[mc].pkg_fn[taskfn] 2825 pn = self.rqdata.dataCaches[mc].pkg_fn[taskfn]
2824 if not check_setscene_enforce_ignore_tasks(pn, taskname, self.rqdata.setscene_ignore_tasks): 2826 if not check_setscene_enforce_ignore_tasks(pn, taskname, self.rqdata.setscene_ignore_tasks):
2825 logger.error('Task %s.%s failed' % (pn, taskname + "_setscene")) 2827 logger.error('Task %s.%s failed' % (pn, taskname + "_setscene"))
2826 self.rq.state = runQueueCleanUp 2828 self.rq.state = RunQueueState.CLEAN_UP
2827 2829
2828 def sq_task_complete(self, task): 2830 def sq_task_complete(self, task):
2829 bb.event.fire(sceneQueueTaskCompleted(task, self.stats, self.rq), self.cfgData) 2831 bb.event.fire(sceneQueueTaskCompleted(task, self.stats, self.rq), self.cfgData)