From 7fa65e1d19823792bee4f0deac8386b4137091f4 Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Wed, 7 Oct 2015 16:04:08 +0300 Subject: [PATCH] [search] Fixed resources release in Retrieval. --- map/framework.hpp | 15 ++++++++----- search/retrieval.cpp | 13 +++++++---- search/retrieval.hpp | 5 +++++ .../retrieval_test.cpp | 22 +++++++++++++++++++ search/search_query.cpp | 1 + 5 files changed, 47 insertions(+), 9 deletions(-) diff --git a/map/framework.hpp b/map/framework.hpp index 57df077927..6df370ff0a 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -101,13 +101,18 @@ protected: StringsBundle m_stringsBundle; - // The order matters here: storage::CountryInfoGetter must be - // initialized before search::Engine. - unique_ptr m_infoGetter; - unique_ptr m_searchEngine; - search::QuerySaver m_searchQuerySaver; + // The order matters here: storage::CountryInfoGetter and + // m_model::FeaturesFetcher must be initialized before + // search::Engine and, therefore, destroyed after search::Engine. model::FeaturesFetcher m_model; + + unique_ptr m_infoGetter; + + unique_ptr m_searchEngine; + + search::QuerySaver m_searchQuerySaver; + ScreenBase m_currentModelView; routing::RoutingSession m_routingSession; diff --git a/search/retrieval.cpp b/search/retrieval.cpp index 22da2d6a8b..eac822db68 100644 --- a/search/retrieval.cpp +++ b/search/retrieval.cpp @@ -329,13 +329,14 @@ void Retrieval::Init(Index & index, vector> const & infos, m2::RectD const & viewport, SearchQueryParams const & params, Limits const & limits) { + Release(); + m_index = &index; m_viewport = viewport; m_params = params; m_limits = limits; m_featuresReported = 0; - m_buckets.clear(); for (auto const & info : infos) { MwmSet::MwmHandle handle = index.GetMwmHandleById(MwmSet::MwmId(info)); @@ -386,6 +387,8 @@ void Retrieval::Go(Callback & callback) } } +void Retrieval::Release() { m_buckets.clear(); } + bool Retrieval::RetrieveForScale(Bucket & bucket, double scale, Callback & callback) { m2::RectD viewport = m_viewport; @@ -404,8 +407,6 @@ bool Retrieval::RetrieveForScale(Bucket & bucket, double scale, Callback & callb if (!InitBucketStrategy(bucket)) return false; bucket.m_intersectsWithViewport = true; - if (bucket.m_addressFeatures.empty()) - bucket.m_finished = true; } ASSERT(bucket.m_intersectsWithViewport, ()); @@ -478,9 +479,13 @@ void Retrieval::FinishBucket(Bucket & bucket, Callback & callback) { if (bucket.m_finished) return; + + auto const mwmId = bucket.m_handle.GetId(); + bucket.m_finished = true; bucket.m_handle = MwmSet::MwmHandle(); - callback.OnMwmProcessed(bucket.m_handle.GetId()); + + callback.OnMwmProcessed(mwmId); } bool Retrieval::Finished() const diff --git a/search/retrieval.hpp b/search/retrieval.hpp index b97bf95ee4..59f95d20c9 100644 --- a/search/retrieval.hpp +++ b/search/retrieval.hpp @@ -98,6 +98,8 @@ public: Retrieval(); + // Initializes retrieval process, sets up internal state, takes all + // necessary system resources. void Init(Index & index, vector> const & infos, m2::RectD const & viewport, SearchQueryParams const & params, Limits const & limits); @@ -110,6 +112,9 @@ public: // covered by) a rectangle. void Go(Callback & callback); + // Releases all taken system resources. + void Release(); + private: // This class is a wrapper around single mwm during retrieval // process. diff --git a/search/search_integration_tests/retrieval_test.cpp b/search/search_integration_tests/retrieval_test.cpp index d00501b809..ba1b009004 100644 --- a/search/search_integration_tests/retrieval_test.cpp +++ b/search/search_integration_tests/retrieval_test.cpp @@ -43,9 +43,22 @@ void InitParams(string const & query, search::SearchQueryParams & params) params.m_langs.insert(StringUtf8Multilang::GetLangIndex("en")); } +bool AllMwmsReleased(Index & index) +{ + vector> infos; + index.GetMwmsInfo(infos); + for (auto const & info : infos) + { + if (info->GetNumRefs() != 0) + return false; + } + return true; +} + class MatchingRule { public: + virtual ~MatchingRule() = default; virtual bool Matches(FeatureType const & feature) const = 0; @@ -362,8 +375,11 @@ UNIT_TEST(Retrieval_3Mwms) retrieval.Init(index, infos, m2::RectD(m2::PointD(-1.0, -1.0), m2::PointD(1.0, 1.0)), params, limits); retrieval.Go(callback); + retrieval.Release(); + TEST(callback.WasTriggered(), ()); TEST_EQUAL(callback.Offsets().size(), 1, ()); + TEST(AllMwmsReleased(index), ()); } { @@ -374,8 +390,11 @@ UNIT_TEST(Retrieval_3Mwms) retrieval.Init(index, infos, m2::RectD(m2::PointD(-1.0, -1.0), m2::PointD(1.0, 1.0)), params, limits); retrieval.Go(callback); + retrieval.Release(); + TEST_EQUAL(3 /* total number of mwms */, callback.GetNumMwms(), ()); TEST_EQUAL(3 /* total number of features in all these mwms */, callback.GetNumFeatures(), ()); + TEST(AllMwmsReleased(index), ()); } { @@ -385,8 +404,11 @@ UNIT_TEST(Retrieval_3Mwms) retrieval.Init(index, infos, m2::RectD(m2::PointD(-1.0, -1.0), m2::PointD(1.0, 1.0)), params, limits); retrieval.Go(callback); + retrieval.Release(); + TEST_EQUAL(3, callback.GetNumMwms(), ()); TEST_EQUAL(3, callback.GetNumFeatures(), ()); + TEST(AllMwmsReleased(index), ()); } } diff --git a/search/search_query.cpp b/search/search_query.cpp index 5b68c450aa..618230b925 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -1665,6 +1665,7 @@ void Query::SearchInMwms(TMWMVector const & mwmsInfo, SearchQueryParams const & m_retrieval.Init(m_index, mwmsInfo, *viewport, params, limits); RetrievalCallback callback(m_index, *this, viewportId); m_retrieval.Go(callback); + m_retrieval.Release(); } void Query::SuggestStrings(Results & res)