summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/bb/runqueue.py54
-rw-r--r--bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass22
2 files changed, 23 insertions, 53 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 82cc9af81b..f0f95f9b5e 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -1388,57 +1388,29 @@ class RunQueue:
1388 cache[tid] = iscurrent 1388 cache[tid] = iscurrent
1389 return iscurrent 1389 return iscurrent
1390 1390
1391 def validate_hashes(self, tocheck, data, presentcount=None, siginfo=False): 1391 def validate_hashes(self, tocheck, data, currentcount=None, siginfo=False):
1392 valid = set() 1392 valid = set()
1393 if self.hashvalidate: 1393 if self.hashvalidate:
1394 sq_hash = [] 1394 sq_data = {}
1395 sq_hashfn = [] 1395 sq_data['hash'] = {}
1396 sq_unihash = [] 1396 sq_data['hashfn'] = {}
1397 sq_fn = [] 1397 sq_data['unihash'] = {}
1398 sq_taskname = []
1399 sq_task = []
1400 for tid in tocheck: 1398 for tid in tocheck:
1401 (mc, fn, taskname, taskfn) = split_tid_mcfn(tid) 1399 (mc, fn, taskname, taskfn) = split_tid_mcfn(tid)
1400 sq_data['hash'][tid] = self.rqdata.runtaskentries[tid].hash
1401 sq_data['hashfn'][tid] = self.rqdata.dataCaches[mc].hashfn[taskfn]
1402 sq_data['unihash'][tid] = self.rqdata.runtaskentries[tid].unihash
1402 1403
1403 sq_fn.append(fn) 1404 valid_ids = self.validate_hash(sq_data, data, siginfo, currentcount)
1404 sq_hashfn.append(self.rqdata.dataCaches[mc].hashfn[taskfn])
1405 sq_hash.append(self.rqdata.runtaskentries[tid].hash)
1406 sq_unihash.append(self.rqdata.runtaskentries[tid].unihash)
1407 sq_taskname.append(taskname)
1408 sq_task.append(tid)
1409
1410 if presentcount is not None:
1411 data.setVar("BB_SETSCENE_STAMPCURRENT_COUNT", presentcount)
1412
1413 valid_ids = self.validate_hash(sq_fn, sq_taskname, sq_hash, sq_hashfn, siginfo, sq_unihash, data, presentcount)
1414
1415 if presentcount is not None:
1416 data.delVar("BB_SETSCENE_STAMPCURRENT_COUNT")
1417
1418 for v in valid_ids:
1419 valid.add(sq_task[v])
1420 1405
1421 return valid 1406 return valid
1422 1407
1423 def validate_hash(self, sq_fn, sq_task, sq_hash, sq_hashfn, siginfo, sq_unihash, d, presentcount): 1408 def validate_hash(self, sq_data, d, siginfo, currentcount):
1424 locs = {"sq_fn" : sq_fn, "sq_task" : sq_task, "sq_hash" : sq_hash, "sq_hashfn" : sq_hashfn, 1409 locs = {"sq_data" : sq_data, "d" : d, "siginfo" : siginfo, "currentcount" : currentcount}
1425 "sq_unihash" : sq_unihash, "siginfo" : siginfo, "d" : d}
1426 1410
1427 # Backwards compatibility 1411 # Metadata has **kwargs so args can be added, sq_data can also gain new fields
1428 hashvalidate_args = ("(sq_fn, sq_task, sq_hash, sq_hashfn, d, siginfo=siginfo, sq_unihash=sq_unihash)", 1412 call = self.hashvalidate + "(sq_data, d, siginfo=siginfo, currentcount=currentcount)"
1429 "(sq_fn, sq_task, sq_hash, sq_hashfn, d, siginfo=siginfo)",
1430 "(sq_fn, sq_task, sq_hash, sq_hashfn, d)")
1431
1432 for args in hashvalidate_args[:-1]:
1433 try:
1434 call = self.hashvalidate + args
1435 return bb.utils.better_eval(call, locs)
1436 except TypeError:
1437 continue
1438 1413
1439 # Call the last entry without a try...catch to propagate any thrown
1440 # TypeError
1441 call = self.hashvalidate + hashvalidate_args[-1]
1442 return bb.utils.better_eval(call, locs) 1414 return bb.utils.better_eval(call, locs)
1443 1415
1444 def _execute_runqueue(self): 1416 def _execute_runqueue(self):
diff --git a/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass b/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass
index 5b87e20bce..3a0f151c9a 100644
--- a/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass
+++ b/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass
@@ -216,27 +216,25 @@ def setscene_depvalid(task, taskdependees, notneeded, d, log=None):
216 216
217BB_HASHCHECK_FUNCTION = "sstate_checkhashes" 217BB_HASHCHECK_FUNCTION = "sstate_checkhashes"
218 218
219def sstate_checkhashes(sq_fn, sq_task, sq_hash, sq_hashfn, d, siginfo=False, *, sq_unihash=None): 219def sstate_checkhashes(sq_data, d, siginfo=False, currentcount=0, **kwargs):
220 220
221 ret = [] 221 found = set()
222 missed = [] 222 missed = set()
223 223
224 valid = d.getVar("SSTATEVALID").split() 224 valid = d.getVar("SSTATEVALID").split()
225 225
226 for task in range(len(sq_fn)): 226 for tid in sq_data['hash']:
227 n = os.path.basename(sq_fn[task]).rsplit(".", 1)[0] + ":" + sq_task[task] 227 n = os.path.basename(bb.runqueue.fn_from_tid(tid)).split(".")[0] + ":do_" + bb.runqueue.taskname_from_tid(tid)[3:]
228 print(n)
228 if n in valid: 229 if n in valid:
229 bb.note("SState: Found valid sstate for %s" % n) 230 bb.note("SState: Found valid sstate for %s" % n)
230 ret.append(task) 231 found.add(tid)
231 elif os.path.exists(d.expand("${TOPDIR}/%s.run" % n.replace("do_", ""))): 232 elif os.path.exists(d.expand("${TOPDIR}/%s.run" % n.replace("do_", ""))):
232 bb.note("SState: Found valid sstate for %s (already run)" % n) 233 bb.note("SState: Found valid sstate for %s (already run)" % n)
233 ret.append(task) 234 found.add(tid)
234 else: 235 else:
235 missed.append(task) 236 missed.add(tid)
236 bb.note("SState: Found no valid sstate for %s" % n) 237 bb.note("SState: Found no valid sstate for %s" % n)
237 238
238 if hasattr(bb.parse.siggen, "checkhashes"): 239 return found
239 bb.parse.siggen.checkhashes(missed, ret, sq_fn, sq_task, sq_hash, sq_hashfn, d)
240
241 return ret
242 240