- 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);