From 17b4949a84106d70749106985f6d606004acf25a Mon Sep 17 00:00:00 2001 From: Gireesh Punathil Date: Mon, 18 Feb 2019 06:14:41 -0500 Subject: 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 --- src/memory_tracker-inl.h | 7 +++++++ src/memory_tracker.h | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/memory_tracker-inl.h b/src/memory_tracker-inl.h index 65bcbccdc0..95d623c2b4 100644 --- a/src/memory_tracker-inl.h +++ b/src/memory_tracker-inl.h @@ -241,6 +241,13 @@ void MemoryTracker::Track(const MemoryRetainer* retainer, 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 { if (node_stack_.empty()) return nullptr; return node_stack_.top(); diff --git a/src/memory_tracker.h b/src/memory_tracker.h index 11dd2be7af..673cd811c3 100644 --- a/src/memory_tracker.h +++ b/src/memory_tracker.h @@ -197,6 +197,17 @@ class MemoryTracker { inline void Track(const MemoryRetainer* retainer, 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::Isolate* isolate() { return isolate_; } -- cgit v1.2.3