Implement clock sync in multi-machine tracing

This revision implements the RelayPort exposed on the producer socket
for synchronization of clocks in multi-machine tracing:

* The RelayPort defines the IPC methods between the tracing service and
the relay service for operations that are specific to multi-machine
tracing (clock synchronization).

* ServiceIPCHostImpl exposes a second IPC service that implements
RelayPort to producer sockets (perfetto::RelayIPCService).

* The relay service connects to the RelayPort using the IPC client
implementation (perfetto::RelayIPCClient). On connected, the relay
service invokes the SyncClock() rpc methods with the tracing service to
capture clock snapshots on the host and client.

* In a tracing session, the tracing service emits the ClockSnapshots
packet for the remote machine and also the ClockSync packet for the
clock offsets of supported clocks.

Bug: 284258446
Test: unit tests and integration tests.

Change-Id: I95015c1e0bc8bec7b82b0fdac897900e0de923b7
diff --git a/Android.bp b/Android.bp
index f4559d8..aeecbbb 100644
--- a/Android.bp
+++ b/Android.bp
@@ -2419,6 +2419,7 @@
         ":perfetto_src_tracing_ipc_consumer_consumer",
         ":perfetto_src_tracing_ipc_default_socket",
         ":perfetto_src_tracing_ipc_producer_producer",
+        ":perfetto_src_tracing_ipc_producer_relay",
         ":perfetto_src_tracing_ipc_service_service",
         ":perfetto_src_tracing_platform_impl",
         ":perfetto_src_tracing_service_service",
@@ -4920,6 +4921,7 @@
     srcs: [
         "protos/perfetto/ipc/consumer_port.proto",
         "protos/perfetto/ipc/producer_port.proto",
+        "protos/perfetto/ipc/relay_port.proto",
     ],
 }
 
@@ -4951,6 +4953,7 @@
     out: [
         "external/perfetto/protos/perfetto/ipc/consumer_port.gen.cc",
         "external/perfetto/protos/perfetto/ipc/producer_port.gen.cc",
+        "external/perfetto/protos/perfetto/ipc/relay_port.gen.cc",
     ],
 }
 
@@ -4982,6 +4985,7 @@
     out: [
         "external/perfetto/protos/perfetto/ipc/consumer_port.gen.h",
         "external/perfetto/protos/perfetto/ipc/producer_port.gen.h",
+        "external/perfetto/protos/perfetto/ipc/relay_port.gen.h",
     ],
     export_include_dirs: [
         ".",
@@ -4995,6 +4999,7 @@
     srcs: [
         "protos/perfetto/ipc/consumer_port.proto",
         "protos/perfetto/ipc/producer_port.proto",
+        "protos/perfetto/ipc/relay_port.proto",
     ],
 }
 
@@ -5028,6 +5033,7 @@
     out: [
         "external/perfetto/protos/perfetto/ipc/consumer_port.ipc.cc",
         "external/perfetto/protos/perfetto/ipc/producer_port.ipc.cc",
+        "external/perfetto/protos/perfetto/ipc/relay_port.ipc.cc",
     ],
 }
 
