SF bug [#410708] Condition.wait() and KeyboardInterrupt.

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.
This commit is contained in:
Tim Peters 2001-04-02 20:15:57 +00:00
parent f5bd684337
commit c951bf9128
1 changed files with 25 additions and 23 deletions

View 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()