diff --git a/drape_frontend/engine_context.cpp b/drape_frontend/engine_context.cpp index ff864cf128..63452369c4 100644 --- a/drape_frontend/engine_context.cpp +++ b/drape_frontend/engine_context.cpp @@ -37,7 +37,9 @@ void EngineContext::FlushOverlays(TMapShapes && shapes) void EngineContext::FlushTrafficGeometry(TrafficSegmentsGeometry && geometry) { - PostMessage(make_unique_dp(m_tileKey, move(geometry))); + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + make_unique_dp(m_tileKey, move(geometry)), + MessagePriority::Low); } void EngineContext::EndReadTile() diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index 19d4850a08..429bbda4d0 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -85,7 +85,8 @@ enum class MessagePriority { Normal, High, - UberHighSingleton + UberHighSingleton, + Low }; } // namespace df diff --git a/drape_frontend/message_queue.cpp b/drape_frontend/message_queue.cpp index fce3e04e30..59b7850b04 100644 --- a/drape_frontend/message_queue.cpp +++ b/drape_frontend/message_queue.cpp @@ -22,18 +22,25 @@ MessageQueue::~MessageQueue() drape_ptr MessageQueue::PopMessage(bool waitForMessage) { unique_lock lock(m_mutex); - if (waitForMessage && m_messages.empty()) + if (waitForMessage && m_messages.empty() && m_lowPriorityMessages.empty()) { m_isWaiting = true; m_condition.wait(lock, [this]() { return !m_isWaiting; }); m_isWaiting = false; } - if (m_messages.empty()) + if (m_messages.empty() && m_lowPriorityMessages.empty()) return nullptr; - drape_ptr msg = move(m_messages.front().first); - m_messages.pop_front(); + if (!m_messages.empty()) + { + drape_ptr msg = move(m_messages.front().first); + m_messages.pop_front(); + return msg; + } + + drape_ptr msg = move(m_lowPriorityMessages.front()); + m_lowPriorityMessages.pop_front(); return msg; } @@ -73,6 +80,11 @@ void MessageQueue::PushMessage(drape_ptr && message, MessagePriority pr m_messages.emplace_front(move(message), priority); break; } + case MessagePriority::Low: + { + m_lowPriorityMessages.emplace_back(move(message)); + break; + } default: ASSERT(false, ("Unknown message priority type")); } @@ -92,6 +104,14 @@ void MessageQueue::FilterMessages(TFilterMessageFn needFilterMessageFn) else ++it; } + + for (auto it = m_lowPriorityMessages.begin(); it != m_lowPriorityMessages.end(); ) + { + if (needFilterMessageFn(make_ref(*it))) + it = m_lowPriorityMessages.erase(it); + else + ++it; + } } #ifdef DEBUG_MESSAGE_QUEUE @@ -99,13 +119,13 @@ void MessageQueue::FilterMessages(TFilterMessageFn needFilterMessageFn) bool MessageQueue::IsEmpty() const { lock_guard lock(m_mutex); - return m_messages.empty(); + return m_messages.empty() && m_lowPriorityMessages.empty(); } size_t MessageQueue::GetSize() const { lock_guard lock(m_mutex); - return m_messages.size(); + return m_messages.size() + m_lowPriorityMessages.size(); } #endif @@ -128,6 +148,7 @@ void MessageQueue::CancelWaitImpl() void MessageQueue::ClearQuery() { m_messages.clear(); + m_lowPriorityMessages.clear(); } } // namespace df diff --git a/drape_frontend/message_queue.hpp b/drape_frontend/message_queue.hpp index dc2147191b..5330827735 100644 --- a/drape_frontend/message_queue.hpp +++ b/drape_frontend/message_queue.hpp @@ -43,6 +43,7 @@ private: bool m_isWaiting; using TMessageNode = pair, MessagePriority>; deque m_messages; + deque> m_lowPriorityMessages; }; } // namespace df