Index: runtime/vm/dart_api_impl.cc |
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc |
index 4f2499449116cce4006c9a958932f38254397023..498130474c0a56c38a2a90e755c8bd4ba7d5bf5d 100644 |
--- a/runtime/vm/dart_api_impl.cc |
+++ b/runtime/vm/dart_api_impl.cc |
@@ -5890,7 +5890,8 @@ static void DataStreamToConsumer(Dart_StreamConsumer consumer, |
static bool StreamTraceEvents(Dart_StreamConsumer consumer, |
void* user_data, |
- JSONStream* js) { |
+ JSONStream* js, |
+ bool insert_comma) { |
ASSERT(js != NULL); |
// Steal output from JSONStream. |
char* output = NULL; |
@@ -5907,23 +5908,24 @@ static bool StreamTraceEvents(Dart_StreamConsumer consumer, |
ASSERT(output[output_length - 1] == ']'); |
// Replace the ']' with the null character. |
output[output_length - 1] = '\0'; |
- // We are skipping the '['. |
- output_length -= 1; |
- |
- // Start the stream. |
- StartStreamToConsumer(consumer, user_data, "timeline"); |
+ char* start = &output[1]; |
+ if (insert_comma) { |
+ output[0] = ','; |
+ start = &output[0]; |
+ } else { |
+ // We are skipping the '['. |
+ output_length -= 1; |
+ } |
DataStreamToConsumer(consumer, |
user_data, |
- &output[1], |
+ start, |
output_length, |
"timeline"); |
// We stole the JSONStream's output buffer, free it. |
free(output); |
- // Finish the stream. |
- FinishStreamToConsumer(consumer, user_data, "timeline"); |
return true; |
} |
@@ -5949,7 +5951,20 @@ DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer, |
JSONStream js; |
IsolateTimelineEventFilter filter(isolate->main_port()); |
timeline_recorder->PrintTraceEvent(&js, &filter); |
- return StreamTraceEvents(consumer, user_data, &js); |
+ StartStreamToConsumer(consumer, user_data, "timeline"); |
+ bool success = StreamTraceEvents(consumer, user_data, &js, false); |
+ FinishStreamToConsumer(consumer, user_data, "timeline"); |
+ return success; |
+} |
+ |
+ |
+DART_EXPORT void Dart_SetEmbedderTimelineCallbacks( |
+ Dart_EmbedderTimelineStartRecording start_recording, |
+ Dart_EmbedderTimelineStopRecording stop_recording, |
+ Dart_EmbedderTimelineGetTimeline get_timeline) { |
+ Timeline::set_start_recording_cb(start_recording); |
+ Timeline::set_stop_recording_cb(stop_recording); |
+ Timeline::set_get_timeline_cb(get_timeline); |
} |
@@ -5974,7 +5989,18 @@ DART_EXPORT bool Dart_GlobalTimelineGetTrace(Dart_StreamConsumer consumer, |
JSONStream js; |
TimelineEventFilter filter; |
timeline_recorder->PrintTraceEvent(&js, &filter); |
- return StreamTraceEvents(consumer, user_data, &js); |
+ StartStreamToConsumer(consumer, user_data, "timeline"); |
+ bool success = false; |
+ if (Timeline::get_get_timeline_cb() != NULL) { |
+ if (Timeline::get_get_timeline_cb()(consumer, user_data)) { |
+ success = true; |
+ } |
+ } |
+ if (StreamTraceEvents(consumer, user_data, &js, success)) { |
+ success = true; |
+ } |
+ FinishStreamToConsumer(consumer, user_data, "timeline"); |
+ return success; |
} |
@@ -6099,7 +6125,6 @@ DART_EXPORT Dart_Handle Dart_TimelineAsyncEnd(const char* label, |
return Api::Success(); |
} |
- |
// The precompiler is included in dart_bootstrap and dart_noopt, and |
// excluded from dart and dart_precompiled_runtime. |
#if !defined(DART_PRECOMPILER) |