bitbake: cooker/cookerdata/utils: Improve context management

The current execution context management for bitbake is ugly and the
use of a global variable is nasty. Fixing that is hard, however we
can improve things to start to establish an API for accessing
and changing that context.

This patch also adds in an explicit reset of the context when we reparse
the configuration data which starts to improve the lifecycle of the data
in setups like hob.

(Bitbake rev: 6c3281a140125337fc75783973485e16785d05a1)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie 2013-05-23 10:49:57 +01:00
parent b9bd05b672
commit ea34691791
3 changed files with 22 additions and 10 deletions

View File

@ -1454,7 +1454,7 @@ class Parser(multiprocessing.Process):
self.quit = quit
self.init = init
multiprocessing.Process.__init__(self)
self.context = bb.utils._context.copy()
self.context = bb.utils.get_context().copy()
self.handlers = bb.event._handlers.copy()
def run(self):
@ -1490,7 +1490,8 @@ class Parser(multiprocessing.Process):
def parse(self, filename, appends, caches_array):
try:
bb.utils._context = self.context.copy()
# Reset our environment and handlers to the original settings
bb.utils.set_context(self.context.copy())
bb.event._handlers = self.handlers.copy()
return True, bb.cache.Cache.parse(filename, appends, self.cfg, caches_array)
except Exception as exc:

View File

@ -173,6 +173,7 @@ class CookerDataBuilder(object):
self.postfiles = params.postfile
self.tracking = params.tracking
bb.utils.set_context(bb.utils.clean_context())
self.data = bb.data.init()
if self.tracking:
self.data.enableTracking()

View File

@ -36,12 +36,22 @@ from contextlib import contextmanager
logger = logging.getLogger("BitBake.Util")
def clean_context():
return {
"os": os,
"bb": bb,
"time": time,
}
def get_context():
return _context
def set_context(ctx):
_context = ctx
# Context used in better_exec, eval
_context = {
"os": os,
"bb": bb,
"time": time,
}
_context = clean_context()
def explode_version(s):
r = []
@ -343,7 +353,7 @@ def better_exec(code, context, text = None, realfile = "<code>"):
if not hasattr(code, "co_filename"):
code = better_compile(code, realfile, realfile)
try:
exec(code, _context, context)
exec(code, get_context(), context)
except Exception as e:
(t, value, tb) = sys.exc_info()
@ -358,10 +368,10 @@ def better_exec(code, context, text = None, realfile = "<code>"):
raise e
def simple_exec(code, context):
exec(code, _context, context)
exec(code, get_context(), context)
def better_eval(source, locals):
return eval(source, _context, locals)
return eval(source, get_context(), locals)
@contextmanager
def fileslocked(files):