OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include <cstdlib> | 5 #include <cstdlib> |
6 | 6 |
7 #include "vm/isolate.h" | 7 #include "vm/isolate.h" |
8 #include "vm/json_stream.h" | 8 #include "vm/json_stream.h" |
9 #include "vm/lockers.h" | 9 #include "vm/lockers.h" |
10 #include "vm/object.h" | 10 #include "vm/object.h" |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 for (intptr_t i = 0; i < num_blocks_; i++) { | 413 for (intptr_t i = 0; i < num_blocks_; i++) { |
414 TimelineEventBlock* block = blocks_[i]; | 414 TimelineEventBlock* block = blocks_[i]; |
415 delete block; | 415 delete block; |
416 } | 416 } |
417 free(blocks_); | 417 free(blocks_); |
418 event_objects_ = Array::null(); | 418 event_objects_ = Array::null(); |
419 } | 419 } |
420 | 420 |
421 | 421 |
422 void TimelineEventRingRecorder::PrintJSONEvents(JSONArray* events) const { | 422 void TimelineEventRingRecorder::PrintJSONEvents(JSONArray* events) const { |
423 // TODO(johnmccutchan): This output needs to start with the oldest block | 423 intptr_t block_offset = FindOldestBlockIndex(); |
424 // first. | 424 if (block_offset == -1) { |
| 425 // All blocks are empty. |
| 426 return; |
| 427 } |
425 for (intptr_t block_idx = 0; block_idx < num_blocks_; block_idx++) { | 428 for (intptr_t block_idx = 0; block_idx < num_blocks_; block_idx++) { |
426 TimelineEventBlock* block = blocks_[block_idx]; | 429 TimelineEventBlock* block = |
| 430 blocks_[(block_idx + block_offset) % num_blocks_]; |
427 if (block->IsEmpty()) { | 431 if (block->IsEmpty()) { |
428 // Skip empty blocks. | 432 // Skip empty blocks. |
429 continue; | 433 continue; |
430 } | 434 } |
431 for (intptr_t event_idx = 0; event_idx < block->length(); event_idx++) { | 435 for (intptr_t event_idx = 0; event_idx < block->length(); event_idx++) { |
432 TimelineEvent* event = block->At(event_idx); | 436 TimelineEvent* event = block->At(event_idx); |
433 if (event->IsValid()) { | 437 if (event->IsValid()) { |
434 events->AddValue(event); | 438 events->AddValue(event); |
435 } | 439 } |
436 } | 440 } |
(...skipping 27 matching lines...) Expand all Loading... |
464 TimelineEventBlock* TimelineEventRingRecorder::GetNewBlockLocked() { | 468 TimelineEventBlock* TimelineEventRingRecorder::GetNewBlockLocked() { |
465 if (block_cursor_ == num_blocks_) { | 469 if (block_cursor_ == num_blocks_) { |
466 block_cursor_ = 0; | 470 block_cursor_ = 0; |
467 } | 471 } |
468 TimelineEventBlock* block = blocks_[block_cursor_++]; | 472 TimelineEventBlock* block = blocks_[block_cursor_++]; |
469 block->Reset(); | 473 block->Reset(); |
470 return block; | 474 return block; |
471 } | 475 } |
472 | 476 |
473 | 477 |
| 478 intptr_t TimelineEventRingRecorder::FindOldestBlockIndex() const { |
| 479 int64_t earliest_time = kMaxInt64; |
| 480 intptr_t earliest_index = -1; |
| 481 for (intptr_t block_idx = 0; block_idx < num_blocks_; block_idx++) { |
| 482 TimelineEventBlock* block = blocks_[block_idx]; |
| 483 if (block->IsEmpty()) { |
| 484 // Skip empty blocks. |
| 485 continue; |
| 486 } |
| 487 if (block->LowerTimeBound() < earliest_time) { |
| 488 earliest_time = block->LowerTimeBound(); |
| 489 earliest_index = block_idx; |
| 490 } |
| 491 } |
| 492 return earliest_index; |
| 493 } |
| 494 |
| 495 |
474 void TimelineEventRingRecorder::VisitObjectPointers( | 496 void TimelineEventRingRecorder::VisitObjectPointers( |
475 ObjectPointerVisitor* visitor) { | 497 ObjectPointerVisitor* visitor) { |
476 visitor->VisitPointer(reinterpret_cast<RawObject**>(&event_objects_)); | 498 visitor->VisitPointer(reinterpret_cast<RawObject**>(&event_objects_)); |
477 } | 499 } |
478 | 500 |
479 | 501 |
480 TimelineEvent* TimelineEventRingRecorder::StartEvent(const Object& obj) { | 502 TimelineEvent* TimelineEventRingRecorder::StartEvent(const Object& obj) { |
481 TimelineEvent* event = StartEvent(); | 503 TimelineEvent* event = StartEvent(); |
482 if (event == NULL) { | 504 if (event == NULL) { |
483 return NULL; | 505 return NULL; |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 } | 741 } |
720 if (current_ == NULL) { | 742 if (current_ == NULL) { |
721 current_ = recorder_->GetHeadBlock(); | 743 current_ = recorder_->GetHeadBlock(); |
722 } else { | 744 } else { |
723 current_ = current_->next(); | 745 current_ = current_->next(); |
724 } | 746 } |
725 return current_ != NULL; | 747 return current_ != NULL; |
726 } | 748 } |
727 | 749 |
728 } // namespace dart | 750 } // namespace dart |
OLD | NEW |