GeezerVison is showing github.com — src: implement GetDetachedness() in MemoryRetainerNode · nodejs/node@daf3152
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: src/base_object-inl.h +5Lines changed: 5 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -92,6 +92,11 @@ bool BaseObject::IsWeakOrDetached() const { | 92 | 92 | return pd->wants_weak_jsobj || pd->is_detached; | 93 | 93 | } | 94 | 94 |
| | 95 | +v8::EmbedderGraph::Node::Detachedness BaseObject::GetDetachedness() const { | | 96 | + return IsWeakOrDetached() ? v8::EmbedderGraph::Node::Detachedness::kDetached | | 97 | + : v8::EmbedderGraph::Node::Detachedness::kUnknown; | | 98 | +} | | 99 | + | 95 | 100 | template <int Field> | 96 | 101 | void BaseObject::InternalFieldGet( | 97 | 102 | v8::Local<v8::String> property, | |
Collapse file Copy file name to clipboardExpand all lines: src/base_object.h +2Lines changed: 2 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -85,6 +85,8 @@ class BaseObject : public MemoryRetainer { | 85 | 85 | // to it anymore. | 86 | 86 | inline bool IsWeakOrDetached() const; | 87 | 87 |
| | 88 | + inline v8::EmbedderGraph::Node::Detachedness GetDetachedness() const override; | | 89 | + | 88 | 90 | // Utility to create a FunctionTemplate with one internal field (used for | 89 | 91 | // the `BaseObject*` pointer) and a constructor that initializes that field | 90 | 92 | // to `nullptr`. | |
Collapse file Copy file name to clipboardExpand all lines: src/memory_tracker-inl.h +6Lines changed: 6 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -31,6 +31,7 @@ class MemoryRetainerNode : public v8::EmbedderGraph::Node { | 31 | 31 |
| 32 | 32 | name_ = retainer_->MemoryInfoName(); | 33 | 33 | size_ = retainer_->SelfSize(); | | 34 | + detachedness_ = retainer_->GetDetachedness(); | 34 | 35 | } | 35 | 36 |
| 36 | 37 | inline MemoryRetainerNode(MemoryTracker* tracker, | @@ -57,6 +58,9 @@ class MemoryRetainerNode : public v8::EmbedderGraph::Node { | 57 | 58 | } | 58 | 59 | return is_root_node_; | 59 | 60 | } | | 61 | + v8::EmbedderGraph::Node::Detachedness GetDetachedness() override { | | 62 | + return detachedness_; | | 63 | + } | 60 | 64 |
| 61 | 65 | private: | 62 | 66 | friend class MemoryTracker; | @@ -73,6 +77,8 @@ class MemoryRetainerNode : public v8::EmbedderGraph::Node { | 73 | 77 | bool is_root_node_ = false; | 74 | 78 | std::string name_; | 75 | 79 | size_t size_ = 0; | | 80 | + v8::EmbedderGraph::Node::Detachedness detachedness_ = | | 81 | + v8::EmbedderGraph::Node::Detachedness::kUnknown; | 76 | 82 | }; | 77 | 83 |
| 78 | 84 | void MemoryTracker::TrackFieldWithSize(const char* edge_name, | |
Collapse file Copy file name to clipboardExpand all lines: src/memory_tracker.h +3Lines changed: 3 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -127,6 +127,9 @@ class MemoryRetainer { | 127 | 127 | } | 128 | 128 |
| 129 | 129 | virtual bool IsRootNode() const { return false; } | | 130 | + virtual v8::EmbedderGraph::Node::Detachedness GetDetachedness() const { | | 131 | + return v8::EmbedderGraph::Node::Detachedness::kUnknown; | | 132 | + } | 130 | 133 | }; | 131 | 134 |
| 132 | 135 | class MemoryTracker { | |
Collapse file Copy file name to clipboardExpand all lines: test/common/heap.js +16Lines changed: 16 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -142,6 +142,22 @@ class State { | 142 | 142 | } | 143 | 143 | } | 144 | 144 | } | | 145 | + | | 146 | + if (expectation.detachedness !== undefined) { | | 147 | + const matchedNodes = rootNodes.filter( | | 148 | + (node) => node.detachedness === expectation.detachedness); | | 149 | + if (loose) { | | 150 | + assert(matchedNodes.length >= rootNodes.length, | | 151 | + `Expect to find at least ${rootNodes.length} with ` + | | 152 | + `detachedness ${expectation.detachedness}, ` + | | 153 | + `found ${matchedNodes.length}`); | | 154 | + } else { | | 155 | + assert.strictEqual( | | 156 | + matchedNodes.length, rootNodes.length, | | 157 | + `Expect to find ${rootNodes.length} with detachedness ` + | | 158 | + `${expectation.detachedness}, found ${matchedNodes.length}`); | | 159 | + } | | 160 | + } | 145 | 161 | } | 146 | 162 | } | 147 | 163 |
| |
Collapse file Copy file name to clipboardExpand all lines: test/pummel/test-heapdump-dns.js +2-1Lines changed: 2 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -13,6 +13,7 @@ validateSnapshotNodes('Node / ChannelWrap', [ | 13 | 13 | { node_name: 'Node / NodeAresTask::List', edge_name: 'task_list' }, | 14 | 14 | // `Node / ChannelWrap` (C++) -> `ChannelWrap` (JS) | 15 | 15 | { node_name: 'ChannelWrap', edge_name: 'wrapped' }, | 16 | | - ] | | 16 | + ], | | 17 | + detachedness: 2 | 17 | 18 | }, | 18 | 19 | ]); |
|