processor: Export pid/tid as signed integers into JSON

Some old tooling doesn't support positive values larger than
numeric_limits<int>::max(). So instead export very large pid/tid as
negative ints.

Bug: 130786269
Change-Id: I5d6e235acb32511abb3f736143e875e2c264123b
diff --git a/src/trace_processor/export_json.cc b/src/trace_processor/export_json.cc
index 60f1095..ed6e5f8 100644
--- a/src/trace_processor/export_json.cc
+++ b/src/trace_processor/export_json.cc
@@ -226,8 +226,8 @@
       value["cat"] = "__metadata";
       value["ts"] = 0;
       value["name"] = metadata_type;
-      value["pid"] = Json::UInt(pid);
-      value["tid"] = Json::UInt(tid);
+      value["pid"] = Json::Int(pid);
+      value["tid"] = Json::Int(tid);
 
       Json::Value args;
       args["name"] = metadata_value;
@@ -692,8 +692,8 @@
         // Synchronous (thread) slice or instant event.
         UniqueTid utid = thread_track.utid()[*opt_thread_track_row];
         auto pid_and_tid = UtidToPidAndTid(utid);
-        event["pid"] = Json::UInt(pid_and_tid.first);
-        event["tid"] = Json::UInt(pid_and_tid.second);
+        event["pid"] = Json::Int(pid_and_tid.first);
+        event["tid"] = Json::Int(pid_and_tid.second);
 
         if (duration_ns == 0) {
           // Use "I" instead of "i" phase for backwards-compat with old
@@ -739,10 +739,10 @@
           PERFETTO_DCHECK(track_args);
           uint32_t upid = process_track.upid()[*opt_process_row];
           uint32_t exported_pid = UpidToPid(upid);
-          event["pid"] = Json::UInt(exported_pid);
+          event["pid"] = Json::Int(exported_pid);
           event["tid"] =
-              Json::UInt(legacy_utid ? UtidToPidAndTid(*legacy_utid).second
-                                     : exported_pid);
+              Json::Int(legacy_utid ? UtidToPidAndTid(*legacy_utid).second
+                                    : exported_pid);
 
           // Preserve original event IDs for legacy tracks. This is so that e.g.
           // memory dump IDs show up correctly in the JSON trace.
@@ -770,10 +770,10 @@
             uint32_t upid = process_track.upid()[*opt_process_row];
             event["id2"]["local"] = PrintUint64(track_id);
             uint32_t exported_pid = UpidToPid(upid);
-            event["pid"] = Json::UInt(exported_pid);
+            event["pid"] = Json::Int(exported_pid);
             event["tid"] =
-                Json::UInt(legacy_utid ? UtidToPidAndTid(*legacy_utid).second
-                                       : exported_pid);
+                Json::Int(legacy_utid ? UtidToPidAndTid(*legacy_utid).second
+                                      : exported_pid);
           } else {
             // Some legacy importers don't understand "id2" fields, so we use
             // the "usually" global "id" field instead. This works as long as
@@ -826,10 +826,10 @@
         if (opt_process_row.has_value()) {
           uint32_t upid = process_track.upid()[*opt_process_row];
           uint32_t exported_pid = UpidToPid(upid);
-          event["pid"] = Json::UInt(exported_pid);
+          event["pid"] = Json::Int(exported_pid);
           event["tid"] =
-              Json::UInt(legacy_utid ? UtidToPidAndTid(*legacy_utid).second
-                                     : exported_pid);
+              Json::Int(legacy_utid ? UtidToPidAndTid(*legacy_utid).second
+                                    : exported_pid);
           event["s"] = "p";
         } else {
           event["s"] = "g";
@@ -848,8 +848,8 @@
 
     UniqueTid utid = static_cast<UniqueTid>(events.utid()[index]);
     auto pid_and_tid = UtidToPidAndTid(utid);
-    event["pid"] = Json::UInt(pid_and_tid.first);
-    event["tid"] = Json::UInt(pid_and_tid.second);
+    event["pid"] = Json::Int(pid_and_tid.first);
+    event["tid"] = Json::Int(pid_and_tid.second);
 
     // Raw legacy events store all other params in the arg set. Make a copy of
     // the converted args here, parse, and then remove the legacy params.
@@ -963,8 +963,8 @@
 
       UniqueTid utid = static_cast<UniqueTid>(samples.utid()[i]);
       auto pid_and_tid = UtidToPidAndTid(utid);
-      event["pid"] = Json::UInt(pid_and_tid.first);
-      event["tid"] = Json::UInt(pid_and_tid.second);
+      event["pid"] = Json::Int(pid_and_tid.first);
+      event["tid"] = Json::Int(pid_and_tid.second);
 
       event["ph"] = "n";
       event["cat"] = "disabled_by_default-cpu_profiler";
@@ -1035,7 +1035,7 @@
       // TODO(oysteine): Used for backwards compatibility with the memlog
       // pipeline, should remove once we've switched to looking directly at the
       // tid.
-      event["args"]["thread_id"] = Json::UInt(pid_and_tid.second);
+      event["args"]["thread_id"] = Json::Int(pid_and_tid.second);
 
       writer_.WriteCommonEvent(event);
     }
diff --git a/src/trace_processor/export_json_unittest.cc b/src/trace_processor/export_json_unittest.cc
index 447f0fe..2c9ec19 100644
--- a/src/trace_processor/export_json_unittest.cc
+++ b/src/trace_processor/export_json_unittest.cc
@@ -146,7 +146,7 @@
   EXPECT_EQ(event["tdur"].asInt64(), kThreadDuration / 1000);
   EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount);
   EXPECT_EQ(event["tidelta"].asInt64(), kThreadInstructionDelta);
