Skip to content

Commit 4f24256

Browse files
addaleaxrvagg
authored andcommitted
deps: cherry-pick 555c811 from upstream V8
Original commit message: [api] Switch from `SetBuildEmbedderGraphCallback` to `AddBuildEmbedderGraphCallback` `SetBuildEmbedderGraphCallback`, unlike `SetWrapperClassInfoProvider`, assumes a monolithic embedder that can provide all necessary information. That is not the case for e.g. Node.js, which can e.g. provide multiple Node.js instances per V8 Isolate, as well as native addons that may allocate resources on their own. Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng Change-Id: Ib53dfde82416dd69934b08623e27d674a483ac2d Reviewed-on: https://chromium-review.googlesource.com/1082441 Commit-Queue: Ulan Degenbaev <[email protected]> Reviewed-by: Ulan Degenbaev <[email protected]> Reviewed-by: Yang Guo <[email protected]> Cr-Commit-Position: refs/heads/master@{#53545} Refs: v8/v8@555c811 Backport-PR-URL: #21668 PR-URL: #21741 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Refael Ackermann <[email protected]>
1 parent 7b4272a commit 4f24256

File tree

6 files changed

+152
-31
lines changed

6 files changed

+152
-31
lines changed

common.gypi

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030
# Reset this number to 0 on major V8 upgrades.
3131
# Increment by one for each non-official patch applied to deps/v8.
32-
'v8_embedder_string': '-node.7',
32+
'v8_embedder_string': '-node.8',
3333

3434
# Enable disassembler for `--print-code` v8 options
3535
'v8_enable_disassembler': 1,

deps/v8/include/v8-profiler.h

+17-5
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,7 @@ class V8_EXPORT AllocationProfile {
640640
* Usage:
641641
* 1) Define derived class of EmbedderGraph::Node for embedder objects.
642642
* 2) Set the build embedder graph callback on the heap profiler using
643-
* HeapProfiler::SetBuildEmbedderGraphCallback.
643+
* HeapProfiler::AddBuildEmbedderGraphCallback.
644644
* 3) In the callback use graph->AddEdge(node1, node2) to add an edge from
645645
* node1 to node2.
646646
* 4) To represent references from/to V8 object, construct V8 nodes using
@@ -740,7 +740,12 @@ class V8_EXPORT HeapProfiler {
740740
* The callback must not trigger garbage collection in V8.
741741
*/
742742
typedef void (*BuildEmbedderGraphCallback)(v8::Isolate* isolate,
743-
v8::EmbedderGraph* graph);
743+
v8::EmbedderGraph* graph,
744+
void* data);
745+
746+
/** TODO(addaleax): Remove */
747+
typedef void (*LegacyBuildEmbedderGraphCallback)(v8::Isolate* isolate,
748+
v8::EmbedderGraph* graph);
744749