@@ -5061,6 +5067,7 @@
     out: [
         "external/perfetto/protos/perfetto/ipc/consumer_port.ipc.h",
         "external/perfetto/protos/perfetto/ipc/producer_port.ipc.h",
+        "external/perfetto/protos/perfetto/ipc/relay_port.ipc.h",
     ],
     export_include_dirs: [
         ".",
@@ -5969,6 +5976,7 @@
         "protos/perfetto/trace/profiling/smaps.proto",
         "protos/perfetto/trace/ps/process_stats.proto",
         "protos/perfetto/trace/ps/process_tree.proto",
+        "protos/perfetto/trace/remote_clock_sync.proto",
         "protos/perfetto/trace/statsd/statsd_atom.proto",
         "protos/perfetto/trace/sys_stats/sys_stats.proto",
         "protos/perfetto/trace/system_info.proto",
@@ -7606,6 +7614,7 @@
     srcs: [
         "protos/perfetto/trace/extension_descriptor.proto",
         "protos/perfetto/trace/memory_graph.proto",
+        "protos/perfetto/trace/remote_clock_sync.proto",
         "protos/perfetto/trace/test_event.proto",
         "protos/perfetto/trace/test_extensions.proto",
         "protos/perfetto/trace/trace.proto",
@@ -7660,6 +7669,7 @@
     out: [
         "external/perfetto/protos/perfetto/trace/extension_descriptor.gen.cc",
         "external/perfetto/protos/perfetto/trace/memory_graph.gen.cc",
+        "external/perfetto/protos/perfetto/trace/remote_clock_sync.gen.cc",
         "external/perfetto/protos/perfetto/trace/test_event.gen.cc",
         "external/perfetto/protos/perfetto/trace/test_extensions.gen.cc",
         "external/perfetto/protos/perfetto/trace/trace.gen.cc",
@@ -7714,6 +7724,7 @@
     out: [
         "external/perfetto/protos/perfetto/trace/extension_descriptor.gen.h",
         "external/perfetto/protos/perfetto/trace/memory_graph.gen.h",
+        "external/perfetto/protos/perfetto/trace/remote_clock_sync.gen.h",
         "external/perfetto/protos/perfetto/trace/test_event.gen.h",
         "external/perfetto/protos/perfetto/trace/test_extensions.gen.h",
         "external/perfetto/protos/perfetto/trace/trace.gen.h",
@@ -7733,6 +7744,7 @@
     srcs: [
         "protos/perfetto/trace/extension_descriptor.proto",
         "protos/perfetto/trace/memory_graph.proto",
+        "protos/perfetto/trace/remote_clock_sync.proto",
         "protos/perfetto/trace/test_event.proto",
         "protos/perfetto/trace/test_extensions.proto",
         "protos/perfetto/trace/trace.proto",
@@ -7786,6 +7798,7 @@
     out: [
         "external/perfetto/protos/perfetto/trace/extension_descriptor.pb.cc",
         "external/perfetto/protos/perfetto/trace/memory_graph.pb.cc",
+        "external/perfetto/protos/perfetto/trace/remote_clock_sync.pb.cc",
         "external/perfetto/protos/perfetto/trace/test_event.pb.cc",
         "external/perfetto/protos/perfetto/trace/test_extensions.pb.cc",
         "external/perfetto/protos/perfetto/trace/trace.pb.cc",
@@ -7839,6 +7852,7 @@
     out: [
         "external/perfetto/protos/perfetto/trace/extension_descriptor.pb.h",
         "external/perfetto/protos/perfetto/trace/memory_graph.pb.h",
+        "external/perfetto/protos/perfetto/trace/remote_clock_sync.pb.h",
         "external/perfetto/protos/perfetto/trace/test_event.pb.h",
         "external/perfetto/protos/perfetto/trace/test_extensions.pb.h",
         "external/perfetto/protos/perfetto/trace/trace.pb.h",
@@ -7858,6 +7872,7 @@
     srcs: [
         "protos/perfetto/trace/extension_descriptor.proto",
         "protos/perfetto/trace/memory_graph.proto",
+        "protos/perfetto/trace/remote_clock_sync.proto",
         "protos/perfetto/trace/test_event.proto",
         "protos/perfetto/trace/test_extensions.proto",
         "protos/perfetto/trace/trace.proto",
@@ -7912,6 +7927,7 @@
     out: [
         "external/perfetto/protos/perfetto/trace/extension_descriptor.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/memory_graph.pbzero.cc",
+        "external/perfetto/protos/perfetto/trace/remote_clock_sync.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/test_event.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/test_extensions.pbzero.cc",
         "external/perfetto/protos/perfetto/trace/trace.pbzero.cc",
@@ -7966,6 +7982,7 @@
     out: [
         "external/perfetto/protos/perfetto/trace/extension_descriptor.pbzero.h",
         "external/perfetto/protos/perfetto/trace/memory_graph.pbzero.h",
+        "external/perfetto/protos/perfetto/trace/remote_clock_sync.pbzero.h",
         "external/perfetto/protos/perfetto/trace/test_event.pbzero.h",
         "external/perfetto/protos/perfetto/trace/test_extensions.pbzero.h",
         "external/perfetto/protos/perfetto/trace/trace.pbzero.h",
@@ -13037,6 +13054,7 @@
 filegroup {
     name: "perfetto_src_tracing_core_core",
     srcs: [
+        "src/tracing/core/clock_snapshots.cc",
         "src/tracing/core/id_allocator.cc",
         "src/tracing/core/in_process_shared_memory.cc",
         "src/tracing/core/null_trace_writer.cc",
@@ -13120,12 +13138,21 @@
     ],
 }
 
+// GN: //src/tracing/ipc/producer:relay
+filegroup {
+    name: "perfetto_src_tracing_ipc_producer_relay",
+    srcs: [
+        "src/tracing/ipc/producer/relay_ipc_client.cc",
+    ],
+}
+
 // GN: //src/tracing/ipc/service:service
 filegroup {
     name: "perfetto_src_tracing_ipc_service_service",
     srcs: [
         "src/tracing/ipc/service/consumer_ipc_service.cc",
         "src/tracing/ipc/service/producer_ipc_service.cc",
+        "src/tracing/ipc/service/relay_ipc_service.cc",
         "src/tracing/ipc/service/service_ipc_host_impl.cc",
     ],
 }
@@ -13423,6 +13450,7 @@
         "protos/perfetto/trace/profiling/smaps.proto",
         "protos/perfetto/trace/ps/process_stats.proto",
         "protos/perfetto/trace/ps/process_tree.proto",
+        "protos/perfetto/trace/remote_clock_sync.proto",
         "protos/perfetto/trace/statsd/statsd_atom.proto",
         "protos/perfetto/trace/sys_stats/sys_stats.proto",
         "protos/perfetto/trace/system_info.proto",
@@ -13952,6 +13980,7 @@
         ":perfetto_src_tracing_ipc_consumer_consumer",
         ":perfetto_src_tracing_ipc_default_socket",
         ":perfetto_src_tracing_ipc_producer_producer",
+        ":perfetto_src_tracing_ipc_producer_relay",
         ":perfetto_src_tracing_ipc_service_service",
         ":perfetto_src_tracing_ipc_unittests",
         ":perfetto_src_tracing_platform_impl",