// 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 "src/ledger/bin/testing/run_with_tracing.h"

#include <lib/async/cpp/task.h>
#include <lib/fit/function.h>
#include <trace-provider/provider.h>
#include <trace/event.h>
#include <trace/observer.h>

#include "src/lib/fxl/logging.h"

namespace ledger {

int RunWithTracing(async::Loop* loop, fit::function<void()> runnable) {
  trace::TraceProviderWithFdio trace_provider(loop->dispatcher());
  trace::TraceObserver trace_observer;

  bool started = false;
  auto on_trace_state_changed = [runnable = std::move(runnable), &started]() {
    if (TRACE_CATEGORY_ENABLED("benchmark") && !started) {
      started = true;
      runnable();
    }
  };
  // In case tracing has already started.
  on_trace_state_changed();

  if (!started) {
    trace_observer.Start(loop->dispatcher(), std::move(on_trace_state_changed));
  }

  int err = 0;
  async::TaskClosure quit_task([&started, loop, &err] {
    if (!started) {
      // To avoid running the runnable if the tracing state changes to
      // started in the immediate next task on the queue (before the quit
      // task executes).
      started = true;
      FXL_LOG(ERROR) << "Timed out waiting for the tracing to start; Did you run the "
                        "binary with the trace tool enabled?";
      err = -1;
      loop->Quit();
    }
  });
  quit_task.PostDelayed(loop->dispatcher(), zx::sec(5));

  loop->Run();
  return err;
}

}  // namespace ledger
