[Tizen] (Vector) Erase all EventThreadCallbacks with same pointer 34/302634/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Wed, 6 Dec 2023 08:00:55 +0000 (17:00 +0900)
committerEunki Hong <eunkiki.hong@samsung.com>
Mon, 11 Dec 2023 10:02:59 +0000 (19:02 +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 4bb24713a1bdc0b0ad75c617baa3bd24071f74da..0c3b3bb1cf9250f31a4efbfb6cb29b48fb431d6f 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 66a9f147dbc27e17397eb5120e1b714b76c3c74d..8f70ae36dad71aad470232961c05aa19bdb88db6 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 07537c5deab6158c735480c174a23b77400776d5..a5108d509eb7a61612b663123278109d8dc4b60b 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:
   /**