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/async_task.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/async_task.cpp')
-rw-r--r-- | platform/default/async_task.cpp | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/platform/default/async_task.cpp b/platform/default/async_task.cpp index 6dccd9bcb0..064e8dad06 100644 --- a/platform/default/async_task.cpp +++ b/platform/default/async_task.cpp @@ -1,35 +1,62 @@ #include <mbgl/util/async_task.hpp> #include <mbgl/util/run_loop.hpp> -#include <mbgl/util/uv.hpp> #include <atomic> #include <functional> +#include <uv.h> + +#if UV_VERSION_MAJOR == 0 && UV_VERSION_MINOR <= 10 +#define UV_ASYNC_PARAMS(handle) uv_async_t *handle, int +#else +#define UV_ASYNC_PARAMS(handle) uv_async_t *handle +#endif + namespace mbgl { namespace util { class AsyncTask::Impl { public: Impl(std::function<void()>&& fn) - : async(reinterpret_cast<uv_loop_t*>(RunLoop::getLoopHandle()), [this] { runTask(); }) - , task(std::move(fn)) { + : async(new uv_async_t), + task(std::move(fn)) { + + uv_loop_t* loop = reinterpret_cast<uv_loop_t*>(RunLoop::getLoopHandle()); + if (uv_async_init(loop, async, asyncCallback) != 0) { + throw std::runtime_error("Failed to initialize async."); + } + + handle()->data = this; } - void maySend() { - async.send(); + ~Impl() { + uv_close(handle(), [](uv_handle_t* h) { + delete reinterpret_cast<uv_async_t*>(h); + }); } - void runTask() { - task(); + void maySend() { + // uv_async_send will do the call coalescing for us. + if (uv_async_send(async) != 0) { + throw std::runtime_error("Failed to async send."); + } } void unref() { - async.unref(); + uv_unref(handle()); } private: - uv::async async; + static void asyncCallback(UV_ASYNC_PARAMS(handle)) { + reinterpret_cast<Impl*>(handle->data)->task(); + } + + uv_handle_t* handle() { + return reinterpret_cast<uv_handle_t*>(async); + } + + uv_async_t* async; std::function<void()> task; }; |