src: track memory retainer fields

If retainers are embedded in retainers, direct tracking
those lead to double tracking. Instead, use a special tracker
that adjusts the tracking for the container object.

PR-URL: https://github.com/nodejs/node/pull/26161
Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
Gireesh Punathil 2019-02-18 06:14:41 -05:00
parent df43754fe1
commit 17b4949a84
2 changed files with 18 additions and 0 deletions

View File

@ -241,6 +241,13 @@ void MemoryTracker::Track(const MemoryRetainer* retainer,
PopNode(); PopNode();
} }
void MemoryTracker::TrackInlineField(const MemoryRetainer* retainer,
const char* edge_name) {
Track(retainer, edge_name);
CHECK(CurrentNode());
CurrentNode()->size_ -= retainer->SelfSize();
}
MemoryRetainerNode* MemoryTracker::CurrentNode() const { MemoryRetainerNode* MemoryTracker::CurrentNode() const {
if (node_stack_.empty()) return nullptr; if (node_stack_.empty()) return nullptr;
return node_stack_.top(); return node_stack_.top();

View File

@ -197,6 +197,17 @@ class MemoryTracker {
inline void Track(const MemoryRetainer* retainer, inline void Track(const MemoryRetainer* retainer,
const char* edge_name = nullptr); const char* edge_name = nullptr);
// Useful for parents that do not wish to perform manual
// adjustments to its `SelfSize()` when embedding retainer
// objects inline.
// Put a memory container into the graph, create an edge from
// the current node if there is one on the stack - there should
// be one, of the container object which the current field is part of.
// Reduce the size of memory from the container so as to avoid
// duplication in accounting.
inline void TrackInlineField(const MemoryRetainer* retainer,
const char* edge_name = nullptr);
inline v8::EmbedderGraph* graph() { return graph_; } inline v8::EmbedderGraph* graph() { return graph_; }
inline v8::Isolate* isolate() { return isolate_; } inline v8::Isolate* isolate() { return isolate_; }