Index: runtime/vm/dart_api_impl.cc |
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc |
index 10b9f95e29d0fe40d985574998f877ec68765a38..e47d14e0f754c21b2c910ee6deab5b37918e1b99 100644 |
--- a/runtime/vm/dart_api_impl.cc |
+++ b/runtime/vm/dart_api_impl.cc |
@@ -5714,34 +5714,10 @@ DART_EXPORT void Dart_GlobalTimelineSetRecordedStreams(int64_t stream_mask) { |
} |
-DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer, |
- void* user_data) { |
- Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
- if (consumer == NULL) { |
- return false; |
- } |
- TimelineEventRecorder* timeline_recorder = Timeline::recorder(); |
- if (timeline_recorder == NULL) { |
- // Nothing has been recorded. |
- return false; |
- } |
- // Suspend execution of other threads while serializing to JSON. |
- isolate->thread_registry()->SafepointThreads(); |
- JSONStream js; |
- IsolateTimelineEventFilter filter(isolate); |
- timeline_recorder->PrintJSON(&js, &filter); |
- // Resume execution of other threads. |
- isolate->thread_registry()->ResumeAllThreads(); |
- |
- // Copy output. |
- char* output = NULL; |
- intptr_t output_length = 0; |
- js.Steal(const_cast<const char**>(&output), &output_length); |
- if (output != NULL) { |
- // Add one for the '\0' character. |
- output_length++; |
- } |
+static void StreamToConsumer(Dart_StreamConsumer consumer, |
+ void* user_data, |
+ char* output, |
+ intptr_t output_length) { |
// Start stream. |
const char* kStreamName = "timeline"; |
const intptr_t kDataSize = 64 * KB; |
@@ -5775,8 +5751,6 @@ DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer, |
} |
ASSERT(cursor == output_length); |
ASSERT(remaining == 0); |
- // We stole the JSONStream's output buffer, free it. |
- free(output); |
// Finish stream. |
consumer(Dart_StreamConsumer_kFinish, |
@@ -5784,6 +5758,76 @@ DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer, |
NULL, |
0, |
user_data); |
+} |
+ |
+ |
+DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer, |
+ void* user_data) { |
+ Isolate* isolate = Isolate::Current(); |
+ CHECK_ISOLATE(isolate); |
+ if (consumer == NULL) { |
+ return false; |
+ } |
+ TimelineEventRecorder* timeline_recorder = Timeline::recorder(); |
+ if (timeline_recorder == NULL) { |
+ // Nothing has been recorded. |
+ return false; |
+ } |
+ // Suspend execution of other threads while serializing to JSON. |
+ isolate->thread_registry()->SafepointThreads(); |
+ // TODO(johnmccutchan): Reclaim open blocks from isolate so we have a complete |
+ // timeline. |
+ JSONStream js; |
+ IsolateTimelineEventFilter filter(isolate); |
+ timeline_recorder->PrintJSON(&js, &filter); |
+ // Resume execution of other threads. |
+ isolate->thread_registry()->ResumeAllThreads(); |
+ |
+ // Copy output. |
+ char* output = NULL; |
+ intptr_t output_length = 0; |
+ js.Steal(const_cast<const char**>(&output), &output_length); |
+ if (output != NULL) { |
+ // Add one for the '\0' character. |
+ output_length++; |
+ } |
+ StreamToConsumer(consumer, user_data, output, output_length); |
+ |
+ // We stole the JSONStream's output buffer, free it. |
+ free(output); |
+ return true; |
+} |
+ |
+ |
+DART_EXPORT bool Dart_GlobalTimelineGetTrace(Dart_StreamConsumer consumer, |
+ void* user_data) { |
+ if (consumer == NULL) { |
+ return false; |
+ } |
+ TimelineEventRecorder* timeline_recorder = Timeline::recorder(); |
+ if (timeline_recorder == NULL) { |
+ // Nothing has been recorded. |
+ return false; |
+ } |
+ |
+ // TODO(johnmccutchan): Reclaim all open blocks from the system so we have |
+ // a complete timeline. |
+ JSONStream js; |
+ TimelineEventFilter filter; |
+ timeline_recorder->PrintJSON(&js, &filter); |
+ |
+ // Copy output. |
+ char* output = NULL; |
+ intptr_t output_length = 0; |
+ js.Steal(const_cast<const char**>(&output), &output_length); |
+ if (output != NULL) { |
+ // Add one for the '\0' character. |
+ output_length++; |
+ } |
+ StreamToConsumer(consumer, user_data, output, output_length); |
+ |
+ // We stole the JSONStream's output buffer, free it. |
+ free(output); |
return true; |
} |