build: use a contextmanager for locks

Also don't bother passing logfile to exec_func_python, at least until we start
adding the logfile as a file handler to the bitbake logger.

(Bitbake rev: f99ee4680c9f67b7ed13fc06044ba2382f9a782c)

Signed-off-by: Chris Larson <chris_larson@mentor.com>
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
This commit is contained in:
Chris Larson 2010-12-09 20:29:31 -05:00 committed by Richard Purdie
parent b4eff9fcef
commit e2363f3cdd
2 changed files with 22 additions and 13 deletions

View File

@ -25,13 +25,14 @@
#
#Based on functions from the base bb module, Copyright 2003 Holger Schurig
from bb import data, event, mkdirhier, utils
import os
import sys
import logging
import bb
import bb.utils
import bb.process
from contextlib import nested
from bb import data, event, mkdirhier, utils
logger = logging.getLogger("BitBake.Build")
@ -142,26 +143,21 @@ def exec_func(func, d, dirs = None, logfile = NULL):
if flags.get('fakeroot') and not flags.get('task'):
bb.fatal("Function %s specifies fakeroot but isn't a task?!" % func)
lockflag = flags.get('lockfiles')
if lockflag:
lockfiles = [data.expand(f, d) for f in lockflag.split()]
else:
lockfiles = None
tempdir = data.getVar('T', d, 1)
runfile = os.path.join(tempdir, 'run.{0}.{1}'.format(func, os.getpid()))
locks = []
lockfiles = flags.get('lockfiles')
if lockfiles:
for lock in data.expand(lockfiles, d).split():
locks.append(bb.utils.lockfile(lock))
try:
with bb.utils.fileslocked(lockfiles):
if ispython:
exec_func_python(func, d, runfile, logfile, cwd=adir)
else:
exec_func_shell(func, d, runfile, logfile, cwd=adir)
finally:
# Unlock any lockfiles
for lock in locks:
bb.utils.unlockfile(lock)
_functionfmt = """
def {function}(d):
{body}

View File

@ -26,6 +26,7 @@ import logging
import bb
import bb.msg
from commands import getstatusoutput
from contextlib import contextmanager
logger = logging.getLogger("BitBake.Util")
@ -398,6 +399,18 @@ def simple_exec(code, context):
def better_eval(source, locals):
return eval(source, _context, locals)
@contextmanager
def fileslocked(files):
locks = []
if files:
for lockfile in files:
locks.append(bb.utils.lockfile(lock))
yield
for lock in locks:
bb.utils.unlockfile(lock)
def lockfile(name):
"""
Use the file fn as a lock file, return when the lock has been acquired.