From ea00efe391274efcae7d3d4bff464fd84f17ee4e Mon Sep 17 00:00:00 2001 From: vng Date: Sun, 4 Mar 2012 14:35:52 +0300 Subject: [PATCH] [search] Avoid many search threads waiting in search mutex. --- search/search_engine.cpp | 14 +++++++++++++- search/search_engine.hpp | 4 +++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/search/search_engine.cpp b/search/search_engine.cpp index f89c0742e0..ef85d26ff3 100644 --- a/search/search_engine.cpp +++ b/search/search_engine.cpp @@ -129,7 +129,6 @@ void Engine::Search(SearchParams const & params, m2::RectD const & viewport) { threads::MutexGuard guard(m_updateMutex); - m_params = params; m_viewport = viewport; } @@ -153,12 +152,25 @@ void Engine::SetViewportAsync(m2::RectD const & viewport, m2::RectD const & near void Engine::SearchAsync() { + { + // Avoid many threads waiting in search mutex. One is enough. + threads::MutexGuard readyGuard(m_readyMutex); + if (m_readyThread) + return; + m_readyThread = true; + } + // First of all - cancel previous query. m_pQuery->DoCancel(); // Enter to run new search. threads::MutexGuard searchGuard(m_searchMutex); + { + threads::MutexGuard readyGuard(m_readyMutex); + m_readyThread = false; + } + // Get current search params. SearchParams params; m2::RectD arrRects[2]; diff --git a/search/search_engine.hpp b/search/search_engine.hpp index 3111c84aad..04b2d3f3da 100644 --- a/search/search_engine.hpp +++ b/search/search_engine.hpp @@ -47,7 +47,9 @@ private: void SetViewportAsync(m2::RectD const & viewport, m2::RectD const & nearby); void SearchAsync(); - threads::Mutex m_searchMutex, m_updateMutex; + threads::Mutex m_searchMutex, m_updateMutex, m_readyMutex; + + volatile bool m_readyThread; SearchParams m_params; m2::RectD m_viewport;