Index: base/trace_event/process_memory_dump.cc |
diff --git a/base/trace_event/process_memory_dump.cc b/base/trace_event/process_memory_dump.cc |
index 9f710936e1405f2b4215761ab0d357d75b7dbd8d..14be09779b2486c2f0d9b0a589be1c761f9eb78b 100644 |
--- a/base/trace_event/process_memory_dump.cc |
+++ b/base/trace_event/process_memory_dump.cc |
@@ -286,8 +286,7 @@ void ProcessMemoryDump::TakeAllDumpsFrom(ProcessMemoryDump* other) { |
other->allocator_dumps_.clear(); |
// Move all the edges. |
- allocator_dumps_edges_.insert(allocator_dumps_edges_.end(), |
- other->allocator_dumps_edges_.begin(), |
+ allocator_dumps_edges_.insert(other->allocator_dumps_edges_.begin(), |
other->allocator_dumps_edges_.end()); |
other->allocator_dumps_edges_.clear(); |
@@ -326,12 +325,12 @@ void ProcessMemoryDump::AsValueInto(TracedValue* value) const { |
} |
value->BeginArray("allocators_graph"); |
- for (const MemoryAllocatorDumpEdge& edge : allocator_dumps_edges_) { |
+ for (const auto& edge : allocator_dumps_edges_) { |
value->BeginDictionary(); |
- value->SetString("source", edge.source.ToString()); |
- value->SetString("target", edge.target.ToString()); |
- value->SetInteger("importance", edge.importance); |
- value->SetString("type", edge.type); |
+ value->SetString("source", edge.first.ToString()); |
+ value->SetString("target", edge.second.target.ToString()); |
+ value->SetInteger("importance", edge.second.importance); |
+ value->SetString("type", edge.second.type); |
value->EndDictionary(); |
} |
value->EndArray(); |
@@ -340,8 +339,11 @@ void ProcessMemoryDump::AsValueInto(TracedValue* value) const { |
void ProcessMemoryDump::AddOwnershipEdge(const MemoryAllocatorDumpGuid& source, |
const MemoryAllocatorDumpGuid& target, |
int importance) { |
- allocator_dumps_edges_.push_back( |
- {source, target, importance, kEdgeTypeOwnership}); |
+ DCHECK(allocator_dumps_edges_.find(source) == allocator_dumps_edges_.end() || |
+ allocator_dumps_edges_[source].overridable) |
+ << "Cannot add multiple ownership edges between same allocator dumps"; |
+ allocator_dumps_edges_[source] = {target, importance, kEdgeTypeOwnership, |
+ false /* overridable */}; |
} |
void ProcessMemoryDump::AddOwnershipEdge( |
@@ -350,6 +352,43 @@ void ProcessMemoryDump::AddOwnershipEdge( |
AddOwnershipEdge(source, target, 0 /* importance */); |
} |
+void ProcessMemoryDump::CreateSharedMemoryOwnershipEdge( |
+ const MemoryAllocatorDumpGuid& client_dump_guid, |
+ const MemoryAllocatorDumpGuid& client_global_dump_guid, |
+ bool is_weak, |
+ int importance, |
+ uint64_t shm_unguessable_token) { |
+ if (UseNewOwnershipEdges() && shared_memory_handle) { |
+ base::SharedMemoryTracker::AddOwnershipEdge(pmd, dump->guid(), |
+ shared_memory_handle); |
+ AddOwnershipEdge( |
+ SharedMemoryTracker::GetLocallDumpGUIDFromToken(shm_unguessable_token), |
+ SharedMemoryTracker::GetGlobalDumpGUIDFromToken(shm_unguessable_token), |
+ importance); |
+ } else { |
+ // Existing logic for ownership |
+ if (is_weak) |
+ pmd->CreateWeakSharedGlobalAllocatorDump(client_global_dump_guid); |
+ else |
+ pmd->CreateSharedGlobalAllocatorDump(client_global_dump_guid); |
+ pmd->AddOwnershipEdge(client_dump_guid, client_global_dump_guid, |
+ importance); |
+ } |
+} |
+ |
+void ProcessMemoryDump::AddOverridableOwnershipEdge( |
+ const MemoryAllocatorDumpGuid& source, |
+ const MemoryAllocatorDumpGuid& target, |
+ int importance) { |
+ if (allocator_dumps_edges_.find(source) == allocator_dumps_edges_.end() || |
+ allocator_dumps_edges_[source].overridable) { |
+ allocator_dumps_edges_[source] = {target, importance, kEdgeTypeOwnership, |
+ true /* overridable */}; |
+ } else { |
+ NOTREACHED(); |
+ } |
+} |
+ |
void ProcessMemoryDump::AddSuballocation(const MemoryAllocatorDumpGuid& source, |
const std::string& target_node_name) { |
// Do not create new dumps for suballocations in background mode. |