Title: [91206] trunk/Source
Revision
91206
Author
[email protected]
Date
2011-07-18 13:38:42 -0700 (Mon, 18 Jul 2011)

Log Message

Timer scheduling should be based off the monotonic clock
https://bugs.webkit.org/show_bug.cgi?id=64544

Patch by James Robinson <[email protected]> on 2011-07-18
Reviewed by Darin Adler.

Source/_javascript_Core:

Switches ThreadCondition::timedWait and related utility functions from currentTime() to
monotonicallyIncreasingTime().

Add WTF::monotonicallyIncreasingTime() to list of exported functions so it can be accessed from WebCore/WebKit.

* _javascript_Core.exp:
* _javascript_Core.vcproj/_javascript_Core/_javascript_Core.def:
* wtf/ThreadingPthreads.cpp:
(WTF::ThreadCondition::timedWait):
* wtf/ThreadingWin.cpp:
(WTF::absoluteTimeToWaitTimeoutInterval):
* wtf/gtk/ThreadingGtk.cpp:
(WTF::ThreadCondition::timedWait):
* wtf/qt/ThreadingQt.cpp:
(WTF::ThreadCondition::timedWait):

Source/WebCore:

Changes the Timer scheduling logic from using absolute values in terms of currentTime() to using relative
intervals in terms of monotonicallyIncreasingTime().  This provides better standards compliance, compatibility,
and predictability when the system clock is adjusted.

No automated tests since there is no way to modify the system clock from DRT.

* platform/SharedTimer.h:
(WebCore::MainThreadSharedTimer::setFireInterval):
* platform/ThreadTimers.cpp:
(WebCore::ThreadTimers::updateSharedTimer):
(WebCore::ThreadTimers::sharedTimerFiredInternal):
* platform/Timer.cpp:
(WebCore::TimerBase::start):
(WebCore::TimerBase::nextFireInterval):
* platform/android/SharedTimerAndroid.cpp:
(WebCore::setSharedTimerFireInterval):
* platform/brew/SharedTimerBrew.cpp:
(WebCore::setSharedTimerFireInterval):
* platform/chromium/PlatformBridge.h:
* platform/chromium/SharedTimerChromium.cpp:
(WebCore::setSharedTimerFireInterval):
* platform/efl/SharedTimerEfl.cpp:
(WebCore::addNewTimer):
(WebCore::setSharedTimerFireInterval):
* platform/gtk/SharedTimerGtk.cpp:
(WebCore::setSharedTimerFireInterval):
* platform/haiku/SharedTimerHaiku.cpp:
(WebCore::SharedTimerHaiku::start):
(WebCore::setSharedTimerFireInterval):
* platform/mac/SharedTimerMac.mm:
(WebCore::setSharedTimerFireInterval):
* platform/qt/SharedTimerQt.cpp:
(WebCore::SharedTimerQt::start):
(WebCore::setSharedTimerFireInterval):
* platform/win/SharedTimerWin.cpp:
(WebCore::setSharedTimerFireInterval):
* platform/wince/SharedTimerWinCE.cpp:
(WebCore::setSharedTimerFireInterval):
* platform/wx/SharedTimerWx.cpp:
(WebCore::setSharedTimerFireInterval):
* workers/WorkerRunLoop.cpp:
(WebCore::WorkerSharedTimer::setFireInterval):

Source/WebKit/chromium:

Renames setSharedTimerFireTime to setSharedTimerFireInterval to be consistent with WebCore.

* public/WebKitClient.h:
(WebKit::WebKitClient::setSharedTimerFireInterval):
* src/PlatformBridge.cpp:
(WebCore::PlatformBridge::setSharedTimerFireInterval):

Source/WebKit2:

Converts the WebKit2 RunLoop and CoreIPC timeouts to use monotonicallyIncreasingTime().

* Platform/CoreIPC/Connection.cpp:
(CoreIPC::Connection::waitForMessage):
(CoreIPC::Connection::waitForSyncReply):
* Platform/RunLoop.h:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (91205 => 91206)


