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_TASKPOOL_H 174d6c458bSopenharmony_ci#define JS_CONCURRENT_MODULE_TASKPOOL_TASKPOOL_H 184d6c458bSopenharmony_ci 194d6c458bSopenharmony_ci#include "napi/native_api.h" 204d6c458bSopenharmony_ci#include "napi/native_node_api.h" 214d6c458bSopenharmony_ci#include "native_engine/native_engine.h" 224d6c458bSopenharmony_ci#include "task.h" 234d6c458bSopenharmony_ci#include "task_group.h" 244d6c458bSopenharmony_ci 254d6c458bSopenharmony_cinamespace Commonlibrary::Concurrent::TaskPoolModule { 264d6c458bSopenharmony_ciusing namespace Commonlibrary::Concurrent::Common; 274d6c458bSopenharmony_ci 284d6c458bSopenharmony_cistruct TaskMessage { 294d6c458bSopenharmony_ci napi_deferred deferred = nullptr; 304d6c458bSopenharmony_ci Priority priority {Priority::DEFAULT}; 314d6c458bSopenharmony_ci uint64_t taskId {}; 324d6c458bSopenharmony_ci}; 334d6c458bSopenharmony_ci 344d6c458bSopenharmony_ciclass TaskPool { 354d6c458bSopenharmony_cipublic: 364d6c458bSopenharmony_ci static napi_value InitTaskPool(napi_env env, napi_value exports); 374d6c458bSopenharmony_ci static void ExecuteCallback(const uv_async_t* req); 384d6c458bSopenharmony_ci static void ExecuteCallbackTask(CallbackInfo* callbackInfo); 394d6c458bSopenharmony_ci static void HandleTaskResult(const uv_async_t* req); 404d6c458bSopenharmony_ci static void HandleTaskResultCallback(Task* task); 414d6c458bSopenharmony_ci 424d6c458bSopenharmony_ciprivate: 434d6c458bSopenharmony_ci TaskPool() = delete; 444d6c458bSopenharmony_ci ~TaskPool() = delete; 454d6c458bSopenharmony_ci TaskPool(const TaskPool &) = delete; 464d6c458bSopenharmony_ci TaskPool& operator=(const TaskPool &) = delete; 474d6c458bSopenharmony_ci TaskPool(TaskPool &&) = delete; 484d6c458bSopenharmony_ci TaskPool& operator=(TaskPool &&) = delete; 494d6c458bSopenharmony_ci 504d6c458bSopenharmony_ci static napi_value Execute(napi_env env, napi_callback_info cbinfo); 514d6c458bSopenharmony_ci static napi_value ExecuteDelayed(napi_env env, napi_callback_info cbinfo); 524d6c458bSopenharmony_ci static void DelayTask(uv_timer_t* handle); 534d6c458bSopenharmony_ci static napi_value Cancel(napi_env env, napi_callback_info cbinfo); 544d6c458bSopenharmony_ci static napi_value GetTaskPoolInfo(napi_env env, [[maybe_unused]] napi_callback_info cbinfo); 554d6c458bSopenharmony_ci static napi_value TerminateTask(napi_env env, napi_callback_info cbinfo); 564d6c458bSopenharmony_ci static napi_value IsConcurrent(napi_env env, napi_callback_info cbinfo); 574d6c458bSopenharmony_ci static napi_value ExecutePeriodically(napi_env env, napi_callback_info cbinfo); 584d6c458bSopenharmony_ci static void PeriodicTaskCallback(uv_timer_t* handle); 594d6c458bSopenharmony_ci 604d6c458bSopenharmony_ci static void UpdateGroupInfoByResult(napi_env env, Task* task, napi_value res, bool success); 614d6c458bSopenharmony_ci static void ExecuteTask(napi_env env, Task* task, Priority priority = Priority::DEFAULT); 624d6c458bSopenharmony_ci static napi_value ExecuteGroup(napi_env env, napi_value taskGroup, Priority priority); 634d6c458bSopenharmony_ci 644d6c458bSopenharmony_ci static void TriggerTask(Task* task); 654d6c458bSopenharmony_ci static void TriggerTimer(napi_env env, Task* task, int32_t period); 664d6c458bSopenharmony_ci static void ExecuteCallbackInner(MsgQueue& msgQueue); 674d6c458bSopenharmony_ci static bool CheckDelayedParams(napi_env env, napi_callback_info cbinfo, uint32_t &priority, int32_t &delayTime, 684d6c458bSopenharmony_ci Task* &task); 694d6c458bSopenharmony_ci static bool CheckPeriodicallyParams(napi_env env, napi_callback_info cbinfo, int32_t &period, uint32_t &priority, 704d6c458bSopenharmony_ci Task* &task); 714d6c458bSopenharmony_ci friend class TaskManager; 724d6c458bSopenharmony_ci friend class NativeEngineTest; 734d6c458bSopenharmony_ci}; 744d6c458bSopenharmony_ci 754d6c458bSopenharmony_ciclass CallbackScope { 764d6c458bSopenharmony_cipublic: 774d6c458bSopenharmony_ci CallbackScope(napi_env env, napi_env workerEnv, uint64_t taskId, napi_status& status): env_(env), 784d6c458bSopenharmony_ci workerEnv_(workerEnv), taskId_(taskId) 794d6c458bSopenharmony_ci { 804d6c458bSopenharmony_ci status = napi_open_handle_scope(env_, &scope_); 814d6c458bSopenharmony_ci } 824d6c458bSopenharmony_ci ~CallbackScope() 834d6c458bSopenharmony_ci { 844d6c458bSopenharmony_ci TaskManager::GetInstance().DecreaseRefCount(env_, taskId_); 854d6c458bSopenharmony_ci if (workerEnv_ != nullptr) { 864d6c458bSopenharmony_ci auto workerEngine = reinterpret_cast<NativeEngine*>(workerEnv_); 874d6c458bSopenharmony_ci workerEngine->DecreaseListeningCounter(); 884d6c458bSopenharmony_ci } 894d6c458bSopenharmony_ci 904d6c458bSopenharmony_ci if (scope_ != nullptr) { 914d6c458bSopenharmony_ci napi_close_handle_scope(env_, scope_); 924d6c458bSopenharmony_ci } 934d6c458bSopenharmony_ci } 944d6c458bSopenharmony_ciprivate: 954d6c458bSopenharmony_ci napi_env env_; 964d6c458bSopenharmony_ci napi_env workerEnv_; 974d6c458bSopenharmony_ci uint64_t taskId_; 984d6c458bSopenharmony_ci napi_handle_scope scope_ = nullptr; 994d6c458bSopenharmony_ci}; 1004d6c458bSopenharmony_ci} // namespace Commonlibrary::Concurrent::TaskPoolModule 1014d6c458bSopenharmony_ci#endif // JS_CONCURRENT_MODULE_TASKPOOL_TASKPOOL_H