From 032fe7cc0cc0d5a1ef014a28f59cc76b025cb96b Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Tue, 4 May 2010 03:32:16 -0700 Subject: [PATCH] Fix for timers not working if they are created outside of a run loop. Reviewed by me. --- Foundation/CPRunLoop.j | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Foundation/CPRunLoop.j b/Foundation/CPRunLoop.j index 0884e4915..a68eead71 100644 --- a/Foundation/CPRunLoop.j +++ b/Foundation/CPRunLoop.j @@ -157,6 +157,7 @@ var CPRunLoopLastNativeRunLoop = 0; CPDate _effectiveDate; CPArray _orderedPerforms; + int _runLoopInsuranceTimer; } /* @@ -267,6 +268,12 @@ var CPRunLoopLastNativeRunLoop = 0; aTimer._lastNativeRunLoopsForModes = {}; aTimer._lastNativeRunLoopsForModes[aMode] = CPRunLoopLastNativeRunLoop; + + if (!_runLoopInsuranceTimer) + _runLoopInsuranceTimer = window.setNativeTimeout(function() + { + [self limitDateForMode:CPDefaultRunLoopMode]; + }, 0); } /*! @@ -277,9 +284,15 @@ var CPRunLoopLastNativeRunLoop = 0; //simple locking to try to prevent concurrent iterating over timers if (_runLoopLock) return; - + _runLoopLock = YES; - + + if (_runLoopInsuranceTimer) + { + window.clearNativeTimeout(_runLoopInsuranceTimer); + _runLoopInsuranceTimer = nil; + } + var now = _effectiveDate ? [_effectiveDate laterDate:[CPDate date]] : [CPDate date], nextFireDate = nil, nextTimerFireDate = _nextTimerFireDatesForModes[aMode];