--- trunk/Source/_javascript_Core/ChangeLog	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-07-18 20:38:42 UTC (rev 91206)
@@ -1,3 +1,26 @@
+2011-07-18  James Robinson  <[email protected]>
+
+        Timer scheduling should be based off the monotonic clock
+        https://bugs.webkit.org/show_bug.cgi?id=64544
+
+        Reviewed by Darin Adler.
+
+        Switches ThreadCondition::timedWait and related utility functions from currentTime() to
+        monotonicallyIncreasingTime().
+
+        Add WTF::monotonicallyIncreasingTime() to list of exported functions so it can be accessed from WebCore/WebKit.
+
+        * _javascript_Core.exp:
+        * _javascript_Core.vcproj/_javascript_Core/_javascript_Core.def:
+        * wtf/ThreadingPthreads.cpp:
+        (WTF::ThreadCondition::timedWait):
+        * wtf/ThreadingWin.cpp:
+        (WTF::absoluteTimeToWaitTimeoutInterval):
+        * wtf/gtk/ThreadingGtk.cpp:
+        (WTF::ThreadCondition::timedWait):
+        * wtf/qt/ThreadingQt.cpp:
+        (WTF::ThreadCondition::timedWait):
+
 2011-07-18  Filip Pizlo  <[email protected]>
 
         JSC JIT does not inline GC allocation fast paths

Modified: trunk/Source/_javascript_Core/_javascript_Core.exp (91205 => 91206)


--- trunk/Source/_javascript_Core/_javascript_Core.exp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/_javascript_Core/_javascript_Core.exp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -449,6 +449,7 @@
 __ZN3WTF23callOnMainThreadAndWaitEPFvPvES0_
 __ZN3WTF23dayInMonthFromDayInYearEib
 __ZN3WTF23waitForThreadCompletionEjPPv
+__ZN3WTF27monotonicallyIncreasingTimeEv
 __ZN3WTF27releaseFastMallocFreeMemoryEv
 __ZN3WTF28setMainThreadCallbacksPausedEb
 __ZN3WTF29cryptographicallyRandomNumberEv

Modified: trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def (91205 => 91206)


--- trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def	2011-07-18 20:38:42 UTC (rev 91206)
@@ -240,6 +240,7 @@
     ?lookupGetter@JSObject@JSC@@UAE?AVJSValue@2@PAVExecState@2@ABVIdentifier@2@@Z
     ?lookupSetter@JSObject@JSC@@UAE?AVJSValue@2@PAVExecState@2@ABVIdentifier@2@@Z
     ?materializePropertyMap@Structure@JSC@@AAEXAAVJSGlobalData@2@@Z
+    ?monotonicallyIncreasingTime@WTF@@YANXZ
     ?monthFromDayInYear@WTF@@YAHH_N@Z
     ?msToYear@WTF@@YAHN@Z
     ?name@InternalFunction@JSC@@QAEABVUString@2@PAVExecState@2@@Z

Modified: trunk/Source/_javascript_Core/wtf/ThreadingPthreads.cpp (91205 => 91206)


