Switch TracingService to use protozero
This CL switches the code inside TracingServiceImpl to
use protozero instead of protobuf-lite for emitting
clock snapshot and other similar packets.
This in turn allows to get rid of trusted_packet.proto,
which was introduced to reduce binary siize and avoid
linking the full TracePacket. This is now unnecessary
as libprotozero is header-only and based on fwd decls.
Bug: 132880619
Test: perfetto_unittests
Change-Id: If28df61185a69fcf988022aa71399271c21b35a4
diff --git a/Android.bp b/Android.bp
index 0ac9f19..94ff35d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -102,7 +102,6 @@
":perfetto_protos_perfetto_trace_ftrace_zero_gen",
":perfetto_protos_perfetto_trace_gpu_zero_gen",
":perfetto_protos_perfetto_trace_interned_data_zero_gen",
- ":perfetto_protos_perfetto_trace_minimal_lite_gen",
":perfetto_protos_perfetto_trace_minimal_zero_gen",
":perfetto_protos_perfetto_trace_non_minimal_zero_gen",
":perfetto_protos_perfetto_trace_perfetto_zero_gen",
@@ -111,7 +110,6 @@
":perfetto_protos_perfetto_trace_ps_zero_gen",
":perfetto_protos_perfetto_trace_sys_stats_zero_gen",
":perfetto_protos_perfetto_trace_track_event_zero_gen",
- ":perfetto_protos_perfetto_trace_trusted_lite_gen",
":perfetto_src_base_base",
":perfetto_src_base_unix_socket",
":perfetto_src_ipc_ipc",
@@ -175,7 +173,6 @@
"perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
"perfetto_protos_perfetto_trace_gpu_zero_gen_headers",
"perfetto_protos_perfetto_trace_interned_data_zero_gen_headers",
- "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
"perfetto_protos_perfetto_trace_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_non_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_perfetto_zero_gen_headers",
@@ -184,7 +181,6 @@
"perfetto_protos_perfetto_trace_ps_zero_gen_headers",
"perfetto_protos_perfetto_trace_sys_stats_zero_gen_headers",
"perfetto_protos_perfetto_trace_track_event_zero_gen_headers",
- "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
],
defaults: [
"perfetto_defaults",
@@ -311,7 +307,6 @@
":perfetto_protos_perfetto_trace_ftrace_zero_gen",
":perfetto_protos_perfetto_trace_gpu_zero_gen",
":perfetto_protos_perfetto_trace_interned_data_zero_gen",
- ":perfetto_protos_perfetto_trace_minimal_lite_gen",
":perfetto_protos_perfetto_trace_minimal_zero_gen",
":perfetto_protos_perfetto_trace_non_minimal_zero_gen",
":perfetto_protos_perfetto_trace_perfetto_zero_gen",
@@ -320,7 +315,6 @@
":perfetto_protos_perfetto_trace_ps_zero_gen",
":perfetto_protos_perfetto_trace_sys_stats_zero_gen",
":perfetto_protos_perfetto_trace_track_event_zero_gen",
- ":perfetto_protos_perfetto_trace_trusted_lite_gen",
":perfetto_src_android_internal_headers",
":perfetto_src_android_internal_lazy_library_loader",
":perfetto_src_base_base",
@@ -393,7 +387,6 @@
"perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
"perfetto_protos_perfetto_trace_gpu_zero_gen_headers",
"perfetto_protos_perfetto_trace_interned_data_zero_gen_headers",
- "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
"perfetto_protos_perfetto_trace_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_non_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_perfetto_zero_gen_headers",
@@ -402,7 +395,6 @@
"perfetto_protos_perfetto_trace_ps_zero_gen_headers",
"perfetto_protos_perfetto_trace_sys_stats_zero_gen_headers",
"perfetto_protos_perfetto_trace_track_event_zero_gen_headers",
- "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
],
defaults: [
"perfetto_defaults",
@@ -499,7 +491,6 @@
":perfetto_protos_perfetto_trace_ftrace_zero_gen",
":perfetto_protos_perfetto_trace_gpu_zero_gen",
":perfetto_protos_perfetto_trace_interned_data_zero_gen",
- ":perfetto_protos_perfetto_trace_minimal_lite_gen",
":perfetto_protos_perfetto_trace_minimal_zero_gen",
":perfetto_protos_perfetto_trace_non_minimal_zero_gen",
":perfetto_protos_perfetto_trace_perfetto_zero_gen",
@@ -508,7 +499,6 @@
":perfetto_protos_perfetto_trace_ps_zero_gen",
":perfetto_protos_perfetto_trace_sys_stats_zero_gen",
":perfetto_protos_perfetto_trace_track_event_zero_gen",
- ":perfetto_protos_perfetto_trace_trusted_lite_gen",
":perfetto_src_base_base",
":perfetto_src_base_unix_socket",
":perfetto_src_ipc_ipc",
@@ -565,7 +555,6 @@
"perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
"perfetto_protos_perfetto_trace_gpu_zero_gen_headers",
"perfetto_protos_perfetto_trace_interned_data_zero_gen_headers",
- "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
"perfetto_protos_perfetto_trace_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_non_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_perfetto_zero_gen_headers",
@@ -574,7 +563,6 @@
"perfetto_protos_perfetto_trace_ps_zero_gen_headers",
"perfetto_protos_perfetto_trace_sys_stats_zero_gen_headers",
"perfetto_protos_perfetto_trace_track_event_zero_gen_headers",
- "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
],
export_generated_headers: [
"perfetto_protos_perfetto_common_cpp_gen_headers",
@@ -615,7 +603,6 @@
"perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
"perfetto_protos_perfetto_trace_gpu_zero_gen_headers",
"perfetto_protos_perfetto_trace_interned_data_zero_gen_headers",
- "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
"perfetto_protos_perfetto_trace_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_non_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_perfetto_zero_gen_headers",
@@ -624,7 +611,6 @@
"perfetto_protos_perfetto_trace_ps_zero_gen_headers",
"perfetto_protos_perfetto_trace_sys_stats_zero_gen_headers",
"perfetto_protos_perfetto_trace_track_event_zero_gen_headers",
- "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
],
defaults: [
"perfetto_defaults",
@@ -686,7 +672,6 @@
":perfetto_protos_perfetto_trace_ftrace_zero_gen",
":perfetto_protos_perfetto_trace_gpu_zero_gen",
":perfetto_protos_perfetto_trace_interned_data_zero_gen",
- ":perfetto_protos_perfetto_trace_minimal_lite_gen",
":perfetto_protos_perfetto_trace_minimal_zero_gen",
":perfetto_protos_perfetto_trace_non_minimal_zero_gen",
":perfetto_protos_perfetto_trace_perfetto_zero_gen",
@@ -695,7 +680,6 @@
":perfetto_protos_perfetto_trace_ps_zero_gen",
":perfetto_protos_perfetto_trace_sys_stats_zero_gen",
":perfetto_protos_perfetto_trace_track_event_zero_gen",
- ":perfetto_protos_perfetto_trace_trusted_lite_gen",
":perfetto_src_android_internal_headers",
":perfetto_src_android_internal_lazy_library_loader",
":perfetto_src_base_base",
@@ -754,7 +738,6 @@
"perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
"perfetto_protos_perfetto_trace_gpu_zero_gen_headers",
"perfetto_protos_perfetto_trace_interned_data_zero_gen_headers",
- "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
"perfetto_protos_perfetto_trace_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_non_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_perfetto_zero_gen_headers",
@@ -763,7 +746,6 @@
"perfetto_protos_perfetto_trace_ps_zero_gen_headers",
"perfetto_protos_perfetto_trace_sys_stats_zero_gen_headers",
"perfetto_protos_perfetto_trace_track_event_zero_gen_headers",
- "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
"perfetto_src_perfetto_cmd_protos_gen_headers",
],
defaults: [
@@ -961,7 +943,6 @@
":perfetto_protos_perfetto_trace_sys_stats_zero_gen",
":perfetto_protos_perfetto_trace_track_event_lite_gen",
":perfetto_protos_perfetto_trace_track_event_zero_gen",
- ":perfetto_protos_perfetto_trace_trusted_lite_gen",
":perfetto_src_android_internal_headers",
":perfetto_src_android_internal_lazy_library_loader",
":perfetto_src_base_base",
@@ -1073,7 +1054,6 @@
"perfetto_protos_perfetto_trace_sys_stats_zero_gen_headers",
"perfetto_protos_perfetto_trace_track_event_lite_gen_headers",
"perfetto_protos_perfetto_trace_track_event_zero_gen_headers",
- "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
],
defaults: [
"perfetto_defaults",
@@ -3966,40 +3946,6 @@
],
}
-// GN: //protos/perfetto/trace:trusted_lite
-genrule {
- name: "perfetto_protos_perfetto_trace_trusted_lite_gen",
- srcs: [
- "protos/perfetto/trace/trusted_packet.proto",
- ],
- tools: [
- "aprotoc",
- ],
- cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/ --proto_path=external/perfetto $(in)",
- out: [
- "external/perfetto/protos/perfetto/trace/trusted_packet.pb.cc",
- ],
-}
-
-// GN: //protos/perfetto/trace:trusted_lite
-genrule {
- name: "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
- srcs: [
- "protos/perfetto/trace/trusted_packet.proto",
- ],
- tools: [
- "aprotoc",
- ],
- cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --cpp_out=$(genDir)/external/perfetto/ --proto_path=external/perfetto $(in)",
- out: [
- "external/perfetto/protos/perfetto/trace/trusted_packet.pb.h",
- ],
- export_include_dirs: [
- ".",
- "protos",
- ],
-}
-
// GN: //protos/third_party/pprof:lite
genrule {
name: "perfetto_protos_third_party_pprof_lite_gen",
@@ -4406,6 +4352,7 @@
"src/protozero/scattered_heap_buffer.cc",
"src/protozero/scattered_stream_null_delegate.cc",
"src/protozero/scattered_stream_writer.cc",
+ "src/protozero/static_buffer.cc",
],
}
@@ -5449,7 +5396,6 @@
":perfetto_protos_perfetto_trace_sys_stats_zero_gen",
":perfetto_protos_perfetto_trace_track_event_lite_gen",
":perfetto_protos_perfetto_trace_track_event_zero_gen",
- ":perfetto_protos_perfetto_trace_trusted_lite_gen",
":perfetto_src_android_internal_headers",
":perfetto_src_android_internal_lazy_library_loader",
":perfetto_src_base_base",
@@ -5595,7 +5541,6 @@
"perfetto_protos_perfetto_trace_sys_stats_zero_gen_headers",
"perfetto_protos_perfetto_trace_track_event_lite_gen_headers",
"perfetto_protos_perfetto_trace_track_event_zero_gen_headers",
- "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
"perfetto_src_ipc_test_messages_gen_headers",
"perfetto_src_perfetto_cmd_protos_gen_headers",
"perfetto_src_protozero_testing_messages_cpp_gen_headers",
@@ -5993,7 +5938,6 @@
":perfetto_protos_perfetto_trace_ftrace_zero_gen",
":perfetto_protos_perfetto_trace_gpu_zero_gen",
":perfetto_protos_perfetto_trace_interned_data_zero_gen",
- ":perfetto_protos_perfetto_trace_minimal_lite_gen",
":perfetto_protos_perfetto_trace_minimal_zero_gen",
":perfetto_protos_perfetto_trace_non_minimal_zero_gen",
":perfetto_protos_perfetto_trace_perfetto_zero_gen",
@@ -6002,7 +5946,6 @@
":perfetto_protos_perfetto_trace_ps_zero_gen",
":perfetto_protos_perfetto_trace_sys_stats_zero_gen",
":perfetto_protos_perfetto_trace_track_event_zero_gen",
- ":perfetto_protos_perfetto_trace_trusted_lite_gen",
":perfetto_src_base_base",
":perfetto_src_base_unix_socket",
":perfetto_src_ipc_ipc",
@@ -6058,7 +6001,6 @@
"perfetto_protos_perfetto_trace_ftrace_zero_gen_headers",
"perfetto_protos_perfetto_trace_gpu_zero_gen_headers",
"perfetto_protos_perfetto_trace_interned_data_zero_gen_headers",
- "perfetto_protos_perfetto_trace_minimal_lite_gen_headers",
"perfetto_protos_perfetto_trace_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_non_minimal_zero_gen_headers",
"perfetto_protos_perfetto_trace_perfetto_zero_gen_headers",
@@ -6067,7 +6009,6 @@
"perfetto_protos_perfetto_trace_ps_zero_gen_headers",
"perfetto_protos_perfetto_trace_sys_stats_zero_gen_headers",
"perfetto_protos_perfetto_trace_track_event_zero_gen_headers",
- "perfetto_protos_perfetto_trace_trusted_lite_gen_headers",
"perfetto_src_perfetto_cmd_protos_gen_headers",
],
defaults: [
diff --git a/BUILD b/BUILD
index 9cb2eae..d6d38ab 100644
--- a/BUILD
+++ b/BUILD
@@ -189,7 +189,6 @@
":protos_perfetto_trace_ftrace_zero",
":protos_perfetto_trace_gpu_zero",
":protos_perfetto_trace_interned_data_zero",
- ":protos_perfetto_trace_minimal_lite",
":protos_perfetto_trace_minimal_zero",
":protos_perfetto_trace_non_minimal_zero",
":protos_perfetto_trace_perfetto_zero",
@@ -198,7 +197,6 @@
":protos_perfetto_trace_ps_zero",
":protos_perfetto_trace_sys_stats_zero",
":protos_perfetto_trace_track_event_zero",
- ":protos_perfetto_trace_trusted_lite",
] + PERFETTO_CONFIG.deps.protobuf_lite,
)
@@ -354,6 +352,7 @@
"include/perfetto/protozero/scattered_heap_buffer.h",
"include/perfetto/protozero/scattered_stream_null_delegate.h",
"include/perfetto/protozero/scattered_stream_writer.h",
+ "include/perfetto/protozero/static_buffer.h",
],
)
@@ -536,6 +535,7 @@
"src/protozero/scattered_heap_buffer.cc",
"src/protozero/scattered_stream_null_delegate.cc",
"src/protozero/scattered_stream_writer.cc",
+ "src/protozero/static_buffer.cc",
],
)
@@ -2155,35 +2155,6 @@
],
)
-# GN target: //protos/perfetto/trace:trusted_lite
-perfetto_cc_proto_library(
- name = "protos_perfetto_trace_trusted_lite",
- deps = [
- ":protos_perfetto_trace_trusted_protos",
- ],
-)
-
-# GN target: //protos/perfetto/trace:trusted_lite
-perfetto_proto_library(
- name = "protos_perfetto_trace_trusted_protos",
- srcs = [
- "protos/perfetto/trace/trusted_packet.proto",
- ],
- deps = [
- ":protos_perfetto_common_protos",
- ":protos_perfetto_config_android_protos",
- ":protos_perfetto_config_ftrace_protos",
- ":protos_perfetto_config_gpu_protos",
- ":protos_perfetto_config_inode_file_protos",
- ":protos_perfetto_config_power_protos",
- ":protos_perfetto_config_process_stats_protos",
- ":protos_perfetto_config_profiling_protos",
- ":protos_perfetto_config_protos",
- ":protos_perfetto_config_sys_stats_protos",
- ":protos_perfetto_trace_minimal_protos",
- ],
-)
-
# GN target: //protos/third_party/pprof:lite
perfetto_cc_proto_library(
name = "protos_third_party_pprof_lite",
@@ -2287,7 +2258,6 @@
":protos_perfetto_trace_ftrace_zero",
":protos_perfetto_trace_gpu_zero",
":protos_perfetto_trace_interned_data_zero",
- ":protos_perfetto_trace_minimal_lite",
":protos_perfetto_trace_minimal_zero",
":protos_perfetto_trace_non_minimal_zero",
":protos_perfetto_trace_perfetto_zero",
@@ -2296,7 +2266,6 @@
":protos_perfetto_trace_ps_zero",
":protos_perfetto_trace_sys_stats_zero",
":protos_perfetto_trace_track_event_zero",
- ":protos_perfetto_trace_trusted_lite",
] + PERFETTO_CONFIG.deps.protobuf_lite,
)
@@ -2368,7 +2337,6 @@
":protos_perfetto_trace_ftrace_zero",
":protos_perfetto_trace_gpu_zero",
":protos_perfetto_trace_interned_data_zero",
- ":protos_perfetto_trace_minimal_lite",
":protos_perfetto_trace_minimal_zero",
":protos_perfetto_trace_non_minimal_zero",
":protos_perfetto_trace_perfetto_zero",
@@ -2377,7 +2345,6 @@
":protos_perfetto_trace_ps_zero",
":protos_perfetto_trace_sys_stats_zero",
":protos_perfetto_trace_track_event_zero",
- ":protos_perfetto_trace_trusted_lite",
":src_perfetto_cmd_protos",
] + PERFETTO_CONFIG.deps.protobuf_lite +
PERFETTO_CONFIG.deps.zlib,
diff --git a/docs/security-model.md b/docs/security-model.md
index bff44a9..369e6cc 100644
--- a/docs/security-model.md
+++ b/docs/security-model.md
@@ -51,10 +51,9 @@
untrusted-and-unprivileged and trusted-and-more-privileged entities).
**Attestation of trace contents**
-The tracing service guarantees that the `TracePacket` fields defined also in
-[trusted_packet.proto](/protos/perfetto/trace/trusted_packet.proto) cannot be
-spoofed by the Producer(s). Packets that try to define those fields are rejected
-(modulo the clock snapshots).
+The tracing service guarantees that the `TracePacket` fields written by the
+Service cannot be spoofed by the Producer(s).
+Packets that try to define those fields are rejected, modulo clock snapshots.
See [PacketStreamValidator](/src/tracing/core/packet_stream_validator.cc) and
[its unit test](/src/tracing/core/packet_stream_validator_unittest.cc) for more
details.
diff --git a/docs/trace-format.md b/docs/trace-format.md
index ca5db49..ec6c3eb 100644
--- a/docs/trace-format.md
+++ b/docs/trace-format.md
@@ -9,9 +9,9 @@
(see [trace_packet.proto](/protos/perfetto/trace/trace_packet.proto)).
As a key part of the Perfetto design, the tracing service is agnostic of the
-content of TracePacket, modulo the few fields defined in
-[trusted_packet.proto](/protos/perfetto/trace/trusted_packet.proto) that are
-produced by the service itself.
+content of TracePacket, modulo few fields (e.g., `trusted_packed_*`,
+clock snapshots, copy of the original config) that are produced by the service
+itself.
Each data source can extend the trace with their app-specific protobuf schema.
*** aside
diff --git a/include/perfetto/protozero/BUILD.gn b/include/perfetto/protozero/BUILD.gn
index 994ff60..7afe1b9 100644
--- a/include/perfetto/protozero/BUILD.gn
+++ b/include/perfetto/protozero/BUILD.gn
@@ -28,5 +28,6 @@
"scattered_heap_buffer.h",
"scattered_stream_null_delegate.h",
"scattered_stream_writer.h",
+ "static_buffer.h",
]
}
diff --git a/include/perfetto/protozero/static_buffer.h b/include/perfetto/protozero/static_buffer.h
new file mode 100644
index 0000000..6f5924f
--- /dev/null
+++ b/include/perfetto/protozero/static_buffer.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef INCLUDE_PERFETTO_PROTOZERO_STATIC_BUFFER_H_
+#define INCLUDE_PERFETTO_PROTOZERO_STATIC_BUFFER_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "perfetto/base/export.h"
+#include "perfetto/protozero/scattered_stream_writer.h"
+
+namespace protozero {
+
+class Message;
+
+// A simple implementation of ScatteredStreamWriter::Delegate backed by a
+// fixed-size buffer. It doesn't support expansion. The caller needs to ensure
+// to never write more than the size of the buffer. Will CHECK() otherwise.
+class PERFETTO_EXPORT StaticBufferDelegate
+ : public ScatteredStreamWriter::Delegate {
+ public:
+ StaticBufferDelegate(uint8_t* buf, size_t len) : range_{buf, buf + len} {}
+ ~StaticBufferDelegate() override;
+
+ // ScatteredStreamWriter::Delegate implementation.
+ ContiguousMemoryRange GetNewBuffer() override;
+
+ ContiguousMemoryRange const range_;
+ bool get_new_buffer_called_once_ = false;
+};
+
+// Helper function to create protozero messages backed by a fixed-size buffer
+// in one line. You can write:
+// protozero::Static<protozero::MyMessage> msg(buf.data(), buf.size());
+// msg->set_stuff(...);
+// size_t bytes_encoded = msg.Finalize();
+template <typename T /* protozero::Message */>
+class StaticBuffered {
+ public:
+ StaticBuffered(void* buf, size_t len)
+ : delegate_(reinterpret_cast<uint8_t*>(buf), len), writer_(&delegate_) {
+ msg_.Reset(&writer_);
+ }
+
+ // This can't be neither copied nor moved because Message hands out pointers
+ // to itself when creating submessages.
+ StaticBuffered(const StaticBuffered&) = delete;
+ StaticBuffered& operator=(const StaticBuffered&) = delete;
+ StaticBuffered(StaticBuffered&&) = delete;
+ StaticBuffered& operator=(StaticBuffered&&) = delete;
+
+ T* get() { return &msg_; }
+ T* operator->() { return &msg_; }
+
+ // The lack of a size() method is deliberate. It's to prevent that one
+ // accidentally calls size() before Finalize().
+
+ // Returns the number of encoded bytes (<= the size passed in the ctor).
+ size_t Finalize() {
+ msg_.Finalize();
+ return static_cast<size_t>(writer_.write_ptr() - delegate_.range_.begin);
+ }
+
+ private:
+ StaticBufferDelegate delegate_;
+ ScatteredStreamWriter writer_;
+ T msg_;
+};
+
+// Helper function to create stack-based protozero messages in one line.
+// You can write:
+// protozero::StackBuffered<protozero::MyMessage, 16> msg;
+// msg->set_stuff(...);
+// size_t bytes_encoded = msg.Finalize();
+template <typename T /* protozero::Message */, size_t N>
+class StackBuffered : public StaticBuffered<T> {
+ public:
+ StackBuffered() : StaticBuffered<T>(&buf_[0], N) {}
+
+ private:
+ uint8_t buf_[N]; // Deliberately not initialized.
+};
+
+} // namespace protozero
+
+#endif // INCLUDE_PERFETTO_PROTOZERO_STATIC_BUFFER_H_
diff --git a/protos/perfetto/trace/BUILD.gn b/protos/perfetto/trace/BUILD.gn
index ca76396..bc312e0 100644
--- a/protos/perfetto/trace/BUILD.gn
+++ b/protos/perfetto/trace/BUILD.gn
@@ -39,9 +39,6 @@
"system_info.proto",
]
-# Used only for packet_stream_validator.cc (in the service).
-proto_sources_trusted = [ "trusted_packet.proto" ]
-
# Most targets should either depend on :zero (writers) / :lite (readers)
# or ":minimal_zero" / :minimal_lite (mostly for chrome).
@@ -95,17 +92,6 @@
sources = proto_sources_minimal
}
-# Used by the traced service for packet sanitization.
-perfetto_proto_library("trusted_@TYPE@") {
- proto_generators = [ "lite" ]
- deps = [
- ":minimal_@TYPE@",
- "../common:@TYPE@",
- "../config:@TYPE@",
- ]
- sources = proto_sources_trusted
-}
-
# This target is not used in the tree and is built only to guarantee that the
# autogenerated merged proto has a valid syntax.
perfetto_proto_library("merged_trace") {
diff --git a/protos/perfetto/trace/trusted_packet.proto b/protos/perfetto/trace/trusted_packet.proto
deleted file mode 100644
index 8316994..0000000
--- a/protos/perfetto/trace/trusted_packet.proto
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Use proto3 syntax as an optimization. The difference is that proto2 stores
-// unknown fields seen while decoding in an internal buffer (std::string) while
-// proto3 completely drops them. Since during validation we only need to check
-// for the presence of the trusted fields below, we can use proto3 as a way to
-// speed up this process.
-//
-// See https://developers.google.com/protocol-buffers/docs/proto3#unknowns and
-// https://android-review.googlesource.com/c/platform/external/perfetto/+/
-// 591673#17 for details.
-syntax = "proto3";
-option optimize_for = LITE_RUNTIME;
-
-import "protos/perfetto/common/trace_stats.proto";
-import "protos/perfetto/config/trace_config.proto";
-import "protos/perfetto/trace/clock_snapshot.proto";
-import "protos/perfetto/trace/system_info.proto";
-import "protos/perfetto/trace/trigger.proto";
-
-package perfetto.protos;
-
-// This proto contains trusted fields of TracePacket which may only be generated
-// by the service (as opposed to the untrusted producers). Note that the field
-// ids here must be kept in sync with TracePacket.
-// This protobuf serves two purposes:
-// 1. Security validation of packets (see packet_stream_validator.cc)
-// 2. Avoid bloating the service binary with symbols for all possible trace
-// protos. The service doesn't really care about all the protos in the trace,
-// is just passes them through.
-message TrustedPacket {
- // User id of the producer which generated this packet.
- // The oneof boilerplate here is required to tell the difference between
- // uid == 0 and uid not set (the writer uses proto2).
- oneof optional_trusted_uid { int32 trusted_uid = 3; };
-
- oneof optional_trusted_packet_sequence_id {
- uint32 trusted_packet_sequence_id = 10;
- }
-
- ClockSnapshot clock_snapshot = 6;
- uint64 timestamp = 8;
- TraceConfig trace_config = 33;
- TraceStats trace_stats = 35;
- bytes synchronization_marker = 36;
- bool previous_packet_dropped = 42;
- SystemInfo system_info = 45;
- Trigger trigger = 46;
-}
diff --git a/src/protozero/BUILD.gn b/src/protozero/BUILD.gn
index 3fcb869..23469d8 100644
--- a/src/protozero/BUILD.gn
+++ b/src/protozero/BUILD.gn
@@ -36,6 +36,7 @@
"scattered_heap_buffer.cc",
"scattered_stream_null_delegate.cc",
"scattered_stream_writer.cc",
+ "static_buffer.cc",
]
}
diff --git a/src/protozero/static_buffer.cc b/src/protozero/static_buffer.cc
new file mode 100644
index 0000000..cb4737b
--- /dev/null
+++ b/src/protozero/static_buffer.cc
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "perfetto/protozero/static_buffer.h"
+
+#include "perfetto/base/logging.h"
+
+namespace protozero {
+
+StaticBufferDelegate::~StaticBufferDelegate() = default;
+
+ContiguousMemoryRange StaticBufferDelegate::GetNewBuffer() {
+ if (get_new_buffer_called_once_) {
+ // This is the 2nd time GetNewBuffer is called. The estimate is wrong. We
+ // shouldn't try to grow the buffer after the initial call.
+ PERFETTO_FATAL("Static buffer too small");
+ }
+ get_new_buffer_called_once_ = true;
+ return range_;
+}
+
+} // namespace protozero
diff --git a/src/tracing/BUILD.gn b/src/tracing/BUILD.gn
index 844da88..7a8ef42 100644
--- a/src/tracing/BUILD.gn
+++ b/src/tracing/BUILD.gn
@@ -22,9 +22,6 @@
public_deps = [
":common",
"../../include/perfetto/ext/tracing/core",
- "../../protos/perfetto/common:lite",
- "../../protos/perfetto/trace:minimal_lite",
- "../../protos/perfetto/trace:trusted_lite",
"../../protos/perfetto/trace:zero",
"../../protos/perfetto/trace/interned_data:zero",
"../../protos/perfetto/trace/track_event:zero",
@@ -32,7 +29,8 @@
deps = [
"../../gn:default_deps",
"../../include/perfetto/tracing",
- "../../protos/perfetto/config:lite",
+ "../../protos/perfetto/common:zero",
+ "../../protos/perfetto/config:zero",
"../../protos/perfetto/trace/perfetto:zero", # For MetatraceWriter.
"../base",
"../protozero",
@@ -61,6 +59,7 @@
"core/tracing_service_impl.h",
"core/virtual_destructors.cc",
]
+ assert_no_deps = [ "//gn:protobuf_lite" ]
}
# TODO(primiano): Remove this target as soon as chromium's
@@ -252,7 +251,7 @@
deps = [
":common",
"../../include/perfetto/tracing/core",
- "../../protos/perfetto/config:lite",
+ "../../protos/perfetto/config:cpp",
"../base",
"../tracing",
]
diff --git a/src/tracing/core/trace_packet_unittest.cc b/src/tracing/core/trace_packet_unittest.cc
index 0469ae8..c8fb8f9 100644
--- a/src/tracing/core/trace_packet_unittest.cc
+++ b/src/tracing/core/trace_packet_unittest.cc
@@ -20,36 +20,11 @@
#include "protos/perfetto/trace/trace.pb.h"
#include "protos/perfetto/trace/trace_packet.pb.h"
-#include "protos/perfetto/trace/trusted_packet.pb.h"
#include "test/gtest_and_gmock.h"
namespace perfetto {
namespace {
-static_assert(static_cast<int>(TracePacket::kPacketFieldNumber) ==
- static_cast<int>(protos::Trace::kPacketFieldNumber),
- "packet field id mismatch");
-
-static_assert(
- static_cast<int>(protos::TracePacket::kTrustedUidFieldNumber) ==
- static_cast<int>(protos::TrustedPacket::kTrustedUidFieldNumber),
- "trusted_uid field id mismatch");
-
-static_assert(
- static_cast<int>(protos::TracePacket::kTraceConfigFieldNumber) ==
- static_cast<int>(protos::TrustedPacket::kTraceConfigFieldNumber),
- "trace_config field id mismatch");
-
-static_assert(
- static_cast<int>(protos::TracePacket::kTraceStatsFieldNumber) ==
- static_cast<int>(protos::TrustedPacket::kTraceStatsFieldNumber),
- "trace_stats field id mismatch");
-
-static_assert(
- static_cast<int>(protos::TracePacket::kClockSnapshotFieldNumber) ==
- static_cast<int>(protos::TrustedPacket::kClockSnapshotFieldNumber),
- "clock_snapshot field id mismatch");
-
TEST(TracePacketTest, Simple) {
protos::TracePacket proto;
proto.mutable_for_testing()->set_str("string field");
diff --git a/src/tracing/core/tracing_service_impl.cc b/src/tracing/core/tracing_service_impl.cc
index 26331d7..0e3b424 100644
--- a/src/tracing/core/tracing_service_impl.cc
+++ b/src/tracing/core/tracing_service_impl.cc
@@ -49,15 +49,20 @@
#include "perfetto/ext/tracing/core/shared_memory_abi.h"
#include "perfetto/ext/tracing/core/trace_packet.h"
#include "perfetto/ext/tracing/core/trace_writer.h"
+#include "perfetto/protozero/scattered_heap_buffer.h"
+#include "perfetto/protozero/static_buffer.h"
#include "perfetto/tracing/core/data_source_descriptor.h"
#include "perfetto/tracing/core/tracing_service_state.h"
#include "src/tracing/core/packet_stream_validator.h"
#include "src/tracing/core/shared_memory_arbiter_impl.h"
#include "src/tracing/core/trace_buffer.h"
-#include "protos/perfetto/trace/clock_snapshot.pb.h"
-#include "protos/perfetto/trace/system_info.pb.h"
-#include "protos/perfetto/trace/trusted_packet.pb.h"
+#include "protos/perfetto/common/trace_stats.pbzero.h"
+#include "protos/perfetto/config/trace_config.pbzero.h"
+#include "protos/perfetto/trace/clock_snapshot.pbzero.h"
+#include "protos/perfetto/trace/system_info.pbzero.h"
+#include "protos/perfetto/trace/trace_packet.pbzero.h"
+#include "protos/perfetto/trace/trigger.pbzero.h"
// General note: this class must assume that Producers are malicious and will
// try to crash / exploit this class. We can trust pointers because they come
@@ -132,6 +137,14 @@
return static_cast<int32_t>(acc);
}
+void SerializeAndAppendPacket(std::vector<TracePacket>* packets,
+ std::vector<uint8_t> packet) {
+ Slice slice = Slice::Allocate(packet.size());
+ memcpy(slice.own_data(), packet.data(), packet.size());
+ packets->emplace_back();
+ packets->back().AddSlice(std::move(slice));
+}
+
} // namespace
// These constants instead are defined in the header because are used by tests.
@@ -1540,21 +1553,18 @@
// truncated packets are also rejected, so the producer can't give us a
// partial packet (e.g., a truncated string) which only becomes valid when
// the trusted data is appended here.
- protos::TrustedPacket trusted_packet;
- trusted_packet.set_trusted_uid(
+ Slice slice = Slice::Allocate(32);
+ protozero::StaticBuffered<protos::pbzero::TracePacket> trusted_packet(
+ slice.own_data(), slice.size);
+ trusted_packet->set_trusted_uid(
static_cast<int32_t>(sequence_properties.producer_uid_trusted));
- trusted_packet.set_trusted_packet_sequence_id(
+ trusted_packet->set_trusted_packet_sequence_id(
tracing_session->GetPacketSequenceID(
sequence_properties.producer_id_trusted,
sequence_properties.writer_id));
if (previous_packet_dropped)
- trusted_packet.set_previous_packet_dropped(previous_packet_dropped);
- static constexpr size_t kTrustedBufSize = 16;
- Slice slice = Slice::Allocate(kTrustedBufSize);
- PERFETTO_CHECK(
- trusted_packet.SerializeToArray(slice.own_data(), kTrustedBufSize));
- slice.size = static_cast<size_t>(trusted_packet.GetCachedSize());
- PERFETTO_DCHECK(slice.size > 0 && slice.size <= kTrustedBufSize);
+ trusted_packet->set_previous_packet_dropped(previous_packet_dropped);
+ slice.size = trusted_packet.Finalize();
packet.AddSlice(std::move(slice));
// Append the packet (inclusive of the trusted uid) to |packets|.
@@ -2160,23 +2170,17 @@
// The sync marks are used to tokenize large traces efficiently.
// See description in trace_packet.proto.
if (sync_marker_packet_size_ == 0) {
- // Serialize the marker and the uid separately to guarantee that the marker
- // is serialzied at the end and is adjacent to the start of the next packet.
- int size_left = static_cast<int>(sizeof(sync_marker_packet_));
- uint8_t* dst = &sync_marker_packet_[0];
- protos::TrustedPacket packet;
- packet.set_trusted_uid(static_cast<int32_t>(uid_));
- packet.set_trusted_packet_sequence_id(kServicePacketSequenceID);
- PERFETTO_CHECK(packet.SerializeToArray(dst, size_left));
- size_left -= packet.ByteSize();
- sync_marker_packet_size_ += static_cast<size_t>(packet.ByteSize());
- dst += sync_marker_packet_size_;
+ // The marker ABI expects that the marker is written after the uid.
+ // Protozero guarantees that fields are written in the same order of the
+ // calls. The ResynchronizeTraceStreamUsingSyncMarker test verifies the ABI.
+ protozero::StaticBuffered<protos::pbzero::TracePacket> packet(
+ &sync_marker_packet_[0], sizeof(sync_marker_packet_));
+ packet->set_trusted_uid(static_cast<int32_t>(uid_));
+ packet->set_trusted_packet_sequence_id(kServicePacketSequenceID);
- packet.Clear();
- packet.set_synchronization_marker(kSyncMarker, sizeof(kSyncMarker));
- PERFETTO_CHECK(packet.SerializeToArray(dst, size_left));
- sync_marker_packet_size_ += static_cast<size_t>(packet.ByteSize());
- PERFETTO_CHECK(sync_marker_packet_size_ <= sizeof(sync_marker_packet_));
+ // Keep this last.
+ packet->set_synchronization_marker(kSyncMarker, sizeof(kSyncMarker));
+ sync_marker_packet_size_ = packet.Finalize();
}
packets->emplace_back();
packets->back().AddSlice(&sync_marker_packet_[0], sync_marker_packet_size_);
@@ -2184,33 +2188,36 @@
void TracingServiceImpl::SnapshotClocks(std::vector<TracePacket>* packets,
bool set_root_timestamp) {
- protos::TrustedPacket packet;
- protos::ClockSnapshot* clock_snapshot = packet.mutable_clock_snapshot();
+ protozero::HeapBuffered<protos::pbzero::TracePacket> packet;
+ uint64_t root_timestamp_ns = 0;
+ auto* clock_snapshot = packet->set_clock_snapshot();
#if !PERFETTO_BUILDFLAG(PERFETTO_OS_MACOSX) && \
!PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
struct {
clockid_t id;
- protos::ClockSnapshot::Clock::BuiltinClocks type;
+ protos::pbzero::ClockSnapshot::Clock::BuiltinClocks type;
struct timespec ts;
} clocks[] = {
- {CLOCK_BOOTTIME, protos::ClockSnapshot::Clock::BOOTTIME, {0, 0}},
+ {CLOCK_BOOTTIME, protos::pbzero::ClockSnapshot::Clock::BOOTTIME, {0, 0}},
{CLOCK_REALTIME_COARSE,
- protos::ClockSnapshot::Clock::REALTIME_COARSE,
+ protos::pbzero::ClockSnapshot::Clock::REALTIME_COARSE,
{0, 0}},
{CLOCK_MONOTONIC_COARSE,
- protos::ClockSnapshot::Clock::MONOTONIC_COARSE,
+ protos::pbzero::ClockSnapshot::Clock::MONOTONIC_COARSE,
{0, 0}},
- {CLOCK_REALTIME, protos::ClockSnapshot::Clock::REALTIME, {0, 0}},
- {CLOCK_MONOTONIC, protos::ClockSnapshot::Clock::MONOTONIC, {0, 0}},
+ {CLOCK_REALTIME, protos::pbzero::ClockSnapshot::Clock::REALTIME, {0, 0}},
+ {CLOCK_MONOTONIC,
+ protos::pbzero::ClockSnapshot::Clock::MONOTONIC,
+ {0, 0}},
{CLOCK_MONOTONIC_RAW,
- protos::ClockSnapshot::Clock::MONOTONIC_RAW,
+ protos::pbzero::ClockSnapshot::Clock::MONOTONIC_RAW,
{0, 0}},
{CLOCK_PROCESS_CPUTIME_ID,
- protos::ClockSnapshot::Clock::PROCESS_CPUTIME,
+ protos::pbzero::ClockSnapshot::Clock::PROCESS_CPUTIME,
{0, 0}},
{CLOCK_THREAD_CPUTIME_ID,
- protos::ClockSnapshot::Clock::THREAD_CPUTIME,
+ protos::pbzero::ClockSnapshot::Clock::THREAD_CPUTIME,
{0, 0}},
};
// First snapshot all the clocks as atomically as we can.
@@ -2220,11 +2227,11 @@
}
for (auto& clock : clocks) {
if (set_root_timestamp &&
- clock.type == protos::ClockSnapshot::Clock::BOOTTIME) {
- packet.set_timestamp(
- static_cast<uint64_t>(base::FromPosixTimespec(clock.ts).count()));
+ clock.type == protos::pbzero::ClockSnapshot::Clock::BOOTTIME) {
+ root_timestamp_ns =
+ static_cast<uint64_t>(base::FromPosixTimespec(clock.ts).count());
}
- protos::ClockSnapshot::Clock* c = clock_snapshot->add_clocks();
+ auto* c = clock_snapshot->add_clocks();
c->set_clock_id(static_cast<uint32_t>(clock.type));
c->set_timestamp(
static_cast<uint64_t>(base::FromPosixTimespec(clock.ts).count()));
@@ -2232,32 +2239,27 @@
#else // !PERFETTO_BUILDFLAG(PERFETTO_OS_MACOSX)
auto wall_time_ns = static_cast<uint64_t>(base::GetWallTimeNs().count());
if (set_root_timestamp)
- packet.set_timestamp(wall_time_ns);
- protos::ClockSnapshot::Clock* c = clock_snapshot->add_clocks();
- c->set_clock_id(protos::ClockSnapshot::Clock::MONOTONIC);
+ root_timestamp_ns = wall_time_ns;
+ auto* c = clock_snapshot->add_clocks();
+ c->set_clock_id(protos::pbzero::ClockSnapshot::Clock::MONOTONIC);
c->set_timestamp(wall_time_ns);
#endif // !PERFETTO_BUILDFLAG(PERFETTO_OS_MACOSX)
- packet.set_trusted_uid(static_cast<int32_t>(uid_));
- packet.set_trusted_packet_sequence_id(kServicePacketSequenceID);
- Slice slice = Slice::Allocate(static_cast<size_t>(packet.ByteSize()));
- PERFETTO_CHECK(packet.SerializeWithCachedSizesToArray(slice.own_data()));
- packets->emplace_back();
- packets->back().AddSlice(std::move(slice));
+ if (root_timestamp_ns)
+ packet->set_timestamp(root_timestamp_ns);
+ packet->set_trusted_uid(static_cast<int32_t>(uid_));
+ packet->set_trusted_packet_sequence_id(kServicePacketSequenceID);
+
+ SerializeAndAppendPacket(packets, packet.SerializeAsArray());
}
void TracingServiceImpl::SnapshotStats(TracingSession* tracing_session,
std::vector<TracePacket>* packets) {
- protos::TrustedPacket packet;
- packet.set_trusted_uid(static_cast<int32_t>(uid_));
- packet.set_trusted_packet_sequence_id(kServicePacketSequenceID);
-
- protos::TraceStats* trace_stats = packet.mutable_trace_stats();
- GetTraceStats(tracing_session).ToProto(trace_stats);
- Slice slice = Slice::Allocate(static_cast<size_t>(packet.ByteSize()));
- PERFETTO_CHECK(packet.SerializeWithCachedSizesToArray(slice.own_data()));
- packets->emplace_back();
- packets->back().AddSlice(std::move(slice));
+ protozero::HeapBuffered<protos::pbzero::TracePacket> packet;
+ packet->set_trusted_uid(static_cast<int32_t>(uid_));
+ packet->set_trusted_packet_sequence_id(kServicePacketSequenceID);
+ GetTraceStats(tracing_session).Serialize(packet->set_trace_stats());
+ SerializeAndAppendPacket(packets, packet.SerializeAsArray());
}
TraceStats TracingServiceImpl::GetTraceStats(TracingSession* tracing_session) {
@@ -2291,14 +2293,11 @@
if (tracing_session->did_emit_config)
return;
tracing_session->did_emit_config = true;
- protos::TrustedPacket packet;
- tracing_session->config.ToProto(packet.mutable_trace_config());
- packet.set_trusted_uid(static_cast<int32_t>(uid_));
- packet.set_trusted_packet_sequence_id(kServicePacketSequenceID);
- Slice slice = Slice::Allocate(static_cast<size_t>(packet.ByteSize()));
- PERFETTO_CHECK(packet.SerializeWithCachedSizesToArray(slice.own_data()));
- packets->emplace_back();
- packets->back().AddSlice(std::move(slice));
+ protozero::HeapBuffered<protos::pbzero::TracePacket> packet;
+ packet->set_trusted_uid(static_cast<int32_t>(uid_));
+ packet->set_trusted_packet_sequence_id(kServicePacketSequenceID);
+ tracing_session->config.Serialize(packet->set_trace_config());
+ SerializeAndAppendPacket(packets, packet.SerializeAsArray());
}
void TracingServiceImpl::MaybeEmitSystemInfo(
@@ -2307,24 +2306,21 @@
if (tracing_session->did_emit_system_info)
return;
tracing_session->did_emit_system_info = true;
- protos::TrustedPacket packet;
+ protozero::HeapBuffered<protos::pbzero::TracePacket> packet;
#if !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
- protos::SystemInfo* info = packet.mutable_system_info();
+ auto* info = packet->set_system_info();
struct utsname uname_info;
if (uname(&uname_info) == 0) {
- protos::Utsname* utsname_info = info->mutable_utsname();
+ auto* utsname_info = info->set_utsname();
utsname_info->set_sysname(uname_info.sysname);
utsname_info->set_version(uname_info.version);
utsname_info->set_machine(uname_info.machine);
utsname_info->set_release(uname_info.release);
}
#endif
- packet.set_trusted_uid(static_cast<int32_t>(uid_));
- packet.set_trusted_packet_sequence_id(kServicePacketSequenceID);
- Slice slice = Slice::Allocate(static_cast<size_t>(packet.ByteSize()));
- PERFETTO_CHECK(packet.SerializeWithCachedSizesToArray(slice.own_data()));
- packets->emplace_back();
- packets->back().AddSlice(std::move(slice));
+ packet->set_trusted_uid(static_cast<int32_t>(uid_));
+ packet->set_trusted_packet_sequence_id(kServicePacketSequenceID);
+ SerializeAndAppendPacket(packets, packet.SerializeAsArray());
}
void TracingServiceImpl::MaybeEmitReceivedTriggers(
@@ -2335,20 +2331,16 @@
for (size_t i = tracing_session->num_triggers_emitted_into_trace;
i < tracing_session->received_triggers.size(); ++i) {
const auto& info = tracing_session->received_triggers[i];
- protos::TrustedPacket packet;
-
- protos::Trigger* trigger = packet.mutable_trigger();
+ protozero::HeapBuffered<protos::pbzero::TracePacket> packet;
+ auto* trigger = packet->set_trigger();
trigger->set_trigger_name(info.trigger_name);
trigger->set_producer_name(info.producer_name);
trigger->set_trusted_producer_uid(static_cast<int32_t>(info.producer_uid));
- packet.set_timestamp(info.boot_time_ns);
- packet.set_trusted_uid(static_cast<int32_t>(uid_));
- packet.set_trusted_packet_sequence_id(kServicePacketSequenceID);
- Slice slice = Slice::Allocate(static_cast<size_t>(packet.ByteSize()));
- PERFETTO_CHECK(packet.SerializeWithCachedSizesToArray(slice.own_data()));
- packets->emplace_back();
- packets->back().AddSlice(std::move(slice));
+ packet->set_timestamp(info.boot_time_ns);
+ packet->set_trusted_uid(static_cast<int32_t>(uid_));
+ packet->set_trusted_packet_sequence_id(kServicePacketSequenceID);
+ SerializeAndAppendPacket(packets, packet.SerializeAsArray());
++tracing_session->num_triggers_emitted_into_trace;
}
}
diff --git a/src/tracing/internal/tracing_muxer_impl.cc b/src/tracing/internal/tracing_muxer_impl.cc
index 1ce6f93..a185f25 100644
--- a/src/tracing/internal/tracing_muxer_impl.cc
+++ b/src/tracing/internal/tracing_muxer_impl.cc
@@ -37,7 +37,6 @@
#include "perfetto/tracing/trace_writer_base.h"
#include "perfetto/tracing/tracing.h"
#include "perfetto/tracing/tracing_backend.h"
-#include "protos/perfetto/config/trace_config.pb.h"
#include "src/tracing/internal/in_process_tracing_backend.h"
#include "src/tracing/internal/system_tracing_backend.h"
@@ -59,12 +58,8 @@
uint64_t ComputeConfigHash(const DataSourceConfig& config) {
base::Hash hasher;
- perfetto::protos::DataSourceConfig config_proto;
- config.ToProto(&config_proto);
- std::string config_bytes;
- bool serialized = config_proto.SerializeToString(&config_bytes);
- PERFETTO_DCHECK(serialized);
- hasher.Update(&config_bytes[0], config_bytes.size());
+ std::string config_bytes = config.SerializeAsString();
+ hasher.Update(config_bytes.data(), config_bytes.size());
return hasher.digest();
}