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 = {};