133eb0b6dSopenharmony_ci/*
233eb0b6dSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
333eb0b6dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
433eb0b6dSopenharmony_ci * you may not use this file except in compliance with the License.
533eb0b6dSopenharmony_ci * You may obtain a copy of the License at
633eb0b6dSopenharmony_ci *
733eb0b6dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
833eb0b6dSopenharmony_ci *
933eb0b6dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1033eb0b6dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1133eb0b6dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1233eb0b6dSopenharmony_ci * See the License for the specific language governing permissions and
1333eb0b6dSopenharmony_ci * limitations under the License.
1433eb0b6dSopenharmony_ci */
1533eb0b6dSopenharmony_ci
1633eb0b6dSopenharmony_ci#ifndef FOUNDATION_ACE_NAPI_NATIVE_ENGINE_NATIVE_ASYNC_WORK_H
1733eb0b6dSopenharmony_ci#define FOUNDATION_ACE_NAPI_NATIVE_ENGINE_NATIVE_ASYNC_WORK_H
1833eb0b6dSopenharmony_ci
1933eb0b6dSopenharmony_ci#include "interfaces/kits/napi/common.h"
2033eb0b6dSopenharmony_ci#include "native_value.h"
2133eb0b6dSopenharmony_ci#ifdef ENABLE_HITRACE
2233eb0b6dSopenharmony_ci#include "hitrace/trace.h"
2333eb0b6dSopenharmony_ci#endif
2433eb0b6dSopenharmony_ci#include <mutex>
2533eb0b6dSopenharmony_ci#include <queue>
2633eb0b6dSopenharmony_ci#include <uv.h>
2733eb0b6dSopenharmony_ci
2833eb0b6dSopenharmony_cistruct NativeAsyncWorkDataPointer {
2933eb0b6dSopenharmony_ci    NativeAsyncWorkDataPointer()
3033eb0b6dSopenharmony_ci    {
3133eb0b6dSopenharmony_ci        data_ = nullptr;
3233eb0b6dSopenharmony_ci    }
3333eb0b6dSopenharmony_ci
3433eb0b6dSopenharmony_ci    explicit NativeAsyncWorkDataPointer(void* data)
3533eb0b6dSopenharmony_ci    {
3633eb0b6dSopenharmony_ci        data_ = data;
3733eb0b6dSopenharmony_ci    }
3833eb0b6dSopenharmony_ci    void* data_ { nullptr };
3933eb0b6dSopenharmony_ci};
4033eb0b6dSopenharmony_ci
4133eb0b6dSopenharmony_ci#ifdef ENABLE_HITRACE
4233eb0b6dSopenharmony_cinamespace OHOS {
4333eb0b6dSopenharmony_cinamespace HiviewDFX {
4433eb0b6dSopenharmony_ciclass HiTraceId;
4533eb0b6dSopenharmony_ci}
4633eb0b6dSopenharmony_ci} // namespace OHOS
4733eb0b6dSopenharmony_ci#endif
4833eb0b6dSopenharmony_ci
4933eb0b6dSopenharmony_ciclass NativeAsyncWork {
5033eb0b6dSopenharmony_cipublic:
5133eb0b6dSopenharmony_ci    NativeAsyncWork(NativeEngine* engine,
5233eb0b6dSopenharmony_ci                    NativeAsyncExecuteCallback execute,
5333eb0b6dSopenharmony_ci                    NativeAsyncCompleteCallback complete,
5433eb0b6dSopenharmony_ci                    const std::string &asyncResourceName,
5533eb0b6dSopenharmony_ci                    void* data);
5633eb0b6dSopenharmony_ci
5733eb0b6dSopenharmony_ci    virtual ~NativeAsyncWork();
5833eb0b6dSopenharmony_ci    virtual bool Queue();
5933eb0b6dSopenharmony_ci    virtual bool QueueWithQos(napi_qos_t qos);
6033eb0b6dSopenharmony_ci    virtual bool Cancel();
6133eb0b6dSopenharmony_ci    virtual std::string GetTraceDescription();
6233eb0b6dSopenharmony_ci    template<typename Inner, typename Outer>
6333eb0b6dSopenharmony_ci    static Outer* DereferenceOf(const Inner Outer::*field, const Inner* pointer)
6433eb0b6dSopenharmony_ci    {
6533eb0b6dSopenharmony_ci        if (field != nullptr && pointer != nullptr) {
6633eb0b6dSopenharmony_ci            auto fieldOffset = reinterpret_cast<uintptr_t>(&(static_cast<Outer*>(0)->*field));
6733eb0b6dSopenharmony_ci            auto outPointer = reinterpret_cast<Outer*>(reinterpret_cast<uintptr_t>(pointer) - fieldOffset);
6833eb0b6dSopenharmony_ci            return outPointer;
6933eb0b6dSopenharmony_ci        }
7033eb0b6dSopenharmony_ci        return nullptr;
7133eb0b6dSopenharmony_ci    }
7233eb0b6dSopenharmony_ci
7333eb0b6dSopenharmony_ciprivate:
7433eb0b6dSopenharmony_ci    static void AsyncWorkCallback(uv_work_t* req);
7533eb0b6dSopenharmony_ci    static void AsyncAfterWorkCallback(uv_work_t* req, int status);
7633eb0b6dSopenharmony_ci
7733eb0b6dSopenharmony_ci    uv_work_t work_;
7833eb0b6dSopenharmony_ci    NativeEngine* engine_;
7933eb0b6dSopenharmony_ci    uint64_t engineId_;
8033eb0b6dSopenharmony_ci    NativeAsyncExecuteCallback execute_;
8133eb0b6dSopenharmony_ci    NativeAsyncCompleteCallback complete_;
8233eb0b6dSopenharmony_ci    void* data_;
8333eb0b6dSopenharmony_ci    std::mutex workAsyncMutex_;
8433eb0b6dSopenharmony_ci    std::queue<NativeAsyncWorkDataPointer> asyncWorkRecvData_;
8533eb0b6dSopenharmony_ci    std::string traceDescription_;
8633eb0b6dSopenharmony_ci#ifdef ENABLE_CONTAINER_SCOPE
8733eb0b6dSopenharmony_ci    int32_t containerScopeId_;
8833eb0b6dSopenharmony_ci#endif
8933eb0b6dSopenharmony_ci#ifdef ENABLE_HITRACE
9033eb0b6dSopenharmony_ci    OHOS::HiviewDFX::HiTraceId taskTraceId_;
9133eb0b6dSopenharmony_ci#endif
9233eb0b6dSopenharmony_ci};
9333eb0b6dSopenharmony_ci
9433eb0b6dSopenharmony_ci#endif /* FOUNDATION_ACE_NAPI_NATIVE_ENGINE_NATIVE_ASYNC_WORK_H */
95