diff options
author | Denis Koronchik <denis@mapswithme.com> | 2014-09-19 13:54:38 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:28:26 +0300 |
commit | 8150a4c98d9e54589df6c4b2ba46e26c22b6f487 (patch) | |
tree | 7c95aeb7a10a5316cdb24cc50e59e75281a1ba56 /coding/file_container.cpp | |
parent | 4cc394fb712d59558d1634175dd27a91a9206c86 (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.cpp | 38 |
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; } ///////////////////////////////////////////////////////////////////////////// |