From 56dc1267ed96383c30dfc0623b3536d37e616ada Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Mon, 13 Jan 2020 14:05:50 +0900 Subject: [PATCH] [Tizen](Vector) Fix memory leak Sometimes the VectorAnimationTask was not destructed because it tried to rasterize repeatedly. Change-Id: I308cba1d2affb6378a5419721ab225de3c312677 --- .../animated-vector-image/animated-vector-image-visual.cpp | 2 ++ .../visuals/animated-vector-image/vector-animation-task.cpp | 11 ++++++++++- .../visuals/animated-vector-image/vector-animation-task.h | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp index 7487d6d..9bbf7e0 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp @@ -105,6 +105,8 @@ AnimatedVectorImageVisual::AnimatedVectorImageVisual( VisualFactoryCache& factor AnimatedVectorImageVisual::~AnimatedVectorImageVisual() { + SendAnimationData(); + if( mRasterizationTriggered && Adaptor::IsAvailable() ) { Adaptor::Get().UnregisterProcessor( *this ); diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp index 0455db3..871683f 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp @@ -85,7 +85,8 @@ VectorAnimationTask::VectorAnimationTask( VisualFactoryCache& factoryCache, cons mForward( true ), mUpdateFrameNumber( false ), mNeedAnimationFinishedTrigger( true ), - mForceRender( false ) + mForceRender( false ), + mDestroyTask( false ) { Initialize(); } @@ -106,6 +107,8 @@ void VectorAnimationTask::Finalize() } mVectorRenderer.Finalize(); + + mDestroyTask = true; } void VectorAnimationTask::SetRenderer( Renderer renderer ) @@ -477,6 +480,12 @@ bool VectorAnimationTask::Rasterize() { ConditionalWait::ScopedLock lock( mConditionalWait ); + if( mDestroyTask ) + { + // The task will be destroyed. We don't need rasterization. + return false; + } + if( mPlayState == PlayState::PLAYING && mUpdateFrameNumber ) { mCurrentFrame = mForward ? mCurrentFrame + 1 : mCurrentFrame - 1; diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h index 6d24518..4cd2f18 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h @@ -306,6 +306,7 @@ private: bool mUpdateFrameNumber; bool mNeedAnimationFinishedTrigger; bool mForceRender; + bool mDestroyTask; }; -- 2.7.4