trace_processor: Migrate ftrace_module to the new base class
Bug: 141459049
Change-Id: Ib30d867edec5c1cc7a730c333739f2511f4980a6
diff --git a/Android.bp b/Android.bp
index 0cfcb0d..59a000f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -4783,6 +4783,8 @@
"src/trace_processor/gzip_trace_parser.cc",
"src/trace_processor/heap_profile_tracker.cc",
"src/trace_processor/importers/ftrace/ftrace_descriptors.cc",
+ "src/trace_processor/importers/ftrace/ftrace_module.cc",
+ "src/trace_processor/importers/ftrace/ftrace_module_impl.cc",
"src/trace_processor/importers/ftrace/ftrace_parser.cc",
"src/trace_processor/importers/ftrace/ftrace_tokenizer.cc",
"src/trace_processor/importers/ftrace/sched_event_tracker.cc",
diff --git a/BUILD b/BUILD
index 2b7853b..d6d86a6 100644
--- a/BUILD
+++ b/BUILD
@@ -794,7 +794,9 @@
"src/trace_processor/heap_profile_tracker.h",
"src/trace_processor/importers/ftrace/ftrace_descriptors.cc",
"src/trace_processor/importers/ftrace/ftrace_descriptors.h",
+ "src/trace_processor/importers/ftrace/ftrace_module.cc",
"src/trace_processor/importers/ftrace/ftrace_module.h",
+ "src/trace_processor/importers/ftrace/ftrace_module_impl.cc",
"src/trace_processor/importers/ftrace/ftrace_parser.cc",
"src/trace_processor/importers/ftrace/ftrace_parser.h",
"src/trace_processor/importers/ftrace/ftrace_tokenizer.cc",
diff --git a/src/trace_processor/BUILD.gn b/src/trace_processor/BUILD.gn
index b5fd0c3..ec64322 100644
--- a/src/trace_processor/BUILD.gn
+++ b/src/trace_processor/BUILD.gn
@@ -77,6 +77,7 @@
"heap_profile_tracker.cc",
"heap_profile_tracker.h",
"importers/ftrace/ftrace_descriptors.h",
+ "importers/ftrace/ftrace_module.cc",
"importers/ftrace/ftrace_module.h",
"importers/ftrace/ftrace_parser.h",
"importers/ftrace/ftrace_tokenizer.h",
@@ -178,6 +179,7 @@
if (enable_perfetto_trace_processor_ftrace) {
sources += [
"importers/ftrace/ftrace_descriptors.cc",
+ "importers/ftrace/ftrace_module_impl.cc",
"importers/ftrace/ftrace_parser.cc",
"importers/ftrace/ftrace_tokenizer.cc",
"importers/ftrace/sched_event_tracker.cc",
diff --git a/src/trace_processor/importers/ftrace/ftrace_module.cc b/src/trace_processor/importers/ftrace/ftrace_module.cc
new file mode 100644
index 0000000..840f330
--- /dev/null
+++ b/src/trace_processor/importers/ftrace/ftrace_module.cc
@@ -0,0 +1,26 @@
+/*
+ * 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 "src/trace_processor/importers/ftrace/ftrace_module.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+void FtraceModule::ParseFtracePacket(uint32_t /*cpu*/,
+ const TimestampedTracePiece&) {}
+
+} // namespace trace_processor
+} // namespace perfetto
diff --git a/src/trace_processor/importers/ftrace/ftrace_module.h b/src/trace_processor/importers/ftrace/ftrace_module.h
index fd1ace0..c8ac893 100644
--- a/src/trace_processor/importers/ftrace/ftrace_module.h
+++ b/src/trace_processor/importers/ftrace/ftrace_module.h
@@ -29,44 +29,29 @@
namespace perfetto {
namespace trace_processor {
-class FtraceModule
- : public ProtoImporterModuleBase<PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)> {
+class FtraceModule : public NewProtoImporterModule {
public:
- explicit FtraceModule(TraceProcessorContext* context)
- : ProtoImporterModuleBase(context),
- tokenizer_(context),
- parser_(context) {}
+ virtual void ParseFtracePacket(uint32_t cpu,
+ const TimestampedTracePiece& ttp);
+};
+
+class FtraceModuleImpl : public FtraceModule {
+ public:
+ FtraceModuleImpl(TraceProcessorContext* context);
ModuleResult TokenizePacket(
const protos::pbzero::TracePacket::Decoder& decoder,
TraceBlobView* packet,
- int64_t /*packet_timestamp*/,
- PacketSequenceState* /*state*/) {
- if (decoder.has_ftrace_events()) {
- auto ftrace_field = decoder.ftrace_events();
- const size_t fld_off = packet->offset_of(ftrace_field.data);
- tokenizer_.TokenizeFtraceBundle(
- packet->slice(fld_off, ftrace_field.size));
- return ModuleResult::Handled();
- }
- return ModuleResult::Ignored();
- }
+ int64_t packet_timestamp,
+ PacketSequenceState* state,
+ uint32_t field_id) override;
- ModuleResult ParsePacket(const protos::pbzero::TracePacket::Decoder& decoder,
- const TimestampedTracePiece&) {
- // TODO(eseckler): implement.
- if (decoder.has_ftrace_stats()) {
- parser_.ParseFtraceStats(decoder.ftrace_stats());
- return ModuleResult::Handled();
- }
+ void ParsePacket(const protos::pbzero::TracePacket::Decoder& decoder,
+ const TimestampedTracePiece&,
+ uint32_t field_id) override;
- return ModuleResult::Ignored();
- }
-
- ModuleResult ParseFtracePacket(uint32_t cpu,
- const TimestampedTracePiece& ttp) {
- return parser_.ParseFtraceEvent(cpu, ttp);
- }
+ void ParseFtracePacket(uint32_t cpu,
+ const TimestampedTracePiece& ttp) override;
private:
FtraceTokenizer tokenizer_;
diff --git a/src/trace_processor/importers/ftrace/ftrace_module_impl.cc b/src/trace_processor/importers/ftrace/ftrace_module_impl.cc
new file mode 100644
index 0000000..2347196
--- /dev/null
+++ b/src/trace_processor/importers/ftrace/ftrace_module_impl.cc
@@ -0,0 +1,70 @@
+/*
+ * 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/base/build_config.h"
+#include "src/trace_processor/importers/ftrace/ftrace_module.h"
+#include "src/trace_processor/importers/ftrace/ftrace_parser.h"
+#include "src/trace_processor/importers/ftrace/ftrace_tokenizer.h"
+#include "src/trace_processor/timestamped_trace_piece.h"
+#include "src/trace_processor/trace_blob_view.h"
+
+#include "protos/perfetto/trace/trace_packet.pbzero.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+using perfetto::protos::pbzero::TracePacket;
+
+FtraceModuleImpl::FtraceModuleImpl(TraceProcessorContext* context)
+ : tokenizer_(context), parser_(context) {
+ RegisterForField(TracePacket::kFtraceEventsFieldNumber, context);
+ RegisterForField(TracePacket::kFtraceStatsFieldNumber, context);
+}
+
+ModuleResult FtraceModuleImpl::TokenizePacket(
+ const protos::pbzero::TracePacket::Decoder& decoder,
+ TraceBlobView* packet,
+ int64_t /*packet_timestamp*/,
+ PacketSequenceState* /*state*/,
+ uint32_t field_id) {
+ if (field_id == TracePacket::kFtraceEventsFieldNumber) {
+ auto ftrace_field = decoder.ftrace_events();
+ const size_t fld_off = packet->offset_of(ftrace_field.data);
+ tokenizer_.TokenizeFtraceBundle(packet->slice(fld_off, ftrace_field.size));
+ return ModuleResult::Handled();
+ }
+ return ModuleResult::Ignored();
+}
+
+void FtraceModuleImpl::ParsePacket(
+ const protos::pbzero::TracePacket::Decoder& decoder,
+ const TimestampedTracePiece&,
+ uint32_t field_id) {
+ if (field_id == TracePacket::kFtraceStatsFieldNumber) {
+ parser_.ParseFtraceStats(decoder.ftrace_stats());
+ }
+}
+
+void FtraceModuleImpl::ParseFtracePacket(uint32_t cpu,
+ const TimestampedTracePiece& ttp) {
+ util::Status res = parser_.ParseFtraceEvent(cpu, ttp);
+ if (!res.ok()) {
+ PERFETTO_ELOG("%s", res.message().c_str());
+ }
+}
+
+} // namespace trace_processor
+} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/proto_trace_parser.cc b/src/trace_processor/importers/proto/proto_trace_parser.cc
index 3fe1ee8..089c28b 100644
--- a/src/trace_processor/importers/proto/proto_trace_parser.cc
+++ b/src/trace_processor/importers/proto/proto_trace_parser.cc
@@ -199,9 +199,6 @@
TimestampedTracePiece ttp,
const protos::pbzero::TracePacket::Decoder& packet) {
// TODO(eseckler): Propagate statuses from modules.
- if (!context_->ftrace_module->ParsePacket(packet, ttp).ignored())
- return;
-
auto& modules = context_->modules_by_field;
for (uint32_t field_id = 1; field_id < modules.size(); ++field_id) {
if (modules[field_id] && packet.Get(field_id).valid()) {
@@ -250,13 +247,8 @@
int64_t /*ts*/,
TimestampedTracePiece ttp) {
PERFETTO_DCHECK(ttp.json_value == nullptr);
-
- ModuleResult res = context_->ftrace_module->ParseFtracePacket(cpu, ttp);
- PERFETTO_DCHECK(!res.ignored());
- // TODO(eseckler): Propagate status.
- if (!res.ok()) {
- PERFETTO_ELOG("%s", res.message().c_str());
- }
+ PERFETTO_DCHECK(context_->ftrace_module);
+ context_->ftrace_module->ParseFtracePacket(cpu, ttp);
// TODO(lalitm): maybe move this to the flush method in the trace processor
// once we have it. This may reduce performance in the ArgsTracker though so
diff --git a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
index 9ed1ea4..c394367 100644
--- a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
+++ b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
@@ -261,8 +261,9 @@
#if PERFETTO_BUILDFLAG(PERFETTO_TP_GRAPHICS)
context_.vulkan_memory_tracker.reset(new VulkanMemoryTracker(&context_));
#endif // PERFETTO_BUILDFLAG(PERFETTO_TP_GRAPHICS)
- context_.ftrace_module.reset(
- new ProtoImporterModule<FtraceModule>(&context_));
+ context_.modules.emplace_back(new FtraceModuleImpl(&context_));
+ context_.ftrace_module =
+ static_cast<FtraceModule*>(context_.modules.back().get());
context_.modules.emplace_back(new HeapGraphModule(&context_));
context_.modules.emplace_back(new AndroidProbesModule(&context_));
diff --git a/src/trace_processor/importers/proto/proto_trace_tokenizer.cc b/src/trace_processor/importers/proto/proto_trace_tokenizer.cc
index e6ba1a0..97d7689 100644
--- a/src/trace_processor/importers/proto/proto_trace_tokenizer.cc
+++ b/src/trace_processor/importers/proto/proto_trace_tokenizer.cc
@@ -282,17 +282,11 @@
ParseInternedData(decoder, packet.slice(offset, field.size));
}
- ModuleResult res = ModuleResult::Ignored();
- res = context_->ftrace_module->TokenizePacket(decoder, &packet, timestamp,
- state);
- if (!res.ignored())
- return res.ToStatus();
-
auto& modules = context_->modules_by_field;
for (uint32_t field_id = 1; field_id < modules.size(); ++field_id) {
if (modules[field_id] && decoder.Get(field_id).valid()) {
- res = modules[field_id]->TokenizePacket(decoder, &packet, timestamp,
- state, field_id);
+ ModuleResult res = modules[field_id]->TokenizePacket(
+ decoder, &packet, timestamp, state, field_id);
if (!res.ignored())
return res.ToStatus();
}
diff --git a/src/trace_processor/trace_processor_context.h b/src/trace_processor/trace_processor_context.h
index 36daa12..3884d33 100644
--- a/src/trace_processor/trace_processor_context.h
+++ b/src/trace_processor/trace_processor_context.h
@@ -70,12 +70,11 @@
std::unique_ptr<VulkanMemoryTracker> vulkan_memory_tracker;
std::unique_ptr<BinderTracker> binder_tracker;
- std::unique_ptr<ProtoImporterModule<FtraceModule>> ftrace_module;
-
// The module at the index N is registered to handle field id N in
// TracePacket.
std::vector<NewProtoImporterModule*> modules_by_field;
std::vector<std::unique_ptr<NewProtoImporterModule>> modules;
+ FtraceModule* ftrace_module;
};
} // namespace trace_processor
diff --git a/src/trace_processor/trace_processor_storage_impl.cc b/src/trace_processor/trace_processor_storage_impl.cc
index 85434a6..2ab4afa 100644
--- a/src/trace_processor/trace_processor_storage_impl.cc
+++ b/src/trace_processor/trace_processor_storage_impl.cc
@@ -68,8 +68,16 @@
#if PERFETTO_BUILDFLAG(PERFETTO_TP_GRAPHICS)
context_.vulkan_memory_tracker.reset(new VulkanMemoryTracker(&context_));
#endif // PERFETTO_BUILDFLAG(PERFETTO_TP_GRAPHICS)
- context_.ftrace_module.reset(
- new ProtoImporterModule<FtraceModule>(&context_));
+
+#if PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
+ context_.modules.emplace_back(new FtraceModuleImpl(&context_));
+#else
+ context_.modules.emplace_back(new FtraceModule());
+#endif // PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
+ // Ftrace module is special, because it has one extra method for parsing
+ // ftrace packets. So we need to store a pointer to it separately.
+ context_.ftrace_module =
+ static_cast<FtraceModule*>(context_.modules.back().get());
#if PERFETTO_BUILDFLAG(PERFETTO_TP_HEAP_GRAPHS)
context_.modules.emplace_back(new HeapGraphModule(&context_));