From f3d620787403c00ee5c7d5e9e1601d389802082b Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Fri, 22 Feb 2019 21:50:15 +0800 Subject: [PATCH] doc: fix the example implementation of MemoryRetainer We need to be careful not to include the size of non-pointer fields in the parent's self size if we want to track them separately as a different node. Refs: https://github.com/nodejs/node/pull/26161/files#r259170771 PR-URL: https://github.com/nodejs/node/pull/26262 Reviewed-By: Gireesh Punathil Reviewed-By: Anna Henningsen Reviewed-By: James M Snell --- src/memory_tracker.h | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/memory_tracker.h b/src/memory_tracker.h index 673cd811c3ea03..4125f9585f1d74 100644 --- a/src/memory_tracker.h +++ b/src/memory_tracker.h @@ -44,6 +44,13 @@ class NodeBIO; * // Node name and size comes from the MemoryInfoName and SelfSize of * // AnotherRetainerClass * tracker->TrackField("another_retainer", another_retainer_); + * + * // Add non_pointer_retainer as a separate node into the graph + * // and track its memory information recursively. + * // Note that we need to make sure its size is not accounted in + * // ExampleRetainer::SelfSize(). + * tracker->TrackField("non_pointer_retainer", &non_pointer_retainer_); + * * // Specify node name and size explicitly * tracker->TrackFieldWithSize("internal_member", * internal_member_.size(), @@ -60,9 +67,12 @@ class NodeBIO; * return "ExampleRetainer"; * } * - * // Or use SET_SELF_SIZE(ExampleRetainer) + * // Classes that only want to return its sizeof() value can use the + * // SET_SELF_SIZE(Class) macro instead. * size_t SelfSize() const override { - * return sizeof(ExampleRetainer); + * // We need to exclude the size of non_pointer_retainer so that + * // we can track it separately in ExampleRetainer::MemoryInfo(). + * return sizeof(ExampleRetainer) - sizeof(NonPointerRetainerClass); * } * * // Note: no need to implement these two methods when implementing @@ -71,8 +81,10 @@ class NodeBIO; * v8::Local WrappedObject() const override { * return node::PersistentToLocal::Default(wrapped_); * } + * * private: - * AnotherRetainerClass another_retainer_; + * AnotherRetainerClass* another_retainer_; + * NonPointerRetainerClass non_pointer_retainer; * InternalClass internal_member_; * std::vector vector_; * node::Persistent target_;