From 8b68f39465f4b64e44ac0753321d8e46558fa52a Mon Sep 17 00:00:00 2001 From: Guido Trotter <ultrotter@google.com> Date: Tue, 4 Mar 2008 13:16:44 +0000 Subject: [PATCH] LockSet: invert try/for nesting in acquire() This patch changes nothing to the functionality of a LockSet. Rather than trying to do the whole for loop we try each of its steps. This opens the way to handle differently a single failure. Reviewed-by: imsnah --- lib/locking.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/locking.py b/lib/locking.py index 41519eb3f..679537915 100644 --- a/lib/locking.py +++ b/lib/locking.py @@ -382,19 +382,19 @@ class LockSet: # First we look the locks up on __lockdict. We have no way of being sure # they will still be there after, but this makes it a lot faster should # just one of them be the already wrong - try: - for lname in names: + for lname in names: + try: lock = self.__lockdict[lname] # raises KeyError if the lock is not there acquire_list.append((lname, lock)) - except (KeyError): - raise errors.LockError('non-existing lock in set (%s)' % lname) + except (KeyError): + raise errors.LockError('non-existing lock in set (%s)' % lname) # Now acquire_list contains a sorted list of resources and locks we want. # In order to get them we loop on this (private) list and acquire() them. # We gave no real guarantee they will still exist till this is done but # .acquire() itself is safe and will alert us if the lock gets deleted. - try: - for (lname, lock) in acquire_list: + for (lname, lock) in acquire_list: + try: lock.acquire(shared=shared) # raises LockError if the lock is deleted try: # now the lock cannot be deleted, we have it! @@ -406,12 +406,12 @@ class LockSet: lock.release() raise - except (errors.LockError): - name_fail = lname - for lname in self._list_owned(): - self.__lockdict[lname].release() - self._del_owned(lname) - raise errors.LockError('non-existing lock in set (%s)' % name_fail) + except (errors.LockError): + name_fail = lname + for lname in self._list_owned(): + self.__lockdict[lname].release() + self._del_owned(lname) + raise errors.LockError('non-existing lock in set (%s)' % name_fail) return True -- GitLab