| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/scheduler/renderer_scheduler_impl.h" | 5 #include "content/renderer/scheduler/renderer_scheduler_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop_proxy.h" | 8 #include "base/message_loop/message_loop_proxy.h" |
| 9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
| 10 #include "base/trace_event/trace_event_argument.h" | 10 #include "base/trace_event/trace_event_argument.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 compositor_task_runner_( | 31 compositor_task_runner_( |
| 32 task_queue_manager_->TaskRunnerForQueue(COMPOSITOR_TASK_QUEUE)), | 32 task_queue_manager_->TaskRunnerForQueue(COMPOSITOR_TASK_QUEUE)), |
| 33 loading_task_runner_( | 33 loading_task_runner_( |
| 34 task_queue_manager_->TaskRunnerForQueue(LOADING_TASK_QUEUE)), | 34 task_queue_manager_->TaskRunnerForQueue(LOADING_TASK_QUEUE)), |
| 35 delayed_update_policy_runner_( | 35 delayed_update_policy_runner_( |
| 36 base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 36 base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 37 base::Unretained(this)), | 37 base::Unretained(this)), |
| 38 control_task_runner_), | 38 control_task_runner_), |
| 39 current_policy_(Policy::NORMAL), | 39 current_policy_(Policy::NORMAL), |
| 40 idle_period_state_(IdlePeriodState::NOT_IN_IDLE_PERIOD), | 40 idle_period_state_(IdlePeriodState::NOT_IN_IDLE_PERIOD), |
| 41 long_idle_periods_enabled_(false), | |
| 42 last_input_type_(blink::WebInputEvent::Undefined), | 41 last_input_type_(blink::WebInputEvent::Undefined), |
| 43 input_stream_state_(InputStreamState::INACTIVE), | 42 input_stream_state_(InputStreamState::INACTIVE), |
| 44 policy_may_need_update_(&incoming_signals_lock_), | 43 policy_may_need_update_(&incoming_signals_lock_), |
| 45 weak_factory_(this) { | 44 weak_factory_(this) { |
| 46 weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr(); | 45 weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr(); |
| 47 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 46 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 48 weak_renderer_scheduler_ptr_); | 47 weak_renderer_scheduler_ptr_); |
| 49 end_idle_period_closure_.Reset(base::Bind( | 48 end_idle_period_closure_.Reset(base::Bind( |
| 50 &RendererSchedulerImpl::EndIdlePeriod, weak_renderer_scheduler_ptr_)); | 49 &RendererSchedulerImpl::EndIdlePeriod, weak_renderer_scheduler_ptr_)); |
| 51 initiate_next_long_idle_period_closure_.Reset(base::Bind( | 50 initiate_next_long_idle_period_closure_.Reset(base::Bind( |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 "InitiateLongIdlePeriod"); | 460 "InitiateLongIdlePeriod"); |
| 462 DCHECK(main_thread_checker_.CalledOnValidThread()); | 461 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 463 | 462 |
| 464 // End any previous idle period. | 463 // End any previous idle period. |
| 465 EndIdlePeriod(); | 464 EndIdlePeriod(); |
| 466 | 465 |
| 467 base::TimeTicks now(Now()); | 466 base::TimeTicks now(Now()); |
| 468 base::TimeDelta next_long_idle_period_delay; | 467 base::TimeDelta next_long_idle_period_delay; |
| 469 IdlePeriodState new_idle_period_state = | 468 IdlePeriodState new_idle_period_state = |
| 470 ComputeNewLongIdlePeriodState(now, &next_long_idle_period_delay); | 469 ComputeNewLongIdlePeriodState(now, &next_long_idle_period_delay); |
| 471 if (long_idle_periods_enabled_ && IsInIdlePeriod(new_idle_period_state)) { | 470 if (IsInIdlePeriod(new_idle_period_state)) { |
| 472 estimated_next_frame_begin_ = now + next_long_idle_period_delay; | 471 estimated_next_frame_begin_ = now + next_long_idle_period_delay; |
| 473 StartIdlePeriod(new_idle_period_state); | 472 StartIdlePeriod(new_idle_period_state); |
| 474 } | 473 } |
| 475 | 474 |
| 476 if (task_queue_manager_->IsQueueEmpty(IDLE_TASK_QUEUE)) { | 475 if (task_queue_manager_->IsQueueEmpty(IDLE_TASK_QUEUE)) { |
| 477 // If there are no current idle tasks then post the call to initiate the | 476 // If there are no current idle tasks then post the call to initiate the |
| 478 // next idle for execution after wakeup (at which point after-wakeup idle | 477 // next idle for execution after wakeup (at which point after-wakeup idle |
| 479 // tasks might be eligible to run or more idle tasks posted). | 478 // tasks might be eligible to run or more idle tasks posted). |
| 480 control_task_after_wakeup_runner_->PostDelayedTask( | 479 control_task_after_wakeup_runner_->PostDelayedTask( |
| 481 FROM_HERE, | 480 FROM_HERE, |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 DCHECK(main_thread_checker_.CalledOnValidThread()); | 575 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 577 time_source_ = time_source; | 576 time_source_ = time_source; |
| 578 task_queue_manager_->SetTimeSourceForTesting(time_source); | 577 task_queue_manager_->SetTimeSourceForTesting(time_source); |
| 579 } | 578 } |
| 580 | 579 |
| 581 void RendererSchedulerImpl::SetWorkBatchSizeForTesting(size_t work_batch_size) { | 580 void RendererSchedulerImpl::SetWorkBatchSizeForTesting(size_t work_batch_size) { |
| 582 DCHECK(main_thread_checker_.CalledOnValidThread()); | 581 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 583 task_queue_manager_->SetWorkBatchSize(work_batch_size); | 582 task_queue_manager_->SetWorkBatchSize(work_batch_size); |
| 584 } | 583 } |
| 585 | 584 |
| 586 void RendererSchedulerImpl::SetLongIdlePeriodsEnabledForTesting( | |
| 587 bool long_idle_periods_enabled) { | |
| 588 DCHECK(main_thread_checker_.CalledOnValidThread()); | |
| 589 long_idle_periods_enabled_ = long_idle_periods_enabled; | |
| 590 } | |
| 591 | |
| 592 base::TimeTicks RendererSchedulerImpl::Now() const { | 585 base::TimeTicks RendererSchedulerImpl::Now() const { |
| 593 return UNLIKELY(time_source_) ? time_source_->Now() : base::TimeTicks::Now(); | 586 return UNLIKELY(time_source_) ? time_source_->Now() : base::TimeTicks::Now(); |
| 594 } | 587 } |
| 595 | 588 |
| 596 RendererSchedulerImpl::PollableNeedsUpdateFlag::PollableNeedsUpdateFlag( | 589 RendererSchedulerImpl::PollableNeedsUpdateFlag::PollableNeedsUpdateFlag( |
| 597 base::Lock* write_lock_) | 590 base::Lock* write_lock_) |
| 598 : flag_(false), write_lock_(write_lock_) { | 591 : flag_(false), write_lock_(write_lock_) { |
| 599 } | 592 } |
| 600 | 593 |
| 601 RendererSchedulerImpl::PollableNeedsUpdateFlag::~PollableNeedsUpdateFlag() { | 594 RendererSchedulerImpl::PollableNeedsUpdateFlag::~PollableNeedsUpdateFlag() { |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 } | 747 } |
| 755 | 748 |
| 756 void RendererSchedulerImpl::RemoveTaskObserver( | 749 void RendererSchedulerImpl::RemoveTaskObserver( |
| 757 base::MessageLoop::TaskObserver* task_observer) { | 750 base::MessageLoop::TaskObserver* task_observer) { |
| 758 DCHECK(main_thread_checker_.CalledOnValidThread()); | 751 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 759 if (task_queue_manager_) | 752 if (task_queue_manager_) |
| 760 task_queue_manager_->RemoveTaskObserver(task_observer); | 753 task_queue_manager_->RemoveTaskObserver(task_observer); |
| 761 } | 754 } |
| 762 | 755 |
| 763 } // namespace content | 756 } // namespace content |
| OLD | NEW |