1 // Copyright 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CC_SCHEDULER_DELAY_BASED_TIME_SOURCE_H_ 6 #define CC_SCHEDULER_DELAY_BASED_TIME_SOURCE_H_ 7 8 #include "base/memory/weak_ptr.h" 9 #include "cc/base/cc_export.h" 10 #include "cc/scheduler/time_source.h" 11 12 namespace base { class SingleThreadTaskRunner; } 13 14 namespace cc { 15 16 // This timer implements a time source that achieves the specified interval 17 // in face of millisecond-precision delayed callbacks and random queueing 18 // delays. 19 class CC_EXPORT DelayBasedTimeSource : public TimeSource { 20 public: 21 static scoped_refptr<DelayBasedTimeSource> Create( 22 base::TimeDelta interval, base::SingleThreadTaskRunner* task_runner); 23 24 virtual void SetClient(TimeSourceClient* client) OVERRIDE; 25 26 // TimeSource implementation 27 virtual void SetTimebaseAndInterval(base::TimeTicks timebase, 28 base::TimeDelta interval) OVERRIDE; 29 30 virtual void SetActive(bool active) OVERRIDE; 31 virtual bool Active() const OVERRIDE; 32 33 // Get the last and next tick times. nextTimeTime() returns null when 34 // inactive. 35 virtual base::TimeTicks LastTickTime() OVERRIDE; 36 virtual base::TimeTicks NextTickTime() OVERRIDE; 37 38 // Virtual for testing. 39 virtual base::TimeTicks Now() const; 40 41 protected: 42 DelayBasedTimeSource(base::TimeDelta interval, 43 base::SingleThreadTaskRunner* task_runner); 44 virtual ~DelayBasedTimeSource(); 45 46 base::TimeTicks NextTickTarget(base::TimeTicks now); 47 void PostNextTickTask(base::TimeTicks now); 48 void OnTimerFired(); 49 50 enum State { 51 STATE_INACTIVE, 52 STATE_STARTING, 53 STATE_ACTIVE, 54 }; 55 56 struct Parameters { 57 Parameters(base::TimeDelta interval, base::TimeTicks tick_target) 58 : interval(interval), tick_target(tick_target) {} 59 base::TimeDelta interval; 60 base::TimeTicks tick_target; 61 }; 62 63 TimeSourceClient* client_; 64 bool has_tick_target_; 65 base::TimeTicks last_tick_time_; 66 67 // current_parameters_ should only be written by PostNextTickTask. 68 // next_parameters_ will take effect on the next call to PostNextTickTask. 69 // Maintaining a pending set of parameters allows NextTickTime() to always 70 // reflect the actual time we expect OnTimerFired to be called. 71 Parameters current_parameters_; 72 Parameters next_parameters_; 73 74 State state_; 75 76 base::SingleThreadTaskRunner* task_runner_; 77 base::WeakPtrFactory<DelayBasedTimeSource> weak_factory_; 78 79 private: 80 DISALLOW_COPY_AND_ASSIGN(DelayBasedTimeSource); 81 }; 82 83 } // namespace cc 84 85 #endif // CC_SCHEDULER_DELAY_BASED_TIME_SOURCE_H_ 86