| 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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   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(TimeDelta delay) : delay_(delay) { | 
|   83       // timer_ is set in InitiateDelayedTask. |   83       // timer_ is set in InitiateDelayedTask. | 
|   84     } |   84     } | 
 |   85     virtual ~TimerTask() {} | 
|   85     BaseTimer_Helper* timer_; |   86     BaseTimer_Helper* timer_; | 
|   86     TimeDelta delay_; |   87     TimeDelta delay_; | 
|   87   }; |   88   }; | 
|   88  |   89  | 
|   89   // Used to orphan delayed_task_ so that when it runs it does nothing. |   90   // Used to orphan delayed_task_ so that when it runs it does nothing. | 
|   90   void OrphanDelayedTask(); |   91   void OrphanDelayedTask(); | 
|   91    |   92    | 
|   92   // Used to initiated a new delayed task.  This has the side-effect of |   93   // Used to initiated a new delayed task.  This has the side-effect of | 
|   93   // orphaning delayed_task_ if it is non-null. |   94   // orphaning delayed_task_ if it is non-null. | 
|   94   void InitiateDelayedTask(TimerTask* timer_task); |   95   void InitiateDelayedTask(TimerTask* timer_task); | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  128  private: |  129  private: | 
|  129   typedef BaseTimer<Receiver, kIsRepeating> SelfType; |  130   typedef BaseTimer<Receiver, kIsRepeating> SelfType; | 
|  130    |  131    | 
|  131   class TimerTask : public BaseTimer_Helper::TimerTask { |  132   class TimerTask : public BaseTimer_Helper::TimerTask { | 
|  132    public: |  133    public: | 
|  133     TimerTask(TimeDelta delay, Receiver* receiver, ReceiverMethod method) |  134     TimerTask(TimeDelta delay, Receiver* receiver, ReceiverMethod method) | 
|  134         : BaseTimer_Helper::TimerTask(delay), |  135         : BaseTimer_Helper::TimerTask(delay), | 
|  135           receiver_(receiver), |  136           receiver_(receiver), | 
|  136           method_(method) { |  137           method_(method) { | 
|  137     } |  138     } | 
 |  139  | 
 |  140     virtual ~TimerTask() { | 
 |  141       // This task may be getting cleared because the MessageLoop has been | 
 |  142       // destructed.  If so, don't leave the Timer with a dangling pointer | 
 |  143       // to this now-defunct task. | 
 |  144       ClearBaseTimer(); | 
 |  145     } | 
 |  146  | 
|  138     virtual void Run() { |  147     virtual void Run() { | 
|  139       if (!timer_)  // timer_ is null if we were orphaned. |  148       if (!timer_)  // timer_ is null if we were orphaned. | 
|  140         return; |  149         return; | 
|  141       SelfType* self = static_cast<SelfType*>(timer_); |  150       if (kIsRepeating) | 
|  142       if (kIsRepeating) { |  151         ResetBaseTimer(); | 
|  143         self->Reset(); |  152       else | 
|  144       } else { |  153         ClearBaseTimer(); | 
|  145         self->delayed_task_ = NULL; |  | 
|  146       } |  | 
|  147       DispatchToMethod(receiver_, method_, Tuple0()); |  154       DispatchToMethod(receiver_, method_, Tuple0()); | 
|  148     } |  155     } | 
 |  156  | 
|  149     TimerTask* Clone() const { |  157     TimerTask* Clone() const { | 
|  150       return new TimerTask(delay_, receiver_, method_); |  158       return new TimerTask(delay_, receiver_, method_); | 
|  151     } |  159     } | 
 |  160  | 
|  152    private: |  161    private: | 
 |  162     // Inform the Base that the timer is no longer active. | 
 |  163     void ClearBaseTimer() { | 
 |  164       if (timer_) { | 
 |  165         SelfType* self = static_cast<SelfType*>(timer_); | 
 |  166         // It is possible that the Timer has already been reset, and that this | 
 |  167         // Task is old.  So, if the Timer points to a different task, assume | 
 |  168         // that the Timer has already taken care of properly setting the task. | 
 |  169         if (self->delayed_task_ == this) | 
 |  170           self->delayed_task_ = NULL; | 
 |  171       } | 
 |  172     } | 
 |  173  | 
 |  174     // Inform the Base that we're resetting the timer. | 
 |  175     void ResetBaseTimer() { | 
 |  176       DCHECK(timer_); | 
 |  177       DCHECK(kIsRepeating); | 
 |  178       SelfType* self = static_cast<SelfType*>(timer_); | 
 |  179       self->Reset(); | 
 |  180     } | 
 |  181  | 
|  153     Receiver* receiver_; |  182     Receiver* receiver_; | 
|  154     ReceiverMethod method_; |  183     ReceiverMethod method_; | 
|  155   }; |  184   }; | 
|  156 }; |  185 }; | 
|  157  |  186  | 
|  158 //----------------------------------------------------------------------------- |  187 //----------------------------------------------------------------------------- | 
|  159 // A simple, one-shot timer.  See usage notes at the top of the file. |  188 // A simple, one-shot timer.  See usage notes at the top of the file. | 
|  160 template <class Receiver> |  189 template <class Receiver> | 
|  161 class OneShotTimer : public BaseTimer<Receiver, false> {}; |  190 class OneShotTimer : public BaseTimer<Receiver, false> {}; | 
|  162  |  191  | 
|  163 //----------------------------------------------------------------------------- |  192 //----------------------------------------------------------------------------- | 
|  164 // A simple, repeating timer.  See usage notes at the top of the file. |  193 // A simple, repeating timer.  See usage notes at the top of the file. | 
|  165 template <class Receiver> |  194 template <class Receiver> | 
|  166 class RepeatingTimer : public BaseTimer<Receiver, true> {}; |  195 class RepeatingTimer : public BaseTimer<Receiver, true> {}; | 
|  167  |  196  | 
|  168 }  // namespace base |  197 }  // namespace base | 
|  169  |  198  | 
|  170 #endif  // BASE_TIMER_H_ |  199 #endif  // BASE_TIMER_H_ | 
| OLD | NEW |