(Vector) Make we always trigger EventThreadCallback always 84/316284/4
authorEunki, Hong <eunkiki.hong@samsung.com>
Thu, 12 Dec 2024 08:40:10 +0000 (17:40 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 17 Dec 2024 04:31:33 +0000 (13:31 +0900)
Since their was some issue looks like eventfd didn't send callback
even if we trigger callback before.

Until we found good solution to resolve this issue, let we make trigger
the event callback always.

Change-Id: I8f9218a0492fe67aeb9efd9f2ddfc75bddb2c529
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp
dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.cpp
dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.h

index f6cfe5161e5eab33b89a699ae010046bd1946b06..a391ccbdb8c693821ad506b684f21a95f713da63 100644 (file)
@@ -1759,6 +1759,7 @@ int UtcDaliAnimatedVectorImageVisualStopBehavior(void)
   application.Render();
 
   // Trigger count is 2 - load & render a frame
+  tet_printf("First upload. Check load + render\n");
   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
 
   propertyMap.Clear();
@@ -1772,8 +1773,9 @@ int UtcDaliAnimatedVectorImageVisualStopBehavior(void)
   application.SendNotification();
   application.Render();
 
-  // Trigger count is 1 - animation finished
-  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+  // Trigger count is 2 - animation finished + force render request
+  tet_printf("Wait until animation finished. Check render finished + force render trigger\n");
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
 
   Property::Map    map   = actor.GetProperty<Property::Map>(DummyControl::Property::TEST_VISUAL);
   Property::Value* value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER);
@@ -1792,8 +1794,9 @@ int UtcDaliAnimatedVectorImageVisualStopBehavior(void)
   application.SendNotification();
   application.Render();
 
-  // Trigger count is 1 - animation finished
-  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+  // Trigger count is 2 - animation finished + force render request
+  tet_printf("Wait until animation finished again. Check render finished + force render trigger\n");
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
 
   map = actor.GetProperty<Property::Map>(DummyControl::Property::TEST_VISUAL);
 
@@ -1826,6 +1829,8 @@ int UtcDaliAnimatedVectorImageVisualStopBehavior(void)
   application.SendNotification();
   application.Render();
 
+  // Trigger count is 1 - force render request due to pause
+  tet_printf("Check force render trigger due to pause action\n");
   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
 
   map                    = actor.GetProperty<Property::Map>(DummyControl::Property::TEST_VISUAL);
@@ -1841,7 +1846,9 @@ int UtcDaliAnimatedVectorImageVisualStopBehavior(void)
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+  // Trigger count is 2 - animation finished + force render request
+  tet_printf("Check animation stop + force render trigger\n");
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
 
   map   = actor.GetProperty<Property::Map>(DummyControl::Property::TEST_VISUAL);
   value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER);
index 7fb77e617892d77365ab23d3855692814fffe933..640d6e1c6ea958174fb834a9aaeed841d4e0801a 100644 (file)
@@ -55,7 +55,6 @@ VectorAnimationThread::VectorAnimationThread()
   mTraceFactory(Dali::Adaptor::Get().GetTraceFactory()),
   mNeedToSleep(false),
   mDestroyThread(false),
-  mEventTriggered(false),
   mForceRenderOnce(false)
 {
   mAsyncTaskManager = Dali::AsyncTaskManager::Get();
@@ -169,13 +168,17 @@ void VectorAnimationThread::AddEventTriggerCallback(CallbackBase* callback, uint
   Mutex::ScopedLock lock(mEventTriggerMutex);
   if(DALI_LIKELY(!mDestroyThread))
   {
+    DALI_LOG_DEBUG_INFO("VectorAnimationThread::AddEventTriggerCallback [%p, %u]\n", callback, argument);
+
+    DALI_ASSERT_ALWAYS(callback && "Someone register null callback! Please check the callstack\n");
+
     mTriggerEventCallbacks.emplace_back(callback, argument);
 
-    if(!mEventTriggered)
+    // Note : Always trigger event since eventfd might not emit triggered callback sometimes.
+    // Let we keep this logic until fd relative bug fixed. 2024-12-16 eunkiki.hong
+    if(DALI_LIKELY(mEventTrigger))
     {
-      DALI_LOG_DEBUG_INFO("VectorAnimationThread::mEventTrigger Triggered!\n");
       mEventTrigger->Trigger();
-      mEventTriggered = true;
     }
   }
 }
@@ -199,11 +202,12 @@ void VectorAnimationThread::RequestForceRenderOnce()
   {
     mForceRenderOnce = true;
 
-    if(!mEventTriggered)
+    DALI_LOG_DEBUG_INFO("VectorAnimationThread::mEventTrigger Triggered!\n");
+    // Note : Always trigger event since eventfd might not emit triggered callback sometimes.
+    // Let we keep this logic until fd relative bug fixed. 2024-12-16 eunkiki.hong
+    if(DALI_LIKELY(mEventTrigger))
     {
-      DALI_LOG_DEBUG_INFO("VectorAnimationThread::mEventTrigger Triggered!\n");
       mEventTrigger->Trigger();
-      mEventTriggered = true;
     }
   }
 }
@@ -471,7 +475,6 @@ std::pair<CallbackBase*, uint32_t> VectorAnimationThread::GetNextEventCallback()
       mTriggerEventCallbacks.erase(iter);
       return callbackIdPair;
     }
-    mEventTriggered = false;
   }
   return std::make_pair(nullptr, 0u);
 }
index 61ff71b06882d55a80d6538be98532216ab2cbe0..ff08c6dd17224bf668d48bcd87c1831d07e9e57b 100644 (file)
@@ -217,7 +217,6 @@ private:
 
   bool mNeedToSleep : 1;
   bool mDestroyThread : 1;
-  bool mEventTriggered : 1;
   bool mForceRenderOnce : 1;
 };