| Index: runtime/vm/timeline.cc
|
| diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
|
| index e780f49e3d9541b56b9f026f614c46645bcf6773..e576aa3baece2791c992c7d8418062ca9682f30a 100644
|
| --- a/runtime/vm/timeline.cc
|
| +++ b/runtime/vm/timeline.cc
|
| @@ -1174,30 +1174,32 @@ TimelineEventBlock* TimelineEventRecorder::GetNewBlock() {
|
|
|
| TimelineEventFixedBufferRecorder::TimelineEventFixedBufferRecorder(
|
| intptr_t capacity)
|
| - : blocks_(NULL), capacity_(capacity), num_blocks_(0), block_cursor_(0) {
|
| + : memory_(NULL),
|
| + blocks_(NULL),
|
| + capacity_(capacity),
|
| + num_blocks_(0),
|
| + block_cursor_(0) {
|
| // Capacity must be a multiple of TimelineEventBlock::kBlockSize
|
| ASSERT((capacity % TimelineEventBlock::kBlockSize) == 0);
|
| // Allocate blocks array.
|
| num_blocks_ = capacity / TimelineEventBlock::kBlockSize;
|
| - blocks_ = reinterpret_cast<TimelineEventBlock**>(
|
| - calloc(num_blocks_, sizeof(TimelineEventBlock*)));
|
| - // Allocate each block.
|
| - for (intptr_t i = 0; i < num_blocks_; i++) {
|
| - blocks_[i] = new TimelineEventBlock(i);
|
| - }
|
| - // Chain blocks together.
|
| - for (intptr_t i = 0; i < num_blocks_ - 1; i++) {
|
| - blocks_[i]->set_next(blocks_[i + 1]);
|
| +
|
| + intptr_t size = Utils::RoundUp(num_blocks_ * sizeof(TimelineEventBlock),
|
| + VirtualMemory::PageSize());
|
| + const bool kNotExecutable = false;
|
| + memory_ = VirtualMemory::Reserve(size);
|
| + if ((memory_ == NULL) || !memory_->Commit(kNotExecutable, "dart-timeline")) {
|
| + OUT_OF_MEMORY();
|
| }
|
| + blocks_ = reinterpret_cast<TimelineEventBlock*>(memory_->address());
|
| }
|
|
|
| TimelineEventFixedBufferRecorder::~TimelineEventFixedBufferRecorder() {
|
| // Delete all blocks.
|
| for (intptr_t i = 0; i < num_blocks_; i++) {
|
| - TimelineEventBlock* block = blocks_[i];
|
| - delete block;
|
| + blocks_[i].Reset();
|
| }
|
| - free(blocks_);
|
| + delete memory_;
|
| }
|
|
|
| void TimelineEventFixedBufferRecorder::PrintJSONEvents(
|
| @@ -1215,7 +1217,7 @@ void TimelineEventFixedBufferRecorder::PrintJSONEvents(
|
| }
|
| for (intptr_t block_idx = 0; block_idx < num_blocks_; block_idx++) {
|
| TimelineEventBlock* block =
|
| - blocks_[(block_idx + block_offset) % num_blocks_];
|
| + &blocks_[(block_idx + block_offset) % num_blocks_];
|
| if (!filter->IncludeBlock(block)) {
|
| continue;
|
| }
|
| @@ -1260,13 +1262,13 @@ void TimelineEventFixedBufferRecorder::PrintTraceEvent(
|
| }
|
|
|
| TimelineEventBlock* TimelineEventFixedBufferRecorder::GetHeadBlockLocked() {
|
| - return blocks_[0];
|
| + return &blocks_[0];
|
| }
|
|
|
| void TimelineEventFixedBufferRecorder::Clear() {
|
| MutexLocker ml(&lock_);
|
| for (intptr_t i = 0; i < num_blocks_; i++) {
|
| - TimelineEventBlock* block = blocks_[i];
|
| + TimelineEventBlock* block = &blocks_[i];
|
| block->Reset();
|
| }
|
| }
|
| @@ -1275,7 +1277,7 @@ intptr_t TimelineEventFixedBufferRecorder::FindOldestBlockIndex() const {
|
| int64_t earliest_time = kMaxInt64;
|
| intptr_t earliest_index = -1;
|
| for (intptr_t block_idx = 0; block_idx < num_blocks_; block_idx++) {
|
| - TimelineEventBlock* block = blocks_[block_idx];
|
| + TimelineEventBlock* block = &blocks_[block_idx];
|
| if (block->IsEmpty()) {
|
| // Skip empty blocks.
|
| continue;
|
| @@ -1305,7 +1307,7 @@ TimelineEventBlock* TimelineEventRingRecorder::GetNewBlockLocked() {
|
| if (block_cursor_ == num_blocks_) {
|
| block_cursor_ = 0;
|
| }
|
| - TimelineEventBlock* block = blocks_[block_cursor_++];
|
| + TimelineEventBlock* block = &blocks_[block_cursor_++];
|
| block->Reset();
|
| block->Open();
|
| return block;
|
| @@ -1315,7 +1317,7 @@ TimelineEventBlock* TimelineEventStartupRecorder::GetNewBlockLocked() {
|
| if (block_cursor_ == num_blocks_) {
|
| return NULL;
|
| }
|
| - TimelineEventBlock* block = blocks_[block_cursor_++];
|
| + TimelineEventBlock* block = &blocks_[block_cursor_++];
|
| block->Reset();
|
| block->Open();
|
| return block;
|
|
|