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:
@@ -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):
|
||||
|
Reference in New Issue
Block a user