trace_processor: Migrate SchedEventTracker 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: I6b340067124c68aa17175cb0d3def7fd28ac83f6
diff --git a/src/trace_processor/event_tracker_unittest.cc b/src/trace_processor/event_tracker_unittest.cc
index 9fdedac..61968ab 100644
--- a/src/trace_processor/event_tracker_unittest.cc
+++ b/src/trace_processor/event_tracker_unittest.cc
@@ -40,12 +40,13 @@
     context.event_tracker.reset(new EventTracker(&context));
     context.track_tracker.reset(new TrackTracker(&context));
 #if PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
-    context.sched_tracker.reset(new SchedEventTracker(&context));
+    sched_tracker = SchedEventTracker::GetOrCreate(&context);
 #endif  // PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
   }
 
  protected:
   TraceProcessorContext context;
+  SchedEventTracker* sched_tracker;
 };
 
 #if PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
@@ -60,14 +61,12 @@
   int32_t prio = 1024;
 
   const auto& timestamps = context.storage->slices().start_ns();
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp, pid_1, kCommProc2,
-                                         prio, prev_state, pid_2, kCommProc1,
-                                         prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp, pid_1, kCommProc2, prio,
+                                 prev_state, pid_2, kCommProc1, prio);
   ASSERT_EQ(timestamps.size(), 1u);
 
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, pid_2, kCommProc1,
-                                         prio, prev_state, pid_1, kCommProc2,
-                                         prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp + 1, pid_2, kCommProc1, prio,
+                                 prev_state, pid_1, kCommProc2, prio);
 
   ASSERT_EQ(timestamps.size(), 2ul);
   ASSERT_EQ(timestamps[0], timestamp);
