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