diff options
Diffstat (limited to 'bitbake')
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 54 | ||||
| -rw-r--r-- | bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass | 22 |
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 | ||
| 217 | BB_HASHCHECK_FUNCTION = "sstate_checkhashes" | 217 | BB_HASHCHECK_FUNCTION = "sstate_checkhashes" |
| 218 | 218 | ||
| 219 | def sstate_checkhashes(sq_fn, sq_task, sq_hash, sq_hashfn, d, siginfo=False, *, sq_unihash=None): | 219 | def 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 | ||
