summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2016-12-21 13:36:25 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-01-11 17:18:45 +0000
commitdf8408a6b54fc908d4de81529b34477b8924d181 (patch)
tree1cce624305d155539f84d901b91234ab1f43f992
parenta5d81eefe9106f2080001b7313e2b15ab21ea55b (diff)
downloadbitbake-contrib-df8408a6b54fc908d4de81529b34477b8924d181.tar.gz
runqueue: Ensure setscene tasks with overlapping stamps don't parallel execute
In multiconfig, mutliple tasks can execute which share the same stamp file. These must not execute in parallel, the idea is the first should execute, the subsequent ones should see a valid stamp and get skipped. The normal task execution code has stamps code to handle this, this adds similar code to the setscene execute() function to handle the issue there too. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/runqueue.py6
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py
index b4f2013f0..61036b3eb 100644
--- a/lib/bb/runqueue.py
+++ b/lib/bb/runqueue.py
@@ -1869,6 +1869,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
sq_revdeps_new = {}
sq_revdeps_squash = {}
self.sq_harddeps = {}
+ self.stamps = {}
# We need to construct a dependency graph for the setscene functions. Intermediate
# dependencies between the setscene tasks only complicate the code. This code
@@ -1982,6 +1983,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
(mc, fn, taskname, taskfn) = split_tid_mcfn(tid)
realtid = tid + "_setscene"
idepends = self.rqdata.taskData[mc].taskentries[realtid].idepends
+ self.stamps[tid] = bb.build.stampfile(taskname + "_setscene", self.rqdata.dataCaches[mc], taskfn, noextra=True)
for (depname, idependtask) in idepends:
if depname not in self.rqdata.taskData[mc].build_targets:
@@ -2158,7 +2160,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
if self.stats.active < self.number_tasks:
# Find the next setscene to run
for nexttask in self.rqdata.runq_setscene_tids:
- if nexttask in self.runq_buildable and nexttask not in self.runq_running:
+ if nexttask in self.runq_buildable and nexttask not in self.runq_running and self.stamps[nexttask] not in self.build_stamps.values():
if nexttask in self.unskippable:
logger.debug(2, "Setscene task %s is unskippable" % nexttask)
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):
@@ -2208,6 +2210,8 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
self.rq.worker[mc].process.stdin.write(b"<runtask>" + pickle.dumps((taskfn, task, taskname, True, self.cooker.collection.get_file_appends(taskfn), None)) + b"</runtask>")
self.rq.worker[mc].process.stdin.flush()
+ self.build_stamps[task] = bb.build.stampfile(taskname, self.rqdata.dataCaches[mc], taskfn, noextra=True)
+ self.build_stamps2.append(self.build_stamps[task])
self.runq_running.add(task)
self.stats.taskActive()
if self.stats.active < self.number_tasks: