drawinglayer/source/primitive2d/BufferedDecompositionFlusher.cxx          |   
39 +++++++---
 drawinglayer/source/primitive2d/BufferedDecompositionGroupPrimitive2D.cxx |    
6 +
 drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx      |    
6 +
 include/drawinglayer/primitive2d/BufferedDecompositionFlusher.hxx         |    
9 +-
 4 files changed, 47 insertions(+), 13 deletions(-)

New commits:
commit b17e0bb5cab4484905dc72172735725bf4460e8e
Author:     Noel Grandin <[email protected]>
AuthorDate: Wed Jun 11 21:56:17 2025 +0200
Commit:     Noel Grandin <[email protected]>
CommitDate: Thu Jun 12 10:22:45 2025 +0200

    tdf#166922 reduce memory usage in BufferedDecompositionFlusher
    
    which was keeping stuff alive for too long.
    
    regression from
        commit 8a17b7f0a679ebf21bcfb425186b205d996d129b
        Author: Noel Grandin <[email protected]>
        Date:   Thu Mar 13 18:37:54 2025 +0200
        tdf#131595 Improve drawinglayer flushing mechanism.
    
    Change-Id: I82c3e11d027b22a969d2ce786a0945fea2deb6b9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186389
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>

diff --git a/drawinglayer/source/primitive2d/BufferedDecompositionFlusher.cxx 
b/drawinglayer/source/primitive2d/BufferedDecompositionFlusher.cxx
index 902183b907d1..40bb4e9c2bac 100644
--- a/drawinglayer/source/primitive2d/BufferedDecompositionFlusher.cxx
+++ b/drawinglayer/source/primitive2d/BufferedDecompositionFlusher.cxx
@@ -73,6 +73,18 @@ void BufferedDecompositionFlusher::update(const 
BufferedDecompositionGroupPrimit
     getInstance()->updateImpl(p);
 }
 
+// static
+void BufferedDecompositionFlusher::remove(const 
BufferedDecompositionPrimitive2D* p)
+{
+    getInstance()->removeImpl(p);
+}
+
+// static
+void BufferedDecompositionFlusher::remove(const 
BufferedDecompositionGroupPrimitive2D* p)
+{
+    getInstance()->removeImpl(p);
+}
+
 BufferedDecompositionFlusher::BufferedDecompositionFlusher() { create(); }
 
 void BufferedDecompositionFlusher::updateImpl(const 
BufferedDecompositionPrimitive2D* p)
@@ -89,6 +101,20 @@ void BufferedDecompositionFlusher::updateImpl(const 
BufferedDecompositionGroupPr
         
maRegistered2.insert(const_cast<BufferedDecompositionGroupPrimitive2D*>(p));
 }
 
+void BufferedDecompositionFlusher::removeImpl(const 
BufferedDecompositionPrimitive2D* p)
+{
+    std::unique_lock l(maMutex);
+    if (!mbShutdown)
+        maRegistered1.erase(const_cast<BufferedDecompositionPrimitive2D*>(p));
+}
+
+void BufferedDecompositionFlusher::removeImpl(const 
BufferedDecompositionGroupPrimitive2D* p)
+{
+    std::unique_lock l(maMutex);
+    if (!mbShutdown)
+        
maRegistered2.erase(const_cast<BufferedDecompositionGroupPrimitive2D*>(p));
+}
+
 void SAL_CALL BufferedDecompositionFlusher::run()
 {
     setName("BufferedDecompositionFlusher");
@@ -141,15 +167,10 @@ void SAL_CALL BufferedDecompositionFlusher::run()
 /// Only called by FlusherDeinit
 void BufferedDecompositionFlusher::onTeardown()
 {
-    std::unordered_set<rtl::Reference<BufferedDecompositionPrimitive2D>> 
aRemoved1;
-    std::unordered_set<rtl::Reference<BufferedDecompositionGroupPrimitive2D>> 
aRemoved2;
-    {
-        std::unique_lock l2(maMutex);
-        mbShutdown = true;
-        aRemoved1 = std::move(maRegistered1);
-        aRemoved2 = std::move(maRegistered2);
-    }
-    // let the destruction happen outside the lock
+    std::unique_lock l2(maMutex);
+    mbShutdown = true;
+    maRegistered1.clear();
+    maRegistered2.clear();
 }
 
 } // end of namespace drawinglayer::primitive2d
