Merge "tp: optimize SelectBvWithIv function in RowMap"
diff --git a/Android.bp b/Android.bp
index a7c4677..3e771c0 100644
--- a/Android.bp
+++ b/Android.bp
@@ -3692,6 +3692,7 @@
     srcs: [
         "protos/perfetto/metrics/android/android_trusty_workqueues.proto",
         "protos/perfetto/metrics/android/batt_metric.proto",
+        "protos/perfetto/metrics/android/binder_metric.proto",
         "protos/perfetto/metrics/android/camera_metric.proto",
         "protos/perfetto/metrics/android/camera_unagg_metric.proto",
         "protos/perfetto/metrics/android/cpu_metric.proto",
@@ -3760,6 +3761,7 @@
     srcs: [
         "protos/perfetto/metrics/android/android_trusty_workqueues.proto",
         "protos/perfetto/metrics/android/batt_metric.proto",
+        "protos/perfetto/metrics/android/binder_metric.proto",
         "protos/perfetto/metrics/android/camera_metric.proto",
         "protos/perfetto/metrics/android/camera_unagg_metric.proto",
         "protos/perfetto/metrics/android/cpu_metric.proto",
@@ -8386,6 +8388,7 @@
     name: "perfetto_src_trace_processor_metrics_sql_gen_amalgamated_sql_metrics",
     srcs: [
         "src/trace_processor/metrics/sql/android/android_batt.sql",
+        "src/trace_processor/metrics/sql/android/android_binder.sql",
         "src/trace_processor/metrics/sql/android/android_camera.sql",
         "src/trace_processor/metrics/sql/android/android_camera_unagg.sql",
         "src/trace_processor/metrics/sql/android/android_cpu.sql",
diff --git a/BUILD b/BUILD
index d9cfb6b..fa04d14 100644
--- a/BUILD
+++ b/BUILD
@@ -1052,6 +1052,7 @@
     name = "src_trace_processor_metrics_sql_gen_amalgamated_sql_metrics",
     srcs = [
         "src/trace_processor/metrics/sql/android/android_batt.sql",
+        "src/trace_processor/metrics/sql/android/android_binder.sql",
         "src/trace_processor/metrics/sql/android/android_camera.sql",
         "src/trace_processor/metrics/sql/android/android_camera_unagg.sql",
         "src/trace_processor/metrics/sql/android/android_cpu.sql",
@@ -2784,6 +2785,7 @@
     srcs = [
         "protos/perfetto/metrics/android/android_trusty_workqueues.proto",
         "protos/perfetto/metrics/android/batt_metric.proto",
+        "protos/perfetto/metrics/android/binder_metric.proto",
         "protos/perfetto/metrics/android/camera_metric.proto",
         "protos/perfetto/metrics/android/camera_unagg_metric.proto",
         "protos/perfetto/metrics/android/cpu_metric.proto",
diff --git a/protos/perfetto/config/perfetto_config.proto b/protos/perfetto/config/perfetto_config.proto
index cbcc81e..e36eb7c 100644
--- a/protos/perfetto/config/perfetto_config.proto
+++ b/protos/perfetto/config/perfetto_config.proto
@@ -659,12 +659,11 @@
   // multiple.
   optional uint32 proc_stats_cache_ttl_ms = 6;
 
-  // Whether to record /proc/tid/time_in_state.
-  optional bool record_thread_time_in_state = 7;
+  // DEPRECATED record_thread_time_in_state
+  reserved 7;
 
-  // Size of the cache for thread time_in_state cpu freq values.
-  // If not specificed, the default is used.
-  optional uint32 thread_time_in_state_cache_size = 8;
+  // DEPRECATED thread_time_in_state_cache_size
+  reserved 8;
 }
 
 // End of protos/perfetto/config/process_stats/process_stats_config.proto
diff --git a/protos/perfetto/config/process_stats/process_stats_config.proto b/protos/perfetto/config/process_stats/process_stats_config.proto
index cc7e4d4..4a0848d 100644
--- a/protos/perfetto/config/process_stats/process_stats_config.proto
+++ b/protos/perfetto/config/process_stats/process_stats_config.proto
@@ -57,10 +57,9 @@
   // multiple.
   optional uint32 proc_stats_cache_ttl_ms = 6;
 
-  // Whether to record /proc/tid/time_in_state.
-  optional bool record_thread_time_in_state = 7;
+  // DEPRECATED record_thread_time_in_state
+  reserved 7;
 
-  // Size of the cache for thread time_in_state cpu freq values.
-  // If not specificed, the default is used.
-  optional uint32 thread_time_in_state_cache_size = 8;
+  // DEPRECATED thread_time_in_state_cache_size
+  reserved 8;
 }
diff --git a/protos/perfetto/metrics/android/BUILD.gn b/protos/perfetto/metrics/android/BUILD.gn
index c32d093..8091fb7 100644
--- a/protos/perfetto/metrics/android/BUILD.gn
+++ b/protos/perfetto/metrics/android/BUILD.gn
@@ -22,6 +22,7 @@
   sources = [
     "android_trusty_workqueues.proto",
     "batt_metric.proto",
+    "binder_metric.proto",
     "camera_metric.proto",
     "camera_unagg_metric.proto",
     "cpu_metric.proto",
diff --git a/protos/perfetto/metrics/android/binder_metric.proto b/protos/perfetto/metrics/android/binder_metric.proto
new file mode 100644
index 0000000..f60d022
--- /dev/null
+++ b/protos/perfetto/metrics/android/binder_metric.proto
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package perfetto.protos;
+
+// This metric provides per-process Binder statistics for traces with binder_driver enabled
+// Specifically, transactions are categorized and counted
+message AndroidBinderMetric {
+  message PerProcessBreakdown {
+    optional string process_name = 1;
+    optional uint32 pid = 2;
+    optional string slice_name = 3;
+    optional uint32 count = 4;
+  }
+
+  repeated PerProcessBreakdown process_breakdown = 1;
+}
\ No newline at end of file
diff --git a/protos/perfetto/metrics/metrics.proto b/protos/perfetto/metrics/metrics.proto
index 8d521cc..55571c4 100644
--- a/protos/perfetto/metrics/metrics.proto
+++ b/protos/perfetto/metrics/metrics.proto
@@ -54,6 +54,7 @@
 import "protos/perfetto/metrics/android/trace_quality.proto";
 import "protos/perfetto/metrics/android/android_trusty_workqueues.proto";
 import "protos/perfetto/metrics/android/unsymbolized_frames.proto";
+import "protos/perfetto/metrics/android/binder_metric.proto";
 
 // Trace processor metadata
 message TraceMetadata {
@@ -99,7 +100,7 @@
 
 // Root message for all Perfetto-based metrics.
 //
-// Next id: 46
+// Next id: 47
 message TraceMetrics {
   reserved 4, 10, 13, 14, 16, 19;
 
@@ -222,6 +223,9 @@
   // Summary of other concurrent trace recording.
   optional AndroidOtherTracesMetric android_other_traces = 45;
 
+  // Per-process Binder transaction metrics.
+  optional AndroidBinderMetric android_binder = 46;
+
   // Demo extensions.
   extensions 450 to 499;
 
diff --git a/protos/perfetto/metrics/perfetto_merged_metrics.proto b/protos/perfetto/metrics/perfetto_merged_metrics.proto
index 8989e9f..c99b45a 100644
--- a/protos/perfetto/metrics/perfetto_merged_metrics.proto
+++ b/protos/perfetto/metrics/perfetto_merged_metrics.proto
@@ -65,6 +65,22 @@
 
 // End of protos/perfetto/metrics/android/batt_metric.proto
 
+// Begin of protos/perfetto/metrics/android/binder_metric.proto
+
+// This metric provides per-process Binder statistics for traces with binder_driver enabled
+// Specifically, transactions are categorized and counted
+message AndroidBinderMetric {
+  message PerProcessBreakdown {
+    optional string process_name = 1;
+    optional uint32 pid = 2;
+    optional string slice_name = 3;
+    optional uint32 count = 4;
+  }
+
+  repeated PerProcessBreakdown process_breakdown = 1;
+}
+// End of protos/perfetto/metrics/android/binder_metric.proto
+
 // Begin of protos/perfetto/metrics/android/camera_metric.proto
 
 message AndroidCameraMetric {
@@ -1524,7 +1540,7 @@
 
 // Root message for all Perfetto-based metrics.
 //
-// Next id: 46
+// Next id: 47
 message TraceMetrics {
   reserved 4, 10, 13, 14, 16, 19;
 
@@ -1647,6 +1663,9 @@
   // Summary of other concurrent trace recording.
   optional AndroidOtherTracesMetric android_other_traces = 45;
 
+  // Per-process Binder transaction metrics.
+  optional AndroidBinderMetric android_binder = 46;
+
   // Demo extensions.
   extensions 450 to 499;
 
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index 27c1e5d..2a1e323 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -659,12 +659,11 @@
   // multiple.
   optional uint32 proc_stats_cache_ttl_ms = 6;
 
-  // Whether to record /proc/tid/time_in_state.
-  optional bool record_thread_time_in_state = 7;
+  // DEPRECATED record_thread_time_in_state
+  reserved 7;
 
-  // Size of the cache for thread time_in_state cpu freq values.
-  // If not specificed, the default is used.
-  optional uint32 thread_time_in_state_cache_size = 8;
+  // DEPRECATED thread_time_in_state_cache_size
+  reserved 8;
 }
 
 // End of protos/perfetto/config/process_stats/process_stats_config.proto
@@ -9241,17 +9240,14 @@
   message Thread {
     optional int32 tid = 1;
 
-    // Pairs of frequency (represented as a (1-based) index to CpuInfo
-    // frequencies) and time at that frequency (represented as a number of
-    // ticks, see SystemInfo for the HZ (ticks / second) value to convert this
-    // to time). Frequencies with zero ticks are never uploaded. Read from
-    // /proc/tid/time_in_state.
-    repeated uint32 cpu_freq_indices = 2;
-    repeated uint64 cpu_freq_ticks = 3;
-    // Whether all frequencies with non-zero ticks are present in
-    // `cpu_freq_indices`. This marker is used to detect packets that describe
-    // time_in_state exhaustively.
-    optional bool cpu_freq_full = 4;
+    // DEPRECATED cpu_freq_indices
+    reserved 2;
+
+    // DEPRECATED cpu_freq_ticks
+    reserved 3;
+
+    // DEPRECATED cpu_freq_full
+    reserved 4;
   }
 
   message Process {
diff --git a/protos/perfetto/trace/ps/process_stats.proto b/protos/perfetto/trace/ps/process_stats.proto
index df82c75..d647de2 100644
--- a/protos/perfetto/trace/ps/process_stats.proto
+++ b/protos/perfetto/trace/ps/process_stats.proto
@@ -30,17 +30,14 @@
   message Thread {
     optional int32 tid = 1;
 
-    // Pairs of frequency (represented as a (1-based) index to CpuInfo
-    // frequencies) and time at that frequency (represented as a number of
-    // ticks, see SystemInfo for the HZ (ticks / second) value to convert this
-    // to time). Frequencies with zero ticks are never uploaded. Read from
-    // /proc/tid/time_in_state.
-    repeated uint32 cpu_freq_indices = 2;
-    repeated uint64 cpu_freq_ticks = 3;
-    // Whether all frequencies with non-zero ticks are present in
-    // `cpu_freq_indices`. This marker is used to detect packets that describe
-    // time_in_state exhaustively.
-    optional bool cpu_freq_full = 4;
+    // DEPRECATED cpu_freq_indices
+    reserved 2;
+
+    // DEPRECATED cpu_freq_ticks
+    reserved 3;
+
+    // DEPRECATED cpu_freq_full
+    reserved 4;
   }
 
   message Process {
diff --git a/protos/perfetto/trace_processor/trace_processor.proto b/protos/perfetto/trace_processor/trace_processor.proto
index 2d19871..dacd930 100644
--- a/protos/perfetto/trace_processor/trace_processor.proto
+++ b/protos/perfetto/trace_processor/trace_processor.proto
@@ -41,7 +41,7 @@
   // every time a new feature that the UI depends on is being introduced (e.g.
   // new tables, new SQL operators, metrics that are required by the UI).
   // See also TraceProcessorVersion (below).
-  TRACE_PROCESSOR_CURRENT_API_VERSION = 3;
+  TRACE_PROCESSOR_CURRENT_API_VERSION = 4;
 }
 
 // At lowest level, the wire-format of the RPC procol is a linear sequence of
diff --git a/python/perfetto/trace_processor/metrics.descriptor b/python/perfetto/trace_processor/metrics.descriptor
index 5588fc6..81b6b62 100644
--- a/python/perfetto/trace_processor/metrics.descriptor
+++ b/python/perfetto/trace_processor/metrics.descriptor
Binary files differ
diff --git a/python/perfetto/trace_processor/metrics.descriptor.sha1 b/python/perfetto/trace_processor/metrics.descriptor.sha1
index 9128379..8d1166a 100644
--- a/python/perfetto/trace_processor/metrics.descriptor.sha1
+++ b/python/perfetto/trace_processor/metrics.descriptor.sha1
@@ -2,5 +2,5 @@
 // SHA1(tools/gen_binary_descriptors)
 // c4a38769074f8a8c2ffbf514b267919b5f2d47df
 // SHA1(protos/perfetto/metrics/metrics.proto)
-// 345fbfdfcdd221b820374ee35469035d1d86c5c1
+// 1555061bf1527fce27559876acaf3c31f82bf1d2
   
\ No newline at end of file
diff --git a/python/perfetto/trace_processor/trace_processor.descriptor b/python/perfetto/trace_processor/trace_processor.descriptor
index d8fe39e..7c0df2d 100644
--- a/python/perfetto/trace_processor/trace_processor.descriptor
+++ b/python/perfetto/trace_processor/trace_processor.descriptor
Binary files differ
diff --git a/python/perfetto/trace_processor/trace_processor.descriptor.sha1 b/python/perfetto/trace_processor/trace_processor.descriptor.sha1
index 3d9e075..d1ce3ae 100644
--- a/python/perfetto/trace_processor/trace_processor.descriptor.sha1
+++ b/python/perfetto/trace_processor/trace_processor.descriptor.sha1
@@ -2,5 +2,5 @@
 // SHA1(tools/gen_binary_descriptors)
 // c4a38769074f8a8c2ffbf514b267919b5f2d47df
 // SHA1(protos/perfetto/trace_processor/trace_processor.proto)
-// ea89764637957b3b71978972257aba2f0fddbfc9
+// 412428727ee668284c5c420fcc1d22459eced403
   
\ No newline at end of file
diff --git a/src/trace_processor/dynamic/thread_state_generator.cc b/src/trace_processor/dynamic/thread_state_generator.cc
index d307acc..18b1922 100644
--- a/src/trace_processor/dynamic/thread_state_generator.cc
+++ b/src/trace_processor/dynamic/thread_state_generator.cc
@@ -42,10 +42,7 @@
     const BitVector&,
     std::unique_ptr<Table>& table_return) {
   if (!unsorted_thread_state_table_) {
-    int64_t trace_end_ts =
-        context_->storage->GetTraceTimestampBoundsNs().second;
-
-    unsorted_thread_state_table_ = ComputeThreadStateTable(trace_end_ts);
+    unsorted_thread_state_table_ = ComputeThreadStateTable();
 
     // We explicitly sort by ts here as ComputeThreadStateTable does not insert
     // rows in sorted order but we expect our clients to always want to sort
@@ -62,7 +59,7 @@
 }
 
 std::unique_ptr<tables::ThreadStateTable>
-ThreadStateGenerator::ComputeThreadStateTable(int64_t trace_end_ts) {
+ThreadStateGenerator::ComputeThreadStateTable() {
   std::unique_ptr<tables::ThreadStateTable> table(new tables::ThreadStateTable(
       context_->storage->mutable_string_pool(), nullptr));
 
@@ -113,7 +110,7 @@
     // to process that event.
     int64_t min_ts = std::min({sched_ts, waking_ts, blocked_ts});
     if (min_ts == sched_ts) {
-      AddSchedEvent(sched, sched_idx++, state_map, trace_end_ts, table.get());
+      AddSchedEvent(sched, sched_idx++, state_map, table.get());
     } else if (min_ts == waking_ts) {
       AddWakingEvent(waking, waking_idx++, state_map);
     } else /* (min_ts == blocked_ts) */ {
@@ -135,7 +132,6 @@
 void ThreadStateGenerator::AddSchedEvent(const Table& sched,
                                          uint32_t sched_idx,
                                          TidInfoMap& state_map,
-                                         int64_t trace_end_ts,
                                          tables::ThreadStateTable* table) {
   int64_t ts = sched.GetTypedColumnByName<int64_t>("ts")[sched_idx];
   UniqueTid utid = sched.GetTypedColumnByName<uint32_t>("utid")[sched_idx];
@@ -171,15 +167,7 @@
   // Reset so we don't have any leftover data on the next round.
   *info = {};
 
-  // Undo the expansion of the final sched slice for each CPU to the end of the
-  // trace by setting the duration back to -1. This counteracts the code in
-  // SchedEventTracker::FlushPendingEvents
-  // TODO(lalitm): remove this hack when we stop expanding the last slice to the
-  // end of the trace.
   int64_t dur = sched.GetTypedColumnByName<int64_t>("dur")[sched_idx];
-  if (ts + dur == trace_end_ts) {
-    dur = -1;
-  }
 
   // Now add the sched slice itself as "Running" with the other fields
   // unchanged.
@@ -209,7 +197,6 @@
 void ThreadStateGenerator::AddWakingEvent(const Table& waking,
                                           uint32_t waking_idx,
                                           TidInfoMap& state_map) {
-  int64_t ts = waking.GetTypedColumnByName<int64_t>("ts")[waking_idx];
   UniqueTid utid = waking.GetTypedColumnByName<uint32_t>("utid")[waking_idx];
   ThreadSchedInfo* info = &state_map[utid];
 
@@ -236,6 +223,7 @@
 
   // Case 1 described above. In this situation, we should drop the waking
   // entirely.
+  int64_t ts = waking.GetTypedColumnByName<int64_t>("ts")[waking_idx];
   if (info->desched_ts && *info->desched_ts > ts) {
     return;
   }
@@ -245,6 +233,19 @@
   // already not set because we could have data-loss which leads to us getting
   // back to back waking for a single thread.
   info->runnable_ts = ts;
+
+  // We can't do anything better than ignoring any errors here.
+  // TODO(b/229983659): expose error messages properly once we move to real
+  // time.
+  base::Optional<Variadic> opt_value;
+  ArgSetId arg_set_id =
+      waking.GetTypedColumnByName<ArgSetId>("arg_set_id")[waking_idx];
+  base::Status status =
+      context_->storage->ExtractArg(arg_set_id, "waker_utid", &opt_value);
+  if (status.ok() && opt_value) {
+    PERFETTO_CHECK(opt_value->type == Variadic::Type::kUint);
+    info->runnable_waker_utid = static_cast<UniqueTid>(opt_value->uint_value);
+  }
 }
 
 Table::Schema ThreadStateGenerator::CreateSchema() {
@@ -298,6 +299,7 @@
     row.dur = end_ts ? *end_ts - row.ts : -1;
     row.state = runnable_string_id_;
     row.utid = utid;
+    row.waker_utid = info.runnable_waker_utid;
     table->Insert(row);
   }
 }
@@ -318,7 +320,8 @@
       context_->storage->ExtractArg(arg_set_id, "io_wait", &opt_value);
 
   // We can't do anything better than ignoring any errors here.
-  // TODO(lalitm): see if there's a better way to handle this.
+  // TODO(b/229983659): expose error messages properly once we move to real
+  // time.
   if (status.ok() && opt_value) {
     PERFETTO_CHECK(opt_value->type == Variadic::Type::kBool);
     info.io_wait = opt_value->bool_value;
diff --git a/src/trace_processor/dynamic/thread_state_generator.h b/src/trace_processor/dynamic/thread_state_generator.h
index 8e111de..9a4057f 100644
--- a/src/trace_processor/dynamic/thread_state_generator.h
+++ b/src/trace_processor/dynamic/thread_state_generator.h
@@ -45,8 +45,7 @@
                             std::unique_ptr<Table>& table_return) override;
 
   // Visible for testing.
-  std::unique_ptr<tables::ThreadStateTable> ComputeThreadStateTable(
-      int64_t trace_end_ts);
+  std::unique_ptr<tables::ThreadStateTable> ComputeThreadStateTable();
 
  private:
   struct ThreadSchedInfo {
@@ -56,6 +55,7 @@
     base::Optional<bool> io_wait;
     base::Optional<int64_t> runnable_ts;
     base::Optional<StringId> blocked_function;
+    base::Optional<UniqueTid> runnable_waker_utid;
   };
   using TidInfoMap = base::FlatHashMap<UniqueTid,
                                        ThreadSchedInfo,
@@ -66,7 +66,6 @@
   void AddSchedEvent(const Table& sched,
                      uint32_t sched_idx,
                      TidInfoMap& state_map,
-                     int64_t trace_end_ts,
                      tables::ThreadStateTable* table);
 
   void AddWakingEvent(const Table& wakeup,
diff --git a/src/trace_processor/dynamic/thread_state_generator_unittest.cc b/src/trace_processor/dynamic/thread_state_generator_unittest.cc
index bd15010..469fb3e 100644
--- a/src/trace_processor/dynamic/thread_state_generator_unittest.cc
+++ b/src/trace_processor/dynamic/thread_state_generator_unittest.cc
@@ -89,10 +89,8 @@
     context_.args_tracker->Flush();
   }
 
-  void RunThreadStateComputation(Ts trace_end_ts = Ts{
-                                     std::numeric_limits<int64_t>::max()}) {
-    unsorted_table_ =
-        thread_state_generator_->ComputeThreadStateTable(trace_end_ts.ts);
+  void RunThreadStateComputation() {
+    unsorted_table_ = thread_state_generator_->ComputeThreadStateTable();
     table_.reset(
         new Table(unsorted_table_->Sort({unsorted_table_->ts().ascending()})));
   }
@@ -293,11 +291,11 @@
   VerifyEndOfThreadState();
 }
 
-TEST_F(ThreadStateGeneratorUnittest, StrechedSchedIgnored) {
+TEST_F(ThreadStateGeneratorUnittest, HandlingNotFinishedSched) {
   ForwardSchedTo(Ts{10});
-  AddSched(Ts{100}, thread_a_, "");
+  AddSched(base::nullopt, thread_a_, "S");
 
-  RunThreadStateComputation(Ts{100});
+  RunThreadStateComputation();
 
   VerifyThreadState(Ts{10}, base::nullopt, thread_a_, kRunning);
 
@@ -306,11 +304,11 @@
 
 TEST_F(ThreadStateGeneratorUnittest, WakingAfterStrechedSched) {
   ForwardSchedTo(Ts{10});
-  AddSched(Ts{100}, thread_a_, "");
+  AddSched(base::nullopt, thread_a_, "");
 
   AddWaking(Ts{15}, thread_a_);
 
-  RunThreadStateComputation(Ts{100});
+  RunThreadStateComputation();
 
   VerifyThreadState(Ts{10}, base::nullopt, thread_a_, kRunning);
   VerifyThreadState(Ts{15}, base::nullopt, thread_a_, "R");
diff --git a/src/trace_processor/importers/ftrace/sched_event_tracker.cc b/src/trace_processor/importers/ftrace/sched_event_tracker.cc
index 62ded8c..6ae2a83 100644
--- a/src/trace_processor/importers/ftrace/sched_event_tracker.cc
+++ b/src/trace_processor/importers/ftrace/sched_event_tracker.cc
@@ -229,10 +229,11 @@
   }
 
   // Open a new scheduling slice, corresponding to the task that was
-  // just switched to.
+  // just switched to. Set the duration to -1, to indicate that the event is not
+  // finished. Duration will be updated later after event finish.
   auto* sched = context_->storage->mutable_sched_slice_table();
   auto row_and_id = sched->Insert(
-      {ts, 0 /* duration */, cpu, next_utid, kNullStringId, next_prio});
+      {ts, /* duration */ -1, cpu, next_utid, kNullStringId, next_prio});
   SchedId sched_id = row_and_id.id;
   return *sched->id().IndexOf(sched_id);
 }
@@ -325,31 +326,5 @@
       waker_utid_id_, Variadic::UnsignedInteger(curr_utid));
 }
 
-void SchedEventTracker::FlushPendingEvents() {
-  // TODO(lalitm): the day this method is called before end of trace, don't
-  // flush the sched events as they will probably be pushed in the next round
-  // of ftrace events.
-  int64_t end_ts = context_->storage->GetTraceTimestampBoundsNs().second;
-  auto* slices = context_->storage->mutable_sched_slice_table();
-  for (const auto& pending_sched : pending_sched_per_cpu_) {
-    uint32_t row = pending_sched.pending_slice_storage_idx;
-    if (row == std::numeric_limits<uint32_t>::max())
-      continue;
-
-    int64_t duration = end_ts - slices->ts()[row];
-    slices->mutable_dur()->Set(row, duration);
-
-    auto state = ftrace_utils::TaskState(ftrace_utils::TaskState::kRunnable);
-    auto id = context_->storage->InternString(state.ToString().data());
-    slices->mutable_end_state()->Set(row, id);
-  }
-
-  // Re-initialize the pending_sched_per_cpu_ vector with default values, we do
-  // this instead of calling .clear() to avoid having to frequently resize the
-  // vector.
-  std::fill(pending_sched_per_cpu_.begin(), pending_sched_per_cpu_.end(),
-            PendingSchedInfo{});
-}
-
 }  // namespace trace_processor
 }  // namespace perfetto
diff --git a/src/trace_processor/importers/ftrace/sched_event_tracker.h b/src/trace_processor/importers/ftrace/sched_event_tracker.h
index eff442c..5dc37b3 100644
--- a/src/trace_processor/importers/ftrace/sched_event_tracker.h
+++ b/src/trace_processor/importers/ftrace/sched_event_tracker.h
@@ -77,10 +77,6 @@
                               int32_t prio,
                               StringId comm_id);
 
-  // Called at the end of trace to flush any events which are pending to the
-  // storage.
-  void FlushPendingEvents();
-
  private:
   // Information retained from the preceding sched_switch seen on a given cpu.
   struct PendingSchedInfo {
diff --git a/src/trace_processor/metrics/sql/BUILD.gn b/src/trace_processor/metrics/sql/BUILD.gn
index f90c2a0..0ad6c5b 100644
--- a/src/trace_processor/metrics/sql/BUILD.gn
+++ b/src/trace_processor/metrics/sql/BUILD.gn
@@ -18,6 +18,7 @@
   "trace_metadata.sql",
   "trace_stats.sql",
   "android/android_batt.sql",
+  "android/android_binder.sql",
   "android/android_camera.sql",
   "android/android_camera_unagg.sql",
   "android/android_cpu.sql",
diff --git a/src/trace_processor/metrics/sql/android/android_binder.sql b/src/trace_processor/metrics/sql/android/android_binder.sql
new file mode 100644
index 0000000..752eed8
--- /dev/null
+++ b/src/trace_processor/metrics/sql/android/android_binder.sql
@@ -0,0 +1,47 @@
+--
+-- Copyright 2022 The Android Open Source Project
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+--     https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+
+-- Count Binder transactions per process
+CREATE VIEW binder_metrics_by_process AS
+SELECT
+  process.name as process_name,
+  process.pid as pid,
+  slice.name as slice_name,
+  COUNT(*) as event_count
+FROM slice
+  INNER JOIN thread_track ON slice.track_id=thread_track.id
+  INNER JOIN thread ON thread.utid=thread_track.utid
+  INNER JOIN process ON thread.upid=process.upid
+WHERE
+  slice.name like 'binder%'
+GROUP BY
+  process_name,
+  slice_name;
+
+CREATE VIEW android_binder_output AS
+SELECT AndroidBinderMetric(
+  'process_breakdown', (
+    SELECT RepeatedField(
+      AndroidBinderMetric_PerProcessBreakdown(
+        'process_name', process_name,
+        'pid', pid,
+        'slice_name', slice_name,
+        'count', event_count
+      )
+    )
+    FROM binder_metrics_by_process
+  )
+);
diff --git a/src/trace_processor/tables/slice_tables.h b/src/trace_processor/tables/slice_tables.h
index 629576c..67dd323 100644
--- a/src/trace_processor/tables/slice_tables.h
+++ b/src/trace_processor/tables/slice_tables.h
@@ -85,9 +85,10 @@
   C(int64_t, dur)                                           \
   C(base::Optional<uint32_t>, cpu)                          \
   C(uint32_t, utid)                                         \
-  C(StringPool::Id, state)                                  \
+  C(base::Optional<StringPool::Id>, state)                  \
   C(base::Optional<uint32_t>, io_wait)                      \
-  C(base::Optional<StringPool::Id>, blocked_function)
+  C(base::Optional<StringPool::Id>, blocked_function)       \
+  C(base::Optional<uint32_t>, waker_utid)
 
 PERFETTO_TP_TABLE(PERFETTO_TP_THREAD_STATE_TABLE_DEF);
 
diff --git a/src/trace_processor/trace_database_integrationtest.cc b/src/trace_processor/trace_database_integrationtest.cc
index f70d593..3c5c66e 100644
--- a/src/trace_processor/trace_database_integrationtest.cc
+++ b/src/trace_processor/trace_database_integrationtest.cc
@@ -133,7 +133,7 @@
       "where dur != 0 and utid != 0");
   ASSERT_TRUE(it.Next());
   ASSERT_EQ(it.Get(0).type, SqlValue::kLong);
-  ASSERT_EQ(it.Get(0).long_value, 139787);
+  ASSERT_EQ(it.Get(0).long_value, 139793);
   ASSERT_EQ(it.Get(1).type, SqlValue::kLong);
   ASSERT_EQ(it.Get(1).long_value, 19684308497);
   ASSERT_FALSE(it.Next());
diff --git a/src/trace_processor/trace_processor_impl.cc b/src/trace_processor/trace_processor_impl.cc
index 773ee66..6a42028 100644
--- a/src/trace_processor/trace_processor_impl.cc
+++ b/src/trace_processor/trace_processor_impl.cc
@@ -946,7 +946,6 @@
   RegisterDbTable(storage->flow_table());
   RegisterDbTable(storage->thread_slice_table());
   RegisterDbTable(storage->sched_slice_table());
-  RegisterDbTable(storage->legacy_instant_table());
   RegisterDbTable(storage->gpu_slice_table());
 
   RegisterDbTable(storage->track_table());
@@ -1024,7 +1023,6 @@
 
   TraceProcessorStorageImpl::NotifyEndOfFile();
 
-  SchedEventTracker::GetOrCreate(&context_)->FlushPendingEvents();
   context_.metadata_tracker->SetMetadata(
       metadata::trace_size_bytes,
       Variadic::Integer(static_cast<int64_t>(bytes_parsed_)));
diff --git a/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256 b/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256
index 80ea2f4..7fb4743 100644
--- a/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256
+++ b/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256
@@ -1 +1 @@
-436e358bbe14b492a48f369a4296fff45de2879308196ce9838ea1df7adcd7c8
\ No newline at end of file
+d0efe67d67d027f147eeb743d5c9e60607c89dfaa93be7c7c5af1b9965eccbd1
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256 b/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256
index 2e9be1c..3da7ed0 100644
--- a/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256
+++ b/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256
@@ -1 +1 @@
-69c67284528cb436f7fc541748db2c3e3118f77bed1803447cbb8158686daed9
\ No newline at end of file
+296867c695b408811139b6de52f5ada0f2b2da6c341d62b772c4542ed118c189
\ No newline at end of file
diff --git a/test/trace_processor/parsing/android_binder.out b/test/trace_processor/parsing/android_binder.out
new file mode 100644
index 0000000..ef53b12
--- /dev/null
+++ b/test/trace_processor/parsing/android_binder.out
@@ -0,0 +1,20 @@
+android_binder {
+  process_breakdown {
+    process_name: "test_process_a"
+    pid: 1
+    slice_name: "binder transaction"
+    count: 2
+  }
+  process_breakdown {
+    process_name: "test_process_b"
+    pid: 2
+    slice_name: "binder reply"
+    count: 1
+  }
+  process_breakdown {
+    process_name: "test_process_c"
+    pid: 3
+    slice_name: "binder reply"
+    count: 1
+  }
+}
\ No newline at end of file
diff --git a/test/trace_processor/parsing/android_binder.py b/test/trace_processor/parsing/android_binder.py
new file mode 100644
index 0000000..9cc29ba
--- /dev/null
+++ b/test/trace_processor/parsing/android_binder.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+# Copyright (C) 2022 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from os import sys, path
+
+import synth_common
+
+PROCESS_A_NAME = 'test_process_a'
+PROCESS_B_NAME = 'test_process_b'
+PROCESS_C_NAME = 'test_process_c'
+PROCESS_A_PID = 1
+PROCESS_B_PID = 2
+PROCESS_C_PID = 3
+PROCESS_A_PPID = 4
+PROCESS_B_PPID = 5
+PROCESS_C_PPID = 6
+PROCESS_A_TID = 7
+# These values need to be the same to keep track of process ids in kernel space
+PROCESS_B_TID = PROCESS_B_PID
+PROCESS_C_TID = PROCESS_C_PID
+
+trace = synth_common.create_trace()
+trace.add_packet()
+trace.add_process(PROCESS_A_PID, PROCESS_A_PPID, PROCESS_A_NAME)
+trace.add_process(PROCESS_B_PID, PROCESS_B_PPID, PROCESS_B_NAME)
+trace.add_process(PROCESS_C_PID, PROCESS_C_PPID, PROCESS_C_NAME)
+trace.add_thread(PROCESS_A_TID, PROCESS_A_PID, cmdline='Binder')
+trace.add_ftrace_packet(cpu=0)
+
+trace.add_binder_transaction(transaction_id=1, ts_start=1, ts_end=2, tid=PROCESS_A_TID,
+                             pid=PROCESS_A_PID, reply_id=2, reply_ts_start=3, reply_ts_end=4,
+                             reply_tid=PROCESS_B_TID, reply_pid=PROCESS_B_PID)
+trace.add_binder_transaction(transaction_id=3, ts_start=5, ts_end=6, tid=PROCESS_A_TID,
+                             pid=PROCESS_A_PID, reply_id=4, reply_ts_start=7, reply_ts_end=8,
+                             reply_tid=PROCESS_C_TID, reply_pid=PROCESS_C_PID)
+
+sys.stdout.buffer.write(trace.trace.SerializeToString())
\ No newline at end of file
diff --git a/test/trace_processor/parsing/android_sched_and_ps_end_reason_neq.out b/test/trace_processor/parsing/android_sched_and_ps_end_reason_neq.out
index fb9227a..3d9a00a 100644
--- a/test/trace_processor/parsing/android_sched_and_ps_end_reason_neq.out
+++ b/test/trace_processor/parsing/android_sched_and_ps_end_reason_neq.out
@@ -1,6 +1,6 @@
 "end_state","count(*)"
 "DK",30
 "I",82
-"R",91197
+"R",91189
 "R+",9428
 "S",110560
diff --git a/test/trace_processor/parsing/ftrace_with_tracing_start_list_sched_slice_spans.out b/test/trace_processor/parsing/ftrace_with_tracing_start_list_sched_slice_spans.out
index de5e654..f6748c7 100644
--- a/test/trace_processor/parsing/ftrace_with_tracing_start_list_sched_slice_spans.out
+++ b/test/trace_processor/parsing/ftrace_with_tracing_start_list_sched_slice_spans.out
@@ -1,3 +1,3 @@
 "ts","dur","tid"
 100,10,1
-110,0,2
+110,-1,2
diff --git a/test/trace_processor/parsing/index b/test/trace_processor/parsing/index
index 8011022..3ceeed7 100644
--- a/test/trace_processor/parsing/index
+++ b/test/trace_processor/parsing/index
@@ -153,3 +153,6 @@
 # coming from stderr before the TRACE: marker. See b/208691037.
 ../../data/atrace_uncompressed_b_208691037 sched_smoke.sql atrace_uncompressed_sched_count.out
 otheruuids.textproto android_other_traces otheruuids_android_other_traces.out
+
+# Per-process Binder transaction metrics
+android_binder.py android_binder android_binder.out
diff --git a/test/trace_processor/parsing/sched_blocked_proto.py b/test/trace_processor/parsing/sched_blocked_proto.py
index a6589f8..acc0fba 100644
--- a/test/trace_processor/parsing/sched_blocked_proto.py
+++ b/test/trace_processor/parsing/sched_blocked_proto.py
@@ -27,7 +27,10 @@
 trace.add_process(3, 0, "unblocker")
 
 trace.add_ftrace_packet(0)
-trace.add_sched_blocked_reason(ts=100, pid=1, io_wait=0, unblock_pid=3)
-trace.add_sched_blocked_reason(ts=110, pid=2, io_wait=1, unblock_pid=3)
+trace.add_sched(ts=10, prev_pid=0, prev_comm='swapper', prev_state='R', next_pid=1, next_comm='foo')
+trace.add_sched(ts=100, prev_pid=1, prev_state='U', next_pid=2, next_comm='bar')
+trace.add_sched_blocked_reason(ts=101, pid=1, io_wait=0, unblock_pid=3)
+trace.add_sched(ts=110, prev_pid=2, prev_state='U', next_pid=0)
+trace.add_sched_blocked_reason(ts=111, pid=2, io_wait=1, unblock_pid=3)
 
 sys.stdout.buffer.write(trace.trace.SerializeToString())
diff --git a/test/trace_processor/parsing/sched_blocked_reason.sql b/test/trace_processor/parsing/sched_blocked_reason.sql
index b0d85d5..1761c97 100644
--- a/test/trace_processor/parsing/sched_blocked_reason.sql
+++ b/test/trace_processor/parsing/sched_blocked_reason.sql
@@ -1,5 +1,5 @@
-select ts, tid, EXTRACT_ARG(arg_set_id, 'io_wait') as io_wait
-from legacy_instant
-join thread USING (utid)
-where legacy_instant.name = 'sched_blocked_reason'
-order by ts
\ No newline at end of file
+select ts, tid, io_wait
+from thread_state
+join thread using (utid)
+where state = 'D'
+order by ts
diff --git a/test/trace_processor/parsing/sched_blocked_reason_function.sql b/test/trace_processor/parsing/sched_blocked_reason_function.sql
index ffd843c..ffa1e10 100644
--- a/test/trace_processor/parsing/sched_blocked_reason_function.sql
+++ b/test/trace_processor/parsing/sched_blocked_reason_function.sql
@@ -1,8 +1,8 @@
 select
   ts,
   thread.tid as pid,
-  EXTRACT_ARG(arg_set_id, 'function') as func
-from legacy_instant
+  blocked_function as func
+from thread_state
 join thread USING (utid)
-where legacy_instant.name = 'sched_blocked_reason'
-order by ts
\ No newline at end of file
+where state = 'D'
+order by ts
diff --git a/test/trace_processor/parsing/sched_blocked_reason_symbolized.textproto b/test/trace_processor/parsing/sched_blocked_reason_symbolized.textproto
index 6b26df0..dd50f45 100644
--- a/test/trace_processor/parsing/sched_blocked_reason_symbolized.textproto
+++ b/test/trace_processor/parsing/sched_blocked_reason_symbolized.textproto
@@ -2,7 +2,29 @@
   ftrace_events {
     cpu: 1
     event {
+      timestamp: 50
+      pid: 0
+      sched_switch {
+        prev_comm: "swapper/1"
+        prev_pid: 0
+        prev_state: 2
+        next_comm: "100"
+        next_pid: 100
+      }
+    }
+    event {
       timestamp: 1000000
+      pid: 100
+      sched_switch {
+        prev_comm: "100"
+        prev_pid: 100
+        prev_state: 2
+        next_comm: "101"
+        next_pid: 101
+      }
+    }
+    event {
+      timestamp: 1000010
       pid: 0
       sched_blocked_reason {
         pid: 100
@@ -12,6 +34,17 @@
     }
     event {
       timestamp: 1001000
+      pid: 101
+      sched_switch {
+        prev_comm: "101"
+        prev_pid: 101
+        prev_state: 2
+        next_comm: "100"
+        next_pid: 100
+      }
+    }
+    event {
+      timestamp: 1001010
       pid: 0
       sched_blocked_reason {
         pid: 101
@@ -35,7 +68,29 @@
   ftrace_events {
     cpu: 2
     event {
+      timestamp: 60
+      pid: 0
+      sched_switch {
+        prev_comm: "swapper/2"
+        prev_pid: 0
+        prev_state: 2
+        next_comm: "102"
+        next_pid: 102
+      }
+    }
+    event {
       timestamp: 999000
+      pid: 102
+      sched_switch {
+        prev_comm: "102"
+        prev_pid: 102
+        prev_state: 2
+        next_comm: "103"
+        next_pid: 103
+      }
+    }
+    event {
+      timestamp: 999010
       pid: 0
       sched_blocked_reason {
         pid: 102
@@ -45,6 +100,17 @@
     }
     event {
       timestamp: 1002000
+      pid: 103
+      sched_switch {
+        prev_comm: "103"
+        prev_pid: 103
+        prev_state: 2
+        next_comm: "104"
+        next_pid: 104
+      }
+    }
+    event {
+      timestamp: 1002010
       pid: 0
       sched_blocked_reason {
         pid: 103
@@ -54,6 +120,17 @@
     }
     event {
       timestamp: 1005000
+      pid: 102
+      sched_switch {
+        prev_comm: "104"
+        prev_pid: 104
+        prev_state: 2
+        next_comm: "swapper/2"
+        next_pid: 0
+      }
+    }
+    event {
+      timestamp: 1005010
       pid: 0
       sched_blocked_reason {
         pid: 104
@@ -69,6 +146,28 @@
   ftrace_events {
     cpu: 3
     event {
+      timestamp: 60
+      pid: 0
+      sched_switch {
+        prev_comm: "swapper/2"
+        prev_pid: 0
+        prev_state: 2
+        next_comm: "105"
+        next_pid: 105
+      }
+    }
+    event {
+      timestamp: 999000
+      pid: 105
+      sched_switch {
+        prev_comm: "105"
+        prev_pid: 105
+        prev_state: 2
+        next_comm: "swapper/3"
+        next_pid: 0
+      }
+    }
+    event {
       timestamp: 999000
       pid: 0
       sched_blocked_reason {
@@ -92,6 +191,17 @@
     cpu: 1
     event {
       timestamp: 1003000
+      pid: 100
+      sched_switch {
+        prev_comm: "100"
+        prev_pid: 100
+        prev_state: 2
+        next_comm: "swapper/1"
+        next_pid: 0
+      }
+    }
+    event {
+      timestamp: 1003010
       pid: 0
       sched_blocked_reason {
         pid: 100
@@ -109,4 +219,4 @@
     }
   }
   sequence_flags: 1
-}
\ No newline at end of file
+}
diff --git a/test/trace_processor/parsing/sched_blocked_reason_symbolized_to_systrace.out b/test/trace_processor/parsing/sched_blocked_reason_symbolized_to_systrace.out
index ea78ae5..ab49727 100644
--- a/test/trace_processor/parsing/sched_blocked_reason_symbolized_to_systrace.out
+++ b/test/trace_processor/parsing/sched_blocked_reason_symbolized_to_systrace.out
@@ -1,8 +1,18 @@
 "line"
-"          <idle>-0     (-----) [002] .... 0.000999: sched_blocked_reason: pid=102 io_wait=1 caller=filemap_fault"
+"          <idle>-0     (-----) [001] .... 0.000000: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=0 prev_state=D ==> next_comm=100 next_pid=100 next_prio=0"
+"          <idle>-0     (-----) [002] .... 0.000000: sched_switch: prev_comm=swapper/2 prev_pid=0 prev_prio=0 prev_state=D ==> next_comm=102 next_pid=102 next_prio=0"
+"          <idle>-0     (-----) [003] .... 0.000000: sched_switch: prev_comm=swapper/2 prev_pid=0 prev_prio=0 prev_state=D ==> next_comm=105 next_pid=105 next_prio=0"
+"             105-105   (-----) [003] .... 0.000999: sched_switch: prev_comm=105 prev_pid=105 prev_prio=0 prev_state=D ==> next_comm=swapper/3 next_pid=0 next_prio=0"
 "          <idle>-0     (-----) [003] .... 0.000999: sched_blocked_reason: pid=105 io_wait=1 caller=some_fn"
+"             102-102   (-----) [002] .... 0.000999: sched_switch: prev_comm=102 prev_pid=102 prev_prio=0 prev_state=D ==> next_comm=103 next_pid=103 next_prio=0"
+"          <idle>-0     (-----) [002] .... 0.000999: sched_blocked_reason: pid=102 io_wait=1 caller=filemap_fault"
+"             100-100   (-----) [001] .... 0.001000: sched_switch: prev_comm=100 prev_pid=100 prev_prio=0 prev_state=D ==> next_comm=101 next_pid=101 next_prio=0"
 "          <idle>-0     (-----) [001] .... 0.001000: sched_blocked_reason: pid=100 io_wait=0 caller=filemap_fault"
+"             101-101   (-----) [001] .... 0.001001: sched_switch: prev_comm=101 prev_pid=101 prev_prio=0 prev_state=D ==> next_comm=100 next_pid=100 next_prio=0"
 "          <idle>-0     (-----) [001] .... 0.001001: sched_blocked_reason: pid=101 io_wait=0 caller=2"
+"             103-103   (-----) [002] .... 0.001002: sched_switch: prev_comm=103 prev_pid=103 prev_prio=0 prev_state=D ==> next_comm=104 next_pid=104 next_prio=0"
 "          <idle>-0     (-----) [002] .... 0.001002: sched_blocked_reason: pid=103 io_wait=1 caller=2"
+"             100-100   (-----) [001] .... 0.001003: sched_switch: prev_comm=100 prev_pid=100 prev_prio=0 prev_state=D ==> next_comm=swapper/1 next_pid=0 next_prio=0"
 "          <idle>-0     (-----) [001] .... 0.001003: sched_blocked_reason: pid=100 io_wait=1 caller=some_other_fn"
+"             104-104   (-----) [002] .... 0.001005: sched_switch: prev_comm=104 prev_pid=104 prev_prio=0 prev_state=D ==> next_comm=swapper/2 next_pid=0 next_prio=0"
 "          <idle>-0     (-----) [002] .... 0.001005: sched_blocked_reason: pid=104 io_wait=1 caller=filemap_fault"
diff --git a/test/trace_processor/parsing/sched_blocked_systrace.systrace b/test/trace_processor/parsing/sched_blocked_systrace.systrace
index 81046bf..f98b4c9 100644
--- a/test/trace_processor/parsing/sched_blocked_systrace.systrace
+++ b/test/trace_processor/parsing/sched_blocked_systrace.systrace
@@ -1,2 +1,6 @@
-           <...>-3694  ( 3694) [006] d..3    20.258854: sched_blocked_reason: pid=269 iowait=0 caller=worker_thread+0x534/0x820
-          <idle>-0     (-----) [000] d.s4    21.123838: sched_blocked_reason: pid=2172 iowait=1 caller=__filemap_fdatawait_range+0x134/0x150
+          <idle>-0     (-----) [006] ....    10.258854: sched_switch: prev_comm=swapper/6 prev_pid=0 prev_prio=120 prev_state=D ==> next_comm=foo next_pid=269 next_prio=130
+             foo-269   (-----) [006] ....    20.258854: sched_switch: prev_comm=foo prev_pid=269 prev_prio=120 prev_state=D ==> next_comm=swapper/6 next_pid=0 next_prio=130
+          <idle>-0     (-----) [006] d..3    20.258855: sched_blocked_reason: pid=269 iowait=0 caller=worker_thread+0x534/0x820
+          <idle>-0     (-----) [000] ....    21.058854: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=D ==> next_comm=foo next_pid=2172 next_prio=130
+             bar-269   (-----) [000] ....    21.123838: sched_switch: prev_comm=bar prev_pid=2172 prev_prio=120 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=130
+          <idle>-0     (-----) [000] d.s4    21.123839: sched_blocked_reason: pid=2172 iowait=1 caller=__filemap_fdatawait_range+0x134/0x150
diff --git a/test/trace_processor/parsing/sched_slices_sched_switch_compact.out b/test/trace_processor/parsing/sched_slices_sched_switch_compact.out
index c2f2e7c..76a0073 100644
--- a/test/trace_processor/parsing/sched_slices_sched_switch_compact.out
+++ b/test/trace_processor/parsing/sched_slices_sched_switch_compact.out
@@ -16,7 +16,7 @@
 807082959262516,0,126094,807082959388610,"S",120,22367,"kworker/u16:9"
 807082959388610,0,71435840,807083030824450,"R",120,0,"swapper"
 807083030824450,0,1662865,807083032487315,"S",120,29206,"traced"
-807083032487315,0,593281,807083033080596,"R",120,29207,"traced_probes"
+807083032487315,0,-1,807083032487314,"[NULL]",120,29207,"traced_probes"
 807082863108704,1,42240,807082863150944,"R",120,0,"swapper"
 807082863150944,1,42760,807082863193704,"S",49,4454,"irq/80-1436400."
 807082863193704,1,1931823,807082865125527,"R",120,0,"swapper"
@@ -40,7 +40,7 @@
 807083032698617,1,276146,807083032974763,"D",120,22367,"kworker/u16:9"
 807083032974763,1,62396,807083033037159,"R",120,0,"swapper"
 807083033037159,1,43437,807083033080596,"S",120,22367,"kworker/u16:9"
-807083033080596,1,0,807083033080596,"R",120,0,"swapper"
+807083033080596,1,-1,807083033080595,"[NULL]",120,0,"swapper"
 807082865061361,2,399583,807082865460944,"D",120,22367,"kworker/u16:9"
 807082865460944,2,46771,807082865507715,"R",120,0,"swapper"
 807082865507715,2,30312,807082865538027,"S",120,22367,"kworker/u16:9"
@@ -56,13 +56,13 @@
 807082948649130,2,185052,807082948834182,"D",120,22367,"kworker/u16:9"
 807082948834182,2,357239,807082949191421,"R",120,0,"swapper"
 807082949191421,2,55677,807082949247098,"S",120,22367,"kworker/u16:9"
-807082949247098,2,83833498,807083033080596,"R",120,0,"swapper"
+807082949247098,2,-1,807082949247097,"[NULL]",120,0,"swapper"
 807082947555119,3,37083,807082947592202,"R",120,0,"swapper"
 807082947592202,3,38177,807082947630379,"S",120,7,"rcu_preempt"
 807082947630379,3,4172813,807082951803192,"R",120,0,"swapper"
 807082951803192,3,83698,807082951886890,"S",120,7,"rcu_preempt"
 807082951886890,3,40000,807082951926890,"S",120,45,"rcuop/4"
-807082951926890,3,81153706,807083033080596,"R",120,0,"swapper"
+807082951926890,3,-1,807082951926889,"[NULL]",120,0,"swapper"
 807082862976152,4,14792,807082862990944,"S",120,29207,"traced_probes"
 807082862990944,4,83901102,807082946892046,"R",120,0,"swapper"
 807082946892046,4,327500,807082947219546,"S",120,29207,"traced_probes"
@@ -71,7 +71,7 @@
 807082947303296,4,28958,807082947332254,"S",120,21092,"kworker/4:1"
 807082947332254,4,83363707,807083030695961,"R",120,0,"swapper"
 807083030695961,4,104895,807083030800856,"S",120,42,"ksoftirqd/4"
-807083030800856,4,2279740,807083033080596,"R",120,0,"swapper"
+807083030800856,4,-1,807083030800855,"[NULL]",120,0,"swapper"
 807082952627307,7,1534375,807082954161682,"R",120,0,"swapper"
 807082954161682,7,43490,807082954205172,"S",49,628,"sugov:4"
-807082954205172,7,78875424,807083033080596,"R",120,0,"swapper"
+807082954205172,7,-1,807082954205171,"[NULL]",120,0,"swapper"
diff --git a/test/trace_processor/parsing/sched_slices_sched_switch_original.out b/test/trace_processor/parsing/sched_slices_sched_switch_original.out
index 404a588..10e01a4 100644
--- a/test/trace_processor/parsing/sched_slices_sched_switch_original.out
+++ b/test/trace_processor/parsing/sched_slices_sched_switch_original.out
@@ -17,7 +17,7 @@
 807082959262516,0,126094,807082959388610,"S",120,22367,"kworker/u16:9"
 807082959388610,0,71435840,807083030824450,"R",120,0,"swapper"
 807083030824450,0,1662865,807083032487315,"S",120,29206,"traced"
-807083032487315,0,593281,807083033080596,"R",120,29207,"traced_probes"
+807083032487315,0,-1,807083032487314,"[NULL]",120,29207,"traced_probes"
 807082862950996,1,157708,807082863108704,"D",49,4454,"irq/80-1436400."
 807082863108704,1,42240,807082863150944,"R",120,0,"swapper"
 807082863150944,1,42760,807082863193704,"S",49,4454,"irq/80-1436400."
@@ -42,7 +42,7 @@
 807083032698617,1,276146,807083032974763,"D",120,22367,"kworker/u16:9"
 807083032974763,1,62396,807083033037159,"R",120,0,"swapper"
 807083033037159,1,43437,807083033080596,"S",120,22367,"kworker/u16:9"
-807083033080596,1,0,807083033080596,"R",120,0,"swapper"
+807083033080596,1,-1,807083033080595,"[NULL]",120,0,"swapper"
 807082862645371,2,2415990,807082865061361,"R",120,0,"swapper"
 807082865061361,2,399583,807082865460944,"D",120,22367,"kworker/u16:9"
 807082865460944,2,46771,807082865507715,"R",120,0,"swapper"
@@ -59,14 +59,14 @@
 807082948649130,2,185052,807082948834182,"D",120,22367,"kworker/u16:9"
 807082948834182,2,357239,807082949191421,"R",120,0,"swapper"
 807082949191421,2,55677,807082949247098,"S",120,22367,"kworker/u16:9"
-807082949247098,2,83833498,807083033080596,"R",120,0,"swapper"
+807082949247098,2,-1,807082949247097,"[NULL]",120,0,"swapper"
 807082947493504,3,61615,807082947555119,"S",120,28905,"kworker/3:0"
 807082947555119,3,37083,807082947592202,"R",120,0,"swapper"
 807082947592202,3,38177,807082947630379,"S",120,7,"rcu_preempt"
 807082947630379,3,4172813,807082951803192,"R",120,0,"swapper"
 807082951803192,3,83698,807082951886890,"S",120,7,"rcu_preempt"
 807082951886890,3,40000,807082951926890,"S",120,45,"rcuop/4"
-807082951926890,3,81153706,807083033080596,"R",120,0,"swapper"
+807082951926890,3,-1,807082951926889,"[NULL]",120,0,"swapper"
 807082862918652,4,57500,807082862976152,"S",120,29206,"traced"
 807082862976152,4,14792,807082862990944,"S",120,29207,"traced_probes"
 807082862990944,4,83901102,807082946892046,"R",120,0,"swapper"
@@ -76,8 +76,8 @@
 807082947303296,4,28958,807082947332254,"S",120,21092,"kworker/4:1"
 807082947332254,4,83363707,807083030695961,"R",120,0,"swapper"
 807083030695961,4,104895,807083030800856,"S",120,42,"ksoftirqd/4"
-807083030800856,4,2279740,807083033080596,"R",120,0,"swapper"
+807083030800856,4,-1,807083030800855,"[NULL]",120,0,"swapper"
 807082952486057,7,141250,807082952627307,"D",49,628,"sugov:4"
 807082952627307,7,1534375,807082954161682,"R",120,0,"swapper"
 807082954161682,7,43490,807082954205172,"S",49,628,"sugov:4"
-807082954205172,7,78875424,807083033080596,"R",120,0,"swapper"
+807082954205172,7,-1,807082954205171,"[NULL]",120,0,"swapper"
diff --git a/test/trace_processor/parsing/sched_wakeup.sql b/test/trace_processor/parsing/sched_wakeup.sql
index 73ea99e..1827627 100644
--- a/test/trace_processor/parsing/sched_wakeup.sql
+++ b/test/trace_processor/parsing/sched_wakeup.sql
@@ -14,8 +14,8 @@
 -- limitations under the License.
 --
 SELECT ts, tid
-FROM legacy_instant
+FROM thread_state
 JOIN thread USING (utid)
-WHERE legacy_instant.name = 'sched_wakeup'
+WHERE state = 'R'
 ORDER BY ts
 LIMIT 20
diff --git a/test/trace_processor/parsing/sched_wakeup_android_sched_and_ps.out b/test/trace_processor/parsing/sched_wakeup_android_sched_and_ps.out
index f758f61..66418ba 100644
--- a/test/trace_processor/parsing/sched_wakeup_android_sched_and_ps.out
+++ b/test/trace_processor/parsing/sched_wakeup_android_sched_and_ps.out
@@ -8,6 +8,7 @@
 81473010638470,26204
 81473010710501,7
 81473012479667,24011
+81473012488313,23850
 81473012628209,23912
 81473012774667,23912
 81473012837272,23912
@@ -18,4 +19,3 @@
 81473013365136,23912
 81473013408157,24011
 81473013587428,24011
-81473013619095,23912
diff --git a/test/trace_processor/parsing/sched_waking_instants.sql b/test/trace_processor/parsing/sched_waking_instants.sql
index b14aab0..9b5606b 100644
--- a/test/trace_processor/parsing/sched_waking_instants.sql
+++ b/test/trace_processor/parsing/sched_waking_instants.sql
@@ -13,8 +13,8 @@
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 --
-SELECT ts, legacy_instant.name, thread.name, thread.tid
-FROM legacy_instant
+SELECT ts, thread.name, thread.tid
+FROM thread_state
 JOIN thread USING (utid)
-WHERE legacy_instant.name = 'sched_waking'
+WHERE state = 'R'
 ORDER BY ts
diff --git a/test/trace_processor/parsing/sched_waking_instants_compact_sched.out b/test/trace_processor/parsing/sched_waking_instants_compact_sched.out
index 201d48b..6eb1e7e 100644
--- a/test/trace_processor/parsing/sched_waking_instants_compact_sched.out
+++ b/test/trace_processor/parsing/sched_waking_instants_compact_sched.out
@@ -1,82 +1,78 @@
-"ts","name","name","tid"
-250978439491994,"sched_waking","rcu_sched",8
-250978441664547,"sched_waking","ksoftirqd/1",18
-250978441702515,"sched_waking","kworker/u16:18",17473
-250978444958245,"sched_waking","rcuop/0",10
-250978444974443,"sched_waking","rcuop/1",21
-250978444984234,"sched_waking","rcu_preempt",7
-250978445783141,"sched_waking","rcu_sched",8
-250978451590173,"sched_waking","rcu_preempt",7
-250978451591891,"sched_waking","rcu_sched",8
-250978451609131,"sched_waking","kworker/u16:18",17473
-250978451646579,"sched_waking","rcuos/0",11
-250978451716891,"sched_waking","rcuos/1",22
-250978452047048,"sched_waking","kworker/u16:18",17473
-250978458337725,"sched_waking","sugov:0",625
-250978458362100,"sched_waking","rcu_preempt",7
-250978458398455,"sched_waking","rcuop/0",10
-250978458419496,"sched_waking","rcuop/1",21
-250978459118038,"sched_waking","sugov:0",625
-250978465172309,"sched_waking","ksoftirqd/3",34
-250978465266789,"sched_waking","kworker/u16:18",17473
-250978593466697,"sched_waking","kworker/2:0",17438
-250978593734510,"sched_waking","kworker/u16:18",17473
-250978595521125,"sched_waking","kworker/2:3",17754
-250978595696645,"sched_waking","kworker/2:0",17438
-250978596068468,"sched_waking","kworker/2:3",17754
-250978596565656,"sched_waking","kworker/2:0",17438
-250978600598417,"sched_waking","kworker/2:0",17438
-250978600639042,"sched_waking","ksoftirqd/0",6
-250978604651907,"sched_waking","ksoftirqd/0",6
-250978604739980,"sched_waking","kworker/2:0",17438
-250978605185448,"sched_waking","ksoftirqd/2",26
-250978605260240,"sched_waking","kworker/u16:18",17473
-250978608903886,"sched_waking","kworker/2:0",17438
-250978608942220,"sched_waking","ksoftirqd/0",6
-250978612887272,"sched_waking","ksoftirqd/0",6
-250978612971283,"sched_waking","kworker/2:0",17438
-250978616876595,"sched_waking","kworker/2:0",17438
-250978616921700,"sched_waking","ksoftirqd/0",6
-250978617016804,"sched_waking","kworker/u16:18",17473
-250978620859669,"sched_waking","ksoftirqd/0",6
-250978620939148,"sched_waking","kworker/2:0",17438
-250978624836805,"sched_waking","kworker/2:0",17438
-250978624875398,"sched_waking","ksoftirqd/0",6
-250978624978003,"sched_waking","kworker/u16:18",17473
-250978628278107,"sched_waking","logd.klogd",651
-250978629289722,"sched_waking","rcuop/2",29
-250978629405763,"sched_waking","rcu_preempt",7
-250978635024462,"sched_waking","rcu_preempt",7
-250978635060191,"sched_waking","kworker/u16:18",17473
-250978635219514,"sched_waking","rcuop/2",29
-250978683441081,"sched_waking","kworker/2:0",17438
-250978683732331,"sched_waking","kworker/u16:18",17473
-250978685694259,"sched_waking","kworker/u16:18",17473
-250978740127441,"sched_waking","kworker/2:0",17438
-250978740425410,"sched_waking","kworker/u16:18",17473
-250978743210358,"sched_waking","kworker/u16:18",17473
-250978744945567,"sched_waking","logd.klogd",651
-250978746028431,"sched_waking","rcuop/2",29
-250978746173171,"sched_waking","rcu_preempt",7
-250978751622494,"sched_waking","rcu_preempt",7
-250978751661348,"sched_waking","kworker/u16:18",17473
-250978751792859,"sched_waking","rcuop/2",29
-250978751971817,"sched_waking","rcu_preempt",7
-250978758784578,"sched_waking","rcu_preempt",7
-250978758873745,"sched_waking","rcuop/2",29
-250978805144375,"sched_waking","traced_probes",17772
-250978806359896,"sched_waking","kworker/5:1",17667
-250978806428646,"sched_waking","kworker/u16:18",17473
-250978808058698,"sched_waking","rcuop/0",10
-250978808519271,"sched_waking","rcu_preempt",7
-250978815488490,"sched_waking","rcu_preempt",7
-250978815535678,"sched_waking","kworker/u16:18",17473
-250978815675782,"sched_waking","rcuop/0",10
-250978815738022,"sched_waking","rcuop/1",21
-250978860203182,"sched_waking","kworker/u16:18",17473
-250978880151205,"sched_waking","kworker/2:0",17438
-250978880432143,"sched_waking","kworker/u16:18",17473
-250978884120216,"sched_waking","traced",17771
-250978885260685,"sched_waking","rcuop/0",10
-250978885784018,"sched_waking","rcu_preempt",7
-250978885786674,"sched_waking","traced_probes",17772
+"ts","name","tid"
+250978441664547,"ksoftirqd/1",18
+250978441702515,"kworker/u16:18",17473
+250978444958245,"rcuop/0",10
+250978444974443,"rcuop/1",21
+250978444984234,"rcu_preempt",7
+250978445783141,"rcu_sched",8
+250978451590173,"rcu_preempt",7
+250978451591891,"rcu_sched",8
+250978451609131,"kworker/u16:18",17473
+250978451646579,"rcuos/0",11
+250978451716891,"rcuos/1",22
+250978452047048,"kworker/u16:18",17473
+250978458362100,"rcu_preempt",7
+250978458398455,"rcuop/0",10
+250978458419496,"rcuop/1",21
+250978459118038,"sugov:0",625
+250978465172309,"ksoftirqd/3",34
+250978465266789,"kworker/u16:18",17473
+250978593466697,"kworker/2:0",17438
+250978593734510,"kworker/u16:18",17473
+250978595521125,"kworker/2:3",17754
+250978595696645,"kworker/2:0",17438
+250978596068468,"kworker/2:3",17754
+250978596565656,"kworker/2:0",17438
+250978600598417,"kworker/2:0",17438
+250978600639042,"ksoftirqd/0",6
+250978604651907,"ksoftirqd/0",6
+250978604739980,"kworker/2:0",17438
+250978605185448,"ksoftirqd/2",26
+250978605260240,"kworker/u16:18",17473
+250978608903886,"kworker/2:0",17438
+250978608942220,"ksoftirqd/0",6
+250978612887272,"ksoftirqd/0",6
+250978612971283,"kworker/2:0",17438
+250978616876595,"kworker/2:0",17438
+250978616921700,"ksoftirqd/0",6
+250978617016804,"kworker/u16:18",17473
+250978620859669,"ksoftirqd/0",6
+250978620939148,"kworker/2:0",17438
+250978624836805,"kworker/2:0",17438
+250978624875398,"ksoftirqd/0",6
+250978624978003,"kworker/u16:18",17473
+250978628278107,"logd.klogd",651
+250978629289722,"rcuop/2",29
+250978629405763,"rcu_preempt",7
+250978635024462,"rcu_preempt",7
+250978635060191,"kworker/u16:18",17473
+250978635219514,"rcuop/2",29
+250978683441081,"kworker/2:0",17438
+250978683732331,"kworker/u16:18",17473
+250978740127441,"kworker/2:0",17438
+250978740425410,"kworker/u16:18",17473
+250978744945567,"logd.klogd",651
+250978746028431,"rcuop/2",29
+250978746173171,"rcu_preempt",7
+250978751622494,"rcu_preempt",7
+250978751661348,"kworker/u16:18",17473
+250978751792859,"rcuop/2",29
+250978751971817,"rcu_preempt",7
+250978758784578,"rcu_preempt",7
+250978758873745,"rcuop/2",29
+250978805144375,"traced_probes",17772
+250978806359896,"kworker/5:1",17667
+250978806428646,"kworker/u16:18",17473
+250978808058698,"rcuop/0",10
+250978808519271,"rcu_preempt",7
+250978815488490,"rcu_preempt",7
+250978815535678,"kworker/u16:18",17473
+250978815675782,"rcuop/0",10
+250978815738022,"rcuop/1",21
+250978860203182,"kworker/u16:18",17473
+250978880151205,"kworker/2:0",17438
+250978880432143,"kworker/u16:18",17473
+250978884120216,"traced",17771
+250978885260685,"rcuop/0",10
+250978885784018,"rcu_preempt",7
+250978885786674,"traced_probes",17772
diff --git a/test/trace_processor/parsing/systrace_html.out b/test/trace_processor/parsing/systrace_html.out
index 7bc9203..a9110c7 100644
--- a/test/trace_processor/parsing/systrace_html.out
+++ b/test/trace_processor/parsing/systrace_html.out
@@ -3627,11 +3627,11 @@
 6824713593302000,5,19000,6824713593321000,45,"S",120,45,"rcuop/5",52
 6824713593321000,5,9953000,6824713603274000,2738,"R",120,764,"atrace",20467
 6824713593660000,6,42000,6824713593702000,6,"S",120,6,"rcu_sched",8
-6824713593702000,6,41271000,6824713634973000,0,"R",120,"[NULL]","swapper",0
+6824713593702000,6,-1,6824713593701999,0,"[NULL]",120,"[NULL]","swapper",0
 6824713594142000,7,54000,6824713594196000,39,"S",120,39,"rcuos/4",45
-6824713594196000,7,40777000,6824713634973000,0,"R",120,"[NULL]","swapper",0
+6824713594196000,7,-1,6824713594195999,0,"[NULL]",120,"[NULL]","swapper",0
 6824713594572000,4,31000,6824713594603000,46,"S",120,46,"rcuos/5",53
-6824713594603000,4,40370000,6824713634973000,0,"R",120,"[NULL]","swapper",0
+6824713594603000,4,-1,6824713594602999,0,"[NULL]",120,"[NULL]","swapper",0
 6824713596806000,0,434000,6824713597240000,771,"S",97,493,"DispSync",676
 6824713597240000,0,240000,6824713597480000,743,"S",120,743,"kworker/0:5",20371
 6824713597480000,0,864000,6824713598344000,0,"R",120,"[NULL]","swapper",0
@@ -3677,7 +3677,7 @@
 6824713631086000,0,116000,6824713631202000,702,"S",120,702,"kworker/u16:7",19422
 6824713631202000,0,181000,6824713631383000,786,"S",111,494,"SDM_EventThread",685
 6824713631383000,0,2291000,6824713633674000,0,"R",120,"[NULL]","swapper",0
-6824713631536000,3,3437000,6824713634973000,0,"R",120,"[NULL]","swapper",0
+6824713631536000,3,-1,6824713631535999,0,"[NULL]",120,"[NULL]","swapper",0
 6824713631650000,1,63000,6824713631713000,771,"S",97,493,"DispSync",676
 6824713631713000,1,1737000,6824713633450000,644,"S",120,644,"ndroid.systemui",1664
 6824713631775000,2,255000,6824713632030000,482,"S",49,482,"sugov:0",605
@@ -3690,11 +3690,11 @@
 6824713633512000,2,169000,6824713633681000,2738,"R+",120,764,"atrace",20467
 6824713633674000,0,213000,6824713633887000,770,"S",120,493,"Binder:640_2",675
 6824713633681000,2,75000,6824713633756000,489,"S",120,489,"atrace@1.0-serv",635
-6824713633756000,2,1217000,6824713634973000,2738,"R",120,764,"atrace",20467
-6824713633887000,0,1086000,6824713634973000,0,"R",120,"[NULL]","swapper",0
+6824713633756000,2,-1,6824713633755999,2738,"[NULL]",120,764,"atrace",20467
+6824713633887000,0,-1,6824713633886999,0,"[NULL]",120,"[NULL]","swapper",0
 6824713634629000,1,131000,6824713634760000,773,"S",97,493,"app",678
-6824713634760000,1,213000,6824713634973000,0,"R",120,"[NULL]","swapper",0
+6824713634760000,1,-1,6824713634759999,0,"[NULL]",120,"[NULL]","swapper",0
 6824713634810000,5,70000,6824713634880000,5,"S",120,5,"rcu_preempt",7
 6824713634880000,5,39000,6824713634919000,38,"S",120,38,"rcuop/4",44
 6824713634919000,5,54000,6824713634973000,45,"S",120,45,"rcuop/5",52
-6824713634973000,5,0,6824713634973000,0,"R",120,"[NULL]","swapper",0
+6824713634973000,5,-1,6824713634972999,0,"[NULL]",120,"[NULL]","swapper",0
diff --git a/test/trace_processor/smoke/proxy_power.out b/test/trace_processor/smoke/proxy_power.out
index d57cfc5..dd16970 100644
--- a/test/trace_processor/smoke/proxy_power.out
+++ b/test/trace_processor/smoke/proxy_power.out
@@ -10,6 +10,6 @@
 161,13.740925
 23,12.703770
 205,11.924118
-43,10.011150
-258,9.165919
+43,9.852783
+258,9.163192
 1,9.137632
diff --git a/test/trace_processor/smoke/synth_1_smoke.out b/test/trace_processor/smoke/synth_1_smoke.out
index ac16d31..45bb0b3 100644
--- a/test/trace_processor/smoke/synth_1_smoke.out
+++ b/test/trace_processor/smoke/synth_1_smoke.out
@@ -2,8 +2,8 @@
 1,0,99,"R",0,3
 50,1,70,"R",0,1
 100,0,15,"R",0,2
-115,0,285,"R",0,3
+115,0,-1,"[NULL]",0,3
 120,1,50,"R",0,2
 170,1,80,"R",0,0
 250,1,140,"R",0,2
-390,1,10,"R",0,4
+390,1,-1,"[NULL]",0,4
diff --git a/test/trace_processor/smoke/thread_cpu_time.sql b/test/trace_processor/smoke/thread_cpu_time.sql
index 887af35..534e23e 100644
--- a/test/trace_processor/smoke/thread_cpu_time.sql
+++ b/test/trace_processor/smoke/thread_cpu_time.sql
@@ -26,5 +26,6 @@
       from sched join thread using(utid)
       group by upid
     ) using(upid)
+where total_dur != -1
 group by utid, upid
 order by total_dur desc, pid, tid
diff --git a/test/trace_processor/smoke/thread_cpu_time_example_android_trace_30s.out b/test/trace_processor/smoke/thread_cpu_time_example_android_trace_30s.out
index 63be1d6..21b1480 100644
--- a/test/trace_processor/smoke/thread_cpu_time_example_android_trace_30s.out
+++ b/test/trace_processor/smoke/thread_cpu_time_example_android_trace_30s.out
@@ -1,331 +1,195 @@
 "tid","pid","threadName","processName","totalDur"
-2,2,"kthreadd","kthreadd",22857974895
-3,2,"ksoftirqd/0","kthreadd",22857974895
-4,2,"kworker/0:0","kthreadd",22857974895
-6,2,"kworker/u16:0","kthreadd",22857974895
-7,2,"rcu_preempt","kthreadd",22857974895
-8,2,"rcu_sched","kthreadd",22857974895
-10,2,"rcuop/0","kthreadd",22857974895
-11,2,"rcuos/0","kthreadd",22857974895
-13,2,"migration/0","kthreadd",22857974895
-14,2,"watchdog/0","kthreadd",22857974895
-15,2,"watchdog/1","kthreadd",22857974895
-16,2,"migration/1","kthreadd",22857974895
-17,2,"ksoftirqd/1","kthreadd",22857974895
-18,2,"kworker/1:0","kthreadd",22857974895
-20,2,"rcuop/1","kthreadd",22857974895
-21,2,"rcuos/1","kthreadd",22857974895
-23,2,"watchdog/2","kthreadd",22857974895
-24,2,"migration/2","kthreadd",22857974895
-25,2,"ksoftirqd/2","kthreadd",22857974895
-28,2,"rcuop/2","kthreadd",22857974895
-29,2,"rcuos/2","kthreadd",22857974895
-31,2,"watchdog/3","kthreadd",22857974895
-32,2,"migration/3","kthreadd",22857974895
-33,2,"ksoftirqd/3","kthreadd",22857974895
-34,2,"kworker/3:0","kthreadd",22857974895
-36,2,"rcuop/3","kthreadd",22857974895
-37,2,"rcuos/3","kthreadd",22857974895
-39,2,"watchdog/4","kthreadd",22857974895
-40,2,"migration/4","kthreadd",22857974895
-41,2,"ksoftirqd/4","kthreadd",22857974895
-42,2,"kworker/4:0","kthreadd",22857974895
-44,2,"rcuop/4","kthreadd",22857974895
-45,2,"rcuos/4","kthreadd",22857974895
-47,2,"watchdog/5","kthreadd",22857974895
-48,2,"migration/5","kthreadd",22857974895
-49,2,"ksoftirqd/5","kthreadd",22857974895
-52,2,"rcuop/5","kthreadd",22857974895
-53,2,"rcuos/5","kthreadd",22857974895
-55,2,"watchdog/6","kthreadd",22857974895
-56,2,"migration/6","kthreadd",22857974895
-57,2,"ksoftirqd/6","kthreadd",22857974895
-60,2,"rcuop/6","kthreadd",22857974895
-61,2,"rcuos/6","kthreadd",22857974895
-63,2,"watchdog/7","kthreadd",22857974895
-64,2,"migration/7","kthreadd",22857974895
-65,2,"ksoftirqd/7","kthreadd",22857974895
-66,2,"kworker/7:0","kthreadd",22857974895
-68,2,"rcuop/7","kthreadd",22857974895
-69,2,"rcuos/7","kthreadd",22857974895
-80,2,"kworker/0:1","kthreadd",22857974895
-81,2,"smem_native_mps","kthreadd",22857974895
-82,2,"mpss_smem_glink","kthreadd",22857974895
-83,2,"smem_native_lpa","kthreadd",22857974895
-84,2,"lpass_smem_glin","kthreadd",22857974895
-85,2,"smem_native_dsp","kthreadd",22857974895
-86,2,"dsps_smem_glink","kthreadd",22857974895
-87,2,"smem_native_rpm","kthreadd",22857974895
-91,2,"msm_watchdog","kthreadd",22857974895
-93,2,"kworker/u16:1","kthreadd",22857974895
-94,2,"irq/126-cpr3","kthreadd",22857974895
-105,2,"system","kthreadd",22857974895
-150,2,"kswapd0","kthreadd",22857974895
-188,2,"vsync_retire_wo","kthreadd",22857974895
-193,2,"spi_wdsp","kthreadd",22857974895
-194,2,"wdsp_spi_glink_","kthreadd",22857974895
-201,2,"kworker/4:1","kthreadd",22857974895
-215,2,"hwrng","kthreadd",22857974895
-217,2,"kworker/2:1","kthreadd",22857974895
-253,2,"kworker/3:1","kthreadd",22857974895
-292,2,"kgsl_worker_thr","kthreadd",22857974895
-321,2,"irq/286-soc:fp_","kthreadd",22857974895
-329,2,"kworker/5:1","kthreadd",22857974895
-330,2,"spi2","kthreadd",22857974895
-345,2,"irq/262-vl53l0_","kthreadd",22857974895
-360,2,"kworker/u16:6","kthreadd",22857974895
-368,2,"rot_commitq_0_0","kthreadd",22857974895
-370,2,"rot_doneq_0_0","kthreadd",22857974895
-372,2,"kworker/4:3","kthreadd",22857974895
-411,2,"kworker/1:1","kthreadd",22857974895
-415,2,"kworker/6:2","kthreadd",22857974895
-459,2,"irq/226-bcm1560","kthreadd",22857974895
-462,2,"kworker/u16:8","kthreadd",22857974895
-492,2,"irq/747-ima-rdy","kthreadd",22857974895
-520,2,"kworker/5:2","kthreadd",22857974895
-521,2,"set_state_work","kthreadd",22857974895
-522,2,"irq/227-mnh-rea","kthreadd",22857974895
-523,2,"irq/751-mnh_pci","kthreadd",22857974895
-524,2,"irq/752-mnh_pci","kthreadd",22857974895
-526,2,"irq/754-mnh_pci","kthreadd",22857974895
-528,2,"irq/758-mnh_pci","kthreadd",22857974895
-545,2,"kworker/6:1H","kthreadd",22857974895
-546,2,"kworker/4:1H","kthreadd",22857974895
-547,2,"kworker/7:1H","kthreadd",22857974895
-549,2,"kworker/5:1H","kthreadd",22857974895
-559,2,"kworker/0:1H","kthreadd",22857974895
-561,2,"kworker/u16:10","kthreadd",22857974895
-568,2,"irq/760-synapti","kthreadd",22857974895
-592,2,"sugov:0","kthreadd",22857974895
-593,2,"sugov:4","kthreadd",22857974895
-597,2,"kauditd","kthreadd",22857974895
-610,2,"wlan_logging_th","kthreadd",22857974895
-634,2,"kworker/1:3","kthreadd",22857974895
-640,2,"kworker/7:2","kthreadd",22857974895
-641,2,"jbd2/sda45-8","kthreadd",22857974895
-665,2,"kworker/0:3","kthreadd",22857974895
-667,2,"kworker/0:4","kthreadd",22857974895
-695,2,"msm_slim_qmi_cl","kthreadd",22857974895
-704,2,"kworker/5:3","kthreadd",22857974895
-737,2,"kworker/2:1H","kthreadd",22857974895
-738,2,"kworker/u16:11","kthreadd",22857974895
-739,2,"kworker/u16:12","kthreadd",22857974895
-756,2,"kworker/1:1H","kthreadd",22857974895
-807,2,"irq/254-wcd9xxx","kthreadd",22857974895
-829,2,"kworker/u16:13","kthreadd",22857974895
-860,2,"kworker/u16:14","kthreadd",22857974895
-872,2,"kworker/3:2","kthreadd",22857974895
-877,2,"kworker/u16:15","kthreadd",22857974895
-926,2,"kworker/3:1H","kthreadd",22857974895
-1055,2,"kworker/7:3","kthreadd",22857974895
-1084,2,"kworker/u17:1","kthreadd",22857974895
-1948,2,"kworker/2:2","kthreadd",22857974895
-2188,2,"cds_mc_thread","kthreadd",22857974895
-2189,2,"cds_ol_rx_threa","kthreadd",22857974895
-2287,2,"irq/35-1008000.","kthreadd",22857974895
-3776,2,"kworker/3:3","kthreadd",22857974895
-4494,2,"mdss_fb0","kthreadd",22857974895
-4795,2,"kworker/2:3","kthreadd",22857974895
-5492,2,"kworker/3:4","kthreadd",22857974895
-5745,2,"irq/163-arm-smm","kthreadd",22857974895
-5759,2,"irq/164-arm-smm","kthreadd",22857974895
-5778,2,"irq/165-arm-smm","kthreadd",22857974895
-5780,2,"ois_wq","kthreadd",22857974895
-5798,2,"rot_fenceq_0_0","kthreadd",22857974895
-5799,2,"irq/166-arm-smm","kthreadd",22857974895
-5800,2,"irq/167-arm-smm","kthreadd",22857974895
-5932,2,"mdss_fb0","kthreadd",22857974895
-5506,5506,"id.GoogleCamera","com.google.android.GoogleCamera",15154766434
-5511,5506,"Jit thread pool","com.google.android.GoogleCamera",15154766434
-5512,5506,"Signal Catcher","com.google.android.GoogleCamera",15154766434
-5513,5506,"ADB-JDWP Connec","com.google.android.GoogleCamera",15154766434
-5514,5506,"ReferenceQueueD","com.google.android.GoogleCamera",15154766434
-5515,5506,"FinalizerDaemon","com.google.android.GoogleCamera",15154766434
-5516,5506,"FinalizerWatchd","com.google.android.GoogleCamera",15154766434
-5517,5506,"HeapTaskDaemon","com.google.android.GoogleCamera",15154766434
-5518,5506,"Binder:5506_1","com.google.android.GoogleCamera",15154766434
-5519,5506,"Binder:5506_2","com.google.android.GoogleCamera",15154766434
-5520,5506,"Profile Saver","com.google.android.GoogleCamera",15154766434
-5522,5506,"GoogleApiHandle","com.google.android.GoogleCamera",15154766434
-5524,5506,"queued-work-loo","com.google.android.GoogleCamera",15154766434
-5525,5506,"Executor-1","com.google.android.GoogleCamera",15154766434
-5526,5506,"Executor-2","com.google.android.GoogleCamera",15154766434
-5527,5506,"Executor-3","com.google.android.GoogleCamera",15154766434
-5528,5506,"Executor-4","com.google.android.GoogleCamera",15154766434
-5529,5506,"IOExecutor-1","com.google.android.GoogleCamera",15154766434
-5530,5506,"IndicatorUpdate","com.google.android.GoogleCamera",15154766434
-5531,5506,"CamcorderCamera","com.google.android.GoogleCamera",15154766434
-5532,5506,"Thread-11","com.google.android.GoogleCamera",15154766434
-5533,5506,"Thread-12","com.google.android.GoogleCamera",15154766434
-5534,5506,"Thread-92","com.google.android.GoogleCamera",15154766434
-5536,5506,"Executor-5","com.google.android.GoogleCamera",15154766434
-5537,5506,"Executor-6","com.google.android.GoogleCamera",15154766434
-5538,5506,"RenderThread","com.google.android.GoogleCamera",15154766434
-5541,5506,"Executor-7","com.google.android.GoogleCamera",15154766434
-5557,5506,"RenderThread","com.google.android.GoogleCamera",15154766434
-5559,5506,"RenderThread","com.google.android.GoogleCamera",15154766434
-5595,5506,"Executor-8","com.google.android.GoogleCamera",15154766434
-5596,5506,"Camera-Hndlr","com.google.android.GoogleCamera",15154766434
-5597,5506,"SoundPool","com.google.android.GoogleCamera",15154766434
-5598,5506,"SoundPoolThread","com.google.android.GoogleCamera",15154766434
-5599,5506,"UsageStatEx","com.google.android.GoogleCamera",15154766434
-5600,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5601,5506,"HwBinder:5506_1","com.google.android.GoogleCamera",15154766434
-5604,5506,"Camera-Ex","com.google.android.GoogleCamera",15154766434
-5626,5506,"Camera Handler ","com.google.android.GoogleCamera",15154766434
-5632,5506,"Camera Job Disp","com.google.android.GoogleCamera",15154766434
-5634,5506,"Binder:5506_3","com.google.android.GoogleCamera",15154766434
-5641,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5648,5506,"camera.wearable","com.google.android.GoogleCamera",15154766434
-5649,5506,"CamcorderCamera","com.google.android.GoogleCamera",15154766434
-5650,5506,"Binder:5506_4","com.google.android.GoogleCamera",15154766434
-5651,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5654,5506,"IR-RAW10w4032","com.google.android.GoogleCamera",15154766434
-5655,5506,"Binder:5506_5","com.google.android.GoogleCamera",15154766434
-5657,5506,"MicrovideoFrame","com.google.android.GoogleCamera",15154766434
-5658,5506,"AsyncTask #1","com.google.android.GoogleCamera",15154766434
-5673,5506,"IR-YUV_420_888w","com.google.android.GoogleCamera",15154766434
-5674,5506,"IR-JPEGw4032","com.google.android.GoogleCamera",15154766434
-5675,5506,"reproc-write","com.google.android.GoogleCamera",15154766434
-5676,5506,"reproc-read","com.google.android.GoogleCamera",15154766434
-5679,5506,"CameraEx-1","com.google.android.GoogleCamera",15154766434
-5680,5506,"CameraEx-2","com.google.android.GoogleCamera",15154766434
-5681,5506,"MicrovideoQShar","com.google.android.GoogleCamera",15154766434
-5682,5506,"n.StateCallback","com.google.android.GoogleCamera",15154766434
-5684,5506,"mv-vid-encoder","com.google.android.GoogleCamera",15154766434
-5686,5506,"SharedPreferenc","com.google.android.GoogleCamera",15154766434
-5696,5506,"AsyncTask #2","com.google.android.GoogleCamera",15154766434
-5701,5506,"GcaMetadataHand","com.google.android.GoogleCamera",15154766434
-5702,5506,"r.ImageListener","com.google.android.GoogleCamera",15154766434
-5703,5506,"Binder:5506_6","com.google.android.GoogleCamera",15154766434
-5706,5506,"OnDemandLoader","com.google.android.GoogleCamera",15154766434
-5713,5506,"NotificationDot","com.google.android.GoogleCamera",15154766434
-5722,5506,"GAC_Executor[0]","com.google.android.GoogleCamera",15154766434
-5729,5506,"Timer-0","com.google.android.GoogleCamera",15154766434
-5732,5506,"GAC_Executor[1]","com.google.android.GoogleCamera",15154766434
-5733,5506,"Timer-1","com.google.android.GoogleCamera",15154766434
-5734,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5743,5506,"AsyncTask #3","com.google.android.GoogleCamera",15154766434
-5760,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5769,5506,"hwuiTask1","com.google.android.GoogleCamera",15154766434
-5772,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5775,5506,"Timer-2","com.google.android.GoogleCamera",15154766434
-5781,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5793,5506,"mv-ctrl-exec","com.google.android.GoogleCamera",15154766434
-5794,5506,"ois-exec","com.google.android.GoogleCamera",15154766434
-5795,5506,"mv-meta-exec","com.google.android.GoogleCamera",15154766434
-5796,5506,"mv-gyro-exec-0","com.google.android.GoogleCamera",15154766434
-5797,5506,"DelHDR+Ind","com.google.android.GoogleCamera",15154766434
-5801,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5804,5506,"FilterHDR+Ind","com.google.android.GoogleCamera",15154766434
-5805,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5808,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5811,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5814,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5817,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766434
-5824,5506,"CameraProcessin","com.google.android.GoogleCamera",15154766434
-5825,5506,"ProcServ","com.google.android.GoogleCamera",15154766434
-5826,5506,"MediaCodec_loop","com.google.android.GoogleCamera",15154766434
-5827,5506,"CodecLooper","com.google.android.GoogleCamera",15154766434
-5829,5506,"Binder:5506_7","com.google.android.GoogleCamera",15154766434
-5834,5506,"IOExecutor-2","com.google.android.GoogleCamera",15154766434
-5839,5506,"AudioTrack","com.google.android.GoogleCamera",15154766434
-5845,5506,"Thread-38","com.google.android.GoogleCamera",15154766434
-5847,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766434
-5848,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766434
-5849,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766434
-5850,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766434
-5851,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766434
-5852,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766434
-5853,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766434
-5865,5506,"AsyncTask #4","com.google.android.GoogleCamera",15154766434
-5869,5506,"glide-source-th","com.google.android.GoogleCamera",15154766434
-5870,5506,"Thread-72","com.google.android.GoogleCamera",15154766434
-5872,5506,"Thread-56","com.google.android.GoogleCamera",15154766434
-5873,5506,"Thread-49","com.google.android.GoogleCamera",15154766434
-5875,5506,"Thread-52","com.google.android.GoogleCamera",15154766434
-5876,5506,"Thread-66","com.google.android.GoogleCamera",15154766434
-5877,5506,"Thread-65","com.google.android.GoogleCamera",15154766434
-5878,5506,"Thread-61","com.google.android.GoogleCamera",15154766434
-5879,5506,"Thread-58","com.google.android.GoogleCamera",15154766434
-5923,5506,"DelLifetime","com.google.android.GoogleCamera",15154766434
-5938,5506,"Thread-91","com.google.android.GoogleCamera",15154766434
-5940,5506,"Finish Thread","com.google.android.GoogleCamera",15154766434
-5941,5506,"Finish Thread","com.google.android.GoogleCamera",15154766434
-5943,5506,"Thread-85","com.google.android.GoogleCamera",15154766434
-5944,5506,"Thread-80","com.google.android.GoogleCamera",15154766434
-5945,5506,"Thread-84","com.google.android.GoogleCamera",15154766434
-5946,5506,"Thread-79","com.google.android.GoogleCamera",15154766434
-5947,5506,"Thread-81","com.google.android.GoogleCamera",15154766434
-5948,5506,"Thread-83","com.google.android.GoogleCamera",15154766434
-5949,5506,"Thread-82","com.google.android.GoogleCamera",15154766434
-6011,5506,"mv-disk-writer","com.google.android.GoogleCamera",15154766434
-1204,1204,"system_server","system_server",6809850362
-1211,1204,"ReferenceQueueD","system_server",6809850362
-1212,1204,"FinalizerDaemon","system_server",6809850362
-1213,1204,"FinalizerWatchd","system_server",6809850362
-1214,1204,"HeapTaskDaemon","system_server",6809850362
-1216,1204,"Binder:1204_1","system_server",6809850362
-1246,1204,"android.io","system_server",6809850362
-1249,1204,"android.bg","system_server",6809850362
-1250,1204,"ActivityManager","system_server",6809850362
-1251,1204,"android.ui","system_server",6809850362
-1252,1204,"ActivityManager","system_server",6809850362
-1253,1204,"ActivityManager","system_server",6809850362
-1254,1204,"batterystats-wo","system_server",6809850362
-1255,1204,"FileObserver","system_server",6809850362
-1256,1204,"android.fg","system_server",6809850362
-1257,1204,"android.display","system_server",6809850362
-1259,1204,"PowerManagerSer","system_server",6809850362
-1260,1204,"HwBinder:1204_1","system_server",6809850362
-1363,1204,"android.anim","system_server",6809850362
-1364,1204,"android.anim.lf","system_server",6809850362
-1373,1204,"SensorEventAckR","system_server",6809850362
-1374,1204,"SensorService","system_server",6809850362
-1383,1204,"SettingsProvide","system_server",6809850362
-1396,1204,"AlarmManager","system_server",6809850362
-1419,1204,"UEventObserver","system_server",6809850362
-1420,1204,"InputDispatcher","system_server",6809850362
-1421,1204,"InputReader","system_server",6809850362
-1423,1204,"NetworkWatchlis","system_server",6809850362
-1441,1204,"NetdConnector","system_server",6809850362
-1444,1204,"NetworkStats","system_server",6809850362
-1445,1204,"NetworkPolicy","system_server",6809850362
-1446,1204,"tworkPolicy.uid","system_server",6809850362
-1453,1204,"WifiService","system_server",6809850362
-1454,1204,"ClientModeImpl","system_server",6809850362
-1460,1204,"WifiScanningSer","system_server",6809850362
-1463,1204,"ConnectivitySer","system_server",6809850362
-1468,1204,"notification-sq","system_server",6809850362
-1469,1204,"ranker","system_server",6809850362
-1480,1204,"AudioService","system_server",6809850362
-1489,1204,"HwBinder:1204_3","system_server",6809850362
-1492,1204,"ConnectivityThr","system_server",6809850362
-1516,1204,"wifiAwareServic","system_server",6809850362
-1517,1204,"EthernetService","system_server",6809850362
-1519,1204,"TaskSnapshotPer","system_server",6809850362
-1525,1204,"PhotonicModulat","system_server",6809850362
-1529,1204,"LazyTaskWriterT","system_server",6809850362
-1581,1204,"NetworkStatsObs","system_server",6809850362
-1597,1204,"watchdog","system_server",6809850362
-1648,1204,"NetworkTimeUpda","system_server",6809850362
-1699,1204,"Binder:1204_4","system_server",6809850362
-1700,1204,"Binder:1204_5","system_server",6809850362
-1739,1204,"hidl_ssvc_poll","system_server",6809850362
-2274,1204,"IpClient.wlan0","system_server",6809850362
-2381,1204,"backup","system_server",6809850362
-2483,1204,"Binder:1204_A","system_server",6809850362
-2688,1204,"Binder:1204_10","system_server",6809850362
-2692,1204,"Binder:1204_12","system_server",6809850362
-2695,1204,"Binder:1204_15","system_server",6809850362
-2697,1204,"Binder:1204_16","system_server",6809850362
-3342,1204,"pool-4-thread-1","system_server",6809850362
-3482,1204,"Binder:1204_17","system_server",6809850362
-4064,1204,"Binder:1204_18","system_server",6809850362
-4743,1204,"Binder:1204_1A","system_server",6809850362
-5332,1204,"GrallocUploadTh","system_server",6809850362
-5498,1204,"RenderThread","system_server",6809850362
-5499,1204,"RenderThread","system_server",6809850362
+5506,5506,"id.GoogleCamera","com.google.android.GoogleCamera",15154766430
+5511,5506,"Jit thread pool","com.google.android.GoogleCamera",15154766430
+5512,5506,"Signal Catcher","com.google.android.GoogleCamera",15154766430
+5513,5506,"ADB-JDWP Connec","com.google.android.GoogleCamera",15154766430
+5514,5506,"ReferenceQueueD","com.google.android.GoogleCamera",15154766430
+5515,5506,"FinalizerDaemon","com.google.android.GoogleCamera",15154766430
+5516,5506,"FinalizerWatchd","com.google.android.GoogleCamera",15154766430
+5517,5506,"HeapTaskDaemon","com.google.android.GoogleCamera",15154766430
+5518,5506,"Binder:5506_1","com.google.android.GoogleCamera",15154766430
+5519,5506,"Binder:5506_2","com.google.android.GoogleCamera",15154766430
+5520,5506,"Profile Saver","com.google.android.GoogleCamera",15154766430
+5522,5506,"GoogleApiHandle","com.google.android.GoogleCamera",15154766430
+5524,5506,"queued-work-loo","com.google.android.GoogleCamera",15154766430
+5525,5506,"Executor-1","com.google.android.GoogleCamera",15154766430
+5526,5506,"Executor-2","com.google.android.GoogleCamera",15154766430
+5527,5506,"Executor-3","com.google.android.GoogleCamera",15154766430
+5528,5506,"Executor-4","com.google.android.GoogleCamera",15154766430
+5529,5506,"IOExecutor-1","com.google.android.GoogleCamera",15154766430
+5530,5506,"IndicatorUpdate","com.google.android.GoogleCamera",15154766430
+5531,5506,"CamcorderCamera","com.google.android.GoogleCamera",15154766430
+5532,5506,"Thread-11","com.google.android.GoogleCamera",15154766430
+5533,5506,"Thread-12","com.google.android.GoogleCamera",15154766430
+5534,5506,"Thread-92","com.google.android.GoogleCamera",15154766430
+5536,5506,"Executor-5","com.google.android.GoogleCamera",15154766430
+5537,5506,"Executor-6","com.google.android.GoogleCamera",15154766430
+5538,5506,"RenderThread","com.google.android.GoogleCamera",15154766430
+5541,5506,"Executor-7","com.google.android.GoogleCamera",15154766430
+5557,5506,"RenderThread","com.google.android.GoogleCamera",15154766430
+5559,5506,"RenderThread","com.google.android.GoogleCamera",15154766430
+5595,5506,"Executor-8","com.google.android.GoogleCamera",15154766430
+5596,5506,"Camera-Hndlr","com.google.android.GoogleCamera",15154766430
+5597,5506,"SoundPool","com.google.android.GoogleCamera",15154766430
+5598,5506,"SoundPoolThread","com.google.android.GoogleCamera",15154766430
+5599,5506,"UsageStatEx","com.google.android.GoogleCamera",15154766430
+5600,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5601,5506,"HwBinder:5506_1","com.google.android.GoogleCamera",15154766430
+5604,5506,"Camera-Ex","com.google.android.GoogleCamera",15154766430
+5626,5506,"Camera Handler ","com.google.android.GoogleCamera",15154766430
+5632,5506,"Camera Job Disp","com.google.android.GoogleCamera",15154766430
+5634,5506,"Binder:5506_3","com.google.android.GoogleCamera",15154766430
+5641,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5648,5506,"camera.wearable","com.google.android.GoogleCamera",15154766430
+5649,5506,"CamcorderCamera","com.google.android.GoogleCamera",15154766430
+5650,5506,"Binder:5506_4","com.google.android.GoogleCamera",15154766430
+5651,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5654,5506,"IR-RAW10w4032","com.google.android.GoogleCamera",15154766430
+5655,5506,"Binder:5506_5","com.google.android.GoogleCamera",15154766430
+5657,5506,"MicrovideoFrame","com.google.android.GoogleCamera",15154766430
+5658,5506,"AsyncTask #1","com.google.android.GoogleCamera",15154766430
+5673,5506,"IR-YUV_420_888w","com.google.android.GoogleCamera",15154766430
+5674,5506,"IR-JPEGw4032","com.google.android.GoogleCamera",15154766430
+5675,5506,"reproc-write","com.google.android.GoogleCamera",15154766430
+5676,5506,"reproc-read","com.google.android.GoogleCamera",15154766430
+5679,5506,"CameraEx-1","com.google.android.GoogleCamera",15154766430
+5680,5506,"CameraEx-2","com.google.android.GoogleCamera",15154766430
+5681,5506,"MicrovideoQShar","com.google.android.GoogleCamera",15154766430
+5682,5506,"n.StateCallback","com.google.android.GoogleCamera",15154766430
+5684,5506,"mv-vid-encoder","com.google.android.GoogleCamera",15154766430
+5686,5506,"SharedPreferenc","com.google.android.GoogleCamera",15154766430
+5696,5506,"AsyncTask #2","com.google.android.GoogleCamera",15154766430
+5701,5506,"GcaMetadataHand","com.google.android.GoogleCamera",15154766430
+5702,5506,"r.ImageListener","com.google.android.GoogleCamera",15154766430
+5703,5506,"Binder:5506_6","com.google.android.GoogleCamera",15154766430
+5706,5506,"OnDemandLoader","com.google.android.GoogleCamera",15154766430
+5713,5506,"NotificationDot","com.google.android.GoogleCamera",15154766430
+5722,5506,"GAC_Executor[0]","com.google.android.GoogleCamera",15154766430
+5729,5506,"Timer-0","com.google.android.GoogleCamera",15154766430
+5732,5506,"GAC_Executor[1]","com.google.android.GoogleCamera",15154766430
+5733,5506,"Timer-1","com.google.android.GoogleCamera",15154766430
+5734,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5743,5506,"AsyncTask #3","com.google.android.GoogleCamera",15154766430
+5760,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5769,5506,"hwuiTask1","com.google.android.GoogleCamera",15154766430
+5772,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5775,5506,"Timer-2","com.google.android.GoogleCamera",15154766430
+5781,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5793,5506,"mv-ctrl-exec","com.google.android.GoogleCamera",15154766430
+5794,5506,"ois-exec","com.google.android.GoogleCamera",15154766430
+5795,5506,"mv-meta-exec","com.google.android.GoogleCamera",15154766430
+5796,5506,"mv-gyro-exec-0","com.google.android.GoogleCamera",15154766430
+5797,5506,"DelHDR+Ind","com.google.android.GoogleCamera",15154766430
+5801,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5804,5506,"FilterHDR+Ind","com.google.android.GoogleCamera",15154766430
+5805,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5808,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5811,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5814,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5817,5506,"NDK MediaCodec_","com.google.android.GoogleCamera",15154766430
+5824,5506,"CameraProcessin","com.google.android.GoogleCamera",15154766430
+5825,5506,"ProcServ","com.google.android.GoogleCamera",15154766430
+5826,5506,"MediaCodec_loop","com.google.android.GoogleCamera",15154766430
+5827,5506,"CodecLooper","com.google.android.GoogleCamera",15154766430
+5829,5506,"Binder:5506_7","com.google.android.GoogleCamera",15154766430
+5834,5506,"IOExecutor-2","com.google.android.GoogleCamera",15154766430
+5839,5506,"AudioTrack","com.google.android.GoogleCamera",15154766430
+5845,5506,"Thread-38","com.google.android.GoogleCamera",15154766430
+5847,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766430
+5848,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766430
+5849,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766430
+5850,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766430
+5851,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766430
+5852,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766430
+5853,5506,"Capture tasks: ","com.google.android.GoogleCamera",15154766430
+5865,5506,"AsyncTask #4","com.google.android.GoogleCamera",15154766430
+5869,5506,"glide-source-th","com.google.android.GoogleCamera",15154766430
+5870,5506,"Thread-72","com.google.android.GoogleCamera",15154766430
+5872,5506,"Thread-56","com.google.android.GoogleCamera",15154766430
+5873,5506,"Thread-49","com.google.android.GoogleCamera",15154766430
+5875,5506,"Thread-52","com.google.android.GoogleCamera",15154766430
+5876,5506,"Thread-66","com.google.android.GoogleCamera",15154766430
+5877,5506,"Thread-65","com.google.android.GoogleCamera",15154766430
+5878,5506,"Thread-61","com.google.android.GoogleCamera",15154766430
+5879,5506,"Thread-58","com.google.android.GoogleCamera",15154766430
+5923,5506,"DelLifetime","com.google.android.GoogleCamera",15154766430
+5938,5506,"Thread-91","com.google.android.GoogleCamera",15154766430
+5940,5506,"Finish Thread","com.google.android.GoogleCamera",15154766430
+5941,5506,"Finish Thread","com.google.android.GoogleCamera",15154766430
+5943,5506,"Thread-85","com.google.android.GoogleCamera",15154766430
+5944,5506,"Thread-80","com.google.android.GoogleCamera",15154766430
+5945,5506,"Thread-84","com.google.android.GoogleCamera",15154766430
+5946,5506,"Thread-79","com.google.android.GoogleCamera",15154766430
+5947,5506,"Thread-81","com.google.android.GoogleCamera",15154766430
+5948,5506,"Thread-83","com.google.android.GoogleCamera",15154766430
+5949,5506,"Thread-82","com.google.android.GoogleCamera",15154766430
+6011,5506,"mv-disk-writer","com.google.android.GoogleCamera",15154766430
+1204,1204,"system_server","system_server",6809850360
+1211,1204,"ReferenceQueueD","system_server",6809850360
+1212,1204,"FinalizerDaemon","system_server",6809850360
+1213,1204,"FinalizerWatchd","system_server",6809850360
+1214,1204,"HeapTaskDaemon","system_server",6809850360
+1216,1204,"Binder:1204_1","system_server",6809850360
+1246,1204,"android.io","system_server",6809850360
+1249,1204,"android.bg","system_server",6809850360
+1250,1204,"ActivityManager","system_server",6809850360
+1251,1204,"android.ui","system_server",6809850360
+1252,1204,"ActivityManager","system_server",6809850360
+1253,1204,"ActivityManager","system_server",6809850360
+1254,1204,"batterystats-wo","system_server",6809850360
+1255,1204,"FileObserver","system_server",6809850360
+1256,1204,"android.fg","system_server",6809850360
+1257,1204,"android.display","system_server",6809850360
+1259,1204,"PowerManagerSer","system_server",6809850360
+1260,1204,"HwBinder:1204_1","system_server",6809850360
+1363,1204,"android.anim","system_server",6809850360
+1364,1204,"android.anim.lf","system_server",6809850360
+1373,1204,"SensorEventAckR","system_server",6809850360
+1374,1204,"SensorService","system_server",6809850360
+1383,1204,"SettingsProvide","system_server",6809850360
+1396,1204,"AlarmManager","system_server",6809850360
+1419,1204,"UEventObserver","system_server",6809850360
+1420,1204,"InputDispatcher","system_server",6809850360
+1421,1204,"InputReader","system_server",6809850360
+1423,1204,"NetworkWatchlis","system_server",6809850360
+1441,1204,"NetdConnector","system_server",6809850360
+1444,1204,"NetworkStats","system_server",6809850360
+1445,1204,"NetworkPolicy","system_server",6809850360
+1446,1204,"tworkPolicy.uid","system_server",6809850360
+1453,1204,"WifiService","system_server",6809850360
+1454,1204,"ClientModeImpl","system_server",6809850360
+1460,1204,"WifiScanningSer","system_server",6809850360
+1463,1204,"ConnectivitySer","system_server",6809850360
+1468,1204,"notification-sq","system_server",6809850360
+1469,1204,"ranker","system_server",6809850360
+1480,1204,"AudioService","system_server",6809850360
+1489,1204,"HwBinder:1204_3","system_server",6809850360
+1492,1204,"ConnectivityThr","system_server",6809850360
+1516,1204,"wifiAwareServic","system_server",6809850360
+1517,1204,"EthernetService","system_server",6809850360
+1519,1204,"TaskSnapshotPer","system_server",6809850360
+1525,1204,"PhotonicModulat","system_server",6809850360
+1529,1204,"LazyTaskWriterT","system_server",6809850360
+1581,1204,"NetworkStatsObs","system_server",6809850360
+1597,1204,"watchdog","system_server",6809850360
+1648,1204,"NetworkTimeUpda","system_server",6809850360
+1699,1204,"Binder:1204_4","system_server",6809850360
+1700,1204,"Binder:1204_5","system_server",6809850360
+1739,1204,"hidl_ssvc_poll","system_server",6809850360
+2274,1204,"IpClient.wlan0","system_server",6809850360
+2381,1204,"backup","system_server",6809850360
+2483,1204,"Binder:1204_A","system_server",6809850360
+2688,1204,"Binder:1204_10","system_server",6809850360
+2692,1204,"Binder:1204_12","system_server",6809850360
+2695,1204,"Binder:1204_15","system_server",6809850360
+2697,1204,"Binder:1204_16","system_server",6809850360
+3342,1204,"pool-4-thread-1","system_server",6809850360
+3482,1204,"Binder:1204_17","system_server",6809850360
+4064,1204,"Binder:1204_18","system_server",6809850360
+4743,1204,"Binder:1204_1A","system_server",6809850360
+5332,1204,"GrallocUploadTh","system_server",6809850360
+5498,1204,"RenderThread","system_server",6809850360
+5499,1204,"RenderThread","system_server",6809850360
 5313,5313,".android.chrome","com.android.chrome",5125412570
 5318,5313,"Jit thread pool","com.android.chrome",5125412570
 5319,5313,"Signal Catcher","com.android.chrome",5125412570
@@ -375,6 +239,142 @@
 5502,5313,"TaskSchedulerFo","com.android.chrome",5125412570
 5503,5313,"TaskSchedulerFo","com.android.chrome",5125412570
 5935,5313,"Binder:5313_5","com.android.chrome",5125412570
+2,2,"kthreadd","kthreadd",5068681085
+3,2,"ksoftirqd/0","kthreadd",5068681085
+4,2,"kworker/0:0","kthreadd",5068681085
+6,2,"kworker/u16:0","kthreadd",5068681085
+7,2,"rcu_preempt","kthreadd",5068681085
+8,2,"rcu_sched","kthreadd",5068681085
+10,2,"rcuop/0","kthreadd",5068681085
+11,2,"rcuos/0","kthreadd",5068681085
+13,2,"migration/0","kthreadd",5068681085
+14,2,"watchdog/0","kthreadd",5068681085
+15,2,"watchdog/1","kthreadd",5068681085
+16,2,"migration/1","kthreadd",5068681085
+17,2,"ksoftirqd/1","kthreadd",5068681085
+18,2,"kworker/1:0","kthreadd",5068681085
+20,2,"rcuop/1","kthreadd",5068681085
+21,2,"rcuos/1","kthreadd",5068681085
+23,2,"watchdog/2","kthreadd",5068681085
+24,2,"migration/2","kthreadd",5068681085
+25,2,"ksoftirqd/2","kthreadd",5068681085
+28,2,"rcuop/2","kthreadd",5068681085
+29,2,"rcuos/2","kthreadd",5068681085
+31,2,"watchdog/3","kthreadd",5068681085
+32,2,"migration/3","kthreadd",5068681085
+33,2,"ksoftirqd/3","kthreadd",5068681085
+34,2,"kworker/3:0","kthreadd",5068681085
+36,2,"rcuop/3","kthreadd",5068681085
+37,2,"rcuos/3","kthreadd",5068681085
+39,2,"watchdog/4","kthreadd",5068681085
+40,2,"migration/4","kthreadd",5068681085
+41,2,"ksoftirqd/4","kthreadd",5068681085
+42,2,"kworker/4:0","kthreadd",5068681085
+44,2,"rcuop/4","kthreadd",5068681085
+45,2,"rcuos/4","kthreadd",5068681085
+47,2,"watchdog/5","kthreadd",5068681085
+48,2,"migration/5","kthreadd",5068681085
+49,2,"ksoftirqd/5","kthreadd",5068681085
+52,2,"rcuop/5","kthreadd",5068681085
+53,2,"rcuos/5","kthreadd",5068681085
+55,2,"watchdog/6","kthreadd",5068681085
+56,2,"migration/6","kthreadd",5068681085
+57,2,"ksoftirqd/6","kthreadd",5068681085
+60,2,"rcuop/6","kthreadd",5068681085
+61,2,"rcuos/6","kthreadd",5068681085
+63,2,"watchdog/7","kthreadd",5068681085
+64,2,"migration/7","kthreadd",5068681085
+65,2,"ksoftirqd/7","kthreadd",5068681085
+66,2,"kworker/7:0","kthreadd",5068681085
+68,2,"rcuop/7","kthreadd",5068681085
+69,2,"rcuos/7","kthreadd",5068681085
+80,2,"kworker/0:1","kthreadd",5068681085
+81,2,"smem_native_mps","kthreadd",5068681085
+82,2,"mpss_smem_glink","kthreadd",5068681085
+83,2,"smem_native_lpa","kthreadd",5068681085
+84,2,"lpass_smem_glin","kthreadd",5068681085
+85,2,"smem_native_dsp","kthreadd",5068681085
+86,2,"dsps_smem_glink","kthreadd",5068681085
+87,2,"smem_native_rpm","kthreadd",5068681085
+91,2,"msm_watchdog","kthreadd",5068681085
+93,2,"kworker/u16:1","kthreadd",5068681085
+94,2,"irq/126-cpr3","kthreadd",5068681085
+105,2,"system","kthreadd",5068681085
+150,2,"kswapd0","kthreadd",5068681085
+188,2,"vsync_retire_wo","kthreadd",5068681085
+193,2,"spi_wdsp","kthreadd",5068681085
+194,2,"wdsp_spi_glink_","kthreadd",5068681085
+201,2,"kworker/4:1","kthreadd",5068681085
+215,2,"hwrng","kthreadd",5068681085
+217,2,"kworker/2:1","kthreadd",5068681085
+253,2,"kworker/3:1","kthreadd",5068681085
+292,2,"kgsl_worker_thr","kthreadd",5068681085
+321,2,"irq/286-soc:fp_","kthreadd",5068681085
+329,2,"kworker/5:1","kthreadd",5068681085
+330,2,"spi2","kthreadd",5068681085
+345,2,"irq/262-vl53l0_","kthreadd",5068681085
+360,2,"kworker/u16:6","kthreadd",5068681085
+368,2,"rot_commitq_0_0","kthreadd",5068681085
+370,2,"rot_doneq_0_0","kthreadd",5068681085
+372,2,"kworker/4:3","kthreadd",5068681085
+411,2,"kworker/1:1","kthreadd",5068681085
+415,2,"kworker/6:2","kthreadd",5068681085
+459,2,"irq/226-bcm1560","kthreadd",5068681085
+462,2,"kworker/u16:8","kthreadd",5068681085
+492,2,"irq/747-ima-rdy","kthreadd",5068681085
+520,2,"kworker/5:2","kthreadd",5068681085
+521,2,"set_state_work","kthreadd",5068681085
+522,2,"irq/227-mnh-rea","kthreadd",5068681085
+523,2,"irq/751-mnh_pci","kthreadd",5068681085
+524,2,"irq/752-mnh_pci","kthreadd",5068681085
+526,2,"irq/754-mnh_pci","kthreadd",5068681085
+528,2,"irq/758-mnh_pci","kthreadd",5068681085
+545,2,"kworker/6:1H","kthreadd",5068681085
+546,2,"kworker/4:1H","kthreadd",5068681085
+547,2,"kworker/7:1H","kthreadd",5068681085
+549,2,"kworker/5:1H","kthreadd",5068681085
+559,2,"kworker/0:1H","kthreadd",5068681085
+561,2,"kworker/u16:10","kthreadd",5068681085
+568,2,"irq/760-synapti","kthreadd",5068681085
+592,2,"sugov:0","kthreadd",5068681085
+593,2,"sugov:4","kthreadd",5068681085
+597,2,"kauditd","kthreadd",5068681085
+610,2,"wlan_logging_th","kthreadd",5068681085
+634,2,"kworker/1:3","kthreadd",5068681085
+640,2,"kworker/7:2","kthreadd",5068681085
+641,2,"jbd2/sda45-8","kthreadd",5068681085
+665,2,"kworker/0:3","kthreadd",5068681085
+667,2,"kworker/0:4","kthreadd",5068681085
+695,2,"msm_slim_qmi_cl","kthreadd",5068681085
+704,2,"kworker/5:3","kthreadd",5068681085
+737,2,"kworker/2:1H","kthreadd",5068681085
+738,2,"kworker/u16:11","kthreadd",5068681085
+739,2,"kworker/u16:12","kthreadd",5068681085
+756,2,"kworker/1:1H","kthreadd",5068681085
+807,2,"irq/254-wcd9xxx","kthreadd",5068681085
+829,2,"kworker/u16:13","kthreadd",5068681085
+860,2,"kworker/u16:14","kthreadd",5068681085
+872,2,"kworker/3:2","kthreadd",5068681085
+877,2,"kworker/u16:15","kthreadd",5068681085
+926,2,"kworker/3:1H","kthreadd",5068681085
+1055,2,"kworker/7:3","kthreadd",5068681085
+1084,2,"kworker/u17:1","kthreadd",5068681085
+1948,2,"kworker/2:2","kthreadd",5068681085
+2188,2,"cds_mc_thread","kthreadd",5068681085
+2189,2,"cds_ol_rx_threa","kthreadd",5068681085
+2287,2,"irq/35-1008000.","kthreadd",5068681085
+3776,2,"kworker/3:3","kthreadd",5068681085
+4494,2,"mdss_fb0","kthreadd",5068681085
+4795,2,"kworker/2:3","kthreadd",5068681085
+5492,2,"kworker/3:4","kthreadd",5068681085
+5745,2,"irq/163-arm-smm","kthreadd",5068681085
+5759,2,"irq/164-arm-smm","kthreadd",5068681085
+5778,2,"irq/165-arm-smm","kthreadd",5068681085
+5780,2,"ois_wq","kthreadd",5068681085
+5798,2,"rot_fenceq_0_0","kthreadd",5068681085
+5799,2,"irq/166-arm-smm","kthreadd",5068681085
+5800,2,"irq/167-arm-smm","kthreadd",5068681085
+5932,2,"mdss_fb0","kthreadd",5068681085
 5348,5348,"dboxed_process0","com.android.chrome:sandboxed_process0",3569713072
 5353,5348,"Jit thread pool","com.android.chrome:sandboxed_process0",3569713072
 5354,5348,"Signal Catcher","com.android.chrome:sandboxed_process0",3569713072
@@ -404,100 +404,100 @@
 5455,5348,"ScriptStreamer ","com.android.chrome:sandboxed_process0",3569713072
 5462,5348,"Media","com.android.chrome:sandboxed_process0",3569713072
 5475,5348,"AudioOutputDevi","com.android.chrome:sandboxed_process0",3569713072
-759,759,"provider@2.4-se","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-1543,759,"CAM_imgTh","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-1696,759,"provider@2.4-se","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-1926,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5606,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5607,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5608,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5609,759,"QCamera3HdrPlus","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5610,759,"CAM_MctServ","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5611,759,"CAM_MctBus","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5614,759,"CAM_sensor","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5617,759,"CAM_iface_ses","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5620,759,"CAM_img_msg","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5621,759,"CAM_img_msg","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5622,759,"CAM_cpp","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5623,759,"CAM_isp_trigger","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5624,759,"CAM_c2d","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5625,759,"CAM_hw_update","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5627,759,"CAM_isp_parser","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5628,759,"CAM_startsensor","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5629,759,"CAM_gyro_sens","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5630,759,"CAM_startsensor","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5631,759,"CAM_startsensor","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5633,759,"CAM_img_msg","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5635,759,"CAM_AECAWB","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5636,759,"CAM_AF","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5637,759,"CAM_AFD","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5638,759,"CAM_ASD","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5639,759,"CAM_Dispatch","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5640,759,"CAM_evntPoll","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5644,759,"CAM_dataPoll","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5704,759,"cam_data_proc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5705,759,"cam_data_proc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5707,759,"mm_jpeg_thread","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5708,759,"OMX_ImgEnc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5709,759,"cam_data_proc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5710,759,"cam_data_proc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5711,759,"cam_data_proc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5719,759,"CAM_img","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5720,759,"CAM_img","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5721,759,"CAM_METADATA","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5723,759,"CAM_ANALYSISCAM","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5724,759,"CAM_PREVIEW","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5725,759,"CAM_SNAPSHOT","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5726,759,"CAM_CALLBACK","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5727,759,"CAM_CALLBACK","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5728,759,"CAM_RAW","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5730,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5731,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5742,759,"CAM_iface_poll","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5744,759,"CAM_iface_hw","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5752,759,"HwBinder:759_2","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5756,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5757,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5758,759,"CAM_laser_sens","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5762,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5765,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5766,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5767,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5768,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5770,759,"HwBinder:759_3","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5776,759,"CAM_sof_timer","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-5862,759,"HwBinder:759_4","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433441
-1572,1572,"ndroid.systemui","com.android.systemui",3072242745
-1580,1572,"Jit thread pool","com.android.systemui",3072242745
-1584,1572,"ReferenceQueueD","com.android.systemui",3072242745
-1585,1572,"FinalizerDaemon","com.android.systemui",3072242745
-1586,1572,"FinalizerWatchd","com.android.systemui",3072242745
-1587,1572,"HeapTaskDaemon","com.android.systemui",3072242745
-1589,1572,"Binder:1572_1","com.android.systemui",3072242745
-1593,1572,"Binder:1572_2","com.android.systemui",3072242745
-1876,1572,"pool-1-thread-1","com.android.systemui",3072242745
-1932,1572,"VolumeDialogCon","com.android.systemui",3072242745
-1934,1572,"SysUiBg","com.android.systemui",3072242745
-1981,1572,"RenderThread","com.android.systemui",3072242745
-1994,1572,"ConnectivityThr","com.android.systemui",3072242745
-2002,1572,"AsyncTask #1","com.android.systemui",3072242745
-2021,1572,"async_sensor","com.android.systemui",3072242745
-2044,1572,"Binder:1572_5","com.android.systemui",3072242745
-2059,1572,"FlashlightContr","com.android.systemui",3072242745
-2079,1572,"Binder:1572_7","com.android.systemui",3072242745
-2090,1572,"recents.fg","com.android.systemui",3072242745
-2121,1572,"ScreenDecoratio","com.android.systemui",3072242745
-2256,1572,"GrallocUploadTh","com.android.systemui",3072242745
-2270,1572,"hwuiTask1","com.android.systemui",3072242745
-2275,1572,"Thread-2","com.android.systemui",3072242745
-2285,1572,"Binder:1572_8","com.android.systemui",3072242745
-5155,1572,"AsyncTask #6","com.android.systemui",3072242745
-5486,1572,"AsyncTask #7","com.android.systemui",3072242745
-5487,1572,"AsyncTask #8","com.android.systemui",3072242745
-5488,1572,"InflaterThread ","com.android.systemui",3072242745
-5489,1572,"InflaterThread ","com.android.systemui",3072242745
-5490,1572,"InflaterThread ","com.android.systemui",3072242745
-5493,1572,"InflaterThread ","com.android.systemui",3072242745
+759,759,"provider@2.4-se","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+1543,759,"CAM_imgTh","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+1696,759,"provider@2.4-se","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+1926,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5606,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5607,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5608,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5609,759,"QCamera3HdrPlus","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5610,759,"CAM_MctServ","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5611,759,"CAM_MctBus","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5614,759,"CAM_sensor","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5617,759,"CAM_iface_ses","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5620,759,"CAM_img_msg","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5621,759,"CAM_img_msg","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5622,759,"CAM_cpp","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5623,759,"CAM_isp_trigger","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5624,759,"CAM_c2d","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5625,759,"CAM_hw_update","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5627,759,"CAM_isp_parser","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5628,759,"CAM_startsensor","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5629,759,"CAM_gyro_sens","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5630,759,"CAM_startsensor","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5631,759,"CAM_startsensor","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5633,759,"CAM_img_msg","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5635,759,"CAM_AECAWB","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5636,759,"CAM_AF","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5637,759,"CAM_AFD","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5638,759,"CAM_ASD","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5639,759,"CAM_Dispatch","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5640,759,"CAM_evntPoll","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5644,759,"CAM_dataPoll","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5704,759,"cam_data_proc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5705,759,"cam_data_proc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5707,759,"mm_jpeg_thread","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5708,759,"OMX_ImgEnc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5709,759,"cam_data_proc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5710,759,"cam_data_proc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5711,759,"cam_data_proc","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5719,759,"CAM_img","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5720,759,"CAM_img","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5721,759,"CAM_METADATA","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5723,759,"CAM_ANALYSISCAM","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5724,759,"CAM_PREVIEW","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5725,759,"CAM_SNAPSHOT","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5726,759,"CAM_CALLBACK","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5727,759,"CAM_CALLBACK","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5728,759,"CAM_RAW","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5730,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5731,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5742,759,"CAM_iface_poll","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5744,759,"CAM_iface_hw","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5752,759,"HwBinder:759_2","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5756,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5757,759,"HwBinder:759_1","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5758,759,"CAM_laser_sens","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5762,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5765,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5766,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5767,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5768,759,"CAM_StrmAppDat","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5770,759,"HwBinder:759_3","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5776,759,"CAM_sof_timer","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+5862,759,"HwBinder:759_4","/vendor/bin/hw/android.hardware.camera.provider@2.4-service",3337433438
+1572,1572,"ndroid.systemui","com.android.systemui",3072242741
+1580,1572,"Jit thread pool","com.android.systemui",3072242741
+1584,1572,"ReferenceQueueD","com.android.systemui",3072242741
+1585,1572,"FinalizerDaemon","com.android.systemui",3072242741
+1586,1572,"FinalizerWatchd","com.android.systemui",3072242741
+1587,1572,"HeapTaskDaemon","com.android.systemui",3072242741
+1589,1572,"Binder:1572_1","com.android.systemui",3072242741
+1593,1572,"Binder:1572_2","com.android.systemui",3072242741
+1876,1572,"pool-1-thread-1","com.android.systemui",3072242741
+1932,1572,"VolumeDialogCon","com.android.systemui",3072242741
+1934,1572,"SysUiBg","com.android.systemui",3072242741
+1981,1572,"RenderThread","com.android.systemui",3072242741
+1994,1572,"ConnectivityThr","com.android.systemui",3072242741
+2002,1572,"AsyncTask #1","com.android.systemui",3072242741
+2021,1572,"async_sensor","com.android.systemui",3072242741
+2044,1572,"Binder:1572_5","com.android.systemui",3072242741
+2059,1572,"FlashlightContr","com.android.systemui",3072242741
+2079,1572,"Binder:1572_7","com.android.systemui",3072242741
+2090,1572,"recents.fg","com.android.systemui",3072242741
+2121,1572,"ScreenDecoratio","com.android.systemui",3072242741
+2256,1572,"GrallocUploadTh","com.android.systemui",3072242741
+2270,1572,"hwuiTask1","com.android.systemui",3072242741
+2275,1572,"Thread-2","com.android.systemui",3072242741
+2285,1572,"Binder:1572_8","com.android.systemui",3072242741
+5155,1572,"AsyncTask #6","com.android.systemui",3072242741
+5486,1572,"AsyncTask #7","com.android.systemui",3072242741
+5487,1572,"AsyncTask #8","com.android.systemui",3072242741
+5488,1572,"InflaterThread ","com.android.systemui",3072242741
+5489,1572,"InflaterThread ","com.android.systemui",3072242741
+5490,1572,"InflaterThread ","com.android.systemui",3072242741
+5493,1572,"InflaterThread ","com.android.systemui",3072242741
 2400,2400,"earchbox:search","com.google.android.googlequicksearchbox:search",2487567838
 2428,2400,"Jit thread pool","com.google.android.googlequicksearchbox:search",2487567838
 2442,2400,"ReferenceQueueD","com.google.android.googlequicksearchbox:search",2487567838
@@ -544,31 +544,31 @@
 5491,2400,"TaskSchedulerFo","com.google.android.googlequicksearchbox:search",2487567838
 5539,2400,"TaskSchedulerBa","com.google.android.googlequicksearchbox:search",2487567838
 5540,2400,"TaskSchedulerFo","com.google.android.googlequicksearchbox:search",2487567838
-5377,5377,"ileged_process0","com.android.chrome:privileged_process0",2338957110
-5384,5377,"Jit thread pool","com.android.chrome:privileged_process0",2338957110
-5385,5377,"Signal Catcher","com.android.chrome:privileged_process0",2338957110
-5386,5377,"ADB-JDWP Connec","com.android.chrome:privileged_process0",2338957110
-5387,5377,"ReferenceQueueD","com.android.chrome:privileged_process0",2338957110
-5388,5377,"FinalizerDaemon","com.android.chrome:privileged_process0",2338957110
-5389,5377,"FinalizerWatchd","com.android.chrome:privileged_process0",2338957110
-5390,5377,"HeapTaskDaemon","com.android.chrome:privileged_process0",2338957110
-5391,5377,"Binder:5377_1","com.android.chrome:privileged_process0",2338957110
-5392,5377,"Binder:5377_2","com.android.chrome:privileged_process0",2338957110
-5393,5377,"Binder:5377_3","com.android.chrome:privileged_process0",2338957110
-5394,5377,"Profile Saver","com.android.chrome:privileged_process0",2338957110
-5395,5377,"CrGpuMain","com.android.chrome:privileged_process0",2338957110
-5397,5377,"Watchdog","com.android.chrome:privileged_process0",2338957110
-5409,5377,"TaskSchedulerSe","com.android.chrome:privileged_process0",2338957110
-5410,5377,"TaskSchedulerFo","com.android.chrome:privileged_process0",2338957110
-5411,5377,"TaskSchedulerFo","com.android.chrome:privileged_process0",2338957110
-5412,5377,"Chrome_ChildIOT","com.android.chrome:privileged_process0",2338957110
-5463,5377,"CrGpuMain","com.android.chrome:privileged_process0",2338957110
-5464,5377,"TaskSchedulerSi","com.android.chrome:privileged_process0",2338957110
-5476,5377,"AVDAAutoThread","com.android.chrome:privileged_process0",2338957110
-5477,5377,"AVDASWThread","com.android.chrome:privileged_process0",2338957110
-5478,5377,"MediaCodec_loop","com.android.chrome:privileged_process0",2338957110
-5479,5377,"JNISurfaceTextu","com.android.chrome:privileged_process0",2338957110
-5480,5377,"HwBinder:5377_1","com.android.chrome:privileged_process0",2338957110
+5377,5377,"ileged_process0","com.android.chrome:privileged_process0",2338957109
+5384,5377,"Jit thread pool","com.android.chrome:privileged_process0",2338957109
+5385,5377,"Signal Catcher","com.android.chrome:privileged_process0",2338957109
+5386,5377,"ADB-JDWP Connec","com.android.chrome:privileged_process0",2338957109
+5387,5377,"ReferenceQueueD","com.android.chrome:privileged_process0",2338957109
+5388,5377,"FinalizerDaemon","com.android.chrome:privileged_process0",2338957109
+5389,5377,"FinalizerWatchd","com.android.chrome:privileged_process0",2338957109
+5390,5377,"HeapTaskDaemon","com.android.chrome:privileged_process0",2338957109
+5391,5377,"Binder:5377_1","com.android.chrome:privileged_process0",2338957109
+5392,5377,"Binder:5377_2","com.android.chrome:privileged_process0",2338957109
+5393,5377,"Binder:5377_3","com.android.chrome:privileged_process0",2338957109
+5394,5377,"Profile Saver","com.android.chrome:privileged_process0",2338957109
+5395,5377,"CrGpuMain","com.android.chrome:privileged_process0",2338957109
+5397,5377,"Watchdog","com.android.chrome:privileged_process0",2338957109
+5409,5377,"TaskSchedulerSe","com.android.chrome:privileged_process0",2338957109
+5410,5377,"TaskSchedulerFo","com.android.chrome:privileged_process0",2338957109
+5411,5377,"TaskSchedulerFo","com.android.chrome:privileged_process0",2338957109
+5412,5377,"Chrome_ChildIOT","com.android.chrome:privileged_process0",2338957109
+5463,5377,"CrGpuMain","com.android.chrome:privileged_process0",2338957109
+5464,5377,"TaskSchedulerSi","com.android.chrome:privileged_process0",2338957109
+5476,5377,"AVDAAutoThread","com.android.chrome:privileged_process0",2338957109
+5477,5377,"AVDASWThread","com.android.chrome:privileged_process0",2338957109
+5478,5377,"MediaCodec_loop","com.android.chrome:privileged_process0",2338957109
+5479,5377,"JNISurfaceTextu","com.android.chrome:privileged_process0",2338957109
+5480,5377,"HwBinder:5377_1","com.android.chrome:privileged_process0",2338957109
 622,622,"surfaceflinger","/system/bin/surfaceflinger",2155181851
 651,622,"Binder:622_1","/system/bin/surfaceflinger",2155181851
 652,622,"Binder:622_2","/system/bin/surfaceflinger",2155181851
@@ -581,8 +581,6 @@
 1438,622,"Binder:622_4","/system/bin/surfaceflinger",2155181851
 4032,622,"Binder:622_5","/system/bin/surfaceflinger",2155181851
 5497,622,"surfaceflinger","/system/bin/surfaceflinger",2155181851
-834,834,"wifi@1.0-servic","/vendor/bin/hw/android.hardware.wifi@1.0-service",2046147338
-2265,834,"wifi@1.0-servic","/vendor/bin/hw/android.hardware.wifi@1.0-service",2046147338
 2523,2523,"s.nexuslauncher","com.google.android.apps.nexuslauncher",1639085587
 2531,2523,"Jit thread pool","com.google.android.apps.nexuslauncher",1639085587
 2545,2523,"ReferenceQueueD","com.google.android.apps.nexuslauncher",1639085587
@@ -693,44 +691,44 @@
 5911,2238,"raService] idle","com.google.android.gms",1130387110
 6013,2238,"IntentService[M","com.google.android.gms",1130387110
 6014,2238,"MediaTracker bu","com.google.android.gms",1130387110
-943,943,"omx@1.0-service","media.codec",930299908
-1107,943,"HwBinder:943_1","media.codec",930299908
-1110,943,"HwBinder:943_2","media.codec",930299908
-2165,943,"HwBinder:943_3","media.codec",930299908
-2184,943,"HwBinder:943_4","media.codec",930299908
-2229,943,"HwBinder:943_5","media.codec",930299908
-5481,943,"VideoDecCallBac","media.codec",930299908
-5483,943,"VideoDecMsgThre","media.codec",930299908
-5484,943,"OMXCallbackDisp","media.codec",930299908
-5835,943,"VideoEncMsgThre","media.codec",930299908
-5836,943,"VideoEncCallBac","media.codec",930299908
-5837,943,"OMXCallbackDisp","media.codec",930299908
-5841,943,"HwBinder:943_6","media.codec",930299908
-5854,943,"VideoEncMsgThre","media.codec",930299908
-5855,943,"VideoEncMsgThre","media.codec",930299908
-5737,5737,"oid.apps.photos","com.google.android.apps.photos",748904789
-5746,5737,"Jit thread pool","com.google.android.apps.photos",748904789
-5747,5737,"Signal Catcher","com.google.android.apps.photos",748904789
-5748,5737,"ADB-JDWP Connec","com.google.android.apps.photos",748904789
-5749,5737,"ReferenceQueueD","com.google.android.apps.photos",748904789
-5750,5737,"FinalizerDaemon","com.google.android.apps.photos",748904789
-5751,5737,"FinalizerWatchd","com.google.android.apps.photos",748904789
-5753,5737,"HeapTaskDaemon","com.google.android.apps.photos",748904789
-5754,5737,"Binder:5737_1","com.google.android.apps.photos",748904789
-5755,5737,"Binder:5737_2","com.google.android.apps.photos",748904789
-5761,5737,"Binder:5737_3","com.google.android.apps.photos",748904789
-5771,5737,"Profile Saver","com.google.android.apps.photos",748904789
-5777,5737,"default_backgro","com.google.android.apps.photos",748904789
-5779,5737,"Primes-init-1","com.google.android.apps.photos",748904789
-5787,5737,"queued-work-loo","com.google.android.apps.photos",748904789
-5788,5737,"MediaPageFetche","com.google.android.apps.photos",748904789
-5832,5737,"glide-source-th","com.google.android.apps.photos",748904789
-5866,5737,"glide-source-th","com.google.android.apps.photos",748904789
-6012,5737,"glide-source-th","com.google.android.apps.photos",748904789
-6017,5737,"Binder:5737_4","com.google.android.apps.photos",748904789
-6021,5737,"GrallocUploadTh","com.google.android.apps.photos",748904789
-6022,5737,"glide-active-re","com.google.android.apps.photos",748904789
-6025,5737,"BackgroundTask ","com.google.android.apps.photos",748904789
+943,943,"omx@1.0-service","media.codec",930299907
+1107,943,"HwBinder:943_1","media.codec",930299907
+1110,943,"HwBinder:943_2","media.codec",930299907
+2165,943,"HwBinder:943_3","media.codec",930299907
+2184,943,"HwBinder:943_4","media.codec",930299907
+2229,943,"HwBinder:943_5","media.codec",930299907
+5481,943,"VideoDecCallBac","media.codec",930299907
+5483,943,"VideoDecMsgThre","media.codec",930299907
+5484,943,"OMXCallbackDisp","media.codec",930299907
+5835,943,"VideoEncMsgThre","media.codec",930299907
+5836,943,"VideoEncCallBac","media.codec",930299907
+5837,943,"OMXCallbackDisp","media.codec",930299907
+5841,943,"HwBinder:943_6","media.codec",930299907
+5854,943,"VideoEncMsgThre","media.codec",930299907
+5855,943,"VideoEncMsgThre","media.codec",930299907
+5737,5737,"oid.apps.photos","com.google.android.apps.photos",748904788
+5746,5737,"Jit thread pool","com.google.android.apps.photos",748904788
+5747,5737,"Signal Catcher","com.google.android.apps.photos",748904788
+5748,5737,"ADB-JDWP Connec","com.google.android.apps.photos",748904788
+5749,5737,"ReferenceQueueD","com.google.android.apps.photos",748904788
+5750,5737,"FinalizerDaemon","com.google.android.apps.photos",748904788
+5751,5737,"FinalizerWatchd","com.google.android.apps.photos",748904788
+5753,5737,"HeapTaskDaemon","com.google.android.apps.photos",748904788
+5754,5737,"Binder:5737_1","com.google.android.apps.photos",748904788
+5755,5737,"Binder:5737_2","com.google.android.apps.photos",748904788
+5761,5737,"Binder:5737_3","com.google.android.apps.photos",748904788
+5771,5737,"Profile Saver","com.google.android.apps.photos",748904788
+5777,5737,"default_backgro","com.google.android.apps.photos",748904788
+5779,5737,"Primes-init-1","com.google.android.apps.photos",748904788
+5787,5737,"queued-work-loo","com.google.android.apps.photos",748904788
+5788,5737,"MediaPageFetche","com.google.android.apps.photos",748904788
+5832,5737,"glide-source-th","com.google.android.apps.photos",748904788
+5866,5737,"glide-source-th","com.google.android.apps.photos",748904788
+6012,5737,"glide-source-th","com.google.android.apps.photos",748904788
+6017,5737,"Binder:5737_4","com.google.android.apps.photos",748904788
+6021,5737,"GrallocUploadTh","com.google.android.apps.photos",748904788
+6022,5737,"glide-active-re","com.google.android.apps.photos",748904788
+6025,5737,"BackgroundTask ","com.google.android.apps.photos",748904788
 1657,1657,"reel.wallpapers","com.breel.wallpapers",638226980
 1663,1657,"Jit thread pool","com.breel.wallpapers",638226980
 1774,1657,"Binder:1657_3","com.breel.wallpapers",638226980
@@ -743,33 +741,33 @@
 686,624,"HWC_UeventThrea","/vendor/bin/hw/android.hardware.graphics.composer@2.1-service",617056001
 687,624,"HwBinder:624_1","/vendor/bin/hw/android.hardware.graphics.composer@2.1-service",617056001
 741,624,"HwBinder:624_2","/vendor/bin/hw/android.hardware.graphics.composer@2.1-service",617056001
-804,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-955,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-959,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-975,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-976,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-977,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1015,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1016,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1040,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1041,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1046,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1047,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1050,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1051,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1069,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1070,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1075,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1076,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1082,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1083,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1085,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1368,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1391,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1392,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-1393,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-5694,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
-5695,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607816
+804,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+955,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+959,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+975,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+976,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+977,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1015,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1016,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1040,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1041,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1046,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1047,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1050,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1051,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1069,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1070,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1075,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1076,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1082,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1083,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1085,804,"sensors@1.0-ser","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1368,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1391,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1392,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+1393,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+5694,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
+5695,804,"HwBinder:804_1","/vendor/bin/hw/android.hardware.sensors@1.0-service",536607815
 5542,5542,"ssioncontroller","com.google.android.permissioncontroller",521893072
 5547,5542,"Jit thread pool","com.google.android.permissioncontroller",521893072
 5548,5542,"Signal Catcher","com.google.android.permissioncontroller",521893072
@@ -942,6 +940,8 @@
 5173,2712,"Binder:2712_6","com.android.vending",177335230
 5593,2712,"acquisitions.db","com.android.vending",177335230
 6020,2712,"Binder:2712_7","com.android.vending",177335230
+834,834,"wifi@1.0-servic","/vendor/bin/hw/android.hardware.wifi@1.0-service",158591003
+2265,834,"wifi@1.0-servic","/vendor/bin/hw/android.hardware.wifi@1.0-service",158591003
 968,968,"[NULL]","/vendor/bin/hw/android.hardware.biometrics.fingerprint@2.1-service.fpc",154062201
 1165,968,"fingerprint@2.1","/vendor/bin/hw/android.hardware.biometrics.fingerprint@2.1-service.fpc",154062201
 935,935,"[NULL]","/system/bin/statsd",128205711
@@ -950,19 +950,19 @@
 1354,924,"Binder:924_3","/system/bin/installd",125398920
 1371,924,"Binder:924_4","/system/bin/installd",125398920
 1381,924,"Binder:924_5","/system/bin/installd",125398920
-5659,5659,"e.process.gapps","com.google.process.gapps",116729960
-5664,5659,"Jit thread pool","com.google.process.gapps",116729960
-5665,5659,"Signal Catcher","com.google.process.gapps",116729960
-5666,5659,"ADB-JDWP Connec","com.google.process.gapps",116729960
-5667,5659,"ReferenceQueueD","com.google.process.gapps",116729960
-5668,5659,"FinalizerDaemon","com.google.process.gapps",116729960
-5669,5659,"FinalizerWatchd","com.google.process.gapps",116729960
-5670,5659,"HeapTaskDaemon","com.google.process.gapps",116729960
-5671,5659,"Binder:5659_1","com.google.process.gapps",116729960
-5672,5659,"Binder:5659_2","com.google.process.gapps",116729960
-5677,5659,"Binder:5659_3","com.google.process.gapps",116729960
-5678,5659,"Profile Saver","com.google.process.gapps",116729960
-5692,5659,"RefQueueWorker@","com.google.process.gapps",116729960
+5659,5659,"e.process.gapps","com.google.process.gapps",116729959
+5664,5659,"Jit thread pool","com.google.process.gapps",116729959
+5665,5659,"Signal Catcher","com.google.process.gapps",116729959
+5666,5659,"ADB-JDWP Connec","com.google.process.gapps",116729959
+5667,5659,"ReferenceQueueD","com.google.process.gapps",116729959
+5668,5659,"FinalizerDaemon","com.google.process.gapps",116729959
+5669,5659,"FinalizerWatchd","com.google.process.gapps",116729959
+5670,5659,"HeapTaskDaemon","com.google.process.gapps",116729959
+5671,5659,"Binder:5659_1","com.google.process.gapps",116729959
+5672,5659,"Binder:5659_2","com.google.process.gapps",116729959
+5677,5659,"Binder:5659_3","com.google.process.gapps",116729959
+5678,5659,"Profile Saver","com.google.process.gapps",116729959
+5692,5659,"RefQueueWorker@","com.google.process.gapps",116729959
 5252,5252,"android.ramdump","com.android.ramdump",88012042
 5257,5252,"Jit thread pool","com.android.ramdump",88012042
 5258,5252,"Signal Catcher","com.android.ramdump",88012042
@@ -1248,408 +1248,3 @@
 5061,2963,"Binder:2963_8","com.google.process.gapps",179740
 4650,4650,"e.android.volta","com.google.android.volta",173594
 4666,4650,"Binder:4650_1","com.google.android.volta",173594
-0,"[NULL]","swapper","[NULL]","[NULL]"
-1610,"[NULL]","ReferenceQueueD","[NULL]","[NULL]"
-1611,"[NULL]","FinalizerDaemon","[NULL]","[NULL]"
-1612,"[NULL]","FinalizerWatchd","[NULL]","[NULL]"
-1613,"[NULL]","HeapTaskDaemon","[NULL]","[NULL]"
-2088,"[NULL]","AsyncTask #4","[NULL]","[NULL]"
-2281,"[NULL]","InflaterThread ","[NULL]","[NULL]"
-2282,"[NULL]","InflaterThread ","[NULL]","[NULL]"
-2283,"[NULL]","InflaterThread ","[NULL]","[NULL]"
-2329,"[NULL]","InflaterThread ","[NULL]","[NULL]"
-2817,"[NULL]","BlockingExecuto","[NULL]","[NULL]"
-2968,"[NULL]","Jit thread pool","[NULL]","[NULL]"
-2969,"[NULL]","Signal Catcher","[NULL]","[NULL]"
-2970,"[NULL]","ADB-JDWP Connec","[NULL]","[NULL]"
-2971,"[NULL]","ReferenceQueueD","[NULL]","[NULL]"
-2972,"[NULL]","FinalizerDaemon","[NULL]","[NULL]"
-2973,"[NULL]","FinalizerWatchd","[NULL]","[NULL]"
-2974,"[NULL]","HeapTaskDaemon","[NULL]","[NULL]"
-2982,"[NULL]","Binder:2963_1","[NULL]","[NULL]"
-2985,"[NULL]","Binder:2963_2","[NULL]","[NULL]"
-2986,"[NULL]","Binder:2963_3","[NULL]","[NULL]"
-2992,"[NULL]","Profile Saver","[NULL]","[NULL]"
-3073,"[NULL]","RefQueueWorker@","[NULL]","[NULL]"
-3095,"[NULL]","AsyncTask #1","[NULL]","[NULL]"
-3097,"[NULL]","AsyncTask #2","[NULL]","[NULL]"
-3140,"[NULL]","AsyncTask #3","[NULL]","[NULL]"
-3434,"[NULL]","measurement-1","[NULL]","[NULL]"
-3513,"[NULL]","Binder:2963_4","[NULL]","[NULL]"
-3607,"[NULL]","pool-4-thread-1","[NULL]","[NULL]"
-3941,"[NULL]","Jit thread pool","[NULL]","[NULL]"
-3942,"[NULL]","Signal Catcher","[NULL]","[NULL]"
-3944,"[NULL]","ADB-JDWP Connec","[NULL]","[NULL]"
-3945,"[NULL]","ReferenceQueueD","[NULL]","[NULL]"
-3946,"[NULL]","FinalizerDaemon","[NULL]","[NULL]"
-3947,"[NULL]","FinalizerWatchd","[NULL]","[NULL]"
-3948,"[NULL]","HeapTaskDaemon","[NULL]","[NULL]"
-3949,"[NULL]","Binder:3934_1","[NULL]","[NULL]"
-3954,"[NULL]","Binder:3934_3","[NULL]","[NULL]"
-3960,"[NULL]","Profile Saver","[NULL]","[NULL]"
-4143,"[NULL]","unnerJobService","[NULL]","[NULL]"
-4200,"[NULL]","Binder:2963_5","[NULL]","[NULL]"
-4207,"[NULL]","oundTaskService","[NULL]","[NULL]"
-4230,"[NULL]","OkHttp Dispatch","[NULL]","[NULL]"
-4237,"[NULL]","OkHttp Http2Con","[NULL]","[NULL]"
-4285,"[NULL]","oundTaskService","[NULL]","[NULL]"
-4380,"[NULL]","Binder:2963_6","[NULL]","[NULL]"
-4476,"[NULL]","Binder:2963_7","[NULL]","[NULL]"
-4580,"[NULL]","Jit thread pool","[NULL]","[NULL]"
-4581,"[NULL]","Signal Catcher","[NULL]","[NULL]"
-4582,"[NULL]","ADB-JDWP Connec","[NULL]","[NULL]"
-4583,"[NULL]","ReferenceQueueD","[NULL]","[NULL]"
-4584,"[NULL]","FinalizerDaemon","[NULL]","[NULL]"
-4585,"[NULL]","FinalizerWatchd","[NULL]","[NULL]"
-4586,"[NULL]","HeapTaskDaemon","[NULL]","[NULL]"
-4587,"[NULL]","Binder:4572_1","[NULL]","[NULL]"
-4589,"[NULL]","Binder:4572_3","[NULL]","[NULL]"
-4593,"[NULL]","Profile Saver","[NULL]","[NULL]"
-4600,"[NULL]","queued-work-loo","[NULL]","[NULL]"
-4608,"[NULL]","movies_logging","[NULL]","[NULL]"
-4610,"[NULL]","RefQueueWorker@","[NULL]","[NULL]"
-4611,"[NULL]","Thread-3","[NULL]","[NULL]"
-4612,"[NULL]","Thread-4","[NULL]","[NULL]"
-4613,"[NULL]","Thread-5","[NULL]","[NULL]"
-4614,"[NULL]","RefQueueWorker@","[NULL]","[NULL]"
-4615,"[NULL]","Thread-7","[NULL]","[NULL]"
-4616,"[NULL]","Thread-8","[NULL]","[NULL]"
-4617,"[NULL]","Thread-9","[NULL]","[NULL]"
-4618,"[NULL]","Thread-10","[NULL]","[NULL]"
-4619,"[NULL]","Thread-11","[NULL]","[NULL]"
-4620,"[NULL]","tentative-gc-ru","[NULL]","[NULL]"
-4625,"[NULL]","queued-work-loo","[NULL]","[NULL]"
-4635,"[NULL]","PlayEventLogger","[NULL]","[NULL]"
-4638,"[NULL]","network-1","[NULL]","[NULL]"
-4639,"[NULL]","network-2","[NULL]","[NULL]"
-4640,"[NULL]","network-3","[NULL]","[NULL]"
-4643,"[NULL]","network-4","[NULL]","[NULL]"
-4645,"[NULL]","local-1","[NULL]","[NULL]"
-4653,"[NULL]","local-2","[NULL]","[NULL]"
-4657,"[NULL]","ConnectivityThr","[NULL]","[NULL]"
-4659,"[NULL]","Jit thread pool","[NULL]","[NULL]"
-4660,"[NULL]","Signal Catcher","[NULL]","[NULL]"
-4661,"[NULL]","ADB-JDWP Connec","[NULL]","[NULL]"
-4662,"[NULL]","ReferenceQueueD","[NULL]","[NULL]"
-4663,"[NULL]","FinalizerDaemon","[NULL]","[NULL]"
-4664,"[NULL]","FinalizerWatchd","[NULL]","[NULL]"
-4665,"[NULL]","HeapTaskDaemon","[NULL]","[NULL]"
-4667,"[NULL]","pool-5-thread-1","[NULL]","[NULL]"
-4668,"[NULL]","Binder:4650_2","[NULL]","[NULL]"
-4669,"[NULL]","sync-1","[NULL]","[NULL]"
-4672,"[NULL]","Profile Saver","[NULL]","[NULL]"
-4676,"[NULL]","GoogleApiHandle","[NULL]","[NULL]"
-4683,"[NULL]","GAC_Executor[0]","[NULL]","[NULL]"
-4684,"[NULL]","Binder:4650_3","[NULL]","[NULL]"
-4686,"[NULL]","queued-work-loo","[NULL]","[NULL]"
-4694,"[NULL]","Jit thread pool","[NULL]","[NULL]"
-4695,"[NULL]","Signal Catcher","[NULL]","[NULL]"
-4696,"[NULL]","ADB-JDWP Connec","[NULL]","[NULL]"
-4697,"[NULL]","ReferenceQueueD","[NULL]","[NULL]"
-4698,"[NULL]","FinalizerDaemon","[NULL]","[NULL]"
-4699,"[NULL]","FinalizerWatchd","[NULL]","[NULL]"
-4700,"[NULL]","HeapTaskDaemon","[NULL]","[NULL]"
-4701,"[NULL]","GAC_Executor[1]","[NULL]","[NULL]"
-4702,"[NULL]","Binder:4689_1","[NULL]","[NULL]"
-4703,"[NULL]","Binder:4689_2","[NULL]","[NULL]"
-4709,"[NULL]","Profile Saver","[NULL]","[NULL]"
-4713,"[NULL]","Binder:4689_3","[NULL]","[NULL]"
-4730,"[NULL]","queued-work-loo","[NULL]","[NULL]"
-4872,"[NULL]","pool-17-thread-","[NULL]","[NULL]"
-4873,"[NULL]","pool-17-thread-","[NULL]","[NULL]"
-4874,"[NULL]","pool-17-thread-","[NULL]","[NULL]"
-4876,"[NULL]","pool-17-thread-","[NULL]","[NULL]"
-4887,"[NULL]","Jit thread pool","[NULL]","[NULL]"
-4888,"[NULL]","Signal Catcher","[NULL]","[NULL]"
-4889,"[NULL]","ADB-JDWP Connec","[NULL]","[NULL]"
-4890,"[NULL]","ReferenceQueueD","[NULL]","[NULL]"
-4891,"[NULL]","FinalizerDaemon","[NULL]","[NULL]"
-4892,"[NULL]","FinalizerWatchd","[NULL]","[NULL]"
-4893,"[NULL]","HeapTaskDaemon","[NULL]","[NULL]"
-4894,"[NULL]","Binder:4881_1","[NULL]","[NULL]"
-4895,"[NULL]","Binder:4881_2","[NULL]","[NULL]"
-4900,"[NULL]","Profile Saver","[NULL]","[NULL]"
-4901,"[NULL]","pool-17-thread-","[NULL]","[NULL]"
-4902,"[NULL]","pool-17-thread-","[NULL]","[NULL]"
-4903,"[NULL]","pool-17-thread-","[NULL]","[NULL]"
-4904,"[NULL]","pool-17-thread-","[NULL]","[NULL]"
-4905,"[NULL]","pool-17-thread-","[NULL]","[NULL]"
-4906,"[NULL]","pool-17-thread-","[NULL]","[NULL]"
-4969,"[NULL]","Jit thread pool","[NULL]","[NULL]"
-4970,"[NULL]","Signal Catcher","[NULL]","[NULL]"
-4971,"[NULL]","ADB-JDWP Connec","[NULL]","[NULL]"
-4972,"[NULL]","ReferenceQueueD","[NULL]","[NULL]"
-4973,"[NULL]","FinalizerDaemon","[NULL]","[NULL]"
-4974,"[NULL]","FinalizerWatchd","[NULL]","[NULL]"
-4975,"[NULL]","HeapTaskDaemon","[NULL]","[NULL]"
-4977,"[NULL]","Binder:4964_2","[NULL]","[NULL]"
-4978,"[NULL]","Binder:4964_3","[NULL]","[NULL]"
-4980,"[NULL]","Profile Saver","[NULL]","[NULL]"
-4985,"[NULL]","dScanJobService","[NULL]","[NULL]"
-5064,"[NULL]","AsyncTask #5","[NULL]","[NULL]"
-5072,"[NULL]","ReferenceQueueD","[NULL]","[NULL]"
-5073,"[NULL]","FinalizerDaemon","[NULL]","[NULL]"
-5074,"[NULL]","FinalizerWatchd","[NULL]","[NULL]"
-5075,"[NULL]","HeapTaskDaemon","[NULL]","[NULL]"
-5097,"[NULL]","AsyncTask #5","[NULL]","[NULL]"
-5103,"[NULL]","AsyncTask #1","[NULL]","[NULL]"
-5108,"[NULL]","AsyncTask #2","[NULL]","[NULL]"
-5115,"[NULL]","TaskSchedulerFo","[NULL]","[NULL]"
-5119,"[NULL]",".lowPriority #0","[NULL]","[NULL]"
-5126,"[NULL]",".lowPriority #3","[NULL]","[NULL]"
-5129,"[NULL]","AsyncTask #3","[NULL]","[NULL]"
-5131,"[NULL]","AsyncTask #4","[NULL]","[NULL]"
-5157,"[NULL]","TaskSchedulerBa","[NULL]","[NULL]"
-5158,"[NULL]","TaskSchedulerFo","[NULL]","[NULL]"
-5174,"[NULL]","TaskSchedulerBa","[NULL]","[NULL]"
-5175,"[NULL]","TaskSchedulerFo","[NULL]","[NULL]"
-5176,"[NULL]","TaskSchedulerFo","[NULL]","[NULL]"
-5194,"[NULL]","ReferenceQueueD","[NULL]","[NULL]"
-5195,"[NULL]","FinalizerDaemon","[NULL]","[NULL]"
-5196,"[NULL]","FinalizerWatchd","[NULL]","[NULL]"
-5197,"[NULL]","HeapTaskDaemon","[NULL]","[NULL]"
-5218,"[NULL]","Measurement Wor","[NULL]","[NULL]"
-5228,"[NULL]","Measurement Wor","[NULL]","[NULL]"
-5238,"[NULL]","pool-6-thread-1","[NULL]","[NULL]"
-5239,"[NULL]","pool-7-thread-1","[NULL]","[NULL]"
-5243,"[NULL]","atrace","[NULL]","[NULL]"
-5268,"[NULL]","Thread-2","[NULL]","[NULL]"
-5272,"[NULL]","applyRouting","[NULL]","[NULL]"
-5280,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5291,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5296,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5305,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5309,"[NULL]","gcm-task#1","[NULL]","[NULL]"
-5329,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5331,"[NULL]","EGL Init","[NULL]","[NULL]"
-5337,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5338,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5340,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5341,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5383,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5398,"[NULL]","gcm-task#1","[NULL]","[NULL]"
-5407,"[NULL]","IntentService[D","[NULL]","[NULL]"
-5433,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5434,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5435,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5439,"[NULL]","Thread-25","[NULL]","[NULL]"
-5454,"[NULL]","netd","[NULL]","[NULL]"
-5456,"[NULL]","netd","[NULL]","[NULL]"
-5459,"[NULL]","sensors.qcom","[NULL]","[NULL]"
-5460,"[NULL]","netd","[NULL]","[NULL]"
-5469,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5470,"[NULL]","netd","[NULL]","[NULL]"
-5472,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5474,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5494,"[NULL]","netd","[NULL]","[NULL]"
-5501,"[NULL]","netd","[NULL]","[NULL]"
-5504,"[NULL]","netd","[NULL]","[NULL]"
-5505,"[NULL]","netd","[NULL]","[NULL]"
-5521,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5523,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5535,"[NULL]","EGL Init","[NULL]","[NULL]"
-5558,"[NULL]","EGL Init","[NULL]","[NULL]"
-5580,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5583,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5584,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5586,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5587,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5594,"[NULL]","sensors.qcom","[NULL]","[NULL]"
-5602,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5603,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5612,"[NULL]","CAM_startsensor","[NULL]","[NULL]"
-5613,"[NULL]","CAM_startiface","[NULL]","[NULL]"
-5615,"[NULL]","CAM_startisp","[NULL]","[NULL]"
-5616,"[NULL]","CAM_startstats","[NULL]","[NULL]"
-5618,"[NULL]","CAM_startpproc","[NULL]","[NULL]"
-5619,"[NULL]","CAM_startimglib","[NULL]","[NULL]"
-5642,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5643,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5652,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5653,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5683,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5685,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5687,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5688,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5689,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5690,"[NULL]","cam_data_proc","[NULL]","[NULL]"
-5691,"[NULL]","cam_data_proc","[NULL]","[NULL]"
-5693,"[NULL]","CAM_jpeg_jobmgr","[NULL]","[NULL]"
-5697,"[NULL]","OMX_ImgEnc","[NULL]","[NULL]"
-5698,"[NULL]","cam_data_proc","[NULL]","[NULL]"
-5699,"[NULL]","cam_data_proc","[NULL]","[NULL]"
-5700,"[NULL]","cam_data_proc","[NULL]","[NULL]"
-5714,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5715,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5716,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5717,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5718,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5735,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5736,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5763,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5764,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5773,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5774,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5782,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5783,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5784,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5785,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5786,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5789,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5790,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5791,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5792,"[NULL]","applyRouting","[NULL]","[NULL]"
-5802,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5803,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5806,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5807,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5809,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5810,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5812,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5813,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5815,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5816,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5818,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5819,"[NULL]",".vorbis.decoder","[NULL]","[NULL]"
-5820,"[NULL]","OMXCallbackDisp","[NULL]","[NULL]"
-5821,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5822,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5823,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5828,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5830,"[NULL]","HwBinder:943_4","[NULL]","[NULL]"
-5831,"[NULL]","HwBinder:943_4","[NULL]","[NULL]"
-5833,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5838,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5842,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5843,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5844,"[NULL]","gcm-task#1","[NULL]","[NULL]"
-5846,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5856,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5857,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5858,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5859,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5860,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5861,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5863,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5864,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5867,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5868,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5871,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5874,"[NULL]","gcm-task#1","[NULL]","[NULL]"
-5880,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5881,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5882,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5883,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5887,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5888,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5889,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5890,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5891,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5892,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5893,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5894,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5895,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5896,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5897,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5898,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5899,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5900,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5901,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5902,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5903,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5904,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5905,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5906,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5907,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5908,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5909,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5912,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5913,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-5914,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5915,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5916,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5917,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5918,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5919,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5920,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5921,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5922,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5924,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5925,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5926,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5927,"[NULL]","applyRouting","[NULL]","[NULL]"
-5928,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5929,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5930,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5931,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5933,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5934,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5937,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5939,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5942,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5950,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5951,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5952,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5953,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5954,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5955,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5956,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5957,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5958,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5959,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5960,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5961,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5962,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5963,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5964,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5965,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5966,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5967,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5968,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5969,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5970,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5971,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5972,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5973,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5974,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5975,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5976,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5977,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5978,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5979,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5980,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5981,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5982,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5983,"[NULL]","driver_slow_ae:","[NULL]","[NULL]"
-5984,"[NULL]","CAM_METADATA","[NULL]","[NULL]"
-5985,"[NULL]","CAM_PREVIEW","[NULL]","[NULL]"
-5986,"[NULL]","CAM_SNAPSHOT","[NULL]","[NULL]"
-5987,"[NULL]","CAM_CALLBACK","[NULL]","[NULL]"
-5988,"[NULL]","CAM_CALLBACK","[NULL]","[NULL]"
-5989,"[NULL]","CAM_RAW","[NULL]","[NULL]"
-5990,"[NULL]","CAM_ANALYSISCAM","[NULL]","[NULL]"
-5991,"[NULL]","CAM_StrmAppDat","[NULL]","[NULL]"
-5992,"[NULL]","CAM_StrmAppDat","[NULL]","[NULL]"
-5993,"[NULL]","CAM_iface_poll","[NULL]","[NULL]"
-5994,"[NULL]","CAM_iface_hw","[NULL]","[NULL]"
-5995,"[NULL]","irq/164-arm-smm","[NULL]","[NULL]"
-5996,"[NULL]","CAM_StrmAppDat","[NULL]","[NULL]"
-5997,"[NULL]","CAM_StrmAppDat","[NULL]","[NULL]"
-5998,"[NULL]","CAM_StrmAppDat","[NULL]","[NULL]"
-5999,"[NULL]","CAM_StrmAppDat","[NULL]","[NULL]"
-6000,"[NULL]","CAM_StrmAppDat","[NULL]","[NULL]"
-6001,"[NULL]","irq/165-arm-smm","[NULL]","[NULL]"
-6002,"[NULL]","CAM_sof_timer","[NULL]","[NULL]"
-6003,"[NULL]","HwBinder:759_2","[NULL]","[NULL]"
-6004,"[NULL]","CAM_stopsensor","[NULL]","[NULL]"
-6005,"[NULL]","CAM_stopiface","[NULL]","[NULL]"
-6006,"[NULL]","CAM_stopisp","[NULL]","[NULL]"
-6007,"[NULL]","CAM_stopstats","[NULL]","[NULL]"
-6008,"[NULL]","CAM_stoppproc","[NULL]","[NULL]"
-6009,"[NULL]","CAM_stopimglib","[NULL]","[NULL]"
-6010,"[NULL]","ProPrgsFin","[NULL]","[NULL]"
-6015,"[NULL]","gcm-task#1","[NULL]","[NULL]"
-6016,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-6023,"[NULL]","SharedPreferenc","[NULL]","[NULL]"
-6024,"[NULL]","sensors.qcom","[NULL]","[NULL]"
-950,950,"[NULL]","[NULL]","[NULL]"
diff --git a/tools/add_tp_diff_test.py b/tools/add_tp_diff_test.py
index 0265988..5b9912c 100755
--- a/tools/add_tp_diff_test.py
+++ b/tools/add_tp_diff_test.py
@@ -161,6 +161,11 @@
     index_file.write('{} {} {}\n'.format(trace_file, sql_file_or_metric,
                                          out_file))
 
+  index_rel_path = os.path.join(chosen_folder_path_rel_root, 'index')
+  print()
+  print(f'Please modify the index file at {index_rel_path} by adding a '
+        f'comment and grouping with related tests')
+
   return 0
 
 
diff --git a/ui/src/common/actions.ts b/ui/src/common/actions.ts
index e668c86..211da67 100644
--- a/ui/src/common/actions.ts
+++ b/ui/src/common/actions.ts
@@ -16,6 +16,9 @@
 
 import {assertExists, assertTrue} from '../base/logging';
 import {RecordConfig} from '../controller/record_config_types';
+import {globals} from '../frontend/globals';
+import {columnKey} from '../frontend/pivot_table_redux';
+import {TableColumn} from '../frontend/pivot_table_redux_query_generator';
 import {ACTUAL_FRAMES_SLICE_TRACK_KIND} from '../tracks/actual_frames/common';
 import {ASYNC_SLICE_TRACK_KIND} from '../tracks/async_slices/common';
 import {COUNTER_TRACK_KIND} from '../tracks/counter/common';
@@ -51,7 +54,7 @@
   LogsPagination,
   NewEngineMode,
   OmniboxState,
-  PivotTableReduxState,
+  PivotTableReduxResult,
   RecordingTarget,
   SCROLLING_TRACK_GROUP,
   State,
@@ -929,8 +932,15 @@
     }
   },
 
-  togglePivotTableRedux(state: StateDraft, args: {selectionArea: Area|null}) {
-    state.pivotTableRedux.selectionArea = args.selectionArea;
+  togglePivotTableRedux(state: StateDraft, args: {areaId: string|null}) {
+    state.nonSerializableState.pivotTableRedux.selectionArea =
+        args.areaId === null ?
+        null :
+        {areaId: args.areaId, tracks: globals.state.areas[args.areaId].tracks};
+    if (args.areaId !==
+        state.nonSerializableState.pivotTableRedux.selectionArea?.areaId) {
+      state.nonSerializableState.pivotTableRedux.queryResult = null;
+    }
   },
 
   addNewPivotTable(state: StateDraft, args: {
@@ -1009,14 +1019,55 @@
     pivotTable.selectedTrackIds = args.selectedTrackIds;
   },
 
-  setPivotStateReduxState(
-      state: StateDraft, args: {pivotTableState: PivotTableReduxState}) {
-    state.pivotTableRedux = args.pivotTableState;
+  setPivotStateQueryResult(
+      state: StateDraft, args: {queryResult: PivotTableReduxResult|null}) {
+    state.nonSerializableState.pivotTableRedux.queryResult = args.queryResult;
+  },
+
+  setPivotTableReduxConstrainToArea(
+      state: StateDraft, args: {constrain: boolean}) {
+    state.nonSerializableState.pivotTableRedux.constrainToArea = args.constrain;
   },
 
   dismissFlamegraphModal(state: StateDraft, _: {}) {
     state.flamegraphModalDismissed = true;
-  }
+  },
+
+  setPivotTableEditMode(state: StateDraft, args: {editMode: boolean}) {
+    state.nonSerializableState.pivotTableRedux.editMode = args.editMode;
+    if (!args.editMode) {
+      // Switching from edit mode to view mode, need to request query
+      state.nonSerializableState.pivotTableRedux.queryRequested = true;
+    }
+  },
+
+  setPivotTableQueryRequested(
+      state: StateDraft, args: {queryRequested: boolean}) {
+    state.nonSerializableState.pivotTableRedux.queryRequested =
+        args.queryRequested;
+  },
+
+  setPivotTablePivotSelected(
+      state: StateDraft, args: {column: TableColumn, selected: boolean}) {
+    if (args.selected) {
+      state.nonSerializableState.pivotTableRedux.selectedPivotsMap.set(
+          columnKey(args.column), args.column);
+    } else {
+      state.nonSerializableState.pivotTableRedux.selectedPivotsMap.delete(
+          columnKey(args.column));
+    }
+  },
+
+  setPivotTableAggregationSelected(
+      state: StateDraft, args: {column: TableColumn, selected: boolean}) {
+    if (args.selected) {
+      state.nonSerializableState.pivotTableRedux.selectedAggregations.set(
+          columnKey(args.column), args.column);
+    } else {
+      state.nonSerializableState.pivotTableRedux.selectedAggregations.delete(
+          columnKey(args.column));
+    }
+  },
 };
 
 // When we are on the frontend side, we don't really want to execute the
diff --git a/ui/src/common/empty_state.ts b/ui/src/common/empty_state.ts
index c24567b..7878f6e 100644
--- a/ui/src/common/empty_state.ts
+++ b/ui/src/common/empty_state.ts
@@ -13,13 +13,20 @@
 // limitations under the License.
 
 import {createEmptyRecordConfig} from '../controller/record_config_types';
+import {columnKey} from '../frontend/pivot_table_redux';
+import {TableColumn} from '../frontend/pivot_table_redux_query_generator';
 import {
   autosaveConfigStore,
   recordTargetStore
 } from '../frontend/record_config';
 
 import {featureFlags} from './feature_flags';
-import {defaultTraceTime, State, STATE_VERSION} from './state';
+import {
+  defaultTraceTime,
+  NonSerializableState,
+  State,
+  STATE_VERSION
+} from './state';
 
 const AUTOLOAD_STARTED_CONFIG_FLAG = featureFlags.register({
   id: 'autoloadStartedConfig',
@@ -29,6 +36,30 @@
   defaultValue: true,
 });
 
+function columnSet(...columns: TableColumn[]): Map<string, TableColumn> {
+  const result = new Map<string, TableColumn>();
+
+  for (const column of columns) {
+    result.set(columnKey(column), column);
+  }
+
+  return result;
+}
+
+export function createEmptyNonSerializableState(): NonSerializableState {
+  return {
+    pivotTableRedux: {
+      selectionArea: null,
+      queryResult: null,
+      editMode: true,
+      selectedPivotsMap: columnSet(['slice', 'category'], ['slice', 'name']),
+      selectedAggregations: columnSet(['thread_slice', 'thread_dur']),
+      constrainToArea: true,
+      queryRequested: false,
+    },
+  };
+}
+
 export function createEmptyState(): State {
   return {
     version: STATE_VERSION,
@@ -102,7 +133,6 @@
 
     fetchChromeCategories: false,
     chromeCategories: undefined,
-    pivotTableRedux:
-        {selectionArea: null, query: null, queryId: 0, queryResult: null},
+    nonSerializableState: createEmptyNonSerializableState()
   };
 }
\ No newline at end of file
diff --git a/ui/src/common/state.ts b/ui/src/common/state.ts
index cd8fb60..316bcb2 100644
--- a/ui/src/common/state.ts
+++ b/ui/src/common/state.ts
@@ -15,6 +15,7 @@
 import {assertTrue} from '../base/logging';
 import {PivotTree} from '../controller/pivot_table_redux_controller';
 import {RecordConfig} from '../controller/record_config_types';
+import {TableColumn} from '../frontend/pivot_table_redux_query_generator';
 
 import {
   AggregationAttrs,
@@ -365,16 +366,29 @@
   metadata: PivotTableReduxQueryMetadata;
 }
 
+// Input parameters to check whether the pivot table needs to be re-queried.
+export interface PivotTableReduxAreaState {
+  areaId: string;
+  tracks: string[];
+}
+
 export interface PivotTableReduxState {
   // Currently selected area, if null, pivot table is not going to be visible.
-  selectionArea: Area|null;
-  // Increasing identifier of the query request, used to avoid performing the
-  // same query more than once.
-  queryId: number;
-  // Query request
-  query: PivotTableReduxQuery|null;
+  selectionArea: PivotTableReduxAreaState|null;
   // Query response
   queryResult: PivotTableReduxResult|null;
+  // Whether the panel is in edit mode
+  editMode: boolean;
+  // Selected pivots. Map instead of Set because ES6 Set can't have
+  // non-primitive keys; here keys are concatenated values.
+  selectedPivotsMap: Map<string, TableColumn>;
+  // Selected aggregation columns. Stored same way as pivots.
+  selectedAggregations: Map<string, TableColumn>;
+  // Whether the pivot table results should be constrained to the selected area.
+  constrainToArea: boolean;
+  // Set to true by frontend to request controller to perform the query to
+  // acquire the necessary data from the engine.
+  queryRequested: boolean;
 }
 
 export interface LoadedConfigNone {
@@ -393,6 +407,10 @@
 export type LoadedConfig =
     LoadedConfigNone|LoadedConfigAutomatic|LoadedConfigNamed;
 
+export interface NonSerializableState {
+  pivotTableRedux: PivotTableReduxState;
+}
+
 export interface State {
   version: number;
   currentEngineId?: string;
@@ -433,7 +451,6 @@
   traceConversionInProgress: boolean;
   pivotTableConfig: PivotTableConfig;
   pivotTable: ObjectById<PivotTableState>;
-  pivotTableRedux: PivotTableReduxState;
 
   /**
    * This state is updated on the frontend at 60Hz and eventually syncronised to
@@ -477,6 +494,11 @@
   fetchChromeCategories: boolean;
   chromeCategories: string[]|undefined;
   analyzePageQuery?: string;
+
+  // Special key: this part of the state is not going to be serialized when
+  // using permalink. Can be used to store those parts of the state that can't
+  // be serialized at the moment, such as ES6 Set and Map.
+  nonSerializableState: NonSerializableState;
 }
 
 export const defaultTraceTime = {
diff --git a/ui/src/common/thread_state.ts b/ui/src/common/thread_state.ts
index c0d68f5..5289384 100644
--- a/ui/src/common/thread_state.ts
+++ b/ui/src/common/thread_state.ts
@@ -30,11 +30,14 @@
 };
 
 export function translateState(
-    state: string|undefined, ioWait: boolean|undefined = undefined) {
+    state: string|undefined|null, ioWait: boolean|undefined = undefined) {
   if (state === undefined) return '';
   if (state === 'Running') {
     return state;
   }
+  if (state === null) {
+    return 'Unknown';
+  }
   let result = states[state[0]];
   if (ioWait === true) {
     result += ' (IO)';
diff --git a/ui/src/common/upload_utils.ts b/ui/src/common/upload_utils.ts
index d817084..5bc344f 100644
--- a/ui/src/common/upload_utils.ts
+++ b/ui/src/common/upload_utils.ts
@@ -36,7 +36,9 @@
 
 export async function saveState(stateOrConfig: State|
                                 RecordConfig): Promise<string> {
-  const text = JSON.stringify(stateOrConfig);
+  const text = JSON.stringify(stateOrConfig, (key, value) => {
+    return key === 'nonSerializableState' ? undefined : value;
+  });
   const hash = await toSha256(text);
   const url = 'https://www.googleapis.com/upload/storage/v1/b/' +
       `${BUCKET_NAME}/o?uploadType=media` +
diff --git a/ui/src/controller/permalink_controller.ts b/ui/src/controller/permalink_controller.ts
index dc51d10..66cd1dd 100644
--- a/ui/src/controller/permalink_controller.ts
+++ b/ui/src/controller/permalink_controller.ts
@@ -17,7 +17,10 @@
 import {assertExists} from '../base/logging';
 import {Actions} from '../common/actions';
 import {ConversionJobStatus} from '../common/conversion_jobs';
-import {createEmptyState} from '../common/empty_state';
+import {
+  createEmptyNonSerializableState,
+  createEmptyState
+} from '../common/empty_state';
 import {State} from '../common/state';
 import {STATE_VERSION} from '../common/state';
 import {
@@ -110,6 +113,11 @@
       console.warn(message);
       PermalinkController.updateStatus(message);
       return newState;
+    } else {
+      // Loaded state is presumed to be compatible with the State type
+      // definition in the app. However, a non-serializable part has to be
+      // recreated.
+      state.nonSerializableState = createEmptyNonSerializableState();
     }
     return state;
   }
diff --git a/ui/src/controller/pivot_table_redux_controller.ts b/ui/src/controller/pivot_table_redux_controller.ts
index 4d17bf1..c72ce02 100644
--- a/ui/src/controller/pivot_table_redux_controller.ts
+++ b/ui/src/controller/pivot_table_redux_controller.ts
@@ -19,10 +19,16 @@
 import {featureFlags} from '../common/feature_flags';
 import {ColumnType} from '../common/query_result';
 import {
+  AreaSelection,
+  PivotTableReduxQuery,
   PivotTableReduxQueryMetadata,
-  PivotTableReduxResult
+  PivotTableReduxResult,
+  PivotTableReduxState
 } from '../common/state';
-import {aggregationIndex} from '../frontend/pivot_table_redux_query_generator';
+import {
+  aggregationIndex,
+  generateQueryFromState
+} from '../frontend/pivot_table_redux_query_generator';
 
 import {Controller} from './controller';
 import {globals} from './globals';
@@ -136,12 +142,84 @@
 // executing its queries and post-processing query results.
 export class PivotTableReduxController extends Controller<{}> {
   engine: Engine;
-  lastStartedQueryId: number;
+  lastQueryAreaId = '';
+  lastQueryAreaTracks = new Set<string>();
 
   constructor(args: {engine: Engine}) {
     super({});
     this.engine = args.engine;
-    this.lastStartedQueryId = 0;
+  }
+
+  sameTracks(tracks: Set<string>) {
+    if (this.lastQueryAreaTracks.size !== tracks.size) {
+      return false;
+    }
+
+    // ES6 Set does not have .every method, only Array does.
+    for (const track in tracks) {
+      if (!this.lastQueryAreaTracks.has(track)) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  shouldRerun(state: PivotTableReduxState, selection: AreaSelection) {
+    if (state.selectionArea === null || state.editMode) {
+      return false;
+    }
+
+    const newTracks = new Set(globals.state.areas[selection.areaId].tracks);
+    if (this.lastQueryAreaId !== state.selectionArea.areaId ||
+        !this.sameTracks(newTracks)) {
+      this.lastQueryAreaId = state.selectionArea.areaId;
+      this.lastQueryAreaTracks = newTracks;
+      return true;
+    }
+    return false;
+  }
+
+  async processQuery(query: PivotTableReduxQuery) {
+    const result = await this.engine.query(query.text);
+    try {
+      await result.waitAllRows();
+    } catch {
+      // waitAllRows() frequently throws an exception, which is ignored in
+      // its other calls, so it's ignored here as well.
+    }
+
+    const columns = result.columns();
+
+    const it = result.iter({});
+    function nextRow(): ColumnType[] {
+      const row: ColumnType[] = [];
+      for (const column of columns) {
+        row.push(it.get(column));
+      }
+      it.next();
+      return row;
+    }
+
+    if (!it.valid()) {
+      // Iterator is invalid after creation; means that there are no rows
+      // satisfying filtering criteria. Return an empty tree.
+      globals.dispatch(Actions.setPivotStateQueryResult(
+          {queryResult: createEmptyQueryResult(query.metadata)}));
+      return;
+    }
+
+    const treeBuilder = new TreeBuilder(
+        query.metadata.pivotColumns.length,
+        query.metadata.aggregationColumns.length,
+        nextRow());
+    while (it.valid()) {
+      treeBuilder.ingestRow(nextRow());
+    }
+
+    globals.dispatch(Actions.setPivotStateQueryResult(
+        {queryResult: {tree: treeBuilder.build(), metadata: query.metadata}}));
+    globals.dispatch(Actions.setCurrentTab({tab: 'pivot_table_redux'}));
   }
 
   run() {
@@ -149,75 +227,31 @@
       return;
     }
 
-    const pivotTableState = globals.state.pivotTableRedux;
-    if (pivotTableState.queryId > this.lastStartedQueryId &&
-        pivotTableState.query !== null) {
-      this.lastStartedQueryId = pivotTableState.queryId;
-      const query = pivotTableState.query;
+    const pivotTableState = globals.state.nonSerializableState.pivotTableRedux;
 
-      this.engine.query(query.text).then(async (result) => {
-        try {
-          await result.waitAllRows();
-        } catch {
-          // waitAllRows() frequently throws an exception, which is ignored in
-          // its other calls, so it's ignored here as well.
-        }
-
-        const columns = result.columns();
-
-        const it = result.iter({});
-        function nextRow(): ColumnType[] {
-          const row: ColumnType[] = [];
-          for (const column of columns) {
-            row.push(it.get(column));
-          }
-          it.next();
-          return row;
-        }
-
-        if (!it.valid()) {
-          // Iterator is invalid after creation; means that there are no rows
-          // satisfying filtering criteria. Return an empty tree.
-          globals.dispatch(Actions.setPivotStateReduxState({
-            pivotTableState: {
-              queryId: this.lastStartedQueryId,
-              query: null,
-              queryResult: createEmptyQueryResult(query.metadata),
-              selectionArea: pivotTableState.selectionArea
-            }
-          }));
-          return;
-        }
-
-        const treeBuilder = new TreeBuilder(
-            query.metadata.pivotColumns.length,
-            query.metadata.aggregationColumns.length,
-            nextRow());
-        while (it.valid()) {
-          treeBuilder.ingestRow(nextRow());
-        }
-
-        globals.dispatch(Actions.setPivotStateReduxState({
-          pivotTableState: {
-            queryId: this.lastStartedQueryId,
-            query: null,
-            queryResult: {
-              tree: treeBuilder.build(),
-              metadata: query.metadata,
-            },
-            selectionArea: pivotTableState.selectionArea
-          }
-        }));
-      });
+    if (pivotTableState.queryRequested) {
+      globals.dispatch(
+          Actions.setPivotTableQueryRequested({queryRequested: false}));
+      this.processQuery(generateQueryFromState(pivotTableState));
     }
 
     const selection = globals.state.currentSelection;
-    if (selection !== null && selection.kind === 'AREA') {
-      const enabledArea = globals.state.areas[selection.areaId];
+
+    if (pivotTableState.queryRequested ||
+        (selection !== null && selection.kind === 'AREA' &&
+         this.shouldRerun(pivotTableState, selection))) {
       globals.dispatch(
-          Actions.togglePivotTableRedux({selectionArea: enabledArea}));
-    } else {
-      globals.dispatch(Actions.togglePivotTableRedux({selectionArea: null}));
+          Actions.setPivotTableQueryRequested({queryRequested: false}));
+      // Need to re-run the existing query, clear the current result.
+      globals.dispatch(Actions.setPivotStateQueryResult({queryResult: null}));
+      this.processQuery(generateQueryFromState(pivotTableState));
+    }
+
+    if (selection !== null && selection.kind === 'AREA' &&
+        (pivotTableState.selectionArea === null ||
+         pivotTableState.selectionArea.areaId !== selection.areaId)) {
+      globals.dispatch(
+          Actions.togglePivotTableRedux({areaId: selection.areaId}));
     }
   }
 }
\ No newline at end of file
diff --git a/ui/src/controller/selection_controller.ts b/ui/src/controller/selection_controller.ts
index 7143e89..c57254f 100644
--- a/ui/src/controller/selection_controller.ts
+++ b/ui/src/controller/selection_controller.ts
@@ -377,7 +377,7 @@
         ts: NUM,
         dur: NUM,
         priority: NUM,
-        endState: STR,
+        endState: STR_NULL,
         utid: NUM,
         cpu: NUM,
         threadStateId: NUM_NULL,
@@ -439,30 +439,33 @@
   }
 
   async schedulingDetails(ts: number, utid: number|Long) {
-    let event = 'sched_waking';
-    const waking = await this.args.engine.query(
-        `select * from legacy_instant where name = 'sched_waking' limit 1`);
-    const wakeup = await this.args.engine.query(
-        `select * from legacy_instant where name = 'sched_wakeup' limit 1`);
-    if (waking.numRows() === 0) {
-      if (wakeup.numRows() === 0) return undefined;
-      // Only use sched_wakeup if waking is not in the trace.
-      event = 'sched_wakeup';
-    }
-
-    // Find the ts of the first sched_wakeup before the current slice.
-    const queryWakeupTs = `select ts from legacy_instant where name = '${event}'
-    and utid = ${utid} and ts < ${ts} order by ts desc limit 1`;
-    const wakeResult = await this.args.engine.query(queryWakeupTs);
+    // Find the ts of the first wakeup before the current slice.
+    const wakeResult = await this.args.engine.query(`
+      select ts, waker_utid as wakerUtid
+      from thread_state
+      where utid = ${utid} and ts < ${ts} and state = 'R'
+      order by ts desc
+      limit 1
+    `);
     if (wakeResult.numRows() === 0) {
       return undefined;
     }
-    const wakeupTs = wakeResult.firstRow({ts: NUM}).ts;
+
+    const wakeFirstRow = wakeResult.firstRow({ts: NUM, wakerUtid: NUM_NULL});
+    const wakeupTs = wakeFirstRow.ts;
+    const wakerUtid = wakeFirstRow.wakerUtid;
+    if (wakerUtid === null) {
+      return undefined;
+    }
 
     // Find the previous sched slice for the current utid.
-    const queryPrevSched = `select ts from sched where utid = ${utid}
-    and ts < ${ts} order by ts desc limit 1`;
-    const prevSchedResult = await this.args.engine.query(queryPrevSched);
+    const prevSchedResult = await this.args.engine.query(`
+      select ts
+      from sched
+      where utid = ${utid} and ts < ${ts}
+      order by ts desc
+      limit 1
+    `);
 
     // If this is the first sched slice for this utid or if the wakeup found
     // was after the previous slice then we know the wakeup was for this slice.
@@ -470,39 +473,23 @@
         wakeupTs < prevSchedResult.firstRow({ts: NUM}).ts) {
       return undefined;
     }
+
     // Find the sched slice with the utid of the waker running when the
     // sched wakeup occurred. This is the waker.
-    let queryWaker = `
-      select utid, cpu
+    const wakerResult = await this.args.engine.query(`
+      select cpu
       from sched
-      where utid = (
-        select EXTRACT_ARG(arg_set_id, 'waker_utid')
-        from legacy_instant
-        where name = '${event}' and ts = ${wakeupTs}
-      )
-      and ts < ${wakeupTs} and ts + dur >= ${wakeupTs};
-    `;
-    let wakerResult = await this.args.engine.query(queryWaker);
-    if (wakerResult.numRows() === 0) {
-      // An old version of trace processor (that does not populate the
-      // 'waker_utid' arg) might be in use. Try getting the same info from the
-      // raw table).
-      // TODO(b/206390308): Remove this workaround when
-      // TRACE_PROCESSOR_CURRENT_API_VERSION is incremented.
-      queryWaker = `select utid, cpu from sched where utid =
-      (select utid from raw where name = '${event}' and ts = ${wakeupTs})
-      and ts < ${wakeupTs} and ts + dur >= ${wakeupTs};`;
-      wakerResult =  await this.args.engine.query(queryWaker);
-    }
+      where
+        utid = ${wakerUtid} and
+        ts < ${wakeupTs} and
+        ts + dur >= ${wakeupTs};
+    `);
     if (wakerResult.numRows() === 0) {
       return undefined;
     }
-    const wakerRow = wakerResult.firstRow({utid: NUM, cpu: NUM});
-    return {
-      wakeupTs: fromNs(wakeupTs),
-      wakerUtid: wakerRow.utid,
-      wakerCpu: wakerRow.cpu
-    };
+
+    const wakerRow = wakerResult.firstRow({cpu: NUM});
+    return {wakeupTs: fromNs(wakeupTs), wakerUtid, wakerCpu: wakerRow.cpu};
   }
 
   async computeThreadDetails(utid: number):
diff --git a/ui/src/frontend/details_panel.ts b/ui/src/frontend/details_panel.ts
index c364d97..9b085c2 100644
--- a/ui/src/frontend/details_panel.ts
+++ b/ui/src/frontend/details_panel.ts
@@ -320,13 +320,15 @@
       });
     }
 
-    if (globals.state.pivotTableRedux.selectionArea !== null) {
+    if (globals.state.nonSerializableState.pivotTableRedux.selectionArea !==
+        null) {
       detailsPanels.push({
         key: 'pivot_table_redux',
         name: 'Pivot Table',
         vnode: m(PivotTableRedux, {
           key: 'pivot_table_redux',
-          selectionArea: globals.state.pivotTableRedux.selectionArea
+          selectionArea:
+              globals.state.nonSerializableState.pivotTableRedux.selectionArea
         })
       });
     }
diff --git a/ui/src/frontend/globals.ts b/ui/src/frontend/globals.ts
index 697524e..3381990 100644
--- a/ui/src/frontend/globals.ts
+++ b/ui/src/frontend/globals.ts
@@ -47,7 +47,7 @@
   threadTs?: number;
   threadDur?: number;
   priority?: number;
-  endState?: string;
+  endState?: string|null;
   cpu?: number;
   id?: number;
   threadStateId?: number;
diff --git a/ui/src/frontend/pivot_table_redux.ts b/ui/src/frontend/pivot_table_redux.ts
index 262ebcf..6120114 100644
--- a/ui/src/frontend/pivot_table_redux.ts
+++ b/ui/src/frontend/pivot_table_redux.ts
@@ -15,12 +15,12 @@
  */
 
 import * as m from 'mithril';
-import {GenericSet} from '../base/generic_set';
 import {sqliteString} from '../base/string_utils';
-import {Actions} from '../common/actions';
+import {Actions, DeferredAction} from '../common/actions';
 import {ColumnType} from '../common/query_result';
 import {
   Area,
+  PivotTableReduxAreaState,
   PivotTableReduxQuery,
   PivotTableReduxResult
 } from '../common/state';
@@ -31,7 +31,6 @@
 import {
   aggregationIndex,
   areaFilter,
-  createColumnSet,
   generateQuery,
   QueryGeneratorError,
   sliceAggregationColumns,
@@ -41,16 +40,30 @@
   threadSliceAggregationColumns
 } from './pivot_table_redux_query_generator';
 
-interface ColumnSetCheckboxAttrs {
-  set: GenericSet<TableColumn>;
-  setKey: TableColumn;
-}
-
 interface PathItem {
   tree: PivotTree;
   nextKey: ColumnType;
 }
 
+// Used to convert TableColumn to a string in order to store it in a Map, as
+// ES6 does not support compound Set/Map keys.
+export function columnKey(tableColumn: TableColumn): string {
+  return `${tableColumn[0]}.${tableColumn[1]}`;
+}
+
+// Arguments to an action to toggle a table column in a particular part of
+// application's state.
+interface ColumnSetArgs {
+  column: TableColumn;
+  selected: boolean;
+}
+
+interface ColumnSetCheckboxAttrs {
+  set: (args: ColumnSetArgs) => DeferredAction<ColumnSetArgs>;
+  get: Map<string, TableColumn>;
+  setKey: TableColumn;
+}
+
 // Helper component that controls whether a particular key is present in a
 // ColumnSet.
 class ColumnSetCheckbox implements m.ClassComponent<ColumnSetCheckboxAttrs> {
@@ -58,20 +71,18 @@
     return m('input[type=checkbox]', {
       onclick: (e: InputEvent) => {
         const target = e.target as HTMLInputElement;
-        if (target.checked) {
-          attrs.set.add(attrs.setKey);
-        } else {
-          attrs.set.delete(attrs.setKey);
-        }
+
+        globals.dispatch(
+            attrs.set({column: attrs.setKey, selected: target.checked}));
         globals.rafScheduler.scheduleFullRedraw();
       },
-      checked: attrs.set.has(attrs.setKey)
+      checked: attrs.get.has(columnKey(attrs.setKey))
     });
   }
 }
 
 interface PivotTableReduxAttrs {
-  selectionArea: Area;
+  selectionArea: PivotTableReduxAreaState;
 }
 
 interface DrillFilter {
@@ -90,10 +101,18 @@
 }
 
 export class PivotTableRedux extends Panel<PivotTableReduxAttrs> {
-  selectedPivotsMap = createColumnSet();
-  selectedAggregations = createColumnSet();
-  constrainToArea = true;
-  editMode = true;
+  get selectedPivotsMap() {
+    return globals.state.nonSerializableState.pivotTableRedux.selectedPivotsMap;
+  }
+
+  get selectedAggregations() {
+    return globals.state.nonSerializableState.pivotTableRedux
+        .selectedAggregations;
+  }
+
+  get constrainToArea() {
+    return globals.state.nonSerializableState.pivotTableRedux.constrainToArea;
+  }
 
   renderCanvas(): void {}
 
@@ -101,27 +120,10 @@
     return generateQuery(
         this.selectedPivotsMap,
         this.selectedAggregations,
-        attrs.selectionArea,
+        globals.state.areas[attrs.selectionArea.areaId],
         this.constrainToArea);
   }
 
-  runQuery(attrs: PivotTableReduxAttrs) {
-    try {
-      const query = this.generateQuery(attrs);
-      const lastPivotTableState = globals.state.pivotTableRedux;
-      globals.dispatch(Actions.setPivotStateReduxState({
-        pivotTableState: {
-          query,
-          queryId: lastPivotTableState.queryId + 1,
-          selectionArea: lastPivotTableState.selectionArea,
-          queryResult: null
-        }
-      }));
-    } catch (e) {
-      console.log(e);
-    }
-  }
-
   renderTablePivotColumns(t: Table) {
     return m(
         'li',
@@ -131,7 +133,8 @@
               col =>
                   m('li',
                     m(ColumnSetCheckbox, {
-                      set: this.selectedPivotsMap,
+                      get: this.selectedPivotsMap,
+                      set: Actions.setPivotTablePivotSelected,
                       setKey: [t.name, col],
                     }),
                     col))));
@@ -143,7 +146,7 @@
         m('button.mode-button',
           {
             onclick: () => {
-              this.editMode = true;
+              globals.dispatch(Actions.setPivotTableEditMode({editMode: true}));
               globals.rafScheduler.scheduleFullRedraw();
             }
           },
@@ -280,8 +283,8 @@
   }
 
   renderResultsTable(attrs: PivotTableReduxAttrs) {
-    const state = globals.state.pivotTableRedux;
-    if (state.query !== null || state.queryResult === null) {
+    const state = globals.state.nonSerializableState.pivotTableRedux;
+    if (state.queryResult === null) {
       return m('div', 'Loading...');
     }
 
@@ -294,7 +297,11 @@
     }
 
     this.renderTree(
-        attrs.selectionArea, [], tree, state.queryResult, renderedRows);
+        globals.state.areas[attrs.selectionArea.areaId],
+        [],
+        tree,
+        state.queryResult,
+        renderedRows);
 
     const allColumns = state.queryResult.metadata.pivotColumns.concat(
         state.queryResult.metadata.aggregationColumns);
@@ -306,16 +313,15 @@
 
   renderQuery(attrs: PivotTableReduxAttrs): m.Vnode {
     // Prepare a button to switch to results mode.
-    let innerElement =
-        m('button.mode-button',
-          {
-            onclick: () => {
-              this.editMode = false;
-              this.runQuery(attrs);
-              globals.rafScheduler.scheduleFullRedraw();
-            }
-          },
-          'Execute');
+    let innerElement = m(
+        'button.mode-button',
+        {
+          onclick: () => {
+            globals.dispatch(Actions.setPivotTableEditMode({editMode: false}));
+            globals.rafScheduler.scheduleFullRedraw();
+          }
+        },
+        'Execute');
     try {
       this.generateQuery(attrs);
     } catch (e) {
@@ -336,7 +342,8 @@
             checked: this.constrainToArea,
             onclick: (e: InputEvent) => {
               const checkbox = e.target as HTMLInputElement;
-              this.constrainToArea = checkbox.checked;
+              globals.dispatch(Actions.setPivotTableReduxConstrainToArea(
+                  {constrain: checkbox.checked}));
             }
           }),
           m('label',
@@ -348,8 +355,9 @@
   }
 
   view({attrs}: m.Vnode<PivotTableReduxAttrs>) {
-    return this.editMode ? this.renderEditView(attrs) :
-                           this.renderResultsView(attrs);
+    return globals.state.nonSerializableState.pivotTableRedux.editMode ?
+        this.renderEditView(attrs) :
+        this.renderResultsView(attrs);
   }
 
   renderEditView(attrs: PivotTableReduxAttrs) {
@@ -368,7 +376,8 @@
                 t =>
                     m('li',
                       m(ColumnSetCheckbox, {
-                        set: this.selectedAggregations,
+                        get: this.selectedAggregations,
+                        set: Actions.setPivotTableAggregationSelected,
                         setKey: ['slice', t],
                       }),
                       t)),
@@ -376,7 +385,8 @@
                 t =>
                     m('li',
                       m(ColumnSetCheckbox, {
-                        set: this.selectedAggregations,
+                        get: this.selectedAggregations,
+                        set: Actions.setPivotTableAggregationSelected,
                         setKey: ['thread_slice', t],
                       }),
                       `thread_slice.${t}`)))),
diff --git a/ui/src/frontend/pivot_table_redux_query_generator.ts b/ui/src/frontend/pivot_table_redux_query_generator.ts
index c92243d..b1f0d9b 100644
--- a/ui/src/frontend/pivot_table_redux_query_generator.ts
+++ b/ui/src/frontend/pivot_table_redux_query_generator.ts
@@ -14,12 +14,16 @@
  * limitations under the License.
  */
 
-import {GenericSet} from '../base/generic_set';
-import {Area, PivotTableReduxQuery} from '../common/state';
+import {
+  Area,
+  PivotTableReduxQuery,
+  PivotTableReduxState
+} from '../common/state';
 import {toNs} from '../common/time';
 import {
   getSelectedTrackIds
 } from '../controller/aggregation/slice_aggregation_controller';
+import {globals} from './globals';
 
 export interface Table {
   name: string;
@@ -65,10 +69,6 @@
 // Pair of table name and column name.
 export type TableColumn = [string, string];
 
-export function createColumnSet(): GenericSet<TableColumn> {
-  return new GenericSet((column: TableColumn) => `${column[0]}.${column[1]}`);
-}
-
 // Exception thrown by query generator in case incoming parameters are not
 // suitable in order to build a correct query; these are caught by the UI and
 // displayed to the user.
@@ -115,10 +115,10 @@
 }
 
 function computeSliceTableAggregations(
-    selectedAggregations: GenericSet<TableColumn>):
+    selectedAggregations: Map<string, TableColumn>):
     {tableName: string, flatAggregations: string[]} {
   let hasThreadSliceColumn = false;
-  const allColumns = [];
+  const allColumns: string[] = [];
   for (const [table, column] of selectedAggregations.values()) {
     if (table === 'thread_slice') {
       hasThreadSliceColumn = true;
@@ -144,9 +144,22 @@
       (pivotColumns - depth);
 }
 
+export function generateQueryFromState(
+    state: PivotTableReduxState,
+    ): PivotTableReduxQuery {
+  if (state.selectionArea === null) {
+    throw new QueryGeneratorError('Should not be called without area');
+  }
+  return generateQuery(
+      state.selectedPivotsMap,
+      state.selectedAggregations,
+      globals.state.areas[state.selectionArea.areaId],
+      state.constrainToArea);
+}
+
 export function generateQuery(
-    selectedPivots: GenericSet<TableColumn>,
-    selectedAggregations: GenericSet<TableColumn>,
+    selectedPivots: Map<string, TableColumn>,
+    selectedAggregations: Map<string, TableColumn>,
     area: Area,
     constrainToArea: boolean): PivotTableReduxQuery {
   const sliceTableAggregations =
diff --git a/ui/src/tracks/cpu_slices/common.ts b/ui/src/tracks/cpu_slices/common.ts
index c87bbe9..a7eeeb4 100644
--- a/ui/src/tracks/cpu_slices/common.ts
+++ b/ui/src/tracks/cpu_slices/common.ts
@@ -22,6 +22,8 @@
   starts: Float64Array;
   ends: Float64Array;
   utids: Uint32Array;
+  isIncomplete: Uint8Array;
+  lastRowId: number;
 }
 
 export interface Config { cpu: number; }
diff --git a/ui/src/tracks/cpu_slices/controller.ts b/ui/src/tracks/cpu_slices/controller.ts
index 9dc89bf..be1640d 100644
--- a/ui/src/tracks/cpu_slices/controller.ts
+++ b/ui/src/tracks/cpu_slices/controller.ts
@@ -27,6 +27,7 @@
 
   private cachedBucketNs = Number.MAX_SAFE_INTEGER;
   private maxDurNs = 0;
+  private lastRowId = -1;
 
   async onSetup() {
     await this.query(`
@@ -35,7 +36,8 @@
         ts,
         dur,
         utid,
-        id
+        id,
+        dur = -1 as isIncomplete
       from sched
       where cpu = ${this.config.cpu} and utid != 0
     `);
@@ -44,6 +46,12 @@
       select ifnull(max(dur), 0) as maxDur, count(1) as rowCount
       from ${this.tableName('sched')}
     `);
+
+    const queryLastSlice = await this.query(`
+    select max(id) as lastSliceId from ${this.tableName('sched')}
+    `);
+    this.lastRowId = queryLastSlice.firstRow({lastSliceId: NUM}).lastSliceId;
+
     const row = queryRes.firstRow({maxDur: NUM, rowCount: NUM});
     this.maxDurNs = row.maxDur;
     const rowCount = row.rowCount;
@@ -51,6 +59,7 @@
     if (bucketNs === undefined) {
       return;
     }
+
     await this.query(`
       create table ${this.tableName('sched_cached')} as
       select
@@ -58,9 +67,10 @@
         ts,
         max(dur) as dur,
         utid,
-        id
+        id,
+        isIncomplete
       from ${this.tableName('sched')}
-      group by cached_tsq
+      group by cached_tsq, isIncomplete
       order by cached_tsq
     `);
     this.cachedBucketNs = bucketNs;
@@ -74,8 +84,8 @@
     // function to make sense.
     assertTrue(Math.log2(resolutionNs) % 1 === 0);
 
-    const startNs = toNs(start);
-    const endNs = toNs(end);
+    const boundStartNs = toNs(start);
+    const boundEndNs = toNs(end);
 
     // ns per quantization bucket (i.e. ns per pixel). /2 * 2 is to force it to
     // be an even number, so we can snap in the middle.
@@ -96,12 +106,13 @@
         ts,
         max(dur) as dur,
         utid,
-        id
+        id,
+        isIncomplete
       from ${queryTable}
       where
-        ${constraintColumn} >= ${startNs - this.maxDurNs} and
-        ${constraintColumn} <= ${endNs}
-      group by tsq
+        ${constraintColumn} >= ${boundStartNs - this.maxDurNs} and
+        ${constraintColumn} <= ${boundEndNs}
+      group by tsq, isIncomplete
       order by tsq
     `);
 
@@ -111,28 +122,50 @@
       end,
       resolution,
       length: numRows,
+      lastRowId: this.lastRowId,
       ids: new Float64Array(numRows),
       starts: new Float64Array(numRows),
       ends: new Float64Array(numRows),
       utids: new Uint32Array(numRows),
+      isIncomplete: new Uint8Array(numRows)
     };
 
-    const it = queryRes.iter({tsq: NUM, ts: NUM, dur: NUM, utid: NUM, id: NUM});
+    const it = queryRes.iter(
+        {tsq: NUM, ts: NUM, dur: NUM, utid: NUM, id: NUM, isIncomplete: NUM});
     for (let row = 0; it.valid(); it.next(), row++) {
       const startNsQ = it.tsq;
       const startNs = it.ts;
       const durNs = it.dur;
       const endNs = startNs + durNs;
 
-      let endNsQ = Math.floor((endNs + bucketNs / 2 - 1) / bucketNs) * bucketNs;
-      endNsQ = Math.max(endNsQ, startNsQ + bucketNs);
+      // If the slice is incomplete, the end calculated later.
+      if (!it.isIncomplete) {
+        let endNsQ =
+            Math.floor((endNs + bucketNs / 2 - 1) / bucketNs) * bucketNs;
+        endNsQ = Math.max(endNsQ, startNsQ + bucketNs);
+        slices.ends[row] = fromNs(endNsQ);
+      }
 
       slices.starts[row] = fromNs(startNsQ);
-      slices.ends[row] = fromNs(endNsQ);
       slices.utids[row] = it.utid;
       slices.ids[row] = it.id;
+      slices.isIncomplete[row] = it.isIncomplete;
     }
 
+    // If the slice is incomplete and it is the last slice in the track, the end
+    // of the slice would be the end of the visible window. Otherwise we end the
+    // slice with the beginning the next one.
+    for (let row = 0; row < slices.length; row++) {
+      if (!slices.isIncomplete[row]) {
+        continue;
+      }
+      const endNs =
+          row === slices.length - 1 ? boundEndNs : toNs(slices.starts[row + 1]);
+
+      let endNsQ = Math.floor((endNs + bucketNs / 2 - 1) / bucketNs) * bucketNs;
+      endNsQ = Math.max(endNsQ, toNs(slices.starts[row]) + bucketNs);
+      slices.ends[row] = fromNs(endNsQ);
+    }
     return slices;
   }
 
diff --git a/ui/src/tracks/cpu_slices/frontend.ts b/ui/src/tracks/cpu_slices/frontend.ts
index 16f140c..944dcb7 100644
--- a/ui/src/tracks/cpu_slices/frontend.ts
+++ b/ui/src/tracks/cpu_slices/frontend.ts
@@ -15,7 +15,11 @@
 import {search, searchEq, searchSegment} from '../../base/binary_search';
 import {assertTrue} from '../../base/logging';
 import {Actions} from '../../common/actions';
-import {cropText, drawDoubleHeadedArrow} from '../../common/canvas_utils';
+import {
+  cropText,
+  drawDoubleHeadedArrow,
+  drawIncompleteSlice
+} from '../../common/canvas_utils';
 import {colorForThread} from '../../common/colorizer';
 import {timeToString} from '../../common/time';
 import {checkerboardExcept} from '../../frontend/checkerboard';
@@ -88,9 +92,15 @@
 
     for (let i = startIdx; i < endIdx; i++) {
       const tStart = data.starts[i];
-      const tEnd = data.ends[i];
+      let tEnd = data.ends[i];
       const utid = data.utids[i];
 
+      // If the last slice is incomplete, it should end with the end of the
+      // window, else it might spill over the window and the end would not be
+      // visible as a zigzag line.
+      if (data.ids[i] === data.lastRowId && data.isIncomplete[i]) {
+        tEnd = visibleWindowTime.end;
+      }
       const rectStart = timeScale.timeToPx(tStart);
       const rectEnd = timeScale.timeToPx(tEnd);
       const rectWidth = Math.max(1, rectEnd - rectStart);
@@ -115,7 +125,11 @@
         color.s -= 20;
       }
       ctx.fillStyle = `hsl(${color.h}, ${color.s}%, ${color.l}%)`;
-      ctx.fillRect(rectStart, MARGIN_TOP, rectWidth, RECT_HEIGHT);
+      if (data.isIncomplete[i]) {
+        drawIncompleteSlice(ctx, rectStart, MARGIN_TOP, rectWidth, RECT_HEIGHT);
+      } else {
+        ctx.fillRect(rectStart, MARGIN_TOP, rectWidth, RECT_HEIGHT);
+      }
 
       // Don't render text when we have less than 5px to play with.
       if (rectWidth < 5) continue;