mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-19 13:03:36 +00:00
[map] Updated wiki loader.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
This commit is contained in:
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
#include "indexer/data_source.hpp"
|
#include "indexer/data_source.hpp"
|
||||||
|
|
||||||
#include "base/assert.hpp"
|
|
||||||
|
|
||||||
#include "defines.hpp"
|
#include "defines.hpp"
|
||||||
|
|
||||||
namespace descriptions
|
namespace descriptions
|
||||||
@@ -20,17 +18,28 @@ std::string Loader::GetWikiDescription(FeatureID const & featureId, std::vector<
|
|||||||
if (!value.m_cont.IsExist(DESCRIPTIONS_FILE_TAG))
|
if (!value.m_cont.IsExist(DESCRIPTIONS_FILE_TAG))
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
EntryPtr entry;
|
// No need to have separate mutexes for each MWM since there is no concurrent Wiki pages reading.
|
||||||
{
|
// Pros: lock is called once and a simple logic with OnMwmDeregistered synchronization.
|
||||||
std::lock_guard<std::mutex> lock(m_mutex);
|
/// @todo Consider removing mutex at all or make wiki loading async (PlacePage info).
|
||||||
entry = m_deserializers.try_emplace(featureId.m_mwmId, std::make_shared<Entry>()).first->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT(entry, ());
|
std::lock_guard lock(m_mutex);
|
||||||
|
Deserializer & deserializer = m_deserializers[featureId.m_mwmId];
|
||||||
|
|
||||||
auto readerPtr = value.m_cont.GetReader(DESCRIPTIONS_FILE_TAG);
|
auto readerPtr = value.m_cont.GetReader(DESCRIPTIONS_FILE_TAG);
|
||||||
|
return deserializer.Deserialize(*readerPtr.GetPtr(), featureId.m_index, langPriority);
|
||||||
std::lock_guard<std::mutex> lock(entry->m_mutex);
|
|
||||||
return entry->m_deserializer.Deserialize(*readerPtr.GetPtr(), featureId.m_index, langPriority);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Loader::OnMwmDeregistered(platform::LocalCountryFile const & countryFile)
|
||||||
|
{
|
||||||
|
std::lock_guard lock(m_mutex);
|
||||||
|
for (auto it = m_deserializers.begin(); it != m_deserializers.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->first.IsDeregistered(countryFile))
|
||||||
|
{
|
||||||
|
m_deserializers.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace descriptions
|
} // namespace descriptions
|
||||||
|
|||||||
@@ -5,9 +5,7 @@
|
|||||||
#include "indexer/feature_decl.hpp"
|
#include "indexer/feature_decl.hpp"
|
||||||
#include "indexer/mwm_set.hpp"
|
#include "indexer/mwm_set.hpp"
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -23,18 +21,11 @@ public:
|
|||||||
explicit Loader(DataSource const & dataSource) : m_dataSource(dataSource) {}
|
explicit Loader(DataSource const & dataSource) : m_dataSource(dataSource) {}
|
||||||
|
|
||||||
std::string GetWikiDescription(FeatureID const & featureId, std::vector<int8_t> const & langPriority);
|
std::string GetWikiDescription(FeatureID const & featureId, std::vector<int8_t> const & langPriority);
|
||||||
|
void OnMwmDeregistered(platform::LocalCountryFile const & countryFile);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Entry
|
|
||||||
{
|
|
||||||
std::mutex m_mutex;
|
|
||||||
Deserializer m_deserializer;
|
|
||||||
};
|
|
||||||
|
|
||||||
using EntryPtr = std::shared_ptr<Entry>;
|
|
||||||
|
|
||||||
DataSource const & m_dataSource;
|
DataSource const & m_dataSource;
|
||||||
std::map<MwmSet::MwmId, EntryPtr> m_deserializers;
|
std::map<MwmSet::MwmId, Deserializer> m_deserializers;
|
||||||
std::mutex m_mutex;
|
std::mutex m_mutex;
|
||||||
};
|
};
|
||||||
} // namespace descriptions
|
} // namespace descriptions
|
||||||
|
|||||||
@@ -452,6 +452,7 @@ void Framework::OnMapDeregistered(platform::LocalCountryFile const & localFile)
|
|||||||
m_transitManager.OnMwmDeregistered(localFile);
|
m_transitManager.OnMwmDeregistered(localFile);
|
||||||
m_isolinesManager.OnMwmDeregistered(localFile);
|
m_isolinesManager.OnMwmDeregistered(localFile);
|
||||||
m_trafficManager.OnMwmDeregistered(localFile);
|
m_trafficManager.OnMwmDeregistered(localFile);
|
||||||
|
m_descriptionsLoader->OnMwmDeregistered(localFile);
|
||||||
|
|
||||||
m_storage.DeleteCustomCountryVersion(localFile);
|
m_storage.DeleteCustomCountryVersion(localFile);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user