Skip to content

Commit cd07235

Browse files
committed
fixup! src: name EmbededderGraph edges and use class names for nodes
1 parent e18aafa commit cd07235

File tree

4 files changed

+41
-26
lines changed

4 files changed

+41
-26
lines changed

src/async_wrap.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,8 @@ class PromiseWrap : public AsyncWrap {
182182
}
183183

184184
SET_NO_MEMORY_INFO()
185-
SET_MEMORY_INFO_NAME(AsyncWrapObject);
186-
SET_SELF_SIZE(AsyncWrapObject)
185+
SET_MEMORY_INFO_NAME(PromiseWrap)
186+
SET_SELF_SIZE(PromiseWrap)
187187

188188
static constexpr int kPromiseField = 1;
189189
static constexpr int kIsChainedPromiseField = 2;

src/heap_utils.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,9 @@ void BuildEmbedderGraph(const FunctionCallbackInfo<Value>& args) {
193193
Environment* env = Environment::GetCurrent(args);
194194
JSGraph graph(env->isolate());
195195
Environment::BuildEmbedderGraph(env->isolate(), &graph, env);
196-
// Crash if we cannot build a proper graph
197-
args.GetReturnValue().Set(graph.CreateObject().ToLocalChecked());
196+
Local<Array> ret;
197+
if (graph.CreateObject().ToLocal(&ret))
198+
args.GetReturnValue().Set(ret);
198199
}
199200

200201

src/memory_tracker-inl.h

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,20 @@
55

66
#include "memory_tracker.h"
77

