Chromium Code Reviews| Index: runtime/vm/timeline.cc |
| diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc |
| index 86256661d2ba2a4c0c7801013e462f505e6e0c28..2397af97dca5c35a2e3a59b35bbc5959fc80848e 100644 |
| --- a/runtime/vm/timeline.cc |
| +++ b/runtime/vm/timeline.cc |
| @@ -11,6 +11,7 @@ |
| #if defined(HOST_OS_FUCHSIA) |
| #include "apps/tracing/lib/trace/event.h" |
| +#include "apps/tracing/lib/trace/cwriter.h" |
|
zra
2017/07/19 21:26:23
Alphabetize includes
konkers
2017/07/19 21:52:32
Done.
|
| #endif |
| #include "vm/atomic.h" |
| @@ -525,101 +526,95 @@ void TimelineEvent::StealArguments(intptr_t arguments_length, |
| } |
| #if defined(HOST_OS_FUCHSIA) |
| -// TODO(zra): The functions below emit Dart's timeline events all as category |
| -// "dart". Instead, we could have finer-grained categories that make use of |
| -// the name of the timeline stream, e.g. "VM", "GC", etc. |
| - |
| -#define FUCHSIA_EVENT_ARGS_LIST(V) \ |
| - V(Begin, TRACE_DURATION_BEGIN) \ |
| - V(End, TRACE_DURATION_END) |
| - |
| -#define EMIT_FUCHSIA_EVENT(__name, __macro) \ |
| - static void EmitFuchsia##__name##Event(const char* label, \ |
| - TimelineEventArgument* arguments, \ |
| - intptr_t arguments_length) { \ |
| - if (arguments_length == 0) { \ |
| - __macro("dart", label); \ |
| - } else if (arguments_length == 1) { \ |
| - __macro("dart", label, arguments[0].name, \ |
| - const_cast<const char*>(arguments[0].value)); \ |
| - } else { \ |
| - __macro("dart", label, arguments[0].name, \ |
| - const_cast<const char*>(arguments[0].value), arguments[1].name, \ |
| - const_cast<const char*>(arguments[1].value)); \ |
| - } \ |
| - } |
| - |
| -FUCHSIA_EVENT_ARGS_LIST(EMIT_FUCHSIA_EVENT) |
| -#undef EMIT_FUCHSIA_EVENT |
| - |
| -#define FUCHSIA_EVENT_ID_ARGS_LIST(V) \ |
| - V(Instant, TRACE_INSTANT, ::tracing::EventScope) \ |
| - V(AsyncBegin, TRACE_ASYNC_BEGIN, int64_t) \ |
| - V(AsyncEnd, TRACE_ASYNC_END, int64_t) \ |
| - V(AsyncInstant, TRACE_ASYNC_INSTANT, int64_t) \ |
| - V(FlowBegin, TRACE_FLOW_BEGIN, int64_t) \ |
| - V(FlowStep, TRACE_FLOW_STEP, int64_t) \ |
| - V(FlowEnd, TRACE_FLOW_END, int64_t) |
| - |
| -#define EMIT_FUCHSIA_EVENT(__name, __macro, __id_typ) \ |
| - static void EmitFuchsia##__name##Event(const char* label, __id_typ id, \ |
| - TimelineEventArgument* arguments, \ |
| - intptr_t arguments_length) { \ |
| - if (arguments_length == 0) { \ |
| - __macro("dart", label, id); \ |
| - } else if (arguments_length == 1) { \ |
| - __macro("dart", label, id, arguments[0].name, \ |
| - const_cast<const char*>(arguments[0].value)); \ |
| - } else { \ |
| - __macro("dart", label, id, arguments[0].name, \ |
| - const_cast<const char*>(arguments[0].value), arguments[1].name, \ |
| - const_cast<const char*>(arguments[1].value)); \ |
| - } \ |
| - } |
| - |
| -FUCHSIA_EVENT_ID_ARGS_LIST(EMIT_FUCHSIA_EVENT) |
| -#undef EMIT_FUCHSIA_EVENT |
| - |
| void TimelineEvent::EmitFuchsiaEvent() { |
| + if (!ctrace_is_enabled()) { |
| + return; |
| + } |
| + auto writer = ctrace_writer_acquire(); |
| + |
| + // XXX: use ctrace_register_category_string(); |
| + ctrace_stringref_t category; |
| + ctrace_register_string(writer, "dart", &category); |
| + |
| + ctrace_stringref_t name; |
| + ctrace_register_string(writer, label_, &name); |
| + |
| + ctrace_threadref_t thread; |
| + ctrace_register_current_thread(writer, &thread); |
| + |
| + ctrace_argspec_t args[2]; |
| + ctrace_arglist_t arglist = {0, args}; |
| + |
| + if (arguments_length_ >= 1) { |
| + args[0].type = CTRACE_ARGUMENT_STRING; |
| + args[0].name = arguments_[0].name; |
| + args[0].u.s = arguments_[0].value; |
| + arglist.n_args += 1; |
| + } |
| + if (arguments_length_ >= 2) { |
| + args[1].type = CTRACE_ARGUMENT_STRING; |
| + args[1].name = arguments_[1].name; |
| + args[1].u.s = arguments_[1].value; |
| + arglist.n_args += 1; |
| + } |
| + |
| + uint64_t time_scale = mx_ticks_per_second() / kMicrosecondsPerSecond; |
|
zra
2017/07/19 21:26:23
const
konkers
2017/07/19 21:52:32
Done.
|
| + uint64_t start_time = LowTime() * time_scale; |
|
zra
2017/07/19 21:26:23
const
konkers
2017/07/19 21:52:32
Done.
|
| + uint64_t end_time = HighTime() * time_scale; |
|
zra
2017/07/19 21:26:23
const
konkers
2017/07/19 21:52:31
Done.
|
| + |
| switch (event_type()) { |
| case kBegin: |
| - EmitFuchsiaBeginEvent(label_, arguments_, arguments_length_); |
| + ctrace_write_duration_begin_event_record(writer, start_time, &thread, |
| + &category, &name, &arglist); |
| break; |
| case kEnd: |
| - EmitFuchsiaEndEvent(label_, arguments_, arguments_length_); |
| + ctrace_write_duration_end_event_record(writer, end_time, &thread, |
| + &category, &name, &arglist); |
| break; |
| case kInstant: |
| - EmitFuchsiaInstantEvent(label_, TRACE_SCOPE_THREAD, arguments_, |
| - arguments_length_); |
| + ctrace_write_instant_event_record(writer, start_time, &thread, |
| + &category, &name, |
| + CTRACE_SCOPE_THREAD, &arglist); |
| break; |
| case kAsyncBegin: |
| - EmitFuchsiaAsyncBeginEvent(label_, AsyncId(), arguments_, |
| - arguments_length_); |
| + ctrace_write_async_begin_event_record(writer, start_time, &thread, |
| + &category, &name, |
| + AsyncId(), &arglist); |
| break; |
| case kAsyncEnd: |
| - EmitFuchsiaAsyncEndEvent(label_, AsyncId(), arguments_, |
| - arguments_length_); |
| + ctrace_write_async_end_event_record(writer, end_time, &thread, |
| + &category, &name, |
| + AsyncId(), &arglist); |
| break; |
| case kAsyncInstant: |
| - EmitFuchsiaAsyncInstantEvent(label_, AsyncId(), arguments_, |
| - arguments_length_); |
| + ctrace_write_async_instant_event_record(writer, start_time, &thread, |
| + &category, &name, |
| + AsyncId(), &arglist); |
| + break; |
| + case kDuration: |
| + ctrace_write_duration_event_record(writer, start_time, end_time, &thread, |
| + &category, &name, &arglist); |
| break; |
| case kFlowBegin: |
| - EmitFuchsiaFlowBeginEvent(label_, AsyncId(), arguments_, |
| - arguments_length_); |
| + ctrace_write_flow_begin_event_record(writer, start_time, &thread, |
| + &category, &name, |
| + AsyncId(), &arglist); |
| break; |
| case kFlowStep: |
| - EmitFuchsiaFlowStepEvent(label_, AsyncId(), arguments_, |
| - arguments_length_); |
| + ctrace_write_flow_step_event_record(writer, start_time, &thread, |
| + &category, &name, |
| + AsyncId(), &arglist); |
| break; |
| case kFlowEnd: |
| - EmitFuchsiaFlowEndEvent(label_, AsyncId(), arguments_, arguments_length_); |
| + ctrace_write_flow_end_event_record(writer, start_time, &thread, |
| + &category, &name, |
| + AsyncId(), &arglist); |
| break; |
| default: |
| - // TODO(zra): Figure out what to do with kDuration, kCounter, and |
| - // kMetadata. |
| + // TODO(zra): Figure out what to do with kCounter and kMetadata. |
| break; |
| } |
| + ctrace_writer_release(writer); |
| } |
| #endif |
| @@ -1005,7 +1000,8 @@ TimelineDurationScope::TimelineDurationScope(TimelineStream* stream, |
| return; |
| } |
| #if defined(HOST_OS_FUCHSIA) |
|
zra
2017/07/19 21:26:23
Since EmitFuchsiaEvent now does the right thing fo
konkers
2017/07/19 21:52:32
Done.
|
| - TRACE_DURATION_BEGIN("dart", label); |
| + // XXX |
| + // TRACE_DURATION_BEGIN("dart", label); |
| #else |
| timestamp_ = OS::GetCurrentMonotonicMicros(); |
| thread_timestamp_ = OS::GetCurrentThreadCPUMicros(); |
| @@ -1020,7 +1016,8 @@ TimelineDurationScope::TimelineDurationScope(Thread* thread, |
| return; |
| } |
| #if defined(HOST_OS_FUCHSIA) |
| - TRACE_DURATION_BEGIN("dart", label); |
| + // XXX |
| + // TRACE_DURATION_BEGIN("dart", label); |
| #else |
| timestamp_ = OS::GetCurrentMonotonicMicros(); |
| thread_timestamp_ = OS::GetCurrentThreadCPUMicros(); |
| @@ -1035,7 +1032,8 @@ TimelineDurationScope::~TimelineDurationScope() { |
| return; |
| } |
| #if defined(HOST_OS_FUCHSIA) |
| - EmitFuchsiaEndEvent(label(), arguments(), arguments_length()); |
| + // XXX |
| + // EmitFuchsiaEndEvent(label(), arguments(), arguments_length()); |
| #else |
| TimelineEvent* event = stream()->StartEvent(); |
| if (event == NULL) { |
| @@ -1505,8 +1503,11 @@ void TimelineEventSystraceRecorder::CompleteEvent(TimelineEvent* event) { |
| #if defined(HOST_OS_FUCHSIA) |
| TimelineEventFuchsiaRecorder::TimelineEventFuchsiaRecorder(intptr_t capacity) |
| - : TimelineEventFixedBufferRecorder(capacity) {} |
| + : TimelineEventFixedBufferRecorder(capacity) { |
| +} |
| +TimelineEventFuchsiaRecorder::~TimelineEventFuchsiaRecorder() { |
| +} |
| TimelineEventBlock* TimelineEventFuchsiaRecorder::GetNewBlockLocked() { |
| // TODO(johnmccutchan): This function should only hand out blocks |