locking: Don't fail in error handling if lock isn't owned
authorMichael Hanselmann <hansmi@google.com>
Tue, 12 Jan 2010 14:11:40 +0000 (15:11 +0100)
committerMichael Hanselmann <hansmi@google.com>
Wed, 13 Jan 2010 13:02:00 +0000 (14:02 +0100)
In case an exception was thrown while acquiring the lock, not necessarily all
owned locks are also really acquired. Before this change, an exception could be
masked by another exception thrown here. There is no good clean-up strategy
when acquiring a lock fails with an exception in either case.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

lib/locking.py

index 6ba74f2..103d645 100644 (file)
@@ -775,7 +775,9 @@ class LockSet:
   def _release_and_delete_owned(self):
     """Release and delete all resources owned by the current thread"""
     for lname in self._list_owned():
-      self.__lockdict[lname].release()
+      lock = self.__lockdict[lname]
+      if lock._is_owned():
+        lock.release()
       self._del_owned(name=lname)
 
   def __names(self):