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