Title: [240441] trunk/Source
Revision
240441
Author
you...@apple.com
Date
2019-01-24 10:30:24 -0800 (Thu, 24 Jan 2019)

Log Message

Use MonotonicTime in WorkerRunLoop
https://bugs.webkit.org/show_bug.cgi?id=193417

Reviewed by Saam Barati.

Source/WebCore:

Condition is based on MonotonicTime so MessageQueue should also be based on MonotonicTime.
Ditto for WorkerRunLoop.
No easy way to test the change which should not be easily observable.

* workers/WorkerRunLoop.cpp:
(WebCore::WorkerRunLoop::runInMode):

Source/WTF:

* wtf/MessageQueue.h:
(WTF::MessageQueue<DataType>::waitForMessage):
(WTF::MessageQueue<DataType>::waitForMessageFilteredWithTimeout):

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (240440 => 240441)


--- trunk/Source/WTF/ChangeLog	2019-01-24 18:26:05 UTC (rev 240440)
+++ trunk/Source/WTF/ChangeLog	2019-01-24 18:30:24 UTC (rev 240441)
@@ -1,3 +1,14 @@
+2019-01-24  Youenn Fablet  <you...@apple.com>
+
+        Use MonotonicTime in WorkerRunLoop
+        https://bugs.webkit.org/show_bug.cgi?id=193417
+
+        Reviewed by Saam Barati.
+
+        * wtf/MessageQueue.h:
+        (WTF::MessageQueue<DataType>::waitForMessage):
+        (WTF::MessageQueue<DataType>::waitForMessageFilteredWithTimeout):
+
 2019-01-24  Ross Kirsling  <ross.kirsl...@sony.com>
 
         Move FileSystem to WTF

Modified: trunk/Source/WTF/wtf/MessageQueue.h (240440 => 240441)


--- trunk/Source/WTF/wtf/MessageQueue.h	2019-01-24 18:26:05 UTC (rev 240440)
+++ trunk/Source/WTF/wtf/MessageQueue.h	2019-01-24 18:30:24 UTC (rev 240441)
@@ -34,8 +34,8 @@
 #include <wtf/Condition.h>
 #include <wtf/Deque.h>
 #include <wtf/Lock.h>
+#include <wtf/MonotonicTime.h>
 #include <wtf/Noncopyable.h>
