trace_processor: Migrate SystraceParser to the Destructible base

This is a step in modularization of trace processor aimed at building
two versions of trace processor with different set of modules at the
same time.

Bug: 141459049
Change-Id: Ib843c04ce77059f9f0783d8ffd692a78981f5099
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.cc b/src/trace_processor/importers/ftrace/ftrace_parser.cc
index 0d89512..7462e58 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.cc
@@ -524,14 +524,14 @@
 
 void FtraceParser::ParsePrint(int64_t ts, uint32_t pid, ConstBytes blob) {
   protos::pbzero::PrintFtraceEvent::Decoder evt(blob.data, blob.size);
-  context_->systrace_parser->ParsePrintEvent(ts, pid, evt.buf());
+  SystraceParser::GetOrCreate(context_)->ParsePrintEvent(ts, pid, evt.buf());
 }
 
 void FtraceParser::ParseZero(int64_t ts, uint32_t pid, ConstBytes blob) {
   protos::pbzero::ZeroFtraceEvent::Decoder evt(blob.data, blob.size);
   uint32_t tgid = static_cast<uint32_t>(evt.pid());
-  context_->systrace_parser->ParseZeroEvent(ts, pid, evt.flag(), evt.name(),
-                                            tgid, evt.value());
+  SystraceParser::GetOrCreate(context_)->ParseZeroEvent(
+      ts, pid, evt.flag(), evt.name(), tgid, evt.value());
 }
 
 void FtraceParser::ParseSdeTracingMarkWrite(int64_t ts,
@@ -545,7 +545,7 @@
   }
 
   uint32_t tgid = static_cast<uint32_t>(evt.pid());
-  context_->systrace_parser->ParseSdeTracingMarkWrite(
+  SystraceParser::GetOrCreate(context_)->ParseSdeTracingMarkWrite(
       ts, pid, static_cast<char>(evt.trace_type()), evt.trace_begin(),
       evt.trace_name(), tgid, evt.value());
 }
diff --git a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
index 0bd7928..a2455ce 100644
--- a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
+++ b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
@@ -27,7 +27,6 @@
 #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_module.h"
-#include "src/trace_processor/importers/systrace/systrace_parser.h"
 #include "src/trace_processor/metadata.h"
 #include "src/trace_processor/process_tracker.h"
 #include "src/trace_processor/register_additional_modules.h"
@@ -243,7 +242,6 @@
     context_.sorter.reset(new TraceSorter(&context_, 0 /*window size*/));
     context_.parser.reset(new ProtoTraceParser(&context_));
 #if PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
-    context_.systrace_parser.reset(new SystraceParser(&context_));
     context_.modules.emplace_back(new FtraceModuleImpl(&context_));
 #else
     context_.modules.emplace_back(new FtraceModule());
@@ -366,9 +364,6 @@
   static const char buf_value[] = "This is a print event";
   print->set_buf(buf_value);
 
-  EXPECT_CALL(*storage_, InternString(base::StringView(task_newtask)))
-      .Times(AtLeast(1));
-  EXPECT_CALL(*storage_, InternString(base::StringView(buf_value)));
   EXPECT_CALL(*process_, UpdateThread(123, 123));
 
   Tokenize();
diff --git a/src/trace_processor/importers/systrace/systrace_parser.cc b/src/trace_processor/importers/systrace/systrace_parser.cc
index 41237d2..a22adeb 100644
--- a/src/trace_processor/importers/systrace/systrace_parser.cc
+++ b/src/trace_processor/importers/systrace/systrace_parser.cc
@@ -28,6 +28,8 @@
 SystraceParser::SystraceParser(TraceProcessorContext* ctx)
     : context_(ctx), lmk_id_(ctx->storage->InternString("mem.lmk")) {}
 
+SystraceParser::~SystraceParser() = default;
+
 void SystraceParser::ParsePrintEvent(int64_t ts,
                                      uint32_t pid,
                                      base::StringView event) {
@@ -71,7 +73,7 @@
     context_->storage->IncrementStats(stats::systrace_parse_failure);
     return;
   }
-  context_->systrace_parser->ParseSystracePoint(ts, pid, point);
+  ParseSystracePoint(ts, pid, point);
 }
 
 void SystraceParser::ParseSdeTracingMarkWrite(int64_t ts,
@@ -95,7 +97,7 @@
     return;
   }
 
-  context_->systrace_parser->ParseSystracePoint(ts, pid, point);
+  ParseSystracePoint(ts, pid, point);
 }
 
 void SystraceParser::ParseSystracePoint(
diff --git a/src/trace_processor/importers/systrace/systrace_parser.h b/src/trace_processor/importers/systrace/systrace_parser.h
index ef39bd3..97fd337 100644
--- a/src/trace_processor/importers/systrace/systrace_parser.h
+++ b/src/trace_processor/importers/systrace/systrace_parser.h
@@ -187,9 +187,15 @@
 
 }  // namespace systrace_utils
 
