From 123c5df92219bde3dda39d3ba942b996e765e8e9 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Mon, 31 Aug 2015 10:41:52 +0300 Subject: [PATCH] [core] Introduce the AsyncTask --- gyp/platform-android.gypi | 1 + gyp/platform-ios.gypi | 2 ++ gyp/platform-linux.gypi | 1 + gyp/platform-osx.gypi | 1 + platform/default/async_task.cpp | 53 +++++++++++++++++++++++++++++++++ src/mbgl/util/async_task.hpp | 28 +++++++++++++++++ 6 files changed, 86 insertions(+) create mode 100644 platform/default/async_task.cpp create mode 100644 src/mbgl/util/async_task.hpp diff --git a/gyp/platform-android.gypi b/gyp/platform-android.gypi index e3e1141c5..dcab0e019 100644 --- a/gyp/platform-android.gypi +++ b/gyp/platform-android.gypi @@ -12,6 +12,7 @@ 'sources': [ '../platform/android/log_android.cpp', '../platform/android/asset_root.cpp', + '../platform/default/async_task.cpp', '../platform/default/thread.cpp', '../platform/default/string_stdlib.cpp', '../platform/default/image.cpp', diff --git a/gyp/platform-ios.gypi b/gyp/platform-ios.gypi index 205cfe22d..0b23890c4 100644 --- a/gyp/platform-ios.gypi +++ b/gyp/platform-ios.gypi @@ -10,6 +10,7 @@ ], 'sources': [ + '../platform/default/async_task.cpp', '../platform/darwin/log_nslog.mm', '../platform/darwin/string_nsstring.mm', '../platform/darwin/application_root.mm', @@ -93,6 +94,7 @@ 'include_dirs': [ '../include', + '../src', ], 'xcode_settings': { diff --git a/gyp/platform-linux.gypi b/gyp/platform-linux.gypi index 3ee39e2b7..1ba328c5c 100644 --- a/gyp/platform-linux.gypi +++ b/gyp/platform-linux.gypi @@ -10,6 +10,7 @@ ], 'sources': [ + '../platform/default/async_task.cpp', '../platform/default/log_stderr.cpp', '../platform/default/string_stdlib.cpp', '../platform/default/application_root.cpp', diff --git a/gyp/platform-osx.gypi b/gyp/platform-osx.gypi index af30019ee..b3941d2e2 100644 --- a/gyp/platform-osx.gypi +++ b/gyp/platform-osx.gypi @@ -10,6 +10,7 @@ ], 'sources': [ + '../platform/default/async_task.cpp', '../platform/darwin/log_nslog.mm', '../platform/darwin/string_nsstring.mm', '../platform/darwin/application_root.mm', diff --git a/platform/default/async_task.cpp b/platform/default/async_task.cpp new file mode 100644 index 000000000..4b4372451 --- /dev/null +++ b/platform/default/async_task.cpp @@ -0,0 +1,53 @@ +#include + +#include +#include + +#include +#include + +namespace mbgl { +namespace util { + +class AsyncTask::Impl { +public: + Impl(std::function&& fn) + : async(RunLoop::getLoop(), [this] { runTask(); }) + , task(std::move(fn)) { + } + + void maySend() { + async.send(); + } + + void runTask() { + task(); + } + + void unref() { + async.unref(); + } + +private: + uv::async async; + + std::function task; +}; + +AsyncTask::AsyncTask(std::function&& fn) + : impl(std::make_unique(std::move(fn))) { +} + +AsyncTask::~AsyncTask() { +} + +void AsyncTask::send() { + impl->maySend(); +} + +void AsyncTask::unref() { + impl->unref(); +} + +} +} diff --git a/src/mbgl/util/async_task.hpp b/src/mbgl/util/async_task.hpp new file mode 100644 index 000000000..09bdab94d --- /dev/null +++ b/src/mbgl/util/async_task.hpp @@ -0,0 +1,28 @@ +#ifndef MBGL_UTIL_ASYNC_TASK +#define MBGL_UTIL_ASYNC_TASK + +#include + +#include +#include + +namespace mbgl { +namespace util { + +class AsyncTask : private util::noncopyable { +public: + AsyncTask(std::function&&); + ~AsyncTask(); + + void send(); + void unref(); + +private: + class Impl; + std::unique_ptr impl; +}; + +} +} + +#endif