IMPL_LINK_NOARG(MemoryManager, ReduceMemoryTimerHandler, Timer*, void)
{
std::unique_lock aGuard(maMutex);
maSwapOutTimer.Stop();
reduceMemory(aGuard); // will be started again on size change
}
// Insert and update the used size (bytes)
assert(aGuard.owns_lock() && aGuard.mutex() == &maMutex); // coverity[missing_lock: FALSE] - as above assert // Related: tdf#167007 Only add object bytes if the object is // actually inserted into the cache if (maObjectList.insert(pMemoryManaged).second)
mnTotalSize += pMemoryManaged->getCurrentSizeInBytes();
checkStartReduceTimer();
}
void MemoryManager::unregisterObject(MemoryManaged* pMemoryManaged)
{
std::unique_lock aGuard(maMutex); // Related: tdf#167007 Only remove object size if the object is // actually removed from the cache if (maObjectList.erase(pMemoryManaged))
mnTotalSize -= pMemoryManaged->getCurrentSizeInBytes();
checkStartReduceTimer();
}
void MemoryManager::changeExisting(MemoryManaged* pMemoryManaged, sal_Int64 nNewSize)
{
std::scoped_lock aGuard(maMutex); // Related: tdf#167007 Only change total cache bytes if the object // actually exists in the cache if (maObjectList.find(pMemoryManaged) != maObjectList.end())
{
sal_Int64 nOldSize = pMemoryManaged->getCurrentSizeInBytes();
mnTotalSize -= nOldSize;
mnTotalSize += nNewSize;
}
pMemoryManaged->setCurrentSizeInBytes(nNewSize);
checkStartReduceTimer();
}
for (MemoryManaged* pMemoryManaged : maObjectList)
{
pMemoryManaged->dumpState(rState);
}
}
void MemoryManager::checkStartReduceTimer()
{ // maMutex is locked in callers
if (!mbSwapEnabled || mnTotalSize < mnMemoryLimit) return;
// start the timer if (!maSwapOutTimer.IsActive())
maSwapOutTimer.Start();
}
void MemoryManager::reduceMemory(std::unique_lock<std::mutex>& rGuard, bool bDropAll)
{ // maMutex is locked in callers
if (!mbSwapEnabled) return;
if (mnTotalSize < mnMemoryLimit && !bDropAll) return;
// avoid recursive reduceGraphicMemory on reexport of tdf118346-1.odg to odg if (mbReducingGraphicMemory) return;
mbReducingGraphicMemory = true;
loopAndReduceMemory(rGuard, bDropAll);
mbReducingGraphicMemory = false;
}
void MemoryManager::loopAndReduceMemory(std::unique_lock<std::mutex>& rGuard, bool bDropAll)
{ // make a copy of m_pImpGraphicList because if we swap out a svg, the svg // filter may create more temp Graphics which are auto-added to // m_pImpGraphicList invalidating a loop over m_pImpGraphicList, e.g. // reexport of tdf118346-1.odg
for (MemoryManaged* pMemoryManaged : aObjectListCopy)
{ if (!pMemoryManaged->canReduceMemory()) continue;
sal_Int64 nCurrentSizeInBytes = pMemoryManaged->getCurrentSizeInBytes(); if (nCurrentSizeInBytes > mnSmallFrySize || bDropAll) // ignore small-fry
{ auto aCurrent = std::chrono::high_resolution_clock::now(); auto aDeltaTime = aCurrent - pMemoryManaged->getLastUsed(); auto aSeconds = std::chrono::duration_cast<std::chrono::seconds>(aDeltaTime);
if (aSeconds > mnAllowedIdleTime)
{ // unlock because svgio can call back into us
rGuard.unlock();
pMemoryManaged->reduceMemory();
rGuard.lock();
}
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.