8-
#define DEFAULT_NODE_NAME \
9-
(node_name == nullptr ? (edge_name == nullptr ? "" : edge_name) : node_name)
10-
118
namespace node {
129

10+
// Fallback edge_name if node_name is not available, or "" if edge_name
11+
// is not available either.
12+
inline const char* GetNodeName(const char* node_name, const char* edge_name) {
13+
if (node_name != nullptr) {
14+
return node_name;
15+
}
16+
if (edge_name != nullptr) {
17+
return edge_name;
18+
}
19+
return "";
20+
}
21+
1322
class MemoryRetainerNode : public v8::EmbedderGraph::Node {
1423
public:
1524
explicit inline MemoryRetainerNode(MemoryTracker* tracker,
@@ -69,8 +78,7 @@ class MemoryRetainerNode : public v8::EmbedderGraph::Node {
6978
void MemoryTracker::TrackFieldWithSize(const char* edge_name,
7079
size_t size,
7180
const char* node_name) {
72-
if (size > 0)
73-
AddNode(DEFAULT_NODE_NAME, size, edge_name);
81+
if (size > 0) AddNode(GetNodeName(node_name, edge_name), size, edge_name);
7482
}
7583

7684
void MemoryTracker::TrackField(const char* edge_name,
@@ -105,16 +113,17 @@ template <typename T, typename Iterator>
105113
void MemoryTracker::TrackField(const char* edge_name,
106114
const T& value,
107115
const char* node_name,
108-
const char* element_name) {
116+
const char* element_name,
117+
bool subtract_from_self) {
109118
// If the container is empty, the size has been accounted into the parent's
110119
// self size
111120
if (value.begin() == value.end()) return;
112121
// Fall back to edge name if node names are not provided
113-
if (CurrentNode() != nullptr) {
122+
if (CurrentNode() != nullptr && subtract_from_self) {
114123
// Shift the self size of this container out to a separate node
115124
CurrentNode()->size_ -= sizeof(T);
116125
}
117-
PushNode(DEFAULT_NODE_NAME, sizeof(T), edge_name);
126+
PushNode(GetNodeName(node_name, edge_name), sizeof(T), edge_name);
118127
for (Iterator it = value.begin(); it != value.end(); ++it) {
119128
// Use nullptr as edge names so the elements appear as indexed properties
120129
TrackField(nullptr, *it, element_name);
@@ -239,14 +248,12 @@ MemoryRetainerNode* MemoryTracker::CurrentNode() const {
239248

240249
MemoryRetainerNode* MemoryTracker::AddNode(const MemoryRetainer* retainer,
241250
const char* edge_name) {
242-
MemoryRetainerNode* n;
243251
auto it = seen_.find(retainer);
244252
if (it != seen_.end()) {
245-
n = it->second;
246-
return n;
253+
return it->second;
247254
}
248255

249-
n = new MemoryRetainerNode(this, retainer);
256+
MemoryRetainerNode* n = new MemoryRetainerNode(this, retainer);
250257
graph_->AddNode(std::unique_ptr<v8::EmbedderGraph::Node>(n));
251258
seen_[retainer] = n;
252259
if (CurrentNode() != nullptr) graph_->AddEdge(CurrentNode(), n, edge_name);

src/memory_tracker.h

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include "aliased_buffer.h"
1313
#include "v8-profiler.h"
1414

15+
namespace node {
16+
1517
// Set the node name of a MemoryRetainer to klass
1618
#define SET_MEMORY_INFO_NAME(Klass) \
1719
inline std::string MemoryInfoName() const override { return #Klass; }
@@ -25,8 +27,6 @@
2527
#define SET_NO_MEMORY_INFO() \
2628
inline void MemoryInfo(node::MemoryTracker* tracker) const override {}
2729

28-
namespace node {
29-
3030
class MemoryTracker;
3131
class MemoryRetainerNode;
3232

@@ -43,16 +43,16 @@ class NodeBIO;
4343
* void MemoryInfo(MemoryTracker* tracker) const override {
4444
* // Node name and size comes from the MemoryInfoName and SelfSize of
4545
* // AnotherRetainerClass
46-
* tracker->TrackField("another_retainer", this->another_retainer);
46+
* tracker->TrackField("another_retainer", another_retainer);
4747
* // Specify node name and size explicitly
4848
* tracker->TrackFieldWithSize("internal_member",
49-
* this->internal_member.size(),
49+
* internal_member.size(),
5050
* "InternalClass");
5151
* // Node name falls back to the edge name,
5252
* // elements in the container appear as grandchildren nodes
53-
* tracker->TrackField("vector", this->vector_field);
53+
* tracker->TrackField("vector", vector);
5454
* // Node name and size come from the JS object
55-
* tracker->TrackField("target", this->target);
55+
* tracker->TrackField("target", target);
5656
* }
5757
*
5858
* // Or use SET_MEMORY_INFO_NAME(ExampleRetainer)
@@ -69,12 +69,12 @@ class NodeBIO;
6969
* // a BaseObject or an AsyncWrap class
7070
* bool IsRootNode() const override { return !wrapped.IsWeak(); }
7171
* v8::Local<v8::Object> WrappedObject() const override {
72-
* return node::PersistentToLocal(this->wrapped);
72+
* return node::PersistentToLocal(wrapped);
7373
* }
7474
* private:
7575
* AnotherRetainerClass another_retainer;
7676
* InternalClass internal_member;
77-
* std::vector<int> vector;
77+
* std::vector<uv_async_t> vector;
7878
* node::Persistent<Object> target;
7979
*
8080
* node::Persistent<Object> wrapped;
@@ -84,7 +84,10 @@ class NodeBIO;
8484
* Node / ExampleRetainer
8585
* |> another_retainer :: Node / AnotherRetainerClass
8686
* |> internal_member :: Node / InternalClass
87-
* |> vector :: Node / vector
87+
* |> vector :: Node / vector (elements will be grandchildren)
88+
* |> [1] :: Node / uv_async_t (uv_async_t has predefined names)
89+
* |> [2] :: Node / uv_async_t
90+
* |> ...
8891
* |> target :: TargetClass (JS class name of the target object)
8992
* |> wrapped :: WrappedClass (JS class name of the wrapped object)
9093
* |> wrapper :: Node / ExampleRetainer (back reference)
@@ -123,12 +126,16 @@ class MemoryTracker {
123126

124127
// For containers, the elements will be graphed as grandchildren nodes
125128
// if the container is not empty.
129+
// By default, we assume the parent count the stack size of the container
130+
// into its SelfSize so that will be subtracted from the parent size when we
131+
// spin off a new node for the container.
126132
// TODO(joyeecheung): use RTTI to retrieve the class name at runtime?
127133
template <typename T, typename Iterator = typename T::const_iterator>
128134
inline void TrackField(const char* edge_name,
129135
const T& value,
130136
const char* node_name = nullptr,
131-
const char* element_name = nullptr);
137+
const char* element_name = nullptr,
138+
bool subtract_from_self = true);
132139
template <typename T>
133140
inline void TrackField(const char* edge_name,
134141
const std::queue<T>& value,

0 commit comments

Comments
 (0)