From 7bf6f9769182a55924cb81647d1474eabf95960b Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 8 Jul 2021 20:20:49 +0900 Subject: [PATCH] sw_engine renderer: fix memory leak. prepared compositors can be dangled if the rendering is not occured. free them by doubl-checking in the destructor. @Issue: https://github.com/Samsung/thorvg/issues/547 --- src/lib/sw_engine/tvgSwRenderer.cpp | 12 ++++++++---- src/lib/sw_engine/tvgSwRenderer.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lib/sw_engine/tvgSwRenderer.cpp b/src/lib/sw_engine/tvgSwRenderer.cpp index 24800f2d..4fa1ecec 100644 --- a/src/lib/sw_engine/tvgSwRenderer.cpp +++ b/src/lib/sw_engine/tvgSwRenderer.cpp @@ -230,6 +230,7 @@ static void _termEngine() SwRenderer::~SwRenderer() { clear(); + clearCompositors(); if (surface) delete(surface); @@ -304,11 +305,8 @@ bool SwRenderer::preRender() return rasterClear(surface); } - -bool SwRenderer::postRender() +void SwRenderer::clearCompositors() { - tasks.clear(); - //Free Composite Caches for (auto comp = compositors.data; comp < (compositors.data + compositors.count); ++comp) { free((*comp)->compositor->image.data); @@ -316,7 +314,13 @@ bool SwRenderer::postRender() delete(*comp); } compositors.reset(); +} + +bool SwRenderer::postRender() +{ + tasks.clear(); + clearCompositors(); return true; } diff --git a/src/lib/sw_engine/tvgSwRenderer.h b/src/lib/sw_engine/tvgSwRenderer.h index 9198253e..51eed5db 100644 --- a/src/lib/sw_engine/tvgSwRenderer.h +++ b/src/lib/sw_engine/tvgSwRenderer.h @@ -54,6 +54,7 @@ public: Compositor* target(const RenderRegion& region) override; bool beginComposite(Compositor* cmp, CompositeMethod method, uint32_t opacity) override; bool endComposite(Compositor* cmp) override; + void clearCompositors(); static SwRenderer* gen(); static bool init(uint32_t threads);