From 29d87c6e9526060627dcc1388c49714dd1586590 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Wed, 23 Dec 2015 16:45:17 +0300 Subject: [PATCH] Fixed implicit pure virtual call from destructor --- drape_frontend/backend_renderer.cpp | 12 ++++++++++++ drape_frontend/backend_renderer.hpp | 6 ++++++ drape_frontend/base_renderer.cpp | 2 +- drape_frontend/base_renderer.hpp | 5 ++--- drape_frontend/drape_engine.cpp | 6 +++++- drape_frontend/frontend_renderer.cpp | 12 ++++++++++++ drape_frontend/frontend_renderer.hpp | 6 ++++++ drape_frontend/message_acceptor.cpp | 3 +-- drape_frontend/message_acceptor.hpp | 1 - drape_frontend/threads_commutator.cpp | 6 +++--- drape_frontend/threads_commutator.hpp | 6 +++--- 11 files changed, 51 insertions(+), 14 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index bfdf68830b..e3656bd416 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -28,6 +28,10 @@ BackendRenderer::BackendRenderer(Params const & params) , m_readManager(make_unique_dp(params.m_commutator, m_model)) , m_requestedTiles(params.m_requestedTiles) { +#ifdef DEBUG + m_isTeardowned = false; +#endif + gui::DrapeGui::Instance().SetRecacheCountryStatusSlot([this]() { m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, @@ -51,9 +55,17 @@ BackendRenderer::BackendRenderer(Params const & params) } BackendRenderer::~BackendRenderer() +{ + ASSERT(m_isTeardowned, ()); +} + +void BackendRenderer::Teardown() { gui::DrapeGui::Instance().ClearRecacheCountryStatusSlot(); StopThread(); +#ifdef DEBUG + m_isTeardowned = true; +#endif } unique_ptr BackendRenderer::CreateRoutine() diff --git a/drape_frontend/backend_renderer.hpp b/drape_frontend/backend_renderer.hpp index 42505baf11..7d5eee462c 100644 --- a/drape_frontend/backend_renderer.hpp +++ b/drape_frontend/backend_renderer.hpp @@ -45,6 +45,8 @@ public: BackendRenderer(Params const & params); ~BackendRenderer() override; + void Teardown(); + protected: unique_ptr CreateRoutine() override; @@ -79,6 +81,10 @@ private: gui::LayerCacher m_guiCacher; ref_ptr m_requestedTiles; + +#ifdef DEBUG + bool m_isTeardowned; +#endif }; } // namespace df diff --git a/drape_frontend/base_renderer.cpp b/drape_frontend/base_renderer.cpp index 498939e14f..90c8e9c7ed 100644 --- a/drape_frontend/base_renderer.cpp +++ b/drape_frontend/base_renderer.cpp @@ -135,7 +135,7 @@ void BaseRenderer::ProcessStopRenderingMessage() CloseQueue(); } -bool BaseRenderer::CanReceiveMessage() +bool BaseRenderer::CanReceiveMessages() { return !m_selfThread.GetRoutine()->IsCancelled(); } diff --git a/drape_frontend/base_renderer.hpp b/drape_frontend/base_renderer.hpp index 4cde6295c4..4cc54cdd0b 100644 --- a/drape_frontend/base_renderer.hpp +++ b/drape_frontend/base_renderer.hpp @@ -38,6 +38,8 @@ public: BaseRenderer(ThreadsCommutator::ThreadName name, Params const & params); + bool CanReceiveMessages(); + void SetRenderingEnabled(bool const isEnabled); protected: @@ -54,11 +56,8 @@ protected: virtual unique_ptr CreateRoutine() = 0; private: - bool CanReceiveMessage() override; - using TCompletionHandler = function; -private: threads::Thread m_selfThread; ThreadsCommutator::ThreadName m_threadName; diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index e746532a78..2f2a813b81 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -82,9 +82,13 @@ DrapeEngine::DrapeEngine(Params && params) DrapeEngine::~DrapeEngine() { - // reset pointers explicitly! We must wait for threads completion + // Call Teardown and reset pointers explicitly! We must wait for threads completion. + m_frontend->Teardown(); m_frontend.reset(); + + m_backend->Teardown(); m_backend.reset(); + m_threadCommutator.reset(); gui::DrapeGui::Instance().Destroy(); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 2dd641a2f9..5f082eaa1e 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -55,6 +55,10 @@ FrontendRenderer::FrontendRenderer(Params const & params) m_fps = 0.0; #endif +#ifdef DEBUG + m_isTeardowned = false; +#endif + ASSERT(m_tapEventInfoFn, ()); ASSERT(m_userPositionChangedFn, ()); @@ -65,8 +69,16 @@ FrontendRenderer::FrontendRenderer(Params const & params) } FrontendRenderer::~FrontendRenderer() +{ + ASSERT(m_isTeardowned, ()); +} + +void FrontendRenderer::Teardown() { StopThread(); +#ifdef DEBUG + m_isTeardowned = true; +#endif } #ifdef DRAW_INFO diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 89d5473560..c6f11180e6 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -103,6 +103,8 @@ public: FrontendRenderer(Params const & params); ~FrontendRenderer() override; + void Teardown(); + #ifdef DRAW_INFO double m_tpf; double m_fps; @@ -232,6 +234,10 @@ private: int m_currentZoomLevel = -1; ref_ptr m_requestedTiles; uint64_t m_maxGeneration; + +#ifdef DEBUG + bool m_isTeardowned; +#endif }; } // namespace df diff --git a/drape_frontend/message_acceptor.cpp b/drape_frontend/message_acceptor.cpp index 77b9b7a864..322b6158c4 100644 --- a/drape_frontend/message_acceptor.cpp +++ b/drape_frontend/message_acceptor.cpp @@ -25,8 +25,7 @@ bool MessageAcceptor::ProcessSingleMessage(bool waitForMessage) void MessageAcceptor::PostMessage(drape_ptr && message, MessagePriority priority) { - if (CanReceiveMessage()) - m_messageQueue.PushMessage(move(message), priority); + m_messageQueue.PushMessage(move(message), priority); } void MessageAcceptor::CloseQueue() diff --git a/drape_frontend/message_acceptor.hpp b/drape_frontend/message_acceptor.hpp index 2b45dada5b..24ab837497 100644 --- a/drape_frontend/message_acceptor.hpp +++ b/drape_frontend/message_acceptor.hpp @@ -18,7 +18,6 @@ protected: virtual ~MessageAcceptor(){} virtual void AcceptMessage(ref_ptr message) = 0; - virtual bool CanReceiveMessage() = 0; /// Must be called by subclass on message target thread bool ProcessSingleMessage(bool waitForMessage = true); diff --git a/drape_frontend/threads_commutator.cpp b/drape_frontend/threads_commutator.cpp index 91264a9307..961abf0347 100644 --- a/drape_frontend/threads_commutator.cpp +++ b/drape_frontend/threads_commutator.cpp @@ -1,13 +1,13 @@ #include "drape_frontend/threads_commutator.hpp" -#include "drape_frontend/message_acceptor.hpp" +#include "drape_frontend/base_renderer.hpp" #include "base/assert.hpp" namespace df { -void ThreadsCommutator::RegisterThread(ThreadName name, MessageAcceptor * acceptor) +void ThreadsCommutator::RegisterThread(ThreadName name, BaseRenderer * acceptor) { VERIFY(m_acceptors.insert(make_pair(name, acceptor)).second, ()); } @@ -16,7 +16,7 @@ void ThreadsCommutator::PostMessage(ThreadName name, drape_ptr && messa { TAcceptorsMap::iterator it = m_acceptors.find(name); ASSERT(it != m_acceptors.end(), ()); - if (it != m_acceptors.end()) + if (it != m_acceptors.end() && it->second->CanReceiveMessages()) it->second->PostMessage(move(message), priority); } diff --git a/drape_frontend/threads_commutator.hpp b/drape_frontend/threads_commutator.hpp index a74e38af63..e484d6aa3a 100644 --- a/drape_frontend/threads_commutator.hpp +++ b/drape_frontend/threads_commutator.hpp @@ -8,7 +8,7 @@ namespace df class Message; enum class MessagePriority; -class MessageAcceptor; +class BaseRenderer; class ThreadsCommutator { @@ -19,11 +19,11 @@ public: ResourceUploadThread }; - void RegisterThread(ThreadName name, MessageAcceptor *acceptor); + void RegisterThread(ThreadName name, BaseRenderer * acceptor); void PostMessage(ThreadName name, drape_ptr && message, MessagePriority priority); private: - typedef map TAcceptorsMap; + using TAcceptorsMap = map; TAcceptorsMap m_acceptors; };