Index: base/timer/timer.h |
diff --git a/base/timer/timer.h b/base/timer/timer.h |
index 661829b513d8281f99bb63741b91f9c026e6ff39..50aedbd4cec28e97c408b2acd8b896c70526732c 100644 |
--- a/base/timer/timer.h |
+++ b/base/timer/timer.h |
@@ -49,6 +49,8 @@ |
// because they're flaky on the buildbot, but when you run them locally you |
// should be able to tell the difference. |
+#include <memory> |
+ |
#include "base/base_export.h" |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
@@ -61,6 +63,7 @@ namespace base { |
class BaseTimerTaskInternal; |
class SingleThreadTaskRunner; |
+class TickClock; |
//----------------------------------------------------------------------------- |
// This class wraps MessageLoop::PostDelayedTask to manage delayed and repeating |
@@ -71,14 +74,23 @@ class BASE_EXPORT Timer { |
public: |
// Construct a timer in repeating or one-shot mode. Start or SetTaskInfo must |
// be called later to set task info. |retain_user_task| determines whether the |
- // user_task is retained or reset when it runs or stops. |
+ // user_task is retained or reset when it runs or stops. If |tick_clock| is |
+ // provided, it is used instead of TimeTicks::Now() to get TimeTicks when |
+ // scheduling tasks. |
Timer(bool retain_user_task, bool is_repeating); |
+ Timer(bool retain_user_task, bool is_repeating, TickClock* tick_clock); |
- // Construct a timer with retained task info. |
+ // Construct a timer with retained task info. If |tick_clock| is provided, it |
+ // is used instead of TimeTicks::Now() to get TimeTicks when scheduling tasks. |
Timer(const tracked_objects::Location& posted_from, |
TimeDelta delay, |
const base::Closure& user_task, |
bool is_repeating); |
+ Timer(const tracked_objects::Location& posted_from, |
+ TimeDelta delay, |
+ const base::Closure& user_task, |
+ bool is_repeating, |
+ TickClock* tick_clock); |
virtual ~Timer(); |
@@ -111,6 +123,9 @@ class BASE_EXPORT Timer { |
const TimeTicks& desired_run_time() const { return desired_run_time_; } |
protected: |
+ // Returns the current tick count. |
+ TimeTicks Now() const; |
+ |
// Used to initiate a new delayed task. This has the side-effect of disabling |
// scheduled_task_ if it is non-null. |
void SetTaskInfo(const tracked_objects::Location& posted_from, |
@@ -191,6 +206,9 @@ class BASE_EXPORT Timer { |
// If true, hold on to the user_task_ closure object for reuse. |
const bool retain_user_task_; |
+ // The tick clock used to calculate the run time for scheduled tasks. |
+ TickClock* const tick_clock_; |
+ |
// If true, user_task_ is scheduled to run sometime in the future. |
bool is_running_; |
@@ -210,8 +228,8 @@ class BaseTimerMethodPointer : public Timer { |
using Timer::Start; |
enum RepeatMode { ONE_SHOT, REPEATING }; |
- BaseTimerMethodPointer(RepeatMode mode) |
- : Timer(mode == REPEATING, mode == REPEATING) {} |
+ BaseTimerMethodPointer(RepeatMode mode, TickClock* tick_clock) |
+ : Timer(mode == REPEATING, mode == REPEATING, tick_clock) {} |
// Start the timer to run at the given |delay| from now. If the timer is |
// already running, it will be replaced to call a task formed from |
@@ -230,14 +248,18 @@ class BaseTimerMethodPointer : public Timer { |
// A simple, one-shot timer. See usage notes at the top of the file. |
class OneShotTimer : public BaseTimerMethodPointer { |
public: |
- OneShotTimer() : BaseTimerMethodPointer(ONE_SHOT) {} |
+ OneShotTimer() : OneShotTimer(nullptr) {} |
+ explicit OneShotTimer(TickClock* tick_clock) |
+ : BaseTimerMethodPointer(ONE_SHOT, tick_clock) {} |
}; |
//----------------------------------------------------------------------------- |
// A simple, repeating timer. See usage notes at the top of the file. |
class RepeatingTimer : public BaseTimerMethodPointer { |
public: |
- RepeatingTimer() : BaseTimerMethodPointer(REPEATING) {} |
+ RepeatingTimer() : RepeatingTimer(nullptr) {} |
+ explicit RepeatingTimer(TickClock* tick_clock) |
+ : BaseTimerMethodPointer(REPEATING, tick_clock) {} |
}; |
//----------------------------------------------------------------------------- |
@@ -258,10 +280,19 @@ class DelayTimer : protected Timer { |
TimeDelta delay, |
Receiver* receiver, |
void (Receiver::*method)()) |
+ : DelayTimer(posted_from, delay, receiver, method, nullptr) {} |
+ |
+ template <class Receiver> |
+ DelayTimer(const tracked_objects::Location& posted_from, |
+ TimeDelta delay, |
+ Receiver* receiver, |
+ void (Receiver::*method)(), |
+ TickClock* tick_clock) |
: Timer(posted_from, |
delay, |
base::Bind(method, base::Unretained(receiver)), |
- false) {} |
+ false, |
+ tick_clock) {} |
void Reset() override; |
}; |