Avoid un-necessary busy timer looking to swap out images.
We can start this when we need to in a thread-safe way, cf. Timer::Start, Task::Start etc. Saves CPU, and better - saves debug churn and SocketPoll wakeups in quiescent COOL instances. Change-Id: Ib0e668702bcdfa9ffb34daf8c2a220af55dcc9d9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184415 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
This commit is contained in:
committed by
Tomaž Vajngerl
parent
3a729a2b97
commit
131985e8d6
@@ -52,6 +52,7 @@ public:
|
||||
o3tl::sorted_vector<MemoryManaged*> const& getManagedObjects() { return maObjectList; }
|
||||
sal_Int64 getTotalSize() { return mnTotalSize; }
|
||||
|
||||
void checkStartReduceTimer();
|
||||
void reduceMemory(std::unique_lock<std::mutex>& rGuard, bool bDropAll = false);
|
||||
void loopAndReduceMemory(std::unique_lock<std::mutex>& rGuard, bool bDropAll = false);
|
||||
void reduceAllAndNow();
|
||||
|
||||
@@ -61,7 +61,7 @@ MemoryManager::MemoryManager()
|
||||
maSwapOutTimer.SetPriority(TaskPriority::DEFAULT_IDLE);
|
||||
maSwapOutTimer.SetInvokeHandler(LINK(this, MemoryManager, ReduceMemoryTimerHandler));
|
||||
maSwapOutTimer.SetTimeout(mnTimeout);
|
||||
maSwapOutTimer.Start();
|
||||
maSwapOutTimer.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,12 +71,12 @@ MemoryManager& MemoryManager::get()
|
||||
return gStaticManager;
|
||||
}
|
||||
|
||||
IMPL_LINK(MemoryManager, ReduceMemoryTimerHandler, Timer*, pTimer, void)
|
||||
IMPL_LINK_NOARG(MemoryManager, ReduceMemoryTimerHandler, Timer*, void)
|
||||
{
|
||||
std::unique_lock aGuard(maMutex);
|
||||
pTimer->Stop();
|
||||
maSwapOutTimer.Stop();
|
||||
reduceMemory(aGuard);
|
||||
pTimer->Start();
|
||||
// will be started again on size change
|
||||
}
|
||||
|
||||
void MemoryManager::registerObject(MemoryManaged* pMemoryManaged)
|
||||
@@ -88,6 +88,7 @@ void MemoryManager::registerObject(MemoryManaged* pMemoryManaged)
|
||||
// coverity[missing_lock: FALSE] - as above assert
|
||||
mnTotalSize += pMemoryManaged->getCurrentSizeInBytes();
|
||||
maObjectList.insert(pMemoryManaged);
|
||||
checkStartReduceTimer();
|
||||
}
|
||||
|
||||
void MemoryManager::unregisterObject(MemoryManaged* pMemoryManaged)
|
||||
@@ -95,6 +96,7 @@ void MemoryManager::unregisterObject(MemoryManaged* pMemoryManaged)
|
||||
std::unique_lock aGuard(maMutex);
|
||||
mnTotalSize -= pMemoryManaged->getCurrentSizeInBytes();
|
||||
maObjectList.erase(pMemoryManaged);
|
||||
checkStartReduceTimer();
|
||||
}
|
||||
|
||||
void MemoryManager::changeExisting(MemoryManaged* pMemoryManaged, sal_Int64 nNewSize)
|
||||
@@ -104,6 +106,7 @@ void MemoryManager::changeExisting(MemoryManaged* pMemoryManaged, sal_Int64 nNew
|
||||
mnTotalSize -= nOldSize;
|
||||
mnTotalSize += nNewSize;
|
||||
pMemoryManaged->setCurrentSizeInBytes(nNewSize);
|
||||
checkStartReduceTimer();
|
||||
}
|
||||
|
||||
void MemoryManager::swappedIn(MemoryManaged* pMemoryManaged, sal_Int64 nNewSize)
|
||||
@@ -138,6 +141,18 @@ void MemoryManager::dumpState(rtl::OStringBuffer& 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
|
||||
|
||||
Reference in New Issue
Block a user