Trigger main thread if worker thread task completed 27/298727/2
authorEunki, Hong <eunkiki.hong@samsung.com>
Wed, 13 Sep 2023 04:30:16 +0000 (13:30 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Wed, 13 Sep 2023 05:51:34 +0000 (14:51 +0900)
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 <eunkiki.hong@samsung.com>
dali/internal/system/common/async-task-manager-impl.cpp

index 1c6ded4..6a3eaf1 100644 (file)
@@ -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();
         }