From 55f1c9607d9a43b6d0a52dc40de5f89a2797757b Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Wed, 13 Sep 2023 13:30:16 +0900 Subject: [PATCH] Trigger main thread if worker thread task completed Since we destruct AsyncTask only on main thread, it may collects too much AsyncTasks on complete tasks. To avoid stacking the tasks, let we trigger the callback forcely if the number of complete tasks is big enough. Change-Id: I9a7a52404da56e24355f72a8a5532e8bf8b2d1b8 Signed-off-by: Eunki, Hong --- dali/internal/system/common/async-task-manager-impl.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dali/internal/system/common/async-task-manager-impl.cpp b/dali/internal/system/common/async-task-manager-impl.cpp index 1c6ded4..6a3eaf1 100644 --- a/dali/internal/system/common/async-task-manager-impl.cpp +++ b/dali/internal/system/common/async-task-manager-impl.cpp @@ -35,6 +35,8 @@ namespace Adaptor { namespace { +constexpr auto FORCE_TRIGGER_THRESHOLD = 128u; ///< Trigger TasksCompleted() forcely if the number of completed task contain too much. + constexpr auto DEFAULT_NUMBER_OF_ASYNC_THREADS = size_t{8u}; constexpr auto NUMBER_OF_ASYNC_THREADS_ENV = "DALI_ASYNC_MANAGER_THREAD_POOL_SIZE"; @@ -591,7 +593,7 @@ void AsyncTaskManager::CompleteTask(AsyncTaskPtr&& task) if(task) { - const bool needTrigger = task->GetCallbackInvocationThread() == AsyncTask::ThreadType::MAIN_THREAD; + bool needTrigger = (task->GetCallbackInvocationThread() == AsyncTask::ThreadType::MAIN_THREAD); // Lock while check validation of task. { @@ -655,6 +657,11 @@ void AsyncTaskManager::CompleteTask(AsyncTaskPtr&& task) CacheImpl::EraseTaskCache(mCacheImpl->mRunningTasksCache, task, iter); mRunningTasks.erase(iter); + if(!needTrigger) + { + needTrigger |= (mCompletedTasks.size() >= FORCE_TRIGGER_THRESHOLD); + } + // Now, task is invalidate. task.Reset(); } -- 2.7.4