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_CALLBACK_SCOPE_MANAGER_NATIVE_CALLBACK_SCOPE_MANAGER_H 17 #define FOUNDATION_ACE_NAPI_CALLBACK_SCOPE_MANAGER_NATIVE_CALLBACK_SCOPE_MANAGER_H 18 19 #include <cstddef> 20 #include "ecmascript/napi/include/jsnapi.h" 21 22 class NativeEngine; 23 24 class NativeAsyncWrap { 25 public: EmitAsyncInit(NativeEngine * env,panda::Local<panda::ObjectRef> object,panda::Local<panda::StringRef> type,double asyncId,double triggerAsyncId)26 static void EmitAsyncInit(NativeEngine* env, 27 panda::Local<panda::ObjectRef> object, 28 panda::Local<panda::StringRef> type, 29 double asyncId, 30 double triggerAsyncId) {} 31 EmitDestroy(NativeEngine * env,double asyncId)32 static void EmitDestroy(NativeEngine* env, double asyncId) {} 33 EmitBefore(NativeEngine * env,double asyncId)34 static void EmitBefore(NativeEngine* env, double asyncId) {} 35 EmitAfter(NativeEngine * env,double asyncId)36 static void EmitAfter(NativeEngine* env, double asyncId) {} 37 }; 38 39 struct AsyncIdInfo { 40 double asyncId; 41 double triggerAsyncId; 42 }; 43 44 class NativeCallbackScope { 45 public: 46 enum Flags { 47 NO_FLAGS = 0, 48 SKIP_ASYNC_HOOKS = 1, 49 SKIP_TASK_QUEUES = 2 50 }; 51 NativeCallbackScope(NativeEngine* env, 52 panda::Local<panda::ObjectRef> object, 53 const AsyncIdInfo& asyncIdInfo, 54 int flags = NO_FLAGS); 55 virtual ~NativeCallbackScope(); 56 void Close(); 57 Failed()58 inline bool Failed() const 59 { 60 return failed_; 61 } MarkAsFailed()62 inline void MarkAsFailed() 63 { 64 failed_ = true; 65 } 66 67 private: 68 bool closed_ = false; 69 bool failed_ = false; 70 NativeEngine* env_ = nullptr; 71 AsyncIdInfo asyncIdInfo_ = {0, 0}; 72 [[maybe_unused]] panda::Local<panda::ObjectRef> object_; 73 bool skipHooks_ = false; 74 bool skipTaskQueues_ = false; 75 bool pushedIds_ = false; 76 }; 77 78 class NativeCallbackScopeManager { 79 public: 80 NativeCallbackScopeManager(); 81 virtual ~NativeCallbackScopeManager(); 82 83 NativeCallbackScope* Open(NativeEngine* env, panda::Local<panda::ObjectRef> object, AsyncIdInfo asyncContext); 84 void Close(NativeCallbackScope* scope); 85 86 size_t IncrementOpenCallbackScopes(); 87 size_t DecrementOpenCallbackScopes(); 88 GetOpenCallbackScopes()89 size_t GetOpenCallbackScopes() const 90 { 91 return openCallbackScopes_; 92 } 93 GetAsyncCallbackScopeDepth()94 size_t GetAsyncCallbackScopeDepth() const 95 { 96 return asyncCallbackScopeDepth_; 97 } 98 99 private: 100 size_t openCallbackScopes_ = 0; 101 size_t asyncCallbackScopeDepth_ = 0; 102 }; 103 104 #endif /* FOUNDATION_ACE_NAPI_CALLBACK_SCOPE_MANAGER_NATIVE_CALLBACK_SCOPE_MANAGER_H */ 105