@@ -88,20 +87,20 @@
   int32_t prio = 1024;
 
   const auto& timestamps = context.storage->slices().start_ns();
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/4, kCommProc2,
-                                         prio, prev_state,
-                                         /*tid=*/2, kCommProc1, prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/4, kCommProc2, prio,
+                                 prev_state,
+                                 /*tid=*/2, kCommProc1, prio);
   ASSERT_EQ(timestamps.size(), 1u);
 
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/2,
-                                         kCommProc1, prio, prev_state,
-                                         /*tid=*/4, kCommProc2, prio);
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp + 11, /*tid=*/4,
-                                         kCommProc2, prio, prev_state,
-                                         /*tid=*/2, kCommProc1, prio);
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp + 31, /*tid=*/2,
-                                         kCommProc1, prio, prev_state,
-                                         /*tid=*/4, kCommProc2, prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/2, kCommProc1,
+                                 prio, prev_state,
+                                 /*tid=*/4, kCommProc2, prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp + 11, /*tid=*/4, kCommProc2,
+                                 prio, prev_state,
+                                 /*tid=*/2, kCommProc1, prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp + 31, /*tid=*/2, kCommProc1,
+                                 prio, prev_state,
+                                 /*tid=*/4, kCommProc2, prio);
 
   ASSERT_EQ(timestamps.size(), 4ul);
   ASSERT_EQ(timestamps[0], timestamp);
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.cc b/src/trace_processor/importers/ftrace/ftrace_parser.cc
index d5e68ef..0d89512 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.cc
@@ -188,20 +188,21 @@
                                             const TimestampedTracePiece& ttp) {
   using protos::pbzero::FtraceEvent;
   int64_t ts = ttp.timestamp;
+  SchedEventTracker* sched_tracker = SchedEventTracker::GetOrCreate(context_);
 
   // Handle the (optional) alternative encoding format for sched_switch.
   if (ttp.inline_event.type == InlineEvent::Type::kSchedSwitch) {
     const auto& event = ttp.inline_event.sched_switch;
-    context_->sched_tracker->PushSchedSwitchCompact(
-        cpu, ts, event.prev_state, static_cast<uint32_t>(event.next_pid),
-        event.next_prio, event.next_comm);
+    sched_tracker->PushSchedSwitchCompact(cpu, ts, event.prev_state,
+                                          static_cast<uint32_t>(event.next_pid),
+                                          event.next_prio, event.next_comm);
     return util::OkStatus();
   }
 
   // Handle the (optional) alternative encoding format for sched_waking.
   if (ttp.inline_event.type == InlineEvent::Type::kSchedWaking) {
     const auto& event = ttp.inline_event.sched_waking;
-    context_->sched_tracker->PushSchedWakingCompact(
+    sched_tracker->PushSchedWakingCompact(
         cpu, ts, static_cast<uint32_t>(event.pid), event.target_cpu, event.prio,
         event.comm);
     return util::OkStatus();
@@ -465,7 +466,7 @@
   protos::pbzero::SchedSwitchFtraceEvent::Decoder ss(blob.data, blob.size);
   uint32_t prev_pid = static_cast<uint32_t>(ss.prev_pid());
   uint32_t next_pid = static_cast<uint32_t>(ss.next_pid());
-  context_->sched_tracker->PushSchedSwitch(
+  SchedEventTracker::GetOrCreate(context_)->PushSchedSwitch(
       cpu, ts, prev_pid, ss.prev_comm(), ss.prev_prio(), ss.prev_state(),
       next_pid, ss.next_comm(), ss.next_prio());
 }
diff --git a/src/trace_processor/importers/ftrace/sched_event_tracker.h b/src/trace_processor/importers/ftrace/sched_event_tracker.h
index 84ebd53..7a141ff 100644
--- a/src/trace_processor/importers/ftrace/sched_event_tracker.h
+++ b/src/trace_processor/importers/ftrace/sched_event_tracker.h
@@ -22,21 +22,29 @@
 
 #include "perfetto/ext/base/string_view.h"
 #include "perfetto/ext/base/utils.h"
+#include "src/trace_processor/destructible.h"
+#include "src/trace_processor/trace_processor_context.h"
 #include "src/trace_processor/trace_storage.h"
 
 namespace perfetto {
 namespace trace_processor {
 
-class TraceProcessorContext;
 class EventTracker;
 
 // Tracks sched events and stores them into the storage as sched slices.
-class SchedEventTracker {
+class SchedEventTracker : public Destructible {
  public:
+  // Declared public for testing only.
   explicit SchedEventTracker(TraceProcessorContext*);
   SchedEventTracker(const SchedEventTracker&) = delete;
   SchedEventTracker& operator=(const SchedEventTracker&) = delete;
-  virtual ~SchedEventTracker();
+  ~SchedEventTracker() override;
+  static SchedEventTracker* GetOrCreate(TraceProcessorContext* context) {
+    if (!context->sched_tracker) {
+      context->sched_tracker.reset(new SchedEventTracker(context));
+    }
+    return static_cast<SchedEventTracker*>(context->sched_tracker.get());
+  }
 
   // This method is called when a sched_switch event is seen in the trace.
   // Virtual for testing.
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 469a0cb..0bd7928 100644
--- a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
+++ b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
@@ -98,7 +98,6 @@
  public:
   MockSchedEventTracker(TraceProcessorContext* context)
       : SchedEventTracker(context) {}
-  virtual ~MockSchedEventTracker() = default;
 
   MOCK_METHOD9(PushSchedSwitch,
                void(uint32_t cpu,
diff --git a/src/trace_processor/importers/systrace/systrace_trace_parser.cc b/src/trace_processor/importers/systrace/systrace_trace_parser.cc
index 33d5cb1..e96c3ea 100644
--- a/src/trace_processor/importers/systrace/systrace_trace_parser.cc
+++ b/src/trace_processor/importers/systrace/systrace_trace_parser.cc
@@ -195,7 +195,7 @@
       return util::Status("Could not parse sched_switch");
     }
 
-    context_->sched_tracker->PushSchedSwitch(
+    SchedEventTracker::GetOrCreate(context_)->PushSchedSwitch(
         cpu, ts, prev_pid.value(), prev_comm, prev_prio.value(), prev_state,
         next_pid.value(), next_comm, next_prio.value());
   } else if (event_name == "tracing_mark_write" || event_name == "0" ||
diff --git a/src/trace_processor/process_tracker_unittest.cc b/src/trace_processor/process_tracker_unittest.cc
index ad971a5..1122a99 100644
--- a/src/trace_processor/process_tracker_unittest.cc
+++ b/src/trace_processor/process_tracker_unittest.cc
@@ -37,9 +37,6 @@
     context.args_tracker.reset(new ArgsTracker(&context));
     context.process_tracker.reset(new ProcessTracker(&context));
     context.event_tracker.reset(new EventTracker(&context));
-#if PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
-    context.sched_tracker.reset(new SchedEventTracker(&context));
-#endif  // PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
   }
 
  protected:
@@ -97,13 +94,14 @@
   static const char kCommProc1[] = "process1";
   static const char kCommProc2[] = "process2";
   int32_t prio = 1024;
+  SchedEventTracker* sched_tracker = SchedEventTracker::GetOrCreate(&context);
 
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, kCommProc2,
-                                         prio, prev_state,
-                                         /*tid=*/4, kCommProc1, prio);
-  context.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
-                                         kCommProc1, prio, prev_state,
-                                         /*tid=*/1, kCommProc2, prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, kCommProc2, prio,
+                                 prev_state,
+                                 /*tid=*/4, kCommProc1, prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4, kCommProc1,
+                                 prio, prev_state,
+                                 /*tid=*/1, kCommProc2, prio);
 
   context.process_tracker->SetProcessMetadata(2, base::nullopt, "test");
   context.process_tracker->UpdateThread(4, 2);
diff --git a/src/trace_processor/sched_slice_table_unittest.cc b/src/trace_processor/sched_slice_table_unittest.cc
index 655033a..f9131ae 100644
--- a/src/trace_processor/sched_slice_table_unittest.cc
+++ b/src/trace_processor/sched_slice_table_unittest.cc
@@ -44,7 +44,7 @@
     context_.args_tracker.reset(new ArgsTracker(&context_));
     context_.process_tracker.reset(new ProcessTracker(&context_));
     context_.event_tracker.reset(new EventTracker(&context_));
-    context_.sched_tracker.reset(new SchedEventTracker(&context_));
+    sched_tracker_ = SchedEventTracker::GetOrCreate(&context_);
 
     SchedSliceTable::RegisterTable(db_.get(), context_.storage.get());
   }
@@ -61,6 +61,7 @@
   TraceProcessorContext context_;
   ScopedDb db_;
   ScopedStmt stmt_;
+  SchedEventTracker* sched_tracker_;
 };
 
 TEST_F(SchedSliceTableTest, RowsReturnedInCorrectOrderWithinCpu) {
@@ -72,18 +73,14 @@
   static const char kCommProc2[] = "process2";
   uint32_t pid_2 = 4;
   int32_t prio = 1024;
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp, pid_1, kCommProc2,
-                                          prio, prev_state, pid_2, kCommProc1,
-                                          prio);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 3, pid_2, kCommProc1,
-                                          prio, prev_state, pid_1, kCommProc2,
-                                          prio);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 4, pid_1, kCommProc2,
-                                          prio, prev_state, pid_2, kCommProc1,
-                                          prio);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 10, pid_2,
-                                          kCommProc1, prio, prev_state, pid_1,
-                                          kCommProc2, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp, pid_1, kCommProc2, prio,
+                                  prev_state, pid_2, kCommProc1, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp + 3, pid_2, kCommProc1, prio,
+                                  prev_state, pid_1, kCommProc2, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp + 4, pid_1, kCommProc2, prio,
+                                  prev_state, pid_2, kCommProc1, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp + 10, pid_2, kCommProc1, prio,
+                                  prev_state, pid_1, kCommProc2, prio);
 
   PrepareValidStatement(
       "SELECT dur, ts, cpu FROM sched where dur != 0 ORDER BY dur");
@@ -117,24 +114,18 @@
   static const char kCommProc2[] = "process2";
   uint32_t pid_2 = 4;
   int32_t prio = 1024;
-  context_.sched_tracker->PushSchedSwitch(cpu_3, timestamp - 2, pid_1,
-                                          kCommProc2, prio, prev_state, pid_2,
-                                          kCommProc1, prio);
-  context_.sched_tracker->PushSchedSwitch(cpu_3, timestamp - 1, pid_2,
-                                          kCommProc1, prio, prev_state, pid_1,
-                                          kCommProc2, prio);
-  context_.sched_tracker->PushSchedSwitch(cpu_1, timestamp, pid_1, kCommProc2,
-                                          prio, prev_state, pid_2, kCommProc1,
-                                          prio);
-  context_.sched_tracker->PushSchedSwitch(cpu_2, timestamp + 3, pid_2,
-                                          kCommProc1, prio, prev_state, pid_1,
-                                          kCommProc2, prio);
-  context_.sched_tracker->PushSchedSwitch(cpu_1, timestamp + 4, pid_2,
-                                          kCommProc1, prio, prev_state, pid_1,
-                                          kCommProc2, prio);
-  context_.sched_tracker->PushSchedSwitch(cpu_2, timestamp + 10, pid_1,
-                                          kCommProc2, prio, prev_state, pid_2,
-                                          kCommProc1, prio);
+  sched_tracker_->PushSchedSwitch(cpu_3, timestamp - 2, pid_1, kCommProc2, prio,
+                                  prev_state, pid_2, kCommProc1, prio);
+  sched_tracker_->PushSchedSwitch(cpu_3, timestamp - 1, pid_2, kCommProc1, prio,
+                                  prev_state, pid_1, kCommProc2, prio);
+  sched_tracker_->PushSchedSwitch(cpu_1, timestamp, pid_1, kCommProc2, prio,
+                                  prev_state, pid_2, kCommProc1, prio);
+  sched_tracker_->PushSchedSwitch(cpu_2, timestamp + 3, pid_2, kCommProc1, prio,
+                                  prev_state, pid_1, kCommProc2, prio);
+  sched_tracker_->PushSchedSwitch(cpu_1, timestamp + 4, pid_2, kCommProc1, prio,
+                                  prev_state, pid_1, kCommProc2, prio);
+  sched_tracker_->PushSchedSwitch(cpu_2, timestamp + 10, pid_1, kCommProc2,
+                                  prio, prev_state, pid_2, kCommProc1, prio);
 
   PrepareValidStatement(
       "SELECT dur, ts, cpu FROM sched where dur != 0 ORDER BY dur desc");
@@ -167,18 +158,14 @@
   static const char kCommProc2[] = "process2";
   uint32_t pid_2 = 4;
   int32_t prio = 1024;
-  context_.sched_tracker->PushSchedSwitch(cpu_1, timestamp, pid_1, kCommProc2,
-                                          prio, prev_state, pid_2, kCommProc1,
-                                          prio);
-  context_.sched_tracker->PushSchedSwitch(cpu_2, timestamp + 3, pid_2,
-                                          kCommProc1, prio, prev_state, pid_1,
-                                          kCommProc2, prio);
-  context_.sched_tracker->PushSchedSwitch(cpu_1, timestamp + 4, pid_2,
-                                          kCommProc1, prio, prev_state, pid_1,
-                                          kCommProc2, prio);
-  context_.sched_tracker->PushSchedSwitch(cpu_2, timestamp + 10, pid_1,
-                                          kCommProc2, prio, prev_state, pid_2,
-                                          kCommProc1, prio);
+  sched_tracker_->PushSchedSwitch(cpu_1, timestamp, pid_1, kCommProc2, prio,
+                                  prev_state, pid_2, kCommProc1, prio);
+  sched_tracker_->PushSchedSwitch(cpu_2, timestamp + 3, pid_2, kCommProc1, prio,
+                                  prev_state, pid_1, kCommProc2, prio);
+  sched_tracker_->PushSchedSwitch(cpu_1, timestamp + 4, pid_2, kCommProc1, prio,
+                                  prev_state, pid_1, kCommProc2, prio);
+  sched_tracker_->PushSchedSwitch(cpu_2, timestamp + 10, pid_1, kCommProc2,
+                                  prio, prev_state, pid_2, kCommProc1, prio);
 
   PrepareValidStatement(
       "SELECT dur, ts, cpu FROM sched WHERE dur != 0 and cpu = 3");
@@ -200,18 +187,14 @@
   static const char kCommProc2[] = "process2";
   uint32_t pid_2 = 4;
   int32_t prio = 1024;
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp, pid_1, kCommProc2,
-                                          prio, prev_state, pid_2, kCommProc1,
-                                          prio);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 3, pid_2, kCommProc1,
-                                          prio, prev_state, pid_1, kCommProc2,
-                                          prio);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 4, pid_1, kCommProc2,
-                                          prio, prev_state, pid_2, kCommProc1,
-                                          prio);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 10, pid_2,
-                                          kCommProc1, prio, prev_state, pid_1,
-                                          kCommProc2, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp, pid_1, kCommProc2, prio,
+                                  prev_state, pid_2, kCommProc1, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp + 3, pid_2, kCommProc1, prio,
+                                  prev_state, pid_1, kCommProc2, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp + 4, pid_1, kCommProc2, prio,
+                                  prev_state, pid_2, kCommProc1, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp + 10, pid_2, kCommProc1, prio,
+                                  prev_state, pid_1, kCommProc2, prio);
 
   PrepareValidStatement("SELECT utid FROM sched where dur != 0 ORDER BY utid");
 
