| Index: Source/platform/scheduler/Scheduler.cpp
|
| diff --git a/Source/platform/scheduler/Scheduler.cpp b/Source/platform/scheduler/Scheduler.cpp
|
| index 8e4ea26fbf2beab4678426a881d7779c7d0afa28..a5fd7ce7c4e45a18316a3b6dc7ff7bbba81a5af1 100644
|
| --- a/Source/platform/scheduler/Scheduler.cpp
|
| +++ b/Source/platform/scheduler/Scheduler.cpp
|
| @@ -139,6 +139,7 @@ void Scheduler::didCommitFrameToCompositor()
|
| {
|
| ASSERT(isMainThread());
|
| m_currentFrameCommitted = true;
|
| + flushIncomingIdleTasks();
|
| maybePostMainThreadPendingIdleTask();
|
| }
|
|
|
| @@ -157,8 +158,8 @@ void Scheduler::didRunHighPriorityTask()
|
|
|
| void Scheduler::postIdleTaskInternal(const TraceLocation& location, const IdleTask& idleTask, const char* traceName)
|
| {
|
| - Locker<Mutex> lock(m_pendingIdleTasksMutex);
|
| - m_pendingIdleTasks.append(internal::TracedIdleTask::Create(idleTask, location, traceName));
|
| + Locker<Mutex> lock(m_incomingIdleTasksMutex);
|
| + m_incomingIdleTasks.append(internal::TracedIdleTask::Create(idleTask, location, traceName));
|
| }
|
|
|
| void Scheduler::postTask(const TraceLocation& location, const Task& task)
|
| @@ -200,7 +201,6 @@ bool Scheduler::maybePostMainThreadPendingIdleTask()
|
| ASSERT(isMainThread());
|
| TRACE_EVENT0("blink", "Scheduler::maybePostMainThreadPendingIdleTask");
|
| if (canRunIdleTask()) {
|
| - Locker<Mutex> lock(m_pendingIdleTasksMutex);
|
| if (!m_pendingIdleTasks.isEmpty()) {
|
| m_mainThread->postTask(new MainThreadPendingIdleTaskRunner());
|
| return true;
|
| @@ -263,18 +263,19 @@ bool Scheduler::shouldYieldForHighPriorityWork() const
|
| bool Scheduler::maybeRunPendingIdleTask()
|
| {
|
| ASSERT(isMainThread());
|
| - if (!canRunIdleTask())
|
| + if (!canRunIdleTask() || m_pendingIdleTasks.isEmpty())
|
| return false;
|
|
|
| - takeFirstPendingIdleTask()->run();
|
| + m_pendingIdleTasks.takeFirst()->run();
|
| return true;
|
| }
|
|
|
| -PassOwnPtr<internal::TracedIdleTask> Scheduler::takeFirstPendingIdleTask()
|
| +void Scheduler::flushIncomingIdleTasks()
|
| {
|
| - Locker<Mutex> lock(m_pendingIdleTasksMutex);
|
| - ASSERT(!m_pendingIdleTasks.isEmpty());
|
| - return m_pendingIdleTasks.takeFirst();
|
| + ASSERT(isMainThread());
|
| + Locker<Mutex> lock(m_incomingIdleTasksMutex);
|
| + while (!m_incomingIdleTasks.isEmpty())
|
| + m_pendingIdleTasks.append(m_incomingIdleTasks.takeFirst());
|
| }
|
|
|
| double Scheduler::currentFrameDeadlineForIdleTasks() const
|
|
|