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 / `).

PR-URL: #23072
Reviewed-By: Anna Henningsen <[email protected]>
joyeecheung authored and jasnell committed Oct 17, 2018
1 parent 31bbe5d commit b082adc
Showing 50 changed files with 713 additions and 503 deletions.
4 changes: 2 additions & 2 deletions lib/internal/test/heap.js
Original file line number Diff line number Diff line change
@@ -36,8 +36,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);
12 changes: 6 additions & 6 deletions src/async_wrap.cc
Original file line number Diff line number Diff line change
@@ -73,9 +73,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)
};


@@ -181,9 +181,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;
5 changes: 0 additions & 5 deletions src/base_object.h
Original file line number Diff line number Diff line change
@@ -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
133 changes: 52 additions & 81 deletions src/cares_wrap.cc
Original file line number Diff line number Diff line change
@@ -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 {
@@ -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);

@@ -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),
@@ -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_; }

@@ -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,
@@ -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) {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
8 changes: 3 additions & 5 deletions src/connect_wrap.h
Original file line number Diff line number Diff line change
@@ -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
8 changes: 3 additions & 5 deletions src/fs_event_wrap.cc
Original file line number Diff line number Diff line change
@@ -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;
Loading

0 comments on commit b082adc

Please sign in to comment.