Issue #11915: threading.RLock()._release_save() raises a RuntimeError if the
lock was not acquired.
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 @@
     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;