1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#ifndef JS_CONCURRENT_MODULE_TASKPOOL_TASK_GROUP_H 17#define JS_CONCURRENT_MODULE_TASKPOOL_TASK_GROUP_H 18 19#include <list> 20 21#include "task.h" 22#include "task_manager.h" 23 24namespace Commonlibrary::Concurrent::TaskPoolModule { 25struct GroupInfo { 26 uint32_t finishedTask {}; 27 napi_ref resArr = nullptr; 28 Priority priority {Priority::DEFAULT}; 29 napi_deferred deferred = nullptr; 30}; 31 32class TaskGroup { 33public: 34 TaskGroup() = default; 35 ~TaskGroup() = default; 36 37 static napi_value TaskGroupConstructor(napi_env env, napi_callback_info cbinfo); 38 static napi_value AddTask(napi_env env, napi_callback_info cbinfo); 39 40 uint32_t GetTaskIndex(uint32_t taskId); 41 void NotifyGroupTask(napi_env env); 42 void CancelPendingGroup(napi_env env); 43 44private: 45 TaskGroup(const TaskGroup &) = delete; 46 TaskGroup& operator=(const TaskGroup &) = delete; 47 TaskGroup(TaskGroup &&) = delete; 48 TaskGroup& operator=(TaskGroup &&) = delete; 49 50 static void TaskGroupDestructor(napi_env env, void* data, void* hint); 51 52 friend class NativeEngineTest; 53public: 54 uint64_t groupId_ {}; 55 GroupInfo* currentGroupInfo_ {}; 56 std::list<GroupInfo*> pendingGroupInfos_ {}; 57 std::list<napi_ref> taskRefs_ {}; 58 std::list<uint64_t> taskIds_ {}; 59 uint32_t taskNum_ {}; 60 std::atomic<ExecuteState> groupState_ {ExecuteState::NOT_FOUND}; 61 napi_ref groupRef_ {}; 62 RECURSIVE_MUTEX taskGroupMutex_ {}; 63}; 64} // namespace Commonlibrary::Concurrent::TaskPoolModule 65#endif // JS_CONCURRENT_MODULE_TASKPOOL_TASK_GROUP_H