diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-04-24 21:41:33 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-04-24 21:41:33 (GMT) |
commit | c2824d41c32c3be5f100acdb1ff9f71ba7336b60 (patch) | |
tree | ecc2204a2c49dbbb3eba73212218fbf244b725a9 | |
parent | a82aa55b5e5448f93fd1827d97752e19877db077 (diff) | |
download | cpython-c2824d41c32c3be5f100acdb1ff9f71ba7336b60.zip cpython-c2824d41c32c3be5f100acdb1ff9f71ba7336b60.tar.gz cpython-c2824d41c32c3be5f100acdb1ff9f71ba7336b60.tar.bz2 |
Issue #11915: threading.RLock()._release_save() raises a RuntimeError if the
lock was not acquired.
-rw-r--r-- | Lib/test/lock_tests.py | 2 | ||||
-rw-r--r-- | Lib/threading.py | 2 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/_threadmodule.c | 6 |
4 files changed, 13 insertions, 0 deletions
diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index ff30d41..3ed61f3 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -247,6 +247,7 @@ class RLockTests(BaseLockTests): # Cannot release an unacquired lock lock = self.locktype() self.assertRaises(RuntimeError, lock.release) + self.assertRaises(RuntimeError, lock._release_save) lock.acquire() lock.acquire() lock.release() @@ -254,6 +255,7 @@ class RLockTests(BaseLockTests): lock.release() lock.release() self.assertRaises(RuntimeError, lock.release) + self.assertRaises(RuntimeError, lock._release_save) def test_different_thread(self): # Cannot release from a different thread diff --git a/Lib/threading.py b/Lib/threading.py index eb3cb62..28c2146 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -157,6 +157,8 @@ class _RLock(_Verbose): def _release_save(self): if __debug__: self._note("%s._release_save()", self) + if self._count == 0: + raise RuntimeError("cannot release un-acquired lock") count = self._count self._count = 0 owner = self._owner @@ -113,6 +113,9 @@ Core and Builtins 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 of 5 to 10. Initial patch by Jonas H. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 914d671..1aee77b 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -414,6 +414,12 @@ rlock_release_save(rlockobject *self) long owner; unsigned long count; + if (self->rlock_count == 0) { + PyErr_SetString(PyExc_RuntimeError, + "cannot release un-acquired lock"); + return NULL; + } + owner = self->rlock_owner; count = self->rlock_count; self->rlock_count = 0; |