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