diff --git a/src/lib/utility/interprocess/SharedMemory.cpp b/src/lib/utility/interprocess/SharedMemory.cpp index 699d2954..bed67f3b 100644 --- a/src/lib/utility/interprocess/SharedMemory.cpp +++ b/src/lib/utility/interprocess/SharedMemory.cpp @@ -10,6 +10,7 @@ SharedMemory::ScopedAccess::ScopedAccess(SharedMemory* memory) : boost::interprocess::scoped_lock(memory->getMutex()) , m_memory(boost::interprocess::open_only, memory->getMemoryName().c_str()) , m_memoryName(memory->getMemoryName()) + , m_minimumMemorySize(memory->getInitialMemorySize()) { } @@ -48,6 +49,11 @@ void SharedMemory::ScopedAccess::growMemory(size_t size) void SharedMemory::ScopedAccess::shrinkToFitMemory() { + if (getUsedMemorySize() < m_minimumMemorySize) + { + return; + } + m_memory = boost::interprocess::managed_shared_memory(); boost::interprocess::managed_shared_memory::shrink_to_fit(m_memoryName.c_str()); @@ -97,6 +103,7 @@ void SharedMemory::deleteSharedMemory(const std::string& name) SharedMemory::SharedMemory(const std::string& name, size_t initialMemorySize, AccessMode mode) : m_name(checkName(name)) , m_mode(mode) + , m_initialMemorySize(initialMemorySize) { try { @@ -229,3 +236,8 @@ boost::interprocess::named_mutex& SharedMemory::getMutex() return *m_mutex.get(); } + +size_t SharedMemory::getInitialMemorySize() const +{ + return m_initialMemorySize; +} diff --git a/src/lib/utility/interprocess/SharedMemory.h b/src/lib/utility/interprocess/SharedMemory.h index 89e7b240..f6bffb99 100644 --- a/src/lib/utility/interprocess/SharedMemory.h +++ b/src/lib/utility/interprocess/SharedMemory.h @@ -99,6 +99,7 @@ public: private: boost::interprocess::managed_shared_memory m_memory; std::string m_memoryName; + size_t m_minimumMemorySize; }; bool checkSharedMutex(); @@ -112,9 +113,13 @@ private: boost::interprocess::named_mutex& getMutex(); + size_t getInitialMemorySize() const; + std::shared_ptr m_mutex; std::string m_name; AccessMode m_mode; + + size_t m_initialMemorySize; }; #endif // SHARED_MEMORY_H