Chromium Code Reviews| Index: base/timer/timer.h |
| diff --git a/base/timer/timer.h b/base/timer/timer.h |
| index c5bd9ced5ae277f614fc53b49b83441458ec5cdc..e4d7514cfb7036398f7aa2aa66f33e8d0473a6bc 100644 |
| --- a/base/timer/timer.h |
| +++ b/base/timer/timer.h |
| @@ -39,7 +39,10 @@ |
| // other words, Reset is shorthand for calling Stop and then Start again with |
| // the same arguments. |
| // |
| -// NOTE: These APIs are not thread safe. Always call from the same thread. |
| +// These APIs are not thread safe. Always call from the same sequenced task |
| +// runner - thread or worker pool. By default the scheduled tasks will be run |
| +// on the same sequence that the APIs are called from, but this can be changed |
| +// prior to any tasks being scheduled using SetTaskRunner(). |
| #ifndef BASE_TIMER_TIMER_H_ |
| #define BASE_TIMER_TIMER_H_ |
| @@ -55,17 +58,18 @@ |
| #include "base/bind_helpers.h" |
| #include "base/callback.h" |
| #include "base/location.h" |
| +#include "base/sequence_checker.h" |
| #include "base/time/time.h" |
| namespace base { |
| class BaseTimerTaskInternal; |
| -class SingleThreadTaskRunner; |
| +class SequencedTaskRunner; |
| //----------------------------------------------------------------------------- |
| -// This class wraps MessageLoop::PostDelayedTask to manage delayed and repeating |
| -// tasks. It must be destructed on the same thread that starts tasks. There are |
| -// DCHECKs in place to verify this. |
| +// This class wraps TaskRunner::PostDelayedTask to manage delayed and |
| +// repeating tasks. It must be destructed on the same task runner that starts |
| +// tasks. There are DCHECKs in place to verify this. |
| // |
| class BASE_EXPORT Timer { |
| public: |
| @@ -89,9 +93,9 @@ class BASE_EXPORT Timer { |
| virtual TimeDelta GetCurrentDelay() const; |
| // Set the task runner on which the task should be scheduled. This method can |
| - // only be called before any tasks have been scheduled. The task runner must |
| - // run tasks on the same thread the timer is used on. |
| - virtual void SetTaskRunner(scoped_refptr<SingleThreadTaskRunner> task_runner); |
| + // only be called before any tasks have been scheduled. |task_runner| must |
| + // run tasks on the same sequenced the timer is used on. |
| + virtual void SetTaskRunner(scoped_refptr<SequencedTaskRunner> task_runner); |
| // Start the timer to run at the given |delay| from now. If the timer is |
| // already running, it will be replaced to call the given |user_task|. |
| @@ -134,10 +138,10 @@ class BASE_EXPORT Timer { |
| // and desired_run_time_ are reset to Now() + delay. |
| void PostNewScheduledTask(TimeDelta delay); |
| - // Returns the task runner on which the task should be scheduled. If the |
| - // corresponding task_runner_ field is null, the task runner for the current |
| - // thread is returned. |
| - scoped_refptr<SingleThreadTaskRunner> GetTaskRunner(); |
| + // Returns the task runner on which the task should be scheduled. If |
| + // |task_runner_| field is null, returns the SequencedTaskRunner for the |
| + // current thread. |
| + scoped_refptr<SequencedTaskRunner> GetTaskRunner(); |
| // Disable scheduled_task_ and abandon it so that it no longer refers back to |
| // this object. |
| @@ -157,8 +161,8 @@ class BASE_EXPORT Timer { |
| BaseTimerTaskInternal* scheduled_task_; |
| // The task runner on which the task should be scheduled. If it is null, the |
| - // task runner for the current thread should be used. |
| - scoped_refptr<SingleThreadTaskRunner> task_runner_; |
| + // task runner for the current thread is used. |
| + scoped_refptr<SequencedTaskRunner> task_runner_; |
|
gab
2015/12/03 22:26:08
Maybe we should call this |destination_task_runner
jsbell
2015/12/05 01:15:39
Done.
|
| // Location in user code. |
| tracked_objects::Location posted_from_; |
| @@ -181,8 +185,14 @@ class BASE_EXPORT Timer { |
| // if the task must be run immediately. |
| TimeTicks desired_run_time_; |
| - // Thread ID of current MessageLoop for verifying single-threaded usage. |
| - int thread_id_; |
| + // Calls to the timer are not thread safe, so a checker is used detect |
| + // incorrect usage in debug builds. Note that this verifies the timer API |
| + // calls; the tasks may be scheduled by the timer on a different sequence if |
| + // SetTaskRunner() is used. |
| + SequenceChecker sequence_checker_; |
| + |
| + // Once the timer has been scheduled, the task runner may not be changed. |
|
gab
2015/12/03 22:26:08
s/the task runner/task_runner_/
jsbell
2015/12/05 01:15:39
Done.
|
| + bool was_scheduled_; |
| // Repeating timers automatically post the task again before calling the task |
| // callback. |
| @@ -242,8 +252,7 @@ class RepeatingTimer : public BaseTimerMethodPointer { |
| //----------------------------------------------------------------------------- |
| // A Delay timer is like The Button from Lost. Once started, you have to keep |
| -// calling Reset otherwise it will call the given method in the MessageLoop |
| -// thread. |
| +// calling Reset otherwise it will call the given method on the task runner. |
| // |
| // Once created, it is inactive until Reset is called. Once |delay| seconds have |
| // passed since the last call to Reset, the callback is made. Once the callback |