summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2014-08-12 11:45:30 +0200
committerKonstantin Käfer <mail@kkaefer.com>2014-08-12 11:45:30 +0200
commit6f802642917136eb29d385d31d1817a98b562bbe (patch)
treebbccd9517e1fb430711440077b5c673f31ab3d2a
parente4c311a864d522e402b67f5393f57d0f663330e4 (diff)
downloadqtlocation-mapboxgl-6f802642917136eb29d385d31d1817a98b562bbe.tar.gz
remove uv.h dependency from header files
-rw-r--r--common/curl_request.cpp2
-rw-r--r--common/glfw_view.hpp4
-rw-r--r--include/mbgl/map/map.hpp2
-rw-r--r--include/mbgl/map/transform.hpp2
-rw-r--r--include/mbgl/platform/platform.hpp8
-rw-r--r--include/mbgl/platform/request.hpp9
-rw-r--r--include/mbgl/style/style.hpp2
-rw-r--r--include/mbgl/util/filesource.hpp6
-rw-r--r--include/mbgl/util/uv.hpp154
-rw-r--r--include/mbgl/util/uv_detail.hpp158
-rw-r--r--linux/main.cpp1
-rw-r--r--src/map/map.cpp7
-rw-r--r--src/map/sprite.cpp2
-rw-r--r--src/map/tile_data.cpp1
-rw-r--r--src/map/transform.cpp5
-rw-r--r--src/platform/request.cpp2
-rw-r--r--src/style/style.cpp5
-rw-r--r--src/text/glyph_store.cpp2
-rw-r--r--src/util/raster.cpp2
-rw-r--r--src/util/time.cpp3
-rw-r--r--src/util/uv.cpp19
21 files changed, 210 insertions, 186 deletions
diff --git a/common/curl_request.cpp b/common/curl_request.cpp
index b7e5e8b5cc..88b7712f66 100644
--- a/common/curl_request.cpp
+++ b/common/curl_request.cpp
@@ -1,7 +1,7 @@
#include <mbgl/platform/platform.hpp>
#include <mbgl/platform/request.hpp>
-#include <mbgl/util/uv.hpp>
+#include <mbgl/util/uv_detail.hpp>
#include <mbgl/util/std.hpp>
#include <queue>
diff --git a/common/glfw_view.hpp b/common/glfw_view.hpp
index efef3431a9..d2f6872fc7 100644
--- a/common/glfw_view.hpp
+++ b/common/glfw_view.hpp
@@ -9,8 +9,6 @@
#endif
#include <GLFW/glfw3.h>
-#include <uv.h>
-
class GLFWView : public mbgl::View {
public:
GLFWView(bool fullscreen = false);
@@ -43,8 +41,6 @@ public:
double last_click = -1;
GLFWwindow *window = nullptr;
-
- uv_loop_t *loop = nullptr;
};
#endif
diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp
index be01b456cc..554962c713 100644
--- a/include/mbgl/map/map.hpp
+++ b/include/mbgl/map/map.hpp
@@ -156,7 +156,7 @@ private:
private:
bool async = false;
std::shared_ptr<uv::loop> loop;
- uv_thread_t thread;
+ std::unique_ptr<uv::thread> thread;
uv_async_t *async_terminate = nullptr;
uv_async_t *async_render = nullptr;
uv_async_t *async_cleanup = nullptr;
diff --git a/include/mbgl/map/transform.hpp b/include/mbgl/map/transform.hpp
index df7839ea96..d0f56b7fba 100644
--- a/include/mbgl/map/transform.hpp
+++ b/include/mbgl/map/transform.hpp
@@ -80,7 +80,7 @@ private:
private:
View &view;
- mutable uv::rwlock mtx;
+ std::unique_ptr<uv::rwlock> mtx;
// This reflects the current state of the transform, representing the actual position of the
// map. After calling a transform function with a timer, this will likely remain the same until
diff --git a/include/mbgl/platform/platform.hpp b/include/mbgl/platform/platform.hpp
index 02aeb594b6..43c6ce4f5e 100644
--- a/include/mbgl/platform/platform.hpp
+++ b/include/mbgl/platform/platform.hpp
@@ -1,16 +1,12 @@
#ifndef MBGL_PLATFORM_PLATFORM
#define MBGL_PLATFORM_PLATFORM
+#include <mbgl/util/uv.hpp>
+
#include <memory>
#include <functional>
#include <string>
-typedef struct uv_loop_s uv_loop_t;
-
-namespace uv {
-class loop;
-}
-
namespace mbgl {
namespace platform {
diff --git a/include/mbgl/platform/request.hpp b/include/mbgl/platform/request.hpp
index 7d2da8888c..0cbacf645d 100644
--- a/include/mbgl/platform/request.hpp
+++ b/include/mbgl/platform/request.hpp
@@ -7,14 +7,7 @@
#include <atomic>
#include <mbgl/util/noncopyable.hpp>
-
-// Forward definition.
-typedef struct uv_loop_s uv_loop_t;
-typedef struct uv_async_s uv_async_t;
-
-namespace uv {
-class loop;
-}
+#include <mbgl/util/uv.hpp>
namespace mbgl {
namespace platform {
diff --git a/include/mbgl/style/style.hpp b/include/mbgl/style/style.hpp
index 3df58ab42b..1f24674e42 100644
--- a/include/mbgl/style/style.hpp
+++ b/include/mbgl/style/style.hpp
@@ -62,7 +62,7 @@ private:
PropertyTransition defaultTransition;
bool initial_render_complete = false;
- mutable uv::rwlock mtx;
+ std::unique_ptr<uv::rwlock> mtx;
};
}
diff --git a/include/mbgl/util/filesource.hpp b/include/mbgl/util/filesource.hpp
index 0d339cbac7..18c63ddfeb 100644
--- a/include/mbgl/util/filesource.hpp
+++ b/include/mbgl/util/filesource.hpp
@@ -1,14 +1,12 @@
#ifndef MBGL_UTIL_FILESOURCE
#define MBGL_UTIL_FILESOURCE
+#include <mbgl/util/uv.hpp>
+
#include <string>
#include <memory>
#include <functional>
-namespace uv {
-class loop;
-}
-
namespace mbgl {
namespace platform {
diff --git a/include/mbgl/util/uv.hpp b/include/mbgl/util/uv.hpp
index 518e007afe..4ceb8b873f 100644
--- a/include/mbgl/util/uv.hpp
+++ b/include/mbgl/util/uv.hpp
@@ -1,159 +1,19 @@
#ifndef MBGL_UTIL_UV
#define MBGL_UTIL_UV
-#include <uv.h>
-#include <functional>
-#include <cassert>
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-parameter"
-#endif
-
-#include <boost/lockfree/queue.hpp>
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
#include <string>
+typedef struct uv_async_s uv_async_t;
+typedef struct uv_handle_s uv_handle_t;
+typedef struct uv_loop_s uv_loop_t;
namespace uv {
-inline std::string cwd() {
- size_t max = 0;
- std::string dir;
- do {
- max += 256;
- dir.resize(max);
- uv_cwd(const_cast<char *>(dir.data()), &max);
- } while (max == dir.size());
- dir.resize(max - 1);
- return dir;
-}
-
-class loop {
-public:
- inline loop() {
- if (uv_loop_init(&l) != 0) {
- throw std::runtime_error("failed to initialize loop");
- }
- }
-
- inline ~loop() { uv_loop_close(&l); }
-
- inline uv_loop_t *operator*() { return &l; }
-
-private:
- uv_loop_t l;
-};
-
-class mutex {
-public:
- inline mutex() {
- if (uv_mutex_init(&mtx) != 0) {
- throw std::runtime_error("failed to initialize mutex");
- }
- }
- inline ~mutex() { uv_mutex_destroy(&mtx); }
- inline void lock() { uv_mutex_lock(&mtx); }
- inline void unlock() { uv_mutex_unlock(&mtx); }
-
-private:
- uv_mutex_t mtx;
-};
-
-class lock {
-public:
- lock(mutex &mtx) : mtx(mtx) { mtx.lock(); }
- ~lock() { mtx.unlock(); }
-
-private:
- mutex &mtx;
-};
-
-class rwlock {
-public:
- inline rwlock() {
- if (uv_rwlock_init(&mtx) != 0) {
- throw std::runtime_error("failed to initialize read-write lock");
- }
- }
- inline ~rwlock() { uv_rwlock_destroy(&mtx); }
- inline void rdlock() { uv_rwlock_rdlock(&mtx); }
- inline void wrlock() { uv_rwlock_wrlock(&mtx); }
- inline void rdunlock() { uv_rwlock_rdunlock(&mtx); }
- inline void wrunlock() { uv_rwlock_wrunlock(&mtx); }
-
-private:
- uv_rwlock_t mtx;
-};
-
-class readlock {
-public:
- inline readlock(rwlock &mtx) : mtx(mtx) { mtx.rdlock(); }
- inline ~readlock() { mtx.rdunlock(); }
-
-private:
- rwlock &mtx;
-};
-
-class writelock {
-public:
- inline writelock(rwlock &mtx) : mtx(mtx) { mtx.wrlock(); }
- inline ~writelock() { mtx.wrunlock(); }
-
-private:
- rwlock &mtx;
-};
-
-class once {
-public:
- typedef void (*callback)();
- void operator()(void (*callback)(void)) {
- uv_once(&o, callback);
- }
-
-private:
- uv_once_t o = UV_ONCE_INIT;
-};
-
-template <typename T>
-class work {
-public:
- typedef void (*work_callback)(T &object);
- typedef void (*after_work_callback)(T &object);
-
- template<typename... Args>
- work(const std::shared_ptr<loop> &loop, work_callback work_cb, after_work_callback after_work_cb, Args&&... args)
- : loop(loop),
- data(std::forward<Args>(args)...),
- work_cb(work_cb),
- after_work_cb(after_work_cb) {
- req.data = this;
- uv_queue_work(**loop, &req, do_work, after_work);
- }
-
-private:
- static void do_work(uv_work_t *req) {
- work<T> *w = static_cast<work<T> *>(req->data);
- w->work_cb(w->data);
- }
-
- static void after_work(uv_work_t *req, int) {
- work<T> *w = static_cast<work<T> *>(req->data);
- w->after_work_cb(w->data);
- delete w;
- }
+std::string cwd();
-private:
- std::shared_ptr<uv::loop> loop;
- uv_work_t req;
- T data;
- work_callback work_cb;
- after_work_callback after_work_cb;
-};
+class thread;
+class rwlock;
+class loop;
}
diff --git a/include/mbgl/util/uv_detail.hpp b/include/mbgl/util/uv_detail.hpp
new file mode 100644
index 0000000000..c65c247ba1
--- /dev/null
+++ b/include/mbgl/util/uv_detail.hpp
@@ -0,0 +1,158 @@
+#ifndef MBGL_UTIL_UV_DETAIL
+#define MBGL_UTIL_UV_DETAIL
+
+#include <uv.h>
+#include <functional>
+#include <cassert>
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-parameter"
+#endif
+
+#include <boost/lockfree/queue.hpp>
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+#include <string>
+
+
+namespace uv {
+
+class thread {
+public:
+ inline operator uv_thread_t *() { return &t; }
+
+private:
+ uv_thread_t t;
+};
+
+class loop {
+public:
+ inline loop() {
+ if (uv_loop_init(&l) != 0) {
+ throw std::runtime_error("failed to initialize loop");
+ }
+ }
+
+ inline ~loop() { uv_loop_close(&l); }
+
+ inline uv_loop_t *operator*() { return &l; }
+
+private:
+ uv_loop_t l;
+};
+
+class mutex {
+public:
+ inline mutex() {
+ if (uv_mutex_init(&mtx) != 0) {
+ throw std::runtime_error("failed to initialize mutex");
+ }
+ }
+ inline ~mutex() { uv_mutex_destroy(&mtx); }
+ inline void lock() { uv_mutex_lock(&mtx); }
+ inline void unlock() { uv_mutex_unlock(&mtx); }
+
+private:
+ uv_mutex_t mtx;
+};
+
+class lock {
+public:
+ lock(mutex &mtx) : mtx(mtx) { mtx.lock(); }
+ ~lock() { mtx.unlock(); }
+
+private:
+ mutex &mtx;
+};
+
+class rwlock {
+public:
+ inline rwlock() {
+ if (uv_rwlock_init(&mtx) != 0) {
+ throw std::runtime_error("failed to initialize read-write lock");
+ }
+ }
+ inline ~rwlock() { uv_rwlock_destroy(&mtx); }
+ inline void rdlock() { uv_rwlock_rdlock(&mtx); }
+ inline void wrlock() { uv_rwlock_wrlock(&mtx); }
+ inline void rdunlock() { uv_rwlock_rdunlock(&mtx); }
+ inline void wrunlock() { uv_rwlock_wrunlock(&mtx); }
+
+private:
+ uv_rwlock_t mtx;
+};
+
+class readlock {
+public:
+ inline readlock(rwlock &mtx) : mtx(mtx) { mtx.rdlock(); }
+ inline readlock(const std::unique_ptr<rwlock> &mtx) : mtx(*mtx) { mtx->rdlock(); }
+ inline ~readlock() { mtx.rdunlock(); }
+
+private:
+ rwlock &mtx;
+};
+
+class writelock {
+public:
+ inline writelock(rwlock &mtx) : mtx(mtx) { mtx.wrlock(); }
+ inline writelock(const std::unique_ptr<rwlock> &mtx) : mtx(*mtx) { mtx->wrlock(); }
+ inline ~writelock() { mtx.wrunlock(); }
+
+private:
+ rwlock &mtx;
+};
+
+class once {
+public:
+ typedef void (*callback)();
+ void operator()(void (*callback)(void)) {
+ uv_once(&o, callback);
+ }
+
+private:
+ uv_once_t o = UV_ONCE_INIT;
+};
+
+template <typename T>
+class work {
+public:
+ typedef void (*work_callback)(T &object);
+ typedef void (*after_work_callback)(T &object);
+
+ template<typename... Args>
+ work(const std::shared_ptr<loop> &loop, work_callback work_cb, after_work_callback after_work_cb, Args&&... args)
+ : loop(loop),
+ data(std::forward<Args>(args)...),
+ work_cb(work_cb),
+ after_work_cb(after_work_cb) {
+ req.data = this;
+ uv_queue_work(**loop, &req, do_work, after_work);
+ }
+
+private:
+ static void do_work(uv_work_t *req) {
+ work<T> *w = static_cast<work<T> *>(req->data);
+ w->work_cb(w->data);
+ }
+
+ static void after_work(uv_work_t *req, int) {
+ work<T> *w = static_cast<work<T> *>(req->data);
+ w->after_work_cb(w->data);
+ delete w;
+ }
+
+private:
+ std::shared_ptr<uv::loop> loop;
+ uv_work_t req;
+ T data;
+ work_callback work_cb;
+ after_work_callback after_work_cb;
+};
+
+}
+
+#endif
diff --git a/linux/main.cpp b/linux/main.cpp
index b1241d64e0..a4f9a6298d 100644
--- a/linux/main.cpp
+++ b/linux/main.cpp
@@ -1,5 +1,6 @@
#include <mbgl/mbgl.hpp>
#include <mbgl/platform/platform.hpp>
+#include <mbgl/util/uv.hpp>
#include <signal.h>
#include <getopt.h>
diff --git a/src/map/map.cpp b/src/map/map.cpp
index ef7b9548bd..81cbd394ba 100644
--- a/src/map/map.cpp
+++ b/src/map/map.cpp
@@ -9,7 +9,7 @@
#include <mbgl/util/clip_ids.hpp>
#include <mbgl/util/string.hpp>
#include <mbgl/util/constants.hpp>
-#include <mbgl/util/uv.hpp>
+#include <mbgl/util/uv_detail.hpp>
#include <mbgl/util/std.hpp>
#include <mbgl/style/style.hpp>
#include <mbgl/text/glyph_store.hpp>
@@ -32,6 +32,7 @@ using namespace mbgl;
Map::Map(View& view)
: loop(std::make_shared<uv::loop>()),
+ thread(std::make_unique<uv::thread>()),
view(view),
transform(view),
fileSource(std::make_shared<FileSource>()),
@@ -78,7 +79,7 @@ void Map::start() {
uv_async_init(**loop, async_cleanup, cleanup);
async_cleanup->data = this;
- uv_thread_create(&thread, [](void *arg) {
+ uv_thread_create(*thread, [](void *arg) {
Map *map = static_cast<Map *>(arg);
map->run();
}, this);
@@ -89,7 +90,7 @@ void Map::stop() {
uv_async_send(async_terminate);
}
- uv_thread_join(&thread);
+ uv_thread_join(*thread);
// Run the event loop once to make sure our async delete handlers are called.
uv_run(**loop, UV_RUN_ONCE);
diff --git a/src/map/sprite.cpp b/src/map/sprite.cpp
index f396fec07d..88e940c00e 100644
--- a/src/map/sprite.cpp
+++ b/src/map/sprite.cpp
@@ -6,7 +6,7 @@
#include <string>
#include <mbgl/platform/platform.hpp>
#include <mbgl/util/filesource.hpp>
-#include <mbgl/util/uv.hpp>
+#include <mbgl/util/uv_detail.hpp>
#include <mbgl/util/std.hpp>
#include <rapidjson/document.h>
diff --git a/src/map/tile_data.cpp b/src/map/tile_data.cpp
index a94eb00fbf..4333e2d2fd 100644
--- a/src/map/tile_data.cpp
+++ b/src/map/tile_data.cpp
@@ -5,6 +5,7 @@
#include <mbgl/util/token.hpp>
#include <mbgl/util/string.hpp>
#include <mbgl/util/filesource.hpp>
+#include <mbgl/util/uv_detail.hpp>
using namespace mbgl;
diff --git a/src/map/transform.cpp b/src/map/transform.cpp
index 6338df6a48..a68cffdc7e 100644
--- a/src/map/transform.cpp
+++ b/src/map/transform.cpp
@@ -5,6 +5,7 @@
#include <mbgl/util/std.hpp>
#include <mbgl/util/math.hpp>
#include <mbgl/util/time.hpp>
+#include <mbgl/util/uv_detail.hpp>
#include <mbgl/util/transition.hpp>
#include <mbgl/platform/platform.hpp>
#include <cstdio>
@@ -16,9 +17,7 @@ const double R2D = 180.0 / M_PI;
const double M2PI = 2 * M_PI;
const double MIN_ROTATE_SCALE = 8;
-Transform::Transform(View &view)
- : view(view) {
-
+Transform::Transform(View &view) : view(view), mtx(std::make_unique<uv::rwlock>()) {
setScale(current.scale);
setAngle(current.angle);
}
diff --git a/src/platform/request.cpp b/src/platform/request.cpp
index 9382892a91..efd17895db 100644
--- a/src/platform/request.cpp
+++ b/src/platform/request.cpp
@@ -1,7 +1,7 @@
#include <mbgl/platform/request.hpp>
#include <mbgl/platform/platform.hpp>
#include <mbgl/util/std.hpp>
-#include <mbgl/util/uv.hpp>
+#include <mbgl/util/uv_detail.hpp>
using namespace mbgl::platform;
diff --git a/src/style/style.cpp b/src/style/style.cpp
index 03881f96a0..22c7610105 100644
--- a/src/style/style.cpp
+++ b/src/style/style.cpp
@@ -6,6 +6,8 @@
#include <mbgl/util/constants.hpp>
#include <mbgl/util/time.hpp>
#include <mbgl/util/error.hpp>
+#include <mbgl/util/std.hpp>
+#include <mbgl/util/uv_detail.hpp>
#include <csscolorparser/csscolorparser.hpp>
#include <rapidjson/document.h>
@@ -13,7 +15,8 @@
namespace mbgl {
-Style::Style() {
+Style::Style()
+ : mtx(std::make_unique<uv::rwlock>()) {
}
void Style::updateProperties(float z, timestamp now) {
diff --git a/src/text/glyph_store.cpp b/src/text/glyph_store.cpp
index 4b90b51c24..c32e1642e5 100644
--- a/src/text/glyph_store.cpp
+++ b/src/text/glyph_store.cpp
@@ -9,7 +9,7 @@
#include <mbgl/util/math.hpp>
#include <mbgl/util/filesource.hpp>
#include <mbgl/platform/platform.hpp>
-#include <uv.h>
+#include <mbgl/util/uv_detail.hpp>
#include <algorithm>
namespace mbgl {
diff --git a/src/util/raster.cpp b/src/util/raster.cpp
index 4a040f9cb6..fe5acbd526 100644
--- a/src/util/raster.cpp
+++ b/src/util/raster.cpp
@@ -7,7 +7,7 @@
#include <mbgl/platform/platform.hpp>
#include <mbgl/platform/gl.hpp>
#include <mbgl/util/time.hpp>
-#include <mbgl/util/uv.hpp>
+#include <mbgl/util/uv_detail.hpp>
#include <mbgl/util/std.hpp>
#include <png.h>
diff --git a/src/util/time.cpp b/src/util/time.cpp
index 493a6ccfa8..4cd8077f98 100644
--- a/src/util/time.cpp
+++ b/src/util/time.cpp
@@ -1,6 +1,5 @@
#include <mbgl/util/time.hpp>
-
-#include <uv.h>
+#include <mbgl/util/uv_detail.hpp>
namespace mbgl {
namespace util {
diff --git a/src/util/uv.cpp b/src/util/uv.cpp
new file mode 100644
index 0000000000..65c790b9c0
--- /dev/null
+++ b/src/util/uv.cpp
@@ -0,0 +1,19 @@
+#include <mbgl/util/uv.hpp>
+
+#include <uv.h>
+
+namespace uv {
+
+std::string cwd() {
+ size_t max = 0;
+ std::string dir;
+ do {
+ max += 256;
+ dir.resize(max);
+ uv_cwd(const_cast<char *>(dir.data()), &max);
+ } while (max == dir.size());
+ dir.resize(max - 1);
+ return dir;
+}
+
+}