-#include <wtf/WallTime.h>
 
 namespace WTF {
 
@@ -65,7 +65,7 @@
         Deque<std::unique_ptr<DataType>> takeAllMessages();
         std::unique_ptr<DataType> tryGetMessageIgnoringKilled();
         template<typename Predicate>
-        std::unique_ptr<DataType> waitForMessageFilteredWithTimeout(MessageQueueWaitResult&, Predicate&&, WallTime absoluteTime);
+        std::unique_ptr<DataType> waitForMessageFilteredWithTimeout(MessageQueueWaitResult&, Predicate&&, Seconds relativeTimeout);
 
         template<typename Predicate>
         void removeIf(Predicate&&);
@@ -128,7 +128,7 @@
     inline auto MessageQueue<DataType>::waitForMessage() -> std::unique_ptr<DataType>
     {
         MessageQueueWaitResult exitReason; 
-        std::unique_ptr<DataType> result = waitForMessageFilteredWithTimeout(exitReason, [](const DataType&) { return true; }, WallTime::infinity());
+        std::unique_ptr<DataType> result = waitForMessageFilteredWithTimeout(exitReason, [](const DataType&) { return true; }, Seconds::infinity());
         ASSERT(exitReason == MessageQueueTerminated || exitReason == MessageQueueMessageReceived);
         return result;
     }
@@ -135,11 +135,12 @@
 
     template<typename DataType>
     template<typename Predicate>
-    inline auto MessageQueue<DataType>::waitForMessageFilteredWithTimeout(MessageQueueWaitResult& result, Predicate&& predicate, WallTime absoluteTime) -> std::unique_ptr<DataType>
+    inline auto MessageQueue<DataType>::waitForMessageFilteredWithTimeout(MessageQueueWaitResult& result, Predicate&& predicate, Seconds relativeTimeout) -> std::unique_ptr<DataType>
     {
         LockHolder lock(m_mutex);
         bool timedOut = false;
 
+        MonotonicTime absoluteTimeout = MonotonicTime::now() + relativeTimeout;
         auto found = m_queue.end();
         while (!m_killed && !timedOut) {
             found = m_queue.findIf([&predicate](const std::unique_ptr<DataType>& ptr) -> bool {
@@ -149,10 +150,10 @@
             if (found != m_queue.end())
                 break;
 
-            timedOut = !m_condition.waitUntil(m_mutex, absoluteTime);
+            timedOut = !m_condition.waitUntil(m_mutex, absoluteTimeout);
         }
 
-        ASSERT(!timedOut || absoluteTime != WallTime::infinity());
+        ASSERT(!timedOut || absoluteTimeout != MonotonicTime::infinity());
 
         if (m_killed) {
             result = MessageQueueTerminated;

Modified: trunk/Source/WebCore/ChangeLog (240440 => 240441)


--- trunk/Source/WebCore/ChangeLog	2019-01-24 18:26:05 UTC (rev 240440)
+++ trunk/Source/WebCore/ChangeLog	2019-01-24 18:30:24 UTC (rev 240441)
@@ -1,3 +1,17 @@
+2019-01-24  Youenn Fablet  <you...@apple.com>
+
+        Use MonotonicTime in WorkerRunLoop
+        https://bugs.webkit.org/show_bug.cgi?id=193417
+
+        Reviewed by Saam Barati.
+
+        Condition is based on MonotonicTime so MessageQueue should also be based on MonotonicTime.
+        Ditto for WorkerRunLoop.
+        No easy way to test the change which should not be easily observable.
+
+        * workers/WorkerRunLoop.cpp:
+        (WebCore::WorkerRunLoop::runInMode):
+
 2019-01-24  Ross Kirsling  <ross.kirsl...@sony.com>
 
         Move FileSystem to WTF

Modified: trunk/Source/WebCore/workers/WorkerRunLoop.cpp (240440 => 240441)


--- trunk/Source/WebCore/workers/WorkerRunLoop.cpp	2019-01-24 18:26:05 UTC (rev 240440)
+++ trunk/Source/WebCore/workers/WorkerRunLoop.cpp	2019-01-24 18:30:24 UTC (rev 240441)
@@ -49,17 +49,17 @@
 class WorkerSharedTimer final : public SharedTimer {
 public:
     // SharedTimer interface.
-    void setFiredFunction(WTF::Function<void()>&& function) override { m_sharedTimerFunction = WTFMove(function); }
-    void setFireInterval(Seconds interval) override { m_nextFireTime = interval + WallTime::now(); }
-    void stop() override { m_nextFireTime = WallTime(); }
+    void setFiredFunction(WTF::Function<void()>&& function) final { m_sharedTimerFunction = WTFMove(function); }
+    void setFireInterval(Seconds interval) final { m_nextFireTime = MonotonicTime::now() + interval; }
+    void stop() final { m_nextFireTime = MonotonicTime { }; }
 
     bool isActive() { return m_sharedTimerFunction && m_nextFireTime; }
-    WallTime fireTime() { return m_nextFireTime; }
+    Seconds fireTimeDelay() { return std::max(0_s, m_nextFireTime - MonotonicTime::now()); }
     void fire() { m_sharedTimerFunction(); }
 
 private:
     WTF::Function<void()> m_sharedTimerFunction;
-    WallTime m_nextFireTime;
+    MonotonicTime m_nextFireTime;
 };
 
 class ModePredicate {
@@ -176,21 +176,16 @@
         g_main_context_iteration(mainContext, FALSE);
 #endif
 
-    WallTime deadline = WallTime::infinity();
+    Seconds timeoutDelay = Seconds::infinity();
 
 #if USE(CF)
     CFAbsoluteTime nextCFRunLoopTimerFireDate = CFRunLoopGetNextTimerFireDate(CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
     double timeUntilNextCFRunLoopTimerInSeconds = nextCFRunLoopTimerFireDate - CFAbsoluteTimeGetCurrent();
-    deadline = WallTime::now() + std::max(0_s, Seconds(timeUntilNextCFRunLoopTimerInSeconds));
+    timeoutDelay = std::max(0_s, Seconds(timeUntilNextCFRunLoopTimerInSeconds));
 #endif
 
-    WallTime absoluteTime;
-    if (waitMode == WaitForMessage) {
-        if (predicate.isDefaultMode() && m_sharedTimer->isActive())
-            absoluteTime = std::min(deadline, m_sharedTimer->fireTime());
-        else
-            absoluteTime = deadline;
-    }
+    if (waitMode == WaitForMessage && predicate.isDefaultMode() && m_sharedTimer->isActive())
+        timeoutDelay = std::min(timeoutDelay, m_sharedTimer->fireTimeDelay());
 
     if (WorkerScriptController* script = context->script()) {
         script->releaseHeapAccess();
@@ -197,7 +192,7 @@
         script->addTimerSetNotification(timerAddedTask);
     }
     MessageQueueWaitResult result;
-    auto task = m_messageQueue.waitForMessageFilteredWithTimeout(result, predicate, absoluteTime);
+    auto task = m_messageQueue.waitForMessageFilteredWithTimeout(result, predicate, timeoutDelay);
     if (WorkerScriptController* script = context->script()) {
         script->acquireHeapAccess();
         script->removeTimerSetNotification(timerAddedTask);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to