X-Git-Url: https://git.webkit.org/?p=WebKit-https.git;a=blobdiff_plain;f=WebCore%2Fdom%2FWorkerRunLoop.cpp;h=6a9ebb3ab00ec5d843832f3b971520c51434be35;hp=e929b7bc16b2eb4e033bb429b4cef35a3f91e232;hb=20b52633c8d4a5aa7362f3ccb9e4e550448dc2da;hpb=7b0ffc7d53905240d6d387c967a3d6f16c6b3260 diff --git a/WebCore/dom/WorkerRunLoop.cpp b/WebCore/dom/WorkerRunLoop.cpp index e929b7bc16b2..6a9ebb3ab00e 100644 --- a/WebCore/dom/WorkerRunLoop.cpp +++ b/WebCore/dom/WorkerRunLoop.cpp @@ -33,25 +33,75 @@ #if ENABLE(WORKERS) #include "ScriptExecutionContext.h" +#include "SharedTimer.h" +#include "ThreadGlobalData.h" +#include "ThreadTimers.h" #include "WorkerRunLoop.h" #include "WorkerContext.h" #include "WorkerThread.h" namespace WebCore { +class WorkerSharedTimer : public SharedTimer { +public: + WorkerSharedTimer() + : m_sharedTimerFunction(0) + , m_nextFireTime(0) + { + } + + // SharedTimer interface. + virtual void setFiredFunction(void (*function)()) { m_sharedTimerFunction = function; } + virtual void setFireTime(double fireTime) { m_nextFireTime = fireTime; } + virtual void stop() { m_nextFireTime = 0; } + + bool isActive() { return m_sharedTimerFunction && m_nextFireTime; } + double fireTime() { return m_nextFireTime; } + void fire() { m_sharedTimerFunction(); } + +private: + void (*m_sharedTimerFunction)(); + double m_nextFireTime; +}; + +WorkerRunLoop::WorkerRunLoop() + : m_sharedTimer(new WorkerSharedTimer) +{ +} + +WorkerRunLoop::~WorkerRunLoop() +{ +} + void WorkerRunLoop::run(WorkerContext* context) { ASSERT(context); ASSERT(context->thread()); ASSERT(context->thread()->threadID() == currentThread()); - + + threadGlobalData().threadTimers().setSharedTimer(m_sharedTimer.get()); + while (true) { RefPtr task; - if (!m_messageQueue.waitForMessage(task)) - break; + MessageQueueWaitResult result; + + if (m_sharedTimer->isActive()) + result = m_messageQueue.waitForMessageTimed(task, m_sharedTimer->fireTime()); + else + result = (m_messageQueue.waitForMessage(task) ? MessageQueueMessageReceived : MessageQueueTerminated); - task->performTask(context); + if (result == MessageQueueTerminated) + break; + + if (result == MessageQueueMessageReceived) + task->performTask(context); + else { + ASSERT(result == MessageQueueTimeout); + m_sharedTimer->fire(); + } } + + threadGlobalData().threadTimers().setSharedTimer(0); } void WorkerRunLoop::terminate()