Chromium Code Reviews| Index: content/renderer/scheduler/renderer_scheduler_impl.cc | 
| diff --git a/content/renderer/scheduler/renderer_scheduler_impl.cc b/content/renderer/scheduler/renderer_scheduler_impl.cc | 
| index 53281b81a807a7389d7e3917b86ef822d5c3bcc4..a1a40885af6e72403412a1a5a5726729f2a09445 100644 | 
| --- a/content/renderer/scheduler/renderer_scheduler_impl.cc | 
| +++ b/content/renderer/scheduler/renderer_scheduler_impl.cc | 
| @@ -9,76 +9,43 @@ | 
| #include "base/trace_event/trace_event.h" | 
| #include "base/trace_event/trace_event_argument.h" | 
| #include "cc/output/begin_frame_args.h" | 
| -#include "content/renderer/scheduler/nestable_single_thread_task_runner.h" | 
| -#include "content/renderer/scheduler/renderer_task_queue_selector.h" | 
| +#include "content/child/scheduler/nestable_single_thread_task_runner.h" | 
| +#include "content/child/scheduler/task_queue_selector_impl.h" | 
| #include "ui/gfx/frame_time.h" | 
| namespace content { | 
| RendererSchedulerImpl::RendererSchedulerImpl( | 
| scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner) | 
| - : renderer_task_queue_selector_(new RendererTaskQueueSelector()), | 
| - task_queue_manager_( | 
| - new TaskQueueManager(TASK_QUEUE_COUNT, | 
| - main_task_runner, | 
| - renderer_task_queue_selector_.get())), | 
| - control_task_runner_( | 
| - task_queue_manager_->TaskRunnerForQueue(CONTROL_TASK_QUEUE)), | 
| - control_task_after_wakeup_runner_(task_queue_manager_->TaskRunnerForQueue( | 
| - CONTROL_TASK_AFTER_WAKEUP_QUEUE)), | 
| - default_task_runner_( | 
| - task_queue_manager_->TaskRunnerForQueue(DEFAULT_TASK_QUEUE)), | 
| + : scheduler_helper_(main_task_runner, | 
| + "renderer.scheduler", | 
| + TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 
| + TASK_QUEUE_COUNT, | 
| + CONTROL_TASK_QUEUE, | 
| + CONTROL_TASK_AFTER_WAKEUP_QUEUE, | 
| + DEFAULT_TASK_QUEUE, | 
| + IDLE_TASK_QUEUE, | 
| + this), | 
| compositor_task_runner_( | 
| - task_queue_manager_->TaskRunnerForQueue(COMPOSITOR_TASK_QUEUE)), | 
| + scheduler_helper_.SchedulerTaskQueueManager()->TaskRunnerForQueue( | 
| + COMPOSITOR_TASK_QUEUE)), | 
| loading_task_runner_( | 
| - task_queue_manager_->TaskRunnerForQueue(LOADING_TASK_QUEUE)), | 
| + scheduler_helper_.SchedulerTaskQueueManager()->TaskRunnerForQueue( | 
| + LOADING_TASK_QUEUE)), | 
| delayed_update_policy_runner_( | 
| base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 
| base::Unretained(this)), | 
| - control_task_runner_), | 
| + scheduler_helper_.ControlTaskRunner()), | 
| current_policy_(Policy::NORMAL), | 
| - idle_period_state_(IdlePeriodState::NOT_IN_IDLE_PERIOD), | 
| last_input_type_(blink::WebInputEvent::Undefined), | 
| input_stream_state_(InputStreamState::INACTIVE), | 
| policy_may_need_update_(&incoming_signals_lock_), | 
| weak_factory_(this) { | 
| - weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr(); | 
| update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 
| - weak_renderer_scheduler_ptr_); | 
| - end_idle_period_closure_.Reset(base::Bind( | 
| - &RendererSchedulerImpl::EndIdlePeriod, weak_renderer_scheduler_ptr_)); | 
| - initiate_next_long_idle_period_closure_.Reset(base::Bind( | 
| - &RendererSchedulerImpl::InitiateLongIdlePeriod, | 
| - weak_renderer_scheduler_ptr_)); | 
| - initiate_next_long_idle_period_after_wakeup_closure_.Reset(base::Bind( | 
| - &RendererSchedulerImpl::InitiateLongIdlePeriodAfterWakeup, | 
| - weak_renderer_scheduler_ptr_)); | 
| - | 
| - idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner( | 
| - task_queue_manager_->TaskRunnerForQueue(IDLE_TASK_QUEUE), | 
| - control_task_after_wakeup_runner_, | 
| - base::Bind(&RendererSchedulerImpl::CurrentIdleTaskDeadlineCallback, | 
| - weak_renderer_scheduler_ptr_))); | 
| - | 
| - renderer_task_queue_selector_->SetQueuePriority( | 
| - CONTROL_TASK_QUEUE, RendererTaskQueueSelector::CONTROL_PRIORITY); | 
| - | 
| - renderer_task_queue_selector_->SetQueuePriority( | 
| - CONTROL_TASK_AFTER_WAKEUP_QUEUE, | 
| - RendererTaskQueueSelector::CONTROL_PRIORITY); | 
| - task_queue_manager_->SetPumpPolicy( | 
| - CONTROL_TASK_AFTER_WAKEUP_QUEUE, | 
| - TaskQueueManager::PumpPolicy::AFTER_WAKEUP); | 
| - | 
| - renderer_task_queue_selector_->DisableQueue(IDLE_TASK_QUEUE); | 
| - task_queue_manager_->SetPumpPolicy(IDLE_TASK_QUEUE, | 
| - TaskQueueManager::PumpPolicy::MANUAL); | 
| - | 
| - // TODO(skyostil): Increase this to 4 (crbug.com/444764). | 
| - task_queue_manager_->SetWorkBatchSize(1); | 
| + weak_factory_.GetWeakPtr()); | 
| for (size_t i = 0; i < TASK_QUEUE_COUNT; i++) { | 
| - task_queue_manager_->SetQueueName( | 
| + scheduler_helper_.SchedulerTaskQueueManager()->SetQueueName( | 
| i, TaskQueueIdToString(static_cast<QueueId>(i))); | 
| } | 
| TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 
| @@ -93,43 +60,54 @@ RendererSchedulerImpl::~RendererSchedulerImpl() { | 
| } | 
| void RendererSchedulerImpl::Shutdown() { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - task_queue_manager_.reset(); | 
| + scheduler_helper_.Shutdown(); | 
| } | 
| scoped_refptr<base::SingleThreadTaskRunner> | 
| RendererSchedulerImpl::DefaultTaskRunner() { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - return default_task_runner_; | 
| + return scheduler_helper_.DefaultTaskRunner(); | 
| } | 
| scoped_refptr<base::SingleThreadTaskRunner> | 
| RendererSchedulerImpl::CompositorTaskRunner() { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| + scheduler_helper_.CheckOnValidThread(); | 
| return compositor_task_runner_; | 
| } | 
| scoped_refptr<SingleThreadIdleTaskRunner> | 
| RendererSchedulerImpl::IdleTaskRunner() { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - return idle_task_runner_; | 
| + return scheduler_helper_.IdleTaskRunner(); | 
| } | 
| scoped_refptr<base::SingleThreadTaskRunner> | 
| RendererSchedulerImpl::LoadingTaskRunner() { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| + scheduler_helper_.CheckOnValidThread(); | 
| return loading_task_runner_; | 
| } | 
| +bool RendererSchedulerImpl::CanExceedIdleDeadlineIfRequired() const { | 
| + return scheduler_helper_.CanExceedIdleDeadlineIfRequired(); | 
| +} | 
| + | 
| +void RendererSchedulerImpl::AddTaskObserver( | 
| + base::MessageLoop::TaskObserver* task_observer) { | 
| + scheduler_helper_.AddTaskObserver(task_observer); | 
| +} | 
| + | 
| +void RendererSchedulerImpl::RemoveTaskObserver( | 
| + base::MessageLoop::TaskObserver* task_observer) { | 
| + scheduler_helper_.RemoveTaskObserver(task_observer); | 
| +} | 
| + | 
| void RendererSchedulerImpl::WillBeginFrame(const cc::BeginFrameArgs& args) { | 
| TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 
| "RendererSchedulerImpl::WillBeginFrame", "args", args.AsValue()); | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - if (!task_queue_manager_) | 
| + scheduler_helper_.CheckOnValidThread(); | 
| + if (!scheduler_helper_.SchedulerTaskQueueManager()) | 
| return; | 
| - EndIdlePeriod(); | 
| - estimated_next_frame_begin_ = args.frame_time + args.interval; | 
| + scheduler_helper_.EndIdlePeriod(); | 
| + scheduler_helper_.SetEstimatedNextFrameBegin(args.frame_time + args.interval); | 
| // TODO(skyostil): Wire up real notification of input events processing | 
| // instead of this approximation. | 
| DidProcessInputEvent(args.frame_time); | 
| @@ -138,33 +116,34 @@ void RendererSchedulerImpl::WillBeginFrame(const cc::BeginFrameArgs& args) { | 
| void RendererSchedulerImpl::DidCommitFrameToCompositor() { | 
| TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 
| "RendererSchedulerImpl::DidCommitFrameToCompositor"); | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - if (!task_queue_manager_) | 
| + scheduler_helper_.CheckOnValidThread(); | 
| + if (!scheduler_helper_.SchedulerTaskQueueManager()) | 
| return; | 
| - base::TimeTicks now(Now()); | 
| - if (now < estimated_next_frame_begin_) { | 
| + base::TimeTicks now(scheduler_helper_.Now()); | 
| + if (now < scheduler_helper_.EstimatedNextFrameBegin()) { | 
| // TODO(rmcilroy): Consider reducing the idle period based on the runtime of | 
| // the next pending delayed tasks (as currently done in for long idle times) | 
| - StartIdlePeriod(IdlePeriodState::IN_SHORT_IDLE_PERIOD); | 
| - control_task_runner_->PostDelayedTask(FROM_HERE, | 
| - end_idle_period_closure_.callback(), | 
| - estimated_next_frame_begin_ - now); | 
| + scheduler_helper_.StartIdlePeriod( | 
| + SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD); | 
| + scheduler_helper_.ControlTaskRunner()->PostDelayedTask( | 
| 
 
Sami
2015/03/27 01:15:55
No need to fix in this patch but just a random obs
 
alex clarke (OOO till 29th)
2015/03/27 10:55:29
Done.
 
 | 
| + FROM_HERE, scheduler_helper_.EndIdlePeriodClosure().callback(), | 
| + scheduler_helper_.EstimatedNextFrameBegin() - now); | 
| } | 
| } | 
| void RendererSchedulerImpl::BeginFrameNotExpectedSoon() { | 
| TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 
| "RendererSchedulerImpl::BeginFrameNotExpectedSoon"); | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - if (!task_queue_manager_) | 
| + scheduler_helper_.CheckOnValidThread(); | 
| + if (!scheduler_helper_.SchedulerTaskQueueManager()) | 
| return; | 
| // TODO(skyostil): Wire up real notification of input events processing | 
| // instead of this approximation. | 
| DidProcessInputEvent(base::TimeTicks()); | 
| - InitiateLongIdlePeriod(); | 
| + scheduler_helper_.InitiateLongIdlePeriod(); | 
| } | 
| void RendererSchedulerImpl::DidReceiveInputEventOnCompositorThread( | 
| @@ -206,7 +185,7 @@ void RendererSchedulerImpl::UpdateForInputEvent( | 
| input_stream_state_ = new_input_stream_state; | 
| EnsureUrgentPolicyUpdatePostedOnMainThread(FROM_HERE); | 
| } | 
| - last_input_receipt_time_on_compositor_ = Now(); | 
| + last_input_receipt_time_on_compositor_ = scheduler_helper_.Now(); | 
| // Clear the last known input processing time so that we know an input event | 
| // is still queued up. This timestamp will be updated the next time the | 
| // compositor commits or becomes quiescent. Note that this function is always | 
| @@ -218,7 +197,7 @@ void RendererSchedulerImpl::UpdateForInputEvent( | 
| void RendererSchedulerImpl::DidProcessInputEvent( | 
| base::TimeTicks begin_frame_time) { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| + scheduler_helper_.CheckOnValidThread(); | 
| base::AutoLock lock(incoming_signals_lock_); | 
| if (input_stream_state_ == InputStreamState::INACTIVE) | 
| return; | 
| @@ -226,13 +205,13 @@ void RendererSchedulerImpl::DidProcessInputEvent( | 
| if (!begin_frame_time.is_null() && | 
| begin_frame_time < last_input_receipt_time_on_compositor_) | 
| return; | 
| - last_input_process_time_on_main_ = Now(); | 
| + last_input_process_time_on_main_ = scheduler_helper_.Now(); | 
| UpdatePolicyLocked(); | 
| } | 
| bool RendererSchedulerImpl::IsHighPriorityWorkAnticipated() { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - if (!task_queue_manager_) | 
| + scheduler_helper_.CheckOnValidThread(); | 
| + if (!scheduler_helper_.SchedulerTaskQueueManager()) | 
| return false; | 
| MaybeUpdatePolicy(); | 
| @@ -243,8 +222,8 @@ bool RendererSchedulerImpl::IsHighPriorityWorkAnticipated() { | 
| } | 
| bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - if (!task_queue_manager_) | 
| + scheduler_helper_.CheckOnValidThread(); | 
| + if (!scheduler_helper_.SchedulerTaskQueueManager()) | 
| return false; | 
| MaybeUpdatePolicy(); | 
| @@ -258,7 +237,8 @@ bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() { | 
| return false; | 
| case Policy::COMPOSITOR_PRIORITY: | 
| - return !task_queue_manager_->IsQueueEmpty(COMPOSITOR_TASK_QUEUE); | 
| + return !scheduler_helper_.SchedulerTaskQueueManager()->IsQueueEmpty( | 
| + COMPOSITOR_TASK_QUEUE); | 
| case Policy::TOUCHSTART_PRIORITY: | 
| return true; | 
| @@ -269,19 +249,18 @@ bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() { | 
| } | 
| } | 
| -void RendererSchedulerImpl::CurrentIdleTaskDeadlineCallback( | 
| +void RendererSchedulerImpl::CurrentIdleTaskDeadlineCallbackForTesting( | 
| base::TimeTicks* deadline_out) const { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - *deadline_out = estimated_next_frame_begin_; | 
| + scheduler_helper_.CurrentIdleTaskDeadlineCallback(deadline_out); | 
| } | 
| RendererSchedulerImpl::Policy RendererSchedulerImpl::SchedulerPolicy() const { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| + scheduler_helper_.CheckOnValidThread(); | 
| return current_policy_; | 
| } | 
| void RendererSchedulerImpl::MaybeUpdatePolicy() { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| + scheduler_helper_.CheckOnValidThread(); | 
| if (policy_may_need_update_.IsSet()) { | 
| UpdatePolicy(); | 
| } | 
| @@ -294,7 +273,8 @@ void RendererSchedulerImpl::EnsureUrgentPolicyUpdatePostedOnMainThread( | 
| incoming_signals_lock_.AssertAcquired(); | 
| if (!policy_may_need_update_.IsSet()) { | 
| policy_may_need_update_.SetWhileLocked(true); | 
| - control_task_runner_->PostTask(from_here, update_policy_closure_); | 
| + scheduler_helper_.ControlTaskRunner()->PostTask(from_here, | 
| + update_policy_closure_); | 
| } | 
| } | 
| @@ -304,12 +284,12 @@ void RendererSchedulerImpl::UpdatePolicy() { | 
| } | 
| void RendererSchedulerImpl::UpdatePolicyLocked() { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| + scheduler_helper_.CheckOnValidThread(); | 
| incoming_signals_lock_.AssertAcquired(); | 
| - if (!task_queue_manager_) | 
| + if (!scheduler_helper_.SchedulerTaskQueueManager()) | 
| return; | 
| - base::TimeTicks now = Now(); | 
| + base::TimeTicks now = scheduler_helper_.Now(); | 
| policy_may_need_update_.SetWhileLocked(false); | 
| base::TimeDelta new_policy_duration; | 
| @@ -325,30 +305,33 @@ void RendererSchedulerImpl::UpdatePolicyLocked() { | 
| if (new_policy == current_policy_) | 
| return; | 
| + TaskQueueSelectorImpl* task_queue_selector = | 
| + scheduler_helper_.SchedulerTaskQueueSelector(); | 
| + | 
| switch (new_policy) { | 
| case Policy::COMPOSITOR_PRIORITY: | 
| - renderer_task_queue_selector_->SetQueuePriority( | 
| - COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::HIGH_PRIORITY); | 
| + task_queue_selector->SetQueuePriority( | 
| + COMPOSITOR_TASK_QUEUE, TaskQueueSelectorImpl::HIGH_PRIORITY); | 
| // TODO(scheduler-dev): Add a task priority between HIGH and BEST_EFFORT | 
| // that still has some guarantee of running. | 
| - renderer_task_queue_selector_->SetQueuePriority( | 
| - LOADING_TASK_QUEUE, RendererTaskQueueSelector::BEST_EFFORT_PRIORITY); | 
| + task_queue_selector->SetQueuePriority( | 
| + LOADING_TASK_QUEUE, TaskQueueSelectorImpl::BEST_EFFORT_PRIORITY); | 
| break; | 
| case Policy::TOUCHSTART_PRIORITY: | 
| - renderer_task_queue_selector_->SetQueuePriority( | 
| - COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::HIGH_PRIORITY); | 
| - renderer_task_queue_selector_->DisableQueue(LOADING_TASK_QUEUE); | 
| + task_queue_selector->SetQueuePriority( | 
| + COMPOSITOR_TASK_QUEUE, TaskQueueSelectorImpl::HIGH_PRIORITY); | 
| + task_queue_selector->DisableQueue(LOADING_TASK_QUEUE); | 
| break; | 
| case Policy::NORMAL: | 
| - renderer_task_queue_selector_->SetQueuePriority( | 
| - COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::NORMAL_PRIORITY); | 
| - renderer_task_queue_selector_->SetQueuePriority( | 
| - LOADING_TASK_QUEUE, RendererTaskQueueSelector::NORMAL_PRIORITY); | 
| + task_queue_selector->SetQueuePriority( | 
| + COMPOSITOR_TASK_QUEUE, TaskQueueSelectorImpl::NORMAL_PRIORITY); | 
| + task_queue_selector->SetQueuePriority( | 
| + LOADING_TASK_QUEUE, TaskQueueSelectorImpl::NORMAL_PRIORITY); | 
| break; | 
| } | 
| - DCHECK(renderer_task_queue_selector_->IsQueueEnabled(COMPOSITOR_TASK_QUEUE)); | 
| + DCHECK(task_queue_selector->IsQueueEnabled(COMPOSITOR_TASK_QUEUE)); | 
| if (new_policy != Policy::TOUCHSTART_PRIORITY) | 
| - DCHECK(renderer_task_queue_selector_->IsQueueEnabled(LOADING_TASK_QUEUE)); | 
| + DCHECK(task_queue_selector->IsQueueEnabled(LOADING_TASK_QUEUE)); | 
| current_policy_ = new_policy; | 
| @@ -362,7 +345,7 @@ void RendererSchedulerImpl::UpdatePolicyLocked() { | 
| RendererSchedulerImpl::Policy RendererSchedulerImpl::ComputeNewPolicy( | 
| base::TimeTicks now, | 
| base::TimeDelta* new_policy_duration) { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| + scheduler_helper_.CheckOnValidThread(); | 
| incoming_signals_lock_.AssertAcquired(); | 
| Policy new_policy = Policy::NORMAL; | 
| @@ -391,7 +374,7 @@ RendererSchedulerImpl::Policy RendererSchedulerImpl::ComputeNewPolicy( | 
| base::TimeDelta RendererSchedulerImpl::TimeLeftInInputEscalatedPolicy( | 
| base::TimeTicks now) const { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| + scheduler_helper_.CheckOnValidThread(); | 
| // TODO(rmcilroy): Change this to DCHECK_EQ when crbug.com/463869 is fixed. | 
| DCHECK(input_stream_state_ != InputStreamState::INACTIVE); | 
| incoming_signals_lock_.AssertAcquired(); | 
| @@ -400,7 +383,8 @@ base::TimeDelta RendererSchedulerImpl::TimeLeftInInputEscalatedPolicy( | 
| base::TimeDelta::FromMilliseconds(kPriorityEscalationAfterInputMillis); | 
| base::TimeDelta time_left_in_policy; | 
| if (last_input_process_time_on_main_.is_null() && | 
| - !task_queue_manager_->IsQueueEmpty(COMPOSITOR_TASK_QUEUE)) { | 
| + !scheduler_helper_.SchedulerTaskQueueManager()->IsQueueEmpty( | 
| + COMPOSITOR_TASK_QUEUE)) { | 
| // If the input event is still pending, go into input prioritized policy | 
| // and check again later. | 
| time_left_in_policy = escalated_priority_duration; | 
| @@ -415,175 +399,28 @@ base::TimeDelta RendererSchedulerImpl::TimeLeftInInputEscalatedPolicy( | 
| return time_left_in_policy; | 
| } | 
| -RendererSchedulerImpl::IdlePeriodState | 
| -RendererSchedulerImpl::ComputeNewLongIdlePeriodState( | 
| - const base::TimeTicks now, | 
| +bool RendererSchedulerImpl::CanEnterLongIdlePeriod( | 
| + base::TimeTicks now, | 
| base::TimeDelta* next_long_idle_period_delay_out) { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| + scheduler_helper_.CheckOnValidThread(); | 
| MaybeUpdatePolicy(); | 
| if (SchedulerPolicy() == Policy::TOUCHSTART_PRIORITY) { | 
| // Don't start a long idle task in touch start priority, try again when | 
| // the policy is scheduled to end. | 
| *next_long_idle_period_delay_out = current_policy_expiration_time_ - now; | 
| - return IdlePeriodState::NOT_IN_IDLE_PERIOD; | 
| - } | 
| - | 
| - base::TimeTicks next_pending_delayed_task = | 
| - task_queue_manager_->NextPendingDelayedTaskRunTime(); | 
| - base::TimeDelta max_long_idle_period_duration = | 
| - base::TimeDelta::FromMilliseconds(kMaximumIdlePeriodMillis); | 
| - base::TimeDelta long_idle_period_duration; | 
| - if (next_pending_delayed_task.is_null()) { | 
| - long_idle_period_duration = max_long_idle_period_duration; | 
| - } else { | 
| - // Limit the idle period duration to be before the next pending task. | 
| - long_idle_period_duration = std::min(next_pending_delayed_task - now, | 
| - max_long_idle_period_duration); | 
| - } | 
| - | 
| - if (long_idle_period_duration > base::TimeDelta()) { | 
| - *next_long_idle_period_delay_out = long_idle_period_duration; | 
| - return long_idle_period_duration == max_long_idle_period_duration | 
| - ? IdlePeriodState::IN_LONG_IDLE_PERIOD_WITH_MAX_DEADLINE | 
| - : IdlePeriodState::IN_LONG_IDLE_PERIOD; | 
| - } else { | 
| - // If we can't start the idle period yet then try again after wakeup. | 
| - *next_long_idle_period_delay_out = base::TimeDelta::FromMilliseconds( | 
| - kRetryInitiateLongIdlePeriodDelayMillis); | 
| - return IdlePeriodState::NOT_IN_IDLE_PERIOD; | 
| - } | 
| -} | 
| - | 
| -void RendererSchedulerImpl::InitiateLongIdlePeriod() { | 
| - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 
| - "InitiateLongIdlePeriod"); | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - | 
| - // End any previous idle period. | 
| - EndIdlePeriod(); | 
| - | 
| - base::TimeTicks now(Now()); | 
| - base::TimeDelta next_long_idle_period_delay; | 
| - IdlePeriodState new_idle_period_state = | 
| - ComputeNewLongIdlePeriodState(now, &next_long_idle_period_delay); | 
| - if (IsInIdlePeriod(new_idle_period_state)) { | 
| - estimated_next_frame_begin_ = now + next_long_idle_period_delay; | 
| - StartIdlePeriod(new_idle_period_state); | 
| - } | 
| - | 
| - if (task_queue_manager_->IsQueueEmpty(IDLE_TASK_QUEUE)) { | 
| - // If there are no current idle tasks then post the call to initiate the | 
| - // next idle for execution after wakeup (at which point after-wakeup idle | 
| - // tasks might be eligible to run or more idle tasks posted). | 
| - control_task_after_wakeup_runner_->PostDelayedTask( | 
| - FROM_HERE, | 
| - initiate_next_long_idle_period_after_wakeup_closure_.callback(), | 
| - next_long_idle_period_delay); | 
| - } else { | 
| - // Otherwise post on the normal control task queue. | 
| - control_task_runner_->PostDelayedTask( | 
| - FROM_HERE, | 
| - initiate_next_long_idle_period_closure_.callback(), | 
| - next_long_idle_period_delay); | 
| - } | 
| -} | 
| - | 
| -void RendererSchedulerImpl::InitiateLongIdlePeriodAfterWakeup() { | 
| - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 
| - "InitiateLongIdlePeriodAfterWakeup"); | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - | 
| - if (IsInIdlePeriod(idle_period_state_)) { | 
| - // Since we were asleep until now, end the async idle period trace event at | 
| - // the time when it would have ended were we awake. | 
| - TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP0( | 
| - "renderer.scheduler", "RendererSchedulerIdlePeriod", this, | 
| - std::min(estimated_next_frame_begin_, Now()).ToInternalValue()); | 
| - idle_period_state_ = IdlePeriodState::ENDING_LONG_IDLE_PERIOD; | 
| - EndIdlePeriod(); | 
| - } | 
| - | 
| - // Post a task to initiate the next long idle period rather than calling it | 
| - // directly to allow all pending PostIdleTaskAfterWakeup tasks to get enqueued | 
| - // on the idle task queue before the next idle period starts so they are | 
| - // eligible to be run during the new idle period. | 
| - control_task_runner_->PostTask( | 
| - FROM_HERE, | 
| - initiate_next_long_idle_period_closure_.callback()); | 
| -} | 
| - | 
| -void RendererSchedulerImpl::StartIdlePeriod(IdlePeriodState new_state) { | 
| - TRACE_EVENT_ASYNC_BEGIN0("renderer.scheduler", | 
| - "RendererSchedulerIdlePeriod", this); | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - DCHECK(IsInIdlePeriod(new_state)); | 
| - | 
| - renderer_task_queue_selector_->EnableQueue( | 
| - IDLE_TASK_QUEUE, RendererTaskQueueSelector::BEST_EFFORT_PRIORITY); | 
| - task_queue_manager_->PumpQueue(IDLE_TASK_QUEUE); | 
| - idle_period_state_ = new_state; | 
| -} | 
| - | 
| -void RendererSchedulerImpl::EndIdlePeriod() { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - | 
| - end_idle_period_closure_.Cancel(); | 
| - initiate_next_long_idle_period_closure_.Cancel(); | 
| - initiate_next_long_idle_period_after_wakeup_closure_.Cancel(); | 
| - | 
| - // If we weren't already within an idle period then early-out. | 
| - if (!IsInIdlePeriod(idle_period_state_)) | 
| - return; | 
| - | 
| - // If we are in the ENDING_LONG_IDLE_PERIOD state we have already logged the | 
| - // trace event. | 
| - if (idle_period_state_ != IdlePeriodState::ENDING_LONG_IDLE_PERIOD) { | 
| - bool is_tracing; | 
| - TRACE_EVENT_CATEGORY_GROUP_ENABLED("renderer.scheduler", &is_tracing); | 
| - if (is_tracing && !estimated_next_frame_begin_.is_null() && | 
| - base::TimeTicks::Now() > estimated_next_frame_begin_) { | 
| - TRACE_EVENT_ASYNC_STEP_INTO_WITH_TIMESTAMP0( | 
| - "renderer.scheduler", | 
| - "RendererSchedulerIdlePeriod", | 
| - this, | 
| - "DeadlineOverrun", | 
| - estimated_next_frame_begin_.ToInternalValue()); | 
| - } | 
| - TRACE_EVENT_ASYNC_END0("renderer.scheduler", | 
| - "RendererSchedulerIdlePeriod", this); | 
| + return false; | 
| } | 
| - | 
| - renderer_task_queue_selector_->DisableQueue(IDLE_TASK_QUEUE); | 
| - idle_period_state_ = IdlePeriodState::NOT_IN_IDLE_PERIOD; | 
| -} | 
| - | 
| -// static | 
| -bool RendererSchedulerImpl::IsInIdlePeriod(IdlePeriodState state) { | 
| - return state != IdlePeriodState::NOT_IN_IDLE_PERIOD; | 
| -} | 
| - | 
| -bool RendererSchedulerImpl::CanExceedIdleDeadlineIfRequired() const { | 
| - TRACE_EVENT_BEGIN0("renderer.scheduler", "CanExceedIdleDeadlineIfRequired"); | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - return idle_period_state_ == | 
| - IdlePeriodState::IN_LONG_IDLE_PERIOD_WITH_MAX_DEADLINE; | 
| + return true; | 
| } | 
| void RendererSchedulerImpl::SetTimeSourceForTesting( | 
| scoped_refptr<cc::TestNowSource> time_source) { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - time_source_ = time_source; | 
| - task_queue_manager_->SetTimeSourceForTesting(time_source); | 
| + scheduler_helper_.SetTimeSourceForTesting(time_source); | 
| } | 
| void RendererSchedulerImpl::SetWorkBatchSizeForTesting(size_t work_batch_size) { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - task_queue_manager_->SetWorkBatchSize(work_batch_size); | 
| -} | 
| - | 
| -base::TimeTicks RendererSchedulerImpl::Now() const { | 
| - return UNLIKELY(time_source_) ? time_source_->Now() : base::TimeTicks::Now(); | 
| + scheduler_helper_.SetWorkBatchSizeForTesting(work_batch_size); | 
| } | 
| RendererSchedulerImpl::PollableNeedsUpdateFlag::PollableNeedsUpdateFlag( | 
| @@ -655,38 +492,20 @@ const char* RendererSchedulerImpl::InputStreamStateToString( | 
| } | 
| } | 
| -const char* RendererSchedulerImpl::IdlePeriodStateToString( | 
| - IdlePeriodState idle_period_state) { | 
| - switch (idle_period_state) { | 
| - case IdlePeriodState::NOT_IN_IDLE_PERIOD: | 
| - return "not_in_idle_period"; | 
| - case IdlePeriodState::IN_SHORT_IDLE_PERIOD: | 
| - return "in_short_idle_period"; | 
| - case IdlePeriodState::IN_LONG_IDLE_PERIOD: | 
| - return "in_long_idle_period"; | 
| - case IdlePeriodState::IN_LONG_IDLE_PERIOD_WITH_MAX_DEADLINE: | 
| - return "in_long_idle_period_with_max_deadline"; | 
| - case IdlePeriodState::ENDING_LONG_IDLE_PERIOD: | 
| - return "ending_long_idle_period"; | 
| - default: | 
| - NOTREACHED(); | 
| - return nullptr; | 
| - } | 
| -} | 
| - | 
| scoped_refptr<base::trace_event::ConvertableToTraceFormat> | 
| RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| + scheduler_helper_.CheckOnValidThread(); | 
| incoming_signals_lock_.AssertAcquired(); | 
| if (optional_now.is_null()) | 
| - optional_now = Now(); | 
| + optional_now = scheduler_helper_.Now(); | 
| scoped_refptr<base::trace_event::TracedValue> state = | 
| new base::trace_event::TracedValue(); | 
| state->SetString("current_policy", PolicyToString(current_policy_)); | 
| state->SetString("idle_period_state", | 
| - IdlePeriodStateToString(idle_period_state_)); | 
| + SchedulerHelper::IdlePeriodStateToString( | 
| + scheduler_helper_.SchedulerIdlePeriodState())); | 
| state->SetString("input_stream_state", | 
| InputStreamStateToString(input_stream_state_)); | 
| state->SetDouble("now", (optional_now - base::TimeTicks()).InMillisecondsF()); | 
| @@ -696,9 +515,9 @@ RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { | 
| state->SetDouble( | 
| "last_input_process_time_on_main_", | 
| (last_input_process_time_on_main_ - base::TimeTicks()).InMillisecondsF()); | 
| - state->SetDouble( | 
| - "estimated_next_frame_begin", | 
| - (estimated_next_frame_begin_ - base::TimeTicks()).InMillisecondsF()); | 
| + state->SetDouble("estimated_next_frame_begin", | 
| + (scheduler_helper_.EstimatedNextFrameBegin() - | 
| + base::TimeTicks()).InMillisecondsF()); | 
| return state; | 
| } | 
| @@ -739,18 +558,4 @@ RendererSchedulerImpl::ComputeNewInputStreamState( | 
| return InputStreamState::ACTIVE; | 
| } | 
| -void RendererSchedulerImpl::AddTaskObserver( | 
| - base::MessageLoop::TaskObserver* task_observer) { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - if (task_queue_manager_) | 
| - task_queue_manager_->AddTaskObserver(task_observer); | 
| -} | 
| - | 
| -void RendererSchedulerImpl::RemoveTaskObserver( | 
| - base::MessageLoop::TaskObserver* task_observer) { | 
| - DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| - if (task_queue_manager_) | 
| - task_queue_manager_->RemoveTaskObserver(task_observer); | 
| -} | 
| - | 
| } // namespace content |