// Copyright 2017 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 #include namespace { struct EventHelper { EventHelper(trace_context_t* context, const char* name_literal) : ticks(zx_ticks_get()) { trace_context_register_current_thread(context, &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 // Argument names are temporarily stored in |name_ref.inline_string|. // Convert them to string references. void trace_internal_complete_args(trace_context_t* context, trace_arg_t* args, size_t num_args) { for (size_t i = 0; i < num_args; ++i) { trace_context_register_string_literal(context, args[i].name_ref.inline_string, &args[i].name_ref); } } void trace_internal_write_instant_event_record_and_release_context( trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, trace_scope_t scope, trace_arg_t* args, size_t num_args) { EventHelper helper(context, name_literal); trace_internal_complete_args(context, args, num_args); trace_context_write_instant_event_record( context, helper.ticks, &helper.thread_ref, category_ref, &helper.name_ref, scope, args, num_args); trace_release_context(context); } void trace_internal_write_counter_event_record_and_release_context( trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, trace_counter_id_t counter_id, trace_arg_t* args, size_t num_args) { EventHelper helper(context, name_literal); trace_internal_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); } void trace_internal_write_duration_begin_event_record_and_release_context( trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, trace_arg_t* args, size_t num_args) { EventHelper helper(context, name_literal); trace_internal_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_duration_end_event_record_and_release_context( trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, trace_arg_t* args, size_t num_args) { EventHelper helper(context, name_literal); trace_internal_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_async_begin_event_record_and_release_context( trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, trace_async_id_t async_id, trace_arg_t* args, size_t num_args) { EventHelper helper(context, name_literal); trace_internal_complete_args(context, args, num_args); trace_context_write_async_begin_event_record( context, helper.ticks, &helper.thread_ref, category_ref, &helper.name_ref, async_id, args, num_args); trace_release_context(context); } void trace_internal_write_async_instant_event_record_and_release_context( trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, trace_async_id_t async_id, trace_arg_t* args, size_t num_args) { EventHelper helper(context, name_literal); trace_internal_complete_args(context, args, num_args); trace_context_write_async_instant_event_record( context, helper.ticks, &helper.thread_ref, category_ref, &helper.name_ref, async_id, args, num_args); trace_release_context(context); } void trace_internal_write_async_end_event_record_and_release_context( trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, trace_async_id_t async_id, trace_arg_t* args, size_t num_args) { EventHelper helper(context, name_literal); trace_internal_complete_args(context, args, num_args); trace_context_write_async_end_event_record( context, helper.ticks, &helper.thread_ref, category_ref, &helper.name_ref, async_id, args, num_args); trace_release_context(context); } void trace_internal_write_flow_begin_event_record_and_release_context( trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, trace_flow_id_t flow_id, trace_arg_t* args, size_t num_args) { EventHelper helper(context, name_literal); trace_internal_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_flow_step_event_record_and_release_context( trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, trace_flow_id_t flow_id, trace_arg_t* args, size_t num_args) { EventHelper helper(context, name_literal); trace_internal_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_flow_end_event_record_and_release_context( trace_context_t* context, const trace_string_ref_t* category_ref, const char* name_literal, trace_flow_id_t flow_id, trace_arg_t* args, size_t num_args) { EventHelper helper(context, name_literal); trace_internal_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_kernel_object_record_for_handle_and_release_context( trace_context_t* context, zx_handle_t handle, trace_arg_t* args, size_t num_args) { trace_internal_complete_args(context, args, num_args); trace_context_write_kernel_object_record_for_handle( context, handle, args, num_args); trace_release_context(context); } void trace_internal_write_blob_record_and_release_context( trace_context_t* context, trace_blob_type_t type, const char* name_literal, const void* blob, size_t blob_size) { trace_string_ref_t name_ref; trace_context_register_string_literal(context, name_literal, &name_ref); trace_context_write_blob_record( context, type, &name_ref, blob, blob_size); trace_release_context(context); }