Index: base/trace_event/process_memory_dump.h |
diff --git a/base/trace_event/process_memory_dump.h b/base/trace_event/process_memory_dump.h |
index 889356d65aa57d8599a715ab4cdb5ad062d2aa82..88ce28abe245a7ec2f8f58ebaffe3f39999611bb 100644 |
--- a/base/trace_event/process_memory_dump.h |
+++ b/base/trace_event/process_memory_dump.h |
@@ -5,12 +5,15 @@ |
#ifndef BASE_TRACE_EVENT_PROCESS_MEMORY_DUMP_H_ |
#define BASE_TRACE_EVENT_PROCESS_MEMORY_DUMP_H_ |
+#include <vector> |
+ |
#include "base/base_export.h" |
#include "base/containers/hash_tables.h" |
#include "base/containers/small_map.h" |
#include "base/memory/ref_counted.h" |
#include "base/memory/scoped_vector.h" |
#include "base/trace_event/memory_allocator_dump.h" |
+#include "base/trace_event/memory_allocator_dump_guid.h" |
#include "base/trace_event/memory_dump_session_state.h" |
#include "base/trace_event/process_memory_maps.h" |
#include "base/trace_event/process_memory_totals.h" |
@@ -30,6 +33,13 @@ class MemoryDumpSessionState; |
// dump point time. |
class BASE_EXPORT ProcessMemoryDump { |
public: |
+ struct MemoryAllocatorDumpEdge { |
+ MemoryAllocatorDumpGuid source; |
+ MemoryAllocatorDumpGuid target; |
+ int importance; |
+ const char* type; |
+ }; |
+ |
// Maps allocator dumps absolute names (allocator_name/heap/subheap) to |
// MemoryAllocatorDump instances. |
using AllocatorDumpsMap = |
@@ -41,6 +51,18 @@ class BASE_EXPORT ProcessMemoryDump { |
// Called at trace generation time to populate the TracedValue. |
void AsValueInto(TracedValue* value) const; |
+ // Removes all the MemoryAllocatorDump(s) contained in this instance. This |
+ // ProcessMemoryDump can be safely reused as if it was new once this returns. |
+ void Clear(); |
+ |
+ // Merges all MemoryAllocatorDump(s) contained in |other| inside this |
+ // ProcessMemoryDump, transferring their ownership to this instance. |
+ // |other| will be an empty ProcessMemoryDump after this method returns. |
+ // This is to allow dump providers to pre-populate ProcessMemoryDump instances |
+ // and later move their contents into the ProcessMemoryDump passed as argument |
+ // of the MemoryDumpProvider::OnMemoryDump(ProcessMemoryDump*) callback. |
+ void TakeAllDumpsFrom(ProcessMemoryDump* other); |
+ |
ProcessMemoryTotals* process_totals() { return &process_totals_; } |
bool has_process_totals() const { return has_process_totals_; } |
void set_has_process_totals() { has_process_totals_ = true; } |
@@ -56,21 +78,62 @@ class BASE_EXPORT ProcessMemoryDump { |
// by this provider. It is possible to specify nesting by using a |
// path-like string (e.g., v8/isolate1/heap1, v8/isolate1/heap2). |
// Leading or trailing slashes are not allowed. |
+ // guid: an optional identifier, unique among all processes within the |
+ // scope of a global dump. This is only relevant when using |
+ // AddOwnershipEdge(). If omitted, it will be automatically generated. |
// ProcessMemoryDump handles the memory ownership of its MemoryAllocatorDumps. |
MemoryAllocatorDump* CreateAllocatorDump(const std::string& absolute_name); |
+ MemoryAllocatorDump* CreateAllocatorDump(const std::string& absolute_name, |
+ const MemoryAllocatorDumpGuid& guid); |
// Looks up a MemoryAllocatorDump given its allocator and heap names, or |
// nullptr if not found. |
MemoryAllocatorDump* GetAllocatorDump(const std::string& absolute_name) const; |
+ // Creates a shared MemoryAllocatorDump, to express cross-process sharing. |
+ // Shared allocator dumps are allowed to have duplicate guids within the |
+ // global scope, in order to reference the same dump from multiple processes. |
+ // See the design doc goo.gl/keU6Bf for reference usage patterns. |
+ MemoryAllocatorDump* CreateSharedGlobalAllocatorDump( |
+ const MemoryAllocatorDumpGuid& guid); |
+ |
+ // Looks up a shared MemoryAllocatorDump given its guid. |
+ MemoryAllocatorDump* GetSharedGlobalAllocatorDump( |
+ const MemoryAllocatorDumpGuid& guid) const; |
+ |
// Returns the map of the MemoryAllocatorDumps added to this dump. |
const AllocatorDumpsMap& allocator_dumps() const { return allocator_dumps_; } |
+ // Adds an ownership relationship between two MemoryAllocatorDump(s) with the |
+ // semantics: |source| owns |target|, and has the effect of attributing |
+ // the memory usage of |target| to |source|. |importance| is optional and |
+ // relevant only for the cases of co-ownership, where it acts as a z-index: |
+ // the owner with the highest importance will be attributed |target|'s memory. |
+ void AddOwnershipEdge(const MemoryAllocatorDumpGuid& source, |
+ const MemoryAllocatorDumpGuid& target, |
+ int importance); |
+ void AddOwnershipEdge(const MemoryAllocatorDumpGuid& source, |
+ const MemoryAllocatorDumpGuid& target); |
+ |
+ const std::vector<MemoryAllocatorDumpEdge>& allocator_dumps_edges() const { |
+ return allocator_dumps_edges_; |
+ } |
+ |
+ // Utility method to add a suballocation relationship with the following |
+ // semantics: |source| is suballocated from |target_node_name|. |
+ // This creates a child node of |target_node_name| and adds an ownership edge |
+ // between |source| and the new child node. As a result, the UI will not |
+ // account the memory of |source| in the target node. |
+ void AddSuballocation(const MemoryAllocatorDumpGuid& source, |
+ const std::string& target_node_name); |
+ |
const scoped_refptr<MemoryDumpSessionState>& session_state() const { |
return session_state_; |
} |
private: |
+ void AddAllocatorDumpInternal(MemoryAllocatorDump* mad); |
+ |
ProcessMemoryTotals process_totals_; |
bool has_process_totals_; |
@@ -85,6 +148,9 @@ class BASE_EXPORT ProcessMemoryDump { |
// State shared among all PMDs instances created in a given trace session. |
scoped_refptr<MemoryDumpSessionState> session_state_; |
+ // Keeps track of relationships between MemoryAllocatorDump(s). |
+ std::vector<MemoryAllocatorDumpEdge> allocator_dumps_edges_; |
+ |
DISALLOW_COPY_AND_ASSIGN(ProcessMemoryDump); |
}; |