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