--- trunk/Source/_javascript_Core/wtf/ThreadingPthreads.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/_javascript_Core/wtf/ThreadingPthreads.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -363,7 +363,7 @@
 
 bool ThreadCondition::timedWait(Mutex& mutex, double absoluteTime)
 {
-    if (absoluteTime < currentTime())
+    if (absoluteTime < monotonicallyIncreasingTime())
         return false;
 
     if (absoluteTime > INT_MAX) {

Modified: trunk/Source/_javascript_Core/wtf/ThreadingWin.cpp (91205 => 91206)


--- trunk/Source/_javascript_Core/wtf/ThreadingWin.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/_javascript_Core/wtf/ThreadingWin.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -483,7 +483,7 @@
 
 DWORD absoluteTimeToWaitTimeoutInterval(double absoluteTime)
 {
-    double currentTime = WTF::currentTime();
+    double currentTime = monotonicallyIncreasingTime();
 
     // Time is in the past - return immediately.
     if (absoluteTime < currentTime)

Modified: trunk/Source/_javascript_Core/wtf/gtk/ThreadingGtk.cpp (91205 => 91206)


--- trunk/Source/_javascript_Core/wtf/gtk/ThreadingGtk.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/_javascript_Core/wtf/gtk/ThreadingGtk.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -213,7 +213,7 @@
 bool ThreadCondition::timedWait(Mutex& mutex, double absoluteTime)
 {
     // Time is in the past - return right away.
-    if (absoluteTime < currentTime())
+    if (absoluteTime < monotonicallyIncreasingTime())
         return false;
     
     // Time is too far in the future for g_cond_timed_wait - wait forever.

Modified: trunk/Source/_javascript_Core/wtf/qt/ThreadingQt.cpp (91205 => 91206)


--- trunk/Source/_javascript_Core/wtf/qt/ThreadingQt.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/_javascript_Core/wtf/qt/ThreadingQt.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -255,7 +255,7 @@
 
 bool ThreadCondition::timedWait(Mutex& mutex, double absoluteTime)
 {
-    double currentTime = WTF::currentTime();
+    double currentTime = monotonicallyIncreasingTime();
 
     // Time is in the past - return immediately.
     if (absoluteTime < currentTime)

Modified: trunk/Source/WebCore/ChangeLog (91205 => 91206)


--- trunk/Source/WebCore/ChangeLog	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/ChangeLog	2011-07-18 20:38:42 UTC (rev 91206)
@@ -1,3 +1,53 @@
+2011-07-18  James Robinson  <[email protected]>
+
+        Timer scheduling should be based off the monotonic clock
+        https://bugs.webkit.org/show_bug.cgi?id=64544
+
+        Reviewed by Darin Adler.
+
+        Changes the Timer scheduling logic from using absolute values in terms of currentTime() to using relative
+        intervals in terms of monotonicallyIncreasingTime().  This provides better standards compliance, compatibility,
+        and predictability when the system clock is adjusted.
+
+        No automated tests since there is no way to modify the system clock from DRT.
+
+        * platform/SharedTimer.h:
+        (WebCore::MainThreadSharedTimer::setFireInterval):
+        * platform/ThreadTimers.cpp:
+        (WebCore::ThreadTimers::updateSharedTimer):
+        (WebCore::ThreadTimers::sharedTimerFiredInternal):
+        * platform/Timer.cpp:
+        (WebCore::TimerBase::start):
+        (WebCore::TimerBase::nextFireInterval):
+        * platform/android/SharedTimerAndroid.cpp:
+        (WebCore::setSharedTimerFireInterval):
+        * platform/brew/SharedTimerBrew.cpp:
+        (WebCore::setSharedTimerFireInterval):
+        * platform/chromium/PlatformBridge.h:
+        * platform/chromium/SharedTimerChromium.cpp:
+        (WebCore::setSharedTimerFireInterval):
+        * platform/efl/SharedTimerEfl.cpp:
+        (WebCore::addNewTimer):
+        (WebCore::setSharedTimerFireInterval):
+        * platform/gtk/SharedTimerGtk.cpp:
+        (WebCore::setSharedTimerFireInterval):
+        * platform/haiku/SharedTimerHaiku.cpp:
+        (WebCore::SharedTimerHaiku::start):
+        (WebCore::setSharedTimerFireInterval):
+        * platform/mac/SharedTimerMac.mm:
+        (WebCore::setSharedTimerFireInterval):
+        * platform/qt/SharedTimerQt.cpp:
+        (WebCore::SharedTimerQt::start):
+        (WebCore::setSharedTimerFireInterval):
+        * platform/win/SharedTimerWin.cpp:
+        (WebCore::setSharedTimerFireInterval):
+        * platform/wince/SharedTimerWinCE.cpp:
+        (WebCore::setSharedTimerFireInterval):
+        * platform/wx/SharedTimerWx.cpp:
+        (WebCore::setSharedTimerFireInterval):
+        * workers/WorkerRunLoop.cpp:
+        (WebCore::WorkerSharedTimer::setFireInterval):
+
 2011-07-18  Pratik Solanki  <[email protected]>
 
         Unreviewed. Fix Windows build. Move static function defaultSessionCookieStorage() to before

Modified: trunk/Source/WebCore/platform/SharedTimer.h (91205 => 91206)


--- trunk/Source/WebCore/platform/SharedTimer.h	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/SharedTimer.h	2011-07-18 20:38:42 UTC (rev 91206)
@@ -41,9 +41,8 @@
         virtual ~SharedTimer() {}
         virtual void setFiredFunction(void (*)()) = 0;
 
-        // The fire time is relative to the classic POSIX epoch of January 1, 1970,
-        // as the result of currentTime() is.
-        virtual void setFireTime(double) = 0;
+        // The fire interval is in seconds relative to the current monotonic clock time.
+        virtual void setFireInterval(double) = 0;
         virtual void stop() = 0;
     };
 
@@ -51,7 +50,7 @@
     // Implemented by port (since it provides the run loop for the main thread).
     // FIXME: make ports implement MainThreadSharedTimer directly instead.
     void setSharedTimerFiredFunction(void (*)());
-    void setSharedTimerFireTime(double);
+    void setSharedTimerFireInterval(double);
     void stopSharedTimer();
 
     // Implementation of SharedTimer for the main thread.
@@ -62,9 +61,9 @@
             setSharedTimerFiredFunction(function);
         }
         
-        virtual void setFireTime(double fireTime)
+        virtual void setFireInterval(double interval)
         {
-            setSharedTimerFireTime(fireTime);
+            setSharedTimerFireInterval(interval);
         }
         
         virtual void stop()

Modified: trunk/Source/WebCore/platform/ThreadTimers.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/ThreadTimers.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/ThreadTimers.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -32,6 +32,8 @@
 #include "Timer.h"
 #include <wtf/CurrentTime.h>
 
+using namespace std;
+
 namespace WebCore {
 
 // Fire timers for this length of time, and then quit to let the run loop process user input events.
@@ -81,7 +83,7 @@
     if (m_firingTimers || m_timerHeap.isEmpty())
         m_sharedTimer->stop();
     else
-        m_sharedTimer->setFireTime(m_timerHeap.first()->m_nextFireTime);
+        m_sharedTimer->setFireInterval(max(m_timerHeap.first()->m_nextFireTime - monotonicallyIncreasingTime(), 0.0));
 }
 
 void ThreadTimers::sharedTimerFired()
@@ -97,7 +99,7 @@
         return;
     m_firingTimers = true;
 
-    double fireTime = currentTime();
+    double fireTime = monotonicallyIncreasingTime();
     double timeToQuit = fireTime + maxDurationOfFiringTimers;
 
     while (!m_timerHeap.isEmpty() && m_timerHeap.first()->m_nextFireTime <= fireTime) {
@@ -112,7 +114,7 @@
         timer->fired();
 
         // Catch the case where the timer asked timers to fire in a nested event loop, or we are over time limit.
-        if (!m_firingTimers || timeToQuit < currentTime())
+        if (!m_firingTimers || timeToQuit < monotonicallyIncreasingTime())
             break;
     }
 

Modified: trunk/Source/WebCore/platform/Timer.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/Timer.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/Timer.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -181,7 +181,7 @@
     ASSERT(m_thread == currentThread());
 
     m_repeatInterval = repeatInterval;
-    setNextFireTime(currentTime() + nextFireInterval);
+    setNextFireTime(monotonicallyIncreasingTime() + nextFireInterval);
 }
 
 void TimerBase::stop()
@@ -199,7 +199,7 @@
 double TimerBase::nextFireInterval() const
 {
     ASSERT(isActive());
-    double current = currentTime();
+    double current = monotonicallyIncreasingTime();
     if (m_nextFireTime < current)
         return 0;
     return m_nextFireTime - current;

Modified: trunk/Source/WebCore/platform/android/SharedTimerAndroid.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/android/SharedTimerAndroid.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/android/SharedTimerAndroid.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -45,13 +45,11 @@
         JavaSharedClient::GetTimerClient()->setSharedTimerCallback(f);
 }
 
-// The fire time is relative to the classic POSIX epoch of January 1, 1970,
-// as the result of currentTime() is.
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double interval)
 {
-    long long timeInMs = static_cast<long long>((fireTime - WTF::currentTime()) * 1000);
+    long long timeInMs = static_cast<long long>(interval * 1000);
 
-    LOGV("setSharedTimerFireTime: in %ld millisec", timeInMs);
+    LOGV("setSharedTimerFireInterval: in %ld millisec", timeInMs);
     if (JavaSharedClient::GetTimerClient())
         JavaSharedClient::GetTimerClient()->setSharedTimer(timeInMs);
 }

Modified: trunk/Source/WebCore/platform/brew/SharedTimerBrew.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/brew/SharedTimerBrew.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/brew/SharedTimerBrew.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -48,22 +48,14 @@
     sharedTimerFiredFunction = f;
 }
 
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double interval)
 {
     ASSERT(sharedTimerFiredFunction);
 
     CALLBACK_Cancel(&sharedTimerCallback);
 
-    double interval = fireTime - currentTime();
-    int intervalInMS;
+    int intervalInMS = statit_cast<int>(interval * 1000);
 
-    if (interval < 0)
-        intervalInMS = 0;
-    else {
-        interval *= 1000;
-        intervalInMS = static_cast<int>(interval);
-    }
-
     sharedTimerCallback.pfnCancel = 0;
     sharedTimerCallback.pfnNotify = invokeCallback;
     sharedTimerCallback.pNotifyData = 0;

Modified: trunk/Source/WebCore/platform/chromium/PlatformBridge.h (91205 => 91206)


--- trunk/Source/WebCore/platform/chromium/PlatformBridge.h	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/chromium/PlatformBridge.h	2011-07-18 20:38:42 UTC (rev 91206)
@@ -234,7 +234,7 @@
 
     // SharedTimers -------------------------------------------------------
     static void setSharedTimerFiredFunction(void (*func)());
-    static void setSharedTimerFireTime(double);
+    static void setSharedTimerFireInterval(double);
     static void stopSharedTimer();
 
     // StatsCounters ------------------------------------------------------

Modified: trunk/Source/WebCore/platform/chromium/SharedTimerChromium.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/chromium/SharedTimerChromium.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/chromium/SharedTimerChromium.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -35,9 +35,9 @@
     PlatformBridge::setSharedTimerFiredFunction(f);
 }
 
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double fireTime)
 {
-    PlatformBridge::setSharedTimerFireTime(fireTime);
+    PlatformBridge::setSharedTimerFireInterval(fireTime);
 }
 
 void stopSharedTimer()

