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

Perfetto: Make ProducerClient a leaky singleton

This is needed as the TraceWriters we create and keep in TLS
keep a reference to the SharedMemoryArbiter object that the
ProducerClient keeps, and during shutdown may still be
used after the ProducerClient previously got deleted.

R=hjd@chromium.org
BUG=844379

Change-Id: Ib27b59b48ce50f88f954618e7eee4f046b3029b7
Reviewed-on: https://chromium-review.googlesource.com/1117776Reviewed-by: default avatarHector Dearman <hjd@chromium.org>
Commit-Queue: oysteine <oysteine@chromium.org>
Cr-Commit-Position: refs/heads/master@{#571140}
parent 4ffc8d34
......@@ -292,7 +292,7 @@ TEST_F(PerfettoIntegrationTest, ProducerDatasourceInitialized) {
producer_initialized_runloop.Run();
ProducerClient::DeleteSoon(std::move(dummy_client));
ProducerClient::DeleteSoonForTesting(std::move(dummy_client));
}
TEST_F(PerfettoIntegrationTest, ClientEnabledAndDisabled) {
......@@ -327,7 +327,7 @@ TEST_F(PerfettoIntegrationTest, ClientEnabledAndDisabled) {
on_trace_packets.Run();
EXPECT_EQ(0u, consumer.received_packets());
ProducerClient::DeleteSoon(std::move(client));
ProducerClient::DeleteSoonForTesting(std::move(client));
}
TEST_F(PerfettoIntegrationTest, PacketsEndToEndProducerFirst) {
......@@ -365,7 +365,7 @@ TEST_F(PerfettoIntegrationTest, PacketsEndToEndProducerFirst) {
EXPECT_EQ(kNumPackets, consumer.received_packets());
ProducerClient::DeleteSoon(std::move(client));
ProducerClient::DeleteSoonForTesting(std::move(client));
}
TEST_F(PerfettoIntegrationTest, PacketsEndToEndConsumerFirst) {
......@@ -400,7 +400,7 @@ TEST_F(PerfettoIntegrationTest, PacketsEndToEndConsumerFirst) {
no_more_packets_runloop.Run();
EXPECT_EQ(kNumPackets, consumer.received_packets());
ProducerClient::DeleteSoon(std::move(client));
ProducerClient::DeleteSoonForTesting(std::move(client));
}
#if defined(THREAD_SANITIZER)
......@@ -444,7 +444,7 @@ TEST_F(PerfettoIntegrationTest, MAYBE_CommitDataRequestIsMaybeComplete) {
EXPECT_EQ(client->all_client_commit_data_requests(),
new_producer->all_host_commit_data_requests());
ProducerClient::DeleteSoon(std::move(client));
ProducerClient::DeleteSoonForTesting(std::move(client));
}
TEST_F(PerfettoIntegrationTest, TracingRestarted) {
......@@ -501,7 +501,7 @@ TEST_F(PerfettoIntegrationTest, TracingRestarted) {
EXPECT_EQ(kNumPackets * 2, consumer.received_packets());
ProducerClient::DeleteSoon(std::move(client));
ProducerClient::DeleteSoonForTesting(std::move(client));
}
TEST_F(PerfettoIntegrationTest, NoPacketsReceivedOnWrongSourceName) {
......@@ -538,7 +538,7 @@ TEST_F(PerfettoIntegrationTest, NoPacketsReceivedOnWrongSourceName) {
no_more_packets_runloop.Run();
EXPECT_EQ(0u, consumer.received_packets());
ProducerClient::DeleteSoon(std::move(client));
ProducerClient::DeleteSoonForTesting(std::move(client));
}
TEST_F(PerfettoIntegrationTest,
......@@ -572,8 +572,8 @@ TEST_F(PerfettoIntegrationTest,
EXPECT_TRUE(client2->shared_memory());
EXPECT_NE(client1->shared_memory(), client2->shared_memory());
ProducerClient::DeleteSoon(std::move(client1));
ProducerClient::DeleteSoon(std::move(client2));
ProducerClient::DeleteSoonForTesting(std::move(client1));
ProducerClient::DeleteSoonForTesting(std::move(client2));
}
} // namespace
......
......@@ -42,7 +42,7 @@ ProducerClient::~ProducerClient() {
}
// static
void ProducerClient::DeleteSoon(
void ProducerClient::DeleteSoonForTesting(
std::unique_ptr<ProducerClient> producer_client) {
GetTaskRunner()->DeleteSoon(FROM_HERE, std::move(producer_client));
}
......
......@@ -44,7 +44,7 @@ class COMPONENT_EXPORT(TRACING_CPP) ProducerClient
ProducerClient();
~ProducerClient() override;
static void DeleteSoon(std::unique_ptr<ProducerClient>);
static void DeleteSoonForTesting(std::unique_ptr<ProducerClient>);
// Returns the taskrunner used by Perfetto.
static base::SequencedTaskRunner* GetTaskRunner();
......
......@@ -11,6 +11,7 @@
#include "base/bind.h"
#include "base/memory/ref_counted.h"
#include "base/memory/ref_counted_memory.h"
#include "base/no_destructor.h"
#include "base/strings/string_util.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
......@@ -35,14 +36,23 @@ const char kTraceEventLabel[] = "traceEvents";
namespace tracing {
#if defined(PERFETTO_AVAILABLE)
namespace {
ProducerClient* GetProducerClient() {
static base::NoDestructor<ProducerClient> producer_client;
return producer_client.get();
}
} // namespace
class PerfettoTraceEventAgent : public TraceEventAgent {
public:
explicit PerfettoTraceEventAgent(service_manager::Connector* connector) {
mojom::PerfettoServicePtr perfetto_service;
connector->BindInterface(mojom::kServiceName, &perfetto_service);
producer_client_ = std::make_unique<ProducerClient>();
producer_client_->CreateMojoMessagepipes(base::BindOnce(
GetProducerClient()->CreateMojoMessagepipes(base::BindOnce(
[](mojom::PerfettoServicePtr perfetto_service,
mojom::ProducerClientPtr producer_client_pipe,
mojom::ProducerHostRequest producer_host_pipe) {
......@@ -51,13 +61,6 @@ class PerfettoTraceEventAgent : public TraceEventAgent {
},
std::move(perfetto_service)));
}
~PerfettoTraceEventAgent() override {
ProducerClient::DeleteSoon(std::move(producer_client_));
}
private:
std::unique_ptr<ProducerClient> producer_client_;
};
#endif
......
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