diff options
author | Richard Purdie <richard@openedhand.com> | 2007-11-24 14:44:36 +0000 |
---|---|---|
committer | Richard Purdie <richard@openedhand.com> | 2007-11-24 14:44:36 +0000 |
commit | 701aa74aeb2e06368a927b4b61dd02160066101a (patch) | |
tree | f5e0ffdd16f423883d2ab0e64632afa551b9d323 /bitbake/lib | |
parent | 4aaa8343bc1394d58ca6017d46bf11c1f151fae6 (diff) | |
download | openembedded-core-701aa74aeb2e06368a927b4b61dd02160066101a.tar.gz openembedded-core-701aa74aeb2e06368a927b4b61dd02160066101a.tar.bz2 openembedded-core-701aa74aeb2e06368a927b4b61dd02160066101a.zip |
bitbake: Add bb.utils.lockfile() and bb.utils.unlockfile()
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@3221 311d38ba-8fff-0310-9ca6-ca027cbcb966
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/utils.py | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index c2884f2633..c27dafd614 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -22,7 +22,7 @@ BitBake Utility Functions digits = "0123456789" ascii_letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" -import re +import re, fcntl, os def explode_version(s): r = [] @@ -202,3 +202,38 @@ def Enum(*names): constants = tuple(constants) EnumType = EnumClass() return EnumType + +def lockfile(name): + """ + Use the file fn as a lock file, return when the lock has been aquired. + Returns a variable to pass to unlockfile(). + """ + while True: + # If we leave the lockfiles lying around there is no problem + # but we should clean up after ourselves. This gives potential + # for races though. To work around this, when we aquire the lock + # we check the file we locked was still the lock file on disk. + # by comparing inode numbers. If they don't match or the lockfile + # no longer exists, we start again. + + # 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 + +def unlockfile(lf): + """ + Unlock a file locked using lockfile() + """ + os.unlink(lf.name) + fcntl.flock(lf.fileno(), fcntl.LOCK_UN) + lf.close + |