Index: base/trace_event/heap_profiler_heap_dump_writer.cc |
diff --git a/base/trace_event/heap_profiler_heap_dump_writer.cc b/base/trace_event/heap_profiler_heap_dump_writer.cc |
index dc27823bba060edd381819e87f50fc74ec6a56fe..d69ed7bb0a62437b4819b2625cd496ba04766422 100644 |
--- a/base/trace_event/heap_profiler_heap_dump_writer.cc |
+++ b/base/trace_event/heap_profiler_heap_dump_writer.cc |
@@ -12,13 +12,12 @@ |
#include "base/format_macros.h" |
#include "base/strings/stringprintf.h" |
#include "base/trace_event/heap_profiler_stack_frame_deduplicator.h" |
+#include "base/trace_event/heap_profiler_type_name_deduplicator.h" |
#include "base/trace_event/trace_event_argument.h" |
namespace base { |
namespace trace_event { |
-using TypeId = AllocationContext::TypeId; |
- |
namespace { |
template <typename T> |
@@ -41,9 +40,11 @@ std::vector<std::pair<T, size_t>> SortBySizeDescending( |
} // namespace |
-HeapDumpWriter::HeapDumpWriter(StackFrameDeduplicator* stack_frame_deduplicator) |
+HeapDumpWriter::HeapDumpWriter(StackFrameDeduplicator* stack_frame_deduplicator, |
+ TypeNameDeduplicator* type_name_deduplicator) |
: traced_value_(new TracedValue()), |
- stack_frame_deduplicator_(stack_frame_deduplicator) {} |
+ stack_frame_deduplicator_(stack_frame_deduplicator), |
+ type_name_deduplicator_(type_name_deduplicator) {} |
HeapDumpWriter::~HeapDumpWriter() {} |
@@ -57,12 +58,12 @@ scoped_refptr<TracedValue> HeapDumpWriter::WriteHeapDump() { |
// iterating anyway. |
size_t total_size = 0; |
hash_map<Backtrace, size_t> bytes_by_backtrace; |
- hash_map<TypeId, size_t> bytes_by_type; |
+ hash_map<const char*, size_t> bytes_by_type; |
for (auto context_size : bytes_by_context_) { |
total_size += context_size.second; |
bytes_by_backtrace[context_size.first.backtrace] += context_size.second; |
- bytes_by_type[context_size.first.type_id] += context_size.second; |
+ bytes_by_type[context_size.first.type_name] += context_size.second; |
} |
auto sorted_bytes_by_backtrace = SortBySizeDescending(bytes_by_backtrace); |
@@ -90,7 +91,9 @@ scoped_refptr<TracedValue> HeapDumpWriter::WriteHeapDump() { |
// Entries with the size per type. |
for (const auto& entry : sorted_bytes_by_type) { |
traced_value_->BeginDictionary(); |
- WriteTypeId(entry.first); |
+ // Insert a forward reference to the type name that will be written to the |
+ // trace when it is flushed. |
+ WriteTypeId(type_name_deduplicator_->Insert(entry.first)); |
WriteSize(entry.second); |
traced_value_->EndDictionary(); |
} |
@@ -113,17 +116,10 @@ void HeapDumpWriter::WriteStackFrameIndex(int index) { |
} |
} |
-void HeapDumpWriter::WriteTypeId(TypeId type_id) { |
- if (type_id == 0) { |
- // Type ID 0 represents "unknown type". Instead of writing it as "0" which |
- // could be mistaken for an actual type ID, an unknown type is represented |
- // by the empty string. |
- traced_value_->SetString("type", ""); |
- } else { |
- // Format the type ID as a string. |
- SStringPrintf(&buffer_, "%" PRIu16, type_id); |
- traced_value_->SetString("type", buffer_); |
- } |
+void HeapDumpWriter::WriteTypeId(int type_id) { |
+ // Format the type ID as a string. |
+ SStringPrintf(&buffer_, "%i", type_id); |
+ traced_value_->SetString("type", buffer_); |
} |
void HeapDumpWriter::WriteSize(size_t size) { |