// 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);
}
