From 1783b7d28e9b85255e7e47a8eba8dbcee96a945c Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Fri, 14 Feb 2020 20:24:19 +0200 Subject: [android] Don't construct weak sheduler in renderer's custructor Android renderer creates mailbox that is owned by the scheduler that is required by the mailbox itself. Construction should be split, so that scheduler is fully constructed and it's weakPtr can be created. --- platform/android/src/map_renderer.cpp | 27 +++++++++++++++++++-------- platform/android/src/map_renderer.hpp | 10 +++++++++- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/platform/android/src/map_renderer.cpp b/platform/android/src/map_renderer.cpp index f5336e3dd8..3ebbdb7e5e 100644 --- a/platform/android/src/map_renderer.cpp +++ b/platform/android/src/map_renderer.cpp @@ -17,10 +17,21 @@ MapRenderer::MapRenderer(jni::JNIEnv& _env, const jni::Object& obj, jni::jfloat pixelRatio_, const jni::String& localIdeographFontFamily_) - : javaPeer(_env, obj) - , pixelRatio(pixelRatio_) - , localIdeographFontFamily(localIdeographFontFamily_ ? jni::Make(_env, localIdeographFontFamily_) : optional{}) - , mailbox(std::make_shared(*this)) { + : javaPeer(_env, obj), + pixelRatio(pixelRatio_), + localIdeographFontFamily(localIdeographFontFamily_ ? jni::Make(_env, localIdeographFontFamily_) + : optional{}), + mailboxData(this) {} + +MapRenderer::MailboxData::MailboxData(Scheduler* scheduler_) : scheduler(scheduler_) { + assert(scheduler); +} + +std::shared_ptr MapRenderer::MailboxData::getMailbox() const noexcept { + if (!mailbox) { + mailbox = std::make_shared(*scheduler); + } + return mailbox; } MapRenderer::~MapRenderer() = default; @@ -30,7 +41,7 @@ void MapRenderer::reset() { if (renderer) { // Make sure to destroy the renderer on the GL Thread - auto self = ActorRef(*this, mailbox); + auto self = ActorRef(*this, mailboxData.getMailbox()); self.ask(&MapRenderer::resetRenderer).wait(); } @@ -93,7 +104,7 @@ void MapRenderer::setObserver(std::shared_ptr _rendererObserve } void MapRenderer::requestSnapshot(SnapshotCallback callback) { - auto self = ActorRef(*this, mailbox); + auto self = ActorRef(*this, mailboxData.getMailbox()); self.invoke( &MapRenderer::scheduleSnapshot, std::make_unique([&, callback=std::move(callback), runloop=util::RunLoop::Get()](PremultipliedImage image) { @@ -172,7 +183,7 @@ void MapRenderer::onSurfaceCreated(JNIEnv&) { // Create the new backend and renderer backend = std::make_unique(); renderer = std::make_unique(*backend, pixelRatio, localIdeographFontFamily); - rendererRef = std::make_unique>(*renderer, mailbox); + rendererRef = std::make_unique>(*renderer, mailboxData.getMailbox()); // Set the observer on the new Renderer implementation if (rendererObserver) { @@ -193,7 +204,7 @@ void MapRenderer::onSurfaceChanged(JNIEnv& env, jint width, jint height) { void MapRenderer::onRendererReset(JNIEnv&) { // Make sure to destroy the renderer on the GL Thread - auto self = ActorRef(*this, mailbox); + auto self = ActorRef(*this, mailboxData.getMailbox()); self.ask(&MapRenderer::resetRenderer).wait(); } diff --git a/platform/android/src/map_renderer.hpp b/platform/android/src/map_renderer.hpp index 047f1870c7..e37d37cfc8 100644 --- a/platform/android/src/map_renderer.hpp +++ b/platform/android/src/map_renderer.hpp @@ -82,6 +82,14 @@ protected: void scheduleSnapshot(std::unique_ptr); private: + struct MailboxData { + explicit MailboxData(Scheduler*); + std::shared_ptr getMailbox() const noexcept; + + private: + Scheduler* scheduler; + mutable std::shared_ptr mailbox; + }; // Called from the GL Thread // // Resets the renderer @@ -107,7 +115,7 @@ private: optional localIdeographFontFamily; std::shared_ptr threadPool; - std::shared_ptr mailbox; + const MailboxData mailboxData; std::mutex initialisationMutex; std::shared_ptr rendererObserver; -- cgit v1.2.1