blob: 270dcc07155bd87ff6b6924e61e3f74cc3b808db [file] [log] [blame]
// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_LIBPLATFORM_TRACING_PERFETTO_TRACING_CONTROLLER_H_
#define V8_LIBPLATFORM_TRACING_PERFETTO_TRACING_CONTROLLER_H_
#include <atomic>
#include <fstream>
#include <memory>
#include <vector>
#include "src/base/platform/platform.h"
#include "src/base/platform/semaphore.h"
namespace perfetto {
class TraceConfig;
class TraceWriter;
class TracingService;
} // namespace perfetto
namespace v8 {
namespace platform {
namespace tracing {
class PerfettoJSONConsumer;
class PerfettoProducer;
class PerfettoTaskRunner;
// This is the top-level interface for performing tracing with perfetto. The
// user of this class should call StartTracing() to start tracing, and
// StopTracing() to stop it. To write trace events, the user can obtain a
// thread-local TraceWriter object using GetOrCreateThreadLocalWriter().
class PerfettoTracingController {
public:
PerfettoTracingController();
// Blocks and sets up all required data structures for tracing. It is safe to
// call GetOrCreateThreadLocalWriter() to obtain thread-local TraceWriters for
// writing trace events once this call returns. Tracing output will be sent in
// JSON format to |output_stream|.
void StartTracing(const ::perfetto::TraceConfig& trace_config,
std::ostream* output_stream);
// Blocks and finishes all existing AddTraceEvent tasks. Stops the tracing
// thread.
void StopTracing();
~PerfettoTracingController();
// Each thread that wants to trace should call this to get their TraceWriter.
// PerfettoTracingController creates and owns the TraceWriter.
::perfetto::TraceWriter* GetOrCreateThreadLocalWriter();
private:
// Signals the producer_ready_semaphore_.
void OnProducerReady();
// PerfettoProducer is the only class allowed to call OnProducerReady().
friend class PerfettoProducer;
std::unique_ptr<::perfetto::TracingService> service_;
std::unique_ptr<PerfettoProducer> producer_;
std::unique_ptr<PerfettoJSONConsumer> consumer_;
std::unique_ptr<PerfettoTaskRunner> task_runner_;
base::Thread::LocalStorageKey writer_key_;
// A semaphore that is signalled when StartRecording is called. StartTracing
// waits on this semaphore to be notified when the tracing service is ready to
// receive trace events.
base::Semaphore producer_ready_semaphore_;
base::Semaphore consumer_finished_semaphore_;
DISALLOW_COPY_AND_ASSIGN(PerfettoTracingController);
};
} // namespace tracing
} // namespace platform
} // namespace v8
#endif // V8_LIBPLATFORM_TRACING_PERFETTO_TRACING_CONTROLLER_H_