[bitbake-devel] [PATCH 16/26] runqueue: Simplify scenequeue unskippable calculation
Richard Purdie
richard.purdie at linuxfoundation.org
Wed Jul 10 23:54:10 UTC 2019
The existing code to compute the 'unskippable' setscene task list is overcomlicated,
so replace it with something functionally equivalent but simpler and more efficient.
We don't need to process all chains, just the 'top' ones to the first setscene tasks.
This also makes the code more readable.
Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
---
lib/bb/runqueue.py | 45 +++++++++++++--------------------------------
1 file changed, 13 insertions(+), 32 deletions(-)
diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py
index 1d7706a219..1f41340170 100644
--- a/lib/bb/runqueue.py
+++ b/lib/bb/runqueue.py
@@ -2271,7 +2271,7 @@ class SQData(object):
def __init__(self):
self.sq_harddeps = {}
self.stamps = {}
- self.unskippable = []
+ self.unskippable = set()
def build_scenequeue_data(sqdata, rqdata, rq, cooker, stampcache, sqrq):
@@ -2344,38 +2344,19 @@ def build_scenequeue_data(sqdata, rqdata, rq, cooker, stampcache, sqrq):
# Build a list of setscene tasks which are "unskippable"
# These are direct endpoints referenced by the build
- endpoints2 = {}
- sq_revdeps2 = {}
- sq_revdeps_new2 = {}
- def process_endpoints2(endpoints):
- newendpoints = {}
- for point, task in endpoints.items():
- tasks = set([point])
- if task:
- tasks |= task
- if sq_revdeps_new2[point]:
- tasks |= sq_revdeps_new2[point]
- sq_revdeps_new2[point] = set()
- if point in rqdata.runq_setscene_tids:
- sq_revdeps_new2[point] = tasks
- for dep in rqdata.runtaskentries[point].depends:
- if point in sq_revdeps2[dep]:
- sq_revdeps2[dep].remove(point)
- if tasks:
- sq_revdeps_new2[dep] |= tasks
- if (len(sq_revdeps2[dep]) == 0 or len(sq_revdeps_new2[dep]) != 0) and dep not in rqdata.runq_setscene_tids:
- newendpoints[dep] = tasks
- if len(newendpoints) != 0:
- process_endpoints2(newendpoints)
+ # Take the build endpoints (no revdeps) and find the sstate tasks they depend upon
+ new = True
for tid in rqdata.runtaskentries:
- sq_revdeps2[tid] = copy.copy(rqdata.runtaskentries[tid].revdeps)
- sq_revdeps_new2[tid] = set()
- if (len(sq_revdeps2[tid]) == 0) and tid not in rqdata.runq_setscene_tids:
- endpoints2[tid] = set()
- process_endpoints2(endpoints2)
- for tid in rqdata.runq_setscene_tids:
- if sq_revdeps_new2[tid]:
- sqdata.unskippable.append(tid)
+ if len(rqdata.runtaskentries[tid].revdeps) == 0:
+ sqdata.unskippable.add(tid)
+ while new:
+ new = False
+ for tid in sqdata.unskippable.copy():
+ if tid in rqdata.runq_setscene_tids:
+ continue
+ sqdata.unskippable.remove(tid)
+ sqdata.unskippable |= rqdata.runtaskentries[tid].depends
+ new = True
rqdata.init_progress_reporter.next_stage(len(rqdata.runtaskentries))
--
2.20.1
More information about the bitbake-devel
mailing list