| 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/atomic.h" | 7 #include "vm/atomic.h" |
| 8 #include "vm/isolate.h" | 8 #include "vm/isolate.h" |
| 9 #include "vm/json_stream.h" | 9 #include "vm/json_stream.h" |
| 10 #include "vm/lockers.h" | 10 #include "vm/lockers.h" |
| 11 #include "vm/log.h" | 11 #include "vm/log.h" |
| 12 #include "vm/object.h" | 12 #include "vm/object.h" |
| 13 #include "vm/thread.h" | 13 #include "vm/thread.h" |
| 14 #include "vm/timeline.h" | 14 #include "vm/timeline.h" |
| 15 | 15 |
| 16 namespace dart { | 16 namespace dart { |
| 17 | 17 |
| 18 #ifndef PRODUCT |
| 19 |
| 18 DEFINE_FLAG(bool, complete_timeline, false, "Record the complete timeline"); | 20 DEFINE_FLAG(bool, complete_timeline, false, "Record the complete timeline"); |
| 19 DEFINE_FLAG(bool, trace_timeline, false, | 21 DEFINE_FLAG(bool, trace_timeline, false, |
| 20 "Trace timeline backend"); | 22 "Trace timeline backend"); |
| 21 DEFINE_FLAG(bool, trace_timeline_analysis, false, | 23 DEFINE_FLAG(bool, trace_timeline_analysis, false, |
| 22 "Trace timeline analysis backend"); | 24 "Trace timeline analysis backend"); |
| 23 DEFINE_FLAG(bool, timing, false, | 25 DEFINE_FLAG(bool, timing, false, |
| 24 "Dump isolate timing information from timeline."); | 26 "Dump isolate timing information from timeline."); |
| 25 DEFINE_FLAG(charp, timeline_dir, NULL, | 27 DEFINE_FLAG(charp, timeline_dir, NULL, |
| 26 "Enable all timeline trace streams and output VM global trace " | 28 "Enable all timeline trace streams and output VM global trace " |
| 27 "into specified directory."); | 29 "into specified directory."); |
| (...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 } | 663 } |
| 662 event->StealArguments(arguments_length_, arguments_); | 664 event->StealArguments(arguments_length_, arguments_); |
| 663 arguments_length_ = 0; | 665 arguments_length_ = 0; |
| 664 arguments_ = NULL; | 666 arguments_ = NULL; |
| 665 } | 667 } |
| 666 | 668 |
| 667 | 669 |
| 668 TimelineDurationScope::TimelineDurationScope(TimelineStream* stream, | 670 TimelineDurationScope::TimelineDurationScope(TimelineStream* stream, |
| 669 const char* label) | 671 const char* label) |
| 670 : TimelineEventScope(stream, label) { | 672 : TimelineEventScope(stream, label) { |
| 673 if (!FLAG_support_timeline) { |
| 674 return; |
| 675 } |
| 671 timestamp_ = OS::GetCurrentMonotonicMicros(); | 676 timestamp_ = OS::GetCurrentMonotonicMicros(); |
| 672 } | 677 } |
| 673 | 678 |
| 674 | 679 |
| 675 TimelineDurationScope::TimelineDurationScope(Thread* thread, | 680 TimelineDurationScope::TimelineDurationScope(Thread* thread, |
| 676 TimelineStream* stream, | 681 TimelineStream* stream, |
| 677 const char* label) | 682 const char* label) |
| 678 : TimelineEventScope(thread, stream, label) { | 683 : TimelineEventScope(thread, stream, label) { |
| 684 if (!FLAG_support_timeline) { |
| 685 return; |
| 686 } |
| 679 timestamp_ = OS::GetCurrentMonotonicMicros(); | 687 timestamp_ = OS::GetCurrentMonotonicMicros(); |
| 680 } | 688 } |
| 681 | 689 |
| 682 | 690 |
| 683 TimelineDurationScope::~TimelineDurationScope() { | 691 TimelineDurationScope::~TimelineDurationScope() { |
| 692 if (!FLAG_support_timeline) { |
| 693 return; |
| 694 } |
| 684 if (!ShouldEmitEvent()) { | 695 if (!ShouldEmitEvent()) { |
| 685 return; | 696 return; |
| 686 } | 697 } |
| 687 TimelineEvent* event = stream()->StartEvent(); | 698 TimelineEvent* event = stream()->StartEvent(); |
| 688 if (event == NULL) { | 699 if (event == NULL) { |
| 689 // Stream is now disabled. | 700 // Stream is now disabled. |
| 690 return; | 701 return; |
| 691 } | 702 } |
| 692 ASSERT(event != NULL); | 703 ASSERT(event != NULL); |
| 693 // Emit a duration event. | 704 // Emit a duration event. |
| 694 event->Duration(label(), timestamp_, OS::GetCurrentMonotonicMicros()); | 705 event->Duration(label(), timestamp_, OS::GetCurrentMonotonicMicros()); |
| 695 StealArguments(event); | 706 StealArguments(event); |
| 696 event->Complete(); | 707 event->Complete(); |
| 697 } | 708 } |
| 698 | 709 |
| 699 | 710 |
| 700 TimelineBeginEndScope::TimelineBeginEndScope(TimelineStream* stream, | 711 TimelineBeginEndScope::TimelineBeginEndScope(TimelineStream* stream, |
| 701 const char* label) | 712 const char* label) |
| 702 : TimelineEventScope(stream, label) { | 713 : TimelineEventScope(stream, label) { |
| 714 if (!FLAG_support_timeline) { |
| 715 return; |
| 716 } |
| 703 EmitBegin(); | 717 EmitBegin(); |
| 704 } | 718 } |
| 705 | 719 |
| 706 | 720 |
| 707 TimelineBeginEndScope::TimelineBeginEndScope(Thread* thread, | 721 TimelineBeginEndScope::TimelineBeginEndScope(Thread* thread, |
| 708 TimelineStream* stream, | 722 TimelineStream* stream, |
| 709 const char* label) | 723 const char* label) |
| 710 : TimelineEventScope(thread, stream, label) { | 724 : TimelineEventScope(thread, stream, label) { |
| 725 if (!FLAG_support_timeline) { |
| 726 return; |
| 727 } |
| 711 EmitBegin(); | 728 EmitBegin(); |
| 712 } | 729 } |
| 713 | 730 |
| 714 | 731 |
| 715 TimelineBeginEndScope::~TimelineBeginEndScope() { | 732 TimelineBeginEndScope::~TimelineBeginEndScope() { |
| 733 if (!FLAG_support_timeline) { |
| 734 return; |
| 735 } |
| 716 EmitEnd(); | 736 EmitEnd(); |
| 717 } | 737 } |
| 718 | 738 |
| 719 | 739 |
| 720 void TimelineBeginEndScope::EmitBegin() { | 740 void TimelineBeginEndScope::EmitBegin() { |
| 741 if (!FLAG_support_timeline) { |
| 742 return; |
| 743 } |
| 721 if (!ShouldEmitEvent()) { | 744 if (!ShouldEmitEvent()) { |
| 722 return; | 745 return; |
| 723 } | 746 } |
| 724 TimelineEvent* event = stream()->StartEvent(); | 747 TimelineEvent* event = stream()->StartEvent(); |
| 725 if (event == NULL) { | 748 if (event == NULL) { |
| 726 // Stream is now disabled. | 749 // Stream is now disabled. |
| 727 set_enabled(false); | 750 set_enabled(false); |
| 728 return; | 751 return; |
| 729 } | 752 } |
| 730 ASSERT(event != NULL); | 753 ASSERT(event != NULL); |
| 731 // Emit a begin event. | 754 // Emit a begin event. |
| 732 event->Begin(label()); | 755 event->Begin(label()); |
| 733 event->Complete(); | 756 event->Complete(); |
| 734 } | 757 } |
| 735 | 758 |
| 736 | 759 |
| 737 void TimelineBeginEndScope::EmitEnd() { | 760 void TimelineBeginEndScope::EmitEnd() { |
| 761 if (!FLAG_support_timeline) { |
| 762 return; |
| 763 } |
| 738 if (!ShouldEmitEvent()) { | 764 if (!ShouldEmitEvent()) { |
| 739 return; | 765 return; |
| 740 } | 766 } |
| 741 TimelineEvent* event = stream()->StartEvent(); | 767 TimelineEvent* event = stream()->StartEvent(); |
| 742 if (event == NULL) { | 768 if (event == NULL) { |
| 743 // Stream is now disabled. | 769 // Stream is now disabled. |
| 744 set_enabled(false); | 770 set_enabled(false); |
| 745 return; | 771 return; |
| 746 } | 772 } |
| 747 ASSERT(event != NULL); | 773 ASSERT(event != NULL); |
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1373 } | 1399 } |
| 1374 | 1400 |
| 1375 | 1401 |
| 1376 TimelineEventBlock* TimelineEventBlockIterator::Next() { | 1402 TimelineEventBlock* TimelineEventBlockIterator::Next() { |
| 1377 ASSERT(current_ != NULL); | 1403 ASSERT(current_ != NULL); |
| 1378 TimelineEventBlock* r = current_; | 1404 TimelineEventBlock* r = current_; |
| 1379 current_ = current_->next(); | 1405 current_ = current_->next(); |
| 1380 return r; | 1406 return r; |
| 1381 } | 1407 } |
| 1382 | 1408 |
| 1409 #endif // !PRODUCT |
| 1410 |
| 1383 } // namespace dart | 1411 } // namespace dart |
| OLD | NEW |