aboutsummaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2012-05-10 09:21:41 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-05-11 11:54:26 +0100
commitd48d8aa1e7add733de277f050c71b84a84ce9c6b (patch)
tree6f6aa9a88a61a98e1296d1e35b9284f70e0aef84 /bitbake
parent4a2147f54fc386ed3b9fdc9481ae95a358130854 (diff)
downloadopenembedded-core-contrib-d48d8aa1e7add733de277f050c71b84a84ce9c6b.tar.gz
bitbake/runqueue: Fix 'full' stamp checking to be more efficient and cache results
This should fix issues where bitbake would seemingly lock up when checking certain configurations of stampfiles. The cache is kept within the runqueue since that feels like the right place to associate this cache data. (Bitbake rev: e95755c4931b26d9f8102ed3652dff969145cfc9) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/runqueue.py22
1 files changed, 16 insertions, 6 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 462c685d2f..60ef5ea976 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -875,7 +875,7 @@ class RunQueue:
bb.msg.fatal("RunQueue", "check_stamps fatal internal error")
return current
- def check_stamp_task(self, task, taskname = None, recurse = False):
+ def check_stamp_task(self, task, taskname = None, recurse = False, cache = None):
def get_timestamp(f):
try:
if not os.access(f, os.F_OK):
@@ -911,10 +911,16 @@ class RunQueue:
if taskname != "do_setscene" and taskname.endswith("_setscene"):
return True
+ if cache is None:
+ cache = {}
+
iscurrent = True
t1 = get_timestamp(stampfile)
for dep in self.rqdata.runq_depends[task]:
if iscurrent:
+ if dep in cache:
+ iscurrent = cache[dep]
+ continue
fn2 = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[dep]]
taskname2 = self.rqdata.runq_task[dep]
stampfile2 = bb.build.stampfile(taskname2, self.rqdata.dataCache, fn2)
@@ -931,7 +937,9 @@ class RunQueue:
logger.debug(2, 'Stampfile %s < %s', stampfile, stampfile2)
iscurrent = False
if recurse and iscurrent:
- iscurrent = self.check_stamp_task(dep, recurse=True)
+ iscurrent = self.check_stamp_task(dep, recurse=True, cache=cache)
+ cache[dep] = iscurrent
+ cache[task] = iscurrent
return iscurrent
def execute_runqueue(self):
@@ -1041,6 +1049,8 @@ class RunQueueExecute:
self.build_stamps = {}
self.failed_fnids = []
+ self.stampcache = {}
+
def runqueue_process_waitpid(self):
"""
Return none is there are no processes awaiting result collection, otherwise
@@ -1384,7 +1394,7 @@ class RunQueueExecuteTasks(RunQueueExecute):
self.task_skip(task)
return True
- if self.rq.check_stamp_task(task, taskname):
+ if self.rq.check_stamp_task(task, taskname, cache=self.stampcache):
logger.debug(2, "Stamp current task %s (%s)", task,
self.rqdata.get_user_idstring(task))
self.task_skip(task)
@@ -1568,7 +1578,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
bb.build.make_stamp(taskname + "_setscene", self.rqdata.dataCache, fn)
continue
- if self.rq.check_stamp_task(realtask, taskname + "_setscene"):
+ if self.rq.check_stamp_task(realtask, taskname + "_setscene", cache=self.stampcache):
logger.debug(2, 'Setscene stamp current for task %s(%s)', task, self.rqdata.get_user_idstring(realtask))
stamppresent.append(task)
self.task_skip(task)
@@ -1661,7 +1671,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[realtask]]
taskname = self.rqdata.runq_task[realtask] + "_setscene"
- if self.rq.check_stamp_task(realtask, self.rqdata.runq_task[realtask], recurse = True):
+ if self.rq.check_stamp_task(realtask, self.rqdata.runq_task[realtask], recurse = True, cache=self.stampcache):
logger.debug(2, 'Stamp for underlying task %s(%s) is current, so skipping setscene variant',
task, self.rqdata.get_user_idstring(realtask))
self.task_failoutright(task)
@@ -1673,7 +1683,7 @@ class RunQueueExecuteScenequeue(RunQueueExecute):
self.task_failoutright(task)
return True
- if self.rq.check_stamp_task(realtask, taskname):
+ if self.rq.check_stamp_task(realtask, taskname, cache=self.stampcache):
logger.debug(2, 'Setscene stamp current task %s(%s), so skip it and its dependencies',
task, self.rqdata.get_user_idstring(realtask))
self.task_skip(task)