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:
authorDenis Koronchik <denis@mapswithme.com>2014-09-19 13:54:38 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 02:28:26 +0300
commit8150a4c98d9e54589df6c4b2ba46e26c22b6f487 (patch)
tree7c95aeb7a10a5316cdb24cc50e59e75281a1ba56 /coding/file_container.cpp
parent4cc394fb712d59558d1634175dd27a91a9206c86 (diff)
[core] Refactoring of FilesMappingContainer Handle: using move semantics to control ownership.
Diffstat (limited to 'coding/file_container.cpp')
-rw-r--r--coding/file_container.cpp38
1 files changed, 30 insertions, 8 deletions
diff --git a/coding/file_container.cpp b/coding/file_container.cpp
index 40c64f7e64..39a9af5583 100644
--- a/coding/file_container.cpp
+++ b/coding/file_container.cpp
@@ -126,11 +126,11 @@ FilesMappingContainer::Handle FilesMappingContainer::Map(Tag const & tag) const
uint64_t const length = p->m_size + (p->m_offset - offset);
ASSERT_GREATER_OR_EQUAL(length, p->m_size, ());
- char const * data = reinterpret_cast<char const *>(mmap(0, length, PROT_READ, MAP_SHARED, m_fd, offset));
-
- if (data == reinterpret_cast<char const *>(-1))
+ void * pMap = mmap(0, length, PROT_READ, MAP_SHARED, m_fd, offset);
+ if (pMap == MAP_FAILED)
MYTHROW(Reader::OpenException, ("Can't map section:", tag, "with [offset, size]:", *p));
+ char const * data = reinterpret_cast<char const *>(pMap);
char const * d = data + (p->m_offset - offset);
return Handle(d, data, p->m_size, length);
}
@@ -140,18 +140,40 @@ FilesMappingContainer::Handle FilesMappingContainer::Map(Tag const & tag) const
return Handle();
}
+/////////////////////////////////////////////////////////////////////////////
+// FilesMappingContainer::Handle
+/////////////////////////////////////////////////////////////////////////////
+
FilesMappingContainer::Handle::~Handle()
{
-// CHECK(!IsValid(), ());
+ Unmap();
+}
+
+void FilesMappingContainer::Handle::Assign(Handle && h)
+{
+ Unmap();
+
+ m_base = h.m_base;
+ m_origBase = h.m_origBase;
+ m_size = h.m_size;
+ m_origSize = h.m_origSize;
+
+ h.Reset();
}
void FilesMappingContainer::Handle::Unmap()
{
- ASSERT(IsValid(), ());
- VERIFY(0 == munmap((void*)m_origBase, m_origSize), ());
+ if (IsValid())
+ {
+ VERIFY(0 == munmap((void*)m_origBase, m_origSize), ());
+ Reset();
+ }
+}
- m_origBase = m_base = 0;
- m_origSize = m_size = 0;
+void FilesMappingContainer::Handle::Reset()
+{
+ m_base = m_origBase = 0;
+ m_size = m_origSize = 0;
}
/////////////////////////////////////////////////////////////////////////////