Index: src/profile-generator.cc |
diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
index 814ff8d68dd935c43ea8a49725f4caa63bdb82e6..eb82055d205f14a635f371f7c5d1b9cc4c91bc13 100644 |
--- a/src/profile-generator.cc |
+++ b/src/profile-generator.cc |
@@ -1406,7 +1406,93 @@ SnapshotObjectId HeapObjectsMap::FindEntry(Address addr) { |
} |
+SnapshotObjectId HeapObjectsMap::FindOrAddEntry(Address addr) { |
+ ASSERT(static_cast<uint32_t>(entries_->length()) > entries_map_.occupancy()); |
+ HashMap::Entry* entry = entries_map_.Lookup(addr, AddressHash(addr), true); |
+ if (entry->value != NULL) { |
+ int entry_index = |
+ static_cast<int>(reinterpret_cast<intptr_t>(entry->value)); |
+ EntryInfo& entry_info = entries_->at(entry_index); |
+ entry_info.accessed = true; |
+ return entry_info.id; |
+ } |
+ entry->value = reinterpret_cast<void*>(entries_->length()); |
+ SnapshotObjectId id = next_id_; |
+ next_id_ += kObjectIdStep; |
+ entries_->Add(EntryInfo(id, addr)); |
+ ASSERT(static_cast<uint32_t>(entries_->length()) > entries_map_.occupancy()); |
+ return id; |
+} |
+ |
+ |
+void HeapObjectsMap::StartHeapObjectsTracking() { |
alexeif
2012/04/11 13:53:36
Do you plan to put something in here?
|
+} |
+ |
+ |
+void HeapObjectsMap::StopHeapObjectsTracking() { |
+ fragment_infos_.Clear(); |
+} |
+ |
+void HeapObjectsMap::UpdateHeapObjectsMap() { |
+ uint64_t start = OS::Ticks(); |
alexeif
2012/04/11 13:53:36
leftover?
|
+ HEAP->CollectAllGarbage(Heap::kMakeHeapIterableMask, |
+ "HeapSnapshotsCollection::UpdateHeapObjectsMap"); |
+ int entries = 0; |
+ SnapshotObjectId current_id = next_id_; |
+ HeapIterator iterator(HeapIterator::kFilterUnreachable); |
+ for (HeapObject* obj = iterator.next(); |
+ obj != NULL; |
+ obj = iterator.next()) { |
+ FindOrAddEntry(obj->address()); |
+ ++entries; |
+ } |
+ initial_fill_mode_ = false; |
+ RemoveDeadEntries(); |
+} |
+ |
+ |
+void HeapObjectsMap::PushHeapObjectsStats(OutputStream* stream) { |
+ UpdateHeapObjectsMap(); |
+ uint64_t start = OS::Ticks(); |
alexeif
2012/04/11 13:53:36
ditto
|
+ fragment_infos_.Add(FragmentInfo(next_id_)); |
+ int collected_fragment_updates = 0; |
+ int prefered_chunk_size = stream->GetChunkSize(); |
+ List<uint32_t> stats_buffer; |
+ ASSERT(entries_->length()); |
+ EntryInfo* entry_info = &entries_->first(); |
+ EntryInfo* end_entry_info = &entries_->last() + 1; |
+ uint32_t count = 0; |
+ for (int fragment_index = 0; |
+ fragment_index < fragment_infos_.length(); |
+ ++fragment_index) { |
+ FragmentInfo& fragment_info = fragment_infos_[fragment_index]; |
+ SnapshotObjectId fragment_id = fragment_info.id; |
+ while (entry_info < end_entry_info && entry_info->id < fragment_id) { |
+ ++count; |
+ ++entry_info; |
+ } |
+ if (fragment_info.count != count) { |
+ stats_buffer.Add(fragment_index); |
+ stats_buffer.Add(fragment_info.count = count); |
+ ++collected_fragment_updates; |
+ if (stats_buffer.length() >= prefered_chunk_size) { |
+ stream->WriteUint32Chunk(&stats_buffer.first(), |
+ stats_buffer.length()); |
+ stats_buffer.Clear(); |
+ } |
+ } |
+ count = 0; |
+ } |
+ ASSERT(entry_info == end_entry_info); |
+ if (stats_buffer.length()) { |
+ stream->WriteUint32Chunk(&stats_buffer.first(), stats_buffer.length()); |
+ } |
+ stream->EndOfStream(); |
+} |
+ |
+ |
void HeapObjectsMap::RemoveDeadEntries() { |
+ uint64_t start = OS::Ticks(); |
ASSERT(entries_->length() > 0 && |
entries_->at(0).id == 0 && |
entries_->at(0).addr == NULL); |