1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-31 00:39:46 +00:00

bitbake: data_smart: Seperate out the override cache

Using an internal flag for override mapping turns out to be slower
than is optimal, not least as we don't want the keys list to list
variables that have no value other than a potential override expansion.

Maintinaing a seperate cache is therefore more optimal from a speed
perspective.

(Bitbake rev: 1a39ccf66b30b54e1274669cb0e1dc8fc72dba49)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie
2015-05-23 21:39:09 +00:00
parent c690d5b818
commit d8ebb4708b
+41 -14
View File
@@ -310,6 +310,8 @@ class DataSmart(MutableMapping):
self.expand_cache = {} self.expand_cache = {}
# cookie monster tribute # cookie monster tribute
self.overridedata = {}
self.overrides = [] self.overrides = []
self.overridevars = set(["OVERRIDES", "FILE"]) self.overridevars = set(["OVERRIDES", "FILE"])
@@ -434,8 +436,18 @@ class DataSmart(MutableMapping):
del self.dict[var]["_append"] del self.dict[var]["_append"]
if "_prepend" in self.dict[var]: if "_prepend" in self.dict[var]:
del self.dict[var]["_prepend"] del self.dict[var]["_prepend"]
if "_overrides" in self.dict[var]: if var in self.overridedata:
del self.dict[var]["_overrides"] active = []
self.need_overrides()
for (r, o) in self.overridedata[var]:
if o in self.overrides:
active.append(r)
elif "_" in o:
if set(o.split("_")).issubset(set(self.overrides)):
active.append(r)
for a in active:
self.delVar(a)
del self.overridedata[var]
# more cookies for the cookie monster # more cookies for the cookie monster
if '_' in var: if '_' in var:
@@ -454,10 +466,10 @@ class DataSmart(MutableMapping):
override = var[var.rfind('_')+1:] override = var[var.rfind('_')+1:]
shortvar = var[:var.rfind('_')] shortvar = var[:var.rfind('_')]
while override: while override:
l = self.getVarFlag(shortvar, "_overrides") or [] if shortvar not in self.overridedata:
if [var, override] not in l: self.overridedata[shortvar] = []
l.append([var, override]) if [var, override] not in self.overridedata[shortvar]:
self.setVarFlag(shortvar, "_overrides", l, ignore=True) self.overridedata[shortvar].append([var, override])
for event in self.varhistory.variable(var): for event in self.varhistory.variable(var):
if 'flag' in loginfo and not loginfo['flag'].startswith("_"): if 'flag' in loginfo and not loginfo['flag'].startswith("_"):
continue continue
@@ -498,6 +510,12 @@ class DataSmart(MutableMapping):
dest.extend(src) dest.extend(src)
self.setVarFlag(newkey, i, dest, ignore=True) self.setVarFlag(newkey, i, dest, ignore=True)
if key in self.overridedata:
self.overridedata[newkey] = []
for (v, o) in self.overridedata[key]:
self.overridedata[newkey].append([v.replace(key, newkey), o])
self.renameVar(v, v.replace(key, newkey))
if '_' in newkey and val is None: if '_' in newkey and val is None:
self._setvar_update_overrides(newkey, **loginfo) self._setvar_update_overrides(newkey, **loginfo)
@@ -525,15 +543,23 @@ class DataSmart(MutableMapping):
self.varhistory.record(**loginfo) self.varhistory.record(**loginfo)
self.expand_cache = {} self.expand_cache = {}
self.dict[var] = {} self.dict[var] = {}
if var in self.overridedata:
del self.overridedata[var]
if '_' in var: if '_' in var:
override = var[var.rfind('_')+1:] override = var[var.rfind('_')+1:]
shortvar = var[:var.rfind('_')] shortvar = var[:var.rfind('_')]
l = self.getVarFlag(shortvar, "_overrides") or [] while override:
try: try:
l.remove([var, override]) if shortvar in self.overridedata:
except ValueError as e: self.overridedata[shortvar].remove([var, override])
pass except ValueError as e:
self.setVarFlag(shortvar, "_overrides", l, ignore=True) pass
override = None
if "_" in shortvar:
override = var[shortvar.rfind('_')+1:]
shortvar = var[:shortvar.rfind('_')]
if len(shortvar) == 0:
override = None
def setVarFlag(self, var, flag, value, **loginfo): def setVarFlag(self, var, flag, value, **loginfo):
self.expand_cache = {} self.expand_cache = {}
@@ -558,10 +584,10 @@ class DataSmart(MutableMapping):
def getVarFlag(self, var, flag, expand=False, noweakdefault=False, parsing=False): def getVarFlag(self, var, flag, expand=False, noweakdefault=False, parsing=False):
local_var = self._findVar(var) local_var = self._findVar(var)
value = None value = None
if flag == "_content" and local_var is not None and "_overrides" in local_var and not parsing: if flag == "_content" and var in self.overridedata and not parsing:
match = False match = False
active = {} active = {}
for (r, o) in local_var["_overrides"]: for (r, o) in self.overridedata[var]:
# What about double overrides both with "_" in the name? # What about double overrides both with "_" in the name?
if o in self.overrides: if o in self.overrides:
active[o] = r active[o] = r
@@ -738,6 +764,7 @@ class DataSmart(MutableMapping):
data.overrides = copy.copy(self.overrides) data.overrides = copy.copy(self.overrides)
data.overridevars = copy.copy(self.overridevars) data.overridevars = copy.copy(self.overridevars)
data.overridedata = copy.copy(self.overridedata)
return data return data