@@ -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" ));
@@ -2932,7 +2932,8 @@ class EmbedderRootNode : public EmbedderNode {
29322932// global object.
29332933v8::Local<v8::Value>* global_object_pointer;
29342934
2935- void BuildEmbedderGraph (v8::Isolate* v8_isolate, v8::EmbedderGraph* graph) {
2935+ void BuildEmbedderGraph (v8::Isolate* v8_isolate, v8::EmbedderGraph* graph,
2936+ void * data) {
29362937 using Node = v8::EmbedderGraph::Node;
29372938 Node* global_node = graph->V8Node (*global_object_pointer);
29382939 Node* embedder_node_A = graph->AddNode (
@@ -2979,12 +2980,92 @@ TEST(EmbedderGraph) {
29792980 (isolate->context ()->native_context ()->global_object ())));
29802981 global_object_pointer = &global_object;
29812982 v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
2982- heap_profiler->SetBuildEmbedderGraphCallback (BuildEmbedderGraph);
2983+ heap_profiler->AddBuildEmbedderGraphCallback (BuildEmbedderGraph, nullptr );
29832984 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
29842985 CHECK (ValidateSnapshot (snapshot));
29852986 CheckEmbedderGraphSnapshot (env->GetIsolate (), snapshot);
29862987}
29872988
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+
29883069TEST (StrongHandleAnnotation) {
29893070 LocalContext env;
29903071 v8::HandleScope scope (env->GetIsolate ());
@@ -3010,7 +3091,7 @@ TEST(StrongHandleAnnotation) {
30103091}
30113092
30123093void BuildEmbedderGraphWithWrapperNode (v8::Isolate* v8_isolate,
3013- v8::EmbedderGraph* graph) {
3094+ v8::EmbedderGraph* graph, void * data ) {
30143095 using Node = v8::EmbedderGraph::Node;
30153096 Node* global_node = graph->V8Node (*global_object_pointer);
30163097 Node* wrapper_node = graph->AddNode (
@@ -3041,8 +3122,8 @@ TEST(EmbedderGraphWithWrapperNode) {
30413122 (isolate->context ()->native_context ()->global_object ())));
30423123 global_object_pointer = &global_object;
30433124 v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
3044- heap_profiler->SetBuildEmbedderGraphCallback (
3045- BuildEmbedderGraphWithWrapperNode);
3125+ heap_profiler->AddBuildEmbedderGraphCallback (
3126+ BuildEmbedderGraphWithWrapperNode, nullptr );
30463127 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
30473128 CHECK (ValidateSnapshot (snapshot));
30483129 const v8::HeapGraphNode* global = GetGlobalObject (snapshot);
@@ -3080,7 +3161,7 @@ class EmbedderNodeWithPrefix : public v8::EmbedderGraph::Node {
30803161};
30813162
30823163void BuildEmbedderGraphWithPrefix (v8::Isolate* v8_isolate,
3083- v8::EmbedderGraph* graph) {
3164+ v8::EmbedderGraph* graph, void * data ) {
30843165 using Node = v8::EmbedderGraph::Node;
30853166 Node* global_node = graph->V8Node (*global_object_pointer);
30863167 Node* node = graph->AddNode (
@@ -3098,7 +3179,8 @@ TEST(EmbedderGraphWithPrefix) {
30983179 (isolate->context ()->native_context ()->global_object ())));
30993180 global_object_pointer = &global_object;
31003181 v8::HeapProfiler* heap_profiler = env->GetIsolate ()->GetHeapProfiler ();
3101- heap_profiler->SetBuildEmbedderGraphCallback (BuildEmbedderGraphWithPrefix);
3182+ heap_profiler->AddBuildEmbedderGraphCallback (BuildEmbedderGraphWithPrefix,
3183+ nullptr );
31023184 const v8::HeapSnapshot* snapshot = heap_profiler->TakeHeapSnapshot ();
31033185 CHECK (ValidateSnapshot (snapshot));
31043186 const v8::HeapGraphNode* global = GetGlobalObject (snapshot);
0 commit comments