summaryrefslogtreecommitdiff
path: root/platform/default/timer.cpp
diff options
context:
space:
mode:
authorThiago Marcos P. Santos <thiago@mapbox.com>2015-11-25 16:35:08 +0200
committerThiago Marcos P. Santos <thiago@mapbox.com>2015-12-01 11:49:02 +0200
commited29223e5a626980100b7dc4f85737852f1a5319 (patch)
treef82e6764ad1d668dcdc41389eb1dd7a933c9d0dc /platform/default/timer.cpp
parent7caaebb16236ae014f534b490b05f5b5d6a90213 (diff)
downloadqtlocation-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.cpp65
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();
}
}