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 }; };
