| Index: components/scheduler/base/task_queue_impl.cc
|
| diff --git a/components/scheduler/base/task_queue_impl.cc b/components/scheduler/base/task_queue_impl.cc
|
| index 3442b436334df061c9aac0730f58e16ce23beb90..651770740e8a2f7ba6527c25fd042425b0eba6ea 100644
|
| --- a/components/scheduler/base/task_queue_impl.cc
|
| +++ b/components/scheduler/base/task_queue_impl.cc
|
| @@ -6,19 +6,17 @@
|
|
|
| #include "components/scheduler/base/task_queue_manager.h"
|
| #include "components/scheduler/base/task_queue_manager_delegate.h"
|
| -#include "components/scheduler/base/time_domain.h"
|
|
|
| namespace scheduler {
|
| namespace internal {
|
|
|
| TaskQueueImpl::TaskQueueImpl(
|
| TaskQueueManager* task_queue_manager,
|
| - const scoped_refptr<TimeDomain>& time_domain,
|
| const Spec& spec,
|
| const char* disabled_by_default_tracing_category,
|
| const char* disabled_by_default_verbose_tracing_category)
|
| : thread_id_(base::PlatformThread::CurrentId()),
|
| - any_thread_(task_queue_manager, spec.pump_policy, time_domain),
|
| + any_thread_(task_queue_manager, spec.pump_policy),
|
| name_(spec.name),
|
| disabled_by_default_tracing_category_(
|
| disabled_by_default_tracing_category),
|
| @@ -27,9 +25,7 @@
|
| main_thread_only_(task_queue_manager),
|
| wakeup_policy_(spec.wakeup_policy),
|
| should_monitor_quiescence_(spec.should_monitor_quiescence),
|
| - should_notify_observers_(spec.should_notify_observers) {
|
| - DCHECK(time_domain.get());
|
| -}
|
| + should_notify_observers_(spec.should_notify_observers) {}
|
|
|
| TaskQueueImpl::~TaskQueueImpl() {}
|
|
|
| @@ -57,13 +53,9 @@
|
| sequence_num = sequence_number;
|
| }
|
|
|
| -TaskQueueImpl::AnyThread::AnyThread(
|
| - TaskQueueManager* task_queue_manager,
|
| - PumpPolicy pump_policy,
|
| - const scoped_refptr<TimeDomain>& time_domain)
|
| - : task_queue_manager(task_queue_manager),
|
| - pump_policy(pump_policy),
|
| - time_domain(time_domain) {}
|
| +TaskQueueImpl::AnyThread::AnyThread(TaskQueueManager* task_queue_manager,
|
| + PumpPolicy pump_policy)
|
| + : task_queue_manager(task_queue_manager), pump_policy(pump_policy) {}
|
|
|
| TaskQueueImpl::AnyThread::~AnyThread() {}
|
|
|
| @@ -78,8 +70,6 @@
|
| base::AutoLock lock(any_thread_lock_);
|
| if (!any_thread().task_queue_manager)
|
| return;
|
| - any_thread().time_domain->UnregisterQueue(this);
|
| - any_thread().time_domain = nullptr;
|
| any_thread().task_queue_manager->UnregisterTaskQueue(this);
|
|
|
| any_thread().task_queue_manager = nullptr;
|
| @@ -114,7 +104,7 @@
|
| base::AutoLock lock(any_thread_lock_);
|
| if (!any_thread().task_queue_manager)
|
| return false;
|
| - LazyNow lazy_now(any_thread().time_domain->CreateLazyNow());
|
| + LazyNow lazy_now(any_thread().task_queue_manager->delegate().get());
|
| return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time,
|
| TaskType::NORMAL);
|
| }
|
| @@ -127,7 +117,7 @@
|
| base::AutoLock lock(any_thread_lock_);
|
| if (!any_thread().task_queue_manager)
|
| return false;
|
| - LazyNow lazy_now(any_thread().time_domain->CreateLazyNow());
|
| + LazyNow lazy_now(any_thread().task_queue_manager->delegate().get());
|
| base::TimeTicks desired_run_time;
|
| if (delay > base::TimeDelta())
|
| desired_run_time = lazy_now.Now() + delay;
|
| @@ -153,35 +143,13 @@
|
| any_thread().delayed_task_queue.push(pending_task);
|
| TraceQueueSize(true);
|
| // Schedule a later call to MoveReadyDelayedTasksToIncomingQueue.
|
| - if (base::PlatformThread::CurrentId() == thread_id_) {
|
| - any_thread().time_domain->ScheduleDelayedWork(this, desired_run_time,
|
| - lazy_now);
|
| - } else {
|
| - // NOTE posting a delayed task from a different thread is not expected to
|
| - // be common. This pathway is less optimal than perhaps it could be
|
| - // because it causes two main thread tasks to be run. Should this
|
| - // assumption prove to be false in future, we may need to revisit this.
|
| - Task thread_hop_task(
|
| - FROM_HERE, base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this,
|
| - any_thread().time_domain, desired_run_time),
|
| - any_thread().task_queue_manager->GetNextSequenceNumber(), true);
|
| - any_thread().task_queue_manager->DidQueueTask(thread_hop_task);
|
| - pending_task.set_enqueue_order(thread_hop_task.sequence_num);
|
| - EnqueueTaskLocked(thread_hop_task);
|
| - }
|
| + any_thread().task_queue_manager->ScheduleDelayedWork(this, desired_run_time,
|
| + lazy_now);
|
| return true;
|
| }
|
| pending_task.set_enqueue_order(pending_task.sequence_num);
|
| EnqueueTaskLocked(pending_task);
|
| return true;
|
| -}
|
| -
|
| -void TaskQueueImpl::ScheduleDelayedWorkTask(
|
| - const scoped_refptr<TimeDomain> time_domain,
|
| - base::TimeTicks desired_run_time) {
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - LazyNow lazy_now(time_domain->CreateLazyNow());
|
| - time_domain->ScheduleDelayedWork(this, desired_run_time, &lazy_now);
|
| }
|
|
|
| void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue(LazyNow* lazy_now) {
|
| @@ -254,6 +222,16 @@
|
| return true;
|
| }
|
|
|
| +bool TaskQueueImpl::NextPendingDelayedTaskRunTime(
|
| + base::TimeTicks* next_pending_delayed_task) {
|
| + base::AutoLock lock(any_thread_lock_);
|
| + if (any_thread().delayed_task_queue.empty())
|
| + return false;
|
| + *next_pending_delayed_task =
|
| + any_thread().delayed_task_queue.top().delayed_run_time;
|
| + return true;
|
| +}
|
| +
|
| void TaskQueueImpl::UpdateWorkQueue(LazyNow* lazy_now,
|
| bool should_trigger_wakeup,
|
| const Task* previous_task) {
|
| @@ -263,9 +241,10 @@
|
| return;
|
| MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now);
|
| std::swap(main_thread_only().work_queue, any_thread().incoming_queue);
|
| - // |any_thread().incoming_queue| is now empty so TimeDomain::UpdateQueues
|
| - // no longer needs to consider this queue for reloading.
|
| - any_thread().time_domain->UnregisterAsUpdatableTaskQueue(this);
|
| + // |any_thread().incoming_queue| is now empty so
|
| + // TaskQueueManager::UpdateQueues no longer needs to consider
|
| + // this queue for reloading.
|
| + any_thread().task_queue_manager->UnregisterAsUpdatableTaskQueue(this);
|
| if (!main_thread_only().work_queue.empty()) {
|
| DCHECK(any_thread().task_queue_manager);
|
| any_thread().task_queue_manager->selector_.GetTaskQueueSets()->OnPushQueue(
|
| @@ -308,7 +287,7 @@
|
| if (!any_thread().task_queue_manager)
|
| return;
|
| if (any_thread().incoming_queue.empty())
|
| - any_thread().time_domain->RegisterAsUpdatableTaskQueue(this);
|
| + any_thread().task_queue_manager->RegisterAsUpdatableTaskQueue(this);
|
| if (any_thread().pump_policy == PumpPolicy::AUTO &&
|
| any_thread().incoming_queue.empty()) {
|
| any_thread().task_queue_manager->MaybePostDoWorkOnMainRunner();
|
| @@ -318,17 +297,11 @@
|
| TraceQueueSize(true);
|
| }
|
|
|
| -// TODO(alexclarke): Consider merging EnqueueTaskLocked &
|
| -// EnqueueDelayedTaskLocked.
|
| void TaskQueueImpl::EnqueueDelayedTaskLocked(const Task& pending_task) {
|
| if (!any_thread().task_queue_manager)
|
| return;
|
| if (any_thread().incoming_queue.empty())
|
| - any_thread().time_domain->RegisterAsUpdatableTaskQueue(this);
|
| - if (any_thread().pump_policy == PumpPolicy::AUTO &&
|
| - any_thread().incoming_queue.empty()) {
|
| - any_thread().task_queue_manager->MaybePostDoWorkOnMainRunner();
|
| - }
|
| + any_thread().task_queue_manager->RegisterAsUpdatableTaskQueue(this);
|
| // TODO(alexclarke): consider std::move() when allowed.
|
| any_thread().incoming_queue.push(pending_task);
|
| any_thread().incoming_queue.back().set_enqueue_order(
|
| @@ -349,7 +322,7 @@
|
| if (!any_thread().task_queue_manager)
|
| return;
|
|
|
| - LazyNow lazy_now(any_thread().time_domain->CreateLazyNow());
|
| + LazyNow lazy_now(any_thread().task_queue_manager->delegate().get());
|
| MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now);
|
|
|
| bool was_empty = main_thread_only().work_queue.empty();
|
| @@ -358,9 +331,9 @@
|
| main_thread_only().work_queue.push(any_thread().incoming_queue.front());
|
| any_thread().incoming_queue.pop();
|
| }
|
| - // |incoming_queue| is now empty so TimeDomain::UpdateQueues no longer needs
|
| - // to consider this queue for reloading.
|
| - any_thread().time_domain->UnregisterAsUpdatableTaskQueue(this);
|
| + // |incoming_queue| is now empty so TaskQueueManager::UpdateQueues no longer
|
| + // needs to consider this queue for reloading.
|
| + any_thread().task_queue_manager->UnregisterAsUpdatableTaskQueue(this);
|
| if (!main_thread_only().work_queue.empty()) {
|
| if (was_empty) {
|
| any_thread()
|
| @@ -457,7 +430,6 @@
|
| base::AutoLock lock(any_thread_lock_);
|
| state->BeginDictionary();
|
| state->SetString("name", GetName());
|
| - state->SetString("time_domain_name", any_thread().time_domain->GetName());
|
| state->SetString("pump_policy", PumpPolicyToString(any_thread().pump_policy));
|
| state->SetString("wakeup_policy", WakeupPolicyToString(wakeup_policy_));
|
| bool verbose_tracing_enabled = false;
|
| @@ -509,17 +481,6 @@
|
| DidProcessTask(pending_task));
|
| }
|
|
|
| -void TaskQueueImpl::SetTimeDomain(
|
| - const scoped_refptr<TimeDomain>& time_domain) {
|
| - base::AutoLock lock(any_thread_lock_);
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - if (time_domain == any_thread().time_domain)
|
| - return;
|
| -
|
| - any_thread().time_domain->MigrateQueue(this, time_domain.get());
|
| - any_thread().time_domain = time_domain;
|
| -}
|
| -
|
| // static
|
| void TaskQueueImpl::QueueAsValueInto(const std::queue<Task>& queue,
|
| base::trace_event::TracedValue* state) {
|
| @@ -555,10 +516,5 @@
|
| state->EndDictionary();
|
| }
|
|
|
| -size_t TaskQueueImpl::IncomingQueueSizeForTest() const {
|
| - base::AutoLock lock(any_thread_lock_);
|
| - return any_thread().incoming_queue.size();
|
| -}
|
| -
|
| } // namespace internal
|
| } // namespace scheduler
|
|
|