Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuri Gorshenin <y@mmaps.me>2015-03-31 19:21:39 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 02:41:35 +0300
commit9e5ac4ef2a843481e59cbe5295c785a92a374bf9 (patch)
treef6b29e544a34a4f12138224cdf9341c28ce31702 /indexer/mwm_set.cpp
parent25f7a7f2f32cc4db8a5bd0106ae4c8f6c6292201 (diff)
Fixed MwmSet::Register() signature.
Diffstat (limited to 'indexer/mwm_set.cpp')
-rw-r--r--indexer/mwm_set.cpp82
1 files changed, 66 insertions, 16 deletions
diff --git a/indexer/mwm_set.cpp b/indexer/mwm_set.cpp
index 359640066d..608100b3fe 100644
--- a/indexer/mwm_set.cpp
+++ b/indexer/mwm_set.cpp
@@ -3,12 +3,15 @@
#include "../defines.hpp"
+#include "../base/assert.hpp"
#include "../base/logging.hpp"
-#include "../base/macros.hpp"
#include "../base/stl_add.hpp"
#include "../std/algorithm.hpp"
+// static
+MwmSet::MwmId const MwmSet::INVALID_MWM_ID = static_cast<MwmSet::MwmId>(-1);
+
MwmInfo::MwmInfo() : m_lockCount(0), m_status(STATUS_DEREGISTERED)
{
// Important: STATUS_DEREGISTERED - is the default value.
@@ -23,17 +26,54 @@ MwmInfo::MwmTypeT MwmInfo::GetType() const
return COASTS;
}
+MwmSet::MwmLock::MwmLock() : m_mwmSet(nullptr), m_mwmId(MwmSet::INVALID_MWM_ID), m_value(nullptr) {}
+
MwmSet::MwmLock::MwmLock(MwmSet & mwmSet, MwmId mwmId)
- : m_mwmSet(mwmSet), m_id(mwmId), m_pValue(mwmSet.LockValue(mwmId))
+ : m_mwmSet(&mwmSet), m_mwmId(mwmId), m_value(m_mwmSet->LockValue(m_mwmId))
+{
+}
+
+MwmSet::MwmLock::MwmLock(MwmSet & mwmSet, string const & fileName)
+ : m_mwmSet(&mwmSet), m_mwmId(MwmSet::INVALID_MWM_ID), m_value(nullptr)
+{
+ lock_guard<mutex> lock(m_mwmSet->m_lock);
+ m_mwmId = m_mwmSet->GetIdByName(fileName);
+ if (m_mwmId != MwmSet::INVALID_MWM_ID)
+ m_value = m_mwmSet->LockValueImpl(m_mwmId);
+}
+
+MwmSet::MwmLock::MwmLock(MwmSet & mwmSet, MwmId mwmId, MwmValueBase * value)
+ : m_mwmSet(&mwmSet), m_mwmId(mwmId), m_value(value)
+{
+}
+
+MwmSet::MwmLock::MwmLock(MwmLock && lock)
+ : m_mwmSet(lock.m_mwmSet), m_mwmId(lock.m_mwmId), m_value(lock.m_value)
{
+ lock.m_mwmId = 0;
+ lock.m_mwmId = MwmSet::INVALID_MWM_ID;
+ lock.m_value = 0;
}
MwmSet::MwmLock::~MwmLock()
{
- if (m_pValue)
- m_mwmSet.UnlockValue(m_id, m_pValue);
+ if (m_mwmSet && m_value)
+ m_mwmSet->UnlockValue(m_mwmId, m_value);
+}
+
+MwmInfo const & MwmSet::MwmLock::GetInfo() const
+{
+ ASSERT(IsLocked(), ("MwmLock is not active."));
+ return m_mwmSet->GetMwmInfo(m_mwmId);
}
+MwmSet::MwmLock & MwmSet::MwmLock::operator=(MwmLock && lock)
+{
+ swap(m_mwmSet, lock.m_mwmSet);
+ swap(m_mwmId, lock.m_mwmId);
+ swap(m_value, lock.m_value);
+ return *this;
+}
MwmSet::MwmSet(size_t cacheSize)
: m_cacheSize(cacheSize)
@@ -102,8 +142,7 @@ MwmSet::MwmId MwmSet::GetIdByName(string const & name)
return INVALID_MWM_ID;
}
-bool MwmSet::Register(string const & fileName, m2::RectD & rect,
- feature::DataHeader::Version & version)
+pair<MwmSet::MwmLock, bool> MwmSet::Register(string const & fileName)
{
lock_guard<mutex> lock(m_lock);
@@ -114,20 +153,18 @@ bool MwmSet::Register(string const & fileName, m2::RectD & rect,
LOG(LWARNING, ("Trying to add already registered map", fileName));
else
m_info[id].SetStatus(MwmInfo::STATUS_UP_TO_DATE);
-
- return false;
+ return make_pair(GetLock(id), false);
}
- return RegisterImpl(fileName, rect, version);
+ return RegisterImpl(fileName);
}
-bool MwmSet::RegisterImpl(string const & fileName, m2::RectD & rect,
- feature::DataHeader::Version & version)
+pair<MwmSet::MwmLock, bool> MwmSet::RegisterImpl(string const & fileName)
{
// this function can throw an exception for bad mwm file
MwmInfo info;
- if (!GetVersion(fileName, info, version))
- return false;
+ if (!GetVersion(fileName, info))
+ return make_pair(MwmLock(), false);
info.SetStatus(MwmInfo::STATUS_UP_TO_DATE);
@@ -135,9 +172,7 @@ bool MwmSet::RegisterImpl(string const & fileName, m2::RectD & rect,
m_name[id] = fileName;
m_info[id] = info;
- rect = info.m_limitRect;
- ASSERT(rect.IsValid(), ());
- return true;
+ return make_pair(GetLock(id), true);
}
bool MwmSet::DeregisterImpl(MwmId id)
@@ -207,10 +242,21 @@ void MwmSet::GetMwmInfo(vector<MwmInfo> & info) const
info = m_info;
}
+MwmInfo const & MwmSet::GetMwmInfo(MwmId id) const
+{
+ MwmSet * p = const_cast<MwmSet *>(this);
+ lock_guard<mutex> lock(p->m_lock);
+ return m_info[id];
+}
+
MwmSet::MwmValueBase * MwmSet::LockValue(MwmId id)
{
lock_guard<mutex> lock(m_lock);
+ return LockValueImpl(id);
+}
+MwmSet::MwmValueBase * MwmSet::LockValueImpl(MwmId id)
+{
ASSERT_LESS(id, m_info.size(), ());
if (id >= m_info.size())
return NULL;
@@ -237,7 +283,11 @@ MwmSet::MwmValueBase * MwmSet::LockValue(MwmId id)
void MwmSet::UnlockValue(MwmId id, MwmValueBase * p)
{
lock_guard<mutex> lock(m_lock);
+ UnlockValueImpl(id, p);
+}
+void MwmSet::UnlockValueImpl(MwmId id, MwmValueBase * p)
+{
ASSERT(p, (id));
ASSERT_LESS(id, m_info.size(), ());
if (id >= m_info.size() || p == 0)