• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_D8_ASYNC_HOOKS_WRAPPER_H_
6 #define V8_D8_ASYNC_HOOKS_WRAPPER_H_
7 
8 #include <stack>
9 
10 #include "include/v8-function-callback.h"
11 #include "include/v8-local-handle.h"
12 #include "include/v8-promise.h"
13 #include "src/objects/objects.h"
14 
15 namespace v8 {
16 
17 class Function;
18 class Isolate;
19 class ObjectTemplate;
20 class Value;
21 
22 using async_id_t = double;
23 
24 struct AsyncContext {
25   async_id_t execution_async_id;
26   async_id_t trigger_async_id;
27 };
28 
29 class AsyncHooksWrap {
30  public:
AsyncHooksWrap(Isolate * isolate)31   explicit AsyncHooksWrap(Isolate* isolate)
32       : isolate_(isolate), enabled_(false) {}
33   void Enable();
34   void Disable();
IsEnabled()35   bool IsEnabled() const { return enabled_; }
36 
37   inline v8::Local<v8::Function> init_function() const;
38   inline void set_init_function(v8::Local<v8::Function> value);
39   inline v8::Local<v8::Function> before_function() const;
40   inline void set_before_function(v8::Local<v8::Function> value);
41   inline v8::Local<v8::Function> after_function() const;
42   inline void set_after_function(v8::Local<v8::Function> value);
43   inline v8::Local<v8::Function> promiseResolve_function() const;
44   inline void set_promiseResolve_function(v8::Local<v8::Function> value);
45 
46  private:
47   Isolate* isolate_;
48 
49   Persistent<v8::Function> init_function_;
50   Persistent<v8::Function> before_function_;
51   Persistent<v8::Function> after_function_;
52   Persistent<v8::Function> promiseResolve_function_;
53 
54   bool enabled_;
55 };
56 
57 class AsyncHooks {
58  public:
59   explicit AsyncHooks(Isolate* isolate);
60   ~AsyncHooks();
61 
62   async_id_t GetExecutionAsyncId() const;
63   async_id_t GetTriggerAsyncId() const;
64 
65   Local<Object> CreateHook(const v8::FunctionCallbackInfo<v8::Value>& args);
66 
67   Persistent<FunctionTemplate> async_hook_ctor;
68 
69  private:
70   base::RecursiveMutex async_wraps_mutex_;
71   std::vector<std::shared_ptr<AsyncHooksWrap>> async_wraps_;
72   Isolate* isolate_;
73   Persistent<ObjectTemplate> async_hooks_templ;
74   Persistent<Private> async_id_smb;
75   Persistent<Private> trigger_id_smb;
76 
77   static void ShellPromiseHook(PromiseHookType type, Local<Promise> promise,
78                                Local<Value> parent);
79   static void PromiseHookDispatch(PromiseHookType type, Local<Promise> promise,
80                                   Local<Value> parent,
81                                   const AsyncHooksWrap& wrap,
82                                   AsyncHooks* hooks);
83 
84   std::stack<AsyncContext> asyncContexts;
85   async_id_t current_async_id;
86 };
87 
88 }  // namespace v8
89 
90 #endif  // V8_D8_ASYNC_HOOKS_WRAPPER_H_
91