#include "run_loop_impl.hpp" #include #include #include namespace mbgl { namespace util { class Timer::Impl : public RunLoop::Impl::Runnable { public: Impl() = default; ~Impl() { stop(); } void start(Duration timeout, Duration repeat_, std::function&& task_) { stop(); repeat = repeat_; task = std::move(task_); // Prevent overflows when timeout is set to Duration::max() due = (timeout == Duration::max()) ? std::chrono::time_point::max() : Clock::now() + timeout; loop->addRunnable(this); } void stop() { loop->removeRunnable(this); } void reschedule() { if (repeat != Duration::zero()) { due = Clock::now() + repeat; loop->wake(); } else { stop(); } } TimePoint dueTime() const override { return due; } void runTask() override { reschedule(); task(); } private: TimePoint due; Duration repeat; RunLoop::Impl* loop = reinterpret_cast(RunLoop::getLoopHandle()); std::function task; }; Timer::Timer() : impl(std::make_unique()) { } Timer::~Timer() = default; void Timer::start(Duration timeout, Duration repeat, std::function&& cb) { impl->start(timeout, repeat, std::move(cb)); } void Timer::stop() { impl->stop(); } } // namespace util } // namespace mbgl