Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(456)

Unified Diff: content/renderer/scheduler/renderer_scheduler_impl.cc

Issue 1025323003: Introduce a SchedulerHelper in content/child/scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added the delegate Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698