-  EXPECT_EQ(event["tid"].asUInt(), kThreadID);
+  EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID));
   EXPECT_EQ(event["cat"].asString(), kCategory);
   EXPECT_EQ(event["name"].asString(), kName);
   EXPECT_TRUE(event["args"].isObject());
@@ -192,7 +192,7 @@
   EXPECT_FALSE(event.isMember("tdur"));
   EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount);
   EXPECT_FALSE(event.isMember("tidelta"));
-  EXPECT_EQ(event["tid"].asUInt(), kThreadID);
+  EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID));
   EXPECT_EQ(event["cat"].asString(), kCategory);
   EXPECT_EQ(event["name"].asString(), kName);
   EXPECT_TRUE(event["args"].isObject());
@@ -218,7 +218,7 @@
 
   Json::Value event = result["traceEvents"][0];
   EXPECT_EQ(event["ph"].asString(), "M");
-  EXPECT_EQ(event["tid"].asUInt(), kThreadID);
+  EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID));
   EXPECT_EQ(event["name"].asString(), "thread_name");
   EXPECT_EQ(event["args"]["name"].asString(), kName);
 }
@@ -768,7 +768,7 @@
   EXPECT_EQ(result["traceEvents"].size(), 1u);
 
   Json::Value event = result["traceEvents"][0];
-  EXPECT_EQ(event["tid"].asUInt(), kThreadID);
+  EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID));
   EXPECT_EQ(event["ph"].asString(), "I");
   EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000);
   EXPECT_EQ(event["s"].asString(), "t");
@@ -842,40 +842,40 @@
   Json::Value result = ToJsonValue(ReadFile(output));
   EXPECT_EQ(result["traceEvents"].size(), 5u);
 
