Ticket #5962: clockinfloop_2.patch

File clockinfloop_2.patch, 2.8 KB (added by Saurabh, 16 months ago)

Added topfile, better variable names,comments.

  • twisted/test/test_task.py

     
    9090        self.failIf(call.active()) 
    9191 
    9292 
     93    def test_AdvanceInfiniteLoop(self): 
     94        """ 
     95        Advance(0) must not lead to infinite loop if rescheduling of function with '0' delay takes place. 
     96        This requires storing the function temporarily and then adding to  original calls after ongoing advance is completed. 
     97        """ 
     98        i = [0] 
     99        def f(): 
     100            if i[0] <= 2: 
     101                c.callLater(0, f) 
     102            i[0]+=1 
     103        c = task.Clock() 
     104        f() 
     105        c.advance(0) 
     106        self.assertEqual(i[0],2) 
     107 
     108 
    93109    def testAdvanceCancel(self): 
    94110        """ 
    95111        Test attemping to cancel the call in a callback. 
  • twisted/topfiles/5962.bugfix

     
     1twisted.internet.task.advance now handles the defective infinite loop occuring due to rescheduled functions with delay '0' in Clock.advance(0) by detecting them and listing them only after the current advance takes place. 
  • twisted/internet/task.py

     
    696696 
    697697    def __init__(self): 
    698698        self.calls = [] 
     699        #To avoid infinite loop,temporary list of functions rescheduled with 0 delay in on-going advance(0).  
     700        self.tempCalls = [] 
     701        #Detect functions for tempCalls 
     702        self._insideAdvance = 0 
    699703 
    700704 
    701705    def seconds(self): 
     
    726730                               self.calls.remove, 
    727731                               lambda c: None, 
    728732                               self.seconds) 
    729         self.calls.append(dc) 
     733        if self._insideAdvance and not when: 
     734            self.tempCalls.append(dc) 
     735        else: 
     736            self.calls.append(dc) 
    730737        self._sortCalls() 
    731738        return dc 
    732739 
     
    748755        time. 
    749756        """ 
    750757        self.rightNow += amount 
     758        if not amount: 
     759            self._insideAdvance = 1 
    751760        self._sortCalls() 
    752761        while self.calls and self.calls[0].getTime() <= self.seconds(): 
    753762            call = self.calls.pop(0) 
    754763            call.called = 1 
    755764            call.func(*call.args, **call.kw) 
    756765            self._sortCalls() 
     766        if self._insideAdvance and self.tempCalls: 
     767            self.calls = self.calls + self.tempCalls 
     768            self.tempCalls = [] 
     769            self._sortCalls() 
     770        self._insideAdvance = 0 
    757771 
    758772 
    759773    def pump(self, timings):