Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: runtime/vm/dart_api_impl.cc

Issue 1783953002: Add ability for embedder to provide private timeline trace data (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 "include/dart_api.h" 5 #include "include/dart_api.h"
6 #include "include/dart_mirrors_api.h" 6 #include "include/dart_mirrors_api.h"
7 #include "include/dart_native_api.h" 7 #include "include/dart_native_api.h"
8 8
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "lib/stacktrace.h" 10 #include "lib/stacktrace.h"
(...skipping 5872 matching lines...) Expand 10 before | Expand all | Expand 10 after
5883 cursor += remaining; 5883 cursor += remaining;
5884 remaining -= remaining; 5884 remaining -= remaining;
5885 } 5885 }
5886 ASSERT(cursor == output_length); 5886 ASSERT(cursor == output_length);
5887 ASSERT(remaining == 0); 5887 ASSERT(remaining == 0);
5888 } 5888 }
5889 5889
5890 5890
5891 static bool StreamTraceEvents(Dart_StreamConsumer consumer, 5891 static bool StreamTraceEvents(Dart_StreamConsumer consumer,
5892 void* user_data, 5892 void* user_data,
5893 JSONStream* js) { 5893 JSONStream* js,
5894 bool insert_comma) {
5894 ASSERT(js != NULL); 5895 ASSERT(js != NULL);
5895 // Steal output from JSONStream. 5896 // Steal output from JSONStream.
5896 char* output = NULL; 5897 char* output = NULL;
5897 intptr_t output_length = 0; 5898 intptr_t output_length = 0;
5898 js->Steal(const_cast<const char**>(&output), &output_length); 5899 js->Steal(const_cast<const char**>(&output), &output_length);
5899 if (output_length < 3) { 5900 if (output_length < 3) {
5900 // Empty JSON array. 5901 // Empty JSON array.
5901 free(output); 5902 free(output);
5902 return false; 5903 return false;
5903 } 5904 }
5904 // We want to send the JSON array without the leading '[' or trailing ']' 5905 // We want to send the JSON array without the leading '[' or trailing ']'
5905 // characters. 5906 // characters.
5906 ASSERT(output[0] == '['); 5907 ASSERT(output[0] == '[');
5907 ASSERT(output[output_length - 1] == ']'); 5908 ASSERT(output[output_length - 1] == ']');
5908 // Replace the ']' with the null character. 5909 // Replace the ']' with the null character.
5909 output[output_length - 1] = '\0'; 5910 output[output_length - 1] = '\0';
5910 // We are skipping the '['. 5911 char* start = &output[1];
5911 output_length -= 1; 5912 if (insert_comma) {
5912 5913 output[0] = ',';
5913 // Start the stream. 5914 start = &output[0];
5914 StartStreamToConsumer(consumer, user_data, "timeline"); 5915 } else {
5916 // We are skipping the '['.
5917 output_length -= 1;
5918 }
5915 5919
5916 DataStreamToConsumer(consumer, 5920 DataStreamToConsumer(consumer,
5917 user_data, 5921 user_data,
5918 &output[1], 5922 start,
5919 output_length, 5923 output_length,
5920 "timeline"); 5924 "timeline");
5921 5925
5922 // We stole the JSONStream's output buffer, free it. 5926 // We stole the JSONStream's output buffer, free it.
5923 free(output); 5927 free(output);
5924 5928
5925 // Finish the stream.
5926 FinishStreamToConsumer(consumer, user_data, "timeline");
5927 return true; 5929 return true;
5928 } 5930 }
5929 5931
5930 5932
5931 DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer, 5933 DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer,
5932 void* user_data) { 5934 void* user_data) {
5933 if (!FLAG_support_timeline) { 5935 if (!FLAG_support_timeline) {
5934 return false; 5936 return false;
5935 } 5937 }
5936 Isolate* isolate = Isolate::Current(); 5938 Isolate* isolate = Isolate::Current();
5937 CHECK_ISOLATE(isolate); 5939 CHECK_ISOLATE(isolate);
5938 if (consumer == NULL) { 5940 if (consumer == NULL) {
5939 return false; 5941 return false;
5940 } 5942 }
5941 TimelineEventRecorder* timeline_recorder = Timeline::recorder(); 5943 TimelineEventRecorder* timeline_recorder = Timeline::recorder();
5942 if (timeline_recorder == NULL) { 5944 if (timeline_recorder == NULL) {
5943 // Nothing has been recorded. 5945 // Nothing has been recorded.
5944 return false; 5946 return false;
5945 } 5947 }
5946 Thread* T = Thread::Current(); 5948 Thread* T = Thread::Current();
5947 StackZone zone(T); 5949 StackZone zone(T);
5948 Timeline::ReclaimCachedBlocksFromThreads(); 5950 Timeline::ReclaimCachedBlocksFromThreads();
5949 JSONStream js; 5951 JSONStream js;
5950 IsolateTimelineEventFilter filter(isolate->main_port()); 5952 IsolateTimelineEventFilter filter(isolate->main_port());
5951 timeline_recorder->PrintTraceEvent(&js, &filter); 5953 timeline_recorder->PrintTraceEvent(&js, &filter);
5952 return StreamTraceEvents(consumer, user_data, &js); 5954 StartStreamToConsumer(consumer, user_data, "timeline");
5955 bool success = StreamTraceEvents(consumer, user_data, &js, false);
5956 FinishStreamToConsumer(consumer, user_data, "timeline");
5957 return success;
5953 } 5958 }
5954 5959
5955 5960
5961 DART_EXPORT void Dart_SetEmbedderTimelineCallbacks(
5962 Dart_EmbedderTimelineStartRecording start_recording,
5963 Dart_EmbedderTimelineStopRecording stop_recording,
5964 Dart_EmbedderTimelineGetTimeline get_timeline) {
5965 Timeline::set_start_recording_cb(start_recording);
5966 Timeline::set_stop_recording_cb(stop_recording);
5967 Timeline::set_get_timeline_cb(get_timeline);
5968 }
5969
5970
5956 DART_EXPORT bool Dart_GlobalTimelineGetTrace(Dart_StreamConsumer consumer, 5971 DART_EXPORT bool Dart_GlobalTimelineGetTrace(Dart_StreamConsumer consumer,
5957 void* user_data) { 5972 void* user_data) {
5958 if (!FLAG_support_timeline) { 5973 if (!FLAG_support_timeline) {
5959 return false; 5974 return false;
5960 } 5975 }
5961 // To support various embedders, it must be possible to call this function 5976 // To support various embedders, it must be possible to call this function
5962 // from a thread for which we have not entered an Isolate and set up a Thread 5977 // from a thread for which we have not entered an Isolate and set up a Thread
5963 // TLS object. Therefore, a Zone may not be available, a StackZone cannot be 5978 // TLS object. Therefore, a Zone may not be available, a StackZone cannot be
5964 // created, and no ZoneAllocated objects can be allocated. 5979 // created, and no ZoneAllocated objects can be allocated.
5965 if (consumer == NULL) { 5980 if (consumer == NULL) {
5966 return false; 5981 return false;
5967 } 5982 }
5968 TimelineEventRecorder* timeline_recorder = Timeline::recorder(); 5983 TimelineEventRecorder* timeline_recorder = Timeline::recorder();
5969 if (timeline_recorder == NULL) { 5984 if (timeline_recorder == NULL) {
5970 // Nothing has been recorded. 5985 // Nothing has been recorded.
5971 return false; 5986 return false;
5972 } 5987 }
5973 Timeline::ReclaimCachedBlocksFromThreads(); 5988 Timeline::ReclaimCachedBlocksFromThreads();
5974 JSONStream js; 5989 JSONStream js;
5975 TimelineEventFilter filter; 5990 TimelineEventFilter filter;
5976 timeline_recorder->PrintTraceEvent(&js, &filter); 5991 timeline_recorder->PrintTraceEvent(&js, &filter);
5977 return StreamTraceEvents(consumer, user_data, &js); 5992 StartStreamToConsumer(consumer, user_data, "timeline");
5993 bool success = false;
5994 if (Timeline::get_get_timeline_cb() != NULL) {
5995 if (Timeline::get_get_timeline_cb()(consumer, user_data)) {
5996 success = true;
5997 }
5998 }
5999 if (StreamTraceEvents(consumer, user_data, &js, success)) {
6000 success = true;
6001 }
6002 FinishStreamToConsumer(consumer, user_data, "timeline");
6003 return success;
5978 } 6004 }
5979 6005
5980 6006
5981 DART_EXPORT Dart_Handle Dart_TimelineDuration(const char* label, 6007 DART_EXPORT Dart_Handle Dart_TimelineDuration(const char* label,
5982 int64_t start_micros, 6008 int64_t start_micros,
5983 int64_t end_micros) { 6009 int64_t end_micros) {
5984 if (!FLAG_support_timeline) { 6010 if (!FLAG_support_timeline) {
5985 return Api::Success(); 6011 return Api::Success();
5986 } 6012 }
5987 Isolate* isolate = Isolate::Current(); 6013 Isolate* isolate = Isolate::Current();
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
6092 TimelineStream* stream = isolate->GetEmbedderStream(); 6118 TimelineStream* stream = isolate->GetEmbedderStream();
6093 ASSERT(stream != NULL); 6119 ASSERT(stream != NULL);
6094 TimelineEvent* event = stream->StartEvent(); 6120 TimelineEvent* event = stream->StartEvent();
6095 if (event != NULL) { 6121 if (event != NULL) {
6096 event->AsyncEnd(label, async_id); 6122 event->AsyncEnd(label, async_id);
6097 event->Complete(); 6123 event->Complete();
6098 } 6124 }
6099 return Api::Success(); 6125 return Api::Success();
6100 } 6126 }
6101 6127
6102
6103 // The precompiler is included in dart_bootstrap and dart_noopt, and 6128 // The precompiler is included in dart_bootstrap and dart_noopt, and
6104 // excluded from dart and dart_precompiled_runtime. 6129 // excluded from dart and dart_precompiled_runtime.
6105 #if !defined(DART_PRECOMPILER) 6130 #if !defined(DART_PRECOMPILER)
6106 6131
6107 DART_EXPORT Dart_Handle Dart_Precompile( 6132 DART_EXPORT Dart_Handle Dart_Precompile(
6108 Dart_QualifiedFunctionName entry_points[], 6133 Dart_QualifiedFunctionName entry_points[],
6109 bool reset_fields) { 6134 bool reset_fields) {
6110 UNREACHABLE(); 6135 UNREACHABLE();
6111 return 0; 6136 return 0;
6112 } 6137 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
6198 return Api::Success(); 6223 return Api::Success();
6199 } 6224 }
6200 #endif // DART_PRECOMPILER 6225 #endif // DART_PRECOMPILER
6201 6226
6202 6227
6203 DART_EXPORT bool Dart_IsRunningPrecompiledCode() { 6228 DART_EXPORT bool Dart_IsRunningPrecompiledCode() {
6204 return Dart::IsRunningPrecompiledCode(); 6229 return Dart::IsRunningPrecompiledCode();
6205 } 6230 }
6206 6231
6207 } // namespace dart 6232 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698