Skip to content

Commit 950ccee

Browse files
joyeecheungtargos
authored andcommitted
src: name EmbededderGraph edges and use class names for nodes
This patch: - Refactors the `MemoryRetainer` API so that the impementer no longer calls `TrackThis()` that sets the size of node on the top of the stack, which may be hard to understand. Instead now they implements `SelfSize()` to provide their self sizes. Also documents the API in the header. - Refactors `MemoryTracker` so it calls `MemoryInfoName()` and `SelfSize()` of `MemoryRetainer` to retrieve info about them, and separate `node_names` and `edge_names` so the edges can be properly named with reference names and the nodes can be named with class names. (Previously the nodes are named with reference names while the edges are all indexed and appear as array elements). - Adds `SET_MEMORY_INFO_NAME()`, `SET_SELF_SIZE()` and `SET_NO_MEMORY_INFO()` convenience macros - Fixes a few `MemoryInfo` calls in some `MemoryRetainers` to track their references properly. - Refactors the heapdump tests to check both node names and edge names, distinguishing between wrapped JS nodes (without prefixes) and embedder wrappers (prefixed with `Node / `). Backport-PR-URL: #23295 PR-URL: #23072 Reviewed-By: Anna Henningsen <[email protected]>
1 parent 390fc85 commit 950ccee

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+734
-507
lines changed