Modified: trunk/Source/WebCore/platform/efl/SharedTimerEfl.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/efl/SharedTimerEfl.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/efl/SharedTimerEfl.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -62,17 +62,16 @@
     }
 }
 
-void addNewTimer(double fireTime)
+void addNewTimer(double interval)
 {
-    double interval = fireTime - currentTime();
     stopSharedTimer();
 
     _sharedTimer = ecore_timer_loop_add(interval, timerEvent, 0);
 }
 
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double interval)
 {
-    addNewTimer(fireTime);
+    addNewTimer(interval);
 }
 
 }

Modified: trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -50,18 +50,11 @@
     return FALSE;
 }
 
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double interval)
 {
     ASSERT(sharedTimerFiredFunction);
 
-    double interval = fireTime - currentTime();
-    guint intervalInMS;
-    if (interval < 0)
-        intervalInMS = 0;
-    else {
-        interval *= 1000;
-        intervalInMS = (guint)interval;
-    }
+    guint intervalInMS = static_cast<guint>(interval * 1000);
 
     stopSharedTimer();
     sharedTimer = g_timeout_add_full(GDK_PRIORITY_REDRAW, intervalInMS, timeout_cb, 0, 0);

Modified: trunk/Source/WebCore/platform/haiku/SharedTimerHaiku.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/haiku/SharedTimerHaiku.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/haiku/SharedTimerHaiku.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -82,12 +82,11 @@
     return timer;
 }
 
