Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
| diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
| index 8ad3792e25302071d35e9993538318000014bf8b..16a7ec8d1675e1acee1e2f124425344c020eda90 100644 |
| --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
| +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc |
| @@ -154,8 +154,11 @@ TaskQueueImpl::MainThreadOnly::MainThreadOnly( |
| TimeDomain* time_domain) |
| : task_queue_manager(task_queue_manager), |
| time_domain(time_domain), |
| - delayed_work_queue(new WorkQueue(task_queue, "delayed")), |
| - immediate_work_queue(new WorkQueue(task_queue, "immediate")), |
| + delayed_work_queue( |
| + new WorkQueue(task_queue, "delayed", WorkQueue::QueueType::DELAYED)), |
| + immediate_work_queue(new WorkQueue(task_queue, |
| + "immediate", |
| + WorkQueue::QueueType::IMMEDIATE)), |
| set_index(0), |
| is_enabled_refcount(0), |
| voter_refcount(0), |
| @@ -183,7 +186,6 @@ void TaskQueueImpl::UnregisterTaskQueue() { |
| } |
| bool TaskQueueImpl::RunsTasksOnCurrentThread() const { |
| - base::AutoLock lock(any_thread_lock_); |
| return base::PlatformThread::CurrentId() == thread_id_; |
| } |
| @@ -325,26 +327,46 @@ void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked( |
| base::TimeTicks desired_run_time, |
| EnqueueOrder sequence_number, |
| bool nestable) { |
| - if (any_thread().immediate_incoming_queue.empty()) |
| - any_thread().time_domain->RegisterAsUpdatableTaskQueue(this); |
| // If the |immediate_incoming_queue| is empty we need a DoWork posted to make |
| // it run. |
| if (any_thread().immediate_incoming_queue.empty()) { |
| - // There's no point posting a DoWork for a disabled queue, however we can |
| - // only tell if it's disabled from the main thread. |
| - if (base::PlatformThread::CurrentId() == thread_id_) { |
| - if (IsQueueEnabled() && !BlockedByFenceLocked()) |
| - any_thread().task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); |
| - } else { |
| - any_thread().task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); |
| - } |
| + any_thread().task_queue_manager->OnQueueHasImmediateWork(this); |
| + any_thread().time_domain->OnQueueHasImmediateWork(this); |
| } |
| + |
| any_thread().immediate_incoming_queue.emplace( |
| - posted_from, task, desired_run_time, sequence_number, nestable, sequence_number); |
| - any_thread().task_queue_manager->DidQueueTask( any_thread().immediate_incoming_queue.back()); |
| + posted_from, task, desired_run_time, sequence_number, nestable, |
| + sequence_number); |
| + any_thread().task_queue_manager->DidQueueTask( |
| + any_thread().immediate_incoming_queue.back()); |
| TraceQueueSize(true); |
| } |
| +void TaskQueueImpl::OnIncomingImmediateTaskAvailable() { |
|
Sami
2016/12/05 17:52:54
I think having this method makes sense but the nam
alex clarke (OOO till 29th)
2016/12/06 17:37:54
Done.
|
| + // Note a call to OnImmediateWorkQueueHasBecomeEmpty could have got here first |
| + // so there may not actually be any work to do. |
| + if (!main_thread_only().immediate_work_queue->Empty()) |
| + return; |
| + |
| + base::AutoLock lock(any_thread_lock_); |
| + if (any_thread().immediate_incoming_queue.empty()) |
| + return; |
| + |
| + main_thread_only().immediate_work_queue->SwapLocked( |
| + any_thread().immediate_incoming_queue); |
| +} |
| + |
| +void TaskQueueImpl::OnImmediateWorkQueueHasBecomeEmpty( |
| + std::queue<TaskQueueImpl::Task>* work_queue) { |
| + base::AutoLock lock(any_thread_lock_); |
| + DCHECK(work_queue->empty()); |
| + |
| + if (any_thread().immediate_incoming_queue.empty()) |
| + return; |
| + |
| + std::swap(any_thread().immediate_incoming_queue, *work_queue); |
| +} |
| + |
| bool TaskQueueImpl::IsEmpty() const { |
| if (!main_thread_only().delayed_work_queue->Empty() || |
| !main_thread_only().delayed_incoming_queue.empty() || |
| @@ -420,20 +442,6 @@ void TaskQueueImpl::WakeUpForDelayedWork(LazyNow* lazy_now) { |
| } |
| } |
| -bool TaskQueueImpl::MaybeUpdateImmediateWorkQueues() { |
| - if (!main_thread_only().task_queue_manager) |
| - return false; |
| - |
| - if (!main_thread_only().immediate_work_queue->Empty()) |
| - return true; |
| - |
| - base::AutoLock lock(any_thread_lock_); |
| - main_thread_only().immediate_work_queue->SwapLocked( |
| - any_thread().immediate_incoming_queue); |
| - // |immediate_work_queue| is now empty so updates are no longer required. |
| - return false; |
| -} |
| - |
| void TaskQueueImpl::TraceQueueSize(bool is_locked) const { |
| bool is_tracing; |
| TRACE_EVENT_CATEGORY_GROUP_ENABLED(disabled_by_default_tracing_category_, |
| @@ -574,8 +582,7 @@ void TaskQueueImpl::SetTimeDomain(TimeDomain* time_domain) { |
| any_thread().time_domain = time_domain; |
| } |
| - // We rely here on TimeDomain::MigrateQueue being thread-safe to use with |
| - // TimeDomain::Register/UnregisterAsUpdatableTaskQueue. |
| + |
| main_thread_only().time_domain->MigrateQueue(this, time_domain); |
| main_thread_only().time_domain = time_domain; |
| } |
| @@ -671,6 +678,8 @@ bool TaskQueueImpl::BlockedByFence() const { |
| } |
| bool TaskQueueImpl::BlockedByFenceLocked() const { |
| + any_thread_lock_.AssertAcquired(); |
| + |
| if (!main_thread_only().current_fence) |
| return false; |