-  EXPECT_EQ(result["traceEvents"][0]["pid"].asUInt(), 1u);
-  EXPECT_EQ(result["traceEvents"][0]["tid"].asUInt(), 1u);
+  EXPECT_EQ(result["traceEvents"][0]["pid"].asInt(), 1);
+  EXPECT_EQ(result["traceEvents"][0]["tid"].asInt(), 1);
   EXPECT_EQ(result["traceEvents"][0]["ph"].asString(), "I");
   EXPECT_EQ(result["traceEvents"][0]["ts"].asInt64(), 10);
   EXPECT_EQ(result["traceEvents"][0]["cat"].asString(), "cat");
   EXPECT_EQ(result["traceEvents"][0]["name"].asString(), "name1a");
 
-  EXPECT_EQ(result["traceEvents"][1]["pid"].asUInt(), 1u);
-  EXPECT_EQ(result["traceEvents"][1]["tid"].asUInt(), 2u);
+  EXPECT_EQ(result["traceEvents"][1]["pid"].asInt(), 1);
+  EXPECT_EQ(result["traceEvents"][1]["tid"].asInt(), 2);
   EXPECT_EQ(result["traceEvents"][1]["ph"].asString(), "X");
   EXPECT_EQ(result["traceEvents"][1]["ts"].asInt64(), 20);
   EXPECT_EQ(result["traceEvents"][1]["dur"].asInt64(), 1);
   EXPECT_EQ(result["traceEvents"][1]["cat"].asString(), "cat");
   EXPECT_EQ(result["traceEvents"][1]["name"].asString(), "name1b");
 
-  EXPECT_EQ(result["traceEvents"][2]["pid"].asUInt(), 1u);
-  EXPECT_EQ(result["traceEvents"][2]["tid"].asUInt(),
-            static_cast<uint32_t>(std::numeric_limits<uint32_t>::max() - 1u));
+  EXPECT_EQ(result["traceEvents"][2]["pid"].asInt(), 1);
+  EXPECT_EQ(result["traceEvents"][2]["tid"].asInt(),
+            static_cast<int>(std::numeric_limits<uint32_t>::max() - 1u));
   EXPECT_EQ(result["traceEvents"][2]["ph"].asString(), "I");
   EXPECT_EQ(result["traceEvents"][2]["ts"].asInt64(), 30);
   EXPECT_EQ(result["traceEvents"][2]["cat"].asString(), "cat");
   EXPECT_EQ(result["traceEvents"][2]["name"].asString(), "name1c");
 
-  EXPECT_EQ(result["traceEvents"][3]["pid"].asUInt(),
-            std::numeric_limits<uint32_t>::max());
-  EXPECT_EQ(result["traceEvents"][3]["tid"].asUInt(), 1u);
+  EXPECT_EQ(result["traceEvents"][3]["pid"].asInt(),
+            static_cast<int>(std::numeric_limits<uint32_t>::max()));
+  EXPECT_EQ(result["traceEvents"][3]["tid"].asInt(), 1);
   EXPECT_EQ(result["traceEvents"][3]["ph"].asString(), "I");
   EXPECT_EQ(result["traceEvents"][3]["ts"].asInt64(), 40);
   EXPECT_EQ(result["traceEvents"][3]["cat"].asString(), "cat");
   EXPECT_EQ(result["traceEvents"][3]["name"].asString(), "name2a");
 
-  EXPECT_EQ(result["traceEvents"][4]["pid"].asUInt(),
-            std::numeric_limits<uint32_t>::max());
-  EXPECT_EQ(result["traceEvents"][4]["tid"].asUInt(), 2u);
+  EXPECT_EQ(result["traceEvents"][4]["pid"].asInt(),
+            static_cast<int>(std::numeric_limits<uint32_t>::max()));
+  EXPECT_EQ(result["traceEvents"][4]["tid"].asInt(), 2);
   EXPECT_EQ(result["traceEvents"][4]["ph"].asString(), "X");
   EXPECT_EQ(result["traceEvents"][4]["ts"].asInt64(), 50);
   EXPECT_EQ(result["traceEvents"][1]["dur"].asInt64(), 1);
