Chromium Code Reviews| 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 651770740e8a2f7ba6527c25fd042425b0eba6ea..ff349e38df350095095d2d5cb75c8c9dd9adc4dc 100644 |
| --- a/components/scheduler/base/task_queue_impl.cc |
| +++ b/components/scheduler/base/task_queue_impl.cc |
| @@ -4,6 +4,7 @@ |
| #include "components/scheduler/base/task_queue_impl.h" |
| +#include "components/scheduler/base/delayed_task_delegate.h" |
| #include "components/scheduler/base/task_queue_manager.h" |
| #include "components/scheduler/base/task_queue_manager_delegate.h" |
| @@ -12,11 +13,12 @@ namespace internal { |
| TaskQueueImpl::TaskQueueImpl( |
| TaskQueueManager* task_queue_manager, |
| + const scoped_refptr<DelayedTaskDelegate>& delayed_task_delegate, |
| 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), |
| + any_thread_(task_queue_manager, spec.pump_policy, delayed_task_delegate), |
| name_(spec.name), |
| disabled_by_default_tracing_category_( |
| disabled_by_default_tracing_category), |
| @@ -53,9 +55,13 @@ TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, |
| sequence_num = sequence_number; |
| } |
| -TaskQueueImpl::AnyThread::AnyThread(TaskQueueManager* task_queue_manager, |
| - PumpPolicy pump_policy) |
| - : task_queue_manager(task_queue_manager), pump_policy(pump_policy) {} |
| +TaskQueueImpl::AnyThread::AnyThread( |
| + TaskQueueManager* task_queue_manager, |
| + PumpPolicy pump_policy, |
| + const scoped_refptr<DelayedTaskDelegate>& delayed_task_delegate) |
| + : task_queue_manager(task_queue_manager), |
| + pump_policy(pump_policy), |
| + delayed_task_delegate(delayed_task_delegate) {} |
| TaskQueueImpl::AnyThread::~AnyThread() {} |
| @@ -70,6 +76,9 @@ void TaskQueueImpl::UnregisterTaskQueue() { |
| base::AutoLock lock(any_thread_lock_); |
| if (!any_thread().task_queue_manager) |
| return; |
| + |
| + any_thread().delayed_task_delegate->CancelDelayedWork(this); |
| + any_thread().delayed_task_delegate = scoped_refptr<DelayedTaskDelegate>(); |
|
Sami
2015/11/17 10:31:06
nit: I think there's a release() or reset() for th
alex clarke (OOO till 29th)
2015/11/18 15:30:15
I can't see anything like that on scoped_refptr
|
| any_thread().task_queue_manager->UnregisterTaskQueue(this); |
| any_thread().task_queue_manager = nullptr; |
| @@ -104,8 +113,8 @@ bool TaskQueueImpl::PostDelayedTaskAt( |
| base::AutoLock lock(any_thread_lock_); |
| if (!any_thread().task_queue_manager) |
| return false; |
| - LazyNow lazy_now(any_thread().task_queue_manager->delegate().get()); |
| - return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time, |
| + any_thread().delayed_task_delegate->InvalidateNowCache(); |
| + return PostDelayedTaskLocked(from_here, task, desired_run_time, |
| TaskType::NORMAL); |
| } |
| @@ -117,16 +126,14 @@ bool TaskQueueImpl::PostDelayedTaskImpl( |
| base::AutoLock lock(any_thread_lock_); |
| if (!any_thread().task_queue_manager) |
| return false; |
| - LazyNow lazy_now(any_thread().task_queue_manager->delegate().get()); |
| base::TimeTicks desired_run_time; |
| + any_thread().delayed_task_delegate->InvalidateNowCache(); |
| if (delay > base::TimeDelta()) |
| - desired_run_time = lazy_now.Now() + delay; |
| - return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time, |
| - task_type); |
| + desired_run_time = any_thread().delayed_task_delegate->CachedNow() + delay; |
| + return PostDelayedTaskLocked(from_here, task, desired_run_time, task_type); |
| } |
| bool TaskQueueImpl::PostDelayedTaskLocked( |
| - LazyNow* lazy_now, |
| const tracked_objects::Location& from_here, |
| const base::Closure& task, |
| base::TimeTicks desired_run_time, |
| @@ -138,13 +145,14 @@ bool TaskQueueImpl::PostDelayedTaskLocked( |
| any_thread().task_queue_manager->DidQueueTask(pending_task); |
| if (!desired_run_time.is_null()) { |
| - pending_task.delayed_run_time = std::max(lazy_now->Now(), desired_run_time); |
| + pending_task.delayed_run_time = std::max( |
| + any_thread().delayed_task_delegate->CachedNow(), desired_run_time); |
| // TODO(alexclarke): consider emplace() when C++11 library features allowed. |
| any_thread().delayed_task_queue.push(pending_task); |
| TraceQueueSize(true); |
| // Schedule a later call to MoveReadyDelayedTasksToIncomingQueue. |
| - any_thread().task_queue_manager->ScheduleDelayedWork(this, desired_run_time, |
| - lazy_now); |
| + any_thread().delayed_task_delegate->ScheduleDelayedWork(this, |
| + desired_run_time); |
| return true; |
| } |
| pending_task.set_enqueue_order(pending_task.sequence_num); |
| @@ -152,20 +160,19 @@ bool TaskQueueImpl::PostDelayedTaskLocked( |
| return true; |
| } |
| -void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue(LazyNow* lazy_now) { |
| +void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue() { |
| base::AutoLock lock(any_thread_lock_); |
| if (!any_thread().task_queue_manager) |
| return; |
| - MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); |
| + MoveReadyDelayedTasksToIncomingQueueLocked(); |
| } |
| -void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueueLocked( |
| - LazyNow* lazy_now) { |
| +void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueueLocked() { |
| // Enqueue all delayed tasks that should be running now. |
| while (!any_thread().delayed_task_queue.empty() && |
| any_thread().delayed_task_queue.top().delayed_run_time <= |
| - lazy_now->Now()) { |
| + any_thread().delayed_task_delegate->CachedNow()) { |
| // TODO(alexclarke): consider std::move() when allowed. |
| EnqueueDelayedTaskLocked(any_thread().delayed_task_queue.top()); |
| any_thread().delayed_task_queue.pop(); |
| @@ -232,14 +239,13 @@ bool TaskQueueImpl::NextPendingDelayedTaskRunTime( |
| return true; |
| } |
| -void TaskQueueImpl::UpdateWorkQueue(LazyNow* lazy_now, |
| - bool should_trigger_wakeup, |
| +void TaskQueueImpl::UpdateWorkQueue(bool should_trigger_wakeup, |
| const Task* previous_task) { |
| DCHECK(main_thread_only().work_queue.empty()); |
| base::AutoLock lock(any_thread_lock_); |
| if (!ShouldAutoPumpQueueLocked(should_trigger_wakeup, previous_task)) |
| return; |
| - MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); |
| + MoveReadyDelayedTasksToIncomingQueueLocked(); |
| std::swap(main_thread_only().work_queue, any_thread().incoming_queue); |
| // |any_thread().incoming_queue| is now empty so |
| // TaskQueueManager::UpdateQueues no longer needs to consider |
| @@ -322,8 +328,8 @@ void TaskQueueImpl::PumpQueueLocked() { |
| if (!any_thread().task_queue_manager) |
| return; |
| - LazyNow lazy_now(any_thread().task_queue_manager->delegate().get()); |
| - MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); |
| + any_thread().delayed_task_delegate->InvalidateNowCache(); |
| + MoveReadyDelayedTasksToIncomingQueueLocked(); |
| bool was_empty = main_thread_only().work_queue.empty(); |
| while (!any_thread().incoming_queue.empty()) { |
| @@ -516,5 +522,10 @@ void TaskQueueImpl::TaskAsValueInto(const Task& task, |
| state->EndDictionary(); |
| } |
| +size_t TaskQueueImpl::IncommingQueueSizeForTest() const { |
| + base::AutoLock lock(any_thread_lock_); |
| + return any_thread().incoming_queue.size(); |
| +} |
| + |
| } // namespace internal |
| } // namespace scheduler |