[Tizen] (Vector) Add Finalize method 16/218516/1
authorHeeyong Song <heeyong.song@samsung.com>
Mon, 25 Nov 2019 04:44:44 +0000 (13:44 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Mon, 25 Nov 2019 04:51:28 +0000 (13:51 +0900)
- Ensure some member variables are deleted in the main thread

Change-Id: I6211a69829198c3e77155352fa149da391205593

dali-extension/vector-animation-renderer/tizen-vector-animation-manager.cpp
dali-extension/vector-animation-renderer/tizen-vector-animation-renderer.cpp
dali-extension/vector-animation-renderer/tizen-vector-animation-renderer.h

index c9e163c..557bdfd 100755 (executable)
@@ -74,6 +74,16 @@ void TizenVectorAnimationManager::RemoveEventHandler( TizenVectorAnimationEventH
       }
     }
   }
+
+  {
+    Dali::Mutex::ScopedLock lock( mMutex );
+
+    auto triggeredHandler = std::find( mTriggeredHandlers.begin(), mTriggeredHandlers.end(), &handler );
+    if( triggeredHandler != mTriggeredHandlers.end() )
+    {
+      mTriggeredHandlers.erase( triggeredHandler );
+    }
+  }
 }
 
 void TizenVectorAnimationManager::TriggerEvent( TizenVectorAnimationEventHandler& handler )
@@ -93,16 +103,23 @@ void TizenVectorAnimationManager::Process()
   OnEventTriggered();
 }
 
+// This function is called in the main thread.
 void TizenVectorAnimationManager::OnEventTriggered()
 {
-  Dali::Mutex::ScopedLock lock( mMutex );
+  std::vector< TizenVectorAnimationEventHandler* > handlers;
 
-  for( auto&& iter : mTriggeredHandlers )
   {
-    iter->NotifyEvent();
+    Dali::Mutex::ScopedLock lock( mMutex );
+
+    // Copy the list to the local variable and clear
+    handlers = mTriggeredHandlers;
+    mTriggeredHandlers.clear();
   }
 
-  mTriggeredHandlers.clear();
+  for( auto&& iter : handlers )
+  {
+    iter->NotifyEvent();
+  }
 }
 
 } // namespace Plugin
index 70719c0..3a35c64 100755 (executable)
@@ -79,8 +79,6 @@ TizenVectorAnimationRenderer::~TizenVectorAnimationRenderer()
   Dali::Mutex::ScopedLock lock( mMutex );
 
   ResetBuffers();
-
-  TizenVectorAnimationManager::Get().RemoveEventHandler( *this );
 }
 
 bool TizenVectorAnimationRenderer::Initialize( const std::string& url )
@@ -109,6 +107,21 @@ bool TizenVectorAnimationRenderer::Initialize( const std::string& url )
   return true;
 }
 
+void TizenVectorAnimationRenderer::Finalize()
+{
+  Dali::Mutex::ScopedLock lock( mMutex );
+
+  TizenVectorAnimationManager::Get().RemoveEventHandler( *this );
+
+  mRenderer.Reset();
+  mTexture.Reset();
+  mRenderedTexture.Reset();
+  mVectorRenderer.reset();
+
+  mTargetSurface = nullptr;
+  mTbmQueue = NULL;
+}
+
 void TizenVectorAnimationRenderer::SetRenderer( Renderer renderer )
 {
   mRenderer = renderer;
@@ -166,6 +179,11 @@ bool TizenVectorAnimationRenderer::Render( uint32_t frameNumber )
 {
   Dali::Mutex::ScopedLock lock( mMutex );
 
+  if( !mTbmQueue || !mVectorRenderer )
+  {
+    return false;
+  }
+
   if( tbm_surface_queue_can_dequeue( mTbmQueue, 0 ) )
   {
     tbm_surface_h tbmSurface;
@@ -260,14 +278,17 @@ void TizenVectorAnimationRenderer::GetLayerInfo( Property::Map& map ) const
 {
   Dali::Mutex::ScopedLock lock( mMutex );
 
-  auto layerInfo = mVectorRenderer->layers();
-
-  for( auto&& iter : layerInfo )
+  if( mVectorRenderer )
   {
-    Property::Array frames;
-    frames.PushBack( std::get< 1 >( iter ) );
-    frames.PushBack( std::get< 2 >( iter ) );
-    map.Add( std::get< 0 >( iter ), frames );
+    auto layerInfo = mVectorRenderer->layers();
+
+    for( auto&& iter : layerInfo )
+    {
+      Property::Array frames;
+      frames.PushBack( std::get< 1 >( iter ) );
+      frames.PushBack( std::get< 2 >( iter ) );
+      map.Add( std::get< 0 >( iter ), frames );
+    }
   }
 }
 
@@ -285,7 +306,7 @@ void TizenVectorAnimationRenderer::NotifyEvent()
     DALI_LOG_RELEASE_INFO( "TizenVectorAnimationRenderer::NotifyEvent: Set Texture [%p]\n", this );
 
     // Set texture
-    if( mRenderer )
+    if( mRenderer && mRenderedTexture )
     {
       TextureSet textureSet = mRenderer.GetTextures();
       textureSet.SetTexture( 0, mRenderedTexture );
index dbb3765..e8e14ec 100755 (executable)
@@ -60,6 +60,11 @@ public:
   bool Initialize( const std::string& url ) override;
 
   /**
+   * @copydoc Dali::VectorAnimationRendererPlugin::Finalize()
+   */
+  void Finalize() override;
+
+  /**
    * @copydoc Dali::VectorAnimationRendererPlugin::SetRenderer()
    */
   void SetRenderer( Renderer renderer ) override;