perfetto-cmd: Save/Load state using protozero
Change-Id: I4d686fdb8b0a3290c6126afb751bc639ea537283
diff --git a/Android.bp b/Android.bp
index a41c143..5a1b59e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -628,7 +628,6 @@
],
shared_libs: [
"liblog",
- "libprotobuf-cpp-lite",
"libz",
],
generated_headers: [
@@ -4220,10 +4219,11 @@
],
tools: [
"aprotoc",
+ "perfetto_src_protozero_protoc_plugin_cppgen_plugin",
],
- cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --cpp_out=$(genDir)/external/perfetto/ $(in)",
+ cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_cppgen_plugin) --plugin_out=wrapper_namespace=gen:$(genDir)/external/perfetto/ $(in)",
out: [
- "external/perfetto/src/perfetto_cmd/perfetto_cmd_state.pb.cc",
+ "external/perfetto/src/perfetto_cmd/perfetto_cmd_state.gen.cc",
],
}
@@ -4235,10 +4235,11 @@
],
tools: [
"aprotoc",
+ "perfetto_src_protozero_protoc_plugin_cppgen_plugin",
],
- cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --cpp_out=$(genDir)/external/perfetto/ $(in)",
+ cmd: "mkdir -p $(genDir)/external/perfetto/ && $(location aprotoc) --proto_path=external/perfetto --plugin=protoc-gen-plugin=$(location perfetto_src_protozero_protoc_plugin_cppgen_plugin) --plugin_out=wrapper_namespace=gen:$(genDir)/external/perfetto/ $(in)",
out: [
- "external/perfetto/src/perfetto_cmd/perfetto_cmd_state.pb.h",
+ "external/perfetto/src/perfetto_cmd/perfetto_cmd_state.gen.h",
],
export_include_dirs: [
".",
@@ -6140,7 +6141,6 @@
],
shared_libs: [
"liblog",
- "libprotobuf-cpp-lite",
],
generated_headers: [
"perfetto_protos_perfetto_common_cpp_gen_headers",
diff --git a/BUILD b/BUILD
index 30d9281..db7385c 100644
--- a/BUILD
+++ b/BUILD
@@ -2315,7 +2315,7 @@
)
# GN target: //src/perfetto_cmd:protos
-perfetto_cc_proto_library(
+perfetto_cc_protocpp_library(
name = "src_perfetto_cmd_protos",
deps = [
":src_perfetto_cmd_protos_protos",
diff --git a/src/perfetto_cmd/BUILD.gn b/src/perfetto_cmd/BUILD.gn
index f012c47..b695f09 100644
--- a/src/perfetto_cmd/BUILD.gn
+++ b/src/perfetto_cmd/BUILD.gn
@@ -110,7 +110,7 @@
}
perfetto_proto_library("protos") {
- proto_generators = [ "lite" ]
+ proto_generators = [ "cpp" ]
sources = [
"perfetto_cmd_state.proto",
]
diff --git a/src/perfetto_cmd/perfetto_cmd.h b/src/perfetto_cmd/perfetto_cmd.h
index ea93a8c..8f1a721 100644
--- a/src/perfetto_cmd/perfetto_cmd.h
+++ b/src/perfetto_cmd/perfetto_cmd.h
@@ -33,8 +33,6 @@
#include "perfetto/ext/tracing/ipc/consumer_ipc_client.h"
#include "src/perfetto_cmd/rate_limiter.h"
-#include "src/perfetto_cmd/perfetto_cmd_state.pb.h"
-
namespace perfetto {
class PacketWriter;
diff --git a/src/perfetto_cmd/rate_limiter.cc b/src/perfetto_cmd/rate_limiter.cc
index 4b2a685..c7df19e 100644
--- a/src/perfetto_cmd/rate_limiter.cc
+++ b/src/perfetto_cmd/rate_limiter.cc
@@ -158,7 +158,7 @@
}
bool RateLimiter::ClearState() {
- PerfettoCmdState zero{};
+ gen::PerfettoCmdState zero{};
zero.set_total_bytes_uploaded(0);
zero.set_last_trace_timestamp(0);
zero.set_first_trace_timestamp(0);
@@ -168,7 +168,7 @@
return success;
}
-bool RateLimiter::LoadState(PerfettoCmdState* state) {
+bool RateLimiter::LoadState(gen::PerfettoCmdState* state) {
base::ScopedFile in_fd(base::OpenFile(GetStateFilePath(), O_RDONLY));
if (!in_fd)
@@ -177,27 +177,23 @@
ssize_t bytes = PERFETTO_EINTR(read(in_fd.get(), &buf, sizeof(buf)));
if (bytes <= 0)
return false;
- return state->ParseFromArray(&buf, static_cast<int>(bytes));
+ return state->ParseFromArray(&buf, static_cast<size_t>(bytes));
}
-bool RateLimiter::SaveState(const PerfettoCmdState& state) {
+bool RateLimiter::SaveState(const gen::PerfettoCmdState& state) {
// Rationale for 0666: the cmdline client can be executed under two
// different Unix UIDs: shell and statsd. If we run one after the
// other and the file has 0600 permissions, then the 2nd run won't
// be able to read the file and will clear it, aborting the trace.
// SELinux still prevents that anything other than the perfetto
// executable can change the guardrail file.
+ std::vector<uint8_t> buf = state.SerializeAsArray();
base::ScopedFile out_fd(
base::OpenFile(GetStateFilePath(), O_WRONLY | O_CREAT | O_TRUNC, 0666));
if (!out_fd)
return false;
- char buf[1024];
- size_t size = static_cast<size_t>(state.ByteSize());
- PERFETTO_CHECK(size < sizeof(buf));
- if (!state.SerializeToArray(&buf, static_cast<int>(size)))
- return false;
- ssize_t written = base::WriteAll(out_fd.get(), &buf, size);
- return written >= 0 && static_cast<size_t>(written) == size;
+ ssize_t written = base::WriteAll(out_fd.get(), buf.data(), buf.size());
+ return written >= 0 && static_cast<size_t>(written) == buf.size();
}
} // namespace perfetto
diff --git a/src/perfetto_cmd/rate_limiter.h b/src/perfetto_cmd/rate_limiter.h
index be76677..1f4866c 100644
--- a/src/perfetto_cmd/rate_limiter.h
+++ b/src/perfetto_cmd/rate_limiter.h
@@ -18,7 +18,7 @@
#define SRC_PERFETTO_CMD_RATE_LIMITER_H_
#include "perfetto/base/time.h"
-#include "src/perfetto_cmd/perfetto_cmd_state.pb.h"
+#include "src/perfetto_cmd/perfetto_cmd_state.gen.h"
namespace perfetto {
@@ -42,16 +42,16 @@
bool ClearState();
// virtual for testing.
- virtual bool LoadState(PerfettoCmdState* state);
+ virtual bool LoadState(gen::PerfettoCmdState* state);
// virtual for testing.
- virtual bool SaveState(const PerfettoCmdState& state);
+ virtual bool SaveState(const gen::PerfettoCmdState& state);
bool StateFileExists();
virtual std::string GetStateFilePath() const;
private:
- PerfettoCmdState state_{};
+ gen::PerfettoCmdState state_{};
};
} // namespace perfetto
diff --git a/src/perfetto_cmd/rate_limiter_unittest.cc b/src/perfetto_cmd/rate_limiter_unittest.cc
index 2837731..6e0c462 100644
--- a/src/perfetto_cmd/rate_limiter_unittest.cc
+++ b/src/perfetto_cmd/rate_limiter_unittest.cc
@@ -53,16 +53,16 @@
remove(GetStateFilePath().c_str());
}
- bool LoadStateConcrete(PerfettoCmdState* state) {
+ bool LoadStateConcrete(gen::PerfettoCmdState* state) {
return RateLimiter::LoadState(state);
}
- bool SaveStateConcrete(const PerfettoCmdState& state) {
+ bool SaveStateConcrete(const gen::PerfettoCmdState& state) {
return RateLimiter::SaveState(state);
}
- MOCK_METHOD1(LoadState, bool(PerfettoCmdState*));
- MOCK_METHOD1(SaveState, bool(const PerfettoCmdState&));
+ MOCK_METHOD1(LoadState, bool(gen::PerfettoCmdState*));
+ MOCK_METHOD1(SaveState, bool(const gen::PerfettoCmdState&));
private:
base::TempDir dir_;
@@ -78,8 +78,8 @@
TEST(RateLimiterTest, RoundTripState) {
NiceMock<MockRateLimiter> limiter;
- PerfettoCmdState input{};
- PerfettoCmdState output{};
+ gen::PerfettoCmdState input{};
+ gen::PerfettoCmdState output{};
input.set_total_bytes_uploaded(42);
ASSERT_TRUE(limiter.SaveState(input));
@@ -90,11 +90,11 @@
TEST(RateLimiterTest, LoadFromEmpty) {
NiceMock<MockRateLimiter> limiter;
- PerfettoCmdState input{};
+ gen::PerfettoCmdState input{};
input.set_total_bytes_uploaded(0);
input.set_last_trace_timestamp(0);
input.set_first_trace_timestamp(0);
- PerfettoCmdState output{};
+ gen::PerfettoCmdState output{};
ASSERT_TRUE(limiter.SaveState(input));
ASSERT_TRUE(limiter.LoadState(&output));
@@ -103,7 +103,7 @@
TEST(RateLimiterTest, LoadFromNoFileFails) {
NiceMock<MockRateLimiter> limiter;
- PerfettoCmdState output{};
+ gen::PerfettoCmdState output{};
ASSERT_FALSE(limiter.LoadState(&output));
ASSERT_EQ(output.total_bytes_uploaded(), 0u);
}
@@ -113,7 +113,7 @@
WriteGarbageToFile(limiter.GetStateFilePath().c_str());
- PerfettoCmdState output{};
+ gen::PerfettoCmdState output{};
ASSERT_FALSE(limiter.LoadState(&output));
ASSERT_EQ(output.total_bytes_uploaded(), 0u);
}
@@ -149,7 +149,7 @@
EXPECT_CALL(limiter, SaveState(_));
ASSERT_TRUE(limiter.OnTraceDone(args, true, 42u));
- PerfettoCmdState output{};
+ gen::PerfettoCmdState output{};
ASSERT_TRUE(limiter.LoadStateConcrete(&output));
ASSERT_EQ(output.first_trace_timestamp(), 41u);
ASSERT_EQ(output.last_trace_timestamp(), 41u);
@@ -171,7 +171,7 @@
EXPECT_CALL(limiter, SaveState(_));
ASSERT_TRUE(limiter.OnTraceDone(args, true, 1024 * 1024));
- PerfettoCmdState output{};
+ gen::PerfettoCmdState output{};
ASSERT_TRUE(limiter.LoadStateConcrete(&output));
EXPECT_EQ(output.total_bytes_uploaded(), 1024u * 1024u);
EXPECT_EQ(output.first_trace_timestamp(), 10000u);
@@ -182,7 +182,7 @@
StrictMock<MockRateLimiter> limiter;
RateLimiter::Args args;
- PerfettoCmdState input{};
+ gen::PerfettoCmdState input{};
input.set_first_trace_timestamp(10000);
input.set_last_trace_timestamp(10000 + 60 * 10);
input.set_total_bytes_uploaded(1024 * 1024 * 2);
@@ -198,7 +198,7 @@
EXPECT_CALL(limiter, SaveState(_));
ASSERT_TRUE(limiter.OnTraceDone(args, true, 1024 * 1024));
- PerfettoCmdState output{};
+ gen::PerfettoCmdState output{};
ASSERT_TRUE(limiter.LoadStateConcrete(&output));
EXPECT_EQ(output.total_bytes_uploaded(), 1024u * 1024u * 3);
EXPECT_EQ(output.first_trace_timestamp(), input.first_trace_timestamp());
@@ -219,7 +219,7 @@
EXPECT_CALL(limiter, SaveState(_));
ASSERT_FALSE(limiter.ShouldTrace(args));
- PerfettoCmdState output{};
+ gen::PerfettoCmdState output{};
ASSERT_TRUE(limiter.LoadStateConcrete(&output));
EXPECT_EQ(output.total_bytes_uploaded(), 0u);
EXPECT_EQ(output.first_trace_timestamp(), 0u);
@@ -230,7 +230,7 @@
StrictMock<MockRateLimiter> limiter;
RateLimiter::Args args;
- PerfettoCmdState input{};
+ gen::PerfettoCmdState input{};
input.set_first_trace_timestamp(100);
input.set_last_trace_timestamp(100);
ASSERT_TRUE(limiter.SaveStateConcrete(input));
@@ -243,7 +243,7 @@
EXPECT_CALL(limiter, SaveState(_));
ASSERT_FALSE(limiter.ShouldTrace(args));
- PerfettoCmdState output{};
+ gen::PerfettoCmdState output{};
ASSERT_TRUE(limiter.LoadStateConcrete(&output));
EXPECT_EQ(output.total_bytes_uploaded(), 0u);
EXPECT_EQ(output.first_trace_timestamp(), 0u);
@@ -254,7 +254,7 @@
StrictMock<MockRateLimiter> limiter;
RateLimiter::Args args;
- PerfettoCmdState input{};
+ gen::PerfettoCmdState input{};
input.set_first_trace_timestamp(10000);
input.set_last_trace_timestamp(10000);
ASSERT_TRUE(limiter.SaveStateConcrete(input));
@@ -271,7 +271,7 @@
StrictMock<MockRateLimiter> limiter;
RateLimiter::Args args;
- PerfettoCmdState input{};
+ gen::PerfettoCmdState input{};
input.set_total_bytes_uploaded(10 * 1024 * 1024 + 1);
ASSERT_TRUE(limiter.SaveStateConcrete(input));
@@ -288,7 +288,7 @@
StrictMock<MockRateLimiter> limiter;
RateLimiter::Args args;
- PerfettoCmdState input{};
+ gen::PerfettoCmdState input{};
input.set_total_bytes_uploaded(10 * 1024 * 1024 + 1);
ASSERT_TRUE(limiter.SaveStateConcrete(input));
@@ -305,7 +305,7 @@
StrictMock<MockRateLimiter> limiter;
RateLimiter::Args args;
- PerfettoCmdState input{};
+ gen::PerfettoCmdState input{};
input.set_first_trace_timestamp(1);
input.set_last_trace_timestamp(1);
input.set_total_bytes_uploaded(10 * 1024 * 1024 + 1);
@@ -320,7 +320,7 @@
EXPECT_CALL(limiter, SaveState(_));
ASSERT_TRUE(limiter.OnTraceDone(args, true, 1024 * 1024));
- PerfettoCmdState output{};
+ gen::PerfettoCmdState output{};
ASSERT_TRUE(limiter.LoadStateConcrete(&output));
EXPECT_EQ(output.total_bytes_uploaded(), 1024u * 1024u);
EXPECT_EQ(output.first_trace_timestamp(),
diff --git a/src/protozero/test/example_proto/test_messages.descriptor.h b/src/protozero/test/example_proto/test_messages.descriptor.h
index 9d0affc..6e0ff15 100644
--- a/src/protozero/test/example_proto/test_messages.descriptor.h
+++ b/src/protozero/test/example_proto/test_messages.descriptor.h
@@ -209,19 +209,19 @@
0x72, 0x42, 0x61, 0x7a, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, 0x72, 0x42,
0x61, 0x7a, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x62, 0x61,
0x72, 0x42, 0x61, 0x7a, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x6f, 0x6f, 0x4d,
- 0x6f, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6d, 0x6f,
+ 0x6f, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4d, 0x6f,
0x6f, 0x4d, 0x6f, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x45,
0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08,
- 0x52, 0x0a, 0x75, 0x52, 0x4c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72,
+ 0x52, 0x0a, 0x55, 0x52, 0x4c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72,
0x12, 0x12, 0x0a, 0x04, 0x58, 0x4d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01,
- 0x28, 0x08, 0x52, 0x04, 0x78, 0x4d, 0x61, 0x70, 0x12, 0x21, 0x0a, 0x0d,
+ 0x28, 0x08, 0x52, 0x04, 0x58, 0x4d, 0x61, 0x70, 0x12, 0x21, 0x0a, 0x0d,
0x55, 0x72, 0x4c, 0x45, 0x5f, 0x6e, 0x63, 0x6f, 0x5f, 0x5f, 0x64, 0x65,
- 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x72, 0x4c,
+ 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x55, 0x72, 0x4c,
0x45, 0x4e, 0x63, 0x6f, 0x44, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x09, 0x5f,
0x5f, 0x62, 0x69, 0x67, 0x42, 0x61, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01,
- 0x28, 0x08, 0x52, 0x07, 0x62, 0x69, 0x67, 0x42, 0x61, 0x6e, 0x67, 0x12,
+ 0x28, 0x08, 0x52, 0x07, 0x42, 0x69, 0x67, 0x42, 0x61, 0x6e, 0x67, 0x12,
0x0e, 0x0a, 0x02, 0x55, 0x32, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52,
- 0x02, 0x75, 0x32, 0x12, 0x1a, 0x0a, 0x09, 0x62, 0x61, 0x6e, 0x67, 0x42,
+ 0x02, 0x55, 0x32, 0x12, 0x1a, 0x0a, 0x09, 0x62, 0x61, 0x6e, 0x67, 0x42,
0x69, 0x67, 0x5f, 0x5f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
0x62, 0x61, 0x6e, 0x67, 0x42, 0x69, 0x67, 0x22, 0x8f, 0x01, 0x0a, 0x14,
0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74,