summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGireesh Punathil <gpunathi@in.ibm.com>2019-02-18 06:14:41 -0500
committerGireesh Punathil <gpunathi@in.ibm.com>2019-02-28 10:02:33 +0530
commit17b4949a84106d70749106985f6d606004acf25a (patch)
tree04758b34879c3343b6f8e34e62b75e0b442c3da3
parentdf43754fe1bf70042ae364f2365b42271468f102 (diff)
downloadandroid-node-v8-17b4949a84106d70749106985f6d606004acf25a.tar.gz
android-node-v8-17b4949a84106d70749106985f6d606004acf25a.tar.bz2
android-node-v8-17b4949a84106d70749106985f6d606004acf25a.zip
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>
-rw-r--r--src/memory_tracker-inl.h7
-rw-r--r--src/memory_tracker.h11
2 files changed, 18 insertions, 0 deletions
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_; }