Fix stupid lock bug.

- Code simplification ignored case where exception was raised.
- If LockError was raised, read and write counts were incremented erroneously.
- updated lock test.
This commit is contained in:
Todd Gamblin
2015-10-27 16:29:14 -07:00
parent af7b96c14a
commit bf8479bec6
3 changed files with 53 additions and 41 deletions

View File

@@ -99,11 +99,13 @@ def acquire_read(self, timeout=_default_timeout):
the POSIX lock, False if it is a nested transaction.
"""
self._reads += 1
if self._reads == 1 and self._writes == 0:
self._lock(fcntl.LOCK_SH, timeout)
if self._reads == 0 and self._writes == 0:
self._lock(fcntl.LOCK_SH, timeout) # can raise LockError.
self._reads += 1
return True
return False
else:
self._reads += 1
return False
def acquire_write(self, timeout=_default_timeout):
@@ -117,11 +119,13 @@ def acquire_write(self, timeout=_default_timeout):
the POSIX lock, False if it is a nested transaction.
"""
self._writes += 1
if self._writes == 1:
self._lock(fcntl.LOCK_EX, timeout)
if self._writes == 0:
self._lock(fcntl.LOCK_EX, timeout) # can raise LockError.
self._writes += 1
return True
return False
else:
self._writes += 1
return False
def release_read(self):
@@ -136,11 +140,13 @@ def release_read(self):
"""
assert self._reads > 0
self._reads -= 1
if self._reads == 0 and self._writes == 0:
self._unlock()
if self._reads == 1 and self._writes == 0:
self._unlock() # can raise LockError.
self._reads -= 1
return True
return False
else:
self._reads -= 1
return False
def release_write(self):
@@ -155,11 +161,13 @@ def release_write(self):
"""
assert self._writes > 0
self._writes -= 1
if self._writes == 0 and self._reads == 0:
self._unlock()
if self._writes == 1 and self._reads == 0:
self._unlock() # can raise LockError.
self._writes -= 1
return True
return False
else:
self._writes -= 1
return False
class LockError(Exception):