@@ -931,7 +931,7 @@
   Json::Value begin_event1 = result["traceEvents"][0];
   EXPECT_EQ(begin_event1["ph"].asString(), "b");
   EXPECT_EQ(begin_event1["ts"].asInt64(), kTimestamp / 1000);
-  EXPECT_EQ(begin_event1["pid"].asUInt(), kProcessID);
+  EXPECT_EQ(begin_event1["pid"].asInt(), static_cast<int>(kProcessID));
   EXPECT_EQ(begin_event1["id2"]["local"].asString(), "0xeb");
   EXPECT_EQ(begin_event1["cat"].asString(), kCategory);
   EXPECT_EQ(begin_event1["name"].asString(), kName);
@@ -942,7 +942,7 @@
   Json::Value begin_event2 = result["traceEvents"][1];
   EXPECT_EQ(begin_event2["ph"].asString(), "b");
   EXPECT_EQ(begin_event2["ts"].asInt64(), kTimestamp / 1000);
-  EXPECT_EQ(begin_event2["pid"].asUInt(), kProcessID);
+  EXPECT_EQ(begin_event2["pid"].asInt(), static_cast<int>(kProcessID));
   EXPECT_EQ(begin_event2["id2"]["local"].asString(), "0xeb");
   EXPECT_EQ(begin_event2["cat"].asString(), kCategory);
   EXPECT_EQ(begin_event2["name"].asString(), kName2);
@@ -954,7 +954,7 @@
   Json::Value end_event2 = result["traceEvents"][3];
   EXPECT_EQ(end_event2["ph"].asString(), "e");
   EXPECT_EQ(end_event2["ts"].asInt64(), (kTimestamp + kDuration) / 1000);
-  EXPECT_EQ(end_event2["pid"].asUInt(), kProcessID);
+  EXPECT_EQ(end_event2["pid"].asInt(), static_cast<int>(kProcessID));
   EXPECT_EQ(end_event2["id2"]["local"].asString(), "0xeb");
   EXPECT_EQ(end_event2["cat"].asString(), kCategory);
   EXPECT_EQ(end_event2["name"].asString(), kName);
@@ -966,7 +966,7 @@
   Json::Value end_event1 = result["traceEvents"][3];
   EXPECT_EQ(end_event1["ph"].asString(), "e");
   EXPECT_EQ(end_event1["ts"].asInt64(), (kTimestamp + kDuration) / 1000);
-  EXPECT_EQ(end_event1["pid"].asUInt(), kProcessID);
+  EXPECT_EQ(end_event1["pid"].asInt(), static_cast<int>(kProcessID));
   EXPECT_EQ(end_event1["id2"]["local"].asString(), "0xeb");
   EXPECT_EQ(end_event1["cat"].asString(), kCategory);
   EXPECT_EQ(end_event1["name"].asString(), kName);
@@ -1014,7 +1014,7 @@
   EXPECT_EQ(begin_event["ts"].asInt64(), kTimestamp / 1000);
   EXPECT_EQ(begin_event["tts"].asInt64(), kThreadTimestamp / 1000);
   EXPECT_EQ(begin_event["use_async_tts"].asInt(), 1);
-  EXPECT_EQ(begin_event["pid"].asUInt(), kProcessID);
+  EXPECT_EQ(begin_event["pid"].asInt(), static_cast<int>(kProcessID));
   EXPECT_EQ(begin_event["id2"]["local"].asString(), "0xeb");
   EXPECT_EQ(begin_event["cat"].asString(), kCategory);
   EXPECT_EQ(begin_event["name"].asString(), kName);
@@ -1025,7 +1025,7 @@
   EXPECT_EQ(end_event["tts"].asInt64(),
             (kThreadTimestamp + kThreadDuration) / 1000);
   EXPECT_EQ(end_event["use_async_tts"].asInt(), 1);