-void SharedTimerHaiku::start(double fireTime)
+void SharedTimerHaiku::start(double intervalInSeconds)
 {
     m_shouldRun = true;
 
-    double intervalInSeconds = fireTime - currentTime();
-    bigtime_t intervalInMicroSeconds = intervalInSeconds < 0 ? 0 : intervalInSeconds * 1000000;
+    bigtime_t intervalInMicroSeconds = intervalInSeconds * 1000000;
 
     BMessageRunner::StartSending(Looper(), new BMessage(FIRE_MESSAGE), intervalInMicroSeconds, 1);
 }
@@ -111,9 +110,9 @@
     SharedTimerHaiku::instance()->m_timerFunction = f;
 }
 
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double interval)
 {
-    SharedTimerHaiku::instance()->start(fireTime);
+    SharedTimerHaiku::instance()->start(interval);
 }
 
 void stopSharedTimer()

Modified: trunk/Source/WebCore/platform/mac/SharedTimerMac.mm (91205 => 91206)


--- trunk/Source/WebCore/platform/mac/SharedTimerMac.mm	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/mac/SharedTimerMac.mm	2011-07-18 20:38:42 UTC (rev 91206)
@@ -167,7 +167,7 @@
     [pool drain];
 }
 
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double interval)
 {
     ASSERT(sharedTimerFiredFunction);
 
@@ -176,7 +176,7 @@
         CFRelease(sharedTimer);
     }
 
