re-number thread id in trace

This is to make trace viewable in https://ui.perfetto.dev/.

Bug: b/227130231
Change-Id: Ib979e6821b5c68f419dbd0b6b757f3ff0a945b06
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/13323
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/trace.cc b/src/gn/trace.cc
index f812710..bc3f50e 100644
--- a/src/gn/trace.cc
+++ b/src/gn/trace.cc
@@ -250,19 +250,27 @@
 
   std::string quote_buffer;  // Allocate outside loop to prevent reallocationg.
 
+  // Trace viewer doesn't handle integer > 2^53 well, so re-numbering them to
+  // small numbers.
+  std::map<std::thread::id, int> tidmap;
+  std::vector<TraceItem*> events = trace_log->events();
+  for (const auto* item : events) {
+    int id = tidmap.size();
+    tidmap.emplace(item->thread_id(), id);
+  }
+
   // Write main thread metadata (assume this is being written on the main
   // thread).
-  out << "{\"pid\":0,\"tid\":\"" << std::this_thread::get_id() << "\"";
+  out << "{\"pid\":0,\"tid\":\"" << tidmap[std::this_thread::get_id()] << "\"";
   out << ",\"ts\":0,\"ph\":\"M\",";
   out << "\"name\":\"thread_name\",\"args\":{\"name\":\"Main thread\"}},";
 
-  std::vector<TraceItem*> events = trace_log->events();
   for (size_t i = 0; i < events.size(); i++) {
     const TraceItem& item = *events[i];
 
     if (i != 0)
       out << ",";
-    out << "{\"pid\":0,\"tid\":\"" << item.thread_id() << "\"";
+    out << "{\"pid\":0,\"tid\":\"" << tidmap[item.thread_id()] << "\"";
     out << ",\"ts\":" << item.begin() / kNanosecondsToMicroseconds;
     out << ",\"ph\":\"X\"";  // "X" = complete event with begin & duration.
     out << ",\"dur\":" << item.delta().InMicroseconds();