| 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" |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 } | 119 } |
| 120 | 120 |
| 121 | 121 |
| 122 void Timeline::ReclaimCachedBlocksFromThreads() { | 122 void Timeline::ReclaimCachedBlocksFromThreads() { |
| 123 TimelineEventRecorder* recorder = Timeline::recorder(); | 123 TimelineEventRecorder* recorder = Timeline::recorder(); |
| 124 if (recorder == NULL) { | 124 if (recorder == NULL) { |
| 125 return; | 125 return; |
| 126 } | 126 } |
| 127 | 127 |
| 128 // Iterate over threads. | 128 // Iterate over threads. |
| 129 ThreadIterator it; | 129 OSThreadIterator it; |
| 130 while (it.HasNext()) { | 130 while (it.HasNext()) { |
| 131 Thread* thread = it.Next(); | 131 OSThread* thread = it.Next(); |
| 132 MutexLocker ml(thread->timeline_block_lock()); | 132 MutexLocker ml(thread->timeline_block_lock()); |
| 133 // Grab block and clear it. | 133 // Grab block and clear it. |
| 134 TimelineEventBlock* block = thread->timeline_block(); | 134 TimelineEventBlock* block = thread->timeline_block(); |
| 135 thread->set_timeline_block(NULL); | 135 thread->set_timeline_block(NULL); |
| 136 // TODO(johnmccutchan): Consider dropping the timeline_block_lock here | 136 // TODO(johnmccutchan): Consider dropping the timeline_block_lock here |
| 137 // if we can do it everywhere. This would simplify the lock ordering | 137 // if we can do it everywhere. This would simplify the lock ordering |
| 138 // requirements. | 138 // requirements. |
| 139 recorder->FinishBlock(block); | 139 recorder->FinishBlock(block); |
| 140 } | 140 } |
| 141 } | 141 } |
| (...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 634 : isolate_id_(isolate_id) { | 634 : isolate_id_(isolate_id) { |
| 635 } | 635 } |
| 636 | 636 |
| 637 | 637 |
| 638 TimelineEventRecorder::TimelineEventRecorder() | 638 TimelineEventRecorder::TimelineEventRecorder() |
| 639 : async_id_(0) { | 639 : async_id_(0) { |
| 640 } | 640 } |
| 641 | 641 |
| 642 | 642 |
| 643 void TimelineEventRecorder::PrintJSONMeta(JSONArray* events) const { | 643 void TimelineEventRecorder::PrintJSONMeta(JSONArray* events) const { |
| 644 ThreadIterator it; | 644 OSThreadIterator it; |
| 645 while (it.HasNext()) { | 645 while (it.HasNext()) { |
| 646 Thread* thread = it.Next(); | 646 OSThread* thread = it.Next(); |
| 647 const char* thread_name = thread->name(); | 647 const char* thread_name = thread->name(); |
| 648 if (thread_name == NULL) { | 648 if (thread_name == NULL) { |
| 649 // Only emit a thread name if one was set. | 649 // Only emit a thread name if one was set. |
| 650 continue; | 650 continue; |
| 651 } | 651 } |
| 652 JSONObject obj(events); | 652 JSONObject obj(events); |
| 653 int64_t pid = OS::ProcessId(); | 653 int64_t pid = OS::ProcessId(); |
| 654 int64_t tid = OSThread::ThreadIdToIntPtr(thread->trace_id()); | 654 int64_t tid = OSThread::ThreadIdToIntPtr(thread->trace_id()); |
| 655 obj.AddProperty("name", "thread_name"); | 655 obj.AddProperty("name", "thread_name"); |
| 656 obj.AddProperty("ph", "M"); | 656 obj.AddProperty("ph", "M"); |
| 657 obj.AddProperty64("pid", pid); | 657 obj.AddProperty64("pid", pid); |
| 658 obj.AddProperty64("tid", tid); | 658 obj.AddProperty64("tid", tid); |
| 659 { | 659 { |
| 660 JSONObject args(&obj, "args"); | 660 JSONObject args(&obj, "args"); |
| 661 args.AddPropertyF("name", "%s (%" Pd64 ")", thread_name, tid); | 661 args.AddPropertyF("name", "%s (%" Pd64 ")", thread_name, tid); |
| 662 } | 662 } |
| 663 } | 663 } |
| 664 } | 664 } |
| 665 | 665 |
| 666 | 666 |
| 667 TimelineEvent* TimelineEventRecorder::ThreadBlockStartEvent() { | 667 TimelineEvent* TimelineEventRecorder::ThreadBlockStartEvent() { |
| 668 // Grab the current thread. | 668 // Grab the current thread. |
| 669 Thread* thread = Thread::Current(); | 669 OSThread* thread = OSThread::Current(); |
| 670 ASSERT(thread != NULL); | 670 ASSERT(thread != NULL); |
| 671 Mutex* thread_block_lock = thread->timeline_block_lock(); | 671 Mutex* thread_block_lock = thread->timeline_block_lock(); |
| 672 ASSERT(thread_block_lock != NULL); | 672 ASSERT(thread_block_lock != NULL); |
| 673 // We are accessing the thread's timeline block- so take the lock here. | 673 // We are accessing the thread's timeline block- so take the lock here. |
| 674 // This lock will be held until the call to |CompleteEvent| is made. | 674 // This lock will be held until the call to |CompleteEvent| is made. |
| 675 thread_block_lock->Lock(); | 675 thread_block_lock->Lock(); |
| 676 | 676 |
| 677 TimelineEventBlock* thread_block = thread->timeline_block(); | 677 TimelineEventBlock* thread_block = thread->timeline_block(); |
| 678 | 678 |
| 679 if ((thread_block != NULL) && thread_block->IsFull()) { | 679 if ((thread_block != NULL) && thread_block->IsFull()) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 700 thread_block_lock->Unlock(); | 700 thread_block_lock->Unlock(); |
| 701 return NULL; | 701 return NULL; |
| 702 } | 702 } |
| 703 | 703 |
| 704 | 704 |
| 705 void TimelineEventRecorder::ThreadBlockCompleteEvent(TimelineEvent* event) { | 705 void TimelineEventRecorder::ThreadBlockCompleteEvent(TimelineEvent* event) { |
| 706 if (event == NULL) { | 706 if (event == NULL) { |
| 707 return; | 707 return; |
| 708 } | 708 } |
| 709 // Grab the current thread. | 709 // Grab the current thread. |
| 710 Thread* thread = Thread::Current(); | 710 OSThread* thread = OSThread::Current(); |
| 711 ASSERT(thread != NULL); | 711 ASSERT(thread != NULL); |
| 712 // Unlock the thread's block lock. | 712 // Unlock the thread's block lock. |
| 713 Mutex* thread_block_lock = thread->timeline_block_lock(); | 713 Mutex* thread_block_lock = thread->timeline_block_lock(); |
| 714 ASSERT(thread_block_lock != NULL); | 714 ASSERT(thread_block_lock != NULL); |
| 715 thread_block_lock->Unlock(); | 715 thread_block_lock->Unlock(); |
| 716 } | 716 } |
| 717 | 717 |
| 718 | 718 |
| 719 void TimelineEventRecorder::WriteTo(const char* directory) { | 719 void TimelineEventRecorder::WriteTo(const char* directory) { |
| 720 Dart_FileOpenCallback file_open = Isolate::file_open_callback(); | 720 Dart_FileOpenCallback file_open = Isolate::file_open_callback(); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 894 if (block->LowerTimeBound() < earliest_time) { | 894 if (block->LowerTimeBound() < earliest_time) { |
| 895 earliest_time = block->LowerTimeBound(); | 895 earliest_time = block->LowerTimeBound(); |
| 896 earliest_index = block_idx; | 896 earliest_index = block_idx; |
| 897 } | 897 } |
| 898 } | 898 } |
| 899 return earliest_index; | 899 return earliest_index; |
| 900 } | 900 } |
| 901 | 901 |
| 902 | 902 |
| 903 TimelineEvent* TimelineEventRingRecorder::StartEvent() { | 903 TimelineEvent* TimelineEventRingRecorder::StartEvent() { |
| 904 // Grab the current thread. | |
| 905 Thread* thread = Thread::Current(); | |
| 906 ASSERT(thread != NULL); | |
| 907 return ThreadBlockStartEvent(); | 904 return ThreadBlockStartEvent(); |
| 908 } | 905 } |
| 909 | 906 |
| 910 | 907 |
| 911 void TimelineEventRingRecorder::CompleteEvent(TimelineEvent* event) { | 908 void TimelineEventRingRecorder::CompleteEvent(TimelineEvent* event) { |
| 912 if (event == NULL) { | 909 if (event == NULL) { |
| 913 return; | 910 return; |
| 914 } | 911 } |
| 915 ThreadBlockCompleteEvent(event); | 912 ThreadBlockCompleteEvent(event); |
| 916 } | 913 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 979 PrintJSONEvents(&events, filter); | 976 PrintJSONEvents(&events, filter); |
| 980 } | 977 } |
| 981 | 978 |
| 982 | 979 |
| 983 TimelineEventBlock* TimelineEventEndlessRecorder::GetHeadBlockLocked() { | 980 TimelineEventBlock* TimelineEventEndlessRecorder::GetHeadBlockLocked() { |
| 984 return head_; | 981 return head_; |
| 985 } | 982 } |
| 986 | 983 |
| 987 | 984 |
| 988 TimelineEvent* TimelineEventEndlessRecorder::StartEvent() { | 985 TimelineEvent* TimelineEventEndlessRecorder::StartEvent() { |
| 989 // Grab the current thread. | |
| 990 Thread* thread = Thread::Current(); | |
| 991 ASSERT(thread != NULL); | |
| 992 return ThreadBlockStartEvent(); | 986 return ThreadBlockStartEvent(); |
| 993 } | 987 } |
| 994 | 988 |
| 995 | 989 |
| 996 void TimelineEventEndlessRecorder::CompleteEvent(TimelineEvent* event) { | 990 void TimelineEventEndlessRecorder::CompleteEvent(TimelineEvent* event) { |
| 997 if (event == NULL) { | 991 if (event == NULL) { |
| 998 return; | 992 return; |
| 999 } | 993 } |
| 1000 ThreadBlockCompleteEvent(event); | 994 ThreadBlockCompleteEvent(event); |
| 1001 } | 995 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1038 | 1032 |
| 1039 void TimelineEventEndlessRecorder::Clear() { | 1033 void TimelineEventEndlessRecorder::Clear() { |
| 1040 TimelineEventBlock* current = head_; | 1034 TimelineEventBlock* current = head_; |
| 1041 while (current != NULL) { | 1035 while (current != NULL) { |
| 1042 TimelineEventBlock* next = current->next(); | 1036 TimelineEventBlock* next = current->next(); |
| 1043 delete current; | 1037 delete current; |
| 1044 current = next; | 1038 current = next; |
| 1045 } | 1039 } |
| 1046 head_ = NULL; | 1040 head_ = NULL; |
| 1047 block_index_ = 0; | 1041 block_index_ = 0; |
| 1048 Thread* thread = Thread::Current(); | 1042 OSThread* thread = OSThread::Current(); |
| 1049 thread->set_timeline_block(NULL); | 1043 thread->set_timeline_block(NULL); |
| 1050 } | 1044 } |
| 1051 | 1045 |
| 1052 | 1046 |
| 1053 TimelineEventBlock::TimelineEventBlock(intptr_t block_index) | 1047 TimelineEventBlock::TimelineEventBlock(intptr_t block_index) |
| 1054 : next_(NULL), | 1048 : next_(NULL), |
| 1055 length_(0), | 1049 length_(0), |
| 1056 block_index_(block_index), | 1050 block_index_(block_index), |
| 1057 thread_id_(OSThread::kInvalidThreadId), | 1051 thread_id_(OSThread::kInvalidThreadId), |
| 1058 in_use_(false) { | 1052 in_use_(false) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1169 | 1163 |
| 1170 | 1164 |
| 1171 TimelineEventBlock* TimelineEventBlockIterator::Next() { | 1165 TimelineEventBlock* TimelineEventBlockIterator::Next() { |
| 1172 ASSERT(current_ != NULL); | 1166 ASSERT(current_ != NULL); |
| 1173 TimelineEventBlock* r = current_; | 1167 TimelineEventBlock* r = current_; |
| 1174 current_ = current_->next(); | 1168 current_ = current_->next(); |
| 1175 return r; | 1169 return r; |
| 1176 } | 1170 } |
| 1177 | 1171 |
| 1178 } // namespace dart | 1172 } // namespace dart |
| OLD | NEW |