summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2014-08-12 15:12:03 +0200
committerKonstantin Käfer <mail@kkaefer.com>2014-08-12 15:12:31 +0200
commit213b6ad4dc5bec3f561486422e5b5686cd988696 (patch)
tree46eee7723e938dc9f7e1df2acd12ff6fb2efabd4
parent0263a9ffb7afc4f48e84b3fe3e0263cf32f739f5 (diff)
parentbdfc1036d3b0148fa0f57a277f7686b4b38e2071 (diff)
downloadqtlocation-mapboxgl-213b6ad4dc5bec3f561486422e5b5686cd988696.tar.gz
Merge branch 'master' into rasterize
[skip ci]
-rw-r--r--Makefile2
-rw-r--r--common/curl_request.cpp2
-rw-r--r--common/foundation_request.mm31
-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/time.hpp7
-rw-r--r--include/mbgl/util/uv.hpp154
-rw-r--r--include/mbgl/util/uv_detail.hpp158
m---------ios/mapbox-gl-cocoa0
-rw-r--r--linux/main.cpp1
-rw-r--r--mapboxgl.gyp45
-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.cpp12
-rw-r--r--src/util/uv.cpp19
-rw-r--r--test/fixtures/fixture_request.cpp2
-rw-r--r--test/test.gyp1
28 files changed, 260 insertions, 233 deletions
diff --git a/Makefile b/Makefile
index fb1c5b3ec7..efc2385ced 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,7 @@ build/test/Makefile: src common config.gypi test/test.gyp
test: build/test/Makefile
$(MAKE) -C build/test BUILDTYPE=Testing V=$(V) test
-test/%: build/test/Makefile
+test_%: build/test/Makefile
$(MAKE) -C build/test BUILDTYPE=Testing V=$(V) $*
(cd build/Testing && exec ./test_$*)
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/foundation_request.mm b/common/foundation_request.mm
index 4684ff55fb..b7eafdb96c 100644
--- a/common/foundation_request.mm
+++ b/common/foundation_request.mm
@@ -12,28 +12,15 @@
#include <mbgl/platform/request.hpp>
#include <mbgl/platform/platform.hpp>
#include <mbgl/util/std.hpp>
-#include <uv.h>
+#include <mbgl/util/uv.hpp>
-uv_once_t request_initialize = UV_ONCE_INIT;
+dispatch_once_t request_initialize = 0;
NSURLSession *session = nullptr;
#if TARGET_OS_IPHONE
std::atomic<int> active_tasks;
#endif
-void request_initialize_cb() {
- NSURLSessionConfiguration *sessionConfig =
- [NSURLSessionConfiguration defaultSessionConfiguration];
- sessionConfig.timeoutIntervalForResource = 30;
- sessionConfig.HTTPMaximumConnectionsPerHost = 8;
- sessionConfig.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
-
- session = [NSURLSession sessionWithConfiguration:sessionConfig];
-
-#if TARGET_OS_IPHONE
- active_tasks = 0;
-#endif
-}
// We're using a child class to make sure ARC is working correctly, as well as to add activity
// indicators on iOS.
@@ -69,7 +56,19 @@ std::shared_ptr<mbgl::platform::Request>
mbgl::platform::request_http(const std::string &url,
std::function<void(Response *)> callback,
std::shared_ptr<uv::loop> loop) {
- uv_once(&request_initialize, request_initialize_cb);
+ dispatch_once(&request_initialize, ^{
+ NSURLSessionConfiguration *sessionConfig =
+ [NSURLSessionConfiguration defaultSessionConfiguration];
+ sessionConfig.timeoutIntervalForResource = 30;
+ sessionConfig.HTTPMaximumConnectionsPerHost = 8;
+ sessionConfig.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
+
+ session = [NSURLSession sessionWithConfiguration:sessionConfig];
+
+#if TARGET_OS_IPHONE
+ active_tasks = 0;
+#endif
+ });
std::shared_ptr<FoundationRequest> req =
std::make_shared<FoundationRequest>(url, callback, loop);
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 8250b42753..b837f79282 100644
--- a/include/mbgl/map/map.hpp
+++ b/include/mbgl/map/map.hpp
@@ -158,7 +158,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/time.hpp b/include/mbgl/util/time.hpp
index eacee2c982..9d61edf75e 100644
--- a/include/mbgl/util/time.hpp
+++ b/include/mbgl/util/time.hpp
@@ -1,7 +1,7 @@
#ifndef MBGL_UTIL_TIME
#define MBGL_UTIL_TIME
-#include <uv.h>
+#include <cstdint>
namespace mbgl {
@@ -13,9 +13,8 @@ namespace util {
// Returns time in nanoseconds since an arbitrary point in the past. This has
// no relation to the current time, but is continuously increasing, so
// comparisons between different timestamps produce meaningful values.
-inline timestamp now() {
- return uv_hrtime();
-}
+timestamp now();
+
}
// used for time conversions
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/ios/mapbox-gl-cocoa b/ios/mapbox-gl-cocoa
-Subproject ced284d8a7bfc66540d8af50f811fd4df0e0886
+Subproject 9d4320aefaa3868ecd5d0a4e0ce902b0adef78c
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/mapboxgl.gyp b/mapboxgl.gyp
index b7944d6a1e..aa8249a941 100644
--- a/mapboxgl.gyp
+++ b/mapboxgl.gyp
@@ -34,52 +34,45 @@
}
},
{
- 'target_name': 'bundle_styles',
+ 'target_name': 'touch_styles',
'type': 'none',
'hard_dependency': 1,
'actions': [
{
'action_name': 'Touch Stylesheet Directory',
'inputs': ['styles'],
- 'outputs': ['styles'],
- 'action': ['touch', 'styles'], # required for xcode http://openradar.appspot.com/7232149
+ 'outputs': ['<(PRODUCT_DIR)/'], # need to specify a distinct directory
+ 'action': ['touch', 'styles'],
}
],
+ },
+ {
+ 'target_name': 'bundle_styles',
+ 'type': 'none',
+ 'hard_dependency': 1,
+ 'dependencies': [ 'touch_styles' ], # required for xcode http://openradar.appspot.com/7232149
'direct_dependent_settings': {
- 'mac_bundle_resources': [
- 'styles',
- ],
+ 'mac_bundle_resources': [ 'styles' ],
}
},
{
'target_name': 'copy_styles',
'type': 'none',
'hard_dependency': 1,
- 'actions': [
- {
- 'action_name': 'Touch Stylesheet Directory',
- 'inputs': ['styles'],
- 'outputs': ['styles'],
- 'action': ['touch', 'styles'], # required for xcode http://openradar.appspot.com/7232149
- }
- ],
- 'copies': [
- {
- 'files': [ 'styles' ],
- 'destination': '<(PRODUCT_DIR)'
- }
- ]
+ 'dependencies': [ 'touch_styles' ], # required for xcode http://openradar.appspot.com/7232149
+ 'copies': [{
+ 'files': [ 'styles' ],
+ 'destination': '<(PRODUCT_DIR)'
+ }],
},
{
'target_name': 'copy_certificate_bundle',
'type': 'none',
'hard_dependency': 1,
- 'copies': [
- {
- 'files': [ 'common/ca-bundle.crt' ],
- 'destination': '<(PRODUCT_DIR)'
- }
- ]
+ 'copies': [{
+ 'files': [ 'common/ca-bundle.crt' ],
+ 'destination': '<(PRODUCT_DIR)'
+ }],
},
{
'target_name': 'mapboxgl',
diff --git a/src/map/map.cpp b/src/map/map.cpp
index 6bbbfcc1eb..3a46be466c 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 1a993c599f..03266e5b56 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
new file mode 100644
index 0000000000..4cd8077f98
--- /dev/null
+++ b/src/util/time.cpp
@@ -0,0 +1,12 @@
+#include <mbgl/util/time.hpp>
+#include <mbgl/util/uv_detail.hpp>
+
+namespace mbgl {
+namespace util {
+
+timestamp now() {
+ return uv_hrtime();
+}
+
+}
+}
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;
+}
+
+}
diff --git a/test/fixtures/fixture_request.cpp b/test/fixtures/fixture_request.cpp
index b73020590c..1a7ed2ccc3 100644
--- a/test/fixtures/fixture_request.cpp
+++ b/test/fixtures/fixture_request.cpp
@@ -1,6 +1,6 @@
#include <mbgl/platform/platform.hpp>
#include <mbgl/platform/request.hpp>
-#include <mbgl/util/uv.hpp>
+#include <mbgl/util/uv_detail.hpp>
#include <mbgl/platform/log.hpp>
const std::string base_directory = []{
diff --git a/test/test.gyp b/test/test.gyp
index f73c94bf02..b32f0f515a 100644
--- a/test/test.gyp
+++ b/test/test.gyp
@@ -189,7 +189,6 @@
"dependencies": [
"../deps/gtest/gtest.gyp:gtest",
"../mapboxgl.gyp:mapboxgl",
- '../mapboxgl.gyp:bundle_styles',
"link_gl",
]
},