Kaydet (Commit) c2824d41 authored tarafından Victor Stinner's avatar Victor Stinner

Issue #11915: threading.RLock()._release_save() raises a RuntimeError if the

lock was not acquired.
üst a82aa55b
...@@ -247,6 +247,7 @@ class RLockTests(BaseLockTests): ...@@ -247,6 +247,7 @@ class RLockTests(BaseLockTests):
# Cannot release an unacquired lock # Cannot release an unacquired lock
lock = self.locktype() lock = self.locktype()
self.assertRaises(RuntimeError, lock.release) self.assertRaises(RuntimeError, lock.release)
self.assertRaises(RuntimeError, lock._release_save)
lock.acquire() lock.acquire()
lock.acquire() lock.acquire()
lock.release() lock.release()
...@@ -254,6 +255,7 @@ class RLockTests(BaseLockTests): ...@@ -254,6 +255,7 @@ class RLockTests(BaseLockTests):
lock.release() lock.release()
lock.release() lock.release()
self.assertRaises(RuntimeError, lock.release) self.assertRaises(RuntimeError, lock.release)
self.assertRaises(RuntimeError, lock._release_save)
def test_different_thread(self): def test_different_thread(self):
# Cannot release from a different thread # Cannot release from a different thread
......
...@@ -157,6 +157,8 @@ class _RLock(_Verbose): ...@@ -157,6 +157,8 @@ class _RLock(_Verbose):
def _release_save(self): def _release_save(self):
if __debug__: if __debug__:
self._note("%s._release_save()", self) self._note("%s._release_save()", self)
if self._count == 0:
raise RuntimeError("cannot release un-acquired lock")
count = self._count count = self._count
self._count = 0 self._count = 0
owner = self._owner owner = self._owner
......
...@@ -113,6 +113,9 @@ Core and Builtins ...@@ -113,6 +113,9 @@ Core and Builtins
Library Library
------- -------
- Issue #11915: threading.RLock()._release_save() raises a RuntimeError if the
lock was not acquired.
- Issue #11258: Speed up ctypes.util.find_library() under Linux by a factor - Issue #11258: Speed up ctypes.util.find_library() under Linux by a factor
of 5 to 10. Initial patch by Jonas H. of 5 to 10. Initial patch by Jonas H.
......
...@@ -414,6 +414,12 @@ rlock_release_save(rlockobject *self) ...@@ -414,6 +414,12 @@ rlock_release_save(rlockobject *self)
long owner; long owner;
unsigned long count; unsigned long count;
if (self->rlock_count == 0) {
PyErr_SetString(PyExc_RuntimeError,
"cannot release un-acquired lock");
return NULL;
}
owner = self->rlock_owner; owner = self->rlock_owner;
count = self->rlock_count; count = self->rlock_count;
self->rlock_count = 0; self->rlock_count = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment