+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.
void setSharedTimerFiredFunction(void (*f)())
{
+ ASSERT(!sharedTimerFiredFunction || sharedTimerFiredFunction == f);
+
sharedTimerFiredFunction = f;
}
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;
+ }
}
}