summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mbgl/storage/network_status.hpp5
-rw-r--r--include/mbgl/util/run_loop.hpp10
-rw-r--r--platform/android/src/async_task.cpp13
-rw-r--r--platform/android/src/run_loop_impl.hpp4
-rw-r--r--src/mbgl/geometry/glyph_atlas.hpp4
-rw-r--r--src/mbgl/map/map.cpp2
-rw-r--r--src/mbgl/map/transform_state.cpp2
-rw-r--r--src/mbgl/renderer/bucket.hpp5
-rw-r--r--src/mbgl/sprite/sprite_atlas.hpp4
-rw-r--r--src/mbgl/storage/network_status.cpp2
-rw-r--r--src/mbgl/style/style_bucket_parameters.hpp6
-rw-r--r--src/mbgl/text/glyph_pbf.hpp4
-rw-r--r--src/mbgl/tile/tile_worker.cpp2
-rw-r--r--src/mbgl/tile/tile_worker.hpp6
-rw-r--r--src/mbgl/tile/vector_tile_data.hpp4
-rw-r--r--src/mbgl/util/atomic.hpp45
-rw-r--r--src/mbgl/util/math.cpp12
-rw-r--r--src/mbgl/util/math.hpp2
-rw-r--r--src/mbgl/util/thread.hpp1
19 files changed, 97 insertions, 36 deletions
diff --git a/include/mbgl/storage/network_status.hpp b/include/mbgl/storage/network_status.hpp
index d7f502a3b2..1b5471a44e 100644
--- a/include/mbgl/storage/network_status.hpp
+++ b/include/mbgl/storage/network_status.hpp
@@ -1,6 +1,7 @@
#pragma once
-#include <atomic>
+#include <mbgl/util/atomic.hpp>
+
#include <mutex>
#include <set>
@@ -26,7 +27,7 @@ public:
static void Unsubscribe(util::AsyncTask* async);
private:
- static std::atomic<bool> online;
+ static util::Atomic<bool> online;
static std::mutex mtx;
static std::set<util::AsyncTask*> observers;
};
diff --git a/include/mbgl/util/run_loop.hpp b/include/mbgl/util/run_loop.hpp
index 9703fe7bcb..56965c97e6 100644
--- a/include/mbgl/util/run_loop.hpp
+++ b/include/mbgl/util/run_loop.hpp
@@ -1,5 +1,6 @@
#pragma once
+#include <mbgl/util/atomic.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/util.hpp>
#include <mbgl/util/work_task.hpp>
@@ -9,7 +10,6 @@
#include <utility>
#include <queue>
#include <mutex>
-#include <atomic>
namespace mbgl {
namespace util {
@@ -59,7 +59,7 @@ public:
template <class Fn, class... Args>
std::unique_ptr<AsyncRequest>
invokeCancellable(Fn&& fn, Args&&... args) {
- auto flag = std::make_shared<std::atomic<bool>>();
+ auto flag = std::make_shared<util::Atomic<bool>>();
*flag = false;
auto tuple = std::make_tuple(std::move(args)...);
@@ -77,7 +77,7 @@ public:
template <class Fn, class Cb, class... Args>
std::unique_ptr<AsyncRequest>
invokeWithCallback(Fn&& fn, Cb&& callback, Args&&... args) {
- auto flag = std::make_shared<std::atomic<bool>>();
+ auto flag = std::make_shared<util::Atomic<bool>>();
*flag = false;
// Create a lambda L1 that invokes another lambda L2 on the current RunLoop R, that calls
@@ -114,7 +114,7 @@ private:
template <class F, class P>
class Invoker : public WorkTask {
public:
- Invoker(F&& f, P&& p, std::shared_ptr<std::atomic<bool>> canceled_ = nullptr)
+ Invoker(F&& f, P&& p, std::shared_ptr<util::Atomic<bool>> canceled_ = nullptr)
: canceled(std::move(canceled_)),
func(std::move(f)),
params(std::move(p)) {
@@ -148,7 +148,7 @@ private:
}
std::recursive_mutex mutex;
- std::shared_ptr<std::atomic<bool>> canceled;
+ std::shared_ptr<util::Atomic<bool>> canceled;
F func;
P params;
diff --git a/platform/android/src/async_task.cpp b/platform/android/src/async_task.cpp
index 4a68c1c093..6a9263baff 100644
--- a/platform/android/src/async_task.cpp
+++ b/platform/android/src/async_task.cpp
@@ -1,9 +1,9 @@
#include "run_loop_impl.hpp"
#include <mbgl/util/async_task.hpp>
+#include <mbgl/util/atomic.hpp>
#include <mbgl/util/run_loop.hpp>
-#include <atomic>
#include <functional>
namespace mbgl {
@@ -12,7 +12,7 @@ namespace util {
class AsyncTask::Impl : public RunLoop::Impl::Runnable {
public:
Impl(std::function<void()>&& fn)
- : task(std::move(fn)) {
+ : queued(true), task(std::move(fn)) {
loop->initRunnable(this);
}
@@ -21,7 +21,8 @@ public:
}
void maySend() {
- if (!queued.test_and_set()) {
+ if (queued) {
+ queued = false;
loop->addRunnable(this);
}
}
@@ -32,7 +33,7 @@ public:
void runTask() override {
loop->removeRunnable(this);
- queued.clear();
+ queued = true;
task();
}
@@ -42,7 +43,9 @@ private:
RunLoop::Impl* loop = reinterpret_cast<RunLoop::Impl*>(RunLoop::getLoopHandle());
- std::atomic_flag queued = ATOMIC_FLAG_INIT;
+ // TODO: Use std::atomic_flag if we ever drop
+ // support for ARMv5
+ util::Atomic<bool> queued;
std::function<void()> task;
};
diff --git a/platform/android/src/run_loop_impl.hpp b/platform/android/src/run_loop_impl.hpp
index 5cf7231175..d855728b60 100644
--- a/platform/android/src/run_loop_impl.hpp
+++ b/platform/android/src/run_loop_impl.hpp
@@ -2,10 +2,10 @@
#include "jni.hpp"
+#include <mbgl/util/atomic.hpp>
#include <mbgl/util/chrono.hpp>
#include <mbgl/util/run_loop.hpp>
-#include <atomic>
#include <list>
#include <memory>
#include <mutex>
@@ -47,7 +47,7 @@ private:
bool detach = false;
ALooper* loop = nullptr;
- std::atomic<bool> running;
+ util::Atomic<bool> running;
std::recursive_mutex mtx;
std::list<Runnable*> runnables;
diff --git a/src/mbgl/geometry/glyph_atlas.hpp b/src/mbgl/geometry/glyph_atlas.hpp
index 20ba5890ef..ffabbc2e74 100644
--- a/src/mbgl/geometry/glyph_atlas.hpp
+++ b/src/mbgl/geometry/glyph_atlas.hpp
@@ -2,6 +2,7 @@
#include <mbgl/geometry/binpack.hpp>
#include <mbgl/text/glyph_store.hpp>
+#include <mbgl/util/atomic.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/gl/gl.hpp>
#include <mbgl/gl/gl_object_store.hpp>
@@ -10,7 +11,6 @@
#include <set>
#include <unordered_map>
#include <mutex>
-#include <atomic>
namespace mbgl {
@@ -52,7 +52,7 @@ private:
BinPack<uint16_t> bin;
std::unordered_map<FontStack, std::map<uint32_t, GlyphValue>, FontStackHash> index;
const std::unique_ptr<uint8_t[]> data;
- std::atomic<bool> dirty;
+ util::Atomic<bool> dirty;
gl::TextureHolder texture;
};
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp
index 298255adac..841b4607c6 100644
--- a/src/mbgl/map/map.cpp
+++ b/src/mbgl/map/map.cpp
@@ -518,7 +518,7 @@ CameraOptions Map::cameraForLatLngs(const std::vector<LatLng>& latLngs, optional
scaleY -= (padding->top + padding->bottom) / height;
}
double minScale = ::fmin(scaleX, scaleY);
- double zoom = ::log2(getScale() * minScale);
+ double zoom = util::log2(getScale() * minScale);
zoom = util::clamp(zoom, getMinZoom(), getMaxZoom());
// Calculate the center point of a virtual bounds that is extended in all directions by padding.
diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp
index ac8b6396c7..fab5991de8 100644
--- a/src/mbgl/map/transform_state.cpp
+++ b/src/mbgl/map/transform_state.cpp
@@ -222,7 +222,7 @@ double TransformState::zoomScale(double zoom) const {
}
double TransformState::scaleZoom(double s) const {
- return ::log2(s);
+ return util::log2(s);
}
double TransformState::worldSize() const {
diff --git a/src/mbgl/renderer/bucket.hpp b/src/mbgl/renderer/bucket.hpp
index d7286b0b45..5292ecc6ed 100644
--- a/src/mbgl/renderer/bucket.hpp
+++ b/src/mbgl/renderer/bucket.hpp
@@ -2,11 +2,10 @@
#include <mbgl/gl/gl.hpp>
#include <mbgl/renderer/render_pass.hpp>
+#include <mbgl/util/atomic.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/mat4.hpp>
-#include <atomic>
-
#define BUFFER_OFFSET_0 ((GLbyte*)nullptr)
#define BUFFER_OFFSET(i) ((BUFFER_OFFSET_0) + (i))
@@ -47,7 +46,7 @@ public:
virtual void swapRenderData() {}
protected:
- std::atomic<bool> uploaded;
+ util::Atomic<bool> uploaded;
};
diff --git a/src/mbgl/sprite/sprite_atlas.hpp b/src/mbgl/sprite/sprite_atlas.hpp
index 891f48fa24..b144855a17 100644
--- a/src/mbgl/sprite/sprite_atlas.hpp
+++ b/src/mbgl/sprite/sprite_atlas.hpp
@@ -3,6 +3,7 @@
#include <mbgl/geometry/binpack.hpp>
#include <mbgl/gl/gl.hpp>
#include <mbgl/gl/gl_object_store.hpp>
+#include <mbgl/util/atomic.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/ptr.hpp>
#include <mbgl/util/optional.hpp>
@@ -10,7 +11,6 @@
#include <string>
#include <map>
#include <mutex>
-#include <atomic>
#include <set>
#include <array>
@@ -92,7 +92,7 @@ private:
std::map<Key, Holder> images;
std::set<std::string> uninitialized;
std::unique_ptr<uint32_t[]> data;
- std::atomic<bool> dirty;
+ util::Atomic<bool> dirty;
bool fullUploadRequired = true;
gl::TextureHolder texture;
uint32_t filter = 0;
diff --git a/src/mbgl/storage/network_status.cpp b/src/mbgl/storage/network_status.cpp
index 1ef5619bd6..bc538a5f38 100644
--- a/src/mbgl/storage/network_status.cpp
+++ b/src/mbgl/storage/network_status.cpp
@@ -9,7 +9,7 @@
namespace mbgl {
-std::atomic<bool> NetworkStatus::online(true);
+util::Atomic<bool> NetworkStatus::online(true);
std::mutex NetworkStatus::mtx;
std::set<util::AsyncTask *> NetworkStatus::observers;
diff --git a/src/mbgl/style/style_bucket_parameters.hpp b/src/mbgl/style/style_bucket_parameters.hpp
index 17639afae7..d8d9bc5935 100644
--- a/src/mbgl/style/style_bucket_parameters.hpp
+++ b/src/mbgl/style/style_bucket_parameters.hpp
@@ -3,9 +3,9 @@
#include <mbgl/map/mode.hpp>
#include <mbgl/tile/tile_id.hpp>
#include <mbgl/style/filter.hpp>
+#include <mbgl/util/atomic.hpp>
#include <functional>
-#include <atomic>
namespace mbgl {
@@ -22,7 +22,7 @@ class StyleBucketParameters {
public:
StyleBucketParameters(const OverscaledTileID& tileID_,
const GeometryTileLayer& layer_,
- const std::atomic<bool>& obsolete_,
+ const util::Atomic<bool>& obsolete_,
uintptr_t tileUID_,
bool& partialParse_,
SpriteStore& spriteStore_,
@@ -49,7 +49,7 @@ public:
const OverscaledTileID& tileID;
const GeometryTileLayer& layer;
- const std::atomic<bool>& obsolete;
+ const util::Atomic<bool>& obsolete;
uintptr_t tileUID;
bool& partialParse;
SpriteStore& spriteStore;
diff --git a/src/mbgl/text/glyph_pbf.hpp b/src/mbgl/text/glyph_pbf.hpp
index 08616b268b..3ebd4f4bc5 100644
--- a/src/mbgl/text/glyph_pbf.hpp
+++ b/src/mbgl/text/glyph_pbf.hpp
@@ -3,9 +3,9 @@
#include <mbgl/text/glyph.hpp>
#include <mbgl/text/glyph_store.hpp>
#include <mbgl/style/types.hpp>
+#include <mbgl/util/atomic.hpp>
#include <mbgl/util/noncopyable.hpp>
-#include <atomic>
#include <functional>
#include <string>
#include <memory>
@@ -29,7 +29,7 @@ public:
}
private:
- std::atomic<bool> parsed;
+ util::Atomic<bool> parsed;
std::unique_ptr<AsyncRequest> req;
GlyphStoreObserver* observer = nullptr;
};
diff --git a/src/mbgl/tile/tile_worker.cpp b/src/mbgl/tile/tile_worker.cpp
index fdebe91229..266e357ab1 100644
--- a/src/mbgl/tile/tile_worker.cpp
+++ b/src/mbgl/tile/tile_worker.cpp
@@ -22,7 +22,7 @@ TileWorker::TileWorker(const OverscaledTileID& id_,
SpriteStore& spriteStore_,
GlyphAtlas& glyphAtlas_,
GlyphStore& glyphStore_,
- const std::atomic<bool>& obsolete_,
+ const util::Atomic<bool>& obsolete_,
const MapMode mode_)
: id(id_),
sourceID(std::move(sourceID_)),
diff --git a/src/mbgl/tile/tile_worker.hpp b/src/mbgl/tile/tile_worker.hpp
index 83bf6c7f43..e19d803ac4 100644
--- a/src/mbgl/tile/tile_worker.hpp
+++ b/src/mbgl/tile/tile_worker.hpp
@@ -2,6 +2,7 @@
#include <mbgl/map/mode.hpp>
#include <mbgl/tile/tile_id.hpp>
+#include <mbgl/util/atomic.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/variant.hpp>
#include <mbgl/util/ptr.hpp>
@@ -12,7 +13,6 @@
#include <memory>
#include <mutex>
#include <list>
-#include <atomic>
#include <unordered_map>
namespace mbgl {
@@ -47,7 +47,7 @@ public:
SpriteStore&,
GlyphAtlas&,
GlyphStore&,
- const std::atomic<bool>&,
+ const util::Atomic<bool>&,
const MapMode);
~TileWorker();
@@ -72,7 +72,7 @@ private:
SpriteStore& spriteStore;
GlyphAtlas& glyphAtlas;
GlyphStore& glyphStore;
- const std::atomic<bool>& obsolete;
+ const util::Atomic<bool>& obsolete;
const MapMode mode;
bool partialParse = false;
diff --git a/src/mbgl/tile/vector_tile_data.hpp b/src/mbgl/tile/vector_tile_data.hpp
index 2545df801b..ec557e2023 100644
--- a/src/mbgl/tile/vector_tile_data.hpp
+++ b/src/mbgl/tile/vector_tile_data.hpp
@@ -3,9 +3,9 @@
#include <mbgl/tile/tile_data.hpp>
#include <mbgl/tile/tile_worker.hpp>
#include <mbgl/text/placement_config.hpp>
+#include <mbgl/util/atomic.hpp>
#include <mbgl/util/feature.hpp>
-#include <atomic>
#include <memory>
#include <unordered_map>
@@ -66,7 +66,7 @@ private:
PlacementConfig targetConfig;
// Used to signal the worker that it should abandon parsing this tile as soon as possible.
- std::atomic<bool> obsolete { false };
+ util::Atomic<bool> obsolete { false };
};
} // namespace mbgl
diff --git a/src/mbgl/util/atomic.hpp b/src/mbgl/util/atomic.hpp
new file mode 100644
index 0000000000..3f68bf46a5
--- /dev/null
+++ b/src/mbgl/util/atomic.hpp
@@ -0,0 +1,45 @@
+#pragma once
+
+#include <atomic>
+#include <mutex>
+
+namespace mbgl {
+namespace util {
+
+// std::atomic<bool> is implemented lock free which
+// is not supported by ARMv5 but the code generated
+// seems to be using that and not working at all,
+// thus, this naive implementation using mutexes.
+#if defined(__ANDROID__) && defined(__ARM_ARCH_5TE__)
+
+template <typename T>
+class Atomic {
+public:
+ Atomic() = default;
+ explicit Atomic(const T& data_) : data(data_) {}
+
+ void operator=(const T& other) {
+ std::lock_guard<std::mutex> lock(mtx);
+ data = other;
+ }
+
+ operator bool() const {
+ std::lock_guard<std::mutex> lock(mtx);
+
+ return data;
+ }
+
+private:
+ T data;
+ mutable std::mutex mtx;
+};
+
+#else
+
+template <typename T>
+using Atomic = std::atomic<T>;
+
+#endif
+
+} // namespace util
+} // namespace mbgl
diff --git a/src/mbgl/util/math.cpp b/src/mbgl/util/math.cpp
index a524754109..0e86849ad3 100644
--- a/src/mbgl/util/math.cpp
+++ b/src/mbgl/util/math.cpp
@@ -21,5 +21,15 @@ uint32_t ceil_log2(uint64_t x) {
return y;
}
+double log2(double x) {
+// log2() is producing wrong results on ARMv5 binaries
+// running on ARMv7+ CPUs.
+#if defined(__ANDROID__) && defined(__ARM_ARCH_5TE__)
+ return std::log(x) / 0.6931471805599453; // log(x) / log(2)
+#else
+ return ::log2(x);
+#endif
+}
+
} // namespace util
-} // namespace mbgl \ No newline at end of file
+} // namespace mbgl
diff --git a/src/mbgl/util/math.hpp b/src/mbgl/util/math.hpp
index ef60f76ffe..bfedc2a421 100644
--- a/src/mbgl/util/math.hpp
+++ b/src/mbgl/util/math.hpp
@@ -110,5 +110,7 @@ T smoothstep(T edge0, T edge1, T x) {
// (== number of bits required to store x)
uint32_t ceil_log2(uint64_t x);
+double log2(double x);
+
} // namespace util
} // namespace mbgl
diff --git a/src/mbgl/util/thread.hpp b/src/mbgl/util/thread.hpp
index 9efd5ea92f..c5f9d7338a 100644
--- a/src/mbgl/util/thread.hpp
+++ b/src/mbgl/util/thread.hpp
@@ -6,6 +6,7 @@
#include <utility>
#include <functional>
+#include <mbgl/util/atomic.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/thread_context.hpp>
#include <mbgl/platform/platform.hpp>