[Bug #1512163] Use one set of locking methods, lockf();
remove the flock() calls. On FreeBSD, the two methods lockf() and flock() end up using the same mechanism and the second one fails. A Linux man page claims that the two methods are orthogonal (so locks acquired one way don't interact with locks acquired the other way) but that clearly must be false.
This commit is contained in:
parent
a7ee9eb3d9
commit
557325930c
|
@ -1798,7 +1798,7 @@ class _PartialFile(_ProxyFile):
|
||||||
|
|
||||||
|
|
||||||
def _lock_file(f, dotlock=True):
|
def _lock_file(f, dotlock=True):
|
||||||
"""Lock file f using lockf, flock, and dot locking."""
|
"""Lock file f using lockf and dot locking."""
|
||||||
dotlock_done = False
|
dotlock_done = False
|
||||||
try:
|
try:
|
||||||
if fcntl:
|
if fcntl:
|
||||||
|
@ -1810,14 +1810,6 @@ def _lock_file(f, dotlock=True):
|
||||||
f.name)
|
f.name)
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
try:
|
|
||||||
fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
|
||||||
except IOError, e:
|
|
||||||
if e.errno == errno.EWOULDBLOCK:
|
|
||||||
raise ExternalClashError('flock: lock unavailable: %s' %
|
|
||||||
f.name)
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
if dotlock:
|
if dotlock:
|
||||||
try:
|
try:
|
||||||
pre_lock = _create_temporary(f.name + '.lock')
|
pre_lock = _create_temporary(f.name + '.lock')
|
||||||
|
@ -1845,16 +1837,14 @@ def _lock_file(f, dotlock=True):
|
||||||
except:
|
except:
|
||||||
if fcntl:
|
if fcntl:
|
||||||
fcntl.lockf(f, fcntl.LOCK_UN)
|
fcntl.lockf(f, fcntl.LOCK_UN)
|
||||||
fcntl.flock(f, fcntl.LOCK_UN)
|
|
||||||
if dotlock_done:
|
if dotlock_done:
|
||||||
os.remove(f.name + '.lock')
|
os.remove(f.name + '.lock')
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def _unlock_file(f):
|
def _unlock_file(f):
|
||||||
"""Unlock file f using lockf, flock, and dot locking."""
|
"""Unlock file f using lockf and dot locking."""
|
||||||
if fcntl:
|
if fcntl:
|
||||||
fcntl.lockf(f, fcntl.LOCK_UN)
|
fcntl.lockf(f, fcntl.LOCK_UN)
|
||||||
fcntl.flock(f, fcntl.LOCK_UN)
|
|
||||||
if os.path.exists(f.name + '.lock'):
|
if os.path.exists(f.name + '.lock'):
|
||||||
os.remove(f.name + '.lock')
|
os.remove(f.name + '.lock')
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue