// Copyright 2021 The Chromium OS 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 <base/logging.h>
#include <base/threading/platform_thread.h>
#include <base/threading/thread.h>
#include <base/time/time.h>

#include "perfetto_simple_producer/my_app_tracing_categories.h"

void Trial2() {
  TRACE_EVENT("perfetto_simple_producer", "Trial2");
  base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(500));
}

// This demonstrates an event that begins and ends on different threads.
void OnNewRequest(size_t request_id) {
  // Open a slice when the request came in.
  TRACE_EVENT_BEGIN("perfetto_simple_producer", "HandleRequest",
                    perfetto::Track(request_id));

  std::unique_ptr<base::Thread> thread(
      new base::Thread("HandleRequest Thread"));
  // Start a thread to handle the request.
  thread->Start();
  thread->task_runner()->PostTask(
      FROM_HERE, base::BindOnce(
                     [](size_t request_id) {
                       TRACE_EVENT_END("perfetto_simple_producer",
                                       perfetto::Track(request_id));
                     },
                     request_id));
  thread->Stop();
}

int main(int argc, char** argv) {
  perfetto::TracingInitArgs args;

  // The system backend writes events into a system Perfetto daemon. Requires
  // the Perfetto `traced` daemon to be running (e.g., on Android Pie and
  // newer).
  args.backends |= perfetto::kSystemBackend;

  perfetto::Tracing::Initialize(args);
  perfetto::TrackEvent::Register();

  // Wait for the connection to the system Perfetto daemon being setup.
  base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(500));

  TRACE_EVENT("perfetto_simple_producer", "Trial1", "int", 100);

  // This demonstrates the nesting of trace events.
  Trial2();
  TRACE_EVENT_BEGIN("perfetto_simple_producer", "Trial3");
  OnNewRequest(100);
  base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(500));

  TRACE_EVENT_END("perfetto_simple_producer");

  LOG(INFO) << "Category enabled: "
            << TRACE_EVENT_CATEGORY_ENABLED("perfetto_simple_producer");

  LOG(INFO) << "Done tracing events";

  return 0;
}
