summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-04-02 20:15:57 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-04-02 20:15:57 (GMT)
commitc951bf91283996587246328c49e4b1909883db8c (patch)
tree8711f8334724d80d789fc5baa0684ef709388978
parentf5bd6843377a4f4433700282f5c4bddb3d6333ae (diff)
downloadcpython-c951bf91283996587246328c49e4b1909883db8c.zip
cpython-c951bf91283996587246328c49e4b1909883db8c.tar.gz
cpython-c951bf91283996587246328c49e4b1909883db8c.tar.bz2
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.
-rw-r--r--Lib/threading.py48
1 files changed, 25 insertions, 23 deletions
diff --git a/Lib/threading.py b/Lib/threading.py
index e484521..c5e65d9 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -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()