| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "trace-vthread/event_vthread.h" |
| |
| #include <lib/trace/event.h> |
| #include <zircon/syscalls.h> |
| |
| namespace { |
| |
| struct VThreadEventHelper { |
| VThreadEventHelper(trace_context_t* context, const char* name_literal, |
| const char* vthread_literal, trace_vthread_id_t vthread_id, |
| trace_ticks_t timestamp) |
| : ticks(timestamp) { |
| trace_context_register_vthread(context, ZX_KOID_INVALID, vthread_literal, vthread_id, |
| &thread_ref); |
| trace_context_register_string_literal(context, name_literal, &name_ref); |
| } |
| |
| trace_ticks_t const ticks; |
| trace_thread_ref_t thread_ref; |
| trace_string_ref_t name_ref; |
| }; |
| |
| } // namespace |
| |
| static void trace_internal_vthread_complete_args(trace_context_t* context, trace_arg_t* args, |
| size_t num_args) { |
| TRACE_COMPLETE_ARGS(context, args, num_args); |
| } |
| |
| void trace_internal_write_vthread_duration_begin_event_record_and_release_context( |
| trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, |
| const char* vthread_literal, trace_vthread_id_t vthread_id, trace_ticks_t timestamp, |
| trace_arg_t* args, size_t num_args) { |
| VThreadEventHelper helper(context, name_literal, vthread_literal, vthread_id, timestamp); |
| trace_internal_vthread_complete_args(context, args, num_args); |
| trace_context_write_duration_begin_event_record(context, helper.ticks, &helper.thread_ref, |
| category_ref, &helper.name_ref, args, num_args); |
| trace_release_context(context); |
| } |
| |
| void trace_internal_write_vthread_duration_end_event_record_and_release_context( |
| trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, |
| const char* vthread_literal, trace_vthread_id_t vthread_id, trace_ticks_t timestamp, |
| trace_arg_t* args, size_t num_args) { |
| VThreadEventHelper helper(context, name_literal, vthread_literal, vthread_id, timestamp); |
| trace_internal_vthread_complete_args(context, args, num_args); |
| trace_context_write_duration_end_event_record(context, helper.ticks, &helper.thread_ref, |
| category_ref, &helper.name_ref, args, num_args); |
| trace_release_context(context); |
| } |
| |
| void trace_internal_write_vthread_flow_begin_event_record_and_release_context( |
| trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, |
| const char* vthread_literal, trace_vthread_id_t vthread_id, trace_flow_id_t flow_id, |
| trace_ticks_t timestamp, trace_arg_t* args, size_t num_args) { |
| VThreadEventHelper helper(context, name_literal, vthread_literal, vthread_id, timestamp); |
| trace_internal_vthread_complete_args(context, args, num_args); |
| trace_context_write_flow_begin_event_record(context, helper.ticks, &helper.thread_ref, |
| category_ref, &helper.name_ref, flow_id, args, |
| num_args); |
| trace_release_context(context); |
| } |
| |
| void trace_internal_write_vthread_flow_step_event_record_and_release_context( |
| trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, |
| const char* vthread_literal, trace_vthread_id_t vthread_id, trace_flow_id_t flow_id, |
| trace_ticks_t timestamp, trace_arg_t* args, size_t num_args) { |
| VThreadEventHelper helper(context, name_literal, vthread_literal, vthread_id, timestamp); |
| trace_internal_vthread_complete_args(context, args, num_args); |
| trace_context_write_flow_step_event_record(context, helper.ticks, &helper.thread_ref, |
| category_ref, &helper.name_ref, flow_id, args, |
| num_args); |
| trace_release_context(context); |
| } |
| |
| void trace_internal_write_vthread_flow_end_event_record_and_release_context( |
| trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, |
| const char* vthread_literal, trace_vthread_id_t vthread_id, trace_flow_id_t flow_id, |
| trace_ticks_t timestamp, trace_arg_t* args, size_t num_args) { |
| VThreadEventHelper helper(context, name_literal, vthread_literal, vthread_id, timestamp); |
| trace_internal_vthread_complete_args(context, args, num_args); |
| trace_context_write_flow_end_event_record(context, helper.ticks, &helper.thread_ref, category_ref, |
| &helper.name_ref, flow_id, args, num_args); |
| trace_release_context(context); |
| } |
| |
| void trace_internal_write_vthread_counter_event_record_and_release_context( |
| trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, |
| const char* vthread_literal, trace_vthread_id_t vthread_id, uint64_t counter_id, |
| trace_ticks_t timestamp, trace_arg_t* args, size_t num_args) { |
| VThreadEventHelper helper(context, name_literal, vthread_literal, vthread_id, timestamp); |
| trace_internal_vthread_complete_args(context, args, num_args); |
| trace_context_write_counter_event_record(context, helper.ticks, &helper.thread_ref, category_ref, |
| &helper.name_ref, counter_id, args, num_args); |
| trace_release_context(context); |
| } |