summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/utils.py37
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
22digits = "0123456789" 22digits = "0123456789"
23ascii_letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 23ascii_letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
24 24
25import re 25import re, fcntl, os
26 26
27def explode_version(s): 27def explode_version(s):
28 r = [] 28 r = []
@@ -202,3 +202,38 @@ def Enum(*names):
202 constants = tuple(constants) 202 constants = tuple(constants)
203 EnumType = EnumClass() 203 EnumType = EnumClass()
204 return EnumType 204 return EnumType
205
206def lockfile(name):
207 """
208 Use the file fn as a lock file, return when the lock has been aquired.
209 Returns a variable to pass to unlockfile().
210 """
211 while True:
212 # If we leave the lockfiles lying around there is no problem
213 # but we should clean up after ourselves. This gives potential
214 # for races though. To work around this, when we aquire the lock
215 # we check the file we locked was still the lock file on disk.
216 # by comparing inode numbers. If they don't match or the lockfile
217 # no longer exists, we start again.
218
219 # This implementation is unfair since the last person to request the
220 # lock is the most likely to win it.
221
222 lf = open(name, "a+")
223 fcntl.flock(lf.fileno(), fcntl.LOCK_EX)
224 statinfo = os.fstat(lf.fileno())
225 if os.path.exists(lf.name):
226 statinfo2 = os.stat(lf.name)
227 if statinfo.st_ino == statinfo2.st_ino:
228 return lf
229 # File no longer exists or changed, retry
230 lf.close
231
232def unlockfile(lf):
233 """
234 Unlock a file locked using lockfile()
235 """
236 os.unlink(lf.name)
237 fcntl.flock(lf.fileno(), fcntl.LOCK_UN)
238 lf.close
239