// Copyright 2019 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 "tracer.h"

#include <lib/trace/event.h>
#include <stdarg.h>

#include "utils.h"

zx_status_t Tracer::Start() {
  zx_status_t res;

  loop_ = std::make_unique<async::Loop>(&kAsyncLoopConfigNoAttachToCurrentThread);

  res = loop_->StartThread();
  if (res != ZX_OK) {
    fprintf(stderr, "Failed to start trace thread (res = %d)\n", res);
    return res;
  }

  trace_provider_ = std::make_unique<trace::TraceProviderWithFdio>(loop_->dispatcher());

  // Wait for the trace subsystem to start up and be ready to go.
  printf("Waiting up to 5 seconds for tracing to start.\n");
  res = WaitFor([]() { return trace_state() == TRACE_STARTED; }, zx::sec(5));
  if (res == ZX_ERR_TIMED_OUT) {
    fprintf(stderr, "Timeout waiting for tracing to start\n");
  }

  return res;
}

void Tracer::Trace(trace_scope_t scope, const char* fmt, ...) {
  char buffer[256];
  va_list ap;

  va_start(ap, fmt);
  vsnprintf(buffer, sizeof(buffer), fmt, ap);
  va_end(ap);

  TRACE_INSTANT("app", "mutex_pi_exerciser", scope, "msg", TA_STRING(buffer));
}
