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:
authorMaksim Andrianov <maksimandrianov1@gmail.com>2021-02-26 05:46:16 +0300
committermpimenov <mpimenov@users.noreply.github.com>2021-03-01 11:01:13 +0300
commit437f4c75d413049165a6e627f2a0cefb85ec0afb (patch)
tree906ef14de742670d3f3be8088e91f41982735aaf
parent09e604b39eb47cd1d86b2c86df367d5423a09756 (diff)
[coding] Added madvise for MmapReader.
-rw-r--r--coding/mmap_reader.cpp35
-rw-r--r--coding/mmap_reader.hpp9
-rw-r--r--generator/intermediate_data.cpp4
3 files changed, 34 insertions, 14 deletions
diff --git a/coding/mmap_reader.cpp b/coding/mmap_reader.cpp
index f5c3b23201..84c86aaf42 100644
--- a/coding/mmap_reader.cpp
+++ b/coding/mmap_reader.cpp
@@ -20,13 +20,8 @@ using namespace std;
class MmapReader::MmapData
{
- int m_fd;
-
public:
- uint8_t * m_memory;
- uint64_t m_size;
-
- explicit MmapData(string const & fileName)
+ explicit MmapData(string const & fileName, Advise advise)
{
// @TODO add windows support
#ifndef OMIM_OS_WINDOWS
@@ -40,12 +35,23 @@ public:
m_size = s.st_size;
m_memory = static_cast<uint8_t *>(
- mmap(0, static_cast<size_t>(m_size), PROT_READ, MAP_SHARED, m_fd, 0));
+ mmap(0, static_cast<size_t>(m_size), PROT_READ, MAP_PRIVATE, m_fd, 0));
if (m_memory == MAP_FAILED)
{
close(m_fd);
MYTHROW(OpenException, ("mmap failed for file", fileName));
}
+
+ int adv = MADV_NORMAL;
+ switch (advise)
+ {
+ case Advise::Random: adv = MADV_RANDOM; break;
+ case Advise::Sequential: adv = MADV_SEQUENTIAL; break;
+ case Advise::Normal: adv = MADV_NORMAL; break;
+ }
+
+ if (madvise(m_memory, s.st_size, adv) != 0)
+ LOG(LWARNING, ("madvise error:", strerror(errno)));
#endif
}
@@ -57,13 +63,20 @@ public:
close(m_fd);
#endif
}
+
+ uint8_t * m_memory = nullptr;
+ uint64_t m_size = 0;
+
+private:
+ int m_fd = 0;
};
-MmapReader::MmapReader(string const & fileName)
- : base_type(fileName), m_offset(0)
+MmapReader::MmapReader(string const & fileName, Advise advise)
+ : base_type(fileName)
+ , m_data(std::make_shared<MmapData>(fileName, advise))
+ , m_offset(0)
+ , m_size(m_data->m_size)
{
- m_data = shared_ptr<MmapData>(new MmapData(fileName));
- m_size = m_data->m_size;
}
MmapReader::MmapReader(MmapReader const & reader, uint64_t offset, uint64_t size)
diff --git a/coding/mmap_reader.hpp b/coding/mmap_reader.hpp
index 1203d01b46..5d0d31a65f 100644
--- a/coding/mmap_reader.hpp
+++ b/coding/mmap_reader.hpp
@@ -11,7 +11,14 @@
class MmapReader : public ModelReader
{
public:
- explicit MmapReader(std::string const & fileName);
+ enum class Advise
+ {
+ Normal,
+ Random,
+ Sequential
+ };
+
+ explicit MmapReader(std::string const & fileName, Advise advise = Advise::Normal);
uint64_t Size() const override;
void Read(uint64_t pos, void * p, size_t size) const override;
diff --git a/generator/intermediate_data.cpp b/generator/intermediate_data.cpp
index 9e3717a51c..61252d7ae4 100644
--- a/generator/intermediate_data.cpp
+++ b/generator/intermediate_data.cpp
@@ -75,8 +75,8 @@ private:
class RawFilePointStorageMmapReader : public PointStorageReaderInterface
{
public:
- explicit RawFilePointStorageMmapReader(string const & name) :
- m_mmapReader(name)
+ explicit RawFilePointStorageMmapReader(string const & name)
+ : m_mmapReader(name, MmapReader::Advise::Random)
{}
// PointStorageReaderInterface overrides: