diff options
Diffstat (limited to 'bitbake/lib/bb/utils.py')
| -rw-r--r-- | bitbake/lib/bb/utils.py | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index 857f5bcf96..607ffc5065 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
| @@ -31,6 +31,7 @@ import subprocess | |||
| 31 | import glob | 31 | import glob |
| 32 | import traceback | 32 | import traceback |
| 33 | import errno | 33 | import errno |
| 34 | import signal | ||
| 34 | from commands import getstatusoutput | 35 | from commands import getstatusoutput |
| 35 | from contextlib import contextmanager | 36 | from contextlib import contextmanager |
| 36 | 37 | ||
| @@ -412,10 +413,30 @@ def fileslocked(files): | |||
| 412 | for lock in locks: | 413 | for lock in locks: |
| 413 | bb.utils.unlockfile(lock) | 414 | bb.utils.unlockfile(lock) |
| 414 | 415 | ||
| 415 | def lockfile(name, shared=False, retry=True): | 416 | @contextmanager |
| 417 | def timeout(seconds): | ||
| 418 | def timeout_handler(signum, frame): | ||
| 419 | pass | ||
| 420 | |||
| 421 | original_handler = signal.signal(signal.SIGALRM, timeout_handler) | ||
| 422 | |||
| 423 | try: | ||
| 424 | signal.alarm(seconds) | ||
| 425 | yield | ||
| 426 | finally: | ||
| 427 | signal.alarm(0) | ||
| 428 | signal.signal(signal.SIGALRM, original_handler) | ||
| 429 | |||
| 430 | def lockfile(name, shared=False, retry=True, block=False): | ||
| 416 | """ | 431 | """ |
| 417 | Use the file fn as a lock file, return when the lock has been acquired. | 432 | Use the specified file as a lock file, return when the lock has |
| 418 | Returns a variable to pass to unlockfile(). | 433 | been acquired. Returns a variable to pass to unlockfile(). |
| 434 | Parameters: | ||
| 435 | retry: True to re-try locking if it fails, False otherwise | ||
| 436 | block: True to block until the lock succeeds, False otherwise | ||
| 437 | The retry and block parameters are kind of equivalent unless you | ||
| 438 | consider the possibility of sending a signal to the process to break | ||
| 439 | out - at which point you want block=True rather than retry=True. | ||
| 419 | """ | 440 | """ |
| 420 | dirname = os.path.dirname(name) | 441 | dirname = os.path.dirname(name) |
| 421 | mkdirhier(dirname) | 442 | mkdirhier(dirname) |
| @@ -428,7 +449,7 @@ def lockfile(name, shared=False, retry=True): | |||
| 428 | op = fcntl.LOCK_EX | 449 | op = fcntl.LOCK_EX |
| 429 | if shared: | 450 | if shared: |
| 430 | op = fcntl.LOCK_SH | 451 | op = fcntl.LOCK_SH |
| 431 | if not retry: | 452 | if not retry and not block: |
| 432 | op = op | fcntl.LOCK_NB | 453 | op = op | fcntl.LOCK_NB |
| 433 | 454 | ||
| 434 | while True: | 455 | while True: |
