| // Copyright 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CC_SCHEDULER_DELAY_BASED_TIME_SOURCE_H_ |
| #define CC_SCHEDULER_DELAY_BASED_TIME_SOURCE_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include "base/cancelable_callback.h" |
| #include "base/macros.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/values.h" |
| #include "cc/base/cc_export.h" |
| |
| namespace base { |
| namespace trace_event { |
| class TracedValue; |
| } |
| class SingleThreadTaskRunner; |
| } |
| |
| namespace cc { |
| class CC_EXPORT DelayBasedTimeSourceClient { |
| public: |
| virtual void OnTimerTick() = 0; |
| |
| protected: |
| virtual ~DelayBasedTimeSourceClient() {} |
| }; |
| |
| // This timer implements a time source that achieves the specified interval |
| // in face of millisecond-precision delayed callbacks and random queueing |
| // delays. DelayBasedTimeSource uses base::TimeTicks::Now as its timebase. |
| class CC_EXPORT DelayBasedTimeSource { |
| public: |
| explicit DelayBasedTimeSource(base::SingleThreadTaskRunner* task_runner); |
| virtual ~DelayBasedTimeSource(); |
| |
| void SetClient(DelayBasedTimeSourceClient* client); |
| |
| void SetTimebaseAndInterval(base::TimeTicks timebase, |
| base::TimeDelta interval); |
| |
| base::TimeDelta Interval() const; |
| |
| void SetActive(bool active); |
| bool Active() const; |
| |
| // Get the last and next tick times. NextTickTime() returns null when |
| // inactive. |
| base::TimeTicks LastTickTime() const; |
| base::TimeTicks NextTickTime() const; |
| |
| virtual void AsValueInto(base::trace_event::TracedValue* dict) const; |
| |
| protected: |
| // Virtual for testing. |
| virtual base::TimeTicks Now() const; |
| virtual std::string TypeString() const; |
| |
| private: |
| void PostNextTickTask(base::TimeTicks now); |
| void ResetTickTask(base::TimeTicks now); |
| |
| void OnTimerTick(); |
| |
| DelayBasedTimeSourceClient* client_; |
| |
| bool active_; |
| |
| base::TimeTicks timebase_; |
| base::TimeDelta interval_; |
| |
| base::TimeTicks last_tick_time_; |
| base::TimeTicks next_tick_time_; |
| |
| base::CancelableClosure tick_closure_; |
| |
| base::SingleThreadTaskRunner* task_runner_; |
| |
| base::WeakPtrFactory<DelayBasedTimeSource> weak_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DelayBasedTimeSource); |
| }; |
| |
| } // namespace cc |
| |
| #endif // CC_SCHEDULER_DELAY_BASED_TIME_SOURCE_H_ |