diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-02-04 13:10:52 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-02-04 13:10:52 +0000 |
commit | 0242fb8831ce8458e33402eda71048a46273a577 (patch) | |
tree | 9b6b0ff2147d4d47771b2bc31a491740691704db | |
parent | 59d477236fa35da1d034c75e3484e1b01c4710f4 (diff) | |
parent | cc7aef8488eeee5f8effe4846332c46e5d3b7de2 (diff) | |
download | perfetto-0242fb8831ce8458e33402eda71048a46273a577.tar.gz |
Snap for 9564107 from cc7aef8488eeee5f8effe4846332c46e5d3b7de2 to mainline-media-releaseaml_med_331712010aml_med_331612000android13-mainline-media-release
Change-Id: I1f68f5a60e4382afe89428efec4b3fa142244a45
-rw-r--r-- | CHANGELOG | 4 | ||||
-rw-r--r-- | include/perfetto/tracing/internal/system_tracing_backend.h | 17 | ||||
-rw-r--r-- | include/perfetto/tracing/tracing.h | 24 | ||||
-rw-r--r-- | src/tracing/internal/system_tracing_backend.cc | 50 | ||||
-rw-r--r-- | src/tracing/internal/system_tracing_backend_fake.cc | 6 | ||||
-rw-r--r-- | src/tracing/internal/tracing_muxer_impl.cc | 5 | ||||
-rw-r--r-- | src/tracing/internal/tracing_muxer_impl.h | 2 | ||||
-rw-r--r-- | src/tracing/test/api_integrationtest.cc | 38 |
8 files changed, 129 insertions, 17 deletions
@@ -8,8 +8,8 @@ Unreleased: UI: * SDK: - * - + * Added TracingInitArgs::enable_system_consumer configuration option, that + allows the linker to discard the consumer IPC, if not required. v25.0 - 2022-04-01: Tracing service and probes: diff --git a/include/perfetto/tracing/internal/system_tracing_backend.h b/include/perfetto/tracing/internal/system_tracing_backend.h index 69a1cad78..7617109a5 100644 --- a/include/perfetto/tracing/internal/system_tracing_backend.h +++ b/include/perfetto/tracing/internal/system_tracing_backend.h @@ -35,6 +35,8 @@ class Producer; // together with system traces, useful to correlate on the timeline system // events (e.g. scheduling slices from the kernel) with in-app events. namespace internal { + +// Full backend (with producer and consumer) class PERFETTO_EXPORT SystemTracingBackend : public TracingBackend { public: static TracingBackend* GetInstance(); @@ -49,6 +51,21 @@ class PERFETTO_EXPORT SystemTracingBackend : public TracingBackend { SystemTracingBackend(); }; +// Producer only backend. +class PERFETTO_EXPORT SystemTracingProducerOnlyBackend : public TracingBackend { + public: + static TracingBackend* GetInstance(); + + // TracingBackend implementation. + std::unique_ptr<ProducerEndpoint> ConnectProducer( + const ConnectProducerArgs&) override; + std::unique_ptr<ConsumerEndpoint> ConnectConsumer( + const ConnectConsumerArgs&) override; + + private: + SystemTracingProducerOnlyBackend(); +}; + } // namespace internal } // namespace perfetto diff --git a/include/perfetto/tracing/tracing.h b/include/perfetto/tracing/tracing.h index 9aae9e8fe..01d4851c5 100644 --- a/include/perfetto/tracing/tracing.h +++ b/include/perfetto/tracing/tracing.h @@ -115,6 +115,13 @@ struct TracingInitArgs { // callback instead of being logged directly. LogMessageCallback log_message_callback = nullptr; + // This flag can be set to false in order to avoid enabling the system + // consumer in Tracing::Initialize(), so that the linker can remove the unused + // consumer IPC implementation to reduce binary size. When this option is + // false, calling Tracing::NewTrace() on the system backend will fail. This + // setting only has an effect if kSystemBackend is specified in |backends|. + bool enable_system_consumer = true; + protected: friend class Tracing; friend class internal::TracingMuxerImpl; @@ -124,11 +131,13 @@ struct TracingInitArgs { bool operator==(const TracingInitArgs& other) const { return std::tie(backends, custom_backend, platform, shmem_size_hint_kb, shmem_page_size_hint_kb, in_process_backend_factory_, - system_backend_factory_, dcheck_is_on_) == + system_backend_factory_, dcheck_is_on_, + enable_system_consumer) == std::tie(other.backends, other.custom_backend, other.platform, other.shmem_size_hint_kb, other.shmem_page_size_hint_kb, other.in_process_backend_factory_, - other.system_backend_factory_, other.dcheck_is_on_); + other.system_backend_factory_, other.dcheck_is_on_, + other.enable_system_consumer); } using BackendFactoryFunction = TracingBackend* (*)(); @@ -161,8 +170,13 @@ class PERFETTO_EXPORT Tracing { &internal::InProcessTracingBackend::GetInstance; } if (args.backends & kSystemBackend) { - args_copy.system_backend_factory_ = - &internal::SystemTracingBackend::GetInstance; + if (args.enable_system_consumer) { + args_copy.system_backend_factory_ = + &internal::SystemTracingBackend::GetInstance; + } else { + args_copy.system_backend_factory_ = + &internal::SystemTracingProducerOnlyBackend::GetInstance; + } } InitializeInternal(args_copy); } @@ -172,8 +186,6 @@ class PERFETTO_EXPORT Tracing { // Start a new tracing session using the given tracing backend. Use // |kUnspecifiedBackend| to select an available backend automatically. - // For the moment this can be used only when initializing tracing in - // kInProcess mode. For the system mode use the 'bin/perfetto' cmdline client. static std::unique_ptr<TracingSession> NewTrace( BackendType = kUnspecifiedBackend); diff --git a/src/tracing/internal/system_tracing_backend.cc b/src/tracing/internal/system_tracing_backend.cc index 5aa349343..5562421cf 100644 --- a/src/tracing/internal/system_tracing_backend.cc +++ b/src/tracing/internal/system_tracing_backend.cc @@ -25,6 +25,22 @@ namespace perfetto { namespace internal { +namespace { + +std::unique_ptr<ProducerEndpoint> CreateProducerEndpoint( + const TracingBackend::ConnectProducerArgs& args) { + PERFETTO_DCHECK(args.task_runner->RunsTasksOnCurrentThread()); + + auto endpoint = ProducerIPCClient::Connect( + GetProducerSocket(), args.producer, args.producer_name, args.task_runner, + TracingService::ProducerSMBScrapingMode::kEnabled, + args.shmem_size_hint_bytes, args.shmem_page_size_hint_bytes, nullptr, + nullptr, ProducerIPCClient::ConnectionFlags::kRetryIfUnreachable); + PERFETTO_CHECK(endpoint); + return endpoint; +} + +} // namespace // static TracingBackend* SystemTracingBackend::GetInstance() { @@ -36,15 +52,7 @@ SystemTracingBackend::SystemTracingBackend() {} std::unique_ptr<ProducerEndpoint> SystemTracingBackend::ConnectProducer( const ConnectProducerArgs& args) { - PERFETTO_DCHECK(args.task_runner->RunsTasksOnCurrentThread()); - - auto endpoint = ProducerIPCClient::Connect( - GetProducerSocket(), args.producer, args.producer_name, args.task_runner, - TracingService::ProducerSMBScrapingMode::kEnabled, - args.shmem_size_hint_bytes, args.shmem_page_size_hint_bytes, nullptr, - nullptr, ProducerIPCClient::ConnectionFlags::kRetryIfUnreachable); - PERFETTO_CHECK(endpoint); - return endpoint; + return CreateProducerEndpoint(args); } std::unique_ptr<ConsumerEndpoint> SystemTracingBackend::ConnectConsumer( @@ -55,5 +63,29 @@ std::unique_ptr<ConsumerEndpoint> SystemTracingBackend::ConnectConsumer( return endpoint; } +// static +TracingBackend* SystemTracingProducerOnlyBackend::GetInstance() { + static auto* instance = new SystemTracingProducerOnlyBackend(); + return instance; +} + +SystemTracingProducerOnlyBackend::SystemTracingProducerOnlyBackend() {} + +std::unique_ptr<ProducerEndpoint> +SystemTracingProducerOnlyBackend::ConnectProducer( + const ConnectProducerArgs& args) { + return CreateProducerEndpoint(args); +} + +std::unique_ptr<ConsumerEndpoint> +SystemTracingProducerOnlyBackend::ConnectConsumer( + const ConnectConsumerArgs& args) { + base::ignore_result(args); + PERFETTO_FATAL( + "System backend consumer support disabled. " + "TracingInitArgs::enable_system_consumer was false"); + return nullptr; +} + } // namespace internal } // namespace perfetto diff --git a/src/tracing/internal/system_tracing_backend_fake.cc b/src/tracing/internal/system_tracing_backend_fake.cc index 9ca90d029..ea992a1ce 100644 --- a/src/tracing/internal/system_tracing_backend_fake.cc +++ b/src/tracing/internal/system_tracing_backend_fake.cc @@ -27,5 +27,11 @@ TracingBackend* SystemTracingBackend::GetInstance() { return nullptr; } +// static +TracingBackend* SystemTracingProducerOnlyBackend::GetInstance() { + PERFETTO_FATAL("System tracing not implemented"); + return nullptr; +} + } // namespace internal } // namespace perfetto diff --git a/src/tracing/internal/tracing_muxer_impl.cc b/src/tracing/internal/tracing_muxer_impl.cc index dd34ca4b3..876b90b0e 100644 --- a/src/tracing/internal/tracing_muxer_impl.cc +++ b/src/tracing/internal/tracing_muxer_impl.cc @@ -761,6 +761,7 @@ void TracingMuxerImpl::Initialize(const TracingInitArgs& args) { rb.backend = backend; rb.id = backend_id; rb.type = type; + rb.consumer_enabled = type != kSystemBackend || args.enable_system_consumer; rb.producer.reset(new ProducerImpl(this, backend_id, args.shmem_batch_commits_duration_ms)); rb.producer_conn_args.producer = rb.producer.get(); @@ -1645,6 +1646,10 @@ std::unique_ptr<TracingSession> TracingMuxerImpl::CreateTracingSession( continue; } + if (!backend.consumer_enabled) { + continue; + } + TracingBackendId backend_id = backend.id; // Create the consumer now, even if we have to ask the embedder below, so diff --git a/src/tracing/internal/tracing_muxer_impl.h b/src/tracing/internal/tracing_muxer_impl.h index 1841cd47b..c545a0bc7 100644 --- a/src/tracing/internal/tracing_muxer_impl.h +++ b/src/tracing/internal/tracing_muxer_impl.h @@ -380,6 +380,8 @@ class TracingMuxerImpl : public TracingMuxer { // The calling code can request more than one concurrently active tracing // session for the same backend. We need to create one consumer per session. std::vector<std::unique_ptr<ConsumerImpl>> consumers; + + bool consumer_enabled = true; }; void UpdateDataSourceOnAllBackends(RegisteredDataSource& rds, diff --git a/src/tracing/test/api_integrationtest.cc b/src/tracing/test/api_integrationtest.cc index 0604d091e..98963fc75 100644 --- a/src/tracing/test/api_integrationtest.cc +++ b/src/tracing/test/api_integrationtest.cc @@ -4952,6 +4952,44 @@ TEST_P(PerfettoApiTest, EmptyEvent) { EXPECT_EQ(it, trace.packet().end()); } +TEST(PerfettoApiInitTest, DisableSystemConsumer) { + g_test_tracing_policy->should_allow_consumer_connection = true; + + if (!perfetto::test::StartSystemService()) { + GTEST_SKIP(); + } + + EXPECT_FALSE(perfetto::Tracing::IsInitialized()); + TracingInitArgs args; + args.backends = perfetto::kSystemBackend; + args.tracing_policy = g_test_tracing_policy; + args.enable_system_consumer = false; + perfetto::Tracing::Initialize(args); + + // If this wasn't the first test to run in this process, any producers + // connected to the old system service will have been disconnected by the + // service restarting above. Wait for all producers to connect again before + // proceeding with the test. + perfetto::test::SyncProducers(); + + perfetto::test::DisableReconnectLimit(); + + std::unique_ptr<perfetto::TracingSession> ts = + perfetto::Tracing::NewTrace(perfetto::kSystemBackend); + + // Creating the consumer should cause an asynchronous disconnect error. + WaitableTestEvent got_error; + ts->SetOnErrorCallback([&](perfetto::TracingError error) { + EXPECT_EQ(perfetto::TracingError::kDisconnected, error.code); + EXPECT_FALSE(error.message.empty()); + got_error.Notify(); + }); + got_error.Wait(); + ts.reset(); + + perfetto::Tracing::ResetForTesting(); +} + struct BackendTypeAsString { std::string operator()( const ::testing::TestParamInfo<perfetto::BackendType>& info) const { |