summaryrefslogtreecommitdiff
path: root/platform/default/src/mbgl/util/timer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default/src/mbgl/util/timer.cpp')
-rw-r--r--platform/default/src/mbgl/util/timer.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/platform/default/src/mbgl/util/timer.cpp b/platform/default/src/mbgl/util/timer.cpp
new file mode 100644
index 0000000000..90a85bfc1f
--- /dev/null
+++ b/platform/default/src/mbgl/util/timer.cpp
@@ -0,0 +1,73 @@
+#include <mbgl/util/timer.hpp>
+
+#include <mbgl/util/run_loop.hpp>
+
+#include <uv.h>
+
+namespace mbgl {
+namespace util {
+
+class Timer::Impl {
+public:
+ Impl() : timer(new uv_timer_t) {
+ auto* loop = reinterpret_cast<uv_loop_t*>(RunLoop::getLoopHandle());
+ if (uv_timer_init(loop, timer) != 0) {
+ throw std::runtime_error("Failed to initialize timer.");
+ }
+
+ handle()->data = this;
+ uv_unref(handle());
+ }
+
+ ~Impl() {
+ uv_close(handle(), [](uv_handle_t* h) {
+ delete reinterpret_cast<uv_timer_t*>(h);
+ });
+ }
+
+ void start(uint64_t timeout, uint64_t repeat, std::function<void ()>&& cb_) {
+ cb = std::move(cb_);
+ if (uv_timer_start(timer, timerCallback, timeout, repeat) != 0) {
+ throw std::runtime_error("Failed to start timer.");
+ }
+ }
+
+ void stop() {
+ cb = nullptr;
+ if (uv_timer_stop(timer) != 0) {
+ throw std::runtime_error("Failed to stop timer.");
+ }
+ }
+
+private:
+ static void timerCallback(uv_timer_t* handle) {
+ reinterpret_cast<Impl*>(handle->data)->cb();
+ }
+
+ uv_handle_t* handle() {
+ return reinterpret_cast<uv_handle_t*>(timer);
+ }
+
+ uv_timer_t* timer;
+
+ std::function<void()> cb;
+};
+
+Timer::Timer()
+ : impl(std::make_unique<Impl>()) {
+}
+
+Timer::~Timer() = default;
+
+void Timer::start(Duration timeout, Duration repeat, std::function<void()>&& cb) {
+ impl->start(std::chrono::duration_cast<Milliseconds>(timeout).count(),
+ std::chrono::duration_cast<Milliseconds>(repeat).count(),
+ std::move(cb));
+}
+
+void Timer::stop() {
+ impl->stop();
+}
+
+} // namespace util
+} // namespace mbgl