vcl/inc/graphic/Manager.hxx    |    1 +
 vcl/source/graphic/Manager.cxx |   23 +++++++++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

New commits:
commit 131985e8d6d54d1c12aea565afb0c570c57ea380
Author:     Michael Meeks <michael.me...@collabora.com>
AuthorDate: Mon Apr 21 18:03:57 2025 +0100
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Tue Apr 22 02:55:23 2025 +0200

    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 <qui...@gmail.com>

diff --git a/vcl/inc/graphic/Manager.hxx b/vcl/inc/graphic/Manager.hxx
index 0a4ee3fbc84d..cac1a24beecf 100644
--- a/vcl/inc/graphic/Manager.hxx
+++ b/vcl/inc/graphic/Manager.hxx
@@ -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();
diff --git a/vcl/source/graphic/Manager.cxx b/vcl/source/graphic/Manager.cxx
index fc7c39b94f0d..3c765f039584 100644
--- a/vcl/source/graphic/Manager.cxx
+++ b/vcl/source/graphic/Manager.cxx
@@ -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

Reply via email to