Line data Source code
1 : // Copyright 2018 the V8 project authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file.
4 :
5 : #ifndef V8_ASYNC_HOOKS_WRAPPER_H_
6 : #define V8_ASYNC_HOOKS_WRAPPER_H_
7 :
8 : #include <stack>
9 :
10 : #include "include/v8.h"
11 : #include "src/objects.h"
12 :
13 : namespace v8 {
14 :
15 : typedef double async_id_t;
16 :
17 : struct AsyncContext {
18 : async_id_t execution_async_id;
19 : async_id_t trigger_async_id;
20 : };
21 :
22 90 : class AsyncHooksWrap {
23 : public:
24 : explicit AsyncHooksWrap(Isolate* isolate) {
25 90 : enabled_ = false;
26 90 : isolate_ = isolate;
27 : }
28 : void Enable();
29 : void Disable();
30 : bool IsEnabled() const { return enabled_; }
31 :
32 : inline v8::Local<v8::Function> init_function() const;
33 : inline void set_init_function(v8::Local<v8::Function> value);
34 : inline v8::Local<v8::Function> before_function() const;
35 : inline void set_before_function(v8::Local<v8::Function> value);
36 : inline v8::Local<v8::Function> after_function() const;
37 : inline void set_after_function(v8::Local<v8::Function> value);
38 : inline v8::Local<v8::Function> promiseResolve_function() const;
39 : inline void set_promiseResolve_function(v8::Local<v8::Function> value);
40 :
41 : private:
42 : Isolate* isolate_;
43 :
44 : Persistent<v8::Function> init_function_;
45 : Persistent<v8::Function> before_function_;
46 : Persistent<v8::Function> after_function_;
47 : Persistent<v8::Function> promiseResolve_function_;
48 :
49 : bool enabled_;
50 : };
51 :
52 : class AsyncHooks {
53 : public:
54 100 : explicit AsyncHooks(Isolate* isolate) {
55 50 : isolate_ = isolate;
56 :
57 : AsyncContext ctx;
58 50 : ctx.execution_async_id = 1;
59 50 : ctx.trigger_async_id = 0;
60 : asyncContexts.push(ctx);
61 50 : current_async_id = 1;
62 :
63 50 : Initialize();
64 50 : }
65 100 : ~AsyncHooks() { Deinitialize(); }
66 :
67 : async_id_t GetExecutionAsyncId() const;
68 : async_id_t GetTriggerAsyncId() const;
69 :
70 : Local<Object> CreateHook(const v8::FunctionCallbackInfo<v8::Value>& args);
71 :
72 : Persistent<FunctionTemplate> async_hook_ctor;
73 :
74 : private:
75 : std::vector<AsyncHooksWrap*> async_wraps_;
76 : Isolate* isolate_;
77 : Persistent<ObjectTemplate> async_hooks_templ;
78 : Persistent<Private> async_id_smb;
79 : Persistent<Private> trigger_id_smb;
80 :
81 : void Initialize();
82 : void Deinitialize();
83 :
84 : static void ShellPromiseHook(PromiseHookType type, Local<Promise> promise,
85 : Local<Value> parent);
86 : static void PromiseHookDispatch(PromiseHookType type, Local<Promise> promise,
87 : Local<Value> parent, AsyncHooksWrap* wrap,
88 : AsyncHooks* hooks);
89 :
90 : std::stack<AsyncContext> asyncContexts;
91 : async_id_t current_async_id;
92 : };
93 :
94 : } // namespace v8
95 :
96 : #endif // V8_ASYNC_HOOKS_WRAPPER_H_
|