]> granicus.if.org Git - python/commitdiff
Issue #11915: threading.RLock()._release_save() raises a RuntimeError if the
authorVictor Stinner <victor.stinner@haypocalc.com>
Sun, 24 Apr 2011 21:41:33 +0000 (23:41 +0200)
committerVictor Stinner <victor.stinner@haypocalc.com>
Sun, 24 Apr 2011 21:41:33 +0000 (23:41 +0200)
lock was not acquired.

Lib/test/lock_tests.py
Lib/threading.py
Misc/NEWS
Modules/_threadmodule.c

index ff30d41fb80bfb436c83885952de35239faa92fd..3ed61f3b93247dd9029b07d97b18110e88eb4adb 100644 (file)
@@ -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
index eb3cb626c37ce969fabeb44983375ab93896149d..28c214667148cc6ffa0d3e101b0d20b57932f5d6 100644 (file)
@@ -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
index 8aac765c928cb37fd8b01b182fdd37c79965114c..62aaea4dcb0f3e4257ccdbe6d0d402071f10d3b5 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
 
index 914d671d6a2c5c1ba744441167272296358ae972..1aee77b5f72242ff1d482fdde1233ba06a43d74f 100644 (file)
@@ -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;