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