diff --git 
a/drawinglayer/source/primitive2d/BufferedDecompositionGroupPrimitive2D.cxx 
b/drawinglayer/source/primitive2d/BufferedDecompositionGroupPrimitive2D.cxx
index ae83c158f2ba..61891a333b4b 100644
--- a/drawinglayer/source/primitive2d/BufferedDecompositionGroupPrimitive2D.cxx
+++ b/drawinglayer/source/primitive2d/BufferedDecompositionGroupPrimitive2D.cxx
@@ -64,7 +64,11 @@ 
BufferedDecompositionGroupPrimitive2D::BufferedDecompositionGroupPrimitive2D(
 {
 }
 
-BufferedDecompositionGroupPrimitive2D::~BufferedDecompositionGroupPrimitive2D()
 {}
+BufferedDecompositionGroupPrimitive2D::~BufferedDecompositionGroupPrimitive2D()
+{
+    if (mbFlushOnTimer)
+        BufferedDecompositionFlusher::remove(this);
+}
 
 void BufferedDecompositionGroupPrimitive2D::get2DDecomposition(
     Primitive2DDecompositionVisitor& rVisitor,
diff --git 
a/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx 
b/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx
index 491c1fe07665..293edc32a7a6 100644
--- a/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx
+++ b/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx
@@ -63,7 +63,11 @@ 
BufferedDecompositionPrimitive2D::BufferedDecompositionPrimitive2D()
 {
 }
 
-BufferedDecompositionPrimitive2D::~BufferedDecompositionPrimitive2D() {}
+BufferedDecompositionPrimitive2D::~BufferedDecompositionPrimitive2D()
+{
+    if (mbFlushOnTimer)
+        BufferedDecompositionFlusher::remove(this);
+}
 
 void BufferedDecompositionPrimitive2D::get2DDecomposition(
     Primitive2DDecompositionVisitor& rVisitor,
diff --git a/include/drawinglayer/primitive2d/BufferedDecompositionFlusher.hxx 
b/include/drawinglayer/primitive2d/BufferedDecompositionFlusher.hxx
index 074ad3c9dcc3..2206cc600dc0 100644
--- a/include/drawinglayer/primitive2d/BufferedDecompositionFlusher.hxx
+++ b/include/drawinglayer/primitive2d/BufferedDecompositionFlusher.hxx
@@ -31,6 +31,8 @@ class BufferedDecompositionFlusher final : public osl::Thread
 public:
     static void update(const BufferedDecompositionPrimitive2D*);
     static void update(const BufferedDecompositionGroupPrimitive2D*);
+    static void remove(const BufferedDecompositionPrimitive2D*);
+    static void remove(const BufferedDecompositionGroupPrimitive2D*);
 
     BufferedDecompositionFlusher();
 
@@ -43,9 +45,12 @@ private:
     virtual void SAL_CALL run() override;
     void updateImpl(const BufferedDecompositionPrimitive2D*);
     void updateImpl(const BufferedDecompositionGroupPrimitive2D*);
+    void removeImpl(const BufferedDecompositionPrimitive2D*);
+    void removeImpl(const BufferedDecompositionGroupPrimitive2D*);
 
-    std::unordered_set<rtl::Reference<BufferedDecompositionPrimitive2D>> 
maRegistered1;
-    std::unordered_set<rtl::Reference<BufferedDecompositionGroupPrimitive2D>> 
maRegistered2;
+    // Explicitly not using rtl::Reference because they are removed from here 
when they destruct.
+    std::unordered_set<BufferedDecompositionPrimitive2D*> maRegistered1;
+    std::unordered_set<BufferedDecompositionGroupPrimitive2D*> maRegistered2;
     std::mutex maMutex;
     bool mbShutdown{ false };
 };

Reply via email to