/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "async-task-manager-impl.h"
// EXTERNAL INCLUDES
-#include <dali/devel-api/common/singleton-service.h>
#include <dali/devel-api/adaptor-framework/environment-variable.h>
#include <dali/devel-api/adaptor-framework/thread-settings.h>
+#include <dali/devel-api/common/singleton-service.h>
#include <dali/integration-api/adaptor-framework/adaptor.h>
#include <dali/integration-api/debug.h>
Dali::AsyncTaskManager AsyncTaskManager::Get()
{
Dali::AsyncTaskManager manager;
- SingletonService singletonService(SingletonService::Get());
+ SingletonService singletonService(SingletonService::Get());
if(singletonService)
{
// Check whether the async task manager is already created
{
// If not, create the async task manager and register it as a singleton
Internal::Adaptor::AsyncTaskManager* internalAsyncTaskManager = new Internal::Adaptor::AsyncTaskManager();
- manager = Dali::AsyncTaskManager(internalAsyncTaskManager);
+ manager = Dali::AsyncTaskManager(internalAsyncTaskManager);
singletonService.Register(typeid(manager), manager);
}
}
AsyncTaskManager::~AsyncTaskManager()
{
- if(mProcessorRegistered)
+ if(mProcessorRegistered && Dali::Adaptor::IsAvailable())
{
Dali::Adaptor::Get().UnregisterProcessor(*this);
}
// If all threads are busy, then it's ok just to push the task because they will try to get the next job.
}
- if(!mProcessorRegistered)
+ if(!mProcessorRegistered && Dali::Adaptor::IsAvailable())
{
Dali::Adaptor::Get().RegisterProcessor(*this);
mProcessorRegistered = true;
void AsyncTaskManager::CompleteTask(AsyncTaskPtr task)
{
// Lock while adding task to the queue
- Mutex::ScopedLock lock(mMutex);
- for(auto iter = mRunningTasks.begin(), endIter = mRunningTasks.end(); iter != endIter; ++iter)
{
- if((*iter).first == task)
+ Mutex::ScopedLock lock(mMutex);
+ for(auto iter = mRunningTasks.begin(), endIter = mRunningTasks.end(); iter != endIter; ++iter)
{
- if(!(*iter).second)
+ if((*iter).first == task)
{
- mCompletedTasks.push_back(task);
- }
+ if(!(*iter).second)
+ {
+ if(task->GetCallbackInvocationThread() == AsyncTask::ThreadType::MAIN_THREAD)
+ {
+ mCompletedTasks.push_back(task);
+ }
+ }
- // Delete this task in running queue
- mRunningTasks.erase(iter);
- break;
+ // Delete this task in running queue
+ mRunningTasks.erase(iter);
+ break;
+ }
}
}
// wake up the main thread
- mTrigger->Trigger();
+ if(task->GetCallbackInvocationThread() == AsyncTask::ThreadType::MAIN_THREAD)
+ {
+ mTrigger->Trigger();
+ }
+ else
+ {
+ CallbackBase::Execute(*(task->GetCompletedCallback()), task);
+ }
}
void AsyncTaskManager::UnregisterProcessor()
{
- if(mProcessorRegistered)
+ if(mProcessorRegistered && Dali::Adaptor::IsAvailable())
{
Mutex::ScopedLock lock(mMutex);
if(mWaitingTasks.empty() && mCompletedTasks.empty() && mRunningTasks.empty())
{
while(AsyncTaskPtr task = PopNextCompletedTask())
{
- CallbackBase::Execute(*(task->GetCompletedCallback()),task);
+ CallbackBase::Execute(*(task->GetCompletedCallback()), task);
}
UnregisterProcessor();