summaryrefslogtreecommitdiffstats
path: root/pym/portage/locks.py
diff options
context:
space:
mode:
Diffstat (limited to 'pym/portage/locks.py')
-rw-r--r--pym/portage/locks.py13
1 files changed, 9 insertions, 4 deletions
diff --git a/pym/portage/locks.py b/pym/portage/locks.py
index 004108eb7..000cd3495 100644
--- a/pym/portage/locks.py
+++ b/pym/portage/locks.py
@@ -5,7 +5,8 @@
import errno, os, stat, time, types
-from portage.exception import InvalidData, DirectoryNotFound, FileNotFound
+from portage.exception import DirectoryNotFound, FileNotFound, \
+ InvalidData, TryAgain
from portage.data import portage_gid
from portage.util import writemsg
from portage.localization import _
@@ -17,7 +18,8 @@ def lockdir(mydir):
def unlockdir(mylock):
return unlockfile(mylock)
-def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, waiting_msg=None):
+def lockfile(mypath, wantnewlockfile=0, unlinkfile=0,
+ waiting_msg=None, flags=0):
"""Creates all dirs upto, the given dir. Creates a lockfile
for the given directory as the file: directoryname+'.portage_lockfile'."""
import fcntl
@@ -54,7 +56,8 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, waiting_msg=None):
except OSError, e:
if e[0] == 2: # No such file or directory
return lockfile(mypath, wantnewlockfile=wantnewlockfile,
- unlinkfile=unlinkfile, waiting_msg=waiting_msg)
+ unlinkfile=unlinkfile, waiting_msg=waiting_msg,
+ flags=flags)
else:
writemsg("Cannot chown a lockfile. This could cause inconvenience later.\n");
os.umask(old_mask)
@@ -78,6 +81,8 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, waiting_msg=None):
raise
if e.errno in (errno.EACCES, errno.EAGAIN):
# resource temp unavailable; eg, someone beat us to the lock.
+ if flags & os.O_NONBLOCK:
+ raise TryAgain(mypath)
if waiting_msg is None:
if isinstance(mypath, int):
print "waiting for lock on fd %i" % myfd
@@ -114,7 +119,7 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, waiting_msg=None):
writemsg("lockfile recurse\n",1)
lockfilename, myfd, unlinkfile, locking_method = lockfile(
mypath, wantnewlockfile=wantnewlockfile, unlinkfile=unlinkfile,
- waiting_msg=waiting_msg)
+ waiting_msg=waiting_msg, flags=flags)
writemsg(str((lockfilename,myfd,unlinkfile))+"\n",1)
return (lockfilename,myfd,unlinkfile,locking_method)