Ticket #5962: clockinfloop.patch

File clockinfloop.patch, 2.0 KB (added by Saurabh, 18 months ago)
  • twisted/test/test_task.py

     
    8989        self.assertEqual(events, [None]) 
    9090        self.failIf(call.active()) 
    9191 
     92    def testAdvanceInfiniteLoop(self): 
     93        """ 
     94        check if advance(0) leads to infinite loop 
     95        """ 
     96        self.i = 0 
     97        def f(): 
     98            if self.i <= 2: 
     99                self.c.callLater(0, f) 
     100            self.i+=1 
     101        self.c = task.Clock() 
     102        f() 
     103        self.c.advance(0) 
     104        self.assertEqual(self.i,2) 
    92105 
     106 
    93107    def testAdvanceCancel(self): 
    94108        """ 
    95109        Test attemping to cancel the call in a callback. 
  • twisted/internet/task.py

     
    696696 
    697697    def __init__(self): 
    698698        self.calls = [] 
     699        self.tempCalls = [] 
     700        self.checkLoop = 0 
    699701 
    700702 
    701703    def seconds(self): 
     
    726728                               self.calls.remove, 
    727729                               lambda c: None, 
    728730                               self.seconds) 
    729         self.calls.append(dc) 
     731        if self.checkLoop and not when: 
     732            self.tempCalls.append(dc) 
     733        else: 
     734            self.calls.append(dc) 
    730735        self._sortCalls() 
    731736        return dc 
    732737 
     
    748753        time. 
    749754        """ 
    750755        self.rightNow += amount 
     756        if not amount: 
     757            self.checkLoop = 1 
    751758        self._sortCalls() 
    752759        while self.calls and self.calls[0].getTime() <= self.seconds(): 
    753760            call = self.calls.pop(0) 
    754761            call.called = 1 
    755762            call.func(*call.args, **call.kw) 
    756763            self._sortCalls() 
     764        if self.checkLoop and self.tempCalls: 
     765            self.calls = self.calls + self.tempCalls 
     766            self.tempCalls = [] 
     767            self._sortCalls() 
     768        self.checkLoop = 0 
    757769 
    758770 
    759771    def pump(self, timings):