@@ -1541,8 +1541,8 @@ class EmbedderGraphBuilder : public v8::PersistentHandleVisitor {
15411541 graph->AddNode (std::unique_ptr<Group>(new Group (" ccc-group" )));
15421542 }
15431543
1544- static void BuildEmbedderGraph (v8::Isolate* isolate,
1545- v8::EmbedderGraph* graph ) {
1544+ static void BuildEmbedderGraph (v8::Isolate* isolate, v8::EmbedderGraph* graph,
1545+ void * data ) {
15461546 EmbedderGraphBuilder builder (isolate, graph);
15471547 isolate->VisitHandlesWithClassIds (&builder);
15481548 }
@@ -1604,8 +1604,8 @@ TEST(HeapSnapshotRetainedObjectInfo) {
16041604 v8::HandleScope scope (isolate);
16051605 v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler ();
16061606
1607- heap_profiler->SetBuildEmbedderGraphCallback (
1608- EmbedderGraphBuilder::BuildEmbedderGraph);
1607+ heap_profiler->AddBuildEmbedderGraphCallback (
1608+ EmbedderGraphBuilder::BuildEmbedderGraph, nullptr );
16091609 v8::Persistent<v8::String> p_AAA (isolate, v8_str (" AAA" ));
16101610 p_AAA.SetWrapperClassId (1 );
16111611 v8::Persistent<v8::String> p_BBB (isolate, v8_str (" BBB" ));
@@ -2928,7 +2928,8 @@ class EmbedderRootNode : public EmbedderNode {
29282928// global object.
29292929v8::Local<v8::Value>* global_object_pointer;
29302930
2931- void BuildEmbedderGraph (v8::Isolate* v8_isolate, v8::EmbedderGraph* graph) {
2931+ void BuildEmbedderGraph (v8::Isolate* v8_isolate, v8::EmbedderGraph* graph,
2932+ void * data) {
29322933 using Node = v8::EmbedderGraph::Node;
29332934 Node* global_node = graph->V8Node (*global_object_pointer);
29342935 Node* embedder_node_A = graph->AddNode (
@@ -2975,12 +2976,92 @@ TEST(EmbedderGraph) {
29752976 (isolate->context ()->native_context ()->global_object ())));
29762977 global_object_pointer = &global_object;
29772978 v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
2978- heap_profiler->SetBuildEmbedderGraphCallback (BuildEmbedderGraph);
2979+ heap_profiler->AddBuildEmbedderGraphCallback (BuildEmbedderGraph, nullptr );
29792980 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
29802981 CHECK (ValidateSnapshot (snapshot));
29812982 CheckEmbedderGraphSnapshot (env->GetIsolate (), snapshot);
29822983}
29832984
2985+ struct GraphBuildingContext {
2986+ int counter = 0 ;
2987+ };
2988+
2989+ void CheckEmbedderGraphSnapshotWithContext (
2990+ v8::Isolate* isolate, const v8::HeapSnapshot* snapshot,
2991+ const GraphBuildingContext* context) {
2992+ const v8::HeapGraphNode* global = GetGlobalObject (snapshot);
2993+ CHECK_GE (context->counter , 1 );
2994+ CHECK_LE (context->counter , 2 );
2995+
2996+ const v8::HeapGraphNode* embedder_node_A =
2997+ GetChildByName (global, " EmbedderNodeA" );
2998+ CHECK_EQ (10 , GetSize (embedder_node_A));
2999+
3000+ const v8::HeapGraphNode* embedder_node_B =
3001+ GetChildByName (global, " EmbedderNodeB" );
3002+ if (context->counter == 2 ) {
3003+ CHECK_NOT_NULL (embedder_node_B);
3004+ CHECK_EQ (20 , GetSize (embedder_node_B));
3005+ } else {
3006+ CHECK_NULL (embedder_node_B);
3007+ }
3008+ }
3009+
3010+ void BuildEmbedderGraphWithContext (v8::Isolate* v8_isolate,
3011+ v8::EmbedderGraph* graph, void * data) {
3012+ using Node = v8::EmbedderGraph::Node;
3013+ GraphBuildingContext* context = static_cast <GraphBuildingContext*>(data);
3014+ Node* global_node = graph->V8Node (*global_object_pointer);
3015+
3016+ CHECK_GE (context->counter , 0 );
3017+ CHECK_LE (context->counter , 1 );
3018+ switch (context->counter ++) {
3019+ case 0 : {
3020+ Node* embedder_node_A = graph->AddNode (
3021+ std::unique_ptr<Node>(new EmbedderNode (" EmbedderNodeA" , 10 )));
3022+ graph->AddEdge (global_node, embedder_node_A);
3023+ break ;
3024+ }
3025+ case 1 : {
3026+ Node* embedder_node_B = graph->AddNode (
3027+ std::unique_ptr<Node>(new EmbedderNode (" EmbedderNodeB" , 20 )));
3028+ graph->AddEdge (global_node, embedder_node_B);
3029+ break ;
3030+ }
3031+ }
3032+ }
3033+
3034+ TEST (EmbedderGraphMultipleCallbacks) {
3035+ i::FLAG_heap_profiler_use_embedder_graph = true ;
3036+ LocalContext env;
3037+ v8::HandleScope scope (env->GetIsolate ());
3038+ i::Isolate* isolate = reinterpret_cast <i::Isolate*>(env->GetIsolate ());
3039+ v8::Local<v8::Value> global_object =
3040+ v8::Utils::ToLocal (i::Handle<i::JSObject>(
3041+ (isolate->context ()->native_context ()->global_object ())));
3042+ global_object_pointer = &global_object;
3043+ v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
3044+ GraphBuildingContext context;
3045+
3046+ heap_profiler->AddBuildEmbedderGraphCallback (BuildEmbedderGraphWithContext,
3047+ &context);
3048+ heap_profiler->AddBuildEmbedderGraphCallback (BuildEmbedderGraphWithContext,
3049+ &context);
3050+ const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
3051+ CHECK_EQ (context.counter , 2 );
3052+ CHECK (ValidateSnapshot (snapshot));
3053+ CheckEmbedderGraphSnapshotWithContext (env->GetIsolate (), snapshot, &context);
3054+
3055+ heap_profiler->RemoveBuildEmbedderGraphCallback (BuildEmbedderGraphWithContext,
3056+ &context);
3057+ context.counter = 0 ;
3058+
3059+ snapshot = heap_profiler->TakeHeapSnapshot ();
3060+ CHECK_EQ (context.counter , 1 );
3061+ CHECK (ValidateSnapshot (snapshot));
3062+ CheckEmbedderGraphSnapshotWithContext (env->GetIsolate (), snapshot, &context);
3063+ }
3064+
29843065TEST (StrongHandleAnnotation) {
29853066 LocalContext env;
29863067 v8::HandleScope scope (env->GetIsolate ());
@@ -3006,7 +3087,7 @@ TEST(StrongHandleAnnotation) {
30063087}
30073088
30083089void BuildEmbedderGraphWithWrapperNode (v8::Isolate* v8_isolate,
3009- v8::EmbedderGraph* graph) {
3090+ v8::EmbedderGraph* graph, void * data ) {
30103091 using Node = v8::EmbedderGraph::Node;
30113092 Node* global_node = graph->V8Node (*global_object_pointer);
30123093 Node* wrapper_node = graph->AddNode (
@@ -3037,8 +3118,8 @@ TEST(EmbedderGraphWithWrapperNode) {
30373118 (isolate->context ()->native_context ()->global_object ())));
30383119 global_object_pointer = &global_object;
30393120 v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
3040- heap_profiler->SetBuildEmbedderGraphCallback (
3041- BuildEmbedderGraphWithWrapperNode);
3121+ heap_profiler->AddBuildEmbedderGraphCallback (
3122+ BuildEmbedderGraphWithWrapperNode, nullptr );
30423123 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
30433124 CHECK (ValidateSnapshot (snapshot));
30443125 const v8::HeapGraphNode* global = GetGlobalObject (snapshot);
@@ -3076,7 +3157,7 @@ class EmbedderNodeWithPrefix : public v8::EmbedderGraph::Node {
30763157};
30773158
30783159void BuildEmbedderGraphWithPrefix (v8::Isolate* v8_isolate,
3079- v8::EmbedderGraph* graph) {
3160+ v8::EmbedderGraph* graph, void * data ) {
30803161 using Node = v8::EmbedderGraph::Node;
30813162 Node* global_node = graph->V8Node (*global_object_pointer);
30823163 Node* node = graph->AddNode (
@@ -3094,7 +3175,8 @@ TEST(EmbedderGraphWithPrefix) {
30943175 (isolate->context ()->native_context ()->global_object ())));
30953176 global_object_pointer = &global_object;
30963177 v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
3097- heap_profiler->SetBuildEmbedderGraphCallback (BuildEmbedderGraphWithPrefix);
3178+ heap_profiler->AddBuildEmbedderGraphCallback (BuildEmbedderGraphWithPrefix,
3179+ nullptr );
30983180 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
30993181 CHECK (ValidateSnapshot (snapshot));
31003182 const v8::HeapGraphNode* global = GetGlobalObject (snapshot);
0 commit comments