utility: Don't shrink shared memory below initial size (issue #636)
This commit is contained in:
@@ -10,6 +10,7 @@ SharedMemory::ScopedAccess::ScopedAccess(SharedMemory* memory)
|
|||||||
: boost::interprocess::scoped_lock<boost::interprocess::named_mutex>(memory->getMutex())
|
: boost::interprocess::scoped_lock<boost::interprocess::named_mutex>(memory->getMutex())
|
||||||
, m_memory(boost::interprocess::open_only, memory->getMemoryName().c_str())
|
, m_memory(boost::interprocess::open_only, memory->getMemoryName().c_str())
|
||||||
, m_memoryName(memory->getMemoryName())
|
, m_memoryName(memory->getMemoryName())
|
||||||
|
, m_minimumMemorySize(memory->getInitialMemorySize())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,6 +49,11 @@ void SharedMemory::ScopedAccess::growMemory(size_t size)
|
|||||||
|
|
||||||
void SharedMemory::ScopedAccess::shrinkToFitMemory()
|
void SharedMemory::ScopedAccess::shrinkToFitMemory()
|
||||||
{
|
{
|
||||||
|
if (getUsedMemorySize() < m_minimumMemorySize)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_memory = boost::interprocess::managed_shared_memory();
|
m_memory = boost::interprocess::managed_shared_memory();
|
||||||
|
|
||||||
boost::interprocess::managed_shared_memory::shrink_to_fit(m_memoryName.c_str());
|
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)
|
SharedMemory::SharedMemory(const std::string& name, size_t initialMemorySize, AccessMode mode)
|
||||||
: m_name(checkName(name))
|
: m_name(checkName(name))
|
||||||
, m_mode(mode)
|
, m_mode(mode)
|
||||||
|
, m_initialMemorySize(initialMemorySize)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -229,3 +236,8 @@ boost::interprocess::named_mutex& SharedMemory::getMutex()
|
|||||||
|
|
||||||
return *m_mutex.get();
|
return *m_mutex.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t SharedMemory::getInitialMemorySize() const
|
||||||
|
{
|
||||||
|
return m_initialMemorySize;
|
||||||
|
}
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
boost::interprocess::managed_shared_memory m_memory;
|
boost::interprocess::managed_shared_memory m_memory;
|
||||||
std::string m_memoryName;
|
std::string m_memoryName;
|
||||||
|
size_t m_minimumMemorySize;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool checkSharedMutex();
|
bool checkSharedMutex();
|
||||||
@@ -112,9 +113,13 @@ private:
|
|||||||
|
|
||||||
boost::interprocess::named_mutex& getMutex();
|
boost::interprocess::named_mutex& getMutex();
|
||||||
|
|
||||||
|
size_t getInitialMemorySize() const;
|
||||||
|
|
||||||
std::shared_ptr<boost::interprocess::named_mutex> m_mutex;
|
std::shared_ptr<boost::interprocess::named_mutex> m_mutex;
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
AccessMode m_mode;
|
AccessMode m_mode;
|
||||||
|
|
||||||
|
size_t m_initialMemorySize;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SHARED_MEMORY_H
|
#endif // SHARED_MEMORY_H
|
||||||
|
|||||||
Reference in New Issue
Block a user