Index: runtime/vm/dart_api_impl.cc |
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc |
index 12a7fdb29e501f2d732d551fc6b715e79d1be954..6e1d9f5dc8ff48400092056bee3ee5f86c594d0d 100644 |
--- a/runtime/vm/dart_api_impl.cc |
+++ b/runtime/vm/dart_api_impl.cc |
@@ -78,12 +78,12 @@ const char* CanonicalFunction(const char* func) { |
#ifndef PRODUCT |
#define API_TIMELINE_DURATION \ |
TimelineDurationScope tds(Thread::Current(), \ |
- Timeline::GetVMApiStream(), \ |
+ Timeline::GetAPIStream(), \ |
CURRENT_FUNC) |
#define API_TIMELINE_BEGIN_END \ |
TimelineBeginEndScope tbes(Thread::Current(), \ |
- Timeline::GetVMApiStream(), \ |
+ Timeline::GetAPIStream(), \ |
CURRENT_FUNC) |
#else |
#define API_TIMELINE_DURATION do { } while (false) |
@@ -5775,31 +5775,7 @@ DART_EXPORT int64_t Dart_TimelineGetMicros() { |
} |
-DART_EXPORT void Dart_TimelineSetRecordedStreams(int64_t stream_mask) { |
- if (!FLAG_support_timeline) { |
- return; |
- } |
- Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
- isolate->GetAPIStream()->set_enabled( |
- (stream_mask & DART_TIMELINE_STREAM_API) != 0); |
- isolate->GetCompilerStream()->set_enabled( |
- (stream_mask & DART_TIMELINE_STREAM_COMPILER) != 0); |
- isolate->GetDartStream()->set_enabled( |
- (stream_mask & DART_TIMELINE_STREAM_DART) != 0); |
- isolate->GetDebuggerStream()->set_enabled( |
- (stream_mask & DART_TIMELINE_STREAM_DEBUGGER) != 0); |
- isolate->GetEmbedderStream()->set_enabled( |
- (stream_mask & DART_TIMELINE_STREAM_EMBEDDER) != 0); |
- isolate->GetGCStream()->set_enabled( |
- (stream_mask & DART_TIMELINE_STREAM_GC) != 0); |
- isolate->GetIsolateStream()->set_enabled( |
- (stream_mask & DART_TIMELINE_STREAM_ISOLATE) != 0); |
-} |
- |
- |
DART_EXPORT void Dart_GlobalTimelineSetRecordedStreams(int64_t stream_mask) { |
- // Per isolate overrides. |
if (!FLAG_support_timeline) { |
return; |
} |
@@ -5815,6 +5791,8 @@ DART_EXPORT void Dart_GlobalTimelineSetRecordedStreams(int64_t stream_mask) { |
const bool gc_enabled = (stream_mask & DART_TIMELINE_STREAM_GC) != 0; |
const bool isolate_enabled = |
(stream_mask & DART_TIMELINE_STREAM_ISOLATE) != 0; |
+ const bool vm_enabled = |
+ (stream_mask & DART_TIMELINE_STREAM_VM) != 0; |
Timeline::SetStreamAPIEnabled(api_enabled); |
Timeline::SetStreamCompilerEnabled(compiler_enabled); |
Timeline::SetStreamDartEnabled(dart_enabled); |
@@ -5822,10 +5800,7 @@ DART_EXPORT void Dart_GlobalTimelineSetRecordedStreams(int64_t stream_mask) { |
Timeline::SetStreamEmbedderEnabled(embedder_enabled); |
Timeline::SetStreamGCEnabled(gc_enabled); |
Timeline::SetStreamIsolateEnabled(isolate_enabled); |
- // VM wide. |
- const bool vm_enabled = |
- (stream_mask & DART_TIMELINE_STREAM_VM) != 0; |
- Timeline::GetVMStream()->set_enabled(vm_enabled); |
+ Timeline::SetStreamVMEnabled(vm_enabled); |
} |
@@ -5924,44 +5899,14 @@ static bool StreamTraceEvents(Dart_StreamConsumer consumer, |
} |
-DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer, |
- void* user_data) { |
- if (!FLAG_support_timeline) { |
- return false; |
- } |
- 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; |
- } |
- Thread* T = Thread::Current(); |
- StackZone zone(T); |
- Timeline::ReclaimCachedBlocksFromThreads(); |
- JSONStream js; |
- IsolateTimelineEventFilter filter(isolate->main_port()); |
- timeline_recorder->PrintTraceEvent(&js, &filter); |
- StartStreamToConsumer(consumer, user_data, "timeline"); |
- bool success = StreamTraceEvents(consumer, user_data, &js); |
- FinishStreamToConsumer(consumer, user_data, "timeline"); |
- return success; |
-} |
- |
- |
DART_EXPORT void Dart_SetEmbedderTimelineCallbacks( |
Dart_EmbedderTimelineStartRecording start_recording, |
- Dart_EmbedderTimelineStopRecording stop_recording, |
- Dart_EmbedderTimelineGetTimeline get_timeline) { |
+ Dart_EmbedderTimelineStopRecording stop_recording) { |
if (!FLAG_support_timeline) { |
return; |
} |
Timeline::set_start_recording_cb(start_recording); |
Timeline::set_stop_recording_cb(stop_recording); |
- Timeline::set_get_timeline_cb(get_timeline); |
} |
@@ -5996,67 +5941,105 @@ DART_EXPORT bool Dart_GlobalTimelineGetTrace(Dart_StreamConsumer consumer, |
} |
-DART_EXPORT Dart_Handle Dart_TimelineDuration(const char* label, |
- int64_t start_micros, |
- int64_t end_micros) { |
+DART_EXPORT void Dart_TimelineEvent(const char* label, |
+ int64_t timestamp0, |
+ int64_t timestamp1, |
+ Dart_Timeline_Event_Type type, |
+ intptr_t argument_count, |
+ const char** argument_names, |
+ const char** argument_values) { |
if (!FLAG_support_timeline) { |
- return Api::Success(); |
+ return; |
} |
- Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
- if (label == NULL) { |
- RETURN_NULL_ERROR(label); |
+ if (type < Dart_Timeline_Event_Begin) { |
+ return; |
+ } |
+ if (type > Dart_Timeline_Event_Duration) { |
+ return; |
+ } |
+ TimelineStream* stream = Timeline::GetEmbedderStream(); |
+ ASSERT(stream != NULL); |
+ TimelineEvent* event = stream->StartEvent(); |
+ if (event == NULL) { |
+ return; |
+ } |
+ switch (type) { |
+ case Dart_Timeline_Event_Begin: |
+ event->Begin(label, timestamp0); |
+ break; |
+ case Dart_Timeline_Event_End: |
+ event->End(label, timestamp0); |
+ break; |
+ case Dart_Timeline_Event_Instant: |
+ event->Instant(label, timestamp0); |
+ break; |
+ case Dart_Timeline_Event_Duration: |
+ event->Duration(label, timestamp0, timestamp1); |
+ break; |
+ default: |
+ FATAL("Unknown Dart_Timeline_Event_Type"); |
+ } |
+ event->SetNumArguments(argument_count); |
+ for (intptr_t i = 0; i < argument_count; i++) { |
+ event->CopyArgument(i, argument_names[i], argument_values[i]); |
+ } |
+ event->Complete(); |
+} |
+ |
+ |
+DART_EXPORT void Dart_TimelineDuration(const char* label, |
+ int64_t start_micros, |
+ int64_t end_micros) { |
+ if (!FLAG_support_timeline) { |
+ return; |
} |
if (start_micros > end_micros) { |
- const char* msg = "%s: start_micros must be <= end_micros"; |
- return Api::NewError(msg, CURRENT_FUNC); |
+ FATAL1("%s: start_micros must be <= end_micros", CURRENT_FUNC); |
+ } |
+ if (label == NULL) { |
+ return; |
} |
- TimelineStream* stream = isolate->GetEmbedderStream(); |
+ TimelineStream* stream = Timeline::GetEmbedderStream(); |
ASSERT(stream != NULL); |
TimelineEvent* event = stream->StartEvent(); |
if (event != NULL) { |
event->Duration(label, start_micros, end_micros); |
event->Complete(); |
} |
- return Api::Success(); |
} |
-DART_EXPORT Dart_Handle Dart_TimelineInstant(const char* label) { |
+DART_EXPORT void Dart_TimelineInstant(const char* label) { |
if (!FLAG_support_timeline) { |
- return Api::Success(); |
+ return; |
} |
- Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
if (label == NULL) { |
- RETURN_NULL_ERROR(label); |
+ return; |
} |
- TimelineStream* stream = isolate->GetEmbedderStream(); |
+ TimelineStream* stream = Timeline::GetEmbedderStream(); |
ASSERT(stream != NULL); |
TimelineEvent* event = stream->StartEvent(); |
if (event != NULL) { |
event->Instant(label); |
event->Complete(); |
} |
- return Api::Success(); |
+ return; |
} |
-DART_EXPORT Dart_Handle Dart_TimelineAsyncBegin(const char* label, |
- int64_t* async_id) { |
+DART_EXPORT void Dart_TimelineAsyncBegin(const char* label, |
+ int64_t* async_id) { |
if (!FLAG_support_timeline) { |
- return Api::Success(); |
+ return; |
} |
- Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
if (label == NULL) { |
- RETURN_NULL_ERROR(label); |
+ return; |
} |
if (async_id == NULL) { |
- RETURN_NULL_ERROR(async_id); |
+ return; |
} |
*async_id = -1; |
- TimelineStream* stream = isolate->GetEmbedderStream(); |
+ TimelineStream* stream = Timeline::GetEmbedderStream(); |
ASSERT(stream != NULL); |
TimelineEvent* event = stream->StartEvent(); |
if (event != NULL) { |
@@ -6066,55 +6049,51 @@ DART_EXPORT Dart_Handle Dart_TimelineAsyncBegin(const char* label, |
event->AsyncBegin(label, *async_id); |
event->Complete(); |
} |
- return Api::Success(); |
+ return; |
} |
-DART_EXPORT Dart_Handle Dart_TimelineAsyncInstant(const char* label, |
- int64_t async_id) { |
+DART_EXPORT void Dart_TimelineAsyncInstant(const char* label, |
+ int64_t async_id) { |
if (!FLAG_support_timeline) { |
- return Api::Success(); |
+ return; |
} |
if (async_id < 0) { |
- return Api::Success(); |
+ return; |
} |
- Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
if (label == NULL) { |
- RETURN_NULL_ERROR(label); |
+ return; |
} |
- TimelineStream* stream = isolate->GetEmbedderStream(); |
+ TimelineStream* stream = Timeline::GetEmbedderStream(); |
ASSERT(stream != NULL); |
TimelineEvent* event = stream->StartEvent(); |
if (event != NULL) { |
event->AsyncInstant(label, async_id); |
event->Complete(); |
} |
- return Api::Success(); |
+ return; |
} |
-DART_EXPORT Dart_Handle Dart_TimelineAsyncEnd(const char* label, |
- int64_t async_id) { |
+DART_EXPORT void Dart_TimelineAsyncEnd(const char* label, |
+ int64_t async_id) { |
if (!FLAG_support_timeline) { |
- return Api::Success(); |
+ return; |
} |
if (async_id < 0) { |
- return Api::Success(); |
+ return; |
} |
- Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
if (label == NULL) { |
- RETURN_NULL_ERROR(label); |
+ return; |
} |
- TimelineStream* stream = isolate->GetEmbedderStream(); |
+ TimelineStream* stream = Timeline::GetEmbedderStream(); |
ASSERT(stream != NULL); |
TimelineEvent* event = stream->StartEvent(); |
if (event != NULL) { |
event->AsyncEnd(label, async_id); |
event->Complete(); |
} |
- return Api::Success(); |
+ return; |
} |
// The precompiler is included in dart_bootstrap and dart_noopt, and |