Merge "tracebox: wait for traced_probes to register"
diff --git a/src/trace_processor/importers/common/process_tracker.h b/src/trace_processor/importers/common/process_tracker.h
index 1a062cf..86c4339 100644
--- a/src/trace_processor/importers/common/process_tracker.h
+++ b/src/trace_processor/importers/common/process_tracker.h
@@ -50,11 +50,6 @@
   ProcessTracker& operator=(const ProcessTracker&) = delete;
   virtual ~ProcessTracker();
 
-  using UniqueProcessIterator =
-      std::multimap<uint32_t, UniquePid>::const_iterator;
-  using UniqueProcessBounds =
-      std::pair<UniqueProcessIterator, UniqueProcessIterator>;
-
   using UniqueThreadIterator = std::vector<UniqueTid>::const_iterator;
   using UniqueThreadBounds =
       std::pair<UniqueThreadIterator, UniqueThreadIterator>;
@@ -135,10 +130,10 @@
   // Virtual for testing.
   virtual UniquePid GetOrCreateProcess(uint32_t pid);
 
-  // Returns the bounds of a range that includes all UniquePids that have the
-  // requested pid.
-  UniqueProcessBounds UpidsForPidForTesting(uint32_t pid) {
-    return pids_.equal_range(pid);
+  // Returns the upid for a given pid.
+  base::Optional<UniquePid> UpidForPidForTesting(uint32_t pid) {
+    auto it = pids_.find(pid);
+    return it == pids_.end() ? base::nullopt : base::make_optional(it->second);
   }
 
   // Returns the bounds of a range that includes all UniqueTids that have the
@@ -187,13 +182,16 @@
 
   ArgsTracker args_tracker_;
 
-  // Each tid can have multiple UniqueTid entries, a new UniqueTid is assigned
-  // each time a thread is seen in the trace.
-  std::map<uint32_t /* tid */, std::vector<UniqueTid>> tids_;
+  // Mapping for tid to the vector of possible UniqueTids.
+  // TODO(lalitm): this is a one-many mapping because this code was written
+  // before global sorting was a thing so multiple threads could be "active"
+  // simultaneously. This is no longer the case so this should be removed
+  // (though it seems like there are subtle things which break in Chrome if this
+  // changes).
+  std::unordered_map<uint32_t /* tid */, std::vector<UniqueTid>> tids_;
 
-  // Each pid can have multiple UniquePid entries, a new UniquePid is assigned
-  // each time a process is seen in the trace.
-  std::map<uint32_t /* pid (aka tgid) */, UniquePid> pids_;
+  // Mapping of the most recently seen pid to the associated upid.
+  std::unordered_map<uint32_t /* pid (aka tgid) */, UniquePid> pids_;
 
   // Pending thread associations. The meaning of a pair<ThreadA, ThreadB> in
   // this vector is: we know that A and B belong to the same process, but we
diff --git a/src/trace_processor/importers/common/process_tracker_unittest.cc b/src/trace_processor/importers/common/process_tracker_unittest.cc
index 7ed1bd4..3e415df 100644
--- a/src/trace_processor/importers/common/process_tracker_unittest.cc
+++ b/src/trace_processor/importers/common/process_tracker_unittest.cc
@@ -47,8 +47,8 @@
 TEST_F(ProcessTrackerTest, PushProcess) {
   context.process_tracker->SetProcessMetadata(1, base::nullopt, "test",
                                               base::StringView());
-  auto pair_it = context.process_tracker->UpidsForPidForTesting(1);
-  ASSERT_EQ(pair_it.first->second, 1u);
+  auto opt_upid = context.process_tracker->UpidForPidForTesting(1);
+  ASSERT_EQ(opt_upid.value_or(-1), 1u);
 }
 
 TEST_F(ProcessTrackerTest, GetOrCreateNewProcess) {
@@ -68,9 +68,8 @@
                                               base::StringView());
   context.process_tracker->SetProcessMetadata(1, base::nullopt, "test",
                                               base::StringView());
-  auto pair_it = context.process_tracker->UpidsForPidForTesting(1);
-  ASSERT_EQ(pair_it.first->second, 1u);
-  ASSERT_EQ(++pair_it.first, pair_it.second);
+  auto opt_upid = context.process_tracker->UpidForPidForTesting(1);
+  ASSERT_EQ(opt_upid.value_or(-1), 1u);
 }
 
 TEST_F(ProcessTrackerTest, PushTwoProcessEntries_DifferentPid) {
@@ -78,10 +77,10 @@
                                               base::StringView());
   context.process_tracker->SetProcessMetadata(3, base::nullopt, "test",
                                               base::StringView());
-  auto pair_it = context.process_tracker->UpidsForPidForTesting(1);
-  ASSERT_EQ(pair_it.first->second, 1u);
-  auto second_pair_it = context.process_tracker->UpidsForPidForTesting(3);
-  ASSERT_EQ(second_pair_it.first->second, 2u);
+  auto opt_upid = context.process_tracker->UpidForPidForTesting(1);
+  ASSERT_EQ(opt_upid.value_or(-1), 1u);
+  opt_upid = context.process_tracker->UpidForPidForTesting(3);
+  ASSERT_EQ(opt_upid.value_or(-1), 2u);
 }
 
 TEST_F(ProcessTrackerTest, AddProcessEntry_CorrectName) {
@@ -101,8 +100,8 @@
   auto tid_it = context.process_tracker->UtidsForTidForTesting(12);
   ASSERT_NE(tid_it.first, tid_it.second);
   ASSERT_EQ(context.storage->thread_table().upid()[1].value(), 1u);
-  auto pid_it = context.process_tracker->UpidsForPidForTesting(2);
-  ASSERT_NE(pid_it.first, pid_it.second);
+  auto opt_upid = context.process_tracker->UpidForPidForTesting(2);
+  ASSERT_TRUE(opt_upid.has_value());
   ASSERT_EQ(context.storage->process_table().row_count(), 2u);
 }