Commit aa69df1c authored by Oystein Eftevaag's avatar Oystein Eftevaag Committed by Commit Bot

Perfetto: Unify TraceEventAgent classes

This unifies the Perfetto and non-Perfetto TraceEventAgent classes, so
that it's possible to use Perfetto directly even when it's not enabled
as the default TraceLog backend.

Also moved the Mojo bindings of ProducerHost into a StrongBindingSet of PerfettoService
so they get cleaned up if the service gets shut down.

Already reviewed as part of https://chromium-review.googlesource.com/c/chromium/src/+/1161541

Change-Id: I3070d69e92778de8e3b5e33957ab4f4694b782af
Reviewed-on: https://chromium-review.googlesource.com/c/1307998
Commit-Queue: oysteine <oysteine@chromium.org>
Reviewed-by: default avatarSami Kyöstilä <skyostil@chromium.org>
Reviewed-by: default avataroysteine <oysteine@chromium.org>
Cr-Commit-Position: refs/heads/master@{#605060}
parent 6145f6ff
...@@ -39,6 +39,10 @@ namespace tracing { ...@@ -39,6 +39,10 @@ namespace tracing {
// //
// If we see that the above-mentioned assumption does not hold in some cases, we // If we see that the above-mentioned assumption does not hold in some cases, we
// should guard against it using timeouts. // should guard against it using timeouts.
//
// Note that this class is only used when TraceLog is used as the tracing
// backend; when Perfetto is used, PerfettoTracingCoordinator is used instead to
// implement the same interface.
class Coordinator : public mojom::Coordinator { class Coordinator : public mojom::Coordinator {
public: public:
explicit Coordinator(AgentRegistry* agent_registry); explicit Coordinator(AgentRegistry* agent_registry);
......
...@@ -21,10 +21,6 @@ const char kPerfettoProducerName[] = "org.chromium.perfetto_producer"; ...@@ -21,10 +21,6 @@ const char kPerfettoProducerName[] = "org.chromium.perfetto_producer";
PerfettoService* g_perfetto_service; PerfettoService* g_perfetto_service;
// Just used to destroy disconnected clients.
template <typename T>
void OnClientDisconnect(std::unique_ptr<T>) {}
} // namespace } // namespace
/* /*
...@@ -103,13 +99,13 @@ void PerfettoService::BindOnSequence( ...@@ -103,13 +99,13 @@ void PerfettoService::BindOnSequence(
void PerfettoService::ConnectToProducerHost( void PerfettoService::ConnectToProducerHost(
mojom::ProducerClientPtr producer_client, mojom::ProducerClientPtr producer_client,
mojom::ProducerHostRequest producer_host) { mojom::ProducerHostRequest producer_host_request) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
auto new_producer = std::make_unique<ProducerHost>(); auto new_producer = std::make_unique<ProducerHost>();
new_producer->Initialize(std::move(producer_client), std::move(producer_host), new_producer->Initialize(std::move(producer_client), service_.get(),
service_.get(), kPerfettoProducerName); kPerfettoProducerName);
new_producer->set_connection_error_handler(base::BindOnce( producer_bindings_.AddBinding(std::move(new_producer),
&OnClientDisconnect<ProducerHost>, std::move(new_producer))); std::move(producer_host_request));
} }
} // namespace tracing } // namespace tracing
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "base/sequence_checker.h" #include "base/sequence_checker.h"
#include "base/sequenced_task_runner.h" #include "base/sequenced_task_runner.h"
#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/binding_set.h"
#include "mojo/public/cpp/bindings/strong_binding_set.h"
#include "services/service_manager/public/cpp/identity.h" #include "services/service_manager/public/cpp/identity.h"
#include "services/tracing/public/cpp/perfetto/task_runner.h" #include "services/tracing/public/cpp/perfetto/task_runner.h"
#include "services/tracing/public/mojom/perfetto_service.mojom.h" #include "services/tracing/public/mojom/perfetto_service.mojom.h"
...@@ -58,6 +59,7 @@ class PerfettoService : public mojom::PerfettoService { ...@@ -58,6 +59,7 @@ class PerfettoService : public mojom::PerfettoService {
PerfettoTaskRunner perfetto_task_runner_; PerfettoTaskRunner perfetto_task_runner_;
std::unique_ptr<perfetto::TracingService> service_; std::unique_ptr<perfetto::TracingService> service_;
mojo::BindingSet<mojom::PerfettoService, service_manager::Identity> bindings_; mojo::BindingSet<mojom::PerfettoService, service_manager::Identity> bindings_;
mojo::StrongBindingSet<mojom::ProducerHost> producer_bindings_;
SEQUENCE_CHECKER(sequence_checker_); SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_COPY_AND_ASSIGN(PerfettoService); DISALLOW_COPY_AND_ASSIGN(PerfettoService);
......
...@@ -17,19 +17,12 @@ ProducerHost::ProducerHost() = default; ...@@ -17,19 +17,12 @@ ProducerHost::ProducerHost() = default;
ProducerHost::~ProducerHost() = default; ProducerHost::~ProducerHost() = default;
void ProducerHost::Initialize(mojom::ProducerClientPtr producer_client, void ProducerHost::Initialize(mojom::ProducerClientPtr producer_client,
mojom::ProducerHostRequest producer_host,
perfetto::TracingService* service, perfetto::TracingService* service,
const std::string& name) { const std::string& name) {
DCHECK(service); DCHECK(service);
DCHECK(!producer_endpoint_); DCHECK(!producer_endpoint_);
producer_client_ = std::move(producer_client);
producer_client_.set_connection_error_handler(
base::BindOnce(&ProducerHost::OnConnectionError, base::Unretained(this)));
binding_ = std::make_unique<mojo::Binding<mojom::ProducerHost>>( producer_client_ = std::move(producer_client);
this, std::move(producer_host));
binding_->set_connection_error_handler(
base::BindOnce(&ProducerHost::OnConnectionError, base::Unretained(this)));
// TODO(oysteine): Figure out an uid once we need it. // TODO(oysteine): Figure out an uid once we need it.
// TODO(oysteine): Figure out a good buffer size. // TODO(oysteine): Figure out a good buffer size.
...@@ -37,19 +30,15 @@ void ProducerHost::Initialize(mojom::ProducerClientPtr producer_client, ...@@ -37,19 +30,15 @@ void ProducerHost::Initialize(mojom::ProducerClientPtr producer_client,
this, 0 /* uid */, name, this, 0 /* uid */, name,
4 * 1024 * 1024 /* shared_memory_size_hint_bytes */); 4 * 1024 * 1024 /* shared_memory_size_hint_bytes */);
DCHECK(producer_endpoint_); DCHECK(producer_endpoint_);
producer_client_.set_connection_error_handler(
base::BindOnce(&ProducerHost::OnConnectionError, base::Unretained(this)));
} }
void ProducerHost::OnConnectionError() { void ProducerHost::OnConnectionError() {
// Manually reset to prevent any callbacks from the ProducerEndpoint // Manually reset to prevent any callbacks from the ProducerEndpoint
// when we're in a half-destructed state. // when we're in a half-destructed state.
producer_endpoint_.reset(); producer_endpoint_.reset();
// If the ProducerHost is owned by the PerfettoService, let it know
// we're disconnected to let this be cleaned up. Tests manage lifespan
// themselves.
if (connection_error_handler_) {
std::move(connection_error_handler_).Run();
}
// This object *may* be destroyed at this point.
} }
void ProducerHost::OnConnect() { void ProducerHost::OnConnect() {
......
...@@ -11,12 +11,8 @@ ...@@ -11,12 +11,8 @@
#include <vector> #include <vector>
#include "base/macros.h" #include "base/macros.h"
#include "services/tracing/perfetto/producer_host.h" #include "services/tracing/perfetto/producer_host.h"
#include "services/tracing/public/mojom/perfetto_service.mojom.h" #include "services/tracing/public/mojom/perfetto_service.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "third_party/perfetto/include/perfetto/tracing/core/producer.h" #include "third_party/perfetto/include/perfetto/tracing/core/producer.h"
#include "third_party/perfetto/include/perfetto/tracing/core/tracing_service.h" #include "third_party/perfetto/include/perfetto/tracing/core/tracing_service.h"
...@@ -41,16 +37,10 @@ class ProducerHost : public tracing::mojom::ProducerHost, ...@@ -41,16 +37,10 @@ class ProducerHost : public tracing::mojom::ProducerHost,
ProducerHost(); ProducerHost();
~ProducerHost() override; ~ProducerHost() override;
void set_connection_error_handler(
base::OnceClosure connection_error_handler) {
connection_error_handler_ = std::move(connection_error_handler);
}
// Called by the ProducerService to register the // Called by the ProducerService to register the
// Producer with Perfetto and connect to the // Producer with Perfetto and connect to the
// corresponding remote ProducerClient. // corresponding remote ProducerClient.
void Initialize(mojom::ProducerClientPtr producer_client, void Initialize(mojom::ProducerClientPtr producer_client,
mojom::ProducerHostRequest producer_host,
perfetto::TracingService* service, perfetto::TracingService* service,
const std::string& name); const std::string& name);
...@@ -95,8 +85,6 @@ class ProducerHost : public tracing::mojom::ProducerHost, ...@@ -95,8 +85,6 @@ class ProducerHost : public tracing::mojom::ProducerHost,
private: private:
mojom::ProducerClientPtr producer_client_; mojom::ProducerClientPtr producer_client_;
std::unique_ptr<mojo::Binding<mojom::ProducerHost>> binding_;
base::OnceClosure connection_error_handler_;
protected: protected:
// Perfetto guarantees that no OnXX callbacks are invoked on |this| // Perfetto guarantees that no OnXX callbacks are invoked on |this|
......
...@@ -233,8 +233,10 @@ void MockProducerHost::OnMessagepipesReadyCallback( ...@@ -233,8 +233,10 @@ void MockProducerHost::OnMessagepipesReadyCallback(
perfetto::TracingService* perfetto_service, perfetto::TracingService* perfetto_service,
mojom::ProducerClientPtr producer_client_pipe, mojom::ProducerClientPtr producer_client_pipe,
mojom::ProducerHostRequest producer_host_pipe) { mojom::ProducerHostRequest producer_host_pipe) {
Initialize(std::move(producer_client_pipe), std::move(producer_host_pipe), Initialize(std::move(producer_client_pipe), perfetto_service,
perfetto_service, kPerfettoProducerName); kPerfettoProducerName);
binding_ = std::make_unique<mojo::Binding<mojom::ProducerHost>>(
this, std::move(producer_host_pipe));
} }
MockProducer::MockProducer(const std::string& data_source_name, MockProducer::MockProducer(const std::string& data_source_name,
......
...@@ -140,6 +140,7 @@ class MockProducerHost : public ProducerHost { ...@@ -140,6 +140,7 @@ class MockProducerHost : public ProducerHost {
base::OnceClosure datasource_registered_callback_; base::OnceClosure datasource_registered_callback_;
const std::string data_source_name_; const std::string data_source_name_;
std::string all_host_commit_data_requests_; std::string all_host_commit_data_requests_;
std::unique_ptr<mojo::Binding<mojom::ProducerHost>> binding_;
}; };
class MockProducer { class MockProducer {
......
...@@ -100,6 +100,10 @@ void ProducerClient::CreateMojoMessagepipesOnSequence( ...@@ -100,6 +100,10 @@ void ProducerClient::CreateMojoMessagepipesOnSequence(
origin_task_runner->PostTask( origin_task_runner->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), std::move(producer_client), FROM_HERE, base::BindOnce(std::move(callback), std::move(producer_client),
mojo::MakeRequest(&producer_host_))); mojo::MakeRequest(&producer_host_)));
for (auto* data_source : data_sources_) {
RegisterDataSourceWithHost(data_source);
}
} }
void ProducerClient::AddDataSource(DataSourceBase* data_source) { void ProducerClient::AddDataSource(DataSourceBase* data_source) {
...@@ -110,7 +114,14 @@ void ProducerClient::AddDataSource(DataSourceBase* data_source) { ...@@ -110,7 +114,14 @@ void ProducerClient::AddDataSource(DataSourceBase* data_source) {
void ProducerClient::AddDataSourceOnSequence(DataSourceBase* data_source) { void ProducerClient::AddDataSourceOnSequence(DataSourceBase* data_source) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
data_sources_.insert(data_source); data_sources_.insert(data_source);
if (producer_host_) {
RegisterDataSourceWithHost(data_source);
}
}
void ProducerClient::RegisterDataSourceWithHost(DataSourceBase* data_source) {
auto new_registration = mojom::DataSourceRegistration::New(); auto new_registration = mojom::DataSourceRegistration::New();
new_registration->name = data_source->name(); new_registration->name = data_source->name();
new_registration->will_notify_on_stop = true; new_registration->will_notify_on_stop = true;
...@@ -164,7 +175,7 @@ void ProducerClient::StopDataSource(uint64_t id, ...@@ -164,7 +175,7 @@ void ProducerClient::StopDataSource(uint64_t id,
} }
} }
LOG(FATAL) << "Invalid data source ID."; LOG(DFATAL) << "Invalid data source ID.";
} }
void ProducerClient::Flush(uint64_t flush_request_id, void ProducerClient::Flush(uint64_t flush_request_id,
......
...@@ -128,6 +128,7 @@ class COMPONENT_EXPORT(TRACING_CPP) ProducerClient ...@@ -128,6 +128,7 @@ class COMPONENT_EXPORT(TRACING_CPP) ProducerClient
private: private:
void CommitDataOnSequence(mojom::CommitDataRequestPtr request); void CommitDataOnSequence(mojom::CommitDataRequestPtr request);
void AddDataSourceOnSequence(DataSourceBase*); void AddDataSourceOnSequence(DataSourceBase*);
void RegisterDataSourceWithHost(DataSourceBase* data_source);
// The callback will be run on the |origin_task_runner|, meaning // The callback will be run on the |origin_task_runner|, meaning
// the same sequence as CreateMojoMessagePipes() got called on. // the same sequence as CreateMojoMessagePipes() got called on.
......
...@@ -379,7 +379,6 @@ TraceEventDataSource* TraceEventDataSource::GetInstance() { ...@@ -379,7 +379,6 @@ TraceEventDataSource* TraceEventDataSource::GetInstance() {
TraceEventDataSource::TraceEventDataSource() TraceEventDataSource::TraceEventDataSource()
: DataSourceBase(mojom::kTraceEventDataSourceName) { : DataSourceBase(mojom::kTraceEventDataSourceName) {
RegisterTracedValueProtoWriter();
} }
TraceEventDataSource::~TraceEventDataSource() = default; TraceEventDataSource::~TraceEventDataSource() = default;
...@@ -395,6 +394,8 @@ void TraceEventDataSource::StartTracing( ...@@ -395,6 +394,8 @@ void TraceEventDataSource::StartTracing(
target_buffer_ = data_source_config.target_buffer; target_buffer_ = data_source_config.target_buffer;
} }
RegisterTracedValueProtoWriter(true);
TraceLog::GetInstance()->SetAddTraceEventOverride( TraceLog::GetInstance()->SetAddTraceEventOverride(
&TraceEventDataSource::OnAddTraceEvent, &TraceEventDataSource::OnAddTraceEvent,
&TraceEventDataSource::FlushCurrentThread); &TraceEventDataSource::FlushCurrentThread);
...@@ -414,6 +415,7 @@ void TraceEventDataSource::StopTracing( ...@@ -414,6 +415,7 @@ void TraceEventDataSource::StopTracing(
return; return;
} }
RegisterTracedValueProtoWriter(false);
TraceLog::GetInstance()->SetAddTraceEventOverride(nullptr, nullptr); TraceLog::GetInstance()->SetAddTraceEventOverride(nullptr, nullptr);
// TraceLog::CancelTracing will cause metadata events to be written; // TraceLog::CancelTracing will cause metadata events to be written;
......
...@@ -258,8 +258,8 @@ std::unique_ptr<TracedValue::Writer> CreateProtoWriter(size_t capacity) { ...@@ -258,8 +258,8 @@ std::unique_ptr<TracedValue::Writer> CreateProtoWriter(size_t capacity) {
} // namespace } // namespace
void RegisterTracedValueProtoWriter() { void RegisterTracedValueProtoWriter(bool enable) {
TracedValue::SetWriterFactoryCallback(&CreateProtoWriter); TracedValue::SetWriterFactoryCallback(enable ? &CreateProtoWriter : nullptr);
} }
} // namespace tracing } // namespace tracing
...@@ -35,7 +35,7 @@ class COMPONENT_EXPORT(TRACING_CPP) PerfettoProtoAppender ...@@ -35,7 +35,7 @@ class COMPONENT_EXPORT(TRACING_CPP) PerfettoProtoAppender
perfetto::protos::pbzero::ChromeTraceEvent_Arg* proto_; perfetto::protos::pbzero::ChromeTraceEvent_Arg* proto_;
}; };
void COMPONENT_EXPORT(TRACING_CPP) RegisterTracedValueProtoWriter(); void COMPONENT_EXPORT(TRACING_CPP) RegisterTracedValueProtoWriter(bool enable);
} // namespace tracing } // namespace tracing
#endif // SERVICES_TRACING_PUBLIC_CPP_PERFETTO_TRACED_VALUE_PROTO_WRITER_H_ #endif // SERVICES_TRACING_PUBLIC_CPP_PERFETTO_TRACED_VALUE_PROTO_WRITER_H_
...@@ -68,9 +68,9 @@ class ProtoInputStream : public google::protobuf::io::ZeroCopyInputStream { ...@@ -68,9 +68,9 @@ class ProtoInputStream : public google::protobuf::io::ZeroCopyInputStream {
class TracedValueProtoWriterTest : public testing::Test { class TracedValueProtoWriterTest : public testing::Test {
public: public:
void SetUp() override { RegisterTracedValueProtoWriter(); } void SetUp() override { RegisterTracedValueProtoWriter(true); }
void TearDown() override {} void TearDown() override { RegisterTracedValueProtoWriter(false); }
}; };
const perfetto::protos::ChromeTracedValue* FindDictEntry( const perfetto::protos::ChromeTracedValue* FindDictEntry(
......
...@@ -51,67 +51,50 @@ ProducerClient* GetProducerClient() { ...@@ -51,67 +51,50 @@ ProducerClient* GetProducerClient() {
return producer_client.get(); return producer_client.get();
} }
} // namespace void InitializeProducerClient(service_manager::Connector* connector) {
mojom::PerfettoServicePtr perfetto_service;
connector->BindInterface(mojom::kServiceName, &perfetto_service);
GetProducerClient()->CreateMojoMessagepipes(base::BindOnce(
[](mojom::PerfettoServicePtr perfetto_service,
mojom::ProducerClientPtr producer_client_pipe,
mojom::ProducerHostRequest producer_host_pipe) {
perfetto_service->ConnectToProducerHost(std::move(producer_client_pipe),
std::move(producer_host_pipe));
},
std::move(perfetto_service)));
GetProducerClient()->AddDataSource(TraceEventDataSource::GetInstance());
}
class PerfettoTraceEventAgent : public TraceEventAgent { void AddPerfettoMetadataGeneratorFunction(
public: TraceEventAgent::MetadataGeneratorFunction generator) {
PerfettoTraceEventAgent(service_manager::Connector* connector, // Instantiate and register the metadata data source on the first
bool request_clock_sync_marker_on_android) // call.
: TraceEventAgent(connector, request_clock_sync_marker_on_android) { static TraceEventMetadataSource* metadata_source = []() {
mojom::PerfettoServicePtr perfetto_service; static base::NoDestructor<TraceEventMetadataSource> instance;
connector->BindInterface(mojom::kServiceName, &perfetto_service); GetProducerClient()->AddDataSource(instance.get());
return instance.get();
GetProducerClient()->CreateMojoMessagepipes(base::BindOnce( }();
[](mojom::PerfettoServicePtr perfetto_service,
mojom::ProducerClientPtr producer_client_pipe, metadata_source->AddGeneratorFunction(generator);
mojom::ProducerHostRequest producer_host_pipe) { }
perfetto_service->ConnectToProducerHost(
std::move(producer_client_pipe), std::move(producer_host_pipe)); } // namespace
},
std::move(perfetto_service)));
GetProducerClient()->AddDataSource(TraceEventDataSource::GetInstance());
}
void AddMetadataGeneratorFunction(
MetadataGeneratorFunction generator) override {
// Instantiate and register the metadata data source on the first
// call.
static TraceEventMetadataSource* metadata_source = []() {
static base::NoDestructor<TraceEventMetadataSource> instance;
GetProducerClient()->AddDataSource(instance.get());
return instance.get();
}();
metadata_source->AddGeneratorFunction(generator);
}
};
#endif #endif
// static // static
std::unique_ptr<TraceEventAgent> TraceEventAgent::Create( std::unique_ptr<TraceEventAgent> TraceEventAgent::Create(
service_manager::Connector* connector, service_manager::Connector* connector,
bool request_clock_sync_marker_on_android) { bool request_clock_sync_marker_on_android) {
std::unique_ptr<TraceEventAgent> new_agent;
if (TracingUsesPerfettoBackend()) {
#if defined(PERFETTO_AVAILABLE) #if defined(PERFETTO_AVAILABLE)
new_agent = std::make_unique<PerfettoTraceEventAgent>( InitializeProducerClient(connector);
connector, request_clock_sync_marker_on_android);
#else
LOG(ERROR) << "Perfetto is not yet available for this platform; falling "
"back to using legacy TraceLog";
#endif #endif
}
// Use legacy tracing if we're on an unsupported platform or the feature flag return std::make_unique<TraceEventAgent>(
// is disabled. connector, request_clock_sync_marker_on_android);
if (!new_agent) {
new_agent = std::make_unique<LegacyTraceEventAgent>(
connector, request_clock_sync_marker_on_android);
}
return new_agent;
} }
TraceEventAgent::TraceEventAgent(service_manager::Connector* connector, TraceEventAgent::TraceEventAgent(service_manager::Connector* connector,
...@@ -124,13 +107,16 @@ TraceEventAgent::TraceEventAgent(service_manager::Connector* connector, ...@@ -124,13 +107,16 @@ TraceEventAgent::TraceEventAgent(service_manager::Connector* connector,
#else #else
false, false,
#endif #endif
base::trace_event::TraceLog::GetInstance()->process_id()) { base::trace_event::TraceLog::GetInstance()->process_id()),
enabled_tracing_modes_(0) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!g_trace_event_agent); DCHECK(!g_trace_event_agent);
g_trace_event_agent = this; g_trace_event_agent = this;
} }
TraceEventAgent::~TraceEventAgent() { TraceEventAgent::~TraceEventAgent() {
g_trace_event_agent = nullptr; g_trace_event_agent = nullptr;
DCHECK(!trace_log_needs_me_);
} }
void TraceEventAgent::RequestClockSyncMarker( void TraceEventAgent::RequestClockSyncMarker(
...@@ -151,27 +137,18 @@ void TraceEventAgent::GetCategories(GetCategoriesCallback callback) { ...@@ -151,27 +137,18 @@ void TraceEventAgent::GetCategories(GetCategoriesCallback callback) {
std::move(callback).Run(base::JoinString(category_vector, ",")); std::move(callback).Run(base::JoinString(category_vector, ","));
} }
LegacyTraceEventAgent::LegacyTraceEventAgent( void TraceEventAgent::AddMetadataGeneratorFunction(
service_manager::Connector* connector,
bool request_clock_sync_marker_on_android)
: TraceEventAgent(connector, request_clock_sync_marker_on_android),
enabled_tracing_modes_(0) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
}
LegacyTraceEventAgent::~LegacyTraceEventAgent() {
DCHECK(!trace_log_needs_me_);
}
void LegacyTraceEventAgent::AddMetadataGeneratorFunction(
MetadataGeneratorFunction generator) { MetadataGeneratorFunction generator) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
metadata_generator_functions_.push_back(generator); metadata_generator_functions_.push_back(generator);
#if defined(PERFETTO_AVAILABLE)
AddPerfettoMetadataGeneratorFunction(generator);
#endif
} }
void LegacyTraceEventAgent::StartTracing(const std::string& config, void TraceEventAgent::StartTracing(const std::string& config,
base::TimeTicks coordinator_time, base::TimeTicks coordinator_time,
StartTracingCallback callback) { StartTracingCallback callback) {
DCHECK(!recorder_); DCHECK(!recorder_);
#if defined(__native_client__) #if defined(__native_client__)
// NaCl and system times are offset by a bit, so subtract some time from // NaCl and system times are offset by a bit, so subtract some time from
...@@ -189,7 +166,7 @@ void LegacyTraceEventAgent::StartTracing(const std::string& config, ...@@ -189,7 +166,7 @@ void LegacyTraceEventAgent::StartTracing(const std::string& config,
std::move(callback).Run(true); std::move(callback).Run(true);
} }
void LegacyTraceEventAgent::StopAndFlush(mojom::RecorderPtr recorder) { void TraceEventAgent::StopAndFlush(mojom::RecorderPtr recorder) {
DCHECK(!recorder_); DCHECK(!recorder_);
recorder_ = std::move(recorder); recorder_ = std::move(recorder);
base::trace_event::TraceLog::GetInstance()->SetDisabled( base::trace_event::TraceLog::GetInstance()->SetDisabled(
...@@ -201,18 +178,18 @@ void LegacyTraceEventAgent::StopAndFlush(mojom::RecorderPtr recorder) { ...@@ -201,18 +178,18 @@ void LegacyTraceEventAgent::StopAndFlush(mojom::RecorderPtr recorder) {
recorder_->AddMetadata(std::move(*metadata)); recorder_->AddMetadata(std::move(*metadata));
} }
trace_log_needs_me_ = true; trace_log_needs_me_ = true;
base::trace_event::TraceLog::GetInstance()->Flush(base::Bind( base::trace_event::TraceLog::GetInstance()->Flush(
&LegacyTraceEventAgent::OnTraceLogFlush, base::Unretained(this))); base::Bind(&TraceEventAgent::OnTraceLogFlush, base::Unretained(this)));
} }
void LegacyTraceEventAgent::RequestBufferStatus( void TraceEventAgent::RequestBufferStatus(
RequestBufferStatusCallback callback) { RequestBufferStatusCallback callback) {
base::trace_event::TraceLogStatus status = base::trace_event::TraceLogStatus status =
base::trace_event::TraceLog::GetInstance()->GetStatus(); base::trace_event::TraceLog::GetInstance()->GetStatus();
std::move(callback).Run(status.event_capacity, status.event_count); std::move(callback).Run(status.event_capacity, status.event_count);
} }
void LegacyTraceEventAgent::OnTraceLogFlush( void TraceEventAgent::OnTraceLogFlush(
const scoped_refptr<base::RefCountedString>& events_str, const scoped_refptr<base::RefCountedString>& events_str,
bool has_more_events) { bool has_more_events) {
if (!events_str->data().empty()) if (!events_str->data().empty())
......
...@@ -27,6 +27,11 @@ class Connector; ...@@ -27,6 +27,11 @@ class Connector;
namespace tracing { namespace tracing {
// Agent used to interface with the legacy tracing system.
// When Perfetto is used for the backend instead of TraceLog,
// most of the mojom::Agent functions will never be used
// as the control signals will go through the Perfetto
// interface instead.
class COMPONENT_EXPORT(TRACING_CPP) TraceEventAgent : public BaseAgent { class COMPONENT_EXPORT(TRACING_CPP) TraceEventAgent : public BaseAgent {
public: public:
using MetadataGeneratorFunction = using MetadataGeneratorFunction =
...@@ -36,40 +41,16 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventAgent : public BaseAgent { ...@@ -36,40 +41,16 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventAgent : public BaseAgent {
service_manager::Connector* connector, service_manager::Connector* connector,
bool request_clock_sync_marker_on_android); bool request_clock_sync_marker_on_android);
~TraceEventAgent() override;
TraceEventAgent(service_manager::Connector* connector, TraceEventAgent(service_manager::Connector* connector,
bool request_clock_sync_marker_on_android);
// mojom::Agent
void RequestClockSyncMarker(
const std::string& sync_id,
Agent::RequestClockSyncMarkerCallback callback) override;
void GetCategories(GetCategoriesCallback callback) override;
virtual void AddMetadataGeneratorFunction(
MetadataGeneratorFunction generator) = 0;
private:
DISALLOW_COPY_AND_ASSIGN(TraceEventAgent);
};
// Agent used to interface with the legacy tracing system,
// i.e. without Perfetto.
class COMPONENT_EXPORT(TRACING_CPP) LegacyTraceEventAgent
: public TraceEventAgent {
public:
LegacyTraceEventAgent(service_manager::Connector* connector,
bool request_clock_sync_marker_on_android); bool request_clock_sync_marker_on_android);
void AddMetadataGeneratorFunction( void AddMetadataGeneratorFunction(MetadataGeneratorFunction generator);
MetadataGeneratorFunction generator) override;
private: private:
friend std::default_delete<LegacyTraceEventAgent>; // For Testing friend std::default_delete<TraceEventAgent>; // For Testing
friend class TraceEventAgentTest; // For Testing friend class TraceEventAgentTest; // For Testing
~LegacyTraceEventAgent() override; ~TraceEventAgent() override;
// mojom::Agent // mojom::Agent
void StartTracing(const std::string& config, void StartTracing(const std::string& config,
...@@ -77,6 +58,12 @@ class COMPONENT_EXPORT(TRACING_CPP) LegacyTraceEventAgent ...@@ -77,6 +58,12 @@ class COMPONENT_EXPORT(TRACING_CPP) LegacyTraceEventAgent
StartTracingCallback callback) override; StartTracingCallback callback) override;
void StopAndFlush(mojom::RecorderPtr recorder) override; void StopAndFlush(mojom::RecorderPtr recorder) override;
void RequestClockSyncMarker(
const std::string& sync_id,
Agent::RequestClockSyncMarkerCallback callback) override;
void GetCategories(GetCategoriesCallback callback) override;
void RequestBufferStatus(RequestBufferStatusCallback callback) override; void RequestBufferStatus(RequestBufferStatusCallback callback) override;
void OnTraceLogFlush(const scoped_refptr<base::RefCountedString>& events_str, void OnTraceLogFlush(const scoped_refptr<base::RefCountedString>& events_str,
...@@ -89,7 +76,7 @@ class COMPONENT_EXPORT(TRACING_CPP) LegacyTraceEventAgent ...@@ -89,7 +76,7 @@ class COMPONENT_EXPORT(TRACING_CPP) LegacyTraceEventAgent
THREAD_CHECKER(thread_checker_); THREAD_CHECKER(thread_checker_);
DISALLOW_COPY_AND_ASSIGN(LegacyTraceEventAgent); DISALLOW_COPY_AND_ASSIGN(TraceEventAgent);
}; };
} // namespace tracing } // namespace tracing
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/test/scoped_task_environment.h"
#include "base/test/trace_event_analyzer.h" #include "base/test/trace_event_analyzer.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "base/trace_event/trace_config.h" #include "base/trace_event/trace_config.h"
...@@ -81,16 +82,12 @@ class MockRecorder : public mojom::Recorder { ...@@ -81,16 +82,12 @@ class MockRecorder : public mojom::Recorder {
class TraceEventAgentTest : public testing::Test { class TraceEventAgentTest : public testing::Test {
public: public:
void SetUp() override { void SetUp() override { agent_.reset(new TraceEventAgent(nullptr, false)); }
message_loop_.reset(new base::MessageLoop());
agent_.reset(new LegacyTraceEventAgent(nullptr, false));
}
void TearDown() override { void TearDown() override {
base::trace_event::TraceLog::GetInstance()->SetDisabled(); base::trace_event::TraceLog::GetInstance()->SetDisabled();
recorder_.reset(); recorder_.reset();
agent_.reset(); agent_.reset();
message_loop_.reset();
} }
void StartTracing(const std::string& categories) { void StartTracing(const std::string& categories) {
...@@ -129,8 +126,8 @@ class TraceEventAgentTest : public testing::Test { ...@@ -129,8 +126,8 @@ class TraceEventAgentTest : public testing::Test {
MockRecorder* recorder() const { return recorder_.get(); } MockRecorder* recorder() const { return recorder_.get(); }
private: private:
std::unique_ptr<base::MessageLoop> message_loop_; base::test::ScopedTaskEnvironment scoped_task_environment_;
std::unique_ptr<LegacyTraceEventAgent> agent_; std::unique_ptr<TraceEventAgent> agent_;
std::unique_ptr<MockRecorder> recorder_; std::unique_ptr<MockRecorder> recorder_;
}; };
......
...@@ -37,7 +37,8 @@ TracingService::~TracingService() { ...@@ -37,7 +37,8 @@ TracingService::~TracingService() {
} }
if (perfetto_service_) { if (perfetto_service_) {
task_runner_->DeleteSoon(FROM_HERE, std::move(perfetto_service_)); perfetto_service_->task_runner()->DeleteSoon(FROM_HERE,
std::move(perfetto_service_));
} }
#endif #endif
} }
...@@ -47,13 +48,15 @@ void TracingService::OnStart() { ...@@ -47,13 +48,15 @@ void TracingService::OnStart() {
bool enable_legacy_tracing = true; bool enable_legacy_tracing = true;
if (TracingUsesPerfettoBackend()) {
#if defined(PERFETTO_SERVICE_AVAILABLE) #if defined(PERFETTO_SERVICE_AVAILABLE)
perfetto_service_ = std::make_unique<tracing::PerfettoService>(); perfetto_service_ = std::make_unique<tracing::PerfettoService>();
registry_.AddInterface(
base::BindRepeating(&tracing::PerfettoService::BindRequest,
base::Unretained(perfetto_service_.get())));
if (TracingUsesPerfettoBackend()) {
task_runner_ = perfetto_service_->task_runner(); task_runner_ = perfetto_service_->task_runner();
registry_.AddInterface(
base::BindRepeating(&tracing::PerfettoService::BindRequest,
base::Unretained(perfetto_service_.get())));
auto perfetto_coordinator = std::make_unique<PerfettoTracingCoordinator>( auto perfetto_coordinator = std::make_unique<PerfettoTracingCoordinator>(
tracing_agent_registry_.get()); tracing_agent_registry_.get());
...@@ -61,9 +64,15 @@ void TracingService::OnStart() { ...@@ -61,9 +64,15 @@ void TracingService::OnStart() {
base::BindRepeating(&PerfettoTracingCoordinator::BindCoordinatorRequest, base::BindRepeating(&PerfettoTracingCoordinator::BindCoordinatorRequest,
base::Unretained(perfetto_coordinator.get()))); base::Unretained(perfetto_coordinator.get())));
perfetto_tracing_coordinator_ = std::move(perfetto_coordinator); perfetto_tracing_coordinator_ = std::move(perfetto_coordinator);
enable_legacy_tracing = false; enable_legacy_tracing = false;
#endif
} }
#else
if (TracingUsesPerfettoBackend()) {
LOG(ERROR) << "Perfetto is not yet available for this platform; falling "
"back to using legacy TraceLog";
}
#endif
// Use legacy tracing if we're on an unsupported platform or the feature flag // Use legacy tracing if we're on an unsupported platform or the feature flag
// is disabled. // is disabled.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment