[Python-checkins] CVS: python/dist/src/Lib threading.py,1.11,1.12

Tim Peters tim_one@users.sourceforge.net
Mon, 02 Apr 2001 13:15:59 -0700


Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv11514/python/dist/src/Lib

Modified Files:
	threading.py 
Log Message:
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.


Index: threading.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/threading.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -r1.11 -r1.12
*** threading.py	2001/01/15 03:26:36	1.11
--- threading.py	2001/04/02 20:15:57	1.12
***************
*** 186,214 ****
          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:
                  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)
!         self._acquire_restore(saved_state)
  
      def notify(self, n=1):
--- 186,216 ----
          self.__waiters.append(waiter)
          saved_state = self._release_save()
!         try:    # restore state no matter what (e.g., KeyboardInterrupt)
!             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:
!                     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):