Trigger main thread if worker thread task completed
[platform/core/uifw/dali-adaptor.git] / dali / internal / system / common / async-task-manager-impl.cpp
index 4b33043..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";
 
@@ -278,7 +280,16 @@ AsyncTaskManager::~AsyncTaskManager()
     Dali::Adaptor::Get().UnregisterProcessor(*this);
   }
 
+  // Join all threads.
   mTasks.Clear();
+
+  // Remove cache impl after all threads are join.
+  mCacheImpl.reset();
+
+  // Remove tasks after CacheImpl removed
+  mWaitingTasks.clear();
+  mRunningTasks.clear();
+  mCompletedTasks.clear();
 }
 
 void AsyncTaskManager::AddTask(AsyncTaskPtr task)
@@ -582,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.
     {
@@ -646,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();
         }