-    CFAbsoluteTime fireDate = fireTime - kCFAbsoluteTimeIntervalSince1970;
+    CFAbsoluteTime fireDate = CFAbsoluteTimeGetCurrent() + interval;
     sharedTimer = CFRunLoopTimerCreate(0, fireDate, 0, 0, 0, timerFired, 0);
     CFRunLoopAddTimer(CFRunLoopGetCurrent(), sharedTimer, kCFRunLoopCommonModes);
     

Modified: trunk/Source/WebCore/platform/qt/SharedTimerQt.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/qt/SharedTimerQt.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/qt/SharedTimerQt.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -92,16 +92,9 @@
     return timer;
 }
 
-void SharedTimerQt::start(double fireTime)
+void SharedTimerQt::start(double interval)
 {
-    double interval = fireTime - currentTime();
-    unsigned int intervalInMS;
-    if (interval < 0)
-        intervalInMS = 0;
-    else {
-        interval *= 1000;
-        intervalInMS = (unsigned int)interval;
-    }
+    unsigned int intervalInMS = static_cast<unsigned int>(interval * 1000);
 
     m_timer.start(intervalInMS, this);
 }
@@ -128,12 +121,12 @@
     SharedTimerQt::inst()->m_timerFunction = f;
 }
 
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double interval)
 {
     if (!QCoreApplication::instance())
         return;
 
-    SharedTimerQt::inst()->start(fireTime);
+    SharedTimerQt::inst()->start(interval);
 }
 
 void stopSharedTimer()

Modified: trunk/Source/WebCore/platform/win/SharedTimerWin.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/win/SharedTimerWin.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/win/SharedTimerWin.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -146,21 +146,16 @@
         PostMessage(timerWindowHandle, timerFiredMessage, 0, 0);
 }
 
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double interval)
 {
     ASSERT(sharedTimerFiredFunction);
 
-    double interval = fireTime - currentTime();
     unsigned intervalInMS;
-    if (interval < 0)
-        intervalInMS = 0;
-    else {
-        interval *= 1000;
-        if (interval > USER_TIMER_MAXIMUM)
-            intervalInMS = USER_TIMER_MAXIMUM;
-        else
-            intervalInMS = (unsigned)interval;
-    }
+    interval *= 1000;
+    if (interval > USER_TIMER_MAXIMUM)
+        intervalInMS = USER_TIMER_MAXIMUM;
+    else
+        intervalInMS = static_cast<unsigned>(interval);
 
     initializeOffScreenTimerWindow();
     bool timerSet = false;

Modified: trunk/Source/WebCore/platform/wince/SharedTimerWinCE.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/wince/SharedTimerWinCE.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/wince/SharedTimerWinCE.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -88,16 +88,16 @@
 #define USER_TIMER_MAXIMUM  0x7FFFFFFF
 #define USER_TIMER_MINIMUM  0x0000000A
 
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double intervalSeconds)
 {
     ASSERT(sharedTimerFiredFunction);
 
-    double interval = (fireTime - currentTime()) * 1000.;
-    unsigned intervalInMS = interval < USER_TIMER_MINIMUM
+    double intervalMS = intervalSeconds * 1000.;
+    unsigned clampedIntervalMS = intervalMS < USER_TIMER_MINIMUM
         ? USER_TIMER_MINIMUM
-        : interval > USER_TIMER_MAXIMUM
+        : intervalMS > USER_TIMER_MAXIMUM
         ? USER_TIMER_MAXIMUM
-        : static_cast<unsigned>(interval);
+        : static_cast<unsigned>(intervalMS);
 
     if (timerID == TimerIdAuto) {
         KillTimer(timerWindowHandle, TimerIdAuto);
@@ -105,7 +105,7 @@
     }
 
     initializeOffScreenTimerWindow();
-    if (SetTimer(timerWindowHandle, TimerIdAuto, intervalInMS, 0))
+    if (SetTimer(timerWindowHandle, TimerIdAuto, clampedIntervalMS, 0))
         timerID = TimerIdAuto;
     else if (timerID != TimerIdManual)
         PostMessage(timerWindowHandle, WM_USER, 0, 0);

Modified: trunk/Source/WebCore/platform/wx/SharedTimerWx.cpp (91205 => 91206)


--- trunk/Source/WebCore/platform/wx/SharedTimerWx.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/platform/wx/SharedTimerWx.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -67,12 +67,10 @@
     sharedTimerFiredFunction = f;
 }
 
