Ensure writer -> reader -> writer r/w lock acquisition

Fixes issue #4
This commit is contained in:
Joshua Harlow
2015-06-06 20:42:28 -07:00
parent 0b1df8ef2f
commit d67b9d08dd
2 changed files with 12 additions and 2 deletions

View File

@@ -216,10 +216,11 @@ class ReaderWriterLock(object):
a lock.
"""
me = self._current_thread()
if self.is_reader():
i_am_writer = self.is_writer(check_pending=False)
if self.is_reader() and not i_am_writer:
raise RuntimeError("Reader %s to writer privilege"
" escalation not allowed" % me)
if self.is_writer(check_pending=False):
if i_am_writer:
# Already the writer; this allows for basic reentrancy.
yield self
else:

View File

@@ -315,6 +315,15 @@ class ReadWriteLockTest(test.TestCase):
self.assertEqual(5, len(writers))
self.assertEqual(10, len(readers))
def test_writer_reader_writer(self):
lock = fasteners.ReaderWriterLock()
with lock.write_lock():
self.assertTrue(lock.is_writer())
with lock.read_lock():
self.assertTrue(lock.is_reader())
with lock.write_lock():
self.assertTrue(lock.is_writer())
def test_single_reader_writer(self):
results = []
lock = fasteners.ReaderWriterLock()