Index: runtime/vm/timeline.cc |
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc |
index 2cf812bceece0f7d77036169aa0ca041db654a14..ca6e9a2fd189f652030f11c10def8de6b8857880 100644 |
--- a/runtime/vm/timeline.cc |
+++ b/runtime/vm/timeline.cc |
@@ -721,6 +721,7 @@ void TimelineBeginEndScope::EmitBegin() { |
TimelineEvent* event = stream()->StartEvent(); |
if (event == NULL) { |
// Stream is now disabled. |
+ set_enabled(false); |
return; |
} |
ASSERT(event != NULL); |
@@ -737,6 +738,7 @@ void TimelineBeginEndScope::EmitEnd() { |
TimelineEvent* event = stream()->StartEvent(); |
if (event == NULL) { |
// Stream is now disabled. |
+ set_enabled(false); |
return; |
} |
ASSERT(event != NULL); |
@@ -1160,17 +1162,35 @@ TimelineEventBlock* TimelineEventEndlessRecorder::GetNewBlockLocked() { |
return head_; |
} |
+static int TimelineEventBlockCompare(TimelineEventBlock* const* a, |
+ TimelineEventBlock* const* b) { |
+ return (*a)->LowerTimeBound() - (*b)->LowerTimeBound(); |
+} |
+ |
void TimelineEventEndlessRecorder::PrintJSONEvents( |
JSONArray* events, |
TimelineEventFilter* filter) { |
MutexLocker ml(&lock_); |
+ // Collect all interesting blocks. |
+ MallocGrowableArray<TimelineEventBlock*> blocks(8); |
TimelineEventBlock* current = head_; |
while (current != NULL) { |
- if (!filter->IncludeBlock(current)) { |
- current = current->next(); |
- continue; |
+ if (filter->IncludeBlock(current)) { |
+ blocks.Add(current); |
} |
+ current = current->next(); |
+ } |
+ // Bail early. |
+ if (blocks.length() == 0) { |
+ return; |
+ } |
+ // Sort the interesting blocks so that blocks with earlier events are |
+ // outputted first. |
+ blocks.Sort(TimelineEventBlockCompare); |
+ // Output blocks in sorted order. |
+ for (intptr_t block_idx = 0; block_idx < blocks.length(); block_idx++) { |
+ current = blocks[block_idx]; |
intptr_t length = current->length(); |
for (intptr_t i = 0; i < length; i++) { |
TimelineEvent* event = current->At(i); |
@@ -1180,7 +1200,6 @@ void TimelineEventEndlessRecorder::PrintJSONEvents( |
events->AddValue(event); |
} |
} |
- current = current->next(); |
} |
} |