-void setSharedTimerFireTime(double fireTime)
+void setSharedTimerFireInterval(double interval)
 {
     ASSERT(sharedTimerFiredFunction);
     
-    double interval = fireTime - currentTime();
-    
     if (!wkTimer)
         wkTimer = new WebKitTimer();
         

Modified: trunk/Source/WebCore/workers/WorkerRunLoop.cpp (91205 => 91206)


--- trunk/Source/WebCore/workers/WorkerRunLoop.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebCore/workers/WorkerRunLoop.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -39,6 +39,7 @@
 #include "WorkerRunLoop.h"
 #include "WorkerContext.h"
 #include "WorkerThread.h"
+#include <wtf/CurrentTime.h>
 
 namespace WebCore {
 
@@ -52,7 +53,7 @@
 
     // SharedTimer interface.
     virtual void setFiredFunction(void (*function)()) { m_sharedTimerFunction = function; }
-    virtual void setFireTime(double fireTime) { m_nextFireTime = fireTime; }
+    virtual void setFireInterval(double interval) { m_nextFireTime = interval + monotonicallyIncreasingTime(); }
     virtual void stop() { m_nextFireTime = 0; }
 
     bool isActive() { return m_sharedTimerFunction && m_nextFireTime; }

Modified: trunk/Source/WebKit/chromium/ChangeLog (91205 => 91206)


--- trunk/Source/WebKit/chromium/ChangeLog	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebKit/chromium/ChangeLog	2011-07-18 20:38:42 UTC (rev 91206)
@@ -1,3 +1,17 @@
+2011-07-18  James Robinson  <[email protected]>
+
+        Timer scheduling should be based off the monotonic clock
+        https://bugs.webkit.org/show_bug.cgi?id=64544
+
+        Reviewed by Darin Adler.
+
+        Renames setSharedTimerFireTime to setSharedTimerFireInterval to be consistent with WebCore.
+
+        * public/WebKitClient.h:
+        (WebKit::WebKitClient::setSharedTimerFireInterval):
+        * src/PlatformBridge.cpp:
+        (WebCore::PlatformBridge::setSharedTimerFireInterval):
+
 2011-07-18  Yuzhu Shen  <[email protected]>
 
         Reviewed by James Robinson.

Modified: trunk/Source/WebKit/chromium/public/WebKitClient.h (91205 => 91206)


--- trunk/Source/WebKit/chromium/public/WebKitClient.h	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebKit/chromium/public/WebKitClient.h	2011-07-18 20:38:42 UTC (rev 91206)
@@ -47,6 +47,9 @@
 typedef void *HANDLE;
 #endif
 
+// FIXME: remove after rolling deps
+#define WEBKIT_USE_MONOTONIC_CLOCK_FOR_TIMER_SCHEDULING
+
 namespace WebKit {
 
 class WebApplicationCacheHost;
@@ -280,7 +283,7 @@
     // Delayed work is driven by a shared timer.
     typedef void (*SharedTimerFunction)();
     virtual void setSharedTimerFiredFunction(SharedTimerFunction timerFunction) { }
-    virtual void setSharedTimerFireTime(double fireTime) { }
+    virtual void setSharedTimerFireInterval(double) { }
     virtual void stopSharedTimer() { }
 
     // Callable from a background WebKit thread.

Modified: trunk/Source/WebKit/chromium/src/PlatformBridge.cpp (91205 => 91206)


--- trunk/Source/WebKit/chromium/src/PlatformBridge.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebKit/chromium/src/PlatformBridge.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -665,9 +665,9 @@
     webKitClient()->setSharedTimerFiredFunction(func);
 }
 
-void PlatformBridge::setSharedTimerFireTime(double fireTime)
+void PlatformBridge::setSharedTimerFireInterval(double interval)
 {
-    webKitClient()->setSharedTimerFireTime(fireTime);
+    webKitClient()->setSharedTimerFireInterval(interval);
 }
 
 void PlatformBridge::stopSharedTimer()

Modified: trunk/Source/WebKit2/ChangeLog (91205 => 91206)


--- trunk/Source/WebKit2/ChangeLog	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebKit2/ChangeLog	2011-07-18 20:38:42 UTC (rev 91206)
@@ -1,3 +1,17 @@
+2011-07-18  James Robinson  <[email protected]>
+
+        Timer scheduling should be based off the monotonic clock
+        https://bugs.webkit.org/show_bug.cgi?id=64544
+
+        Reviewed by Darin Adler.
+
+        Converts the WebKit2 RunLoop and CoreIPC timeouts to use monotonicallyIncreasingTime().
+
+        * Platform/CoreIPC/Connection.cpp:
+        (CoreIPC::Connection::waitForMessage):
+        (CoreIPC::Connection::waitForSyncReply):
+        * Platform/RunLoop.h:
+
 2011-07-18  Anders Carlsson  <[email protected]>
 
         Make using lowercase parameter names for AppleConnect be a plug-in quirk

Modified: trunk/Source/WebKit2/Platform/CoreIPC/Connection.cpp (91205 => 91206)


--- trunk/Source/WebKit2/Platform/CoreIPC/Connection.cpp	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebKit2/Platform/CoreIPC/Connection.cpp	2011-07-18 20:38:42 UTC (rev 91206)
@@ -344,7 +344,7 @@
         }
     }
     
