processor: Support TrackDescriptor's parent_uuid + pid/tid reuse

Refactors tokenization and parsing of TrackDescriptors so that:
 - Only a single ProcessDescriptor track is supported per process.
 - Only a single ThreadDescriptor track is supported per thread.
 - Such a process/thread track is merged with slice-type system events
   into a single track.
 - Other tracks (e.g. async tracks) can be associated with a thread
   or process using the "parent_uuid" field.
 - pid/tid reuse (i.e. new process/thread spawns with same pid/tid
   after old process/thread terminates) is detected based on changing
   uuids of Process/ThreadDescriptor tracks.

To accomplish this, tokenization now only makes reservations for tracks
without actually inserting anything into the track table - since
TrackDescriptors may appear in any order in the file, and we cannot
know the track's type/context until we see its parent's descriptor.

During parsing, the reservations will be resolved and inserted into the
track table. If the uuid of a process's or thread's track changes, we
assume that the pid/tid of the process/thread was reused.

Change-Id: Iec1d019db211773eb15ee517ae0dac1ce87553c9
diff --git a/src/trace_processor/export_json_unittest.cc b/src/trace_processor/export_json_unittest.cc
index e572d67..a0050df 100644
--- a/src/trace_processor/export_json_unittest.cc
+++ b/src/trace_processor/export_json_unittest.cc
@@ -119,8 +119,7 @@
   const char* kName = "name";
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(kThreadID);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -166,8 +165,7 @@
   const char* kName = "name";
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(kThreadID);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -225,13 +223,14 @@
   EXPECT_EQ(event["args"]["name"].asString(), kName);
 }
 
-TEST_F(ExportJsonTest, WrongTrackTypeIgnored) {
+TEST_F(ExportJsonTest, SystemEventsIgnored) {
   constexpr int64_t kCookie = 22;
   TrackId track = context_.track_tracker->InternAndroidAsyncTrack(
       /*name=*/0, /*upid=*/0, kCookie);
   context_.args_tracker->Flush();  // Flush track args.
 
-  StringId cat_id = context_.storage->InternString("cat");
+  // System events have no category.
+  StringId cat_id = kNullStringId;
   StringId name_id = context_.storage->InternString("name");
   context_.storage->mutable_slice_table()->Insert(
       {0, 0, track.value, cat_id, name_id, 0, 0, 0});
@@ -406,8 +405,7 @@
   const char* kSrc = "source_file.cc";
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -451,8 +449,7 @@
   TraceStorage* storage = context_.storage.get();
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = storage->InternString(base::StringView(kCategory));
   StringId name_id = storage->InternString(base::StringView(kName));
@@ -501,8 +498,7 @@
   double kValues[] = {1.234, 2.345};
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -550,8 +546,7 @@
   uint64_t kValue1 = std::numeric_limits<uint64_t>::max();
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -595,8 +590,7 @@
   int kValues[] = {123, 234};
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -643,8 +637,7 @@
   int kValues[] = {123, 234};
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -691,8 +684,7 @@
   const char* kName = "name";
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -761,8 +753,7 @@
   const char* kName = "name";
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(kThreadID);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));
@@ -1241,8 +1232,7 @@
 
 TEST_F(ExportJsonTest, ArgumentFilter) {
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(0);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
 
   StringId cat_id = context_.storage->InternString(base::StringView("cat"));
@@ -1354,8 +1344,7 @@
   const char* kName = "name";
 
   UniqueTid utid = context_.process_tracker->GetOrCreateThread(kThreadID);
-  TrackId track =
-      context_.track_tracker->GetOrCreateDescriptorTrackForThread(utid);
+  TrackId track = context_.track_tracker->InternThreadTrack(utid);
   context_.args_tracker->Flush();  // Flush track args.
   StringId cat_id = context_.storage->InternString(base::StringView(kCategory));
   StringId name_id = context_.storage->InternString(base::StringView(kName));