123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- #ifndef BASE_TIMER_TIMER_H_
- #define BASE_TIMER_TIMER_H_
- #include <memory>
- #include "base/base_export.h"
- #include "base/bind.h"
- #include "base/bind_helpers.h"
- #include "base/callback.h"
- #include "base/location.h"
- #include "base/macros.h"
- #include "base/sequence_checker_impl.h"
- #include "base/sequenced_task_runner.h"
- #include "base/time/time.h"
- namespace base {
- class TickClock;
- namespace internal {
- class BaseTimerTaskInternal;
- class BASE_EXPORT TimerBase {
- public:
-
-
-
- TimerBase();
- explicit TimerBase(const TickClock* tick_clock);
-
-
-
- TimerBase(const Location& posted_from, TimeDelta delay);
- TimerBase(const Location& posted_from,
- TimeDelta delay,
- const TickClock* tick_clock);
- virtual ~TimerBase();
-
- bool IsRunning() const;
-
- TimeDelta GetCurrentDelay() const;
-
-
-
-
-
-
-
-
- virtual void SetTaskRunner(scoped_refptr<SequencedTaskRunner> task_runner);
-
-
- virtual void Stop();
-
- void AbandonAndStop() {
- AbandonScheduledTask();
- Stop();
-
- }
-
-
- virtual void Reset();
- const TimeTicks& desired_run_time() const { return desired_run_time_; }
- protected:
- virtual void OnStop() = 0;
- virtual void RunUserTask() = 0;
-
- TimeTicks Now() const;
- void set_desired_run_time(TimeTicks desired) { desired_run_time_ = desired; }
- void set_is_running(bool running) { is_running_ = running; }
- const Location& posted_from() const { return posted_from_; }
-
-
- scoped_refptr<SequencedTaskRunner> task_runner_;
-
-
-
- SequenceChecker origin_sequence_checker_;
-
-
-
- void PostNewScheduledTask(TimeDelta delay);
- void StartInternal(const Location& posted_from, TimeDelta delay);
- private:
- friend class BaseTimerTaskInternal;
-
-
-
- scoped_refptr<SequencedTaskRunner> GetTaskRunner();
-
-
- void AbandonScheduledTask();
-
- void RunScheduledTask();
-
-
- BaseTimerTaskInternal* scheduled_task_;
-
- Location posted_from_;
-
- TimeDelta delay_;
-
-
- TimeTicks scheduled_run_time_;
-
-
-
-
-
-
-
- TimeTicks desired_run_time_;
-
- const TickClock* const tick_clock_;
-
- bool is_running_;
- DISALLOW_COPY_AND_ASSIGN(TimerBase);
- };
- }
- class BASE_EXPORT OneShotTimer : public internal::TimerBase {
- public:
- OneShotTimer();
- explicit OneShotTimer(const TickClock* tick_clock);
- ~OneShotTimer() override;
-
-
- virtual void Start(const Location& posted_from,
- TimeDelta delay,
- OnceClosure user_task);
-
-
-
- template <class Receiver>
- void Start(const Location& posted_from,
- TimeDelta delay,
- Receiver* receiver,
- void (Receiver::*method)()) {
- Start(posted_from, delay, BindOnce(method, Unretained(receiver)));
- }
-
-
- void FireNow();
- private:
- void OnStop() final;
- void RunUserTask() final;
- OnceClosure user_task_;
- DISALLOW_COPY_AND_ASSIGN(OneShotTimer);
- };
- class BASE_EXPORT RepeatingTimer : public internal::TimerBase {
- public:
- RepeatingTimer();
- explicit RepeatingTimer(const TickClock* tick_clock);
- ~RepeatingTimer() override;
- RepeatingTimer(const Location& posted_from,
- TimeDelta delay,
- RepeatingClosure user_task);
- RepeatingTimer(const Location& posted_from,
- TimeDelta delay,
- RepeatingClosure user_task,
- const TickClock* tick_clock);
-
-
- virtual void Start(const Location& posted_from,
- TimeDelta delay,
- RepeatingClosure user_task);
-
-
-
- template <class Receiver>
- void Start(const Location& posted_from,
- TimeDelta delay,
- Receiver* receiver,
- void (Receiver::*method)()) {
- Start(posted_from, delay, BindRepeating(method, Unretained(receiver)));
- }
- const RepeatingClosure& user_task() const { return user_task_; }
- private:
-
- void OnStop() final;
- void RunUserTask() override;
- RepeatingClosure user_task_;
- DISALLOW_COPY_AND_ASSIGN(RepeatingTimer);
- };
- class BASE_EXPORT RetainingOneShotTimer : public internal::TimerBase {
- public:
- RetainingOneShotTimer();
- explicit RetainingOneShotTimer(const TickClock* tick_clock);
- ~RetainingOneShotTimer() override;
- RetainingOneShotTimer(const Location& posted_from,
- TimeDelta delay,
- RepeatingClosure user_task);
- RetainingOneShotTimer(const Location& posted_from,
- TimeDelta delay,
- RepeatingClosure user_task,
- const TickClock* tick_clock);
-
-
- virtual void Start(const Location& posted_from,
- TimeDelta delay,
- RepeatingClosure user_task);
-
-
-
- template <class Receiver>
- void Start(const Location& posted_from,
- TimeDelta delay,
- Receiver* receiver,
- void (Receiver::*method)()) {
- Start(posted_from, delay, BindRepeating(method, Unretained(receiver)));
- }
- const RepeatingClosure& user_task() const { return user_task_; }
- protected:
- void set_user_task(const RepeatingClosure& task) { user_task_ = task; }
- private:
-
- void OnStop() final;
- void RunUserTask() override;
- RepeatingClosure user_task_;
- DISALLOW_COPY_AND_ASSIGN(RetainingOneShotTimer);
- };
- class DelayTimer {
- public:
- template <class Receiver>
- DelayTimer(const Location& posted_from,
- TimeDelta delay,
- Receiver* receiver,
- void (Receiver::*method)())
- : DelayTimer(posted_from, delay, receiver, method, nullptr) {}
- template <class Receiver>
- DelayTimer(const Location& posted_from,
- TimeDelta delay,
- Receiver* receiver,
- void (Receiver::*method)(),
- const TickClock* tick_clock)
- : timer_(posted_from,
- delay,
- BindRepeating(method, Unretained(receiver)),
- tick_clock) {}
- void Reset() { timer_.Reset(); }
- private:
- RetainingOneShotTimer timer_;
- DISALLOW_COPY_AND_ASSIGN(DelayTimer);
- };
- }
- #endif
|