-    double absoluteTime = currentTime() + timeout;
+    double absoluteTime = monotonicallyIncreasingTime() + timeout;
     
     std::pair<unsigned, uint64_t> messageAndDestination(std::make_pair(messageID.toInt(), destinationID));
     
@@ -435,7 +435,7 @@
     if (timeout == NoTimeout)
         timeout = 1e10;
 
-    double absoluteTime = currentTime() + timeout;
+    double absoluteTime = monotonicallyIncreasingTime() + timeout;
 
     bool timedOut = false;
     while (!timedOut) {

Modified: trunk/Source/WebKit2/Platform/RunLoop.h (91205 => 91206)


--- trunk/Source/WebKit2/Platform/RunLoop.h	2011-07-18 20:36:31 UTC (rev 91205)
+++ trunk/Source/WebKit2/Platform/RunLoop.h	2011-07-18 20:38:42 UTC (rev 91206)
@@ -58,8 +58,7 @@
     void scheduleWork(PassOwnPtr<WorkItem>);
 
 #if PLATFORM(WIN)
-    // The absoluteTime is in seconds, starting on January 1, 1970. The time is assumed to use the
-    // same time zone as WTF::currentTime(). Dispatches sent (not posted) messages to the passed-in
+    // The absoluteTime is in seconds in terms of the monotonic clock. Dispatches sent (not posted) messages to the passed-in
     // set of HWNDs until the semaphore is signaled or absoluteTime is reached. Returns true if the
     // semaphore is signaled, false otherwise.
     static bool dispatchSentMessagesUntil(const Vector<HWND>& windows, CoreIPC::BinarySemaphore&, double absoluteTime);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to