service: Write a trusted PacketSequenceID with each packet.

A PacketSequenceID identifies each <Producer, Writer> pair uniquely
within the scope of a tracing session, i.e. each
<producer_id, writer_id> pair is mapped to a PacketSequenceID.

It thus identifies all packets that were emitted by the same writer.
This is a prerequisite for our new trace event data interning feature,
where interning indexes will be scoped to each packet sequence.

Bug: 123864183
Change-Id: I686ff01ab21a34905375e95503c0d89c04fddb0e
diff --git a/src/tracing/core/tracing_service_impl.h b/src/tracing/core/tracing_service_impl.h
index 7822b58..d29535a 100644
--- a/src/tracing/core/tracing_service_impl.h
+++ b/src/tracing/core/tracing_service_impl.h
@@ -297,6 +297,23 @@
       return timeout_ms ? timeout_ms : kDefaultFlushTimeoutMs;
     }
 
+    PacketSequenceID GetPacketSequenceID(ProducerID producer_id,
+                                         WriterID writer_id) {
+      auto key = std::make_pair(producer_id, writer_id);
+      auto it = packet_sequence_ids.find(key);
+      if (it != packet_sequence_ids.end())
+        return it->second;
+      // We shouldn't run out of sequence IDs (producer ID is 16 bit, writer IDs
+      // are limited to 1024).
+      static_assert(kMaxPacketSequenceID > kMaxProducerID * kMaxWriterID,
+                    "PacketSequenceID value space doesn't cover service "
+                    "sequence ID and all producer/writer ID combinations!");
+      PERFETTO_DCHECK(last_packet_sequence_id < kMaxPacketSequenceID);
+      PacketSequenceID sequence_id = ++last_packet_sequence_id;
+      packet_sequence_ids[key] = sequence_id;
+      return sequence_id;
+    }
+
     const TracingSessionID id;
 
     // The consumer that started the session.
@@ -330,6 +347,10 @@
     // many entries as |config.buffers_size()|.
     std::vector<BufferID> buffers_index;
 
+    std::map<std::pair<ProducerID, WriterID>, PacketSequenceID>
+        packet_sequence_ids;
+    PacketSequenceID last_packet_sequence_id = kServicePacketSequenceID;
+
     // When the last snapshots (clock, stats, sync marker) were emitted into
     // the output stream.
     base::TimeMillis last_snapshot_time = {};