@@ -238,12 +221,12 @@
   // Fill |cpu_5| and |cpu_7) with one sched switch per time unit starting,
   // respectively, @ T=50 and T=70.
   for (int64_t i = 0; i <= 11; i++) {
-    context_.sched_tracker->PushSchedSwitch(cpu_5, 50 + i, pid_1, "pid_1", prio,
-                                            prev_state, pid_1, "pid_1", prio);
+    sched_tracker_->PushSchedSwitch(cpu_5, 50 + i, pid_1, "pid_1", prio,
+                                    prev_state, pid_1, "pid_1", prio);
   }
   for (int64_t i = 0; i <= 11; i++) {
-    context_.sched_tracker->PushSchedSwitch(cpu_7, 70 + i, pid_2, "pid_2", prio,
-                                            prev_state, pid_2, "pid_2", prio);
+    sched_tracker_->PushSchedSwitch(cpu_7, 70 + i, pid_2, "pid_2", prio,
+                                    prev_state, pid_2, "pid_2", prio);
   }
 
   auto query = [this](const std::string& where_clauses) {
diff --git a/src/trace_processor/thread_table_unittest.cc b/src/trace_processor/thread_table_unittest.cc
index 6d5427c..03c6647 100644
--- a/src/trace_processor/thread_table_unittest.cc
+++ b/src/trace_processor/thread_table_unittest.cc
@@ -41,7 +41,7 @@
     context_.args_tracker.reset(new ArgsTracker(&context_));
     context_.process_tracker.reset(new ProcessTracker(&context_));
     context_.event_tracker.reset(new EventTracker(&context_));
-    context_.sched_tracker.reset(new SchedEventTracker(&context_));
+    sched_tracker_ = SchedEventTracker::GetOrCreate(&context_);
 
     ThreadTable::RegisterTable(db_.get(), context_.storage.get());
     ProcessTable::RegisterTable(db_.get(), context_.storage.get());
@@ -63,6 +63,7 @@
   TraceProcessorContext context_;
   ScopedDb db_;
   ScopedStmt stmt_;
+  SchedEventTracker* sched_tracker_;
 };
 
 TEST_F(ThreadTableUnittest, Select) {
@@ -73,12 +74,12 @@
   static const char kThreadName2[] = "thread2";
   int32_t prio = 1024;
 
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1,
-                                          kThreadName2, prio, prev_state,
-                                          /*tid=*/4, kThreadName1, prio);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
-                                          kThreadName1, prio, prev_state,
-                                          /*tid=*/1, kThreadName2, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp, /*tid=*/1, kThreadName2, prio,
+                                  prev_state,
+                                  /*tid=*/4, kThreadName1, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4, kThreadName1,
+                                  prio, prev_state,
+                                  /*tid=*/1, kThreadName2, prio);
 
   context_.process_tracker->SetProcessMetadata(2, base::nullopt, "test");
   context_.process_tracker->UpdateThread(4 /*tid*/, 2 /*pid*/);
