Reviewed by Maciej.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 20 Feb 2006 09:29:00 +0000 (09:29 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 20 Feb 2006 09:29:00 +0000 (09:29 +0000)
        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=7318
          REGRESSION: Timer bug causes gif animation and (html and JS) page forwarding to fail

        Timers were stopping firing after a while.

        My testing makes this look like a CFRunLoopTimer bug, and it would be nice to reproduce
        this with a standalone test and report it to the CF team, but in the mean time, change
        to create a new timer each time instead of reusing the existing timer.

        * platform/mac/SharedTimerMac.cpp:
        (WebCore::setSharedTimerFiredFunction): Added an assertion.
        (WebCore::setSharedTimerFireTime): Destroy the existing timer and create a new one every time.
        Also create a non-repeating timer rather than a repeating timer.
        (WebCore::stopSharedTimer): Destroy the existing timer rather than setting its fire date
        far into the future.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@12901 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/mac/SharedTimerMac.cpp

index 936fa6d99edb5eda7e3669d241f923a7f4887f70..5fdba75c79b06ae5eab4fc22aa2b47dac1924a1a 100644 (file)
@@ -1,3 +1,23 @@
+2006-02-20  Darin Adler  <darin@apple.com>
+
+        Reviewed by Maciej.
+
+        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=7318
+          REGRESSION: Timer bug causes gif animation and (html and JS) page forwarding to fail
+
+        Timers were stopping firing after a while.
+
+        My testing makes this look like a CFRunLoopTimer bug, and it would be nice to reproduce
+        this with a standalone test and report it to the CF team, but in the mean time, change
+        to create a new timer each time instead of reusing the existing timer.
+
+        * platform/mac/SharedTimerMac.cpp:
+        (WebCore::setSharedTimerFiredFunction): Added an assertion.
+        (WebCore::setSharedTimerFireTime): Destroy the existing timer and create a new one every time.
+        Also create a non-repeating timer rather than a repeating timer.
+        (WebCore::stopSharedTimer): Destroy the existing timer rather than setting its fire date
+        far into the future.
+
 2006-02-19  Darin Adler  <darin@apple.com>
 
         Reviewed by Maciej.
index 57b7985d80b0bc99eac36098cf46514c03de72cf..d9ad15928308ecce258e35b5e92c904790a16ca3 100644 (file)
@@ -36,6 +36,8 @@ static void (*sharedTimerFiredFunction)();
 
 void setSharedTimerFiredFunction(void (*f)())
 {
+    ASSERT(!sharedTimerFiredFunction || sharedTimerFiredFunction == f);
+
     sharedTimerFiredFunction = f;
 }
 
@@ -47,19 +49,24 @@ static void timerFired(CFRunLoopTimerRef, void*)
 void setSharedTimerFireTime(double fireTime)
 {
     ASSERT(sharedTimerFiredFunction);
-    CFAbsoluteTime fireDate = fireTime - kCFAbsoluteTimeIntervalSince1970;
-    if (sharedTimer)
-        CFRunLoopTimerSetNextFireDate(sharedTimer, fireDate);
-    else {
-        sharedTimer = CFRunLoopTimerCreate(0, fireDate, HUGE_VAL, 0, 0, timerFired, 0);
-        CFRunLoopAddTimer(CFRunLoopGetCurrent(), sharedTimer, kCFRunLoopDefaultMode);
+
+    if (sharedTimer) {
+        CFRunLoopTimerInvalidate(sharedTimer);
+        CFRelease(sharedTimer);
     }
+
+    CFAbsoluteTime fireDate = fireTime - kCFAbsoluteTimeIntervalSince1970;
+    sharedTimer = CFRunLoopTimerCreate(0, fireDate, 0, 0, 0, timerFired, 0);
+    CFRunLoopAddTimer(CFRunLoopGetCurrent(), sharedTimer, kCFRunLoopDefaultMode);
 }
 
 void stopSharedTimer()
 {
-    if (sharedTimer)
-        CFRunLoopTimerSetNextFireDate(sharedTimer, HUGE_VAL);
+    if (sharedTimer) {
+        CFRunLoopTimerInvalidate(sharedTimer);
+        CFRelease(sharedTimer);
+        sharedTimer = 0;
+    }
 }
 
 }