summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2020-03-19 23:15:46 +0200
committerkevin <kevin.li@mapbox.com>2020-03-24 10:39:43 +0800
commitb817e0f58d6b62a6d8fc445be0e1bfaf1ef29d03 (patch)
tree414cd8bf861bdc8235b5c7b6b9adb02bbfb726e0
parentbdbac2d78bfea8970c4d26ce72be91092b3407e9 (diff)
downloadqtlocation-mapboxgl-b817e0f58d6b62a6d8fc445be0e1bfaf1ef29d03.tar.gz
Use custom deleter for snapshotter
-rw-r--r--platform/android/src/snapshotter/map_snapshotter.cpp46
-rw-r--r--platform/android/src/snapshotter/map_snapshotter.hpp14
2 files changed, 35 insertions, 25 deletions
diff --git a/platform/android/src/snapshotter/map_snapshotter.cpp b/platform/android/src/snapshotter/map_snapshotter.cpp
index 115c455a94..844d6481da 100644
--- a/platform/android/src/snapshotter/map_snapshotter.cpp
+++ b/platform/android/src/snapshotter/map_snapshotter.cpp
@@ -6,12 +6,28 @@
#include <mbgl/util/string.hpp>
#include <mbgl/actor/scheduler.hpp>
+#include <mapbox/weak.hpp>
+
#include "../attach_env.hpp"
#include "map_snapshot.hpp"
namespace mbgl {
namespace android {
+MapSnapshotter::DeleteOnThread::DeleteOnThread() = default;
+MapSnapshotter::DeleteOnThread::DeleteOnThread(mapbox::base::WeakPtr<mbgl::Scheduler> weakScheduler_) : weakScheduler(weakScheduler_) {}
+
+void MapSnapshotter::DeleteOnThread::operator()(mbgl::MapSnapshotter* p) const {
+ auto guard = weakScheduler.lock();
+ if (weakScheduler && weakScheduler.get() != mbgl::Scheduler::GetCurrent()) {
+ weakScheduler->schedule([ptr = std::shared_ptr<mbgl::MapSnapshotter>(p, DeleteOnThread(weakScheduler))] {
+ (void)ptr;
+ });
+ } else {
+ delete p;
+ }
+}
+
MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env,
const jni::Object<MapSnapshotter>& _obj,
const jni::Object<FileSource>& _jFileSource,
@@ -33,19 +49,19 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env,
return;
}
- weakScheduler = mbgl::Scheduler::GetCurrent()->makeWeakPtr();
-
jFileSource = FileSource::getNativePeer(_env, _jFileSource);
auto size = mbgl::Size { static_cast<uint32_t>(width), static_cast<uint32_t>(height) };
showLogo = _showLogo;
+
// Create the core snapshotter
- snapshotter = std::make_unique<mbgl::MapSnapshotter>(
- size,
- pixelRatio,
- mbgl::android::FileSource::getSharedResourceOptions(_env, _jFileSource),
- *this,
- _localIdeographFontFamily ? jni::Make<std::string>(_env, _localIdeographFontFamily) : optional<std::string>{});
+ snapshotter = std::unique_ptr<mbgl::MapSnapshotter, DeleteOnThread>(new mbgl::MapSnapshotter(
+ size,
+ pixelRatio,
+ mbgl::android::FileSource::getSharedResourceOptions(_env, _jFileSource),
+ *this,
+ _localIdeographFontFamily ? jni::Make<std::string>(_env, _localIdeographFontFamily) : optional<std::string>{}),
+ DeleteOnThread(mbgl::Scheduler::GetCurrent()->makeWeakPtr()));
if (position) {
snapshotter->setCameraOptions(CameraPosition::getCameraOptions(_env, position, pixelRatio));
@@ -62,19 +78,7 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env,
}
}
-MapSnapshotter::~MapSnapshotter() {
- auto guard = weakScheduler.lock();
- if (weakScheduler && weakScheduler.get() != mbgl::Scheduler::GetCurrent()) {
- snapshotter->cancel();
- std::shared_ptr<mbgl::MapSnapshotter> shared = std::move(snapshotter);
- weakScheduler->schedule([s = std::move(shared)] {
- (void)s;
- });
- } else {
- snapshotter.reset();
- }
- vm = nullptr;
-}
+MapSnapshotter::~MapSnapshotter() = default;
void MapSnapshotter::start(JNIEnv& env) {
MBGL_VERIFY_THREAD(tid);
diff --git a/platform/android/src/snapshotter/map_snapshotter.hpp b/platform/android/src/snapshotter/map_snapshotter.hpp
index 1da4f8275b..e6f543649f 100644
--- a/platform/android/src/snapshotter/map_snapshotter.hpp
+++ b/platform/android/src/snapshotter/map_snapshotter.hpp
@@ -3,9 +3,7 @@
#include <jni/jni.hpp>
#include <mbgl/map/map_snapshotter.hpp>
#include <mbgl/util/util.hpp>
-
#include <memory>
-#include <mapbox/weak.hpp>
#include "../file_source.hpp"
#include "../geometry/lat_lng_bounds.hpp"
@@ -65,6 +63,15 @@ public:
void onStyleImageMissing(const std::string&) override;
private:
+ struct DeleteOnThread {
+ DeleteOnThread();
+ explicit DeleteOnThread(mapbox::base::WeakPtr<mbgl::Scheduler>);
+ void operator()(mbgl::MapSnapshotter* p) const;
+ private:
+ mapbox::base::WeakPtr<mbgl::Scheduler> weakScheduler;
+ };
+
+private:
MBGL_STORE_THREAD(tid);
JavaVM *vm = nullptr;
@@ -77,8 +84,7 @@ private:
void activateFilesource(JNIEnv&);
void deactivateFilesource(JNIEnv&);
bool activatedFilesource = false;
- std::unique_ptr<mbgl::MapSnapshotter> snapshotter;
- mapbox::base::WeakPtr<mbgl::Scheduler> weakScheduler;
+ std::unique_ptr<mbgl::MapSnapshotter, DeleteOnThread> snapshotter;
};
} // namespace android