lib/internal/test/heap.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ function createJSHeapDump() {
3737
const fromNode = nodes[fromNodeIndex];
3838
const edge = {
3939
type,
40-
toNode,
41-
fromNode,
40+
to: toNode,
41+
from: fromNode,
4242
name: typeof name_or_index === 'string' ? name_or_index : null
4343
};
4444
toNode.incomingEdges.push(edge);

src/async_wrap.cc

+6-6
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ struct AsyncWrapObject : public AsyncWrap {
7272
inline AsyncWrapObject(Environment* env, Local<Object> object,
7373
ProviderType type) : AsyncWrap(env, object, type) {}
7474

75-
void MemoryInfo(MemoryTracker* tracker) const override {
76-
tracker->TrackThis(this);
77-
}
75+
SET_NO_MEMORY_INFO()
76+
SET_MEMORY_INFO_NAME(AsyncWrapObject)
77+
SET_SELF_SIZE(AsyncWrapObject)
7878
};
7979

8080

@@ -180,9 +180,9 @@ class PromiseWrap : public AsyncWrap {
180180
MakeWeak();
181181
}
182182

183-
void MemoryInfo(MemoryTracker* tracker) const override {
184-
tracker->TrackThis(this);
185-
}
183+
SET_NO_MEMORY_INFO()
184+
SET_MEMORY_INFO_NAME(PromiseWrap)
185+
SET_SELF_SIZE(PromiseWrap)
186186

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

src/base_object.h

-5
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,6 @@ namespace node {
3333

3434
class Environment;
3535

36-
#define ADD_MEMORY_INFO_NAME(name) \
37-
std::string MemoryInfoName() const override { \
38-
return #name; \
39-
}
40-
4136
class BaseObject : public MemoryRetainer {
4237
public:
4338
// Associates this object with `object`. It uses the 0th internal field for

src/cares_wrap.cc

+52-81
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,9 @@ struct node_ares_task : public MemoryRetainer {
127127
ares_socket_t sock;
128128
uv_poll_t poll_watcher;
129129

130-
void MemoryInfo(MemoryTracker* tracker) const override;
131-
ADD_MEMORY_INFO_NAME(node_ares_task)
130+
inline void MemoryInfo(MemoryTracker* tracker) const override;
131+
SET_MEMORY_INFO_NAME(node_ares_task)
132+
SET_SELF_SIZE(node_ares_task)
132133
};
133134

134135
struct TaskHash {
@@ -172,13 +173,13 @@ class ChannelWrap : public AsyncWrap {
172173
inline node_ares_task_list* task_list() { return &task_list_; }
173174

174175
void MemoryInfo(MemoryTracker* tracker) const override {
175-
tracker->TrackThis(this);
176176
if (timer_handle_ != nullptr)
177-
tracker->TrackFieldWithSize("timer handle", sizeof(*timer_handle_));
178-
tracker->TrackField("node_ares_task_list", task_list_);
177+
tracker->TrackField("timer_handle", *timer_handle_);
178+
tracker->TrackField("task_list", task_list_, "node_ares_task_list");
179179
}
180180

181-
ADD_MEMORY_INFO_NAME(ChannelWrap)
181+
SET_MEMORY_INFO_NAME(ChannelWrap)
182+
SET_SELF_SIZE(ChannelWrap)
182183

183184
static void AresTimeout(uv_timer_t* handle);
184185

@@ -192,11 +193,6 @@ class ChannelWrap : public AsyncWrap {
192193
node_ares_task_list task_list_;
193194
};
194195

195-
void node_ares_task::MemoryInfo(MemoryTracker* tracker) const {
196-
tracker->TrackThis(this);
197-
tracker->TrackField("channel", channel);
198-
}
199-
200196
ChannelWrap::ChannelWrap(Environment* env,
201197
Local<Object> object)
202198
: AsyncWrap(env, object, PROVIDER_DNSCHANNEL),
@@ -225,11 +221,9 @@ class GetAddrInfoReqWrap : public ReqWrap<uv_getaddrinfo_t> {
225221
Local<Object> req_wrap_obj,
226222
bool verbatim);
227223

228-
void MemoryInfo(MemoryTracker* tracker) const override {
229-
tracker->TrackThis(this);
230-
}
231-
232-
ADD_MEMORY_INFO_NAME(GetAddrInfoReqWrap)
224+
SET_NO_MEMORY_INFO()
225+
SET_MEMORY_INFO_NAME(GetAddrInfoReqWrap)
226+
SET_SELF_SIZE(GetAddrInfoReqWrap)
233227

234228
bool verbatim() const { return verbatim_; }
235229

@@ -249,11 +243,9 @@ class GetNameInfoReqWrap : public ReqWrap<uv_getnameinfo_t> {
249243
public:
250244
GetNameInfoReqWrap(Environment* env, Local<Object> req_wrap_obj);
251245

252-
void MemoryInfo(MemoryTracker* tracker) const override {
253-
tracker->TrackThis(this);
254-
}
255-
256-
ADD_MEMORY_INFO_NAME(GetNameInfoReqWrap)
246+
SET_NO_MEMORY_INFO()
247+
SET_MEMORY_INFO_NAME(GetNameInfoReqWrap)
248+
SET_SELF_SIZE(GetNameInfoReqWrap)
257249
};
258250

259251
GetNameInfoReqWrap::GetNameInfoReqWrap(Environment* env,
@@ -298,6 +290,9 @@ void ares_poll_close_cb(uv_poll_t* watcher) {
298290
delete task;
299291
}
300292

293+
void node_ares_task::MemoryInfo(MemoryTracker* tracker) const {
294+
tracker->TrackField("channel", channel);
295+
}
301296

302297
/* Allocates and returns a new node_ares_task */
303298
node_ares_task* ares_task_create(ChannelWrap* channel, ares_socket_t sock) {
@@ -1195,11 +1190,9 @@ class QueryAnyWrap: public QueryWrap {
11951190
return 0;
11961191
}
11971192

1198-
void MemoryInfo(MemoryTracker* tracker) const override {
1199-
tracker->TrackThis(this);
1200-
}
1201-
1202-
ADD_MEMORY_INFO_NAME(QueryAnyWrap)
1193+
SET_NO_MEMORY_INFO()
1194+
SET_MEMORY_INFO_NAME(QueryAnyWrap)
1195+
SET_SELF_SIZE(QueryAnyWrap)
12031196

12041197
protected:
12051198
void Parse(unsigned char* buf, int len) override {
@@ -1376,11 +1369,9 @@ class QueryAWrap: public QueryWrap {
13761369
return 0;
13771370
}
13781371

1379-
void MemoryInfo(MemoryTracker* tracker) const override {
1380-
tracker->TrackThis(this);
1381-
}
1382-
1383-
ADD_MEMORY_INFO_NAME(QueryAWrap)
1372+
SET_NO_MEMORY_INFO()
1373+
SET_MEMORY_INFO_NAME(QueryAWrap)
1374+
SET_SELF_SIZE(QueryAWrap)
13841375

13851376
protected:
13861377
void Parse(unsigned char* buf, int len) override {
@@ -1424,11 +1415,9 @@ class QueryAaaaWrap: public QueryWrap {
14241415
return 0;
14251416
}
14261417

1427-
void MemoryInfo(MemoryTracker* tracker) const override {
1428-
tracker->TrackThis(this);
1429-
}
1430-
1431-
ADD_MEMORY_INFO_NAME(QueryAaaaWrap)
1418+
SET_NO_MEMORY_INFO()
1419+
SET_MEMORY_INFO_NAME(QueryAaaaWrap)
1420+
SET_SELF_SIZE(QueryAaaaWrap)
14321421

14331422
protected:
14341423
void Parse(unsigned char* buf, int len) override {
@@ -1472,11 +1461,9 @@ class QueryCnameWrap: public QueryWrap {
14721461
return 0;
14731462
}
14741463

1475-
void MemoryInfo(MemoryTracker* tracker) const override {
1476-
tracker->TrackThis(this);
1477-
}
1478-
1479-
ADD_MEMORY_INFO_NAME(QueryCnameWrap)
1464+
SET_NO_MEMORY_INFO()
1465+
SET_MEMORY_INFO_NAME(QueryCnameWrap)
1466+
SET_SELF_SIZE(QueryCnameWrap)
14801467

14811468
protected:
14821469
void Parse(unsigned char* buf, int len) override {
@@ -1507,11 +1494,9 @@ class QueryMxWrap: public QueryWrap {
15071494
return 0;
15081495
}
15091496

1510-
void MemoryInfo(MemoryTracker* tracker) const override {
1511-
tracker->TrackThis(this);
1512-
}
1513-
1514-
ADD_MEMORY_INFO_NAME(QueryMxWrap)
1497+
SET_NO_MEMORY_INFO()
1498+
SET_MEMORY_INFO_NAME(QueryMxWrap)
1499+
SET_SELF_SIZE(QueryMxWrap)
15151500

15161501
protected:
15171502
void Parse(unsigned char* buf, int len) override {
@@ -1542,11 +1527,9 @@ class QueryNsWrap: public QueryWrap {
15421527
return 0;
15431528
}
15441529

1545-
void MemoryInfo(MemoryTracker* tracker) const override {
1546-
tracker->TrackThis(this);
1547-
}
1548-
1549-
ADD_MEMORY_INFO_NAME(QueryNsWrap)
1530+
SET_NO_MEMORY_INFO()
1531+
SET_MEMORY_INFO_NAME(QueryNsWrap)
1532+
SET_SELF_SIZE(QueryNsWrap)
15501533

15511534
protected:
15521535
void Parse(unsigned char* buf, int len) override {
@@ -1577,11 +1560,9 @@ class QueryTxtWrap: public QueryWrap {
15771560
return 0;
15781561
}
15791562

1580-
void MemoryInfo(MemoryTracker* tracker) const override {
1581-
tracker->TrackThis(this);
1582-
}
1583-
1584-
ADD_MEMORY_INFO_NAME(QueryTxtWrap)
1563+
SET_NO_MEMORY_INFO()
1564+
SET_MEMORY_INFO_NAME(QueryTxtWrap)
1565+
SET_SELF_SIZE(QueryTxtWrap)
15851566

15861567
protected:
15871568
void Parse(unsigned char* buf, int len) override {
@@ -1611,11 +1592,9 @@ class QuerySrvWrap: public QueryWrap {
16111592
return 0;
16121593
}
16131594

1614-
void MemoryInfo(MemoryTracker* tracker) const override {
1615-
tracker->TrackThis(this);
1616-
}
1617-
1618-
ADD_MEMORY_INFO_NAME(QuerySrvWrap)
1595+
SET_NO_MEMORY_INFO()
1596+
SET_MEMORY_INFO_NAME(QuerySrvWrap)
1597+
SET_SELF_SIZE(QuerySrvWrap)
16191598

16201599
protected:
16211600
void Parse(unsigned char* buf, int len) override {
@@ -1644,11 +1623,9 @@ class QueryPtrWrap: public QueryWrap {
16441623
return 0;
16451624
}
16461625

1647-
void MemoryInfo(MemoryTracker* tracker) const override {
1648-
tracker->TrackThis(this);
1649-
}
1650-
1651-
ADD_MEMORY_INFO_NAME(QueryPtrWrap)
1626+
SET_NO_MEMORY_INFO()
1627+
SET_MEMORY_INFO_NAME(QueryPtrWrap)
1628+
SET_SELF_SIZE(QueryPtrWrap)
16521629

16531630
protected:
16541631
void Parse(unsigned char* buf, int len) override {
@@ -1679,11 +1656,9 @@ class QueryNaptrWrap: public QueryWrap {
16791656
return 0;
16801657
}
16811658

1682-
void MemoryInfo(MemoryTracker* tracker) const override {
1683-
tracker->TrackThis(this);
1684-
}
1685-
1686-
ADD_MEMORY_INFO_NAME(QueryNaptrWrap)
1659+
SET_NO_MEMORY_INFO()
1660+
SET_MEMORY_INFO_NAME(QueryNaptrWrap)
1661+
SET_SELF_SIZE(QueryNaptrWrap)
16871662

16881663
protected:
16891664
void Parse(unsigned char* buf, int len) override {
@@ -1713,11 +1688,9 @@ class QuerySoaWrap: public QueryWrap {
17131688
return 0;
17141689
}
17151690

1716-
void MemoryInfo(MemoryTracker* tracker) const override {
1717-
tracker->TrackThis(this);
1718-
}
1719-
1720-
ADD_MEMORY_INFO_NAME(QuerySoaWrap)
1691+
SET_NO_MEMORY_INFO()
1692+
SET_MEMORY_INFO_NAME(QuerySoaWrap)
1693+
SET_SELF_SIZE(QuerySoaWrap)
17211694

17221695
protected:
17231696
void Parse(unsigned char* buf, int len) override {
@@ -1801,11 +1774,9 @@ class GetHostByAddrWrap: public QueryWrap {
18011774
return 0;
18021775
}
18031776

1804-
void MemoryInfo(MemoryTracker* tracker) const override {
1805-
tracker->TrackThis(this);
1806-
}
1807-
1808-
ADD_MEMORY_INFO_NAME(GetHostByAddrWrap)
1777+
SET_NO_MEMORY_INFO()
1778+
SET_MEMORY_INFO_NAME(GetHostByAddrWrap)
1779+
SET_SELF_SIZE(GetHostByAddrWrap)
18091780

18101781
protected:
18111782
void Parse(struct hostent* host) override {

src/connect_wrap.h

+3-5
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@ class ConnectWrap : public ReqWrap<uv_connect_t> {
1616
v8::Local<v8::Object> req_wrap_obj,
1717
AsyncWrap::ProviderType provider);
1818

19-
void MemoryInfo(MemoryTracker* tracker) const override {
20-
tracker->TrackThis(this);
21-
}
22-
23-
ADD_MEMORY_INFO_NAME(ConnectWrap)
19+
SET_NO_MEMORY_INFO()
20+
SET_MEMORY_INFO_NAME(ConnectWrap)
21+
SET_SELF_SIZE(ConnectWrap)
2422
};
2523

2624
} // namespace node

src/fs_event_wrap.cc

+3-5
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,9 @@ class FSEventWrap: public HandleWrap {
5757
static void Start(const FunctionCallbackInfo<Value>& args);
5858
static void GetInitialized(const FunctionCallbackInfo<Value>& args);
5959

60-
void MemoryInfo(MemoryTracker* tracker) const override {
61-
tracker->TrackThis(this);
62-
}
63-
64-
ADD_MEMORY_INFO_NAME(FSEventWrap)
60+
SET_NO_MEMORY_INFO()
61+
SET_MEMORY_INFO_NAME(FSEventWrap)
62+
SET_SELF_SIZE(FSEventWrap)
6563

6664
private:
6765
static const encoding kDefaultEncoding = UTF8;

0 commit comments

Comments
 (0)