745750
/** Returns the number of snapshots taken. */
746751
int GetSnapshotCount();
@@ -882,15 +887,22 @@ class V8_EXPORT HeapProfiler {
882887

883888
/** Binds a callback to embedder's class ID. */
884889
V8_DEPRECATED(
885-
"Use SetBuildEmbedderGraphCallback to provide info about embedder nodes",
890+
"Use AddBuildEmbedderGraphCallback to provide info about embedder nodes",
886891
void SetWrapperClassInfoProvider(uint16_t class_id,
887892
WrapperInfoCallback callback));
888893

889894
V8_DEPRECATED(
890-
"Use SetBuildEmbedderGraphCallback to provide info about embedder nodes",
895+
"Use AddBuildEmbedderGraphCallback to provide info about embedder nodes",
891896
void SetGetRetainerInfosCallback(GetRetainerInfosCallback callback));
892897

893-
void SetBuildEmbedderGraphCallback(BuildEmbedderGraphCallback callback);
898+
V8_DEPRECATE_SOON(
899+
"Use AddBuildEmbedderGraphCallback to provide info about embedder nodes",
900+
void SetBuildEmbedderGraphCallback(
901+
LegacyBuildEmbedderGraphCallback callback));
902+
void AddBuildEmbedderGraphCallback(BuildEmbedderGraphCallback callback,
903+
void* data);
904+
void RemoveBuildEmbedderGraphCallback(BuildEmbedderGraphCallback callback,
905+
void* data);
894906

895907
/**
896908
* Default value of persistent handle class ID. Must not be used to

deps/v8/src/api.cc

+19-3
Original file line numberDiff line numberDiff line change
@@ -10451,9 +10451,25 @@ void HeapProfiler::SetGetRetainerInfosCallback(
1045110451
}
1045210452

1045310453
void HeapProfiler::SetBuildEmbedderGraphCallback(
10454-
BuildEmbedderGraphCallback callback) {
10455-
reinterpret_cast<i::HeapProfiler*>(this)->SetBuildEmbedderGraphCallback(
10456-
callback);
10454+
LegacyBuildEmbedderGraphCallback callback) {
10455+
reinterpret_cast<i::HeapProfiler*>(this)->AddBuildEmbedderGraphCallback(
10456+
[](v8::Isolate* isolate, v8::EmbedderGraph* graph, void* data) {
10457+
reinterpret_cast<LegacyBuildEmbedderGraphCallback>(data)(isolate,
10458+
graph);
10459+
},
10460+
reinterpret_cast<void*>(callback));
10461+
}
10462+
10463+
void HeapProfiler::AddBuildEmbedderGraphCallback(
10464+
BuildEmbedderGraphCallback callback, void* data) {
10465+
reinterpret_cast<i::HeapProfiler*>(this)->AddBuildEmbedderGraphCallback(
10466+
callback, data);
10467+
}
10468+
10469+
void HeapProfiler::RemoveBuildEmbedderGraphCallback(
10470+
BuildEmbedderGraphCallback callback, void* data) {
10471+
reinterpret_cast<i::HeapProfiler*>(this)->RemoveBuildEmbedderGraphCallback(
10472+
callback, data);
1045710473
}
1045810474

1045910475
v8::Testing::StressType internal::Testing::stress_type_ =

deps/v8/src/profiler/heap-profiler.cc

+15-6
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,25 @@ v8::HeapProfiler::RetainerInfos HeapProfiler::GetRetainerInfos(
6969
return infos;
7070
}
7171

72-
void HeapProfiler::SetBuildEmbedderGraphCallback(
73-
v8::HeapProfiler::BuildEmbedderGraphCallback callback) {
74-
build_embedder_graph_callback_ = callback;
72+
void HeapProfiler::AddBuildEmbedderGraphCallback(
73+
v8::HeapProfiler::BuildEmbedderGraphCallback callback, void* data) {
74+
build_embedder_graph_callbacks_.push_back({callback, data});
75+
}
76+
77+
void HeapProfiler::RemoveBuildEmbedderGraphCallback(
78+
v8::HeapProfiler::BuildEmbedderGraphCallback callback, void* data) {
79+
auto it = std::find(build_embedder_graph_callbacks_.begin(),
80+
build_embedder_graph_callbacks_.end(),
81+
std::make_pair(callback, data));
82+
if (it != build_embedder_graph_callbacks_.end())
83+
build_embedder_graph_callbacks_.erase(it);
7584
}
7685

7786
void HeapProfiler::BuildEmbedderGraph(Isolate* isolate,
7887
v8::EmbedderGraph* graph) {
79-
if (build_embedder_graph_callback_ != nullptr)
80-
build_embedder_graph_callback_(reinterpret_cast<v8::Isolate*>(isolate),
81-
graph);
88+
for (const auto& cb : build_embedder_graph_callbacks_) {
89+
cb.first(reinterpret_cast<v8::Isolate*>(isolate), graph, cb.second);
90+
}
8291
}
8392

8493
HeapSnapshot* HeapProfiler::TakeSnapshot(

deps/v8/src/profiler/heap-profiler.h

+7-5
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,13 @@ class HeapProfiler : public HeapObjectAllocationTracker {
7171
v8::HeapProfiler::GetRetainerInfosCallback callback);
7272
v8::HeapProfiler::RetainerInfos GetRetainerInfos(Isolate* isolate);
7373

74-
void SetBuildEmbedderGraphCallback(
75-
v8::HeapProfiler::BuildEmbedderGraphCallback callback);
74+
void AddBuildEmbedderGraphCallback(
75+
v8::HeapProfiler::BuildEmbedderGraphCallback callback, void* data);
76+
void RemoveBuildEmbedderGraphCallback(
77+
v8::HeapProfiler::BuildEmbedderGraphCallback callback, void* data);
7678
void BuildEmbedderGraph(Isolate* isolate, v8::EmbedderGraph* graph);
7779
bool HasBuildEmbedderGraphCallback() {
78-
return build_embedder_graph_callback_ != nullptr;
80+
return !build_embedder_graph_callbacks_.empty();
7981
}
8082

8183
bool is_tracking_object_moves() const { return is_tracking_object_moves_; }
@@ -103,8 +105,8 @@ class HeapProfiler : public HeapObjectAllocationTracker {
103105
std::unique_ptr<SamplingHeapProfiler> sampling_heap_profiler_;
104106
v8::HeapProfiler::GetRetainerInfosCallback get_retainer_infos_callback_ =
105107
nullptr;
106-
v8::HeapProfiler::BuildEmbedderGraphCallback build_embedder_graph_callback_ =
107-
nullptr;
108+
std::vector<std::pair<v8::HeapProfiler::BuildEmbedderGraphCallback, void*>>
109+
build_embedder_graph_callbacks_;
108110

109111
DISALLOW_COPY_AND_ASSIGN(HeapProfiler);
110112
};

deps/v8/test/cctest/test-heap-profiler.cc

+93-11
Original file line numberDiff line numberDiff line change
@@ -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.
29332933
v8::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+
29883069
TEST(StrongHandleAnnotation) {
29893070
LocalContext env;
29903071
v8::HandleScope scope(env->GetIsolate());
@@ -3010,7 +3091,7 @@ TEST(StrongHandleAnnotation) {
30103091
}
30113092

30123093
void 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

30823163
void 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

Comments
 (0)