• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 FOUNDATION_ACE_NAPI_NATIVE_ENGINE_NATIVE_SAFE_ASYNC_WORK_H
17 #define FOUNDATION_ACE_NAPI_NATIVE_ENGINE_NATIVE_SAFE_ASYNC_WORK_H
18 
19 #include "native_value.h"
20 
21 #include <mutex>
22 #include <deque>
23 #include <uv.h>
24 #ifdef LINUX_PLATFORM
25 #include <condition_variable>
26 #endif
27 
28 #include "native_async_context.h"
29 #ifdef ENABLE_HITRACE
30 #include "hitrace/trace.h"
31 #endif
32 
33 #if defined(ENABLE_EVENT_HANDLER)
34 namespace OHOS::AppExecFwk {
35     class EventHandler;
36 }
37 #endif
38 
39 #ifdef ENABLE_HITRACE
40 namespace OHOS {
41 namespace HiviewDFX {
42 class HiTraceId;
43 }
44 } // namespace OHOS
45 #endif
46 
47 enum class SafeAsyncCode {
48     UNKNOWN = 0,
49     SAFE_ASYNC_QUEUE_FULL,
50     SAFE_ASYNC_INVALID_ARGS,
51     SAFE_ASYNC_CLOSED,
52     SAFE_ASYNC_FAILED,
53     SAFE_ASYNC_OK,
54 };
55 
56 enum class SafeAsyncStatus {
57     UNKNOW = 0,
58     SAFE_ASYNC_STATUS_INTE,
59     SAFE_ASYNC_STATUS_CLOSING,
60     SAFE_ASYNC_STATUS_CLOSED,
61 };
62 
63 class NativeSafeAsyncWork {
64 public:
65     static void AsyncCallback(uv_async_t* asyncHandler);
66     static void CallJs(NativeEngine* engine, napi_value js_call_func, void* context, void* data);
67 
68     NativeSafeAsyncWork(NativeEngine* engine,
69                         napi_value func,
70                         napi_value asyncResource,
71                         napi_value asyncResourceName,
72                         size_t maxQueueSize,
73                         size_t threadCount,
74                         void* finalizeData,
75                         NativeFinalize finalizeCallback,
76                         void* context,
77                         NativeThreadSafeFunctionCallJs callJsCallback);
78 
79     virtual ~NativeSafeAsyncWork();
80     virtual bool Init();
81     virtual SafeAsyncCode Send(void* data, NativeThreadSafeFunctionCallMode mode);
82     virtual SafeAsyncCode Acquire();
83     virtual SafeAsyncCode Release(NativeThreadSafeFunctionReleaseMode mode);
84     virtual bool Ref();
85     virtual bool Unref();
86     virtual void* GetContext();
87     virtual napi_status PostTask(void *data, int32_t priority, bool isTail);
88 
89 protected:
90     void ProcessAsyncHandle();
91     SafeAsyncCode CloseHandles();
92     void CleanUp();
93     bool IsSameTid();
94     bool IsMaxQueueSize();
95 
96     SafeAsyncCode ValidEngineCheck();
97 
98     NativeEngine* engine_ = nullptr;
99     uint64_t engineId_ = 0;
100     NativeReference* ref_ = nullptr;
101     size_t maxQueueSize_ = 0;
102     size_t threadCount_ = 0;
103     void* finalizeData_ = nullptr;
104     NativeFinalize finalizeCallback_ = nullptr;
105     void* context_ = nullptr;
106     NativeThreadSafeFunctionCallJs callJsCallback_ = nullptr;
107     NativeAsyncContext asyncContext_;
108     uv_async_t asyncHandler_;
109     std::mutex mutex_;
110     std::deque<void*> queue_;
111     std::condition_variable condition_;
112     SafeAsyncStatus status_ = SafeAsyncStatus::UNKNOW;
113 #if defined(ENABLE_EVENT_HANDLER)
114     std::mutex eventHandlerMutex_;
115     std::shared_ptr<OHOS::AppExecFwk::EventHandler> eventHandler_ = nullptr;
116 #endif
117 
118 #ifdef ENABLE_CONTAINER_SCOPE
119     int32_t containerScopeId_;
120 #endif
121 
122 #ifdef ENABLE_HITRACE
123     OHOS::HiviewDFX::HiTraceId taskTraceId_;
124     OHOS::HiviewDFX::HiTraceId currentId_;
125 #endif
126 
127     void InitSafeAsyncWorkTraceId();
SaveAndSetTraceId()128     inline bool SaveAndSetTraceId()
129     {
130         bool isValidTraceId = false;
131 #ifdef ENABLE_HITRACE
132         isValidTraceId = taskTraceId_.IsValid();
133         if (isValidTraceId) {
134             currentId_ = OHOS::HiviewDFX::HiTraceChain::SaveAndSet(taskTraceId_);
135         }
136 #endif
137         return isValidTraceId;
138     }
139 
RestoreTraceId(bool isValidTraceId)140     inline void RestoreTraceId(bool isValidTraceId)
141     {
142 #ifdef ENABLE_HITRACE
143         if (isValidTraceId) {
144             OHOS::HiviewDFX::HiTraceChain::Restore(currentId_);
145         }
146 #endif
147     }
148 
ClearTraceId(bool isValidTraceId)149     inline void ClearTraceId(bool isValidTraceId)
150     {
151 #ifdef ENABLE_HITRACE
152         if (isValidTraceId) {
153             OHOS::HiviewDFX::HiTraceChain::ClearId();
154         }
155 #endif
156     }
157 };
158 
159 #endif /* FOUNDATION_ACE_NAPI_NATIVE_ENGINE_NATIVE_SAFE_ASYNC_WORK_H */
160