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 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 } | 714 } |
715 | 715 |
716 | 716 |
717 void TimelineBeginEndScope::EmitBegin() { | 717 void TimelineBeginEndScope::EmitBegin() { |
718 if (!ShouldEmitEvent()) { | 718 if (!ShouldEmitEvent()) { |
719 return; | 719 return; |
720 } | 720 } |
721 TimelineEvent* event = stream()->StartEvent(); | 721 TimelineEvent* event = stream()->StartEvent(); |
722 if (event == NULL) { | 722 if (event == NULL) { |
723 // Stream is now disabled. | 723 // Stream is now disabled. |
| 724 set_enabled(false); |
724 return; | 725 return; |
725 } | 726 } |
726 ASSERT(event != NULL); | 727 ASSERT(event != NULL); |
727 // Emit a begin event. | 728 // Emit a begin event. |
728 event->Begin(label()); | 729 event->Begin(label()); |
729 event->Complete(); | 730 event->Complete(); |
730 } | 731 } |
731 | 732 |
732 | 733 |
733 void TimelineBeginEndScope::EmitEnd() { | 734 void TimelineBeginEndScope::EmitEnd() { |
734 if (!ShouldEmitEvent()) { | 735 if (!ShouldEmitEvent()) { |
735 return; | 736 return; |
736 } | 737 } |
737 TimelineEvent* event = stream()->StartEvent(); | 738 TimelineEvent* event = stream()->StartEvent(); |
738 if (event == NULL) { | 739 if (event == NULL) { |
739 // Stream is now disabled. | 740 // Stream is now disabled. |
| 741 set_enabled(false); |
740 return; | 742 return; |
741 } | 743 } |
742 ASSERT(event != NULL); | 744 ASSERT(event != NULL); |
743 // Emit an end event. | 745 // Emit an end event. |
744 event->End(label()); | 746 event->End(label()); |
745 StealArguments(event); | 747 StealArguments(event); |
746 event->Complete(); | 748 event->Complete(); |
747 } | 749 } |
748 | 750 |
749 | 751 |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1153 TimelineEventBlock* block = new TimelineEventBlock(block_index_++); | 1155 TimelineEventBlock* block = new TimelineEventBlock(block_index_++); |
1154 block->set_next(head_); | 1156 block->set_next(head_); |
1155 block->Open(); | 1157 block->Open(); |
1156 head_ = block; | 1158 head_ = block; |
1157 if (FLAG_trace_timeline) { | 1159 if (FLAG_trace_timeline) { |
1158 OS::Print("Created new block %p\n", block); | 1160 OS::Print("Created new block %p\n", block); |
1159 } | 1161 } |
1160 return head_; | 1162 return head_; |
1161 } | 1163 } |
1162 | 1164 |
| 1165 static int TimelineEventBlockCompare(TimelineEventBlock* const* a, |
| 1166 TimelineEventBlock* const* b) { |
| 1167 return (*a)->LowerTimeBound() - (*b)->LowerTimeBound(); |
| 1168 } |
| 1169 |
1163 | 1170 |
1164 void TimelineEventEndlessRecorder::PrintJSONEvents( | 1171 void TimelineEventEndlessRecorder::PrintJSONEvents( |
1165 JSONArray* events, | 1172 JSONArray* events, |
1166 TimelineEventFilter* filter) { | 1173 TimelineEventFilter* filter) { |
1167 MutexLocker ml(&lock_); | 1174 MutexLocker ml(&lock_); |
| 1175 // Collect all interesting blocks. |
| 1176 MallocGrowableArray<TimelineEventBlock*> blocks(8); |
1168 TimelineEventBlock* current = head_; | 1177 TimelineEventBlock* current = head_; |
1169 while (current != NULL) { | 1178 while (current != NULL) { |
1170 if (!filter->IncludeBlock(current)) { | 1179 if (filter->IncludeBlock(current)) { |
1171 current = current->next(); | 1180 blocks.Add(current); |
1172 continue; | |
1173 } | 1181 } |
| 1182 current = current->next(); |
| 1183 } |
| 1184 // Bail early. |
| 1185 if (blocks.length() == 0) { |
| 1186 return; |
| 1187 } |
| 1188 // Sort the interesting blocks so that blocks with earlier events are |
| 1189 // outputted first. |
| 1190 blocks.Sort(TimelineEventBlockCompare); |
| 1191 // Output blocks in sorted order. |
| 1192 for (intptr_t block_idx = 0; block_idx < blocks.length(); block_idx++) { |
| 1193 current = blocks[block_idx]; |
1174 intptr_t length = current->length(); | 1194 intptr_t length = current->length(); |
1175 for (intptr_t i = 0; i < length; i++) { | 1195 for (intptr_t i = 0; i < length; i++) { |
1176 TimelineEvent* event = current->At(i); | 1196 TimelineEvent* event = current->At(i); |
1177 if (filter->IncludeEvent(event) && | 1197 if (filter->IncludeEvent(event) && |
1178 event->Within(filter->time_origin_micros(), | 1198 event->Within(filter->time_origin_micros(), |
1179 filter->time_extent_micros())) { | 1199 filter->time_extent_micros())) { |
1180 events->AddValue(event); | 1200 events->AddValue(event); |
1181 } | 1201 } |
1182 } | 1202 } |
1183 current = current->next(); | |
1184 } | 1203 } |
1185 } | 1204 } |
1186 | 1205 |
1187 | 1206 |
1188 void TimelineEventEndlessRecorder::Clear() { | 1207 void TimelineEventEndlessRecorder::Clear() { |
1189 TimelineEventBlock* current = head_; | 1208 TimelineEventBlock* current = head_; |
1190 while (current != NULL) { | 1209 while (current != NULL) { |
1191 TimelineEventBlock* next = current->next(); | 1210 TimelineEventBlock* next = current->next(); |
1192 delete current; | 1211 delete current; |
1193 current = next; | 1212 current = next; |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1322 | 1341 |
1323 | 1342 |
1324 TimelineEventBlock* TimelineEventBlockIterator::Next() { | 1343 TimelineEventBlock* TimelineEventBlockIterator::Next() { |
1325 ASSERT(current_ != NULL); | 1344 ASSERT(current_ != NULL); |
1326 TimelineEventBlock* r = current_; | 1345 TimelineEventBlock* r = current_; |
1327 current_ = current_->next(); | 1346 current_ = current_->next(); |
1328 return r; | 1347 return r; |
1329 } | 1348 } |
1330 | 1349 |
1331 } // namespace dart | 1350 } // namespace dart |
OLD | NEW |