Ensure 1:1 association between TimestampedEvent::Type and TraceParser
This will allow us to parse multiple trace types in one session.
Change-Id: Icf463b7740988f01ae1b31d5f3a47846e6502ba9
diff --git a/Android.bp b/Android.bp
index 438f7d6..e17b004 100644
--- a/Android.bp
+++ b/Android.bp
@@ -12173,7 +12173,7 @@
filegroup {
name: "perfetto_src_trace_processor_importers_json_full",
srcs: [
- "src/trace_processor/importers/json/json_trace_parser.cc",
+ "src/trace_processor/importers/json/json_trace_parser_impl.cc",
"src/trace_processor/importers/json/json_trace_tokenizer.cc",
],
}
@@ -12361,7 +12361,7 @@
"src/trace_processor/importers/proto/profile_module.cc",
"src/trace_processor/importers/proto/profile_packet_sequence_state.cc",
"src/trace_processor/importers/proto/profile_packet_utils.cc",
- "src/trace_processor/importers/proto/proto_trace_parser.cc",
+ "src/trace_processor/importers/proto/proto_trace_parser_impl.cc",
"src/trace_processor/importers/proto/proto_trace_reader.cc",
"src/trace_processor/importers/proto/proto_trace_tokenizer.cc",
"src/trace_processor/importers/proto/stack_profile_sequence_state.cc",
@@ -12395,7 +12395,7 @@
"src/trace_processor/importers/proto/network_trace_module_unittest.cc",
"src/trace_processor/importers/proto/perf_sample_tracker_unittest.cc",
"src/trace_processor/importers/proto/profile_packet_sequence_state_unittest.cc",
- "src/trace_processor/importers/proto/proto_trace_parser_unittest.cc",
+ "src/trace_processor/importers/proto/proto_trace_parser_impl_unittest.cc",
"src/trace_processor/importers/proto/string_encoding_utils_unittests.cc",
],
}
diff --git a/BUILD b/BUILD
index 2f53ea5..8d39cbc 100644
--- a/BUILD
+++ b/BUILD
@@ -1657,8 +1657,8 @@
perfetto_filegroup(
name = "src_trace_processor_importers_json_full",
srcs = [
- "src/trace_processor/importers/json/json_trace_parser.cc",
- "src/trace_processor/importers/json/json_trace_parser.h",
+ "src/trace_processor/importers/json/json_trace_parser_impl.cc",
+ "src/trace_processor/importers/json/json_trace_parser_impl.h",
"src/trace_processor/importers/json/json_trace_tokenizer.cc",
"src/trace_processor/importers/json/json_trace_tokenizer.h",
],
@@ -1889,8 +1889,8 @@
"src/trace_processor/importers/proto/profile_packet_utils.cc",
"src/trace_processor/importers/proto/profile_packet_utils.h",
"src/trace_processor/importers/proto/proto_incremental_state.h",
- "src/trace_processor/importers/proto/proto_trace_parser.cc",
- "src/trace_processor/importers/proto/proto_trace_parser.h",
+ "src/trace_processor/importers/proto/proto_trace_parser_impl.cc",
+ "src/trace_processor/importers/proto/proto_trace_parser_impl.h",
"src/trace_processor/importers/proto/proto_trace_reader.cc",
"src/trace_processor/importers/proto/proto_trace_reader.h",
"src/trace_processor/importers/proto/proto_trace_tokenizer.cc",
diff --git a/src/trace_processor/forwarding_trace_parser.cc b/src/trace_processor/forwarding_trace_parser.cc
index 2468596..466ee96 100644
--- a/src/trace_processor/forwarding_trace_parser.cc
+++ b/src/trace_processor/forwarding_trace_parser.cc
@@ -19,7 +19,6 @@
#include "perfetto/base/logging.h"
#include "perfetto/ext/base/string_utils.h"
#include "src/trace_processor/importers/common/process_tracker.h"
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
#include "src/trace_processor/importers/proto/proto_trace_reader.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/types/trace_processor_context.h"
@@ -82,8 +81,7 @@
// JSON traces have no guarantees about the order of events in them.
context_->sorter.reset(
- new TraceSorter(context_, std::move(context_->json_trace_parser),
- TraceSorter::SortingMode::kFullSort));
+ new TraceSorter(context_, TraceSorter::SortingMode::kFullSort));
break;
}
return base::ErrStatus("JSON support is disabled");
@@ -92,10 +90,7 @@
PERFETTO_DLOG("Proto trace detected");
auto sorting_mode = ConvertSortingMode(context_->config.sorting_mode);
reader_.reset(new ProtoTraceReader(context_));
- context_->sorter.reset(new TraceSorter(
- context_,
- std::unique_ptr<TraceParser>(new ProtoTraceParser(context_)),
- sorting_mode));
+ context_->sorter.reset(new TraceSorter(context_, sorting_mode));
context_->process_tracker->SetPidZeroIsUpidZeroIdleProcess();
break;
}
@@ -109,14 +104,13 @@
}
case kFuchsiaTraceType: {
PERFETTO_DLOG("Fuchsia trace detected");
- if (context_->fuchsia_trace_parser &&
+ if (context_->fuchsia_record_parser &&
context_->fuchsia_trace_tokenizer) {
reader_ = std::move(context_->fuchsia_trace_tokenizer);
// Fuschia traces can have massively out of order events.
- context_->sorter.reset(new TraceSorter(
- context_, std::move(context_->fuchsia_trace_parser),
- TraceSorter::SortingMode::kFullSort));
+ context_->sorter.reset(
+ new TraceSorter(context_, TraceSorter::SortingMode::kFullSort));
break;
}
return base::ErrStatus("Fuchsia support is disabled");
@@ -151,11 +145,11 @@
kNoZlibErr);
case kPerfDataTraceType:
PERFETTO_DLOG("perf data detected");
- if (context_->perf_data_trace_tokenizer && context_->perf_data_parser) {
+ if (context_->perf_data_trace_tokenizer &&
+ context_->perf_record_parser) {
reader_ = std::move(context_->perf_data_trace_tokenizer);
context_->sorter.reset(
- new TraceSorter(context_, std::move(context_->perf_data_parser),
- TraceSorter::SortingMode::kDefault));
+ new TraceSorter(context_, TraceSorter::SortingMode::kDefault));
break;
}
return base::ErrStatus("perf.data parsing support is disabled.");
diff --git a/src/trace_processor/importers/common/trace_parser.cc b/src/trace_processor/importers/common/trace_parser.cc
index 608aca3..c79f29e 100644
--- a/src/trace_processor/importers/common/trace_parser.cc
+++ b/src/trace_processor/importers/common/trace_parser.cc
@@ -16,44 +16,13 @@
#include "src/trace_processor/importers/common/trace_parser.h"
-#include "perfetto/trace_processor/trace_blob_view.h"
-#include "src/trace_processor/importers/common/parser_types.h"
-#include "src/trace_processor/importers/fuchsia/fuchsia_record.h"
-#include "src/trace_processor/importers/systrace/systrace_line.h"
-
namespace perfetto {
namespace trace_processor {
-void TraceParser::ParseTraceBlobView(int64_t, TraceBlobView) {
- PERFETTO_FATAL("Wrong parser type");
-}
-void TraceParser::ParseTracePacket(int64_t, TracePacketData) {
- PERFETTO_FATAL("Wrong parser type");
-}
-void TraceParser::ParseJsonPacket(int64_t, std::string) {
- PERFETTO_FATAL("Wrong parser type");
-}
-void TraceParser::ParseFuchsiaRecord(int64_t, FuchsiaRecord) {
- PERFETTO_FATAL("Wrong parser type");
-}
-void TraceParser::ParseTrackEvent(int64_t, TrackEventData) {
- PERFETTO_FATAL("Wrong parser type");
-}
-void TraceParser::ParseSystraceLine(int64_t, SystraceLine) {
- PERFETTO_FATAL("Wrong parser type");
-}
-void TraceParser::ParseFtraceEvent(uint32_t, int64_t, TracePacketData) {
- PERFETTO_FATAL("Wrong parser type");
-}
-void TraceParser::ParseInlineSchedSwitch(uint32_t, int64_t, InlineSchedSwitch) {
- PERFETTO_FATAL("Wrong parser type");
-}
-void TraceParser::ParseInlineSchedWaking(uint32_t, int64_t, InlineSchedWaking) {
- PERFETTO_FATAL("Wrong parser type");
-}
-void TraceParser::ParseEtwEvent(uint32_t, int64_t, TracePacketData) {
- PERFETTO_FATAL("Wrong parser type");
-}
+ProtoTraceParser::~ProtoTraceParser() = default;
+JsonTraceParser::~JsonTraceParser() = default;
+FuchsiaRecordParser::~FuchsiaRecordParser() = default;
+PerfRecordParser::~PerfRecordParser() = default;
} // namespace trace_processor
} // namespace perfetto
diff --git a/src/trace_processor/importers/common/trace_parser.h b/src/trace_processor/importers/common/trace_parser.h
index 9c7098f..bf90c95 100644
--- a/src/trace_processor/importers/common/trace_parser.h
+++ b/src/trace_processor/importers/common/trace_parser.h
@@ -32,21 +32,34 @@
struct TracePacketData;
struct TrackEventData;
-class TraceParser {
+class ProtoTraceParser {
public:
- virtual ~TraceParser();
+ virtual ~ProtoTraceParser();
+ virtual void ParseTracePacket(int64_t, TracePacketData) = 0;
+ virtual void ParseTrackEvent(int64_t, TrackEventData) = 0;
+ virtual void ParseEtwEvent(uint32_t, int64_t, TracePacketData) = 0;
+ virtual void ParseFtraceEvent(uint32_t, int64_t, TracePacketData) = 0;
+ virtual void ParseInlineSchedSwitch(uint32_t, int64_t, InlineSchedSwitch) = 0;
+ virtual void ParseInlineSchedWaking(uint32_t, int64_t, InlineSchedWaking) = 0;
+};
- virtual void ParseTraceBlobView(int64_t, TraceBlobView);
- virtual void ParseTracePacket(int64_t, TracePacketData);
- virtual void ParseJsonPacket(int64_t, std::string);
- virtual void ParseFuchsiaRecord(int64_t, FuchsiaRecord);
- virtual void ParseTrackEvent(int64_t, TrackEventData);
- virtual void ParseSystraceLine(int64_t, SystraceLine);
+class JsonTraceParser {
+ public:
+ virtual ~JsonTraceParser();
+ virtual void ParseJsonPacket(int64_t, std::string) = 0;
+ virtual void ParseSystraceLine(int64_t, SystraceLine) = 0;
+};
- virtual void ParseEtwEvent(uint32_t, int64_t, TracePacketData);
- virtual void ParseFtraceEvent(uint32_t, int64_t, TracePacketData);
- virtual void ParseInlineSchedSwitch(uint32_t, int64_t, InlineSchedSwitch);
- virtual void ParseInlineSchedWaking(uint32_t, int64_t, InlineSchedWaking);
+class FuchsiaRecordParser {
+ public:
+ virtual ~FuchsiaRecordParser();
+ virtual void ParseFuchsiaRecord(int64_t, FuchsiaRecord) = 0;
+};
+
+class PerfRecordParser {
+ public:
+ virtual ~PerfRecordParser();
+ virtual void ParsePerfRecord(int64_t, TraceBlobView) = 0;
};
} // namespace trace_processor
diff --git a/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc b/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc
index 9f90bed..ca02bdc 100644
--- a/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc
+++ b/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#include "src/trace_processor/importers/common/trace_parser.h"
#include "src/trace_processor/importers/fuchsia/fuchsia_trace_parser.h"
#include "src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.h"
@@ -34,7 +35,7 @@
#include "src/trace_processor/importers/ftrace/ftrace_sched_event_tracker.h"
#include "src/trace_processor/importers/proto/additional_modules.h"
#include "src/trace_processor/importers/proto/default_modules.h"
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/proto_trace_parser_impl.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/storage/metadata.h"
#include "src/trace_processor/storage/trace_storage.h"
@@ -253,8 +254,10 @@
context_.clock_tracker.reset(new ClockTracker(&context_));
clock_ = context_.clock_tracker.get();
context_.flow_tracker.reset(new FlowTracker(&context_));
- context_.sorter.reset(new TraceSorter(&context_, CreateParser(),
- TraceSorter::SortingMode::kFullSort));
+ context_.fuchsia_record_parser.reset(new FuchsiaTraceParser(&context_));
+ context_.proto_trace_parser.reset(new ProtoTraceParserImpl(&context_));
+ context_.sorter.reset(
+ new TraceSorter(&context_, TraceSorter::SortingMode::kFullSort));
context_.descriptor_pool_.reset(new DescriptorPool());
RegisterDefaultModules(&context_);
@@ -285,9 +288,6 @@
protected:
std::vector<uint64_t> trace_bytes_;
- std::unique_ptr<TraceParser> CreateParser() {
- return std::unique_ptr<TraceParser>(new FuchsiaTraceParser(&context_));
- }
TraceProcessorContext context_;
MockEventTracker* event_;
diff --git a/src/trace_processor/importers/fuchsia/fuchsia_trace_parser.cc b/src/trace_processor/importers/fuchsia/fuchsia_trace_parser.cc
index 0b18a77..c74f2e5 100644
--- a/src/trace_processor/importers/fuchsia/fuchsia_trace_parser.cc
+++ b/src/trace_processor/importers/fuchsia/fuchsia_trace_parser.cc
@@ -23,7 +23,6 @@
#include "src/trace_processor/importers/common/slice_tracker.h"
#include "src/trace_processor/importers/common/track_tracker.h"
#include "src/trace_processor/importers/fuchsia/fuchsia_trace_utils.h"
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
namespace perfetto {
namespace trace_processor {
@@ -60,18 +59,10 @@
} // namespace
FuchsiaTraceParser::FuchsiaTraceParser(TraceProcessorContext* context)
- : context_(context), proto_parser_(new ProtoTraceParser(context_)) {}
+ : context_(context) {}
FuchsiaTraceParser::~FuchsiaTraceParser() = default;
-void FuchsiaTraceParser::ParseTrackEvent(int64_t ts, TrackEventData data) {
- proto_parser_->ParseTrackEvent(ts, std::move(data));
-}
-
-void FuchsiaTraceParser::ParseTracePacket(int64_t ts, TracePacketData data) {
- proto_parser_->ParseTracePacket(ts, std::move(data));
-}
-
std::optional<std::vector<FuchsiaTraceParser::Arg>>
FuchsiaTraceParser::ParseArgs(
fuchsia_trace_utils::RecordCursor& cursor,
diff --git a/src/trace_processor/importers/fuchsia/fuchsia_trace_parser.h b/src/trace_processor/importers/fuchsia/fuchsia_trace_parser.h
index d36a9d7..d463839 100644
--- a/src/trace_processor/importers/fuchsia/fuchsia_trace_parser.h
+++ b/src/trace_processor/importers/fuchsia/fuchsia_trace_parser.h
@@ -24,22 +24,18 @@
#include "src/trace_processor/importers/common/trace_parser.h"
#include "src/trace_processor/importers/fuchsia/fuchsia_record.h"
#include "src/trace_processor/importers/fuchsia/fuchsia_trace_utils.h"
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
namespace perfetto {
namespace trace_processor {
class TraceProcessorContext;
-class FuchsiaTraceParser : public TraceParser {
+class FuchsiaTraceParser : public FuchsiaRecordParser {
public:
explicit FuchsiaTraceParser(TraceProcessorContext*);
~FuchsiaTraceParser() override;
- // TraceParser implementation
void ParseFuchsiaRecord(int64_t timestamp, FuchsiaRecord fr) override;
- void ParseTrackEvent(int64_t, TrackEventData) override;
- void ParseTracePacket(int64_t ts, TracePacketData data) override;
struct Arg {
StringId name;
@@ -59,7 +55,6 @@
private:
TraceProcessorContext* const context_;
- std::unique_ptr<ProtoTraceParser> proto_parser_;
};
} // namespace trace_processor
diff --git a/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc b/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc
index d2dbb1f..0cbd4f7 100644
--- a/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc
+++ b/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc
@@ -26,7 +26,6 @@
#include "src/trace_processor/importers/common/slice_tracker.h"
#include "src/trace_processor/importers/fuchsia/fuchsia_record.h"
#include "src/trace_processor/importers/fuchsia/fuchsia_trace_parser.h"
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
#include "src/trace_processor/importers/proto/proto_trace_reader.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/types/task_state.h"
diff --git a/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.h b/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.h
index 671060e..9fbf150 100644
--- a/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.h
+++ b/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.h
@@ -32,6 +32,7 @@
// https://fuchsia.googlesource.com/fuchsia/+/HEAD/docs/development/tracing/trace-format/README.md
class FuchsiaTraceTokenizer : public ChunkedTraceReader {
public:
+ static constexpr TraceType kTraceType = TraceType::kFuchsiaTraceType;
explicit FuchsiaTraceTokenizer(TraceProcessorContext*);
~FuchsiaTraceTokenizer() override;
diff --git a/src/trace_processor/importers/json/BUILD.gn b/src/trace_processor/importers/json/BUILD.gn
index ef98b46..ec0813d 100644
--- a/src/trace_processor/importers/json/BUILD.gn
+++ b/src/trace_processor/importers/json/BUILD.gn
@@ -31,8 +31,8 @@
source_set("full") {
sources = [
- "json_trace_parser.cc",
- "json_trace_parser.h",
+ "json_trace_parser_impl.cc",
+ "json_trace_parser_impl.h",
"json_trace_tokenizer.cc",
"json_trace_tokenizer.h",
]
diff --git a/src/trace_processor/importers/json/json_trace_parser.cc b/src/trace_processor/importers/json/json_trace_parser_impl.cc
similarity index 96%
rename from src/trace_processor/importers/json/json_trace_parser.cc
rename to src/trace_processor/importers/json/json_trace_parser_impl.cc
index 6982e18..dc7a261 100644
--- a/src/trace_processor/importers/json/json_trace_parser.cc
+++ b/src/trace_processor/importers/json/json_trace_parser_impl.cc
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "src/trace_processor/importers/json/json_trace_parser.h"
+#include "src/trace_processor/importers/json/json_trace_parser_impl.h"
#include <cstdint>
#include <cstring>
@@ -62,17 +62,17 @@
} // namespace
#endif // PERFETTO_BUILDFLAG(PERFETTO_TP_JSON)
-JsonTraceParser::JsonTraceParser(TraceProcessorContext* context)
+JsonTraceParserImpl::JsonTraceParserImpl(TraceProcessorContext* context)
: context_(context), systrace_line_parser_(context) {}
-JsonTraceParser::~JsonTraceParser() = default;
+JsonTraceParserImpl::~JsonTraceParserImpl() = default;
-void JsonTraceParser::ParseSystraceLine(int64_t, SystraceLine line) {
+void JsonTraceParserImpl::ParseSystraceLine(int64_t, SystraceLine line) {
systrace_line_parser_.ParseLine(line);
}
-void JsonTraceParser::ParseJsonPacket(int64_t timestamp,
- std::string string_value) {
+void JsonTraceParserImpl::ParseJsonPacket(int64_t timestamp,
+ std::string string_value) {
PERFETTO_DCHECK(json::IsJsonSupported());
#if PERFETTO_BUILDFLAG(PERFETTO_TP_JSON)
@@ -391,7 +391,8 @@
#endif // PERFETTO_BUILDFLAG(PERFETTO_TP_JSON)
}
-void JsonTraceParser::MaybeAddFlow(TrackId track_id, const Json::Value& event) {
+void JsonTraceParserImpl::MaybeAddFlow(TrackId track_id,
+ const Json::Value& event) {
PERFETTO_DCHECK(json::IsJsonSupported());
#if PERFETTO_BUILDFLAG(PERFETTO_TP_JSON)
auto opt_bind_id = MaybeExtractFlowIdentifier(event, /* version2 = */ true);
diff --git a/src/trace_processor/importers/json/json_trace_parser.h b/src/trace_processor/importers/json/json_trace_parser_impl.h
similarity index 84%
rename from src/trace_processor/importers/json/json_trace_parser.h
rename to src/trace_processor/importers/json/json_trace_parser_impl.h
index ff1ad63..4c0e269 100644
--- a/src/trace_processor/importers/json/json_trace_parser.h
+++ b/src/trace_processor/importers/json/json_trace_parser_impl.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_JSON_JSON_TRACE_PARSER_H_
-#define SRC_TRACE_PROCESSOR_IMPORTERS_JSON_JSON_TRACE_PARSER_H_
+#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_JSON_JSON_TRACE_PARSER_IMPL_H_
+#define SRC_TRACE_PROCESSOR_IMPORTERS_JSON_JSON_TRACE_PARSER_IMPL_H_
#include <stdint.h>
@@ -37,10 +37,10 @@
// Parses legacy chrome JSON traces. The support for now is extremely rough
// and supports only explicit TRACE_EVENT_BEGIN/END events.
-class JsonTraceParser : public TraceParser {
+class JsonTraceParserImpl : public JsonTraceParser {
public:
- explicit JsonTraceParser(TraceProcessorContext*);
- ~JsonTraceParser() override;
+ explicit JsonTraceParserImpl(TraceProcessorContext*);
+ ~JsonTraceParserImpl() override;
// TraceParser implementation.
void ParseJsonPacket(int64_t timestamp, std::string string_value) override;
@@ -56,4 +56,4 @@
} // namespace trace_processor
} // namespace perfetto
-#endif // SRC_TRACE_PROCESSOR_IMPORTERS_JSON_JSON_TRACE_PARSER_H_
+#endif // SRC_TRACE_PROCESSOR_IMPORTERS_JSON_JSON_TRACE_PARSER_IMPL_H_
diff --git a/src/trace_processor/importers/perf/perf_data_parser.cc b/src/trace_processor/importers/perf/perf_data_parser.cc
index 83f8800..e3dfef3 100644
--- a/src/trace_processor/importers/perf/perf_data_parser.cc
+++ b/src/trace_processor/importers/perf/perf_data_parser.cc
@@ -47,7 +47,7 @@
return tracker_->ParseSample(reader);
}
-void PerfDataParser::ParseTraceBlobView(int64_t ts, TraceBlobView tbv) {
+void PerfDataParser::ParsePerfRecord(int64_t ts, TraceBlobView tbv) {
auto sample_status = ParseSample(std::move(tbv));
if (!sample_status.ok()) {
return;
diff --git a/src/trace_processor/importers/perf/perf_data_parser.h b/src/trace_processor/importers/perf/perf_data_parser.h
index 9a37bc6..f2ab0a3 100644
--- a/src/trace_processor/importers/perf/perf_data_parser.h
+++ b/src/trace_processor/importers/perf/perf_data_parser.h
@@ -29,13 +29,13 @@
namespace perf_importer {
// Parses samples from perf.data files.
-class PerfDataParser : public TraceParser {
+class PerfDataParser : public PerfRecordParser {
public:
explicit PerfDataParser(TraceProcessorContext*);
~PerfDataParser() override;
// The data in TraceBlobView has to be a perf.data sample.
- void ParseTraceBlobView(int64_t timestamp, TraceBlobView) override;
+ void ParsePerfRecord(int64_t timestamp, TraceBlobView) override;
private:
base::StatusOr<PerfDataTracker::PerfSample> ParseSample(TraceBlobView);
diff --git a/src/trace_processor/importers/perf/perf_data_tokenizer.cc b/src/trace_processor/importers/perf/perf_data_tokenizer.cc
index 334148a..25b54b9 100644
--- a/src/trace_processor/importers/perf/perf_data_tokenizer.cc
+++ b/src/trace_processor/importers/perf/perf_data_tokenizer.cc
@@ -136,7 +136,7 @@
if (!ValidateSample(*sample_status)) {
continue;
}
- context_->sorter->PushTraceBlobView(
+ context_->sorter->PushPerfRecord(
static_cast<int64_t>(*sample_status->ts), std::move(tbv));
break;
}
diff --git a/src/trace_processor/importers/proto/BUILD.gn b/src/trace_processor/importers/proto/BUILD.gn
index d40a84b..9930ea5 100644
--- a/src/trace_processor/importers/proto/BUILD.gn
+++ b/src/trace_processor/importers/proto/BUILD.gn
@@ -51,8 +51,8 @@
"profile_packet_utils.cc",
"profile_packet_utils.h",
"proto_incremental_state.h",
- "proto_trace_parser.cc",
- "proto_trace_parser.h",
+ "proto_trace_parser_impl.cc",
+ "proto_trace_parser_impl.h",
"proto_trace_reader.cc",
"proto_trace_reader.h",
"proto_trace_tokenizer.cc",
@@ -253,7 +253,7 @@
"network_trace_module_unittest.cc",
"perf_sample_tracker_unittest.cc",
"profile_packet_sequence_state_unittest.cc",
- "proto_trace_parser_unittest.cc",
+ "proto_trace_parser_impl_unittest.cc",
"string_encoding_utils_unittests.cc",
]
deps = [
diff --git a/src/trace_processor/importers/proto/multi_machine_trace_manager.cc b/src/trace_processor/importers/proto/multi_machine_trace_manager.cc
index e91dcee..8355f85 100644
--- a/src/trace_processor/importers/proto/multi_machine_trace_manager.cc
+++ b/src/trace_processor/importers/proto/multi_machine_trace_manager.cc
@@ -33,7 +33,7 @@
#include "src/trace_processor/importers/proto/default_modules.h"
#include "src/trace_processor/importers/proto/perf_sample_tracker.h"
#include "src/trace_processor/importers/proto/proto_importer_module.h"
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/proto_trace_parser_impl.h"
#include "src/trace_processor/importers/proto/proto_trace_reader.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/types/trace_processor_context.h"
@@ -77,9 +77,9 @@
auto context = CreateContext(raw_machine_id);
// Share the sorter, but enable for the parser.
context->sorter = default_context_->sorter;
- context->sorter->AddMachine(
- context->machine_id(), std::make_unique<ProtoTraceParser>(context.get()));
+ context->sorter->AddMachineContext(context.get());
context->process_tracker->SetPidZeroIsUpidZeroIdleProcess();
+ context->proto_trace_parser.reset(new ProtoTraceParserImpl(context.get()));
auto new_reader = std::make_unique<ProtoTraceReader>(context.get());
remote_machine_contexts_[raw_machine_id] =
diff --git a/src/trace_processor/importers/proto/network_trace_module_unittest.cc b/src/trace_processor/importers/proto/network_trace_module_unittest.cc
index 0d9f53c..f174b35 100644
--- a/src/trace_processor/importers/proto/network_trace_module_unittest.cc
+++ b/src/trace_processor/importers/proto/network_trace_module_unittest.cc
@@ -23,7 +23,7 @@
#include "src/trace_processor/importers/common/slice_tracker.h"
#include "src/trace_processor/importers/common/slice_translation_table.h"
#include "src/trace_processor/importers/common/track_tracker.h"
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/proto_trace_parser_impl.h"
#include "src/trace_processor/importers/proto/proto_trace_reader.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/types/trace_processor_context.h"
@@ -47,9 +47,9 @@
context_.slice_translation_table.reset(new SliceTranslationTable(storage_));
context_.args_translation_table.reset(new ArgsTranslationTable(storage_));
context_.async_track_set_tracker.reset(new AsyncTrackSetTracker(&context_));
- context_.sorter.reset(new TraceSorter(
- &context_, std::make_unique<ProtoTraceParser>(&context_),
- TraceSorter::SortingMode::kFullSort));
+ context_.proto_trace_parser.reset(new ProtoTraceParserImpl(&context_));
+ context_.sorter.reset(
+ new TraceSorter(&context_, TraceSorter::SortingMode::kFullSort));
}
util::Status TokenizeAndParse() {
diff --git a/src/trace_processor/importers/proto/proto_trace_parser.cc b/src/trace_processor/importers/proto/proto_trace_parser_impl.cc
similarity index 95%
rename from src/trace_processor/importers/proto/proto_trace_parser.cc
rename to src/trace_processor/importers/proto/proto_trace_parser_impl.cc
index d81ef57..bbd38c3 100644
--- a/src/trace_processor/importers/proto/proto_trace_parser.cc
+++ b/src/trace_processor/importers/proto/proto_trace_parser_impl.cc
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/proto_trace_parser_impl.h"
#include <string.h>
@@ -54,7 +54,7 @@
namespace perfetto {
namespace trace_processor {
-ProtoTraceParser::ProtoTraceParser(TraceProcessorContext* context)
+ProtoTraceParserImpl::ProtoTraceParserImpl(TraceProcessorContext* context)
: context_(context),
metatrace_id_(context->storage->InternString("metatrace")),
data_name_id_(context->storage->InternString("data")),
@@ -67,9 +67,9 @@
missing_metatrace_interned_string_id_(
context->storage->InternString("MISSING STRING")) {}
-ProtoTraceParser::~ProtoTraceParser() = default;
+ProtoTraceParserImpl::~ProtoTraceParserImpl() = default;
-void ProtoTraceParser::ParseTracePacket(int64_t ts, TracePacketData data) {
+void ProtoTraceParserImpl::ParseTracePacket(int64_t ts, TracePacketData data) {
const TraceBlobView& blob = data.packet;
protos::pbzero::TracePacket::Decoder packet(blob.data(), blob.length());
// TODO(eseckler): Propagate statuses from modules.
@@ -106,14 +106,14 @@
}
}
-void ProtoTraceParser::ParseTrackEvent(int64_t ts, TrackEventData data) {
+void ProtoTraceParserImpl::ParseTrackEvent(int64_t ts, TrackEventData data) {
const TraceBlobView& blob = data.trace_packet_data.packet;
protos::pbzero::TracePacket::Decoder packet(blob.data(), blob.length());
context_->track_module->ParseTrackEventData(packet, ts, data);
context_->args_tracker->Flush();
}
-void ProtoTraceParser::ParseEtwEvent(uint32_t cpu,
+void ProtoTraceParserImpl::ParseEtwEvent(uint32_t cpu,
int64_t ts,
TracePacketData data) {
PERFETTO_DCHECK(context_->etw_module);
@@ -125,7 +125,7 @@
context_->args_tracker->Flush();
}
-void ProtoTraceParser::ParseFtraceEvent(uint32_t cpu,
+void ProtoTraceParserImpl::ParseFtraceEvent(uint32_t cpu,
int64_t ts,
TracePacketData data) {
PERFETTO_DCHECK(context_->ftrace_module);
@@ -137,7 +137,7 @@
context_->args_tracker->Flush();
}
-void ProtoTraceParser::ParseInlineSchedSwitch(uint32_t cpu,
+void ProtoTraceParserImpl::ParseInlineSchedSwitch(uint32_t cpu,
int64_t ts,
InlineSchedSwitch data) {
PERFETTO_DCHECK(context_->ftrace_module);
@@ -149,7 +149,7 @@
context_->args_tracker->Flush();
}
-void ProtoTraceParser::ParseInlineSchedWaking(uint32_t cpu,
+void ProtoTraceParserImpl::ParseInlineSchedWaking(uint32_t cpu,
int64_t ts,
InlineSchedWaking data) {
PERFETTO_DCHECK(context_->ftrace_module);
@@ -161,7 +161,7 @@
context_->args_tracker->Flush();
}
-void ProtoTraceParser::ParseTraceStats(ConstBytes blob) {
+void ProtoTraceParserImpl::ParseTraceStats(ConstBytes blob) {
protos::pbzero::TraceStats::Decoder evt(blob.data, blob.size);
auto* storage = context_->storage.get();
storage->SetStats(stats::traced_producers_connected,
@@ -263,7 +263,7 @@
}
}
-void ProtoTraceParser::ParseChromeEvents(int64_t ts, ConstBytes blob) {
+void ProtoTraceParserImpl::ParseChromeEvents(int64_t ts, ConstBytes blob) {
TraceStorage* storage = context_->storage.get();
protos::pbzero::ChromeEventBundle::Decoder bundle(blob.data, blob.size);
ArgsTracker args(context_);
@@ -348,7 +348,7 @@
}
}
-void ProtoTraceParser::ParseMetatraceEvent(int64_t ts, ConstBytes blob) {
+void ProtoTraceParserImpl::ParseMetatraceEvent(int64_t ts, ConstBytes blob) {
protos::pbzero::PerfettoMetatrace::Decoder event(blob.data, blob.size);
auto utid = context_->process_tracker->GetOrCreateThread(event.thread_id());
@@ -471,7 +471,7 @@
context_->storage->IncrementStats(stats::metatrace_overruns);
}
-StringId ProtoTraceParser::GetMetatraceInternedString(uint64_t iid) {
+StringId ProtoTraceParserImpl::GetMetatraceInternedString(uint64_t iid) {
StringId* maybe_id = metatrace_interned_strings_.Find(iid);
if (!maybe_id)
return missing_metatrace_interned_string_id_;
diff --git a/src/trace_processor/importers/proto/proto_trace_parser.h b/src/trace_processor/importers/proto/proto_trace_parser_impl.h
similarity index 89%
rename from src/trace_processor/importers/proto/proto_trace_parser.h
rename to src/trace_processor/importers/proto/proto_trace_parser_impl.h
index 621bd02..e9bce35 100644
--- a/src/trace_processor/importers/proto/proto_trace_parser.h
+++ b/src/trace_processor/importers/proto/proto_trace_parser_impl.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROTO_TRACE_PARSER_H_
-#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROTO_TRACE_PARSER_H_
+#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROTO_TRACE_PARSER_IMPL_H_
+#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROTO_TRACE_PARSER_IMPL_H_
#include <stdint.h>
@@ -40,11 +40,11 @@
class PacketSequenceState;
class TraceProcessorContext;
-class ProtoTraceParser : public TraceParser {
+class ProtoTraceParserImpl : public ProtoTraceParser {
public:
using ConstBytes = protozero::ConstBytes;
- explicit ProtoTraceParser(TraceProcessorContext*);
- ~ProtoTraceParser() override;
+ explicit ProtoTraceParserImpl(TraceProcessorContext*);
+ ~ProtoTraceParserImpl() override;
void ParseTrackEvent(int64_t ts, TrackEventData data) override;
void ParseTracePacket(int64_t ts, TracePacketData data) override;
@@ -87,4 +87,4 @@
} // namespace trace_processor
} // namespace perfetto
-#endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROTO_TRACE_PARSER_H_
+#endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROTO_TRACE_PARSER_IMPL_H_
diff --git a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc b/src/trace_processor/importers/proto/proto_trace_parser_impl_unittest.cc
similarity index 99%
rename from src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
rename to src/trace_processor/importers/proto/proto_trace_parser_impl_unittest.cc
index 20e0085..95b16d1 100644
--- a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
+++ b/src/trace_processor/importers/proto/proto_trace_parser_impl_unittest.cc
@@ -34,7 +34,7 @@
#include "src/trace_processor/importers/ftrace/ftrace_sched_event_tracker.h"
#include "src/trace_processor/importers/proto/additional_modules.h"
#include "src/trace_processor/importers/proto/default_modules.h"
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/proto_trace_parser_impl.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/storage/metadata.h"
#include "src/trace_processor/storage/trace_storage.h"
@@ -271,7 +271,8 @@
clock_ = new ClockTracker(&context_);
context_.clock_tracker.reset(clock_);
context_.flow_tracker.reset(new FlowTracker(&context_));
- context_.sorter.reset(new TraceSorter(&context_, CreateParser(),
+ context_.proto_trace_parser.reset(new ProtoTraceParserImpl(&context_));
+ context_.sorter.reset(new TraceSorter(&context_,
TraceSorter::SortingMode::kFullSort));
context_.descriptor_pool_.reset(new DescriptorPool());
@@ -315,10 +316,6 @@
}
protected:
- std::unique_ptr<TraceParser> CreateParser() {
- return std::unique_ptr<TraceParser>(new ProtoTraceParser(&context_));
- }
-
protozero::HeapBuffered<protos::pbzero::Trace> trace_;
TraceProcessorContext context_;
MockEventTracker* event_;
diff --git a/src/trace_processor/sorter/trace_sorter.cc b/src/trace_processor/sorter/trace_sorter.cc
index e8159c3..a2d9861 100644
--- a/src/trace_processor/sorter/trace_sorter.cc
+++ b/src/trace_processor/sorter/trace_sorter.cc
@@ -20,19 +20,20 @@
#include "perfetto/base/compiler.h"
#include "src/trace_processor/importers/common/parser_types.h"
+#include "src/trace_processor/importers/common/trace_parser.h"
#include "src/trace_processor/importers/fuchsia/fuchsia_record.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/storage/trace_storage.h"
+#include "src/trace_processor/types/trace_processor_context.h"
#include "src/trace_processor/util/bump_allocator.h"
namespace perfetto {
namespace trace_processor {
TraceSorter::TraceSorter(TraceProcessorContext* context,
- std::unique_ptr<TraceParser> parser,
SortingMode sorting_mode)
- : context_(context), sorting_mode_(sorting_mode) {
- AddMachine(context_->machine_id(), std::move(parser));
+ : sorting_mode_(sorting_mode), storage_(context->storage) {
+ AddMachineContext(context);
const char* env = getenv("TRACE_PROCESSOR_SORT_ONLY");
bypass_next_stage_for_testing_ = env && !strcmp(env, "1");
if (bypass_next_stage_for_testing_)
@@ -181,33 +182,33 @@
} // for(;;)
}
-void TraceSorter::ParseTracePacket(TraceParser* parser,
+void TraceSorter::ParseTracePacket(TraceProcessorContext& context,
const TimestampedEvent& event) {
TraceTokenBuffer::Id id = GetTokenBufferId(event);
switch (static_cast<TimestampedEvent::Type>(event.event_type)) {
- case TimestampedEvent::Type::kTraceBlobView:
- parser->ParseTraceBlobView(event.ts,
- token_buffer_.Extract<TraceBlobView>(id));
+ case TimestampedEvent::Type::kPerfRecord:
+ context.perf_record_parser->ParsePerfRecord(
+ event.ts, token_buffer_.Extract<TraceBlobView>(id));
return;
case TimestampedEvent::Type::kTracePacket:
- parser->ParseTracePacket(event.ts,
- token_buffer_.Extract<TracePacketData>(id));
+ context.proto_trace_parser->ParseTracePacket(
+ event.ts, token_buffer_.Extract<TracePacketData>(id));
return;
case TimestampedEvent::Type::kTrackEvent:
- parser->ParseTrackEvent(event.ts,
- token_buffer_.Extract<TrackEventData>(id));
+ context.proto_trace_parser->ParseTrackEvent(
+ event.ts, token_buffer_.Extract<TrackEventData>(id));
return;
case TimestampedEvent::Type::kFuchsiaRecord:
- parser->ParseFuchsiaRecord(event.ts,
- token_buffer_.Extract<FuchsiaRecord>(id));
+ context.fuchsia_record_parser->ParseFuchsiaRecord(
+ event.ts, token_buffer_.Extract<FuchsiaRecord>(id));
return;
case TimestampedEvent::Type::kJsonValue:
- parser->ParseJsonPacket(
+ context.json_trace_parser->ParseJsonPacket(
event.ts, std::move(token_buffer_.Extract<JsonEvent>(id).value));
return;
case TimestampedEvent::Type::kSystraceLine:
- parser->ParseSystraceLine(event.ts,
- token_buffer_.Extract<SystraceLine>(id));
+ context.json_trace_parser->ParseSystraceLine(
+ event.ts, token_buffer_.Extract<SystraceLine>(id));
return;
case TimestampedEvent::Type::kInlineSchedSwitch:
case TimestampedEvent::Type::kInlineSchedWaking:
@@ -218,14 +219,14 @@
PERFETTO_FATAL("For GCC");
}
-void TraceSorter::ParseEtwPacket(TraceParser* parser,
+void TraceSorter::ParseEtwPacket(TraceProcessorContext& context,
uint32_t cpu,
const TimestampedEvent& event) {
TraceTokenBuffer::Id id = GetTokenBufferId(event);
switch (static_cast<TimestampedEvent::Type>(event.event_type)) {
case TimestampedEvent::Type::kEtwEvent:
- parser->ParseEtwEvent(cpu, event.ts,
- token_buffer_.Extract<TracePacketData>(id));
+ context.proto_trace_parser->ParseEtwEvent(
+ cpu, event.ts, token_buffer_.Extract<TracePacketData>(id));
return;
case TimestampedEvent::Type::kInlineSchedSwitch:
case TimestampedEvent::Type::kInlineSchedWaking:
@@ -233,7 +234,7 @@
case TimestampedEvent::Type::kTrackEvent:
case TimestampedEvent::Type::kSystraceLine:
case TimestampedEvent::Type::kTracePacket:
- case TimestampedEvent::Type::kTraceBlobView:
+ case TimestampedEvent::Type::kPerfRecord:
case TimestampedEvent::Type::kJsonValue:
case TimestampedEvent::Type::kFuchsiaRecord:
PERFETTO_FATAL("Invalid event type");
@@ -241,28 +242,28 @@
PERFETTO_FATAL("For GCC");
}
-void TraceSorter::ParseFtracePacket(TraceParser* parser,
+void TraceSorter::ParseFtracePacket(TraceProcessorContext& context,
uint32_t cpu,
const TimestampedEvent& event) {
TraceTokenBuffer::Id id = GetTokenBufferId(event);
switch (static_cast<TimestampedEvent::Type>(event.event_type)) {
case TimestampedEvent::Type::kInlineSchedSwitch:
- parser->ParseInlineSchedSwitch(
+ context.proto_trace_parser->ParseInlineSchedSwitch(
cpu, event.ts, token_buffer_.Extract<InlineSchedSwitch>(id));
return;
case TimestampedEvent::Type::kInlineSchedWaking:
- parser->ParseInlineSchedWaking(
+ context.proto_trace_parser->ParseInlineSchedWaking(
cpu, event.ts, token_buffer_.Extract<InlineSchedWaking>(id));
return;
case TimestampedEvent::Type::kFtraceEvent:
- parser->ParseFtraceEvent(cpu, event.ts,
- token_buffer_.Extract<TracePacketData>(id));
+ context.proto_trace_parser->ParseFtraceEvent(
+ cpu, event.ts, token_buffer_.Extract<TracePacketData>(id));
return;
case TimestampedEvent::Type::kEtwEvent:
case TimestampedEvent::Type::kTrackEvent:
case TimestampedEvent::Type::kSystraceLine:
case TimestampedEvent::Type::kTracePacket:
- case TimestampedEvent::Type::kTraceBlobView:
+ case TimestampedEvent::Type::kPerfRecord:
case TimestampedEvent::Type::kJsonValue:
case TimestampedEvent::Type::kFuchsiaRecord:
PERFETTO_FATAL("Invalid event type");
@@ -274,7 +275,7 @@
const TimestampedEvent& event) {
TraceTokenBuffer::Id id = GetTokenBufferId(event);
switch (static_cast<TimestampedEvent::Type>(event.event_type)) {
- case TimestampedEvent::Type::kTraceBlobView:
+ case TimestampedEvent::Type::kPerfRecord:
base::ignore_result(token_buffer_.Extract<TraceBlobView>(id));
return;
case TimestampedEvent::Type::kTracePacket:
@@ -311,10 +312,11 @@
void TraceSorter::MaybeExtractEvent(size_t min_machine_idx,
size_t queue_idx,
const TimestampedEvent& event) {
- auto* parser = sorter_data_by_machine_[min_machine_idx].parser.get();
+ auto* machine_context =
+ sorter_data_by_machine_[min_machine_idx].machine_context;
int64_t timestamp = event.ts;
if (timestamp < latest_pushed_event_ts_)
- context_->storage->IncrementStats(stats::sorter_push_event_out_of_order);
+ storage_->IncrementStats(stats::sorter_push_event_out_of_order);
latest_pushed_event_ts_ = std::max(latest_pushed_event_ts_, timestamp);
@@ -326,16 +328,16 @@
}
if (queue_idx == 0) {
- ParseTracePacket(parser, event);
+ ParseTracePacket(*machine_context, event);
} else {
// Ftrace queues start at offset 1. So queues_[1] = cpu[0] and so on.
uint32_t cpu = static_cast<uint32_t>(queue_idx - 1);
auto event_type = static_cast<TimestampedEvent::Type>(event.event_type);
if (event_type == TimestampedEvent::Type::kEtwEvent) {
- ParseEtwPacket(parser, static_cast<uint32_t>(cpu), event);
+ ParseEtwPacket(*machine_context, static_cast<uint32_t>(cpu), event);
} else {
- ParseFtracePacket(parser, cpu, event);
+ ParseFtracePacket(*machine_context, cpu, event);
}
}
}
diff --git a/src/trace_processor/sorter/trace_sorter.h b/src/trace_processor/sorter/trace_sorter.h
index 56fd0a1..dd38504 100644
--- a/src/trace_processor/sorter/trace_sorter.h
+++ b/src/trace_processor/sorter/trace_sorter.h
@@ -33,6 +33,7 @@
#include "src/trace_processor/importers/fuchsia/fuchsia_record.h"
#include "src/trace_processor/importers/systrace/systrace_line.h"
#include "src/trace_processor/sorter/trace_token_buffer.h"
+#include "src/trace_processor/storage/trace_storage.h"
#include "src/trace_processor/types/trace_processor_context.h"
#include "src/trace_processor/util/bump_allocator.h"
@@ -92,22 +93,22 @@
kFullSort,
};
- TraceSorter(TraceProcessorContext* context,
- std::unique_ptr<TraceParser> parser,
- SortingMode);
+ TraceSorter(TraceProcessorContext* context, SortingMode sorting_mode);
+
~TraceSorter();
- inline void AddMachine(std::optional<MachineId> machine_id,
- std::unique_ptr<TraceParser> parser) {
- sorter_data_by_machine_.emplace_back(machine_id, std::move(parser));
+ SortingMode sorting_mode() const { return sorting_mode_; }
+
+ inline void AddMachineContext(TraceProcessorContext* context) {
+ sorter_data_by_machine_.emplace_back(context);
}
- inline void PushTraceBlobView(
+ inline void PushPerfRecord(
int64_t timestamp,
- TraceBlobView tbv,
+ TraceBlobView record,
std::optional<MachineId> machine_id = std::nullopt) {
- TraceTokenBuffer::Id id = token_buffer_.Append(std::move(tbv));
- AppendNonFtraceEvent(timestamp, TimestampedEvent::Type::kTraceBlobView, id,
+ TraceTokenBuffer::Id id = token_buffer_.Append(std::move(record));
+ AppendNonFtraceEvent(timestamp, TimestampedEvent::Type::kPerfRecord, id,
machine_id);
}
@@ -246,7 +247,7 @@
struct TimestampedEvent {
enum class Type : uint8_t {
kFtraceEvent,
- kTraceBlobView,
+ kPerfRecord,
kTracePacket,
kInlineSchedSwitch,
kInlineSchedWaking,
@@ -291,6 +292,7 @@
std::tie(evt.ts, evt.chunk_index, evt.chunk_offset);
}
};
+
static_assert(sizeof(TimestampedEvent) == 16,
"TimestampedEvent must be equal to 16 bytes");
static_assert(std::is_trivially_copyable<TimestampedEvent>::value,
@@ -385,9 +387,14 @@
append_max_ts_ = std::max(append_max_ts_, queue->max_ts_);
}
- void ParseTracePacket(TraceParser*, const TimestampedEvent&);
- void ParseFtracePacket(TraceParser*, uint32_t cpu, const TimestampedEvent&);
- void ParseEtwPacket(TraceParser*, uint32_t cpu, const TimestampedEvent&);
+ void ParseTracePacket(TraceProcessorContext& context,
+ const TimestampedEvent&);
+ void ParseFtracePacket(TraceProcessorContext& context,
+ uint32_t cpu,
+ const TimestampedEvent&);
+ void ParseEtwPacket(TraceProcessorContext& context,
+ uint32_t cpu,
+ const TimestampedEvent&);
void MaybeExtractEvent(size_t machine_idx,
size_t queue_idx,
@@ -399,24 +406,24 @@
}
struct TraceSorterData {
- TraceSorterData(std::optional<MachineId> _machine_id,
- std::unique_ptr<TraceParser> _parser)
- : machine_id(_machine_id), parser(std::move(_parser)) {}
+ explicit TraceSorterData(TraceProcessorContext* _machine_context)
+ : machine_id(_machine_context->machine_id()),
+ machine_context(_machine_context) {}
std::optional<MachineId> machine_id;
- std::unique_ptr<TraceParser> parser;
// queues_[0] is the general (non-ftrace) queue.
// queues_[1] is the ftrace queue for CPU(0).
// queues_[x] is the ftrace queue for CPU(x - 1).
+ TraceProcessorContext* machine_context;
std::vector<Queue> queues;
};
std::vector<TraceSorterData> sorter_data_by_machine_;
- TraceProcessorContext* context_ = nullptr;
-
// Whether we should ignore incremental extraction and just wait for
// forced extractionn at the end of the trace.
SortingMode sorting_mode_ = SortingMode::kDefault;
+ std::shared_ptr<TraceStorage> storage_;
+
// Buffer for storing tokenized objects while the corresponding events are
// being sorted.
TraceTokenBuffer token_buffer_;
diff --git a/src/trace_processor/sorter/trace_sorter_unittest.cc b/src/trace_processor/sorter/trace_sorter_unittest.cc
index 8f7e73d..3fc8f76 100644
--- a/src/trace_processor/sorter/trace_sorter_unittest.cc
+++ b/src/trace_processor/sorter/trace_sorter_unittest.cc
@@ -14,7 +14,7 @@
* limitations under the License.
*/
#include "perfetto/trace_processor/trace_blob_view.h"
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/proto_trace_parser_impl.h"
#include <map>
#include <random>
@@ -40,10 +40,10 @@
constexpr std::optional<MachineId> kNullMachineId = std::nullopt;
-class MockTraceParser : public ProtoTraceParser {
+class MockTraceParser : public ProtoTraceParserImpl {
public:
explicit MockTraceParser(TraceProcessorContext* context)
- : ProtoTraceParser(context), machine_id_(context->machine_id()) {}
+ : ProtoTraceParserImpl(context), machine_id_(context->machine_id()) {}
MOCK_METHOD(void,
MOCK_ParseFtracePacket,
@@ -90,12 +90,11 @@
}
void CreateSorter(bool full_sort = true) {
- std::unique_ptr<MockTraceParser> parser(new MockTraceParser(&context_));
- parser_ = parser.get();
+ parser_ = new MockTraceParser(&context_);
+ context_.proto_trace_parser.reset(parser_);
auto sorting_mode = full_sort ? TraceSorter::SortingMode::kFullSort
: TraceSorter::SortingMode::kDefault;
- context_.sorter.reset(
- new TraceSorter(&context_, std::move(parser), sorting_mode));
+ context_.sorter.reset(new TraceSorter(&context_, sorting_mode));
}
protected:
@@ -359,10 +358,9 @@
auto ctx = std::make_unique<TraceProcessorContext>(args);
auto parser = std::make_unique<MockTraceParser>(ctx.get());
extra_parsers.push_back(parser.get());
-
+ ctx->proto_trace_parser = std::move(parser);
extra_contexts.push_back(std::move(ctx));
- context_.sorter->AddMachine(extra_contexts.back()->machine_id(),
- std::move(parser));
+ context_.sorter->AddMachineContext(extra_contexts.back().get());
}
// Set up the expectation for the default machine.
diff --git a/src/trace_processor/trace_processor_context.cc b/src/trace_processor/trace_processor_context.cc
index c861f63..2299a1b 100644
--- a/src/trace_processor/trace_processor_context.cc
+++ b/src/trace_processor/trace_processor_context.cc
@@ -42,7 +42,6 @@
#include "src/trace_processor/importers/proto/multi_machine_trace_manager.h"
#include "src/trace_processor/importers/proto/perf_sample_tracker.h"
#include "src/trace_processor/importers/proto/proto_importer_module.h"
-#include "src/trace_processor/importers/proto/proto_trace_parser.h"
#include "src/trace_processor/importers/proto/track_event.descriptor.h"
#include "src/trace_processor/importers/proto/track_event_module.h"
#include "src/trace_processor/sorter/trace_sorter.h"
diff --git a/src/trace_processor/trace_processor_impl.cc b/src/trace_processor/trace_processor_impl.cc
index 30c83e6..991079a 100644
--- a/src/trace_processor/trace_processor_impl.cc
+++ b/src/trace_processor/trace_processor_impl.cc
@@ -49,7 +49,7 @@
#include "src/trace_processor/importers/fuchsia/fuchsia_trace_parser.h"
#include "src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.h"
#include "src/trace_processor/importers/gzip/gzip_trace_parser.h"
-#include "src/trace_processor/importers/json/json_trace_parser.h"
+#include "src/trace_processor/importers/json/json_trace_parser_impl.h"
#include "src/trace_processor/importers/json/json_trace_tokenizer.h"
#include "src/trace_processor/importers/json/json_utils.h"
#include "src/trace_processor/importers/ninja/ninja_log_parser.h"
@@ -341,14 +341,14 @@
: TraceProcessorStorageImpl(cfg), config_(cfg) {
context_.fuchsia_trace_tokenizer =
std::make_unique<FuchsiaTraceTokenizer>(&context_);
- context_.fuchsia_trace_parser =
+ context_.fuchsia_record_parser =
std::make_unique<FuchsiaTraceParser>(&context_);
context_.ninja_log_parser = std::make_unique<NinjaLogParser>(&context_);
context_.systrace_trace_parser =
std::make_unique<SystraceTraceParser>(&context_);
context_.perf_data_trace_tokenizer =
std::make_unique<perf_importer::PerfDataTokenizer>(&context_);
- context_.perf_data_parser =
+ context_.perf_record_parser =
std::make_unique<perf_importer::PerfDataParser>(&context_);
if (util::IsGzipSupported()) {
@@ -360,7 +360,8 @@
if (json::IsJsonSupported()) {
context_.json_trace_tokenizer =
std::make_unique<JsonTraceTokenizer>(&context_);
- context_.json_trace_parser = std::make_unique<JsonTraceParser>(&context_);
+ context_.json_trace_parser =
+ std::make_unique<JsonTraceParserImpl>(&context_);
}
if (context_.config.analyze_trace_proto_content) {
diff --git a/src/trace_processor/trace_processor_storage_impl.cc b/src/trace_processor/trace_processor_storage_impl.cc
index b6cc299..3a686e8 100644
--- a/src/trace_processor/trace_processor_storage_impl.cc
+++ b/src/trace_processor/trace_processor_storage_impl.cc
@@ -15,6 +15,7 @@
*/
#include "src/trace_processor/trace_processor_storage_impl.h"
+#include <memory>
#include "perfetto/base/logging.h"
#include "perfetto/ext/base/uuid.h"
@@ -40,6 +41,7 @@
#include "src/trace_processor/importers/proto/packet_analyzer.h"
#include "src/trace_processor/importers/proto/perf_sample_tracker.h"
#include "src/trace_processor/importers/proto/proto_importer_module.h"
+#include "src/trace_processor/importers/proto/proto_trace_parser_impl.h"
#include "src/trace_processor/importers/proto/proto_trace_reader.h"
#include "src/trace_processor/importers/proto/track_event.descriptor.h"
#include "src/trace_processor/sorter/trace_sorter.h"
@@ -50,6 +52,8 @@
TraceProcessorStorageImpl::TraceProcessorStorageImpl(const Config& cfg)
: context_({cfg, std::make_shared<TraceStorage>(cfg)}) {
+ context_.proto_trace_parser =
+ std::make_unique<ProtoTraceParserImpl>(&context_);
RegisterDefaultModules(&context_);
}
diff --git a/src/trace_processor/types/trace_processor_context.h b/src/trace_processor/types/trace_processor_context.h
index 3136835..5a91d78 100644
--- a/src/trace_processor/types/trace_processor_context.h
+++ b/src/trace_processor/types/trace_processor_context.h
@@ -40,39 +40,42 @@
kPerfDataTraceType,
};
+class AndroidProbesTracker;
class ArgsTracker;
class ArgsTranslationTable;
class AsyncTrackSetTracker;
-class AndroidProbesTracker;
class ChunkedTraceReader;
-class ClockTracker;
class ClockConverter;
+class ClockTracker;
class DeobfuscationMappingTable;
+class DescriptorPool;
class EtwModule;
class EventTracker;
+class FlowTracker;
class ForwardingTraceParser;
class FtraceModule;
+class FuchsiaRecordParser;
class GlobalArgsTracker;
-class StackProfileTracker;
class HeapGraphTracker;
-class PerfSampleTracker;
+class JsonTraceParser;
class MachineTracker;
class MappingTracker;
class MetadataTracker;
class MultiMachineTraceManager;
class PacketAnalyzer;
-class ProtoImporterModule;
-class TrackEventModule;
+class PerfRecordParser;
+class PerfSampleTracker;
class ProcessTracker;
+class ProtoImporterModule;
+class ProtoTraceParser;
class SchedEventTracker;
class SliceTracker;
class SliceTranslationTable;
-class FlowTracker;
-class TraceParser;
+class StackProfileTracker;
class TraceSorter;
class TraceStorage;
+class TrackEventModule;
class TrackTracker;
-class DescriptorPool;
using MachineId = tables::MachineTable::Id;
@@ -161,12 +164,14 @@
std::unique_ptr<ChunkedTraceReader> gzip_trace_parser;
std::unique_ptr<ChunkedTraceReader> perf_data_trace_tokenizer;
+ std::unique_ptr<ProtoTraceParser> proto_trace_parser;
+
// These fields are trace parsers which will be called by |forwarding_parser|
// once the format of the trace is discovered. They are placed here as they
// are only available in the lib target.
- std::unique_ptr<TraceParser> json_trace_parser;
- std::unique_ptr<TraceParser> fuchsia_trace_parser;
- std::unique_ptr<TraceParser> perf_data_parser;
+ std::unique_ptr<JsonTraceParser> json_trace_parser;
+ std::unique_ptr<FuchsiaRecordParser> fuchsia_record_parser;
+ std::unique_ptr<PerfRecordParser> perf_record_parser;
// This field contains the list of proto descriptors that can be used by
// reflection-based parsers.
diff --git a/src/trace_processor/virtual_destructors.cc b/src/trace_processor/virtual_destructors.cc
index db5225b..c2e4437 100644
--- a/src/trace_processor/virtual_destructors.cc
+++ b/src/trace_processor/virtual_destructors.cc
@@ -15,13 +15,11 @@
*/
#include "src/trace_processor/importers/common/chunked_trace_reader.h"
-#include "src/trace_processor/importers/common/trace_parser.h"
namespace perfetto {
namespace trace_processor {
ChunkedTraceReader::~ChunkedTraceReader() {}
-TraceParser::~TraceParser() {}
} // namespace trace_processor
} // namespace perfetto