Skip to content

Commit

Permalink
src: name EmbededderGraph edges and use class names for nodes
Browse files Browse the repository at this point in the history
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 <anna@addaleax.net>
  • Loading branch information
joyeecheung authored and targos committed Oct 7, 2018
1 parent 390fc85 commit 950ccee
Show file tree
Hide file tree
Showing 50 changed files with 734 additions and 507 deletions.
4 changes: 2 additions & 2 deletions lib/internal/test/heap.js
Expand Up @@ -37,8 +37,8 @@ function createJSHeapDump() {
const fromNode = nodes[fromNodeIndex];
const edge = {
type,
toNode,
fromNode,
to: toNode,
from: fromNode,
name: typeof name_or_index === 'string' ? name_or_index : null
};
toNode.incomingEdges.push(edge);
Expand Down
12 changes: 6 additions & 6 deletions src/async_wrap.cc
Expand Up @@ -72,9 +72,9 @@ struct AsyncWrapObject : public AsyncWrap {
inline AsyncWrapObject(Environment* env, Local<Object> object,
ProviderType type) : AsyncWrap(env, object, type) {}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(AsyncWrapObject)
SET_SELF_SIZE(AsyncWrapObject)
};


Expand Down Expand Up @@ -180,9 +180,9 @@ class PromiseWrap : public AsyncWrap {
MakeWeak();
}

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

static constexpr int kPromiseField = 1;
static constexpr int kIsChainedPromiseField = 2;
Expand Down
5 changes: 0 additions & 5 deletions src/base_object.h
Expand Up @@ -33,11 +33,6 @@ namespace node {

class Environment;

#define ADD_MEMORY_INFO_NAME(name) \
std::string MemoryInfoName() const override { \
return #name; \
}

class BaseObject : public MemoryRetainer {
public:
// Associates this object with `object`. It uses the 0th internal field for
Expand Down
133 changes: 52 additions & 81 deletions src/cares_wrap.cc
Expand Up @@ -127,8 +127,9 @@ struct node_ares_task : public MemoryRetainer {
ares_socket_t sock;
uv_poll_t poll_watcher;

void MemoryInfo(MemoryTracker* tracker) const override;
ADD_MEMORY_INFO_NAME(node_ares_task)
inline void MemoryInfo(MemoryTracker* tracker) const override;
SET_MEMORY_INFO_NAME(node_ares_task)
SET_SELF_SIZE(node_ares_task)
};

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

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

ADD_MEMORY_INFO_NAME(ChannelWrap)
SET_MEMORY_INFO_NAME(ChannelWrap)
SET_SELF_SIZE(ChannelWrap)

static void AresTimeout(uv_timer_t* handle);

Expand All @@ -192,11 +193,6 @@ class ChannelWrap : public AsyncWrap {
node_ares_task_list task_list_;
};

void node_ares_task::MemoryInfo(MemoryTracker* tracker) const {
tracker->TrackThis(this);
tracker->TrackField("channel", channel);
}

ChannelWrap::ChannelWrap(Environment* env,
Local<Object> object)
: AsyncWrap(env, object, PROVIDER_DNSCHANNEL),
Expand Down Expand Up @@ -225,11 +221,9 @@ class GetAddrInfoReqWrap : public ReqWrap<uv_getaddrinfo_t> {
Local<Object> req_wrap_obj,
bool verbatim);

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(GetAddrInfoReqWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(GetAddrInfoReqWrap)
SET_SELF_SIZE(GetAddrInfoReqWrap)

bool verbatim() const { return verbatim_; }

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

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(GetNameInfoReqWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(GetNameInfoReqWrap)
SET_SELF_SIZE(GetNameInfoReqWrap)
};

GetNameInfoReqWrap::GetNameInfoReqWrap(Environment* env,
Expand Down Expand Up @@ -298,6 +290,9 @@ void ares_poll_close_cb(uv_poll_t* watcher) {
delete task;
}

void node_ares_task::MemoryInfo(MemoryTracker* tracker) const {
tracker->TrackField("channel", channel);
}

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

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QueryAnyWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QueryAnyWrap)
SET_SELF_SIZE(QueryAnyWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1376,11 +1369,9 @@ class QueryAWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QueryAWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QueryAWrap)
SET_SELF_SIZE(QueryAWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1424,11 +1415,9 @@ class QueryAaaaWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QueryAaaaWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QueryAaaaWrap)
SET_SELF_SIZE(QueryAaaaWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1472,11 +1461,9 @@ class QueryCnameWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QueryCnameWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QueryCnameWrap)
SET_SELF_SIZE(QueryCnameWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1507,11 +1494,9 @@ class QueryMxWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QueryMxWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QueryMxWrap)
SET_SELF_SIZE(QueryMxWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1542,11 +1527,9 @@ class QueryNsWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QueryNsWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QueryNsWrap)
SET_SELF_SIZE(QueryNsWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1577,11 +1560,9 @@ class QueryTxtWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QueryTxtWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QueryTxtWrap)
SET_SELF_SIZE(QueryTxtWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1611,11 +1592,9 @@ class QuerySrvWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QuerySrvWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QuerySrvWrap)
SET_SELF_SIZE(QuerySrvWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1644,11 +1623,9 @@ class QueryPtrWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QueryPtrWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QueryPtrWrap)
SET_SELF_SIZE(QueryPtrWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1679,11 +1656,9 @@ class QueryNaptrWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QueryNaptrWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QueryNaptrWrap)
SET_SELF_SIZE(QueryNaptrWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1713,11 +1688,9 @@ class QuerySoaWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(QuerySoaWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(QuerySoaWrap)
SET_SELF_SIZE(QuerySoaWrap)

protected:
void Parse(unsigned char* buf, int len) override {
Expand Down Expand Up @@ -1801,11 +1774,9 @@ class GetHostByAddrWrap: public QueryWrap {
return 0;
}

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(GetHostByAddrWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(GetHostByAddrWrap)
SET_SELF_SIZE(GetHostByAddrWrap)

protected:
void Parse(struct hostent* host) override {
Expand Down
8 changes: 3 additions & 5 deletions src/connect_wrap.h
Expand Up @@ -16,11 +16,9 @@ class ConnectWrap : public ReqWrap<uv_connect_t> {
v8::Local<v8::Object> req_wrap_obj,
AsyncWrap::ProviderType provider);

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(ConnectWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(ConnectWrap)
SET_SELF_SIZE(ConnectWrap)
};

} // namespace node
Expand Down
8 changes: 3 additions & 5 deletions src/fs_event_wrap.cc
Expand Up @@ -57,11 +57,9 @@ class FSEventWrap: public HandleWrap {
static void Start(const FunctionCallbackInfo<Value>& args);
static void GetInitialized(const FunctionCallbackInfo<Value>& args);

void MemoryInfo(MemoryTracker* tracker) const override {
tracker->TrackThis(this);
}

ADD_MEMORY_INFO_NAME(FSEventWrap)
SET_NO_MEMORY_INFO()
SET_MEMORY_INFO_NAME(FSEventWrap)
SET_SELF_SIZE(FSEventWrap)

private:
static const encoding kDefaultEncoding = UTF8;
Expand Down

0 comments on commit 950ccee

Please sign in to comment.