Skip to content

Commit 355c5e3

Browse files
addaleaxtargos
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 PR-URL: #21741 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Refael Ackermann <[email protected]>
1 parent d42dbde commit 355c5e3

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
@@ -28,7 +28,7 @@
2828

2929
# Reset this number to 0 on major V8 upgrades.
3030
# Increment by one for each non-official patch applied to deps/v8.
31-
'v8_embedder_string': '-node.14',
31+
'v8_embedder_string': '-node.15',
3232

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

deps/v8/include/v8-profiler.h

+17-5
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ class V8_EXPORT AllocationProfile {
636636
* Usage:
637637
* 1) Define derived class of EmbedderGraph::Node for embedder objects.
638638
* 2) Set the build embedder graph callback on the heap profiler using
639-
* HeapProfiler::SetBuildEmbedderGraphCallback.
639+
* HeapProfiler::AddBuildEmbedderGraphCallback.
640640
* 3) In the callback use graph->AddEdge(node1, node2) to add an edge from
641641
* node1 to node2.
642642
* 4) To represent references from/to V8 object, construct V8 nodes using
@@ -736,7 +736,12 @@ class V8_EXPORT HeapProfiler {
736736
* The callback must not trigger garbage collection in V8.
737737
*/
738738
typedef void (*BuildEmbedderGraphCallback)(v8::Isolate* isolate,
739-
v8::EmbedderGraph* graph);
739+
v8::EmbedderGraph* graph,
740+
void* data);
741+
742+
/** TODO(addaleax): Remove */
743+
typedef void (*LegacyBuildEmbedderGraphCallback)(v8::Isolate* isolate,
744+
v8::EmbedderGraph* graph);
740745

741746
/** Returns the number of snapshots taken. */
742747
int GetSnapshotCount();
@@ -878,15 +883,22 @@ class V8_EXPORT HeapProfiler {
878883

879884
/** Binds a callback to embedder's class ID. */
880885
V8_DEPRECATED(
881-
"Use SetBuildEmbedderGraphCallback to provide info about embedder nodes",
886+
"Use AddBuildEmbedderGraphCallback to provide info about embedder nodes",
882887
void SetWrapperClassInfoProvider(uint16_t class_id,
883888
WrapperInfoCallback callback));
884889

885890
V8_DEPRECATED(
886-
"Use SetBuildEmbedderGraphCallback to provide info about embedder nodes",
891+
"Use AddBuildEmbedderGraphCallback to provide info about embedder nodes",
887892
void SetGetRetainerInfosCallback(GetRetainerInfosCallback callback));
888893

889-
void SetBuildEmbedderGraphCallback(BuildEmbedderGraphCallback callback);
894+
V8_DEPRECATE_SOON(
895+
"Use AddBuildEmbedderGraphCallback to provide info about embedder nodes",
896+
void SetBuildEmbedderGraphCallback(
897+
LegacyBuildEmbedderGraphCallback callback));
898+
void AddBuildEmbedderGraphCallback(BuildEmbedderGraphCallback callback,
899+
void* data);
900+
void RemoveBuildEmbedderGraphCallback(BuildEmbedderGraphCallback callback,
901+
void* data);
890902

891903
/**
892904
* 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
@@ -10558,9 +10558,25 @@ void HeapProfiler::SetGetRetainerInfosCallback(
1055810558
}
1055910559

1056010560
void HeapProfiler::SetBuildEmbedderGraphCallback(
10561-
BuildEmbedderGraphCallback callback) {
10562-
reinterpret_cast<i::HeapProfiler*>(this)->SetBuildEmbedderGraphCallback(
10563-
callback);
10561+
LegacyBuildEmbedderGraphCallback callback) {
10562+
reinterpret_cast<i::HeapProfiler*>(this)->AddBuildEmbedderGraphCallback(
10563+
[](v8::Isolate* isolate, v8::EmbedderGraph* graph, void* data) {
10564+
reinterpret_cast<LegacyBuildEmbedderGraphCallback>(data)(isolate,
10565+
graph);
10566+
},
10567+
reinterpret_cast<void*>(callback));
10568+
}
10569+
10570+
void HeapProfiler::AddBuildEmbedderGraphCallback(
10571+
BuildEmbedderGraphCallback callback, void* data) {
10572+
reinterpret_cast<i::HeapProfiler*>(this)->AddBuildEmbedderGraphCallback(
10573+
callback, data);
10574+
}
10575+
10576+
void HeapProfiler::RemoveBuildEmbedderGraphCallback(
10577+
BuildEmbedderGraphCallback callback, void* data) {
10578+
reinterpret_cast<i::HeapProfiler*>(this)->RemoveBuildEmbedderGraphCallback(
10579+
callback, data);
1056410580
}
1056510581

1056610582
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)