[poky] About the operator "??="

Xu, Dongxiao dongxiao.xu at intel.com
Thu Dec 9 06:44:04 PST 2010


Richard Purdie wrote:
> On Thu, 2010-12-09 at 20:13 +0800, Xu, Dongxiao wrote:
>> w/ patch:
>> time bitbake -p
>> 
>> real    0m26.189s
>> user    0m25.480s
>> sys     0m0.420s
>> 
>> w/o patch:
>> time bitbake -p
>> 
>> real    0m30.940s
>> user    0m30.230s
>> sys     0m0.460s
> 
> Thanks, thats 5/31 so about 15% which is nice and a confirmed speedup.
> Sometimes the profiling can distort things slightly so this is a good
> sanity check. 
> 
> Can you see what the impact is to parsing if we do all the work we do
> in setVar in setVarFlag too? 

I made the following patch (setVarFlag.patch) to move everything in setVar to setVarFlag, please help to review it.

Please note one place that I modified, see the indent of "self._seen_overrides[override].add( var )", I thought it was a bug in original code.

After adding this, the "two lines" in original "??=" optimization patch are no longer needed.

+            if bb.data.getVarFlag(key, "content", data) is None:
+                bb.data.setVar(key, None, data)

I rerun "time bitbake -p" with the two patches (see below, one is setVarFlag.patch, another is the "??=" optimization patch)
The result is:

real    0m27.049s
user    0m26.340s
sys     0m0.440s

The parsing time is a bit longer ( < 1 sec) than without the following "setVarFlag.patch".

Thanks,
Dongxiao



"setVarFlag.patch"

-----------------------------------------------------------------------------------------------------

diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index b9d9476..3fe2395 100644
--- a/bitbake/lib/bb/data_smart.py
+++ b/bitbake/lib/bb/data_smart.py
@@ -210,38 +210,7 @@ class DataSmart:
             self.initVar(var)
 
     def setVar(self, var, value):
-        self.expand_cache = {}
-        match  = __setvar_regexp__.match(var)
-        if match and match.group("keyword") in __setvar_keyword__:
-            base = match.group('base')
-            keyword = match.group("keyword")
-            override = match.group('add')
-            l = self.getVarFlag(base, keyword) or []
-            l.append([value, override])
-            self.setVarFlag(base, keyword, l)
-
-            # todo make sure keyword is not __doc__ or __module__
-            # pay the cookie monster
-            try:
-                self._special_values[keyword].add( base )
-            except KeyError:
-                self._special_values[keyword] = set()
-                self._special_values[keyword].add( base )
-
-            return
-
-        if not var in self.dict:
-            self._makeShadowCopy(var)
-
-        # more cookies for the cookie monster
-        if '_' in var:
-            override = var[var.rfind('_')+1:]
-            if override not in self._seen_overrides:
-                self._seen_overrides[override] = set()
-            self._seen_overrides[override].add( var )
-
-        # setting var
-        self.dict[var]["content"] = value
+        self.setVarFlag(var, "content", value)
 
     def getVar(self, var, exp):
         value = self.getVarFlag(var, "content") @@ -278,8 +247,38 @@ class DataSmart:
         self.dict[var] = {}
 
     def setVarFlag(self, var, flag, flagvalue):
+
+        self.expand_cache = {}
+        match  = __setvar_regexp__.match(var)
+        if match and match.group("keyword") in __setvar_keyword__ and flag == "content":
+            base = match.group('base')
+            keyword = match.group("keyword")
+            override = match.group('add')
+            l = self.getVarFlag(base, keyword) or []
+            l.append([flagvalue, override])
+            self.setVarFlag(base, keyword, l)
+
+            # todo make sure keyword is not __doc__ or __module__
+            # pay the cookie monster
+            try:
+                self._special_values[keyword].add( base )
+            except KeyError:
+                self._special_values[keyword] = set()
+                self._special_values[keyword].add( base )
+
+            return
+
+
         if not var in self.dict:
             self._makeShadowCopy(var)
+
+        # more cookies for the cookie monster
+        if '_' in var:
+            override = var[var.rfind('_')+1:]
+            if override not in self._seen_overrides:
+                self._seen_overrides[override] = set()
+                self._seen_overrides[override].add( var )
+
         self.dict[var][flag] = flagvalue
 
     def getVarFlag(self, var, flag):

-----------------------------------------------------------------------------------------------------


New "??=" optimization patch:

-----------------------------------------------------------------------------------------------------

diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index 3fe2395..1b8020d 100644
--- a/bitbake/lib/bb/data_smart.py
+++ b/bitbake/lib/bb/data_smart.py
@@ -215,6 +215,9 @@ class DataSmart:
     def getVar(self, var, exp):
         value = self.getVarFlag(var, "content")
 
+        if value is None:
+            value = self.getVarFlag(var, "defaultval")
+
         if exp and value:
             return self.expand(value, var)
         return value
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index 870ae65..cace9ab 100644
--- a/bitbake/lib/bb/parse/ast.py
+++ b/bitbake/lib/bb/parse/ast.py
@@ -109,9 +109,6 @@ class DataNode(AstNode):
         if 'flag' in groupd and groupd['flag'] != None:
             bb.data.setVarFlag(key, groupd['flag'], val, data)
         elif groupd["lazyques"]:
-            assigned = bb.data.getVar("__lazy_assigned", data) or []
-            assigned.append(key)
-            bb.data.setVar("__lazy_assigned", assigned, data)
             bb.data.setVarFlag(key, "defaultval", val, data)
         else:
             bb.data.setVar(key, val, data) @@ -301,10 +298,6 @@ def handleInherit(statements, m):
     statements.append(InheritNode(m.group(1)))
 
 def finalize(fn, d, variant = None):
-    for lazykey in bb.data.getVar("__lazy_assigned", d) or ():
-        if bb.data.getVar(lazykey, d) is None:
-            val = bb.data.getVarFlag(lazykey, "defaultval", d)
-            bb.data.setVar(lazykey, val, d)
 
     bb.data.expandKeys(d)
     bb.data.update_data(d)

-----------------------------------------------------------------------------------------------------

> 
> I'm definitely in favour of the patch, just a few details to make
> sure of :) 
> 
> Cheers,
> 
> Richard




More information about the poky mailing list