@@ -101,15 +102,15 @@
   static const char kThreadName2[] = "thread2";
   int32_t prio = 1024;
 
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1,
-                                          kThreadName2, prio, prev_state,
-                                          /*tid=*/4, kThreadName1, prio);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
-                                          kThreadName1, prio, prev_state,
-                                          /*tid=*/1, kThreadName2, prio);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 2, /*tid=*/1,
-                                          kThreadName2, prio, prev_state,
-                                          /*tid=*/4, kThreadName1, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp, /*tid=*/1, kThreadName2, prio,
+                                  prev_state,
+                                  /*tid=*/4, kThreadName1, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4, kThreadName1,
+                                  prio, prev_state,
+                                  /*tid=*/1, kThreadName2, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp + 2, /*tid=*/1, kThreadName2,
+                                  prio, prev_state,
+                                  /*tid=*/4, kThreadName1, prio);
 
   context_.process_tracker->SetProcessMetadata(2, base::nullopt, "test");
   context_.process_tracker->UpdateThread(4 /*tid*/, 2 /*pid*/);
@@ -134,12 +135,12 @@
   static const char kThreadName2[] = "thread2";
   int32_t prio = 1024;
 
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1,
-                                          kThreadName2, prio, prev_state,
-                                          /*tid=*/4, kThreadName1, prio);
-  context_.sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4,
-                                          kThreadName1, prio, prev_state,
-                                          /*tid=*/1, kThreadName2, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp, /*tid=*/1, kThreadName2, prio,
+                                  prev_state,
+                                  /*tid=*/4, kThreadName1, prio);
+  sched_tracker_->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4, kThreadName1,
+                                  prio, prev_state,
+                                  /*tid=*/1, kThreadName2, prio);
 
   // Also create a process for which we haven't seen any thread.
   context_.process_tracker->SetProcessMetadata(7, base::nullopt, "pid7");
