aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-02-04 13:10:52 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-02-04 13:10:52 +0000
commit0242fb8831ce8458e33402eda71048a46273a577 (patch)
tree9b6b0ff2147d4d47771b2bc31a491740691704db
parent59d477236fa35da1d034c75e3484e1b01c4710f4 (diff)
parentcc7aef8488eeee5f8effe4846332c46e5d3b7de2 (diff)
downloadperfetto-android13-mainline-media-release.tar.gz
Snap for 9564107 from cc7aef8488eeee5f8effe4846332c46e5d3b7de2 to mainline-media-releaseaml_med_331712010aml_med_331612000android13-mainline-media-release
Change-Id: I1f68f5a60e4382afe89428efec4b3fa142244a45
-rw-r--r--CHANGELOG4
-rw-r--r--include/perfetto/tracing/internal/system_tracing_backend.h17
-rw-r--r--include/perfetto/tracing/tracing.h24
-rw-r--r--src/tracing/internal/system_tracing_backend.cc50
-rw-r--r--src/tracing/internal/system_tracing_backend_fake.cc6
-rw-r--r--src/tracing/internal/tracing_muxer_impl.cc5
-rw-r--r--src/tracing/internal/tracing_muxer_impl.h2
-rw-r--r--src/tracing/test/api_integrationtest.cc38
8 files changed, 129 insertions, 17 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 99e6c4b91..4b35e3837 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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 {