diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-03-20 10:27:00 +0200 |
---|---|---|
committer | kevin <kevin.li@mapbox.com> | 2020-03-24 10:39:43 +0800 |
commit | a0b7d4f5776fd8e3bbd1cd63316a4ba0eab3f58e (patch) | |
tree | e72d71267dea83f5956a6e38bf1f06098e5740ef | |
parent | 2453335adff65bd6a5116639e4c3ab4f50dcc16d (diff) | |
download | qtlocation-mapboxgl-a0b7d4f5776fd8e3bbd1cd63316a4ba0eab3f58e.tar.gz |
Release snapshotter pointer to deleting lambda
-rw-r--r-- | platform/android/src/snapshotter/map_snapshotter.cpp | 36 | ||||
-rw-r--r-- | platform/android/src/snapshotter/map_snapshotter.hpp | 15 |
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 |