-class SystraceParser {
+class SystraceParser : public Destructible {
  public:
-  explicit SystraceParser(TraceProcessorContext*);
+  static SystraceParser* GetOrCreate(TraceProcessorContext* context) {
+    if (!context->systrace_parser) {
+      context->systrace_parser.reset(new SystraceParser(context));
+    }
+    return static_cast<SystraceParser*>(context->systrace_parser.get());
+  }
+  ~SystraceParser() override;
 
   void ParsePrintEvent(int64_t ts, uint32_t pid, base::StringView event);
 
@@ -209,6 +215,7 @@
                       int64_t value);
 
  private:
+  explicit SystraceParser(TraceProcessorContext*);
   void ParseSystracePoint(int64_t ts,
                           uint32_t pid,
                           systrace_utils::SystraceTracePoint event);
diff --git a/src/trace_processor/importers/systrace/systrace_trace_parser.cc b/src/trace_processor/importers/systrace/systrace_trace_parser.cc
index e96c3ea..734c566 100644
--- a/src/trace_processor/importers/systrace/systrace_trace_parser.cc
+++ b/src/trace_processor/importers/systrace/systrace_trace_parser.cc
@@ -200,7 +200,8 @@
         next_pid.value(), next_comm, next_prio.value());
   } else if (event_name == "tracing_mark_write" || event_name == "0" ||
              event_name == "print") {
-    context_->systrace_parser->ParsePrintEvent(ts, pid, args_str.c_str());
+    SystraceParser::GetOrCreate(context_)->ParsePrintEvent(ts, pid,
+                                                           args_str.c_str());
   } else if (event_name == "sched_wakeup") {
     auto comm = args["comm"];
     base::Optional<uint32_t> wakee_pid = base::StringToUInt32(args["pid"]);
diff --git a/src/trace_processor/trace_processor_context.cc b/src/trace_processor/trace_processor_context.cc
index f794d11..8c2b946 100644
--- a/src/trace_processor/trace_processor_context.cc
+++ b/src/trace_processor/trace_processor_context.cc
@@ -26,7 +26,6 @@
 #include "src/trace_processor/importers/json/json_trace_parser.h"
 #include "src/trace_processor/importers/proto/proto_trace_parser.h"
 #include "src/trace_processor/importers/proto/track_event_module.h"
-#include "src/trace_processor/importers/systrace/systrace_parser.h"
 #include "src/trace_processor/process_tracker.h"
 #include "src/trace_processor/slice_tracker.h"
 #include "src/trace_processor/stack_profile_tracker.h"
diff --git a/src/trace_processor/trace_processor_context.h b/src/trace_processor/trace_processor_context.h
index 9334b91..3e7dc86 100644
--- a/src/trace_processor/trace_processor_context.h
+++ b/src/trace_processor/trace_processor_context.h
@@ -37,7 +37,6 @@
 class HeapProfileTracker;
 class ProcessTracker;
 class SliceTracker;
-class SystraceParser;
 class TraceParser;
 class TraceSorter;
 class TraceStorage;
@@ -61,7 +60,6 @@
   std::unique_ptr<TraceSorter> sorter;
   std::unique_ptr<ChunkedTraceReader> chunk_reader;
   std::unique_ptr<HeapProfileTracker> heap_profile_tracker;
-  std::unique_ptr<SystraceParser> systrace_parser;
   std::unique_ptr<BinderTracker> binder_tracker;
 
   // These fields are stored as pointers to Destructible objects rather than
@@ -71,6 +69,7 @@
   // e.g. SyscallTracker::GetOrCreate(context).
   std::unique_ptr<Destructible> syscall_tracker;  // SyscallTracker
   std::unique_ptr<Destructible> sched_tracker;    // SchedEventTracker
+  std::unique_ptr<Destructible> systrace_parser;  // SystraceParser
 
   // The module at the index N is registered to handle field id N in
   // TracePacket.
diff --git a/src/trace_processor/trace_processor_storage_impl.cc b/src/trace_processor/trace_processor_storage_impl.cc
index 8f12f71..30d9405 100644
--- a/src/trace_processor/trace_processor_storage_impl.cc
+++ b/src/trace_processor/trace_processor_storage_impl.cc
@@ -27,7 +27,6 @@
 #include "src/trace_processor/importers/proto/proto_importer_module.h"
 #include "src/trace_processor/importers/proto/proto_trace_tokenizer.h"
 #include "src/trace_processor/importers/proto/track_event_module.h"
-#include "src/trace_processor/importers/systrace/systrace_parser.h"
 #include "src/trace_processor/importers/systrace/systrace_trace_parser.h"
 #include "src/trace_processor/process_tracker.h"
 #include "src/trace_processor/slice_tracker.h"
@@ -50,7 +49,6 @@
   context_.clock_tracker.reset(new ClockTracker(&context_));
   context_.heap_profile_tracker.reset(new HeapProfileTracker(&context_));
 #if PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
-  context_.systrace_parser.reset(new SystraceParser(&context_));
   context_.binder_tracker.reset(new BinderTracker(&context_));
 #endif  // PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)