diff --git a/src/trace_processor/trace_processor_context.cc b/src/trace_processor/trace_processor_context.cc
index 01f876b..f794d11 100644
--- a/src/trace_processor/trace_processor_context.cc
+++ b/src/trace_processor/trace_processor_context.cc
@@ -23,7 +23,6 @@
 #include "src/trace_processor/event_tracker.h"
 #include "src/trace_processor/heap_profile_tracker.h"
 #include "src/trace_processor/importers/ftrace/ftrace_module.h"
-#include "src/trace_processor/importers/ftrace/sched_event_tracker.h"
 #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"
diff --git a/src/trace_processor/trace_processor_context.h b/src/trace_processor/trace_processor_context.h
index ee362f2..9334b91 100644
--- a/src/trace_processor/trace_processor_context.h
+++ b/src/trace_processor/trace_processor_context.h
@@ -36,7 +36,6 @@
 class HeapGraphTracker;
 class HeapProfileTracker;
 class ProcessTracker;
-class SchedEventTracker;
 class SliceTracker;
 class SystraceParser;
 class TraceParser;
@@ -57,7 +56,6 @@
   std::unique_ptr<SliceTracker> slice_tracker;
   std::unique_ptr<ProcessTracker> process_tracker;
   std::unique_ptr<EventTracker> event_tracker;
