diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-06-12 23:55:08 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-06-15 08:35:07 +0100 |
commit | 29b4fb17966bfaec74b41cce533725c04ec1078f (patch) | |
tree | 4a10c618d264af930d0d8dd9b42e434d8e0d16c8 /bitbake/lib/bb | |
parent | 7e54da0581faaafa9bfb13680ad6618c4c8f9831 (diff) | |
download | poky-29b4fb17966bfaec74b41cce533725c04ec1078f.tar.gz |
bitbake: runqueue: Change buildable/running lists to sets
Using positions in lists for flags is an odd choice and makes the code
hard to maintain. Maintaining a list is slow since list searches are
slow (watch bitbake -n slow massively with it) but we can use a set()
instead.
This patch uses python sets to maintain the lists of tasks in each state
and this prepares for changing the task IDs from being integers.
(Bitbake rev: 8c1ed57f6ea475b714eca6673b48e8e5f5f0f9c3)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb')
-rw-r--r-- | bitbake/lib/bb/runqueue.py | 63 |
1 files changed, 27 insertions, 36 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 376c9f51e8..de618ff1d8 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
@@ -108,7 +108,7 @@ class RunQueueScheduler(object): | |||
108 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[taskid]] | 108 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[taskid]] |
109 | taskname = self.rqdata.runq_task[taskid] | 109 | taskname = self.rqdata.runq_task[taskid] |
110 | self.stamps[taskid] = bb.build.stampfile(taskname, self.rqdata.dataCache, fn) | 110 | self.stamps[taskid] = bb.build.stampfile(taskname, self.rqdata.dataCache, fn) |
111 | if self.rq.runq_buildable[taskid] == 1: | 111 | if taskid in self.rq.runq_buildable: |
112 | self.buildable.append(taskid) | 112 | self.buildable.append(taskid) |
113 | 113 | ||
114 | self.rev_prio_map = None | 114 | self.rev_prio_map = None |
@@ -117,7 +117,7 @@ class RunQueueScheduler(object): | |||
117 | """ | 117 | """ |
118 | Return the id of the first task we find that is buildable | 118 | Return the id of the first task we find that is buildable |
119 | """ | 119 | """ |
120 | self.buildable = [x for x in self.buildable if not self.rq.runq_running[x] == 1] | 120 | self.buildable = [x for x in self.buildable if x not in self.rq.runq_running] |
121 | if not self.buildable: | 121 | if not self.buildable: |
122 | return None | 122 | return None |
123 | if len(self.buildable) == 1: | 123 | if len(self.buildable) == 1: |
@@ -1361,9 +1361,9 @@ class RunQueueExecute: | |||
1361 | self.number_tasks = int(self.cfgData.getVar("BB_NUMBER_THREADS", True) or 1) | 1361 | self.number_tasks = int(self.cfgData.getVar("BB_NUMBER_THREADS", True) or 1) |
1362 | self.scheduler = self.cfgData.getVar("BB_SCHEDULER", True) or "speed" | 1362 | self.scheduler = self.cfgData.getVar("BB_SCHEDULER", True) or "speed" |
1363 | 1363 | ||
1364 | self.runq_buildable = [] | 1364 | self.runq_buildable = set() |
1365 | self.runq_running = [] | 1365 | self.runq_running = set() |
1366 | self.runq_complete = [] | 1366 | self.runq_complete = set() |
1367 | 1367 | ||
1368 | self.build_stamps = {} | 1368 | self.build_stamps = {} |
1369 | self.build_stamps2 = [] | 1369 | self.build_stamps2 = [] |
@@ -1464,12 +1464,8 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
1464 | 1464 | ||
1465 | # Mark initial buildable tasks | 1465 | # Mark initial buildable tasks |
1466 | for task in range(self.stats.total): | 1466 | for task in range(self.stats.total): |
1467 | self.runq_running.append(0) | ||
1468 | self.runq_complete.append(0) | ||
1469 | if len(self.rqdata.runq_depends[task]) == 0: | 1467 | if len(self.rqdata.runq_depends[task]) == 0: |
1470 | self.runq_buildable.append(1) | 1468 | self.runq_buildable.add(task) |
1471 | else: | ||
1472 | self.runq_buildable.append(0) | ||
1473 | if len(self.rqdata.runq_revdeps[task]) > 0 and self.rqdata.runq_revdeps[task].issubset(self.rq.scenequeue_covered): | 1469 | if len(self.rqdata.runq_revdeps[task]) > 0 and self.rqdata.runq_revdeps[task].issubset(self.rq.scenequeue_covered): |
1474 | self.rq.scenequeue_covered.add(task) | 1470 | self.rq.scenequeue_covered.add(task) |
1475 | 1471 | ||
@@ -1574,7 +1570,7 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
1574 | return schedulers | 1570 | return schedulers |
1575 | 1571 | ||
1576 | def setbuildable(self, task): | 1572 | def setbuildable(self, task): |
1577 | self.runq_buildable[task] = 1 | 1573 | self.runq_buildable.add(task) |
1578 | self.sched.newbuilable(task) | 1574 | self.sched.newbuilable(task) |
1579 | 1575 | ||
1580 | def task_completeoutright(self, task): | 1576 | def task_completeoutright(self, task): |
@@ -1583,15 +1579,15 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
1583 | Look at the reverse dependencies and mark any task with | 1579 | Look at the reverse dependencies and mark any task with |
1584 | completed dependencies as buildable | 1580 | completed dependencies as buildable |
1585 | """ | 1581 | """ |
1586 | self.runq_complete[task] = 1 | 1582 | self.runq_complete.add(task) |
1587 | for revdep in self.rqdata.runq_revdeps[task]: | 1583 | for revdep in self.rqdata.runq_revdeps[task]: |
1588 | if self.runq_running[revdep] == 1: | 1584 | if revdep in self.runq_running: |
1589 | continue | 1585 | continue |
1590 | if self.runq_buildable[revdep] == 1: | 1586 | if revdep in self.runq_buildable: |
1591 | continue | 1587 | continue |
1592 | alldeps = 1 | 1588 | alldeps = 1 |
1593 | for dep in self.rqdata.runq_depends[revdep]: | 1589 | for dep in self.rqdata.runq_depends[revdep]: |
1594 | if self.runq_complete[dep] != 1: | 1590 | if dep not in self.runq_complete: |
1595 | alldeps = 0 | 1591 | alldeps = 0 |
1596 | if alldeps == 1: | 1592 | if alldeps == 1: |
1597 | self.setbuildable(revdep) | 1593 | self.setbuildable(revdep) |
@@ -1617,7 +1613,7 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
1617 | self.rq.state = runQueueCleanUp | 1613 | self.rq.state = runQueueCleanUp |
1618 | 1614 | ||
1619 | def task_skip(self, task, reason): | 1615 | def task_skip(self, task, reason): |
1620 | self.runq_running[task] = 1 | 1616 | self.runq_running.add(task) |
1621 | self.setbuildable(task) | 1617 | self.setbuildable(task) |
1622 | bb.event.fire(runQueueTaskSkipped(task, self.stats, self.rq, reason), self.cfgData) | 1618 | bb.event.fire(runQueueTaskSkipped(task, self.stats, self.rq, reason), self.cfgData) |
1623 | self.task_completeoutright(task) | 1619 | self.task_completeoutright(task) |
@@ -1658,7 +1654,7 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
1658 | startevent = runQueueTaskStarted(task, self.stats, self.rq, | 1654 | startevent = runQueueTaskStarted(task, self.stats, self.rq, |
1659 | noexec=True) | 1655 | noexec=True) |
1660 | bb.event.fire(startevent, self.cfgData) | 1656 | bb.event.fire(startevent, self.cfgData) |
1661 | self.runq_running[task] = 1 | 1657 | self.runq_running.add(task) |
1662 | self.stats.taskActive() | 1658 | self.stats.taskActive() |
1663 | if not self.cooker.configuration.dry_run: | 1659 | if not self.cooker.configuration.dry_run: |
1664 | bb.build.make_stamp(taskname, self.rqdata.dataCache, fn) | 1660 | bb.build.make_stamp(taskname, self.rqdata.dataCache, fn) |
@@ -1687,7 +1683,7 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
1687 | 1683 | ||
1688 | self.build_stamps[task] = bb.build.stampfile(taskname, self.rqdata.dataCache, fn) | 1684 | self.build_stamps[task] = bb.build.stampfile(taskname, self.rqdata.dataCache, fn) |
1689 | self.build_stamps2.append(self.build_stamps[task]) | 1685 | self.build_stamps2.append(self.build_stamps[task]) |
1690 | self.runq_running[task] = 1 | 1686 | self.runq_running.add(task) |
1691 | self.stats.taskActive() | 1687 | self.stats.taskActive() |
1692 | if self.stats.active < self.number_tasks: | 1688 | if self.stats.active < self.number_tasks: |
1693 | return True | 1689 | return True |
@@ -1702,11 +1698,11 @@ class RunQueueExecuteTasks(RunQueueExecute): | |||
1702 | 1698 | ||
1703 | # Sanity Checks | 1699 | # Sanity Checks |
1704 | for task in range(self.stats.total): | 1700 | for task in range(self.stats.total): |
1705 | if self.runq_buildable[task] == 0: | 1701 | if task not in self.runq_buildable: |
1706 | logger.error("Task %s never buildable!", task) | 1702 | logger.error("Task %s never buildable!", task) |
1707 | if self.runq_running[task] == 0: | 1703 | if task not in self.runq_running: |
1708 | logger.error("Task %s never ran!", task) | 1704 | logger.error("Task %s never ran!", task) |
1709 | if self.runq_complete[task] == 0: | 1705 | if task not in self.runq_complete: |
1710 | logger.error("Task %s never completed!", task) | 1706 | logger.error("Task %s never completed!", task) |
1711 | self.rq.state = runQueueComplete | 1707 | self.rq.state = runQueueComplete |
1712 | 1708 | ||
@@ -1759,11 +1755,6 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
1759 | # therefore aims to collapse the huge runqueue dependency tree into a smaller one | 1755 | # therefore aims to collapse the huge runqueue dependency tree into a smaller one |
1760 | # only containing the setscene functions. | 1756 | # only containing the setscene functions. |
1761 | 1757 | ||
1762 | for task in range(self.stats.total): | ||
1763 | self.runq_running.append(0) | ||
1764 | self.runq_complete.append(0) | ||
1765 | self.runq_buildable.append(0) | ||
1766 | |||
1767 | # First process the chains up to the first setscene task. | 1758 | # First process the chains up to the first setscene task. |
1768 | endpoints = {} | 1759 | endpoints = {} |
1769 | for task in range(len(self.rqdata.runq_fnid)): | 1760 | for task in range(len(self.rqdata.runq_fnid)): |
@@ -1894,7 +1885,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
1894 | 1885 | ||
1895 | for task in range(len(self.sq_revdeps)): | 1886 | for task in range(len(self.sq_revdeps)): |
1896 | if len(self.sq_revdeps[task]) == 0: | 1887 | if len(self.sq_revdeps[task]) == 0: |
1897 | self.runq_buildable[task] = 1 | 1888 | self.runq_buildable.add(task) |
1898 | 1889 | ||
1899 | self.outrightfail = [] | 1890 | self.outrightfail = [] |
1900 | if self.rq.hashvalidate: | 1891 | if self.rq.hashvalidate: |
@@ -1966,7 +1957,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
1966 | continue | 1957 | continue |
1967 | self.sq_revdeps2[dep].remove(task) | 1958 | self.sq_revdeps2[dep].remove(task) |
1968 | if len(self.sq_revdeps2[dep]) == 0: | 1959 | if len(self.sq_revdeps2[dep]) == 0: |
1969 | self.runq_buildable[dep] = 1 | 1960 | self.runq_buildable.add(dep) |
1970 | 1961 | ||
1971 | def task_completeoutright(self, task): | 1962 | def task_completeoutright(self, task): |
1972 | """ | 1963 | """ |
@@ -1994,8 +1985,8 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
1994 | self.scenequeue_updatecounters(task, True) | 1985 | self.scenequeue_updatecounters(task, True) |
1995 | 1986 | ||
1996 | def task_failoutright(self, task): | 1987 | def task_failoutright(self, task): |
1997 | self.runq_running[task] = 1 | 1988 | self.runq_running.add(task) |
1998 | self.runq_buildable[task] = 1 | 1989 | self.runq_buildable.add(task) |
1999 | self.stats.taskCompleted() | 1990 | self.stats.taskCompleted() |
2000 | self.stats.taskSkipped() | 1991 | self.stats.taskSkipped() |
2001 | index = self.rqdata.runq_setscene[task] | 1992 | index = self.rqdata.runq_setscene[task] |
@@ -2003,8 +1994,8 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
2003 | self.scenequeue_updatecounters(task, True) | 1994 | self.scenequeue_updatecounters(task, True) |
2004 | 1995 | ||
2005 | def task_skip(self, task): | 1996 | def task_skip(self, task): |
2006 | self.runq_running[task] = 1 | 1997 | self.runq_running.add(task) |
2007 | self.runq_buildable[task] = 1 | 1998 | self.runq_buildable.add(task) |
2008 | self.task_completeoutright(task) | 1999 | self.task_completeoutright(task) |
2009 | self.stats.taskCompleted() | 2000 | self.stats.taskCompleted() |
2010 | self.stats.taskSkipped() | 2001 | self.stats.taskSkipped() |
@@ -2020,7 +2011,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
2020 | if self.stats.active < self.number_tasks: | 2011 | if self.stats.active < self.number_tasks: |
2021 | # Find the next setscene to run | 2012 | # Find the next setscene to run |
2022 | for nexttask in range(self.stats.total): | 2013 | for nexttask in range(self.stats.total): |
2023 | if self.runq_buildable[nexttask] == 1 and self.runq_running[nexttask] != 1: | 2014 | if nexttask in self.runq_buildable and nexttask not in self.runq_running: |
2024 | if nexttask in self.unskippable: | 2015 | if nexttask in self.unskippable: |
2025 | logger.debug(2, "Setscene task %s is unskippable" % self.rqdata.get_user_idstring(self.rqdata.runq_setscene[nexttask])) | 2016 | logger.debug(2, "Setscene task %s is unskippable" % self.rqdata.get_user_idstring(self.rqdata.runq_setscene[nexttask])) |
2026 | if nexttask not in self.unskippable and len(self.sq_revdeps[nexttask]) > 0 and self.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and self.check_dependencies(nexttask, self.sq_revdeps[nexttask], True): | 2017 | if nexttask not in self.unskippable and len(self.sq_revdeps[nexttask]) > 0 and self.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and self.check_dependencies(nexttask, self.sq_revdeps[nexttask], True): |
@@ -2077,7 +2068,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
2077 | self.rq.worker.stdin.write(b"<runtask>" + pickle.dumps((fn, realtask, taskname, True, self.cooker.collection.get_file_appends(fn), None)) + b"</runtask>") | 2068 | self.rq.worker.stdin.write(b"<runtask>" + pickle.dumps((fn, realtask, taskname, True, self.cooker.collection.get_file_appends(fn), None)) + b"</runtask>") |
2078 | self.rq.worker.stdin.flush() | 2069 | self.rq.worker.stdin.flush() |
2079 | 2070 | ||
2080 | self.runq_running[task] = 1 | 2071 | self.runq_running.add(task) |
2081 | self.stats.taskActive() | 2072 | self.stats.taskActive() |
2082 | if self.stats.active < self.number_tasks: | 2073 | if self.stats.active < self.number_tasks: |
2083 | return True | 2074 | return True |
@@ -2087,8 +2078,8 @@ class RunQueueExecuteScenequeue(RunQueueExecute): | |||
2087 | return self.rq.active_fds() | 2078 | return self.rq.active_fds() |
2088 | 2079 | ||
2089 | #for task in range(self.stats.total): | 2080 | #for task in range(self.stats.total): |
2090 | # if self.runq_running[task] != 1: | 2081 | # if task not in self.runq_running: |
2091 | # buildable = self.runq_buildable[task] | 2082 | # buildable = task in self.runq_buildable |
2092 | # revdeps = self.sq_revdeps[task] | 2083 | # revdeps = self.sq_revdeps[task] |
2093 | # bb.warn("Found we didn't run %s %s %s %s" % (task, buildable, str(revdeps), self.rqdata.get_user_idstring(self.rqdata.runq_setscene[task]))) | 2084 | # bb.warn("Found we didn't run %s %s %s %s" % (task, buildable, str(revdeps), self.rqdata.get_user_idstring(self.rqdata.runq_setscene[task]))) |
2094 | 2085 | ||