@@ -1541,8 +1541,8 @@ class EmbedderGraphBuilder : public v8::PersistentHandleVisitor {
1541
1541
graph->AddNode (std::unique_ptr<Group>(new Group (" ccc-group" )));
1542
1542
}
1543
1543
1544
- static void BuildEmbedderGraph (v8::Isolate* isolate,
1545
- v8::EmbedderGraph* graph ) {
1544
+ static void BuildEmbedderGraph (v8::Isolate* isolate, v8::EmbedderGraph* graph,
1545
+ void * data ) {
1546
1546
EmbedderGraphBuilder builder (isolate, graph);
1547
1547
isolate->VisitHandlesWithClassIds (&builder);
1548
1548
}
@@ -1604,8 +1604,8 @@ TEST(HeapSnapshotRetainedObjectInfo) {
1604
1604
v8::HandleScope scope (isolate);
1605
1605
v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler ();
1606
1606
1607
- heap_profiler->SetBuildEmbedderGraphCallback (
1608
- EmbedderGraphBuilder::BuildEmbedderGraph);
1607
+ heap_profiler->AddBuildEmbedderGraphCallback (
1608
+ EmbedderGraphBuilder::BuildEmbedderGraph, nullptr );
1609
1609
v8::Persistent<v8::String> p_AAA (isolate, v8_str (" AAA" ));
1610
1610
p_AAA.SetWrapperClassId (1 );
1611
1611
v8::Persistent<v8::String> p_BBB (isolate, v8_str (" BBB" ));
@@ -2932,7 +2932,8 @@ class EmbedderRootNode : public EmbedderNode {
2932
2932
// global object.
2933
2933
v8::Local<v8::Value>* global_object_pointer;
2934
2934
2935
- void BuildEmbedderGraph (v8::Isolate* v8_isolate, v8::EmbedderGraph* graph) {
2935
+ void BuildEmbedderGraph (v8::Isolate* v8_isolate, v8::EmbedderGraph* graph,
2936
+ void * data) {
2936
2937
using Node = v8::EmbedderGraph::Node;
2937
2938
Node* global_node = graph->V8Node (*global_object_pointer);
2938
2939
Node* embedder_node_A = graph->AddNode (
@@ -2979,12 +2980,92 @@ TEST(EmbedderGraph) {
2979
2980
(isolate->context ()->native_context ()->global_object ())));
2980
2981
global_object_pointer = &global_object;
2981
2982
v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
2982
- heap_profiler->SetBuildEmbedderGraphCallback (BuildEmbedderGraph);
2983
+ heap_profiler->AddBuildEmbedderGraphCallback (BuildEmbedderGraph, nullptr );
2983
2984
const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
2984
2985
CHECK (ValidateSnapshot (snapshot));
2985
2986
CheckEmbedderGraphSnapshot (env->GetIsolate (), snapshot);
2986
2987
}
2987
2988
2989
+ struct GraphBuildingContext {
2990
+ int counter = 0 ;
2991
+ };
2992
+
2993
+ void CheckEmbedderGraphSnapshotWithContext (
2994
+ v8::Isolate* isolate, const v8::HeapSnapshot* snapshot,
2995
+ const GraphBuildingContext* context) {
2996
+ const v8::HeapGraphNode* global = GetGlobalObject (snapshot);
2997
+ CHECK_GE (context->counter , 1 );
2998
+ CHECK_LE (context->counter , 2 );
2999
+
3000
+ const v8::HeapGraphNode* embedder_node_A =
3001
+ GetChildByName (global, " EmbedderNodeA" );
3002
+ CHECK_EQ (10 , GetSize (embedder_node_A));
3003
+
3004
+ const v8::HeapGraphNode* embedder_node_B =
3005
+ GetChildByName (global, " EmbedderNodeB" );
3006
+ if (context->counter == 2 ) {
3007
+ CHECK_NOT_NULL (embedder_node_B);
3008
+ CHECK_EQ (20 , GetSize (embedder_node_B));
3009
+ } else {
3010
+ CHECK_NULL (embedder_node_B);
3011
+ }
3012
+ }
3013
+
3014
+ void BuildEmbedderGraphWithContext (v8::Isolate* v8_isolate,
3015
+ v8::EmbedderGraph* graph, void * data) {
3016
+ using Node = v8::EmbedderGraph::Node;
3017
+ GraphBuildingContext* context = static_cast <GraphBuildingContext*>(data);
3018
+ Node* global_node = graph->V8Node (*global_object_pointer);
3019
+
3020
+ CHECK_GE (context->counter , 0 );
3021
+ CHECK_LE (context->counter , 1 );
3022
+ switch (context->counter ++) {
3023
+ case 0 : {
3024
+ Node* embedder_node_A = graph->AddNode (
3025
+ std::unique_ptr<Node>(new EmbedderNode (" EmbedderNodeA" , 10 )));
3026
+ graph->AddEdge (global_node, embedder_node_A);
3027
+ break ;
3028
+ }
3029
+ case 1 : {
3030
+ Node* embedder_node_B = graph->AddNode (
3031
+ std::unique_ptr<Node>(new EmbedderNode (" EmbedderNodeB" , 20 )));
3032
+ graph->AddEdge (global_node, embedder_node_B);
3033
+ break ;
3034
+ }
3035
+ }
3036
+ }
3037
+
3038
+ TEST (EmbedderGraphMultipleCallbacks) {
3039
+ i::FLAG_heap_profiler_use_embedder_graph = true ;
3040
+ LocalContext env;
3041
+ v8::HandleScope scope (env->GetIsolate ());
3042
+ i::Isolate* isolate = reinterpret_cast <i::Isolate*>(env->GetIsolate ());
3043
+ v8::Local<v8::Value> global_object =
3044
+ v8::Utils::ToLocal (i::Handle <i::JSObject>(
3045
+ (isolate->context ()->native_context ()->global_object ())));
3046
+ global_object_pointer = &global_object;
3047
+ v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
3048
+ GraphBuildingContext context;
3049
+
3050
+ heap_profiler->AddBuildEmbedderGraphCallback (BuildEmbedderGraphWithContext,
3051
+ &context);
3052
+ heap_profiler->AddBuildEmbedderGraphCallback (BuildEmbedderGraphWithContext,
3053
+ &context);
3054
+ const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
3055
+ CHECK_EQ (context.counter , 2 );
3056
+ CHECK (ValidateSnapshot (snapshot));
3057
+ CheckEmbedderGraphSnapshotWithContext (env->GetIsolate (), snapshot, &context);
3058
+
3059
+ heap_profiler->RemoveBuildEmbedderGraphCallback (BuildEmbedderGraphWithContext,
3060
+ &context);
3061
+ context.counter = 0 ;
3062
+
3063
+ snapshot = heap_profiler->TakeHeapSnapshot ();
3064
+ CHECK_EQ (context.counter , 1 );
3065
+ CHECK (ValidateSnapshot (snapshot));
3066
+ CheckEmbedderGraphSnapshotWithContext (env->GetIsolate (), snapshot, &context);
3067
+ }
3068
+
2988
3069
TEST (StrongHandleAnnotation) {
2989
3070
LocalContext env;
2990
3071
v8::HandleScope scope (env->GetIsolate ());
@@ -3010,7 +3091,7 @@ TEST(StrongHandleAnnotation) {
3010
3091
}
3011
3092
3012
3093
void BuildEmbedderGraphWithWrapperNode (v8::Isolate* v8_isolate,
3013
- v8::EmbedderGraph* graph) {
3094
+ v8::EmbedderGraph* graph, void * data ) {
3014
3095
using Node = v8::EmbedderGraph::Node;
3015
3096
Node* global_node = graph->V8Node (*global_object_pointer);
3016
3097
Node* wrapper_node = graph->AddNode (
@@ -3041,8 +3122,8 @@ TEST(EmbedderGraphWithWrapperNode) {
3041
3122
(isolate->context ()->native_context ()->global_object ())));
3042
3123
global_object_pointer = &global_object;
3043
3124
v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
3044
- heap_profiler->SetBuildEmbedderGraphCallback (
3045
- BuildEmbedderGraphWithWrapperNode);
3125
+ heap_profiler->AddBuildEmbedderGraphCallback (
3126
+ BuildEmbedderGraphWithWrapperNode, nullptr );
3046
3127
const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
3047
3128
CHECK (ValidateSnapshot (snapshot));
3048
3129
const v8::HeapGraphNode* global = GetGlobalObject (snapshot);
@@ -3080,7 +3161,7 @@ class EmbedderNodeWithPrefix : public v8::EmbedderGraph::Node {
3080
3161
};
3081
3162
3082
3163
void BuildEmbedderGraphWithPrefix (v8::Isolate* v8_isolate,
3083
- v8::EmbedderGraph* graph) {
3164
+ v8::EmbedderGraph* graph, void * data ) {
3084
3165
using Node = v8::EmbedderGraph::Node;
3085
3166
Node* global_node = graph->V8Node (*global_object_pointer);
3086
3167
Node* node = graph->AddNode (
@@ -3098,7 +3179,8 @@ TEST(EmbedderGraphWithPrefix) {
3098
3179
(isolate->context ()->native_context ()->global_object ())));
3099
3180
global_object_pointer = &global_object;
3100
3181
v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
3101
- heap_profiler->SetBuildEmbedderGraphCallback (BuildEmbedderGraphWithPrefix);
3182
+ heap_profiler->AddBuildEmbedderGraphCallback (BuildEmbedderGraphWithPrefix,
3183
+ nullptr );
3102
3184
const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
3103
3185
CHECK (ValidateSnapshot (snapshot));
3104
3186
const v8::HeapGraphNode* global = GetGlobalObject (snapshot);
0 commit comments