From 06f54b14775c72b8abbfd516f4628a1dfad297c6 Mon Sep 17 00:00:00 2001 From: ExMix Date: Sun, 29 Nov 2015 13:31:05 +0300 Subject: [PATCH] [drape] only one UpdateReadManagerMessage at moment --- drape_frontend/frontend_renderer.cpp | 6 +++--- drape_frontend/message.hpp | 3 ++- drape_frontend/message_queue.cpp | 26 +++++++++++++++++++++++--- drape_frontend/message_queue.hpp | 3 ++- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index fdec5c78e1..adf0121da8 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -168,7 +168,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) m_requestedTiles->Set(screen, move(tiles)); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(), - MessagePriority::Normal); + MessagePriority::UberHighSingleton); } break; } @@ -427,7 +427,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) m_requestedTiles->Set(screen, move(tiles)); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(), - MessagePriority::Normal); + MessagePriority::UberHighSingleton); RefreshBgColor(); @@ -1059,7 +1059,7 @@ void FrontendRenderer::UpdateScene(ScreenBase const & modelView) m_requestedTiles->Set(modelView, move(tiles)); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(), - MessagePriority::High); + MessagePriority::UberHighSingleton); } void FrontendRenderer::EmitModelViewChanged(ScreenBase const & modelView) const diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index bc5b7a4492..534c5e2cb1 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -52,7 +52,8 @@ public: enum class MessagePriority { Normal, - High + High, + UberHighSingleton }; } // namespace df diff --git a/drape_frontend/message_queue.cpp b/drape_frontend/message_queue.cpp index eb8581a40b..69f9edbdc3 100644 --- a/drape_frontend/message_queue.cpp +++ b/drape_frontend/message_queue.cpp @@ -32,7 +32,7 @@ drape_ptr MessageQueue::PopMessage(bool waitForMessage) if (m_messages.empty()) return nullptr; - drape_ptr msg = move(m_messages.front()); + drape_ptr msg = move(m_messages.front().first); m_messages.pop_front(); return msg; } @@ -45,12 +45,32 @@ void MessageQueue::PushMessage(drape_ptr && message, MessagePriority pr { case MessagePriority::Normal: { - m_messages.emplace_back(move(message)); + m_messages.emplace_back(move(message), priority); break; } case MessagePriority::High: { - m_messages.emplace_front(move(message)); + auto iter = m_messages.begin(); + while (iter != m_messages.end() && iter->second > MessagePriority::High) { iter++; } + m_messages.emplace(iter, move(message), priority); + break; + } + case MessagePriority::UberHighSingleton: + { + bool found = false; + auto iter = m_messages.begin(); + while (iter != m_messages.end() && iter->second == MessagePriority::UberHighSingleton) + { + if (iter->first->GetType() == message->GetType()) + { + found = true; + break; + } + iter++; + } + + if (!found) + m_messages.emplace_front(move(message), priority); break; } default: diff --git a/drape_frontend/message_queue.hpp b/drape_frontend/message_queue.hpp index c4aa9ada02..2562d4954c 100644 --- a/drape_frontend/message_queue.hpp +++ b/drape_frontend/message_queue.hpp @@ -38,7 +38,8 @@ private: mutable mutex m_mutex; condition_variable m_condition; bool m_isWaiting; - deque > m_messages; + using TMessageNode = pair, MessagePriority>; + deque m_messages; }; } // namespace df