diff options
author | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-11-25 16:35:08 +0200 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-12-01 11:49:02 +0200 |
commit | ed29223e5a626980100b7dc4f85737852f1a5319 (patch) | |
tree | f82e6764ad1d668dcdc41389eb1dd7a933c9d0dc /platform/default/timer.cpp | |
parent | 7caaebb16236ae014f534b490b05f5b5d6a90213 (diff) | |
download | qtlocation-mapboxgl-ed29223e5a626980100b7dc4f85737852f1a5319.tar.gz |
[core] Remove mbgl/util/uv.hpp
Now only a few things depend on libuv and they can use it directly.
Diffstat (limited to 'platform/default/timer.cpp')
-rw-r--r-- | platform/default/timer.cpp | 65 |
1 files changed, 56 insertions, 9 deletions
diff --git a/platform/default/timer.cpp b/platform/default/timer.cpp index 78275814a6..4df1a28bf9 100644 --- a/platform/default/timer.cpp +++ b/platform/default/timer.cpp @@ -1,18 +1,65 @@ #include <mbgl/util/timer.hpp> #include <mbgl/util/run_loop.hpp> -#include <mbgl/util/uv.hpp> + +#include <uv.h> + +#if UV_VERSION_MAJOR == 0 && UV_VERSION_MINOR <= 10 +#define UV_TIMER_PARAMS(timer) uv_timer_t *timer, int +#else +#define UV_TIMER_PARAMS(timer) uv_timer_t *timer +#endif namespace mbgl { namespace util { class Timer::Impl { public: - Impl() - : timer(reinterpret_cast<uv_loop_t*>(RunLoop::getLoopHandle())) { + Impl() : timer(new uv_timer_t) { + uv_loop_t* 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; + } + + ~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."); + } + } + + void unref() { + uv_unref(handle()); + } + +private: + static void timerCallback(UV_TIMER_PARAMS(handle)) { + reinterpret_cast<Impl*>(handle->data)->cb(); + } + + uv_handle_t* handle() { + return reinterpret_cast<uv_handle_t*>(timer); } - uv::timer timer; + uv_timer_t* timer; + + std::function<void()> cb; }; Timer::Timer() @@ -23,17 +70,17 @@ Timer::~Timer() { } void Timer::start(Duration timeout, Duration repeat, std::function<void()>&& cb) { - impl->timer.start(std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count(), - std::chrono::duration_cast<std::chrono::milliseconds>(repeat).count(), - std::move(cb)); + impl->start(std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count(), + std::chrono::duration_cast<std::chrono::milliseconds>(repeat).count(), + std::move(cb)); } void Timer::stop() { - impl->timer.stop(); + impl->stop(); } void Timer::unref() { - impl->timer.unref(); + impl->unref(); } } |