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:
parent
df43754fe1
commit
17b4949a84
@ -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();
|
||||||
|
@ -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_; }
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user