| 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..301064b266e7a3083b1e8f9217a8b4cf979e4dbf 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,49 @@ 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);
|
| - }
|
| + // There's no point posting a DoWork for a blocked or disabled queue,
|
| + // although we can only determine that on the main thread.
|
| + bool ensure_do_work_posted = !RunsTasksOnCurrentThread() ||
|
| + (IsQueueEnabled() && !BlockedByFenceLocked());
|
| + any_thread().task_queue_manager->OnQueueHasImmediateWork(
|
| + this, ensure_do_work_posted);
|
| + 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::ReloadImmediateWorkQueueIfEmpty() {
|
| + 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 +445,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 +585,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 +681,8 @@ bool TaskQueueImpl::BlockedByFence() const {
|
| }
|
|
|
| bool TaskQueueImpl::BlockedByFenceLocked() const {
|
| + any_thread_lock_.AssertAcquired();
|
| +
|
| if (!main_thread_only().current_fence)
|
| return false;
|
|
|
|
|