| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 // OneShotTimer and RepeatingTimer provide a simple timer API. As the names | 5 // OneShotTimer and RepeatingTimer provide a simple timer API. As the names |
| 6 // suggest, OneShotTimer calls you back once after a time delay expires. | 6 // suggest, OneShotTimer calls you back once after a time delay expires. |
| 7 // RepeatingTimer on the other hand calls you back periodically with the | 7 // RepeatingTimer on the other hand calls you back periodically with the |
| 8 // prescribed time interval. | 8 // prescribed time interval. |
| 9 // | 9 // |
| 10 // OneShotTimer and RepeatingTimer both cancel the timer when they go out of | 10 // OneShotTimer and RepeatingTimer both cancel the timer when they go out of |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 OrphanDelayedTask(); | 61 OrphanDelayedTask(); |
| 62 } | 62 } |
| 63 | 63 |
| 64 // Returns true if the timer is running (i.e., not stopped). | 64 // Returns true if the timer is running (i.e., not stopped). |
| 65 bool IsRunning() const { | 65 bool IsRunning() const { |
| 66 return delayed_task_ != NULL; | 66 return delayed_task_ != NULL; |
| 67 } | 67 } |
| 68 | 68 |
| 69 // Returns the current delay for this timer. May only call this method when | 69 // Returns the current delay for this timer. May only call this method when |
| 70 // the timer is running! | 70 // the timer is running! |
| 71 TimeDelta GetCurrentDelay() const { | 71 base::TimeDelta GetCurrentDelay() const { |
| 72 DCHECK(IsRunning()); | 72 DCHECK(IsRunning()); |
| 73 return delayed_task_->delay_; | 73 return delayed_task_->delay_; |
| 74 } | 74 } |
| 75 | 75 |
| 76 protected: | 76 protected: |
| 77 BaseTimer_Helper() : delayed_task_(NULL) {} | 77 BaseTimer_Helper() : delayed_task_(NULL) {} |
| 78 | 78 |
| 79 // We have access to the timer_ member so we can orphan this task. | 79 // We have access to the timer_ member so we can orphan this task. |
| 80 class TimerTask : public Task { | 80 class TimerTask : public Task { |
| 81 public: | 81 public: |
| 82 TimerTask(TimeDelta delay) : delay_(delay) { | 82 TimerTask(base::TimeDelta delay) : delay_(delay) { |
| 83 // timer_ is set in InitiateDelayedTask. | 83 // timer_ is set in InitiateDelayedTask. |
| 84 } | 84 } |
| 85 BaseTimer_Helper* timer_; | 85 BaseTimer_Helper* timer_; |
| 86 TimeDelta delay_; | 86 base::TimeDelta delay_; |
| 87 }; | 87 }; |
| 88 | 88 |
| 89 // Used to orphan delayed_task_ so that when it runs it does nothing. | 89 // Used to orphan delayed_task_ so that when it runs it does nothing. |
| 90 void OrphanDelayedTask(); | 90 void OrphanDelayedTask(); |
| 91 | 91 |
| 92 // Used to initiated a new delayed task. This has the side-effect of | 92 // Used to initiated a new delayed task. This has the side-effect of |
| 93 // orphaning delayed_task_ if it is non-null. | 93 // orphaning delayed_task_ if it is non-null. |
| 94 void InitiateDelayedTask(TimerTask* timer_task); | 94 void InitiateDelayedTask(TimerTask* timer_task); |
| 95 | 95 |
| 96 TimerTask* delayed_task_; | 96 TimerTask* delayed_task_; |
| 97 | 97 |
| 98 DISALLOW_COPY_AND_ASSIGN(BaseTimer_Helper); | 98 DISALLOW_COPY_AND_ASSIGN(BaseTimer_Helper); |
| 99 }; | 99 }; |
| 100 | 100 |
| 101 //----------------------------------------------------------------------------- | 101 //----------------------------------------------------------------------------- |
| 102 // This class is an implementation detail of OneShotTimer and RepeatingTimer. | 102 // This class is an implementation detail of OneShotTimer and RepeatingTimer. |
| 103 // Please do not use this class directly. | 103 // Please do not use this class directly. |
| 104 template <class Receiver, bool kIsRepeating> | 104 template <class Receiver, bool kIsRepeating> |
| 105 class BaseTimer : public BaseTimer_Helper { | 105 class BaseTimer : public BaseTimer_Helper { |
| 106 public: | 106 public: |
| 107 typedef void (Receiver::*ReceiverMethod)(); | 107 typedef void (Receiver::*ReceiverMethod)(); |
| 108 | 108 |
| 109 // Call this method to start the timer. It is an error to call this method | 109 // Call this method to start the timer. It is an error to call this method |
| 110 // while the timer is already running. | 110 // while the timer is already running. |
| 111 void Start(TimeDelta delay, Receiver* receiver, ReceiverMethod method) { | 111 void Start(base::TimeDelta delay, Receiver* receiver, ReceiverMethod method) { |
| 112 DCHECK(!IsRunning()); | 112 DCHECK(!IsRunning()); |
| 113 InitiateDelayedTask(new TimerTask(delay, receiver, method)); | 113 InitiateDelayedTask(new TimerTask(delay, receiver, method)); |
| 114 } | 114 } |
| 115 | 115 |
| 116 // Call this method to stop the timer. It is a no-op if the timer is not | 116 // Call this method to stop the timer. It is a no-op if the timer is not |
| 117 // running. | 117 // running. |
| 118 void Stop() { | 118 void Stop() { |
| 119 OrphanDelayedTask(); | 119 OrphanDelayedTask(); |
| 120 } | 120 } |
| 121 | 121 |
| 122 // Call this method to reset the timer delay of an already running timer. | 122 // Call this method to reset the timer delay of an already running timer. |
| 123 void Reset() { | 123 void Reset() { |
| 124 DCHECK(IsRunning()); | 124 DCHECK(IsRunning()); |
| 125 InitiateDelayedTask(static_cast<TimerTask*>(delayed_task_)->Clone()); | 125 InitiateDelayedTask(static_cast<TimerTask*>(delayed_task_)->Clone()); |
| 126 } | 126 } |
| 127 | 127 |
| 128 private: | 128 private: |
| 129 typedef BaseTimer<Receiver, kIsRepeating> SelfType; | 129 typedef BaseTimer<Receiver, kIsRepeating> SelfType; |
| 130 | 130 |
| 131 class TimerTask : public BaseTimer_Helper::TimerTask { | 131 class TimerTask : public BaseTimer_Helper::TimerTask { |
| 132 public: | 132 public: |
| 133 TimerTask(TimeDelta delay, Receiver* receiver, ReceiverMethod method) | 133 TimerTask(base::TimeDelta delay, Receiver* receiver, ReceiverMethod method) |
| 134 : BaseTimer_Helper::TimerTask(delay), | 134 : BaseTimer_Helper::TimerTask(delay), |
| 135 receiver_(receiver), | 135 receiver_(receiver), |
| 136 method_(method) { | 136 method_(method) { |
| 137 } | 137 } |
| 138 virtual void Run() { | 138 virtual void Run() { |
| 139 if (!timer_) // timer_ is null if we were orphaned. | 139 if (!timer_) // timer_ is null if we were orphaned. |
| 140 return; | 140 return; |
| 141 SelfType* self = static_cast<SelfType*>(timer_); | 141 SelfType* self = static_cast<SelfType*>(timer_); |
| 142 if (kIsRepeating) { | 142 if (kIsRepeating) { |
| 143 self->Reset(); | 143 self->Reset(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 161 class OneShotTimer : public BaseTimer<Receiver, false> {}; | 161 class OneShotTimer : public BaseTimer<Receiver, false> {}; |
| 162 | 162 |
| 163 //----------------------------------------------------------------------------- | 163 //----------------------------------------------------------------------------- |
| 164 // A simple, repeating timer. See usage notes at the top of the file. | 164 // A simple, repeating timer. See usage notes at the top of the file. |
| 165 template <class Receiver> | 165 template <class Receiver> |
| 166 class RepeatingTimer : public BaseTimer<Receiver, true> {}; | 166 class RepeatingTimer : public BaseTimer<Receiver, true> {}; |
| 167 | 167 |
| 168 } // namespace base | 168 } // namespace base |
| 169 | 169 |
| 170 #endif // BASE_TIMER_H_ | 170 #endif // BASE_TIMER_H_ |
| OLD | NEW |