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 |