| Index: third_party/WebKit/WebCore/dom/WorkerRunLoop.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/dom/WorkerRunLoop.cpp (revision 9118)
|
| +++ third_party/WebKit/WebCore/dom/WorkerRunLoop.cpp (working copy)
|
| @@ -32,26 +32,75 @@
|
|
|
| #if ENABLE(WORKERS)
|
|
|
| +#include "ScriptExecutionContext.h"
|
| +#include "ThreadGlobalData.h"
|
| +#include "ThreadTimers.h"
|
| #include "WorkerRunLoop.h"
|
| #include "WorkerContext.h"
|
| -#include "WorkerTask.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<WorkerTask> task;
|
| - if (!m_messageQueue.waitForMessage(task))
|
| + RefPtr<ScriptExecutionContext::Task> task;
|
| + MessageQueueWaitResult result;
|
| +
|
| + if (m_sharedTimer->isActive())
|
| + result = m_messageQueue.waitForMessageTimed(task, m_sharedTimer->fireTime());
|
| + else
|
| + result = (m_messageQueue.waitForMessage(task) ? MessageQueueMessageReceived : MessageQueueTerminated);
|
| +
|
| + if (result == MessageQueueTerminated)
|
| break;
|
| +
|
| + if (result == MessageQueueMessageReceived)
|
| + task->performTask(context);
|
| + else {
|
| + ASSERT(result == MessageQueueTimeout);
|
| + m_sharedTimer->fire();
|
| + }
|
| + }
|
|
|
| - task->performTask(context);
|
| - }
|
| + threadGlobalData().threadTimers().setSharedTimer(0);
|
| }
|
|
|
| void WorkerRunLoop::terminate()
|
| @@ -59,7 +108,7 @@
|
| m_messageQueue.kill();
|
| }
|
|
|
| -void WorkerRunLoop::postTask(PassRefPtr<WorkerTask> task)
|
| +void WorkerRunLoop::postTask(PassRefPtr<ScriptExecutionContext::Task> task)
|
| {
|
| m_messageQueue.append(task);
|
| }
|
|
|