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