Chromium Code Reviews| Index: src/heap-snapshot-generator.cc |
| diff --git a/src/heap-snapshot-generator.cc b/src/heap-snapshot-generator.cc |
| index 0e3515c994db590cfc72e579114ae318e8a62abf..4216dbfea385edb26c1e8f11e9833fb1040e21d0 100644 |
| --- a/src/heap-snapshot-generator.cc |
| +++ b/src/heap-snapshot-generator.cc |
| @@ -73,14 +73,16 @@ HeapEntry::HeapEntry(HeapSnapshot* snapshot, |
| Type type, |
| const char* name, |
| SnapshotObjectId id, |
| - size_t self_size) |
| + size_t self_size, |
| + unsigned trace_node_id) |
| : type_(type), |
| children_count_(0), |
| children_index_(-1), |
| self_size_(self_size), |
| - id_(id), |
| snapshot_(snapshot), |
| - name_(name) { } |
| + name_(name), |
| + id_(id), |
| + trace_node_id_(trace_node_id) { } |
| void HeapEntry::SetNamedReference(HeapGraphEdge::Type type, |
| @@ -189,7 +191,7 @@ template <size_t ptr_size> struct SnapshotSizeConstants; |
| template <> struct SnapshotSizeConstants<4> { |
| static const int kExpectedHeapGraphEdgeSize = 12; |
| - static const int kExpectedHeapEntrySize = 24; |
| + static const int kExpectedHeapEntrySize = 28; |
| }; |
| template <> struct SnapshotSizeConstants<8> { |
| @@ -243,6 +245,7 @@ HeapEntry* HeapSnapshot::AddRootEntry() { |
| HeapEntry* entry = AddEntry(HeapEntry::kSynthetic, |
| "", |
| HeapObjectsMap::kInternalRootObjectId, |
| + 0, |
| 0); |
| root_index_ = entry->index(); |
| ASSERT(root_index_ == 0); |
| @@ -255,6 +258,7 @@ HeapEntry* HeapSnapshot::AddGcRootsEntry() { |
| HeapEntry* entry = AddEntry(HeapEntry::kSynthetic, |
| "(GC roots)", |
| HeapObjectsMap::kGcRootsObjectId, |
| + 0, |
| 0); |
| gc_roots_index_ = entry->index(); |
| return entry; |
| @@ -268,6 +272,7 @@ HeapEntry* HeapSnapshot::AddGcSubrootEntry(int tag) { |
| HeapEntry::kSynthetic, |
| VisitorSynchronization::kTagNames[tag], |
| HeapObjectsMap::GetNthGcSubrootId(tag), |
| + 0, |
| 0); |
| gc_subroot_indexes_[tag] = entry->index(); |
| return entry; |
| @@ -277,8 +282,9 @@ HeapEntry* HeapSnapshot::AddGcSubrootEntry(int tag) { |
| HeapEntry* HeapSnapshot::AddEntry(HeapEntry::Type type, |
| const char* name, |
| SnapshotObjectId id, |
| - size_t size) { |
| - HeapEntry entry(this, type, name, id, size); |
| + size_t size, |
| + unsigned trace_node_id) { |
| + HeapEntry entry(this, type, name, id, size, trace_node_id); |
| entries_.Add(entry); |
| return &entries_.last(); |
| } |
| @@ -390,10 +396,10 @@ HeapObjectsMap::HeapObjectsMap(Heap* heap) |
| } |
| -void HeapObjectsMap::MoveObject(Address from, Address to, int object_size) { |
| +bool HeapObjectsMap::MoveObject(Address from, Address to, int object_size) { |
| ASSERT(to != NULL); |
| ASSERT(from != NULL); |
| - if (from == to) return; |
| + if (from == to) return false; |
|
alph
2014/03/06 14:43:18
true?
yurys
2014/03/06 15:38:49
We handle object size update in UpdateObjectSize m
|
| void* from_value = entries_map_.Remove(from, ComputePointerHash(from)); |
| if (from_value == NULL) { |
| // It may occur that some untracked object moves to an address X and there |
| @@ -434,6 +440,7 @@ void HeapObjectsMap::MoveObject(Address from, Address to, int object_size) { |
| entries_.at(from_entry_info_index).size = object_size; |
| to_entry->value = from_value; |
| } |
| + return from_value != NULL; |
| } |
| @@ -910,7 +917,13 @@ HeapEntry* V8HeapExplorer::AddEntry(Address address, |
| size_t size) { |
| SnapshotObjectId object_id = heap_object_map_->FindOrAddEntry( |
| address, static_cast<unsigned int>(size)); |
| - return snapshot_->AddEntry(type, name, object_id, size); |
| + unsigned trace_node_id = 0; |
| + if (AllocationTracker* allocation_tracker = |
| + snapshot_->profiler()->allocation_tracker()) { |
| + trace_node_id = |
| + allocation_tracker->address_to_trace()->GetTraceNodeId(address); |
| + } |
| + return snapshot_->AddEntry(type, name, object_id, size, trace_node_id); |
| } |
| @@ -2143,7 +2156,8 @@ HeapEntry* BasicHeapEntriesAllocator::AllocateEntry(HeapThing ptr) { |
| entries_type_, |
| name, |
| heap_object_map_->GenerateId(info), |
| - size != -1 ? static_cast<int>(size) : 0); |
| + size != -1 ? static_cast<int>(size) : 0, |
| + 0); |
| } |
| @@ -2642,8 +2656,8 @@ class OutputStreamWriter { |
| // type, name|index, to_node. |
| const int HeapSnapshotJSONSerializer::kEdgeFieldsCount = 3; |
| -// type, name, id, self_size, children_index. |
| -const int HeapSnapshotJSONSerializer::kNodeFieldsCount = 5; |
| +// type, name, id, self_size, children_index, trace_node_id. |
|
alph
2014/03/06 14:43:18
children_index -> edge_count ;-)
yurys
2014/03/06 15:38:49
Done.
|
| +const int HeapSnapshotJSONSerializer::kNodeFieldsCount = 6; |
| void HeapSnapshotJSONSerializer::Serialize(v8::OutputStream* stream) { |
| if (AllocationTracker* allocation_tracker = |
| @@ -2783,9 +2797,9 @@ void HeapSnapshotJSONSerializer::SerializeEdges() { |
| void HeapSnapshotJSONSerializer::SerializeNode(HeapEntry* entry) { |
| // The buffer needs space for 4 unsigned ints, 1 size_t, 5 commas, \n and \0 |
| static const int kBufferSize = |
| - 4 * MaxDecimalDigitsIn<sizeof(unsigned)>::kUnsigned // NOLINT |
| + 5 * MaxDecimalDigitsIn<sizeof(unsigned)>::kUnsigned // NOLINT |
| + MaxDecimalDigitsIn<sizeof(size_t)>::kUnsigned // NOLINT |
| - + 5 + 1 + 1; |
| + + 6 + 1 + 1; |
| EmbeddedVector<char, kBufferSize> buffer; |
| int buffer_pos = 0; |
| if (entry_index(entry) != 0) { |
| @@ -2800,6 +2814,8 @@ void HeapSnapshotJSONSerializer::SerializeNode(HeapEntry* entry) { |
| buffer_pos = utoa(entry->self_size(), buffer, buffer_pos); |
| buffer[buffer_pos++] = ','; |
| buffer_pos = utoa(entry->children_count(), buffer, buffer_pos); |
| + buffer[buffer_pos++] = ','; |
| + buffer_pos = utoa(entry->trace_node_id(), buffer, buffer_pos); |
| buffer[buffer_pos++] = '\n'; |
| buffer[buffer_pos++] = '\0'; |
| writer_->AddString(buffer.start()); |
| @@ -2833,7 +2849,8 @@ void HeapSnapshotJSONSerializer::SerializeSnapshot() { |
| JSON_S("name") "," |
| JSON_S("id") "," |
| JSON_S("self_size") "," |
| - JSON_S("edge_count")) "," |
| + JSON_S("edge_count") "," |
| + JSON_S("trace_node_id")) "," |
| JSON_S("node_types") ":" JSON_A( |
| JSON_A( |
| JSON_S("hidden") "," |