Chromium Code Reviews| Index: src/profile-generator.cc |
| diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
| index 14349ccaa9137be6b6ad95dc3c2133daf378f96c..5591a01c9ddb107cfc34161135190bf543062f1c 100644 |
| --- a/src/profile-generator.cc |
| +++ b/src/profile-generator.cc |
| @@ -1096,12 +1096,12 @@ const char* HeapEntry::TypeAsString() { |
| } |
| -int HeapEntry::EntriesSize(int entries_count, |
| +uint64_t HeapEntry::EntriesSize(int entries_count, |
| int children_count, |
| int retainers_count) { |
| - return sizeof(HeapEntry) * entries_count // NOLINT |
| - + sizeof(HeapGraphEdge) * children_count // NOLINT |
| - + sizeof(HeapGraphEdge*) * retainers_count; // NOLINT |
| + return (uint64_t)sizeof(HeapEntry) * entries_count // NOLINT |
|
mnaganov (inactive)
2012/03/08 15:25:10
Please, use static_cast.
alexeif
2012/03/10 10:32:02
There's no need to use casts here. sizeof has the
|
| + + (uint64_t)sizeof(HeapGraphEdge) * children_count // NOLINT |
| + + (uint64_t)sizeof(HeapGraphEdge*) * retainers_count; // NOLINT |
| } |
| @@ -1114,17 +1114,51 @@ template <size_t ptr_size> struct SnapshotSizeConstants; |
| template <> struct SnapshotSizeConstants<4> { |
| static const int kExpectedHeapGraphEdgeSize = 12; |
| static const int kExpectedHeapEntrySize = 36; |
| - static const int kMaxSerializableSnapshotRawSize = 256 * MB; |
| + static const size_t kMaxSerializableSnapshotRawSize = 256 * MB; |
| }; |
| template <> struct SnapshotSizeConstants<8> { |
| static const int kExpectedHeapGraphEdgeSize = 24; |
| static const int kExpectedHeapEntrySize = 48; |
| - static const int kMaxSerializableSnapshotRawSize = 768 * MB; |
| + static const size_t kMaxSerializableSnapshotRawSize = 6000ul * MB; |
| }; |
| } // namespace |
| +class RawEntriesStorage { |
| + public: |
| + explicit RawEntriesStorage(size_t size) : size_(size) { } |
| + ~RawEntriesStorage() { |
| + for (int i = 0; i < raw_data_.length(); ++i) |
| + DeleteArray(raw_data_[i]); |
| + } |
| + char* FirstAddress(size_t minimum_size) { |
|
mnaganov (inactive)
2012/03/08 15:25:10
I think, you should use Address type.
|
| + ASSERT(raw_data_.length() == 0); |
| + return AllocateNextChunk(minimum_size); |
| + } |
| + char* NextAddress(char* next_entry_candidate, size_t minimum_size) { |
| + ASSERT(raw_data_.length()); |
|
mnaganov (inactive)
2012/03/08 15:25:10
!= 0
|
| + if (next_entry_candidate - last_chunk_ + minimum_size > last_chunk_size_) { |
|
mnaganov (inactive)
2012/03/08 15:25:10
Note: Please verify that expressions like these co
|
| + return AllocateNextChunk(minimum_size); |
| + } |
| + return next_entry_candidate; |
| + } |
| + |
| + private: |
| + char* AllocateNextChunk(size_t minimum_size) { |
| + last_chunk_size_ = |
| + default_chunk_size_ > minimum_size ? default_chunk_size_ : minimum_size; |
| + last_chunk_ = NewArray<char>(last_chunk_size_); |
|
alexeif
2012/03/10 10:32:02
Can't we just change the NewArray argument to size
|
| + raw_data_.Add(last_chunk_); |
| + return last_chunk_; |
| + } |
| + size_t size_; |
| + size_t last_chunk_size_; |
| + char* last_chunk_; |
| + List<char*> raw_data_; |
| + static const size_t default_chunk_size_ = 256 * MB; |
| +}; |
| + |
| HeapSnapshot::HeapSnapshot(HeapSnapshotsCollection* collection, |
| HeapSnapshot::Type type, |
| const char* title, |
| @@ -1151,7 +1185,7 @@ HeapSnapshot::HeapSnapshot(HeapSnapshotsCollection* collection, |
| HeapSnapshot::~HeapSnapshot() { |
| - DeleteArray(raw_entries_); |
| + delete raw_entries_; |
| } |
| @@ -1167,7 +1201,7 @@ void HeapSnapshot::AllocateEntries(int entries_count, |
| ASSERT(raw_entries_ == NULL); |
| raw_entries_size_ = |
| HeapEntry::EntriesSize(entries_count, children_count, retainers_count); |
| - raw_entries_ = NewArray<char>(raw_entries_size_); |
| + raw_entries_ = new RawEntriesStorage(raw_entries_size_); |
| } |
| @@ -1225,7 +1259,8 @@ HeapEntry* HeapSnapshot::AddEntry(HeapEntry::Type type, |
| int size, |
| int children_count, |
| int retainers_count) { |
| - HeapEntry* entry = GetNextEntryToInit(); |
| + HeapEntry* entry = GetNextEntryToInit( |
| + HeapEntry::EntriesSize(1, children_count, retainers_count)); |
| entry->Init(this, type, name, id, size, children_count, retainers_count); |
| return entry; |
| } |
| @@ -1239,16 +1274,17 @@ void HeapSnapshot::SetDominatorsToSelf() { |
| } |
| -HeapEntry* HeapSnapshot::GetNextEntryToInit() { |
| +HeapEntry* HeapSnapshot::GetNextEntryToInit(size_t size) { |
| if (entries_.length() > 0) { |
| HeapEntry* last_entry = entries_.last(); |
| - entries_.Add(reinterpret_cast<HeapEntry*>( |
| - reinterpret_cast<char*>(last_entry) + last_entry->EntrySize())); |
| + HeapEntry* next_entry = reinterpret_cast<HeapEntry*>( |
| + raw_entries_->NextAddress(reinterpret_cast<char*>(last_entry) |
| + + last_entry->EntrySize(), size)); |
| + entries_.Add(next_entry); |
| } else { |
| - entries_.Add(reinterpret_cast<HeapEntry*>(raw_entries_)); |
| + entries_.Add(reinterpret_cast<HeapEntry*>( |
| + raw_entries_->FirstAddress(size))); |
| } |
| - ASSERT(reinterpret_cast<char*>(entries_.last()) < |
| - (raw_entries_ + raw_entries_size_)); |
| return entries_.last(); |
| } |
| @@ -3437,7 +3473,7 @@ HeapSnapshot* HeapSnapshotJSONSerializer::CreateFakeSnapshot() { |
| const char* text = snapshot_->collection()->names()->GetFormatted( |
| "The snapshot is too big. " |
| "Maximum snapshot size is %d MB. " |
|
mnaganov (inactive)
2012/03/08 15:25:10
Is %d the correct type?
|
| - "Actual snapshot size is %d MB.", |
| + "Actual snapshot size is %u MB.", |
|
alexeif
2012/03/10 10:32:02
if raw_entries_size() is uint64_t then it should b
|
| SnapshotSizeConstants<kPointerSize>::kMaxSerializableSnapshotRawSize / MB, |
| (snapshot_->raw_entries_size() + MB - 1) / MB); |
| HeapEntry* message = result->AddEntry( |