summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2020-03-20 10:27:00 +0200
committerkevin <kevin.li@mapbox.com>2020-03-24 10:39:43 +0800
commita0b7d4f5776fd8e3bbd1cd63316a4ba0eab3f58e (patch)
treee72d71267dea83f5956a6e38bf1f06098e5740ef
parent2453335adff65bd6a5116639e4c3ab4f50dcc16d (diff)
downloadqtlocation-mapboxgl-a0b7d4f5776fd8e3bbd1cd63316a4ba0eab3f58e.tar.gz
Release snapshotter pointer to deleting lambda
-rw-r--r--platform/android/src/snapshotter/map_snapshotter.cpp36
-rw-r--r--platform/android/src/snapshotter/map_snapshotter.hpp15
2 files changed, 20 insertions, 31 deletions
diff --git a/platform/android/src/snapshotter/map_snapshotter.cpp b/platform/android/src/snapshotter/map_snapshotter.cpp
index c72d657fc5..812bd414eb 100644
--- a/platform/android/src/snapshotter/map_snapshotter.cpp
+++ b/platform/android/src/snapshotter/map_snapshotter.cpp
@@ -1,6 +1,5 @@
#include "map_snapshotter.hpp"
-#include <mapbox/weak.hpp>
#include <mbgl/actor/scheduler.hpp>
#include <mbgl/renderer/renderer.hpp>
#include <mbgl/style/style.hpp>
@@ -13,20 +12,6 @@
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,
@@ -48,20 +33,20 @@ 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::unique_ptr<mbgl::MapSnapshotter, DeleteOnThread>(
- new mbgl::MapSnapshotter(size,
+ 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>{}),
- DeleteOnThread(mbgl::Scheduler::GetCurrent()->makeWeakPtr()));
+ : optional<std::string>{});
if (position) {
snapshotter->setCameraOptions(CameraPosition::getCameraOptions(_env, position, pixelRatio));
@@ -78,7 +63,18 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env,
}
}
-MapSnapshotter::~MapSnapshotter() = default;
+MapSnapshotter::~MapSnapshotter() {
+ auto guard = weakScheduler.lock();
+ if (weakScheduler && weakScheduler.get() != mbgl::Scheduler::GetCurrent()) {
+ snapshotter->cancel();
+ weakScheduler->schedule([ptr = snapshotter.release()]() mutable {
+ if (ptr) {
+ delete ptr;
+ ptr = nullptr;
+ }
+ });
+ }
+}
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 99c8b6d2df..c7c25faab4 100644
--- a/platform/android/src/snapshotter/map_snapshotter.hpp
+++ b/platform/android/src/snapshotter/map_snapshotter.hpp
@@ -3,6 +3,8 @@
#include <jni/jni.hpp>
#include <mbgl/map/map_snapshotter.hpp>
#include <mbgl/util/util.hpp>
+#include <mapbox/weak.hpp>
+
#include <memory>
#include "../file_source.hpp"
@@ -63,16 +65,6 @@ 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;
@@ -85,7 +77,8 @@ private:
void activateFilesource(JNIEnv&);
void deactivateFilesource(JNIEnv&);
bool activatedFilesource = false;
- std::unique_ptr<mbgl::MapSnapshotter, DeleteOnThread> snapshotter;
+ mapbox::base::WeakPtr<mbgl::Scheduler> weakScheduler;
+ std::unique_ptr<mbgl::MapSnapshotter> snapshotter;
};
} // namespace android