]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
SF bug [#410708] Condition.wait() and KeyboardInterrupt.
authorTim Peters <tim.peters@gmail.com>
Mon, 2 Apr 2001 20:15:57 +0000 (20:15 +0000)
committerTim Peters <tim.peters@gmail.com>
Mon, 2 Apr 2001 20:15:57 +0000 (20:15 +0000)
http://sourceforge.net/tracker/?func=detail&aid=410708&group_id=5470&atid=105470
Added try/finally around Condition.wait() guts, so that the lock state gets
restored at the end no matter what happens.

Lib/threading.py

index e484521fcada04e46173311fba1d48193cc20e1a..c5e65d92677f964c93b1a4bf38dce40523af3c10 100644 (file)
@@ -185,31 +185,33 @@ class _Condition(_Verbose):
         waiter.acquire()
         self.__waiters.append(waiter)
         saved_state = self._release_save()
-        if timeout is None:
-            waiter.acquire()
-            if __debug__:
-                self._note("%s.wait(): got it", self)
-        else:
-            endtime = _time() + timeout
-            delay = 0.000001 # 1 usec
-            while 1:
-                gotit = waiter.acquire(0)
-                if gotit or _time() >= endtime:
-                    break
-                _sleep(delay)
-                if delay < 1.0:
-                    delay = delay * 2.0
-            if not gotit:
+        try:    # restore state no matter what (e.g., KeyboardInterrupt)
+            if timeout is None:
+                waiter.acquire()
                 if __debug__:
-                    self._note("%s.wait(%s): timed out", self, timeout)
-                try:
-                    self.__waiters.remove(waiter)
-                except ValueError:
-                    pass
+                    self._note("%s.wait(): got it", self)
             else:
-                if __debug__:
-                    self._note("%s.wait(%s): got it", self, timeout)
-        self._acquire_restore(saved_state)
+                endtime = _time() + timeout
+                delay = 0.000001 # 1 usec
+                while 1:
+                    gotit = waiter.acquire(0)
+                    if gotit or _time() >= endtime:
+                        break
+                    _sleep(delay)
+                    if delay < 1.0:
+                        delay = delay * 2.0
+                if not gotit:
+                    if __debug__:
+                        self._note("%s.wait(%s): timed out", self, timeout)
+                    try:
+                        self.__waiters.remove(waiter)
+                    except ValueError:
+                        pass
+                else:
+                    if __debug__:
+                        self._note("%s.wait(%s): got it", self, timeout)
+        finally:
+            self._acquire_restore(saved_state)
 
     def notify(self, n=1):
         me = currentThread()