diff options
author | Richard Purdie <rpurdie@linux.intel.com> | 2008-12-06 12:09:11 +0000 |
---|---|---|
committer | Richard Purdie <rpurdie@linux.intel.com> | 2008-12-06 12:09:11 +0000 |
commit | c704085a78b0601743aa6ef4b5d315da9ab534ee (patch) | |
tree | 114ce37ef3aa0ccf615c841dfc4eb29c3169889a | |
parent | 5d6cdbc126331d62867a3007ea4d435f6445357a (diff) | |
download | bitbake-c704085a78b0601743aa6ef4b5d315da9ab534ee.tar.gz |
utils.py: Improve lock file function error handling (from Poky)
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | lib/bb/utils.py | 27 |
2 files changed, 19 insertions, 9 deletions
@@ -66,6 +66,7 @@ Changes in BitBake 1.8.x: - Add tryaltconfigs option to control whether bitbake trys using alternative providers to fulfil failed dependencies. It defaults to off, changing the default since this behaviour confuses many users and isn't often useful. + - Improve lock file function error handling Changes in BitBake 1.8.10: - Psyco is available only for x86 - do not use it on other architectures. diff --git a/lib/bb/utils.py b/lib/bb/utils.py index 8a78b3680..ba3089d13 100644 --- a/lib/bb/utils.py +++ b/lib/bb/utils.py @@ -235,6 +235,12 @@ def lockfile(name): Use the file fn as a lock file, return when the lock has been acquired. Returns a variable to pass to unlockfile(). """ + path = os.path.dirname(name) + if not os.path.isdir(path): + import bb, sys + bb.msg.error(bb.msg.domain.Util, "Error, lockfile path does not exist!: %s" % path) + sys.exit(1) + while True: # If we leave the lockfiles lying around there is no problem # but we should clean up after ourselves. This gives potential @@ -246,15 +252,18 @@ def lockfile(name): # This implementation is unfair since the last person to request the # lock is the most likely to win it. - lf = open(name, "a+") - fcntl.flock(lf.fileno(), fcntl.LOCK_EX) - statinfo = os.fstat(lf.fileno()) - if os.path.exists(lf.name): - statinfo2 = os.stat(lf.name) - if statinfo.st_ino == statinfo2.st_ino: - return lf - # File no longer exists or changed, retry - lf.close + try: + lf = open(name, "a+") + fcntl.flock(lf.fileno(), fcntl.LOCK_EX) + statinfo = os.fstat(lf.fileno()) + if os.path.exists(lf.name): + statinfo2 = os.stat(lf.name) + if statinfo.st_ino == statinfo2.st_ino: + return lf + # File no longer exists or changed, retry + lf.close + except Exception, e: + continue def unlockfile(lf): """ |