-  std::unique_ptr<SchedEventTracker> sched_tracker;
   std::unique_ptr<ClockTracker> clock_tracker;
   std::unique_ptr<TraceParser> parser;
   std::unique_ptr<TraceSorter> sorter;
@@ -71,7 +69,8 @@
   // type is only available in the storage_full target. To access these fields,
   // use the GetOrCreate() method on their subclass type,
   // e.g. SyscallTracker::GetOrCreate(context).
-  std::unique_ptr<Destructible> syscall_tracker;  // SyscallTracker.
+  std::unique_ptr<Destructible> syscall_tracker;  // SyscallTracker
+  std::unique_ptr<Destructible> sched_tracker;    // SchedEventTracker
 
   // 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 3e97bd0..8f12f71 100644
--- a/src/trace_processor/trace_processor_storage_impl.cc
+++ b/src/trace_processor/trace_processor_storage_impl.cc
@@ -24,7 +24,6 @@
 #include "src/trace_processor/forwarding_trace_parser.h"
 #include "src/trace_processor/heap_profile_tracker.h"
 #include "src/trace_processor/importers/ftrace/ftrace_module.h"
-#include "src/trace_processor/importers/ftrace/sched_event_tracker.h"
 #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"
@@ -51,7 +50,6 @@
   context_.clock_tracker.reset(new ClockTracker(&context_));
   context_.heap_profile_tracker.reset(new HeapProfileTracker(&context_));
 #if PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
-  context_.sched_tracker.reset(new SchedEventTracker(&context_));
   context_.systrace_parser.reset(new SystraceParser(&context_));
   context_.binder_tracker.reset(new BinderTracker(&context_));
 #endif  // PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
@@ -95,7 +93,7 @@
   if (context_.sorter)
     context_.sorter->ExtractEventsForced();
 #if PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
-  context_.sched_tracker->FlushPendingEvents();
+  SchedEventTracker::GetOrCreate(&context_)->FlushPendingEvents();
 #endif  // PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE)
   context_.event_tracker->FlushPendingEvents();
   context_.slice_tracker->FlushPendingSlices();