diff options
author | Chris Larson <chris_larson@mentor.com> | 2011-03-08 09:33:40 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-03-31 12:21:52 +0100 |
commit | d38968c4fca254dd478be8a54881b93ff29fadb5 (patch) | |
tree | 3b527f5eabbc5e19334917c788835b0112fbad47 /bitbake/lib | |
parent | 77513ee5f08294f7894ca2560dfb98d5b5d6448b (diff) | |
download | poky-d38968c4fca254dd478be8a54881b93ff29fadb5.tar.gz |
lockfile: ask for forgiveness, not permission
Create the lockfile directory if it doesn't exist, rather than erroring out if
it doesn't exist (was also racy).
Also improve the wording of the error message shown when the lockfile's
directory is not writable.
Note for the future, this function should be improved, particularly with
regard to its exception handling. It should be catching the *exact*
exception(s) it will encounter when the file is locked, and continuing in that
case only. If it did that, there'd be no need for the proactive directory
writability check, as bb.utils.lockfile() would raise an appropriate IOError
for that case.
(Bitbake rev: 238151441c74db53d6e4d4753f4f96c32f6f13b6)
Signed-off-by: Chris Larson <chris_larson@mentor.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/utils.py | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index a6f1337114..f49ee5544a 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
@@ -407,13 +407,12 @@ def lockfile(name, shared=False): | |||
407 | Use the file fn as a lock file, return when the lock has been acquired. | 407 | Use the file fn as a lock file, return when the lock has been acquired. |
408 | Returns a variable to pass to unlockfile(). | 408 | Returns a variable to pass to unlockfile(). |
409 | """ | 409 | """ |
410 | path = os.path.dirname(name) | 410 | dirname = os.path.dirname(name) |
411 | if not os.path.isdir(path): | 411 | mkdirhier(dirname) |
412 | logger.error("Lockfile destination directory '%s' does not exist", path) | ||
413 | sys.exit(1) | ||
414 | 412 | ||
415 | if not os.access(path, os.W_OK): | 413 | if not os.access(dirname, os.W_OK): |
416 | logger.error("Error, lockfile path is not writable!: %s" % path) | 414 | logger.error("Unable to acquire lock '%s', directory is not writable", |
415 | dirname) | ||
417 | sys.exit(1) | 416 | sys.exit(1) |
418 | 417 | ||
419 | op = fcntl.LOCK_EX | 418 | op = fcntl.LOCK_EX |
@@ -449,7 +448,7 @@ def unlockfile(lf): | |||
449 | Unlock a file locked using lockfile() | 448 | Unlock a file locked using lockfile() |
450 | """ | 449 | """ |
451 | try: | 450 | try: |
452 | # If we had a shared lock, we need to promote to exclusive before | 451 | # If we had a shared lock, we need to promote to exclusive before |
453 | # removing the lockfile. Attempt this, ignore failures. | 452 | # removing the lockfile. Attempt this, ignore failures. |
454 | fcntl.flock(lf.fileno(), fcntl.LOCK_EX|fcntl.LOCK_NB) | 453 | fcntl.flock(lf.fileno(), fcntl.LOCK_EX|fcntl.LOCK_NB) |
455 | os.unlink(lf.name) | 454 | os.unlink(lf.name) |