From: Eunki, Hong Date: Tue, 21 Nov 2023 03:15:36 +0000 (+0900) Subject: [Tizen] Do not trace canceled task X-Git-Tag: accepted/tizen/8.0/unified/20231123.173039~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=123f32325cab0682f26b0d3f5b2734a8a0250cc3;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git [Tizen] Do not trace canceled task 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 --- diff --git a/dali/internal/system/common/async-task-manager-impl.cpp b/dali/internal/system/common/async-task-manager-impl.cpp index 74f89be..b23a24f 100644 --- a/dali/internal/system/common/async-task-manager-impl.cpp +++ b/dali/internal/system/common/async-task-manager-impl.cpp @@ -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); + } } } }