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:
Michael Meeks
2025-04-22 02:55:23 +02:00
committed by Tomaž Vajngerl
parent 3a729a2b97
commit 131985e8d6
2 changed files with 20 additions and 4 deletions
+1
View File
@@ -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();
+19 -4
View File
@@ -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