Chromium Code Reviews| Index: components/scheduler/child/idle_helper.h |
| diff --git a/components/scheduler/child/idle_helper.h b/components/scheduler/child/idle_helper.h |
| index 0994063d4a08e75ca620efd1cb2a7323b61e2b05..46b7a330f7d3ffa6b472137b56b5a52c25ac5591 100644 |
| --- a/components/scheduler/child/idle_helper.h |
| +++ b/components/scheduler/child/idle_helper.h |
| @@ -5,7 +5,9 @@ |
| #ifndef COMPONENTS_SCHEDULER_CHILD_IDLE_HELPER_H_ |
| #define COMPONENTS_SCHEDULER_CHILD_IDLE_HELPER_H_ |
| +#include "base/message_loop/message_loop.h" |
| #include "components/scheduler/child/cancelable_closure_holder.h" |
| +#include "components/scheduler/child/pollable_thread_safe_flag.h" |
| #include "components/scheduler/child/prioritizing_task_queue_selector.h" |
| #include "components/scheduler/child/single_thread_idle_task_runner.h" |
| #include "components/scheduler/scheduler_export.h" |
| @@ -15,7 +17,9 @@ namespace scheduler { |
| class SchedulerHelper; |
| // Common scheduler functionality for Idle tasks. |
| -class SCHEDULER_EXPORT IdleHelper { |
| +class SCHEDULER_EXPORT IdleHelper |
| + : public base::MessageLoop::TaskObserver, |
| + public SingleThreadIdleTaskRunner::Delegate { |
| public: |
| // Used to by scheduler implementations to customize idle behaviour. |
| class SCHEDULER_EXPORT Delegate { |
| @@ -44,7 +48,7 @@ class SCHEDULER_EXPORT IdleHelper { |
| IN_SHORT_IDLE_PERIOD, |
| IN_LONG_IDLE_PERIOD, |
| IN_LONG_IDLE_PERIOD_WITH_MAX_DEADLINE, |
| - ENDING_LONG_IDLE_PERIOD, |
| + IN_LONG_IDLE_PERIOD_PAUSED, |
| // Must be the last entry. |
| IDLE_PERIOD_STATE_COUNT, |
| FIRST_IDLE_PERIOD_STATE = NOT_IN_IDLE_PERIOD, |
| @@ -63,7 +67,7 @@ class SCHEDULER_EXPORT IdleHelper { |
| const char* disabled_by_default_tracing_category, |
| const char* idle_period_tracing_name, |
| base::TimeDelta required_quiescence_duration_before_long_idle_period); |
| - ~IdleHelper(); |
| + ~IdleHelper() override; |
| // Returns the idle task runner. Tasks posted to this runner may be reordered |
| // relative to other task types and may be starved for an arbitrarily long |
| @@ -80,12 +84,10 @@ class SCHEDULER_EXPORT IdleHelper { |
| // NOTE EndIdlePeriod will disable the long idle periods. |
| void EnableLongIdlePeriod(); |
| - // Start and end an idle period. If |post_end_idle_period| is true, it will |
| - // post a delayed EndIdlePeriod scheduled to occur at |idle_period_deadline|. |
| + // Start an idle period with a given idle period deadline. |
| void StartIdlePeriod(IdlePeriodState new_idle_period_state, |
| base::TimeTicks now, |
| - base::TimeTicks idle_period_deadline, |
| - bool post_end_idle_period); |
| + base::TimeTicks idle_period_deadline); |
| // This will end an idle period either started with StartIdlePeriod or |
| // EnableLongIdlePeriod. |
| @@ -101,16 +103,71 @@ class SCHEDULER_EXPORT IdleHelper { |
| // Must be called from the thread this class was created on. |
| bool CanExceedIdleDeadlineIfRequired() const; |
| - IdlePeriodState SchedulerIdlePeriodState() const; |
| + // Returns the deadline for the current idle task. |
| + base::TimeTicks CurrentIdleTaskDeadline() const; |
| + |
| + // SingleThreadIdleTaskRunner::Delegate implementation: |
| + void OnIdleTaskPosted() override; |
| + base::TimeTicks WillProcessIdleTask() const override; |
| + void DidProcessIdleTask() override; |
| - // IdleTaskDeadlineSupplier Implementation: |
| - void CurrentIdleTaskDeadlineCallback(base::TimeTicks* deadline_out) const; |
| + // base::MessageLoop::TaskObserver implementation: |
| + void WillProcessTask(const base::PendingTask& pending_task) override; |
| + void DidProcessTask(const base::PendingTask& pending_task) override; |
| + IdlePeriodState SchedulerIdlePeriodState() const; |
| static const char* IdlePeriodStateToString(IdlePeriodState state); |
| private: |
| friend class IdleHelperTest; |
| + class State { |
| + public: |
| + State(SchedulerHelper* helper, |
| + const char* tracing_category, |
| + const char* disabled_by_default_tracing_category, |
| + const char* idle_period_tracing_name); |
| + virtual ~State(); |
| + |
| + void WillProcessIdleTask() const; |
| + void DidProcessIdleTask() const; |
| + void UpdateState(IdlePeriodState new_state, |
| + base::TimeTicks new_deadline, |
| + base::TimeTicks optional_now); |
| + void TraceEventIdlePeriodStateChange(IdlePeriodState new_state, |
| + base::TimeTicks new_deadline, |
| + base::TimeTicks optional_now) const; |
| + |
| + IdlePeriodState idle_period_state() const { |
| + helper_->CheckOnValidThread(); |
|
alex clarke (OOO till 29th)
2015/05/29 13:24:49
If you're going to define this inline, you should
rmcilroy
2015/06/01 15:33:22
I moved it out-of-line.
|
| + return idle_period_state_; |
| + } |
| + base::TimeTicks idle_period_deadline() const { |
| + helper_->CheckOnValidThread(); |
| + return idle_period_deadline_; |
| + } |
| + bool idle_period_paused_flag() const { |
| + return idle_period_paused_flag_.IsSet(); |
| + } |
| + |
| + private: |
| + SchedulerHelper* helper_; // NOT OWNED |
| + |
| + base::Lock write_lock_; |
| + IdlePeriodState idle_period_state_; |
| + base::TimeTicks idle_period_deadline_; |
| + PollableThreadSafeFlag idle_period_paused_flag_; |
| + |
| + base::TimeTicks idle_period_deadline_for_tracing_; |
| + mutable base::TimeTicks last_traced_start_running_idle_task_; |
|
Sami
2015/05/29 09:38:06
I'm having trouble parsing this name. last_idle_ta
rmcilroy
2015/06/01 15:33:22
Done.
|
| + mutable bool nestable_events_started_; |
| + const char* tracing_category_; |
| + const char* disabled_by_default_tracing_category_; |
| + const char* idle_period_tracing_name_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(State); |
| + }; |
| + |
| // The minimum delay to wait between retrying to initiate a long idle time. |
| static const int kRetryEnableLongIdlePeriodDelayMillis = 1; |
| @@ -122,32 +179,32 @@ class SCHEDULER_EXPORT IdleHelper { |
| base::TimeDelta* next_long_idle_period_delay_out); |
| bool ShouldWaitForQuiescence(); |
| - void EnableLongIdlePeriodAfterWakeup(); |
| + void UpdateLongIdlePeriodStateAfterIdleTask(); |
| + |
| + void SetIdlePeriodState(IdlePeriodState new_state, |
| + base::TimeTicks new_deadline, |
| + base::TimeTicks optional_now); |
| // Returns true if |state| represents being within an idle period state. |
| static bool IsInIdlePeriod(IdlePeriodState state); |
| + // Returns true if |state| represents being within a long idle period state. |
| + static bool IsInLongIdlePeriod(IdlePeriodState state); |
| SchedulerHelper* helper_; // NOT OWNED |
| Delegate* delegate_; // NOT OWNED |
| size_t idle_queue_index_; |
| scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; |
| - CancelableClosureHolder end_idle_period_closure_; |
| CancelableClosureHolder enable_next_long_idle_period_closure_; |
| - CancelableClosureHolder enable_next_long_idle_period_after_wakeup_closure_; |
| - IdlePeriodState idle_period_state_; |
| + State state_; |
| // A bitmap which controls the set of queues that are checked for quiescence |
| // before triggering a long idle period. |
| uint64 quiescence_monitored_task_queue_mask_; |
| base::TimeDelta required_quiescence_duration_before_long_idle_period_; |
| - base::TimeTicks idle_period_deadline_; |
| - |
| - const char* tracing_category_; |
| const char* disabled_by_default_tracing_category_; |
| - const char* idle_period_tracing_name_; |
| base::WeakPtr<IdleHelper> weak_idle_helper_ptr_; |
| base::WeakPtrFactory<IdleHelper> weak_factory_; |