-  EXPECT_EQ(end_event["pid"].asUInt(), kProcessID);
+  EXPECT_EQ(end_event["pid"].asInt(), static_cast<int>(kProcessID));
   EXPECT_EQ(end_event["id2"]["local"].asString(), "0xeb");
   EXPECT_EQ(end_event["cat"].asString(), kCategory);
   EXPECT_EQ(end_event["name"].asString(), kName);
@@ -1069,7 +1069,7 @@
   EXPECT_EQ(begin_event["ts"].asInt64(), kTimestamp / 1000);
   EXPECT_EQ(begin_event["tts"].asInt64(), kThreadTimestamp / 1000);
   EXPECT_EQ(begin_event["use_async_tts"].asInt(), 1);
-  EXPECT_EQ(begin_event["pid"].asUInt(), kProcessID);
+  EXPECT_EQ(begin_event["pid"].asInt(), static_cast<int>(kProcessID));
   EXPECT_EQ(begin_event["id2"]["local"].asString(), "0xeb");
   EXPECT_EQ(begin_event["cat"].asString(), kCategory);
   EXPECT_EQ(begin_event["name"].asString(), kName);
@@ -1116,7 +1116,7 @@
   Json::Value event = result["traceEvents"][0];
   EXPECT_EQ(event["ph"].asString(), "n");
   EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000);
-  EXPECT_EQ(event["pid"].asUInt(), kProcessID);
+  EXPECT_EQ(event["pid"].asInt(), static_cast<int>(kProcessID));
   EXPECT_EQ(event["id2"]["local"].asString(), "0xeb");
   EXPECT_EQ(event["cat"].asString(), kCategory);
   EXPECT_EQ(event["name"].asString(), kName);
@@ -1204,7 +1204,7 @@
   EXPECT_EQ(event["tdur"].asInt64(), kThreadDuration / 1000);
   EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount);
   EXPECT_EQ(event["tidelta"].asInt64(), kThreadInstructionDelta);
-  EXPECT_EQ(event["tid"].asUInt(), kThreadID);
+  EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID));
   EXPECT_EQ(event["cat"].asString(), kCategory);
   EXPECT_EQ(event["name"].asString(), kName);
   EXPECT_EQ(event["use_async_tts"].asInt(), 1);
@@ -1328,7 +1328,7 @@
   EXPECT_EQ(event["ph"].asString(), "n");
   EXPECT_EQ(event["id"].asString(), "0x1");
   EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000);
-  EXPECT_EQ(event["tid"].asUInt(), kThreadID);
+  EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID));
   EXPECT_EQ(event["cat"].asString(), "disabled_by_default-cpu_profiler");
   EXPECT_EQ(event["name"].asString(), "StackCpuSampling");
   EXPECT_EQ(event["s"].asString(), "t");
@@ -1472,13 +1472,13 @@
   EXPECT_EQ(result[0]["ph"].asString(), "X");
   EXPECT_EQ(result[0]["ts"].asInt64(), kTimestamp1 / 1000);
   EXPECT_EQ(result[0]["dur"].asInt64(), kDuration / 1000);
-  EXPECT_EQ(result[0]["tid"].asUInt(), kThreadID);
+  EXPECT_EQ(result[0]["tid"].asInt(), static_cast<int>(kThreadID));
   EXPECT_EQ(result[0]["cat"].asString(), kCategory);
   EXPECT_EQ(result[0]["name"].asString(), kName);
   EXPECT_EQ(result[1]["ph"].asString(), "X");
   EXPECT_EQ(result[1]["ts"].asInt64(), kTimestamp2 / 1000);
   EXPECT_EQ(result[1]["dur"].asInt64(), kDuration / 1000);
-  EXPECT_EQ(result[1]["tid"].asUInt(), kThreadID);
+  EXPECT_EQ(result[1]["tid"].asInt(), static_cast<int>(kThreadID));
   EXPECT_EQ(result[1]["cat"].asString(), kCategory);
   EXPECT_EQ(result[1]["name"].asString(), kName);
 }