(Vector) Erase all EventThreadCallbacks with same pointer 09/302409/2
authorEunki, Hong <eunkiki.hong@samsung.com>
Wed, 6 Dec 2023 08:00:55 +0000 (17:00 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Wed, 6 Dec 2023 08:12:02 +0000 (17:12 +0900)
Due to some logical issue, there might be happend that we apply multiple
EventThread callback into VectorAnimationThread.

And if VectorAnimationTask destructor called, we remove only single callback.

If error case occured, EventThread can execute dead callback.

Change-Id: I9e3895180916a292bbca838997ae3053ee8799b5
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp
dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.cpp
dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.h

index 4bb2471..0c3b3bb 100644 (file)
@@ -118,12 +118,12 @@ void VectorAnimationTask::Finalize()
   // Release some objects in the main thread
   if(mAnimationFinishedCallback)
   {
-    mVectorAnimationThread.RemoveEventTriggerCallback(mAnimationFinishedCallback.get());
+    mVectorAnimationThread.RemoveEventTriggerCallbacks(mAnimationFinishedCallback.get());
     mAnimationFinishedCallback.reset();
   }
   if(mLoadCompletedCallback)
   {
-    mVectorAnimationThread.RemoveEventTriggerCallback(mLoadCompletedCallback.get());
+    mVectorAnimationThread.RemoveEventTriggerCallbacks(mLoadCompletedCallback.get());
     mLoadCompletedCallback.reset();
   }
 
index 66a9f14..8f70ae3 100644 (file)
@@ -163,14 +163,11 @@ void VectorAnimationThread::AddEventTriggerCallback(CallbackBase* callback)
   }
 }
 
-void VectorAnimationThread::RemoveEventTriggerCallback(CallbackBase* callback)
+void VectorAnimationThread::RemoveEventTriggerCallbacks(CallbackBase* callback)
 {
   ConditionalWait::ScopedLock lock(mConditionalWait);
-  auto                        iter = std::find(mTriggerEventCallbacks.begin(), mTriggerEventCallbacks.end(), callback);
-  if(iter != mTriggerEventCallbacks.end())
-  {
-    mTriggerEventCallbacks.erase(iter);
-  }
+  auto                        iter = std::remove(mTriggerEventCallbacks.begin(), mTriggerEventCallbacks.end(), callback);
+  mTriggerEventCallbacks.erase(iter, mTriggerEventCallbacks.end());
 }
 
 void VectorAnimationThread::Run()
index 07537c5..a5108d5 100644 (file)
@@ -82,11 +82,11 @@ public:
   void AddEventTriggerCallback(CallbackBase* callback);
 
   /**
-   * @brief Remove an event trigger callback.
+   * @brief Remove event trigger callbacks what we added before.
    *
    * @param callback The callback to remove
    */
-  void RemoveEventTriggerCallback(CallbackBase* callback);
+  void RemoveEventTriggerCallbacks(CallbackBase* callback);
 
 protected:
   /**