Do not trace canceled task 25/301625/2
authorEunki, Hong <eunkiki.hong@samsung.com>
Tue, 21 Nov 2023 03:15:36 +0000 (12:15 +0900)
committerEunki Hong <eunkiki.hong@samsung.com>
Thu, 23 Nov 2023 05:54:25 +0000 (05:54 +0000)
If some running tasks are traced, it will not be removed even
after PopNextCompleted event running. So that signal never be emitted.

To avoid this issue,
let we make do not apped trace for 'canceled' tasks and 'skip callback' tasks.

Change-Id: I98afe9d90d2e0b8fb5b979e3d191dcdc2ffbd756
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali/internal/system/common/async-task-manager-impl.cpp

index 74f89be..b23a24f 100644 (file)
@@ -727,8 +727,11 @@ void AsyncTaskManager::RemoveTask(AsyncTaskPtr task)
           DALI_ASSERT_DEBUG((*iterator).first == task);
           // We cannot erase container. Just mark as canceled.
           // Note : mAvaliableLowPriorityTaskCounts will be increased after process finished.
-          (*iterator).second = RunningTaskState::CANCELED;
-          ++removedCount;
+          if((*iterator).second == RunningTaskState::RUNNING)
+          {
+            (*iterator).second = RunningTaskState::CANCELED;
+            ++removedCount;
+          }
         }
       }
 
@@ -747,9 +750,12 @@ void AsyncTaskManager::RemoveTask(AsyncTaskPtr task)
       {
         for(auto& iterator : mapIter->second)
         {
-          DALI_ASSERT_DEBUG(iterator->first == task);
+          DALI_ASSERT_DEBUG((*iterator).first == task);
+          if((*iterator).second == CompletedTaskState::REQUIRE_CALLBACK)
+          {
+            ++removedCount;
+          }
           mCompletedTasks.erase(iterator);
-          ++removedCount;
         }
         CacheImpl::EraseAllTaskCache(mCacheImpl->mCompletedTasksCache, task);
       }
@@ -761,7 +767,7 @@ void AsyncTaskManager::RemoveTask(AsyncTaskPtr task)
     }
 
     // Remove TasksCompleted callback trace
-    if(mTasksCompletedImpl->IsTasksCompletedCallbackExist() && removedCount > 0u)
+    if(removedCount > 0u && mTasksCompletedImpl->IsTasksCompletedCallbackExist())
     {
       mTasksCompletedImpl->RemoveTaskTrace(task, removedCount);
     }
@@ -807,28 +813,40 @@ Dali::AsyncTaskManager::TasksCompletedId AsyncTaskManager::SetCompletedCallback(
         // Collect all tasks from running tasks
         for(auto& taskPair : mRunningTasks)
         {
-          auto& task      = taskPair.first;
-          auto  checkMask = (task->GetCallbackInvocationThread() == Dali::AsyncTask::ThreadType::MAIN_THREAD ? Dali::AsyncTaskManager::CompletedCallbackTraceMask::THREAD_MASK_MAIN : Dali::AsyncTaskManager::CompletedCallbackTraceMask::THREAD_MASK_WORKER) |
-                           (task->GetPriorityType() == Dali::AsyncTask::PriorityType::HIGH ? Dali::AsyncTaskManager::CompletedCallbackTraceMask::PRIORITY_MASK_HIGH : Dali::AsyncTaskManager::CompletedCallbackTraceMask::PRIORITY_MASK_LOW);
-
-          if((checkMask & mask) == checkMask)
+          // Trace only if it is running now.
+          if(taskPair.second == RunningTaskState::RUNNING)
           {
-            taskAdded = true;
-            mTasksCompletedImpl->AppendTaskTrace(tasksCompletedId, task);
+            auto& task      = taskPair.first;
+            auto  checkMask = (task->GetCallbackInvocationThread() == Dali::AsyncTask::ThreadType::MAIN_THREAD ? Dali::AsyncTaskManager::CompletedCallbackTraceMask::THREAD_MASK_MAIN : Dali::AsyncTaskManager::CompletedCallbackTraceMask::THREAD_MASK_WORKER) |
+                             (task->GetPriorityType() == Dali::AsyncTask::PriorityType::HIGH ? Dali::AsyncTaskManager::CompletedCallbackTraceMask::PRIORITY_MASK_HIGH : Dali::AsyncTaskManager::CompletedCallbackTraceMask::PRIORITY_MASK_LOW);
+
+            if((checkMask & mask) == checkMask)
+            {
+              taskAdded = true;
+              mTasksCompletedImpl->AppendTaskTrace(tasksCompletedId, task);
+            }
           }
         }
 
         // Collect all tasks from complete tasks
         for(auto& taskPair : mCompletedTasks)
         {
-          auto& task      = taskPair.first;
-          auto  checkMask = (task->GetCallbackInvocationThread() == Dali::AsyncTask::ThreadType::MAIN_THREAD ? Dali::AsyncTaskManager::CompletedCallbackTraceMask::THREAD_MASK_MAIN : Dali::AsyncTaskManager::CompletedCallbackTraceMask::THREAD_MASK_WORKER) |
-                           (task->GetPriorityType() == Dali::AsyncTask::PriorityType::HIGH ? Dali::AsyncTaskManager::CompletedCallbackTraceMask::PRIORITY_MASK_HIGH : Dali::AsyncTaskManager::CompletedCallbackTraceMask::PRIORITY_MASK_LOW);
-
-          if((checkMask & mask) == checkMask)
+          // Trace only if it is need callback.
+          // Note : There are two CompletedTaskState::SKIP_CALLBACK cases, worker thread invocation and canceled cases.
+          //        If worker thread invocation, than it already remove trace at completed timing.
+          //        If canceled cases, we don't append trace at running tasks already.
+          //        So, we don't need to trace for SKIP_CALLBACK cases.
+          if(taskPair.second == CompletedTaskState::REQUIRE_CALLBACK)
           {
-            taskAdded = true;
-            mTasksCompletedImpl->AppendTaskTrace(tasksCompletedId, task);
+            auto& task      = taskPair.first;
+            auto  checkMask = (task->GetCallbackInvocationThread() == Dali::AsyncTask::ThreadType::MAIN_THREAD ? Dali::AsyncTaskManager::CompletedCallbackTraceMask::THREAD_MASK_MAIN : Dali::AsyncTaskManager::CompletedCallbackTraceMask::THREAD_MASK_WORKER) |
+                             (task->GetPriorityType() == Dali::AsyncTask::PriorityType::HIGH ? Dali::AsyncTaskManager::CompletedCallbackTraceMask::PRIORITY_MASK_HIGH : Dali::AsyncTaskManager::CompletedCallbackTraceMask::PRIORITY_MASK_LOW);
+
+            if((checkMask & mask) == checkMask)
+            {
+              taskAdded = true;
+              mTasksCompletedImpl->AppendTaskTrace(tasksCompletedId, task);
+            }
           }
         }
       }