summaryrefslogtreecommitdiff
path: root/platform/default/async_task.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/async_task.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/async_task.cpp')
-rw-r--r--platform/default/async_task.cpp45
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;
};