14d6c458bSopenharmony_ci/* 24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License. 54d6c458bSopenharmony_ci * You may obtain a copy of the License at 64d6c458bSopenharmony_ci * 74d6c458bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84d6c458bSopenharmony_ci * 94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and 134d6c458bSopenharmony_ci * limitations under the License. 144d6c458bSopenharmony_ci */ 154d6c458bSopenharmony_ci 164d6c458bSopenharmony_ci#ifndef JS_CONCURRENT_MODULE_TASKPOOL_TASK_MANAGER_H 174d6c458bSopenharmony_ci#define JS_CONCURRENT_MODULE_TASKPOOL_TASK_MANAGER_H 184d6c458bSopenharmony_ci 194d6c458bSopenharmony_ci#include <array> 204d6c458bSopenharmony_ci#include <list> 214d6c458bSopenharmony_ci#include <memory> 224d6c458bSopenharmony_ci#include <mutex> 234d6c458bSopenharmony_ci#include <set> 244d6c458bSopenharmony_ci#include <shared_mutex> 254d6c458bSopenharmony_ci#include <unordered_map> 264d6c458bSopenharmony_ci#include <unordered_set> 274d6c458bSopenharmony_ci#include <vector> 284d6c458bSopenharmony_ci 294d6c458bSopenharmony_ci#include "napi/native_api.h" 304d6c458bSopenharmony_ci#include "sequence_runner.h" 314d6c458bSopenharmony_ci#include "task.h" 324d6c458bSopenharmony_ci#include "task_queue.h" 334d6c458bSopenharmony_ci#include "task_group.h" 344d6c458bSopenharmony_ci#include "worker.h" 354d6c458bSopenharmony_ci 364d6c458bSopenharmony_cinamespace Commonlibrary::Concurrent::TaskPoolModule { 374d6c458bSopenharmony_ciusing namespace Commonlibrary::Concurrent::Common; 384d6c458bSopenharmony_ci 394d6c458bSopenharmony_cistatic constexpr char ARGUMENTS_STR[] = "arguments"; 404d6c458bSopenharmony_cistatic constexpr char NAME[] = "name"; 414d6c458bSopenharmony_cistatic constexpr char FUNCTION_STR[] = "function"; 424d6c458bSopenharmony_cistatic constexpr char GROUP_ID_STR[] = "groupId"; 434d6c458bSopenharmony_cistatic constexpr char TASKID_STR[] = "taskId"; 444d6c458bSopenharmony_cistatic constexpr char TASKINFO_STR[] = "taskInfo"; 454d6c458bSopenharmony_cistatic constexpr char TRANSFERLIST_STR[] = "transferList"; 464d6c458bSopenharmony_cistatic constexpr char CLONE_LIST_STR[] = "cloneList"; 474d6c458bSopenharmony_cistatic constexpr char ADD_DEPENDENCY_STR[] = "addDependency"; 484d6c458bSopenharmony_cistatic constexpr char REMOVE_DEPENDENCY_STR[] = "removeDependency"; 494d6c458bSopenharmony_cistatic constexpr char TASK_CPU_TIME[] = "cpuDuration"; 504d6c458bSopenharmony_cistatic constexpr char TASK_IO_TIME[] = "ioDuration"; 514d6c458bSopenharmony_cistatic constexpr char TASK_TOTAL_TIME[] = "totalDuration"; 524d6c458bSopenharmony_cistatic constexpr char DEFAULT_TRANSFER_STR[] = "defaultTransfer"; 534d6c458bSopenharmony_cistatic constexpr char DEFAULT_CLONE_SENDABLE_STR[] = "defaultCloneSendable"; 544d6c458bSopenharmony_ci 554d6c458bSopenharmony_ciclass TaskGroup; 564d6c458bSopenharmony_ci 574d6c458bSopenharmony_ciclass TaskManager { 584d6c458bSopenharmony_cipublic: 594d6c458bSopenharmony_ci static TaskManager& GetInstance(); 604d6c458bSopenharmony_ci 614d6c458bSopenharmony_ci void StoreTask(uint64_t taskId, Task* task); 624d6c458bSopenharmony_ci void RemoveTask(uint64_t taskId); 634d6c458bSopenharmony_ci Task* GetTask(uint64_t taskId); 644d6c458bSopenharmony_ci void EnqueueTaskId(uint64_t taskId, Priority priority = Priority::DEFAULT); 654d6c458bSopenharmony_ci void EraseWaitingTaskId(uint64_t taskId, Priority priority); 664d6c458bSopenharmony_ci std::pair<uint64_t, Priority> DequeueTaskId(); 674d6c458bSopenharmony_ci void CancelTask(napi_env env, uint64_t taskId); 684d6c458bSopenharmony_ci void CancelSeqRunnerTask(napi_env env, Task* task); 694d6c458bSopenharmony_ci void ReleaseTaskData(napi_env env, Task* task, bool shouldDeleteTask = true); 704d6c458bSopenharmony_ci 714d6c458bSopenharmony_ci // for worker state 724d6c458bSopenharmony_ci void NotifyWorkerIdle(Worker* worker); 734d6c458bSopenharmony_ci void NotifyWorkerCreated(Worker* worker); 744d6c458bSopenharmony_ci void NotifyWorkerRunning(Worker* worker); 754d6c458bSopenharmony_ci void RemoveWorker(Worker* worker); 764d6c458bSopenharmony_ci void RestoreWorker(Worker* worker); 774d6c458bSopenharmony_ci 784d6c458bSopenharmony_ci // for load balance 794d6c458bSopenharmony_ci void InitTaskManager(napi_env env); 804d6c458bSopenharmony_ci void UpdateExecutedInfo(uint64_t duration); 814d6c458bSopenharmony_ci void TryTriggerExpand(); 824d6c458bSopenharmony_ci 834d6c458bSopenharmony_ci // for taskpool state 844d6c458bSopenharmony_ci uint32_t GetTaskNum(); 854d6c458bSopenharmony_ci uint32_t GetIdleWorkers(); 864d6c458bSopenharmony_ci uint32_t GetThreadNum(); 874d6c458bSopenharmony_ci uint32_t GetRunningWorkers(); 884d6c458bSopenharmony_ci uint32_t GetTimeoutWorkers(); 894d6c458bSopenharmony_ci void GetIdleWorkersList(uint32_t step); 904d6c458bSopenharmony_ci bool ReadThreadInfo(pid_t tid, char* buf, uint32_t size); 914d6c458bSopenharmony_ci 924d6c458bSopenharmony_ci // for get thread info 934d6c458bSopenharmony_ci napi_value GetThreadInfos(napi_env env); 944d6c458bSopenharmony_ci 954d6c458bSopenharmony_ci // for get task info 964d6c458bSopenharmony_ci napi_value GetTaskInfos(napi_env env); 974d6c458bSopenharmony_ci 984d6c458bSopenharmony_ci // for countTrace for worker 994d6c458bSopenharmony_ci void CountTraceForWorker(); 1004d6c458bSopenharmony_ci 1014d6c458bSopenharmony_ci std::shared_ptr<CallbackInfo> GetCallbackInfo(uint64_t taskId); 1024d6c458bSopenharmony_ci void RegisterCallback(napi_env env, uint64_t taskId, std::shared_ptr<CallbackInfo> callbackInfo); 1034d6c458bSopenharmony_ci void IncreaseRefCount(uint64_t taskId); 1044d6c458bSopenharmony_ci void DecreaseRefCount(napi_env env, uint64_t taskId); 1054d6c458bSopenharmony_ci napi_value NotifyCallbackExecute(napi_env env, TaskResultInfo* resultInfo, Task* task); 1064d6c458bSopenharmony_ci MsgQueue* GetMessageQueue(const uv_async_t* req); 1074d6c458bSopenharmony_ci MsgQueue* GetMessageQueueFromCallbackInfo(CallbackInfo* callbackInfo); 1084d6c458bSopenharmony_ci 1094d6c458bSopenharmony_ci // for task dependency 1104d6c458bSopenharmony_ci bool IsDependendByTaskId(uint64_t taskId); 1114d6c458bSopenharmony_ci bool IsDependentByTaskId(uint64_t dependentTaskId); 1124d6c458bSopenharmony_ci void NotifyDependencyTaskInfo(uint64_t taskId); 1134d6c458bSopenharmony_ci void RemoveDependencyById(uint64_t dependentTaskId, uint64_t taskId); 1144d6c458bSopenharmony_ci bool StoreTaskDependency(uint64_t taskId, std::set<uint64_t> taskIdSet); 1154d6c458bSopenharmony_ci bool RemoveTaskDependency(uint64_t taskId, uint64_t dependentId); 1164d6c458bSopenharmony_ci bool CheckCircularDependency(std::set<uint64_t> dependentIdSet, std::set<uint64_t> idSet, uint64_t taskId); 1174d6c458bSopenharmony_ci void EnqueuePendingTaskInfo(uint64_t taskId, Priority priority); 1184d6c458bSopenharmony_ci std::pair<uint64_t, Priority> DequeuePendingTaskInfo(uint64_t taskId); 1194d6c458bSopenharmony_ci void RemovePendingTaskInfo(uint64_t taskId); 1204d6c458bSopenharmony_ci void StoreDependentTaskInfo(std::set<uint64_t> dependTaskIdSet, uint64_t taskId); 1214d6c458bSopenharmony_ci void RemoveDependentTaskInfo(uint64_t dependentTaskId, uint64_t taskId); 1224d6c458bSopenharmony_ci std::string GetTaskDependInfoToString(uint64_t taskId); 1234d6c458bSopenharmony_ci 1244d6c458bSopenharmony_ci bool PostTask(std::function<void()> task, const char* taskName, Priority priority = Priority::DEFAULT); 1254d6c458bSopenharmony_ci 1264d6c458bSopenharmony_ci // for duration 1274d6c458bSopenharmony_ci void StoreTaskDuration(uint64_t taskId, uint64_t totalDuration, uint64_t cpuDuration); 1284d6c458bSopenharmony_ci uint64_t GetTaskDuration(uint64_t taskId, std::string durationType); 1294d6c458bSopenharmony_ci void RemoveTaskDuration(uint64_t taskId); 1304d6c458bSopenharmony_ci void StoreLongTaskInfo(uint64_t taskId, Worker* worker); 1314d6c458bSopenharmony_ci void RemoveLongTaskInfo(uint64_t taskId); 1324d6c458bSopenharmony_ci void TerminateTask(uint64_t taskId); 1334d6c458bSopenharmony_ci Worker* GetLongTaskInfo(uint64_t taskId); 1344d6c458bSopenharmony_ci 1354d6c458bSopenharmony_ci // for callback 1364d6c458bSopenharmony_ci void ReleaseCallBackInfo(Task* task); 1374d6c458bSopenharmony_ci 1384d6c458bSopenharmony_ci void UpdateSystemAppFlag(); 1394d6c458bSopenharmony_ci bool IsSystemApp() const 1404d6c458bSopenharmony_ci { 1414d6c458bSopenharmony_ci return isSystemApp_; 1424d6c458bSopenharmony_ci } 1434d6c458bSopenharmony_ci bool EnableFfrt() const 1444d6c458bSopenharmony_ci { 1454d6c458bSopenharmony_ci return globalEnableFfrtFlag_ || (isSystemApp_ && !disableFfrtFlag_); 1464d6c458bSopenharmony_ci } 1474d6c458bSopenharmony_ci 1484d6c458bSopenharmony_ci bool CheckTask(uint64_t taskId); 1494d6c458bSopenharmony_ci 1504d6c458bSopenharmony_ciprivate: 1514d6c458bSopenharmony_ci TaskManager(); 1524d6c458bSopenharmony_ci ~TaskManager(); 1534d6c458bSopenharmony_ci TaskManager(const TaskManager &) = delete; 1544d6c458bSopenharmony_ci TaskManager& operator=(const TaskManager &) = delete; 1554d6c458bSopenharmony_ci TaskManager(TaskManager &&) = delete; 1564d6c458bSopenharmony_ci TaskManager& operator=(TaskManager &&) = delete; 1574d6c458bSopenharmony_ci 1584d6c458bSopenharmony_ci void CreateWorkers(napi_env env, uint32_t num = 1); 1594d6c458bSopenharmony_ci void NotifyExecuteTask(); 1604d6c458bSopenharmony_ci void NotifyWorkerAdded(Worker* worker); 1614d6c458bSopenharmony_ci 1624d6c458bSopenharmony_ci // for load balance 1634d6c458bSopenharmony_ci void RunTaskManager(); 1644d6c458bSopenharmony_ci void CheckForBlockedWorkers(); 1654d6c458bSopenharmony_ci void TryExpand(); 1664d6c458bSopenharmony_ci void NotifyShrink(uint32_t targetNum); 1674d6c458bSopenharmony_ci void TriggerShrink(uint32_t step); 1684d6c458bSopenharmony_ci uint32_t ComputeSuitableThreadNum(); 1694d6c458bSopenharmony_ci uint32_t ComputeSuitableIdleNum(); 1704d6c458bSopenharmony_ci static void NotifyExpand(const uv_async_t* req); 1714d6c458bSopenharmony_ci static void TriggerLoadBalance(const uv_timer_t* req = nullptr); 1724d6c458bSopenharmony_ci 1734d6c458bSopenharmony_ci bool IsChooseIdle(); 1744d6c458bSopenharmony_ci uint32_t GetNonIdleTaskNum(); 1754d6c458bSopenharmony_ci std::pair<uint64_t, Priority> GetTaskByPriority(const std::unique_ptr<ExecuteQueue>& taskQueue, Priority priority); 1764d6c458bSopenharmony_ci void IncreaseNumIfNoIdle(Priority priority); 1774d6c458bSopenharmony_ci void DecreaseNumIfNoIdle(Priority priority); 1784d6c458bSopenharmony_ci 1794d6c458bSopenharmony_ci // <taskId, Task> 1804d6c458bSopenharmony_ci std::unordered_map<uint64_t, Task*> tasks_ {}; 1814d6c458bSopenharmony_ci RECURSIVE_MUTEX tasksMutex_; 1824d6c458bSopenharmony_ci 1834d6c458bSopenharmony_ci // <taskId, <dependent taskId1, dependent taskId2, ...>>, update when removeDependency or executeTask 1844d6c458bSopenharmony_ci std::unordered_map<uint64_t, std::set<uint64_t>> dependTaskInfos_ {}; 1854d6c458bSopenharmony_ci std::shared_mutex dependTaskInfosMutex_; 1864d6c458bSopenharmony_ci 1874d6c458bSopenharmony_ci // <dependent taskId, <taskId1, taskId2, ...>>, update when removeDependency or executeTask 1884d6c458bSopenharmony_ci std::unordered_map<uint64_t, std::set<uint64_t>> dependentTaskInfos_ {}; 1894d6c458bSopenharmony_ci std::shared_mutex dependentTaskInfosMutex_; 1904d6c458bSopenharmony_ci 1914d6c458bSopenharmony_ci // <<pendingTaskId1, priority>, <pendingTaskId2, priority>, ...> 1924d6c458bSopenharmony_ci std::unordered_map<uint64_t, Priority> pendingTaskInfos_ {}; 1934d6c458bSopenharmony_ci std::shared_mutex pendingTaskInfosMutex_; 1944d6c458bSopenharmony_ci 1954d6c458bSopenharmony_ci // <<taskId1, <totalDuration1, cpuDuration1>>, <taskId2, <totalDuration2, cpuDuration2>>, ...> 1964d6c458bSopenharmony_ci std::unordered_map<uint64_t, std::pair<uint64_t, uint64_t>> taskDurationInfos_ {}; 1974d6c458bSopenharmony_ci std::shared_mutex taskDurationInfosMutex_; 1984d6c458bSopenharmony_ci 1994d6c458bSopenharmony_ci // record the longTasks and workers for efficiency 2004d6c458bSopenharmony_ci std::unordered_map<uint64_t, Worker*> longTasksMap_ {}; 2014d6c458bSopenharmony_ci std::shared_mutex longTasksMutex_{}; 2024d6c458bSopenharmony_ci 2034d6c458bSopenharmony_ci std::unordered_set<Worker*> workers_ {}; 2044d6c458bSopenharmony_ci std::unordered_set<Worker*> idleWorkers_ {}; 2054d6c458bSopenharmony_ci std::unordered_set<Worker*> timeoutWorkers_ {}; 2064d6c458bSopenharmony_ci RECURSIVE_MUTEX workersMutex_; 2074d6c458bSopenharmony_ci 2084d6c458bSopenharmony_ci // for load balance 2094d6c458bSopenharmony_ci napi_env hostEnv_ = nullptr; 2104d6c458bSopenharmony_ci uv_loop_t* loop_ = nullptr; 2114d6c458bSopenharmony_ci uv_timer_t* timer_ = nullptr; 2124d6c458bSopenharmony_ci uv_async_t* expandHandle_ = nullptr; 2134d6c458bSopenharmony_ci std::atomic<bool> suspend_ = false; 2144d6c458bSopenharmony_ci std::atomic<uint32_t> retryCount_ = 0; 2154d6c458bSopenharmony_ci std::atomic<uint32_t> nonIdleTaskNum_ = 0; 2164d6c458bSopenharmony_ci std::atomic<uint32_t> totalExecCount_ = 0; 2174d6c458bSopenharmony_ci std::atomic<uint64_t> totalExecTime_ = 0; 2184d6c458bSopenharmony_ci std::atomic<bool> needChecking_ = false; 2194d6c458bSopenharmony_ci std::atomic<bool> isHandleInited_ = false; 2204d6c458bSopenharmony_ci 2214d6c458bSopenharmony_ci // for task priority 2224d6c458bSopenharmony_ci uint32_t highPrioExecuteCount_ = 0; 2234d6c458bSopenharmony_ci uint32_t mediumPrioExecuteCount_ = 0; 2244d6c458bSopenharmony_ci std::array<std::unique_ptr<ExecuteQueue>, Priority::NUMBER> taskQueues_ {}; 2254d6c458bSopenharmony_ci FFRT_MUTEX taskQueuesMutex_; 2264d6c458bSopenharmony_ci 2274d6c458bSopenharmony_ci std::atomic<bool> isInitialized_ = false; 2284d6c458bSopenharmony_ci std::atomic<bool> isSystemApp_ = false; 2294d6c458bSopenharmony_ci int disableFfrtFlag_ = 0; // 0 means enable ffrt 2304d6c458bSopenharmony_ci int globalEnableFfrtFlag_ = 0; // 0 means not global enable ffrt 2314d6c458bSopenharmony_ci 2324d6c458bSopenharmony_ci std::mutex callbackMutex_; 2334d6c458bSopenharmony_ci std::map<uint32_t, std::shared_ptr<CallbackInfo>> callbackTable_ {}; 2344d6c458bSopenharmony_ci std::vector<Worker*> freeList_ {}; 2354d6c458bSopenharmony_ci 2364d6c458bSopenharmony_ci#if defined(ENABLE_TASKPOOL_EVENTHANDLER) 2374d6c458bSopenharmony_ci std::shared_ptr<OHOS::AppExecFwk::EventHandler> mainThreadHandler_ {}; 2384d6c458bSopenharmony_ci#endif 2394d6c458bSopenharmony_ci 2404d6c458bSopenharmony_ci friend class TaskGroupManager; 2414d6c458bSopenharmony_ci friend class NativeEngineTest; 2424d6c458bSopenharmony_ci}; 2434d6c458bSopenharmony_ci 2444d6c458bSopenharmony_ciclass TaskGroupManager { 2454d6c458bSopenharmony_cipublic: 2464d6c458bSopenharmony_ci TaskGroupManager() = default; 2474d6c458bSopenharmony_ci ~TaskGroupManager() = default; 2484d6c458bSopenharmony_ci 2494d6c458bSopenharmony_ci static TaskGroupManager &GetInstance(); 2504d6c458bSopenharmony_ci 2514d6c458bSopenharmony_ci void AddTask(uint64_t groupId, napi_ref taskRef, uint64_t taskId); 2524d6c458bSopenharmony_ci void StoreTaskGroup(uint64_t groupId, TaskGroup* taskGroup); 2534d6c458bSopenharmony_ci void RemoveTaskGroup(uint64_t groupId); 2544d6c458bSopenharmony_ci TaskGroup* GetTaskGroup(uint64_t groupId); 2554d6c458bSopenharmony_ci void CancelGroup(napi_env env, uint64_t groupId); 2564d6c458bSopenharmony_ci void CancelGroupTask(napi_env env, uint64_t taskId, TaskGroup* group); 2574d6c458bSopenharmony_ci void ReleaseTaskGroupData(napi_env env, TaskGroup* group); 2584d6c458bSopenharmony_ci bool UpdateGroupState(uint64_t groupId); 2594d6c458bSopenharmony_ci 2604d6c458bSopenharmony_ci void AddTaskToSeqRunner(uint64_t seqRunnerId, Task* task); 2614d6c458bSopenharmony_ci bool TriggerSeqRunner(napi_env env, Task* lastTask); 2624d6c458bSopenharmony_ci void DisposeCanceledTask(napi_env env, Task* task); 2634d6c458bSopenharmony_ci void StoreSequenceRunner(uint64_t seqRunnerId, SequenceRunner* seqRunner); 2644d6c458bSopenharmony_ci void RemoveSequenceRunner(uint64_t seqRunnerId); 2654d6c458bSopenharmony_ci SequenceRunner* GetSeqRunner(uint64_t seqRunnerId); 2664d6c458bSopenharmony_ci 2674d6c458bSopenharmony_ciprivate: 2684d6c458bSopenharmony_ci TaskGroupManager(const TaskGroupManager &) = delete; 2694d6c458bSopenharmony_ci TaskGroupManager& operator=(const TaskGroupManager &) = delete; 2704d6c458bSopenharmony_ci TaskGroupManager(TaskGroupManager &&) = delete; 2714d6c458bSopenharmony_ci TaskGroupManager& operator=(TaskGroupManager &&) = delete; 2724d6c458bSopenharmony_ci 2734d6c458bSopenharmony_ci // <groupId, TaskGroup> 2744d6c458bSopenharmony_ci std::unordered_map<uint64_t, TaskGroup*> taskGroups_ {}; 2754d6c458bSopenharmony_ci std::mutex taskGroupsMutex_; 2764d6c458bSopenharmony_ci 2774d6c458bSopenharmony_ci // <seqRunnerId, SequenceRunner> 2784d6c458bSopenharmony_ci std::unordered_map<uint64_t, SequenceRunner*> seqRunners_ {}; 2794d6c458bSopenharmony_ci std::mutex seqRunnersMutex_; 2804d6c458bSopenharmony_ci friend class NativeEngineTest; 2814d6c458bSopenharmony_ci}; 2824d6c458bSopenharmony_ci 2834d6c458bSopenharmony_ciclass SequenceRunnerManager { 2844d6c458bSopenharmony_cipublic: 2854d6c458bSopenharmony_ci SequenceRunnerManager() = default; 2864d6c458bSopenharmony_ci ~SequenceRunnerManager() = default; 2874d6c458bSopenharmony_ci 2884d6c458bSopenharmony_ci static SequenceRunnerManager &GetInstance(); 2894d6c458bSopenharmony_ci SequenceRunner* CreateOrGetGlobalRunner(napi_env env, napi_value thisVar, size_t argc, 2904d6c458bSopenharmony_ci const std::string &name, uint32_t priority); 2914d6c458bSopenharmony_ci uint64_t DecreaseSeqCount(SequenceRunner* seqRunner); 2924d6c458bSopenharmony_ci void RemoveGlobalSeqRunnerRef(napi_env env, SequenceRunner* seqRunner); 2934d6c458bSopenharmony_ci void RemoveSequenceRunner(const std::string &name); 2944d6c458bSopenharmony_ci bool TriggerGlobalSeqRunner(napi_env env, SequenceRunner* seqRunner); 2954d6c458bSopenharmony_ci void GlobalSequenceRunnerDestructor(napi_env env, SequenceRunner *seqRunner); 2964d6c458bSopenharmony_ci 2974d6c458bSopenharmony_ciprivate: 2984d6c458bSopenharmony_ci SequenceRunnerManager(const SequenceRunnerManager &) = delete; 2994d6c458bSopenharmony_ci SequenceRunnerManager& operator=(const SequenceRunnerManager &) = delete; 3004d6c458bSopenharmony_ci SequenceRunnerManager(SequenceRunnerManager &&) = delete; 3014d6c458bSopenharmony_ci SequenceRunnerManager& operator=(SequenceRunnerManager &&) = delete; 3024d6c458bSopenharmony_ci 3034d6c458bSopenharmony_ci // <<name1, seqRunner>, <name2, seqRunner>, ...> 3044d6c458bSopenharmony_ci std::unordered_map<std::string, SequenceRunner*> globalSeqRunner_ {}; 3054d6c458bSopenharmony_ci std::mutex globalSeqRunnerMutex_; 3064d6c458bSopenharmony_ci}; 3074d6c458bSopenharmony_ci} // namespace Commonlibrary::Concurrent::TaskPoolModule 3084d6c458bSopenharmony_ci#endif // JS_CONCURRENT_MODULE_TASKPOOL_TASK_MANAGER_H