diff options
author | Carlos Caballero Grolimund <carlscab@google.com> | 2024-05-08 08:35:53 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-05-08 08:35:53 +0000 |
commit | 8efcddd18907673565b6d36dd30b535754992dba (patch) | |
tree | ab7908b24fbfe431e29152a146a399a73c64b3b7 | |
parent | d592d5113a53639161b3ad6855c0e0a02c4e9ce0 (diff) | |
parent | 21e28b4ebab6d858f69a263f42663b1d7fcf74e6 (diff) | |
download | perfetto-8efcddd18907673565b6d36dd30b535754992dba.tar.gz |
Merge "Remove dependencies to PacketSequenceState" into main
45 files changed, 245 insertions, 172 deletions
diff --git a/src/trace_processor/importers/etw/BUILD.gn b/src/trace_processor/importers/etw/BUILD.gn index 23d8965fd..5e14c2fe6 100644 --- a/src/trace_processor/importers/etw/BUILD.gn +++ b/src/trace_processor/importers/etw/BUILD.gn @@ -51,6 +51,7 @@ source_set("full") { "../common:parser_types", "../i2c:full", "../proto:minimal", + "../proto:packet_sequence_state_generation_hdr", "../syscalls:full", ] } diff --git a/src/trace_processor/importers/etw/etw_module_impl.cc b/src/trace_processor/importers/etw/etw_module_impl.cc index 7c44d049e..6da884fbb 100644 --- a/src/trace_processor/importers/etw/etw_module_impl.cc +++ b/src/trace_processor/importers/etw/etw_module_impl.cc @@ -20,6 +20,7 @@ #include "src/trace_processor/importers/etw/etw_tokenizer.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" namespace perfetto { namespace trace_processor { @@ -35,13 +36,13 @@ ModuleResult EtwModuleImpl::TokenizePacket( const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t /*packet_timestamp*/, - PacketSequenceState* seq_state, + RefPtr<PacketSequenceStateGeneration> seq_state, uint32_t field_id) { switch (field_id) { case TracePacket::kEtwEventsFieldNumber: { auto etw_field = decoder.etw_events(); tokenizer_.TokenizeEtwBundle( - packet->slice(etw_field.data, etw_field.size), seq_state); + packet->slice(etw_field.data, etw_field.size), std::move(seq_state)); return ModuleResult::Handled(); } } diff --git a/src/trace_processor/importers/etw/etw_module_impl.h b/src/trace_processor/importers/etw/etw_module_impl.h index af05fc8aa..4a27846f4 100644 --- a/src/trace_processor/importers/etw/etw_module_impl.h +++ b/src/trace_processor/importers/etw/etw_module_impl.h @@ -21,6 +21,7 @@ #include "src/trace_processor/importers/etw/etw_module.h" #include "src/trace_processor/importers/etw/etw_parser.h" #include "src/trace_processor/importers/etw/etw_tokenizer.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" @@ -38,7 +39,7 @@ class EtwModuleImpl : public EtwModule { const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; void ParseEtwEventData(uint32_t cpu, diff --git a/src/trace_processor/importers/etw/etw_tokenizer.cc b/src/trace_processor/importers/etw/etw_tokenizer.cc index 2474454b3..e3b4a747b 100644 --- a/src/trace_processor/importers/etw/etw_tokenizer.cc +++ b/src/trace_processor/importers/etw/etw_tokenizer.cc @@ -22,7 +22,7 @@ #include "perfetto/ext/base/status_or.h" #include "perfetto/protozero/proto_decoder.h" #include "perfetto/protozero/proto_utils.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/sorter/trace_sorter.h" #include "src/trace_processor/storage/trace_storage.h" @@ -41,8 +41,9 @@ using protos::pbzero::BuiltinClock; using protos::pbzero::EtwTraceEventBundle; PERFETTO_ALWAYS_INLINE -base::Status EtwTokenizer::TokenizeEtwBundle(TraceBlobView bundle, - PacketSequenceState* state) { +base::Status EtwTokenizer::TokenizeEtwBundle( + TraceBlobView bundle, + RefPtr<PacketSequenceStateGeneration> state) { protos::pbzero::EtwTraceEventBundle::Decoder decoder(bundle.data(), bundle.length()); // Cpu id can either be in the etw bundle or inside the individual @@ -61,7 +62,7 @@ PERFETTO_ALWAYS_INLINE base::Status EtwTokenizer::TokenizeEtwEvent( std::optional<uint32_t> fallback_cpu, TraceBlobView event, - PacketSequenceState* state) { + RefPtr<PacketSequenceStateGeneration> state) { const uint8_t* data = event.data(); const size_t length = event.length(); ProtoDecoder decoder(data, length); @@ -104,7 +105,7 @@ base::Status EtwTokenizer::TokenizeEtwEvent( } context_->sorter->PushEtwEvent(cpu, *timestamp, std::move(event), - state->current_generation()); + std::move(state)); return base::OkStatus(); } diff --git a/src/trace_processor/importers/etw/etw_tokenizer.h b/src/trace_processor/importers/etw/etw_tokenizer.h index 6447ed2f7..028346824 100644 --- a/src/trace_processor/importers/etw/etw_tokenizer.h +++ b/src/trace_processor/importers/etw/etw_tokenizer.h @@ -21,6 +21,7 @@ #include "perfetto/base/status.h" #include "perfetto/trace_processor/trace_blob_view.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/storage/trace_storage.h" #include "src/trace_processor/types/trace_processor_context.h" @@ -29,19 +30,17 @@ namespace perfetto { namespace trace_processor { -class PacketSequenceState; - class EtwTokenizer { public: explicit EtwTokenizer(TraceProcessorContext* context) : context_(context) {} base::Status TokenizeEtwBundle(TraceBlobView bundle, - PacketSequenceState* state); + RefPtr<PacketSequenceStateGeneration> state); private: base::Status TokenizeEtwEvent(std::optional<uint32_t> fallback_cpu, TraceBlobView event, - PacketSequenceState* state); + RefPtr<PacketSequenceStateGeneration> state); TraceProcessorContext* context_; }; diff --git a/src/trace_processor/importers/ftrace/ftrace_module_impl.cc b/src/trace_processor/importers/ftrace/ftrace_module_impl.cc index bd67c644d..0858fa1ba 100644 --- a/src/trace_processor/importers/ftrace/ftrace_module_impl.cc +++ b/src/trace_processor/importers/ftrace/ftrace_module_impl.cc @@ -38,14 +38,14 @@ ModuleResult FtraceModuleImpl::TokenizePacket( const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t /*packet_timestamp*/, - PacketSequenceState* seq_state, + RefPtr<PacketSequenceStateGeneration> seq_state, uint32_t field_id) { switch (field_id) { case TracePacket::kFtraceEventsFieldNumber: { auto ftrace_field = decoder.ftrace_events(); return tokenizer_.TokenizeFtraceBundle( - packet->slice(ftrace_field.data, ftrace_field.size), seq_state, - decoder.trusted_packet_sequence_id()); + packet->slice(ftrace_field.data, ftrace_field.size), + std::move(seq_state), decoder.trusted_packet_sequence_id()); } case TracePacket::kFtraceStatsFieldNumber: { return parser_.ParseFtraceStats(decoder.ftrace_stats(), diff --git a/src/trace_processor/importers/ftrace/ftrace_module_impl.h b/src/trace_processor/importers/ftrace/ftrace_module_impl.h index 658bafc84..d6df0f9dc 100644 --- a/src/trace_processor/importers/ftrace/ftrace_module_impl.h +++ b/src/trace_processor/importers/ftrace/ftrace_module_impl.h @@ -22,6 +22,7 @@ #include "src/trace_processor/importers/ftrace/ftrace_module.h" #include "src/trace_processor/importers/ftrace/ftrace_parser.h" #include "src/trace_processor/importers/ftrace/ftrace_tokenizer.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" namespace perfetto { @@ -37,7 +38,7 @@ class FtraceModuleImpl : public FtraceModule { const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; void ParseFtraceEventData(uint32_t cpu, diff --git a/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc b/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc index cf38ac29d..00656fa66 100644 --- a/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc +++ b/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc @@ -23,7 +23,6 @@ #include "perfetto/trace_processor/basic_types.h" #include "src/trace_processor/importers/common/machine_tracker.h" #include "src/trace_processor/importers/common/metadata_tracker.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" #include "src/trace_processor/sorter/trace_sorter.h" #include "src/trace_processor/storage/metadata.h" #include "src/trace_processor/storage/stats.h" @@ -107,7 +106,7 @@ uint64_t TryFastParseFtraceEventId(const uint8_t* start, const uint8_t* end) { PERFETTO_ALWAYS_INLINE base::Status FtraceTokenizer::TokenizeFtraceBundle( TraceBlobView bundle, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t packet_sequence_id) { protos::pbzero::FtraceEventBundle::Decoder decoder(bundle.data(), bundle.length()); @@ -204,10 +203,11 @@ base::Status FtraceTokenizer::TokenizeFtraceBundle( } PERFETTO_ALWAYS_INLINE -void FtraceTokenizer::TokenizeFtraceEvent(uint32_t cpu, - ClockTracker::ClockId clock_id, - TraceBlobView event, - PacketSequenceState* state) { +void FtraceTokenizer::TokenizeFtraceEvent( + uint32_t cpu, + ClockTracker::ClockId clock_id, + TraceBlobView event, + RefPtr<PacketSequenceStateGeneration> state) { constexpr auto kTimestampFieldNumber = protos::pbzero::FtraceEvent::kTimestampFieldNumber; constexpr auto kTimestampFieldTag = MakeTagVarInt(kTimestampFieldNumber); @@ -281,8 +281,7 @@ void FtraceTokenizer::TokenizeFtraceEvent(uint32_t cpu, } context_->sorter->PushFtraceEvent(cpu, *timestamp, std::move(event), - state->current_generation(), - context_->machine_id()); + std::move(state), context_->machine_id()); } PERFETTO_ALWAYS_INLINE @@ -427,9 +426,10 @@ void FtraceTokenizer::HandleFtraceClockSnapshot(int64_t ftrace_ts, boot_ts)}); } -void FtraceTokenizer::TokenizeFtraceGpuWorkPeriod(uint32_t cpu, - TraceBlobView event, - PacketSequenceState* state) { +void FtraceTokenizer::TokenizeFtraceGpuWorkPeriod( + uint32_t cpu, + TraceBlobView event, + RefPtr<PacketSequenceStateGeneration> state) { // Special handling of valid gpu_work_period tracepoint events which contain // timestamp values for the GPU time period nested inside the event data. const uint8_t* data = event.data(); @@ -465,8 +465,7 @@ void FtraceTokenizer::TokenizeFtraceGpuWorkPeriod(uint32_t cpu, } context_->sorter->PushFtraceEvent(cpu, *timestamp, std::move(event), - state->current_generation(), - context_->machine_id()); + std::move(state), context_->machine_id()); } } // namespace trace_processor diff --git a/src/trace_processor/importers/ftrace/ftrace_tokenizer.h b/src/trace_processor/importers/ftrace/ftrace_tokenizer.h index 915ee9c88..d53504efe 100644 --- a/src/trace_processor/importers/ftrace/ftrace_tokenizer.h +++ b/src/trace_processor/importers/ftrace/ftrace_tokenizer.h @@ -21,6 +21,7 @@ #include "perfetto/trace_processor/trace_blob_view.h" #include "src/trace_processor/importers/common/clock_tracker.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/storage/trace_storage.h" #include "src/trace_processor/types/trace_processor_context.h" @@ -29,22 +30,20 @@ namespace perfetto { namespace trace_processor { -class PacketSequenceState; - class FtraceTokenizer { public: explicit FtraceTokenizer(TraceProcessorContext* context) : context_(context) {} base::Status TokenizeFtraceBundle(TraceBlobView bundle, - PacketSequenceState*, + RefPtr<PacketSequenceStateGeneration>, uint32_t packet_sequence_id); private: void TokenizeFtraceEvent(uint32_t cpu, ClockTracker::ClockId, TraceBlobView event, - PacketSequenceState* state); + RefPtr<PacketSequenceStateGeneration> state); void TokenizeFtraceCompactSched(uint32_t cpu, ClockTracker::ClockId, protozero::ConstBytes); @@ -64,7 +63,7 @@ class FtraceTokenizer { uint32_t packet_sequence_id); void TokenizeFtraceGpuWorkPeriod(uint32_t cpu, TraceBlobView event, - PacketSequenceState* state); + RefPtr<PacketSequenceStateGeneration> state); void DlogWithLimit(const base::Status& status) { static std::atomic<uint32_t> dlog_count(0); diff --git a/src/trace_processor/importers/proto/BUILD.gn b/src/trace_processor/importers/proto/BUILD.gn index 9930ea558..18a617af5 100644 --- a/src/trace_processor/importers/proto/BUILD.gn +++ b/src/trace_processor/importers/proto/BUILD.gn @@ -72,6 +72,7 @@ source_set("minimal") { deps = [ ":packet_sequence_state_generation_hdr", "../../../../gn:default_deps", + "../../../../include/perfetto/trace_processor:trace_processor", "../../../../protos/perfetto/common:zero", "../../../../protos/perfetto/config:zero", "../../../../protos/perfetto/trace:zero", @@ -201,7 +202,9 @@ source_set("proto_importer_module") { "proto_importer_module.h", ] deps = [ + ":packet_sequence_state_generation_hdr", "../../../../gn:default_deps", + "../../../../include/perfetto/trace_processor:trace_processor", "../../../base", "../../types", "../common:trace_parser_hdr", diff --git a/src/trace_processor/importers/proto/android_camera_event_module.cc b/src/trace_processor/importers/proto/android_camera_event_module.cc index 5c7722a06..60ec66123 100644 --- a/src/trace_processor/importers/proto/android_camera_event_module.cc +++ b/src/trace_processor/importers/proto/android_camera_event_module.cc @@ -17,17 +17,18 @@ #include "src/trace_processor/importers/proto/android_camera_event_module.h" #include "perfetto/ext/base/string_utils.h" -#include "protos/perfetto/trace/android/camera_event.pbzero.h" -#include "protos/perfetto/trace/trace_packet.pbzero.h" #include "src/trace_processor/importers/common/async_track_set_tracker.h" #include "src/trace_processor/importers/common/machine_tracker.h" #include "src/trace_processor/importers/common/parser_types.h" #include "src/trace_processor/importers/common/slice_tracker.h" #include "src/trace_processor/importers/common/track_tracker.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/sorter/trace_sorter.h" #include "src/trace_processor/storage/trace_storage.h" +#include "protos/perfetto/trace/android/camera_event.pbzero.h" +#include "protos/perfetto/trace/trace_packet.pbzero.h" + namespace perfetto { namespace trace_processor { @@ -45,7 +46,7 @@ ModuleResult AndroidCameraEventModule::TokenizePacket( const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t /*packet_timestamp*/, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) { if (field_id != TracePacket::kAndroidCameraFrameEventFieldNumber) { return ModuleResult::Ignored(); @@ -55,7 +56,7 @@ ModuleResult AndroidCameraEventModule::TokenizePacket( decoder.android_camera_frame_event()); context_->sorter->PushTracePacket( android_camera_frame_event.request_processing_started_ns(), - state->current_generation(), std::move(*packet), context_->machine_id()); + std::move(state), std::move(*packet), context_->machine_id()); return ModuleResult::Handled(); } diff --git a/src/trace_processor/importers/proto/android_camera_event_module.h b/src/trace_processor/importers/proto/android_camera_event_module.h index e9df6c469..03f8476b8 100644 --- a/src/trace_processor/importers/proto/android_camera_event_module.h +++ b/src/trace_processor/importers/proto/android_camera_event_module.h @@ -23,6 +23,7 @@ #include "protos/perfetto/trace/trace_packet.pbzero.h" #include "src/trace_processor/importers/common/parser_types.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "src/trace_processor/tables/sched_tables_py.h" #include "src/trace_processor/tables/slice_tables_py.h" @@ -42,7 +43,7 @@ class AndroidCameraEventModule : public ProtoImporterModule { const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; void ParseTracePacketData(const protos::pbzero::TracePacket::Decoder& decoder, diff --git a/src/trace_processor/importers/proto/android_probes_module.cc b/src/trace_processor/importers/proto/android_probes_module.cc index 02dcfe771..31f51dc6a 100644 --- a/src/trace_processor/importers/proto/android_probes_module.cc +++ b/src/trace_processor/importers/proto/android_probes_module.cc @@ -23,7 +23,7 @@ #include "src/trace_processor/importers/common/track_tracker.h" #include "src/trace_processor/importers/proto/android_probes_parser.h" #include "src/trace_processor/importers/proto/android_probes_tracker.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/sorter/trace_sorter.h" #include "protos/perfetto/common/android_energy_consumer_descriptor.pbzero.h" @@ -104,7 +104,7 @@ ModuleResult AndroidProbesModule::TokenizePacket( const protos::pbzero::TracePacket_Decoder&, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) { protos::pbzero::TracePacket::Decoder decoder(packet->data(), packet->length()); @@ -193,7 +193,7 @@ ModuleResult AndroidProbesModule::TokenizePacket( std::vector<uint8_t> vec = data_packet.SerializeAsArray(); TraceBlob blob = TraceBlob::CopyFrom(vec.data(), vec.size()); - context_->sorter->PushTracePacket(actual_ts, state->current_generation(), + context_->sorter->PushTracePacket(actual_ts, state, TraceBlobView(std::move(blob)), context_->machine_id()); } diff --git a/src/trace_processor/importers/proto/android_probes_module.h b/src/trace_processor/importers/proto/android_probes_module.h index 6b3d8cf89..1f45cbb65 100644 --- a/src/trace_processor/importers/proto/android_probes_module.h +++ b/src/trace_processor/importers/proto/android_probes_module.h @@ -19,6 +19,7 @@ #include "perfetto/base/build_config.h" #include "src/trace_processor/importers/proto/android_probes_parser.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "protos/perfetto/config/trace_config.pbzero.h" @@ -34,7 +35,7 @@ class AndroidProbesModule : public ProtoImporterModule { ModuleResult TokenizePacket(const protos::pbzero::TracePacket_Decoder&, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState*, + RefPtr<PacketSequenceStateGeneration>, uint32_t field_id) override; void ParseTracePacketData(const protos::pbzero::TracePacket_Decoder& decoder, diff --git a/src/trace_processor/importers/proto/metadata_minimal_module.cc b/src/trace_processor/importers/proto/metadata_minimal_module.cc index 691127586..dd0127f14 100644 --- a/src/trace_processor/importers/proto/metadata_minimal_module.cc +++ b/src/trace_processor/importers/proto/metadata_minimal_module.cc @@ -19,6 +19,7 @@ #include "perfetto/ext/base/base64.h" #include "perfetto/ext/base/string_utils.h" #include "src/trace_processor/importers/common/metadata_tracker.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/types/trace_processor_context.h" #include "protos/perfetto/trace/chrome/chrome_benchmark_metadata.pbzero.h" @@ -39,7 +40,7 @@ ModuleResult MetadataMinimalModule::TokenizePacket( const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView*, int64_t, - PacketSequenceState*, + RefPtr<PacketSequenceStateGeneration>, uint32_t field_id) { switch (field_id) { case TracePacket::kChromeMetadataFieldNumber: { diff --git a/src/trace_processor/importers/proto/metadata_minimal_module.h b/src/trace_processor/importers/proto/metadata_minimal_module.h index 3ffdf62f1..80c131bd8 100644 --- a/src/trace_processor/importers/proto/metadata_minimal_module.h +++ b/src/trace_processor/importers/proto/metadata_minimal_module.h @@ -18,6 +18,7 @@ #define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_METADATA_MINIMAL_MODULE_H_ #include "src/trace_processor/importers/common/trace_parser.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "src/trace_processor/storage/trace_storage.h" @@ -36,7 +37,7 @@ class MetadataMinimalModule : public ProtoImporterModule { const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; private: diff --git a/src/trace_processor/importers/proto/metadata_module.cc b/src/trace_processor/importers/proto/metadata_module.cc index 86cc72b71..96bd01768 100644 --- a/src/trace_processor/importers/proto/metadata_module.cc +++ b/src/trace_processor/importers/proto/metadata_module.cc @@ -23,6 +23,7 @@ #include "src/trace_processor/importers/common/slice_tracker.h" #include "src/trace_processor/importers/common/track_tracker.h" #include "src/trace_processor/importers/proto/config.descriptor.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/util/descriptors.h" #include "src/trace_processor/util/protozero_to_text.h" @@ -52,7 +53,7 @@ ModuleResult MetadataModule::TokenizePacket( const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView*, int64_t, - PacketSequenceState*, + RefPtr<PacketSequenceStateGeneration>, uint32_t field_id) { switch (field_id) { case TracePacket::kUiStateFieldNumber: { diff --git a/src/trace_processor/importers/proto/metadata_module.h b/src/trace_processor/importers/proto/metadata_module.h index 31cbd4259..001493673 100644 --- a/src/trace_processor/importers/proto/metadata_module.h +++ b/src/trace_processor/importers/proto/metadata_module.h @@ -18,6 +18,7 @@ #define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_METADATA_MODULE_H_ #include "src/trace_processor/importers/common/trace_parser.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" @@ -35,7 +36,7 @@ class MetadataModule : public ProtoImporterModule { const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; void ParseTracePacketData(const protos::pbzero::TracePacket::Decoder& decoder, diff --git a/src/trace_processor/importers/proto/network_trace_module.cc b/src/trace_processor/importers/proto/network_trace_module.cc index 01c949463..dda8f7074 100644 --- a/src/trace_processor/importers/proto/network_trace_module.cc +++ b/src/trace_processor/importers/proto/network_trace_module.cc @@ -21,7 +21,7 @@ #include "protos/perfetto/trace/trace_packet.pbzero.h" #include "src/trace_processor/importers/common/async_track_set_tracker.h" #include "src/trace_processor/importers/common/slice_tracker.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/sorter/trace_sorter.h" #include "src/trace_processor/storage/trace_storage.h" #include "src/trace_processor/types/tcp_state.h" @@ -78,18 +78,17 @@ ModuleResult NetworkTraceModule::TokenizePacket( const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView*, int64_t ts, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) { if (field_id != TracePacket::kNetworkPacketBundleFieldNumber) { return ModuleResult::Ignored(); } - auto seq_state = state->current_generation(); NetworkPacketBundle::Decoder evt(decoder.network_packet_bundle()); ConstBytes context = evt.ctx(); if (evt.has_iid()) { - auto* interned = seq_state->LookupInternedMessage< + auto* interned = state->LookupInternedMessage< protos::pbzero::InternedData::kPacketContextFieldNumber, protos::pbzero::NetworkPacketContext>(evt.iid()); if (!interned) { @@ -258,11 +257,12 @@ void NetworkTraceModule::ParseNetworkPacketBundle(int64_t ts, ConstBytes blob) { }); } -void NetworkTraceModule::PushPacketBufferForSort(int64_t timestamp, - PacketSequenceState* state) { +void NetworkTraceModule::PushPacketBufferForSort( + int64_t timestamp, + RefPtr<PacketSequenceStateGeneration> state) { std::vector<uint8_t> v = packet_buffer_.SerializeAsArray(); context_->sorter->PushTracePacket( - timestamp, state->current_generation(), + timestamp, std::move(state), TraceBlobView(TraceBlob::CopyFrom(v.data(), v.size()))); packet_buffer_.Reset(); } diff --git a/src/trace_processor/importers/proto/network_trace_module.h b/src/trace_processor/importers/proto/network_trace_module.h index 15082c793..984ea822c 100644 --- a/src/trace_processor/importers/proto/network_trace_module.h +++ b/src/trace_processor/importers/proto/network_trace_module.h @@ -20,14 +20,16 @@ #include <cstdint> #include "perfetto/protozero/scattered_heap_buffer.h" -#include "protos/perfetto/trace/android/network_trace.pbzero.h" -#include "protos/perfetto/trace/trace_packet.pbzero.h" #include "src/trace_processor/importers/common/args_tracker.h" #include "src/trace_processor/importers/common/parser_types.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "src/trace_processor/storage/trace_storage.h" #include "src/trace_processor/types/trace_processor_context.h" +#include "protos/perfetto/trace/android/network_trace.pbzero.h" +#include "protos/perfetto/trace/trace_packet.pbzero.h" + namespace perfetto { namespace trace_processor { @@ -45,7 +47,7 @@ class NetworkTraceModule : public ProtoImporterModule { const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t ts, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; void ParseTracePacketData(const protos::pbzero::TracePacket::Decoder& decoder, @@ -65,7 +67,8 @@ class NetworkTraceModule : public ProtoImporterModule { // Helper to simplify pushing a TracePacket to the sorter. The caller fills in // the packet buffer and uses this to push for sorting and reset the buffer. - void PushPacketBufferForSort(int64_t timestamp, PacketSequenceState* state); + void PushPacketBufferForSort(int64_t timestamp, + RefPtr<PacketSequenceStateGeneration> state); TraceProcessorContext* context_; protozero::HeapBuffered<protos::pbzero::TracePacket> packet_buffer_; diff --git a/src/trace_processor/importers/proto/packet_sequence_state.h b/src/trace_processor/importers/proto/packet_sequence_state.h index 2ad0c7b3c..b50af207b 100644 --- a/src/trace_processor/importers/proto/packet_sequence_state.h +++ b/src/trace_processor/importers/proto/packet_sequence_state.h @@ -35,8 +35,7 @@ class PacketSequenceState { public: explicit PacketSequenceState(TraceProcessorContext* context) : context_(context) { - current_generation_.reset( - new PacketSequenceStateGeneration(this, generation_index_++)); + current_generation_.reset(new PacketSequenceStateGeneration(this)); } int64_t IncrementAndGetTrackEventTimeNs(int64_t delta_ns) { @@ -75,8 +74,7 @@ class PacketSequenceState { // sequence. Add a new generation with the updated defaults but the // current generation's interned data state. current_generation_.reset(new PacketSequenceStateGeneration( - this, generation_index_++, current_generation_.get(), - std::move(defaults))); + this, current_generation_.get(), std::move(defaults))); } void SetThreadDescriptor(int32_t pid, @@ -101,8 +99,7 @@ class PacketSequenceState { // Starts a new generation with clean-slate incremental state and defaults. void OnIncrementalStateCleared() { packet_loss_ = false; - current_generation_.reset( - new PacketSequenceStateGeneration(this, generation_index_++)); + current_generation_.reset(new PacketSequenceStateGeneration(this)); } bool IsIncrementalStateValid() const { return !packet_loss_; } @@ -126,8 +123,6 @@ class PacketSequenceState { private: TraceProcessorContext* context_; - size_t generation_index_ = 0; - // If true, incremental state on the sequence is considered invalid until we // see the next packet with incremental_state_cleared. We assume that we // missed some packets at the beginning of the trace. diff --git a/src/trace_processor/importers/proto/packet_sequence_state_generation.cc b/src/trace_processor/importers/proto/packet_sequence_state_generation.cc index 1e890962a..c520e9259 100644 --- a/src/trace_processor/importers/proto/packet_sequence_state_generation.cc +++ b/src/trace_processor/importers/proto/packet_sequence_state_generation.cc @@ -25,11 +25,9 @@ namespace trace_processor { PacketSequenceStateGeneration::PacketSequenceStateGeneration( PacketSequenceState* state, - size_t generation_index, PacketSequenceStateGeneration* prev_gen, TraceBlobView defaults) : state_(state), - generation_index_(generation_index), interned_data_(prev_gen->interned_data_), trace_packet_defaults_(InternedMessageView(std::move(defaults))), trackers_(prev_gen->trackers_) { @@ -43,6 +41,16 @@ PacketSequenceStateGeneration::PacketSequenceStateGeneration( PacketSequenceStateGeneration::InternedDataTracker::~InternedDataTracker() = default; +bool PacketSequenceStateGeneration::pid_and_tid_valid() const { + return state_->pid_and_tid_valid(); +} +int32_t PacketSequenceStateGeneration::pid() const { + return state_->pid(); +} +int32_t PacketSequenceStateGeneration::tid() const { + return state_->tid(); +} + TraceProcessorContext* PacketSequenceStateGeneration::GetContext() const { return state_->context(); } @@ -95,5 +103,35 @@ InternedMessageView* PacketSequenceStateGeneration::GetInternedMessageView( return nullptr; } +int64_t PacketSequenceStateGeneration::IncrementAndGetTrackEventTimeNs( + int64_t delta_ns) { + return state_->IncrementAndGetTrackEventTimeNs(delta_ns); +} +int64_t PacketSequenceStateGeneration::IncrementAndGetTrackEventThreadTimeNs( + int64_t delta_ns) { + return state_->IncrementAndGetTrackEventThreadTimeNs(delta_ns); +} +int64_t +PacketSequenceStateGeneration::IncrementAndGetTrackEventThreadInstructionCount( + int64_t delta) { + return state_->IncrementAndGetTrackEventThreadInstructionCount(delta); +} +bool PacketSequenceStateGeneration::track_event_timestamps_valid() const { + return state_->track_event_timestamps_valid(); +} +void PacketSequenceStateGeneration::SetThreadDescriptor( + int32_t pid, + int32_t tid, + int64_t timestamp_ns, + int64_t thread_timestamp_ns, + int64_t thread_instruction_count) { + state_->SetThreadDescriptor(pid, tid, timestamp_ns, thread_timestamp_ns, + thread_instruction_count); +} + +bool PacketSequenceStateGeneration::IsIncrementalStateValid() const { + return state_->IsIncrementalStateValid(); +} + } // namespace trace_processor } // namespace perfetto diff --git a/src/trace_processor/importers/proto/packet_sequence_state_generation.h b/src/trace_processor/importers/proto/packet_sequence_state_generation.h index f31030924..6b60b596d 100644 --- a/src/trace_processor/importers/proto/packet_sequence_state_generation.h +++ b/src/trace_processor/importers/proto/packet_sequence_state_generation.h @@ -19,6 +19,7 @@ #include <array> #include <cstddef> +#include <cstdint> #include <memory> #include <optional> #include <tuple> @@ -84,7 +85,9 @@ class PacketSequenceStateGeneration : public RefCounted { return generation_->GetOrCreate<T>(); } - PacketSequenceState* state() const { return generation_->state(); } + bool pid_and_tid_valid() const { return generation_->pid_and_tid_valid(); } + int32_t pid() const { return generation_->pid(); } + int32_t tid() const { return generation_->tid(); } private: friend PacketSequenceStateGeneration; @@ -103,6 +106,10 @@ class PacketSequenceStateGeneration : public RefCounted { PacketSequenceStateGeneration* generation_ = nullptr; }; + bool pid_and_tid_valid() const; + int32_t pid() const; + int32_t tid() const; + // Returns |nullptr| if the message with the given |iid| was not found (also // records a stat in this case). template <uint32_t FieldId, typename MessageType> @@ -141,15 +148,28 @@ class PacketSequenceStateGeneration : public RefCounted { return nullptr; } - PacketSequenceState* state() const { return state_; } - size_t generation_index() const { return generation_index_; } - // Extension point for custom sequence state. To add new per sequence state // just subclass ´PacketSequenceStateGeneration´ and get your sequence bound // instance by calling this method. template <typename T> std::remove_cv_t<T>* GetOrCreate(); + // TODO(carlscab): All this should be tracked in a dedicated class + // TrackEventSequenceState or something attached to the "incremental state". + int64_t IncrementAndGetTrackEventTimeNs(int64_t delta_ns); + int64_t IncrementAndGetTrackEventThreadTimeNs(int64_t delta_ns); + int64_t IncrementAndGetTrackEventThreadInstructionCount(int64_t delta); + bool track_event_timestamps_valid() const; + void SetThreadDescriptor(int32_t pid, + int32_t tid, + int64_t timestamp_ns, + int64_t thread_timestamp_ns, + int64_t thread_instruction_count); + + // TODO(carlscab): Nobody other than `ProtoTraceReader` should care about + // this. Remove. + bool IsIncrementalStateValid() const; + private: friend class PacketSequenceState; @@ -175,12 +195,10 @@ class PacketSequenceStateGeneration : public RefCounted { } } - PacketSequenceStateGeneration(PacketSequenceState* state, - size_t generation_index) - : state_(state), generation_index_(generation_index) {} + explicit PacketSequenceStateGeneration(PacketSequenceState* state) + : state_(state) {} PacketSequenceStateGeneration(PacketSequenceState* state, - size_t generation_index, PacketSequenceStateGeneration* prev_gen, TraceBlobView defaults); @@ -194,8 +212,9 @@ class PacketSequenceStateGeneration : public RefCounted { trace_packet_defaults_ = InternedMessageView(std::move(defaults)); } + // TODO(carlscab): This is dangerous given that PacketSequenceStateGeneration + // is refcounted and PacketSequenceState is not. PacketSequenceState* state_; - size_t generation_index_; InternedFieldMap interned_data_; std::optional<InternedMessageView> trace_packet_defaults_; std::array<RefPtr<InternedDataTracker>, diff --git a/src/trace_processor/importers/proto/profile_module.cc b/src/trace_processor/importers/proto/profile_module.cc index c194107eb..6064d33f6 100644 --- a/src/trace_processor/importers/proto/profile_module.cc +++ b/src/trace_processor/importers/proto/profile_module.cc @@ -27,7 +27,7 @@ #include "src/trace_processor/importers/common/mapping_tracker.h" #include "src/trace_processor/importers/common/process_tracker.h" #include "src/trace_processor/importers/common/stack_profile_tracker.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/perf_sample_tracker.h" #include "src/trace_processor/importers/proto/profile_packet_sequence_state.h" #include "src/trace_processor/importers/proto/profile_packet_utils.h" @@ -66,14 +66,15 @@ ProfileModule::ProfileModule(TraceProcessorContext* context) ProfileModule::~ProfileModule() = default; -ModuleResult ProfileModule::TokenizePacket(const TracePacket::Decoder& decoder, - TraceBlobView* packet, - int64_t /*packet_timestamp*/, - PacketSequenceState* state, - uint32_t field_id) { +ModuleResult ProfileModule::TokenizePacket( + const TracePacket::Decoder& decoder, + TraceBlobView* packet, + int64_t /*packet_timestamp*/, + RefPtr<PacketSequenceStateGeneration> state, + uint32_t field_id) { switch (field_id) { case TracePacket::kStreamingProfilePacketFieldNumber: - return TokenizeStreamingProfilePacket(state, packet, + return TokenizeStreamingProfilePacket(std::move(state), packet, decoder.streaming_profile_packet()); } return ModuleResult::Ignored(); @@ -93,7 +94,7 @@ void ProfileModule::ParseTracePacketData( ParsePerfSample(ts, data.sequence_state.get(), decoder); return; case TracePacket::kProfilePacketFieldNumber: - ParseProfilePacket(ts, data.sequence_state->state(), + ParseProfilePacket(ts, data.sequence_state.get(), decoder.profile_packet()); return; case TracePacket::kModuleSymbolsFieldNumber: @@ -111,7 +112,7 @@ void ProfileModule::ParseTracePacketData( } ModuleResult ProfileModule::TokenizeStreamingProfilePacket( - PacketSequenceState* sequence_state, + RefPtr<PacketSequenceStateGeneration> sequence_state, TraceBlobView* packet, ConstBytes streaming_profile_packet) { protos::pbzero::StreamingProfilePacket::Decoder decoder( @@ -139,8 +140,7 @@ ModuleResult ProfileModule::TokenizeStreamingProfilePacket( sequence_state->IncrementAndGetTrackEventTimeNs(*timestamp_it * 1000); } - context_->sorter->PushTracePacket(packet_ts, - sequence_state->current_generation(), + context_->sorter->PushTracePacket(packet_ts, std::move(sequence_state), std::move(*packet), context_->machine_id()); return ModuleResult::Handled(); } @@ -157,8 +157,8 @@ void ProfileModule::ParseStreamingProfilePacket( StackProfileSequenceState& stack_profile_sequence_state = *sequence_state->GetOrCreate<StackProfileSequenceState>(); - uint32_t pid = static_cast<uint32_t>(sequence_state->state()->pid()); - uint32_t tid = static_cast<uint32_t>(sequence_state->state()->tid()); + uint32_t pid = static_cast<uint32_t>(sequence_state->pid()); + uint32_t tid = static_cast<uint32_t>(sequence_state->tid()); const UniqueTid utid = procs->UpdateThread(tid, pid); const UniquePid upid = procs->GetOrCreateProcess(pid); @@ -301,12 +301,12 @@ void ProfileModule::ParsePerfSample( context_->storage->mutable_perf_sample_table()->Insert(sample_row); } -void ProfileModule::ParseProfilePacket(int64_t ts, - PacketSequenceState* sequence_state, - ConstBytes blob) { +void ProfileModule::ParseProfilePacket( + int64_t ts, + PacketSequenceStateGeneration* sequence_state, + ConstBytes blob) { ProfilePacketSequenceState& profile_packet_sequence_state = - *sequence_state->current_generation() - ->GetOrCreate<ProfilePacketSequenceState>(); + *sequence_state->GetOrCreate<ProfilePacketSequenceState>(); protos::pbzero::ProfilePacket::Decoder packet(blob.data, blob.size); profile_packet_sequence_state.SetProfilePacketIndex(packet.index()); diff --git a/src/trace_processor/importers/proto/profile_module.h b/src/trace_processor/importers/proto/profile_module.h index 883fb7aa2..cabc3bfef 100644 --- a/src/trace_processor/importers/proto/profile_module.h +++ b/src/trace_processor/importers/proto/profile_module.h @@ -18,8 +18,8 @@ #define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILE_MODULE_H_ #include "perfetto/protozero/field.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" -#include "src/trace_processor/importers/proto/proto_incremental_state.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" @@ -37,7 +37,7 @@ class ProfileModule : public ProtoImporterModule { const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; void ParseTracePacketData(const protos::pbzero::TracePacket::Decoder& decoder, @@ -50,7 +50,7 @@ class ProfileModule : public ProtoImporterModule { private: // chrome stack sampling: ModuleResult TokenizeStreamingProfilePacket( - PacketSequenceState*, + RefPtr<PacketSequenceStateGeneration>, TraceBlobView* packet, protozero::ConstBytes streaming_profile_packet); void ParseStreamingProfilePacket( @@ -65,7 +65,7 @@ class ProfileModule : public ProtoImporterModule { // heap profiling: void ParseProfilePacket(int64_t ts, - PacketSequenceState*, + PacketSequenceStateGeneration*, protozero::ConstBytes); void ParseDeobfuscationMapping(int64_t ts, PacketSequenceStateGeneration*, diff --git a/src/trace_processor/importers/proto/profile_packet_sequence_state.cc b/src/trace_processor/importers/proto/profile_packet_sequence_state.cc index d90976825..b5cdb704b 100644 --- a/src/trace_processor/importers/proto/profile_packet_sequence_state.cc +++ b/src/trace_processor/importers/proto/profile_packet_sequence_state.cc @@ -23,7 +23,6 @@ #include "src/trace_processor/importers/common/mapping_tracker.h" #include "src/trace_processor/importers/common/process_tracker.h" #include "src/trace_processor/importers/common/stack_profile_tracker.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" #include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/profile_packet_utils.h" #include "src/trace_processor/importers/proto/stack_profile_sequence_state.h" diff --git a/src/trace_processor/importers/proto/profile_packet_utils.h b/src/trace_processor/importers/proto/profile_packet_utils.h index a9ea0e68b..68e4e50ad 100644 --- a/src/trace_processor/importers/proto/profile_packet_utils.h +++ b/src/trace_processor/importers/proto/profile_packet_utils.h @@ -19,7 +19,6 @@ #include <optional> #include "perfetto/ext/base/string_view.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" #include "src/trace_processor/importers/proto/profile_packet_sequence_state.h" #include "protos/perfetto/trace/interned_data/interned_data.pbzero.h" diff --git a/src/trace_processor/importers/proto/proto_importer_module.cc b/src/trace_processor/importers/proto/proto_importer_module.cc index c79c05dd5..fbfa96037 100644 --- a/src/trace_processor/importers/proto/proto_importer_module.cc +++ b/src/trace_processor/importers/proto/proto_importer_module.cc @@ -16,6 +16,8 @@ #include "src/trace_processor/importers/proto/proto_importer_module.h" +#include "perfetto/trace_processor/ref_counted.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/types/trace_processor_context.h" namespace perfetto { @@ -29,7 +31,7 @@ ModuleResult ProtoImporterModule::TokenizePacket( const protos::pbzero::TracePacket_Decoder&, TraceBlobView* /*packet*/, int64_t /*packet_timestamp*/, - PacketSequenceState*, + RefPtr<PacketSequenceStateGeneration> /*sequence_state*/, uint32_t /*field_id*/) { return ModuleResult::Ignored(); } diff --git a/src/trace_processor/importers/proto/proto_importer_module.h b/src/trace_processor/importers/proto/proto_importer_module.h index cc2c3a2b3..d770111a5 100644 --- a/src/trace_processor/importers/proto/proto_importer_module.h +++ b/src/trace_processor/importers/proto/proto_importer_module.h @@ -21,6 +21,7 @@ #include "perfetto/base/status.h" #include "src/trace_processor/importers/common/trace_parser.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" namespace perfetto { @@ -33,7 +34,6 @@ class TracePacket_Decoder; namespace trace_processor { -class PacketSequenceState; class TraceBlobView; class TraceProcessorContext; @@ -108,7 +108,7 @@ class ProtoImporterModule { const protos::pbzero::TracePacket_Decoder&, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState*, + RefPtr<PacketSequenceStateGeneration> sequence_state, uint32_t field_id); // Called by ProtoTraceReader during the tokenization stage i.e. before diff --git a/src/trace_processor/importers/proto/proto_trace_parser_impl.cc b/src/trace_processor/importers/proto/proto_trace_parser_impl.cc index bbd38c3f0..9d318a1c8 100644 --- a/src/trace_processor/importers/proto/proto_trace_parser_impl.cc +++ b/src/trace_processor/importers/proto/proto_trace_parser_impl.cc @@ -38,7 +38,6 @@ #include "src/trace_processor/importers/common/track_tracker.h" #include "src/trace_processor/importers/etw/etw_module.h" #include "src/trace_processor/importers/ftrace/ftrace_module.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" #include "src/trace_processor/importers/proto/track_event_module.h" #include "src/trace_processor/storage/metadata.h" #include "src/trace_processor/storage/stats.h" diff --git a/src/trace_processor/importers/proto/proto_trace_reader.cc b/src/trace_processor/importers/proto/proto_trace_reader.cc index 972acf358..e139cbe0e 100644 --- a/src/trace_processor/importers/proto/proto_trace_reader.cc +++ b/src/trace_processor/importers/proto/proto_trace_reader.cc @@ -236,13 +236,13 @@ util::Status ProtoTraceReader::ParsePacket(TraceBlobView packet) { for (ProtoImporterModule* global_module : context_->modules_for_all_fields) { ModuleResult res = global_module->TokenizePacket( - decoder, &packet, timestamp, state, field_id); + decoder, &packet, timestamp, state->current_generation(), field_id); if (!res.ignored()) return res.ToStatus(); } for (ProtoImporterModule* module : modules[field_id]) { - ModuleResult res = module->TokenizePacket(decoder, &packet, timestamp, - state, field_id); + ModuleResult res = module->TokenizePacket( + decoder, &packet, timestamp, state->current_generation(), field_id); if (!res.ignored()) return res.ToStatus(); } diff --git a/src/trace_processor/importers/proto/stack_profile_sequence_state.cc b/src/trace_processor/importers/proto/stack_profile_sequence_state.cc index 2688d26dd..3d133094d 100644 --- a/src/trace_processor/importers/proto/stack_profile_sequence_state.cc +++ b/src/trace_processor/importers/proto/stack_profile_sequence_state.cc @@ -63,10 +63,10 @@ StackProfileSequenceState::~StackProfileSequenceState() = default; VirtualMemoryMapping* StackProfileSequenceState::FindOrInsertMapping( uint64_t iid) { - if (state()->pid_and_tid_valid()) { + if (pid_and_tid_valid()) { return FindOrInsertMappingImpl( context_->process_tracker->GetOrCreateProcess( - static_cast<uint32_t>(state()->pid())), + static_cast<uint32_t>(pid())), iid); } diff --git a/src/trace_processor/importers/proto/statsd_module.cc b/src/trace_processor/importers/proto/statsd_module.cc index 2f9d3cd0c..e925b5a63 100644 --- a/src/trace_processor/importers/proto/statsd_module.cc +++ b/src/trace_processor/importers/proto/statsd_module.cc @@ -23,7 +23,7 @@ #include "src/trace_processor/importers/common/machine_tracker.h" #include "src/trace_processor/importers/common/slice_tracker.h" #include "src/trace_processor/importers/common/track_tracker.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/sorter/trace_sorter.h" #include "src/trace_processor/storage/stats.h" #include "src/trace_processor/storage/trace_storage.h" @@ -216,11 +216,12 @@ StatsdModule::StatsdModule(TraceProcessorContext* context) StatsdModule::~StatsdModule() = default; -ModuleResult StatsdModule::TokenizePacket(const TracePacket::Decoder& decoder, - TraceBlobView* /*packet*/, - int64_t packet_timestamp, - PacketSequenceState* state, - uint32_t field_id) { +ModuleResult StatsdModule::TokenizePacket( + const TracePacket::Decoder& decoder, + TraceBlobView* /*packet*/, + int64_t packet_timestamp, + RefPtr<PacketSequenceStateGeneration> state, + uint32_t field_id) { if (field_id != TracePacket::kStatsdAtomFieldNumber) { return ModuleResult::Ignored(); } @@ -246,9 +247,9 @@ ModuleResult StatsdModule::TokenizePacket(const TracePacket::Decoder& decoder, std::vector<uint8_t> vec = forged.SerializeAsArray(); TraceBlob blob = TraceBlob::CopyFrom(vec.data(), vec.size()); - context_->sorter->PushTracePacket( - atom_timestamp, state->current_generation(), - TraceBlobView(std::move(blob)), context_->machine_id()); + context_->sorter->PushTracePacket(atom_timestamp, state, + TraceBlobView(std::move(blob)), + context_->machine_id()); } return ModuleResult::Handled(); diff --git a/src/trace_processor/importers/proto/statsd_module.h b/src/trace_processor/importers/proto/statsd_module.h index 07a524d55..bb084b8c2 100644 --- a/src/trace_processor/importers/proto/statsd_module.h +++ b/src/trace_processor/importers/proto/statsd_module.h @@ -24,6 +24,7 @@ #include "protos/perfetto/trace/trace_packet.pbzero.h" #include "src/trace_processor/importers/common/async_track_set_tracker.h" #include "src/trace_processor/importers/common/trace_parser.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "src/trace_processor/storage/trace_storage.h" #include "src/trace_processor/tables/sched_tables_py.h" @@ -66,7 +67,7 @@ class StatsdModule : public ProtoImporterModule { ModuleResult TokenizePacket(const protos::pbzero::TracePacket::Decoder&, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; void ParseTracePacketData(const protos::pbzero::TracePacket::Decoder& decoder, diff --git a/src/trace_processor/importers/proto/system_probes_module.cc b/src/trace_processor/importers/proto/system_probes_module.cc index b451f966a..633a0bc8b 100644 --- a/src/trace_processor/importers/proto/system_probes_module.cc +++ b/src/trace_processor/importers/proto/system_probes_module.cc @@ -16,6 +16,7 @@ #include "src/trace_processor/importers/proto/system_probes_module.h" #include "perfetto/base/build_config.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/system_probes_parser.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" @@ -38,7 +39,7 @@ ModuleResult SystemProbesModule::TokenizePacket( const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView*, int64_t, - PacketSequenceState*, + RefPtr<PacketSequenceStateGeneration>, uint32_t field_id) { switch (field_id) { case TracePacket::kSystemInfoFieldNumber: diff --git a/src/trace_processor/importers/proto/system_probes_module.h b/src/trace_processor/importers/proto/system_probes_module.h index b781ecce6..96909a54e 100644 --- a/src/trace_processor/importers/proto/system_probes_module.h +++ b/src/trace_processor/importers/proto/system_probes_module.h @@ -19,6 +19,7 @@ #include "perfetto/base/build_config.h" #include "src/trace_processor/importers/common/trace_parser.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "src/trace_processor/importers/proto/system_probes_parser.h" @@ -34,7 +35,7 @@ class SystemProbesModule : public ProtoImporterModule { ModuleResult TokenizePacket(const protos::pbzero::TracePacket::Decoder&, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState*, + RefPtr<PacketSequenceStateGeneration>, uint32_t field_id) override; void ParseTracePacketData(const protos::pbzero::TracePacket::Decoder& decoder, diff --git a/src/trace_processor/importers/proto/track_event_module.cc b/src/trace_processor/importers/proto/track_event_module.cc index 719704615..aee720c55 100644 --- a/src/trace_processor/importers/proto/track_event_module.cc +++ b/src/trace_processor/importers/proto/track_event_module.cc @@ -19,6 +19,7 @@ #include "perfetto/base/logging.h" #include "perfetto/ext/base/string_utils.h" #include "src/trace_processor/importers/common/track_tracker.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/track_event_tracker.h" #include "src/trace_processor/types/trace_processor_context.h" @@ -48,22 +49,23 @@ ModuleResult TrackEventModule::TokenizePacket( const TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) { switch (field_id) { case TracePacket::kTrackEventRangeOfInterestFieldNumber: - return tokenizer_.TokenizeRangeOfInterestPacket(state, decoder, + return tokenizer_.TokenizeRangeOfInterestPacket(std::move(state), decoder, packet_timestamp); case TracePacket::kTrackDescriptorFieldNumber: - return tokenizer_.TokenizeTrackDescriptorPacket(state, decoder, + return tokenizer_.TokenizeTrackDescriptorPacket(std::move(state), decoder, packet_timestamp); case TracePacket::kTrackEventFieldNumber: - tokenizer_.TokenizeTrackEventPacket(state, decoder, packet, + tokenizer_.TokenizeTrackEventPacket(std::move(state), decoder, packet, packet_timestamp); return ModuleResult::Handled(); case TracePacket::kThreadDescriptorFieldNumber: // TODO(eseckler): Remove once Chrome has switched to TrackDescriptors. - return tokenizer_.TokenizeThreadDescriptorPacket(state, decoder); + return tokenizer_.TokenizeThreadDescriptorPacket(std::move(state), + decoder); } return ModuleResult::Ignored(); } diff --git a/src/trace_processor/importers/proto/track_event_module.h b/src/trace_processor/importers/proto/track_event_module.h index 2b68a88b2..4a7ae69e8 100644 --- a/src/trace_processor/importers/proto/track_event_module.h +++ b/src/trace_processor/importers/proto/track_event_module.h @@ -17,6 +17,8 @@ #ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_TRACK_EVENT_MODULE_H_ #define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_TRACK_EVENT_MODULE_H_ +#include "perfetto/trace_processor/ref_counted.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "src/trace_processor/importers/proto/track_event_parser.h" #include "src/trace_processor/importers/proto/track_event_tokenizer.h" @@ -36,7 +38,7 @@ class TrackEventModule : public ProtoImporterModule { const protos::pbzero::TracePacket::Decoder& decoder, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; void OnIncrementalStateCleared(uint32_t) override; diff --git a/src/trace_processor/importers/proto/track_event_parser.cc b/src/trace_processor/importers/proto/track_event_parser.cc index cb8084474..09ef47433 100644 --- a/src/trace_processor/importers/proto/track_event_parser.cc +++ b/src/trace_processor/importers/proto/track_event_parser.cc @@ -33,7 +33,6 @@ #include "src/trace_processor/importers/common/track_tracker.h" #include "src/trace_processor/importers/json/json_utils.h" #include "src/trace_processor/importers/proto/packet_analyzer.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" #include "src/trace_processor/importers/proto/profile_packet_utils.h" #include "src/trace_processor/importers/proto/stack_profile_sequence_state.h" #include "src/trace_processor/importers/proto/track_event_tracker.h" @@ -477,11 +476,9 @@ class TrackEventParser::EventImporter { storage_->process_track_table().id().IndexOf(track_id_); if (process_track_row) { upid_ = storage_->process_track_table().upid()[*process_track_row]; - if (sequence_state_->state()->pid_and_tid_valid()) { - uint32_t pid = - static_cast<uint32_t>(sequence_state_->state()->pid()); - uint32_t tid = - static_cast<uint32_t>(sequence_state_->state()->tid()); + if (sequence_state_->pid_and_tid_valid()) { + uint32_t pid = static_cast<uint32_t>(sequence_state_->pid()); + uint32_t tid = static_cast<uint32_t>(sequence_state_->tid()); UniqueTid utid_candidate = procs->UpdateThread(tid, pid); if (storage_->thread_table().upid()[utid_candidate] == upid_) legacy_passthrough_utid_ = utid_candidate; @@ -495,17 +492,15 @@ class TrackEventParser::EventImporter { tracks->mutable_name()->Set(*track_index, name_id_); } - if (sequence_state_->state()->pid_and_tid_valid()) { - uint32_t pid = - static_cast<uint32_t>(sequence_state_->state()->pid()); - uint32_t tid = - static_cast<uint32_t>(sequence_state_->state()->tid()); + if (sequence_state_->pid_and_tid_valid()) { + uint32_t pid = static_cast<uint32_t>(sequence_state_->pid()); + uint32_t tid = static_cast<uint32_t>(sequence_state_->tid()); legacy_passthrough_utid_ = procs->UpdateThread(tid, pid); } } } } else { - bool pid_tid_state_valid = sequence_state_->state()->pid_and_tid_valid(); + bool pid_tid_state_valid = sequence_state_->pid_and_tid_valid(); // We have a 0-value |track_uuid|. Nevertheless, we should only fall back // if we have either no |track_uuid| specified at all or |track_uuid| was @@ -524,8 +519,8 @@ class TrackEventParser::EventImporter { legacy_event_.has_tid_override() && pid_tid_state_valid; if (fallback_to_legacy_pid_tid_tracks) { - uint32_t pid = static_cast<uint32_t>(sequence_state_->state()->pid()); - uint32_t tid = static_cast<uint32_t>(sequence_state_->state()->tid()); + uint32_t pid = static_cast<uint32_t>(sequence_state_->pid()); + uint32_t tid = static_cast<uint32_t>(sequence_state_->tid()); if (legacy_event_.has_pid_override()) { pid = static_cast<uint32_t>(legacy_event_.pid_override()); tid = static_cast<uint32_t>(-1); diff --git a/src/trace_processor/importers/proto/track_event_tokenizer.cc b/src/trace_processor/importers/proto/track_event_tokenizer.cc index 7f2074280..d9ed33607 100644 --- a/src/trace_processor/importers/proto/track_event_tokenizer.cc +++ b/src/trace_processor/importers/proto/track_event_tokenizer.cc @@ -17,13 +17,14 @@ #include "src/trace_processor/importers/proto/track_event_tokenizer.h" #include "perfetto/base/logging.h" +#include "perfetto/trace_processor/ref_counted.h" #include "perfetto/trace_processor/trace_blob_view.h" #include "src/trace_processor/importers/common/clock_tracker.h" #include "src/trace_processor/importers/common/machine_tracker.h" #include "src/trace_processor/importers/common/metadata_tracker.h" #include "src/trace_processor/importers/common/process_tracker.h" #include "src/trace_processor/importers/common/track_tracker.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_trace_reader.h" #include "src/trace_processor/importers/proto/track_event_tracker.h" #include "src/trace_processor/sorter/trace_sorter.h" @@ -58,7 +59,7 @@ TrackEventTokenizer::TrackEventTokenizer(TraceProcessorContext* context, context_->storage->InternString("thread_instruction_count")) {} ModuleResult TrackEventTokenizer::TokenizeRangeOfInterestPacket( - PacketSequenceState* /*state*/, + RefPtr<PacketSequenceStateGeneration> /*state*/, const protos::pbzero::TracePacket::Decoder& packet, int64_t /*packet_timestamp*/) { protos::pbzero::TrackEventRangeOfInterest::Decoder range_of_interest( @@ -75,7 +76,7 @@ ModuleResult TrackEventTokenizer::TokenizeRangeOfInterestPacket( } ModuleResult TrackEventTokenizer::TokenizeTrackDescriptorPacket( - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, const protos::pbzero::TracePacket::Decoder& packet, int64_t packet_timestamp) { auto track_descriptor_field = packet.track_descriptor(); @@ -109,7 +110,7 @@ ModuleResult TrackEventTokenizer::TokenizeTrackDescriptorPacket( } if (state->IsIncrementalStateValid()) { - TokenizeThreadDescriptor(state, thread); + TokenizeThreadDescriptor(*state, thread); } track_event_tracker_->ReserveDescriptorThreadTrack( @@ -181,7 +182,7 @@ ModuleResult TrackEventTokenizer::TokenizeTrackDescriptorPacket( } ModuleResult TrackEventTokenizer::TokenizeThreadDescriptorPacket( - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, const protos::pbzero::TracePacket::Decoder& packet) { if (PERFETTO_UNLIKELY(!packet.has_trusted_packet_sequence_id())) { PERFETTO_ELOG("ThreadDescriptor packet without trusted_packet_sequence_id"); @@ -200,25 +201,25 @@ ModuleResult TrackEventTokenizer::TokenizeThreadDescriptorPacket( } protos::pbzero::ThreadDescriptor::Decoder thread(packet.thread_descriptor()); - TokenizeThreadDescriptor(state, thread); + TokenizeThreadDescriptor(*state, thread); // Let ProtoTraceReader forward the packet to the parser. return ModuleResult::Ignored(); } void TrackEventTokenizer::TokenizeThreadDescriptor( - PacketSequenceState* state, + PacketSequenceStateGeneration& state, const protos::pbzero::ThreadDescriptor::Decoder& thread) { // TODO(eseckler): Remove support for legacy thread descriptor-based default // tracks and delta timestamps. - state->SetThreadDescriptor(thread.pid(), thread.tid(), - thread.reference_timestamp_us() * 1000, - thread.reference_thread_time_us() * 1000, - thread.reference_thread_instruction_count()); + state.SetThreadDescriptor(thread.pid(), thread.tid(), + thread.reference_timestamp_us() * 1000, + thread.reference_thread_time_us() * 1000, + thread.reference_thread_instruction_count()); } void TrackEventTokenizer::TokenizeTrackEventPacket( - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, const protos::pbzero::TracePacket::Decoder& packet, TraceBlobView* packet_blob, int64_t packet_timestamp) { @@ -232,10 +233,10 @@ void TrackEventTokenizer::TokenizeTrackEventPacket( protos::pbzero::TrackEvent::Decoder event(field.data, field.size); protos::pbzero::TrackEventDefaults::Decoder* defaults = - state->current_generation()->GetTrackEventDefaults(); + state->GetTrackEventDefaults(); int64_t timestamp; - TrackEventData data(std::move(*packet_blob), state->current_generation()); + TrackEventData data(std::move(*packet_blob), state); // TODO(eseckler): Remove handling of timestamps relative to ThreadDescriptors // once all producers have switched to clock-domain timestamps (e.g. diff --git a/src/trace_processor/importers/proto/track_event_tokenizer.h b/src/trace_processor/importers/proto/track_event_tokenizer.h index 010bc87dd..6ce334713 100644 --- a/src/trace_processor/importers/proto/track_event_tokenizer.h +++ b/src/trace_processor/importers/proto/track_event_tokenizer.h @@ -20,6 +20,7 @@ #include <stdint.h> #include "perfetto/protozero/proto_decoder.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "src/trace_processor/storage/trace_storage.h" @@ -36,7 +37,6 @@ class TracePacket_Decoder; namespace trace_processor { -class PacketSequenceState; class TraceProcessorContext; class TraceBlobView; class TrackEventTracker; @@ -47,24 +47,24 @@ class TrackEventTokenizer { explicit TrackEventTokenizer(TraceProcessorContext*, TrackEventTracker*); ModuleResult TokenizeRangeOfInterestPacket( - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, const protos::pbzero::TracePacket_Decoder&, int64_t packet_timestamp); ModuleResult TokenizeTrackDescriptorPacket( - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, const protos::pbzero::TracePacket_Decoder&, int64_t packet_timestamp); ModuleResult TokenizeThreadDescriptorPacket( - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, const protos::pbzero::TracePacket_Decoder&); - void TokenizeTrackEventPacket(PacketSequenceState* state, + void TokenizeTrackEventPacket(RefPtr<PacketSequenceStateGeneration> state, const protos::pbzero::TracePacket_Decoder&, TraceBlobView* packet, int64_t packet_timestamp); private: void TokenizeThreadDescriptor( - PacketSequenceState* state, + PacketSequenceStateGeneration& state, const protos::pbzero::ThreadDescriptor_Decoder&); template <typename T> base::Status AddExtraCounterValues( diff --git a/src/trace_processor/importers/proto/translation_table_module.cc b/src/trace_processor/importers/proto/translation_table_module.cc index b86c3d3a5..8684df031 100644 --- a/src/trace_processor/importers/proto/translation_table_module.cc +++ b/src/trace_processor/importers/proto/translation_table_module.cc @@ -17,6 +17,7 @@ #include "src/trace_processor/importers/common/args_translation_table.h" #include "src/trace_processor/importers/common/slice_translation_table.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" #include "protos/perfetto/trace/translation/translation_table.pbzero.h" @@ -37,7 +38,7 @@ ModuleResult TranslationTableModule::TokenizePacket( const protos::pbzero::TracePacket_Decoder& decoder, TraceBlobView* /*packet*/, int64_t /*packet_timestamp*/, - PacketSequenceState* /*state*/, + RefPtr<PacketSequenceStateGeneration> /*state*/, uint32_t field_id) { if (field_id != TracePacket::kTranslationTableFieldNumber) { return ModuleResult::Ignored(); diff --git a/src/trace_processor/importers/proto/translation_table_module.h b/src/trace_processor/importers/proto/translation_table_module.h index a318e6015..2060f4139 100644 --- a/src/trace_processor/importers/proto/translation_table_module.h +++ b/src/trace_processor/importers/proto/translation_table_module.h @@ -21,6 +21,7 @@ #include <optional> #include "protos/perfetto/trace/trace_packet.pbzero.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "src/trace_processor/types/trace_processor_context.h" @@ -37,7 +38,7 @@ class TranslationTableModule : public ProtoImporterModule { const protos::pbzero::TracePacket_Decoder& decoder, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; private: diff --git a/src/trace_processor/importers/proto/v8_module.cc b/src/trace_processor/importers/proto/v8_module.cc index f90a71c40..89360b6b4 100644 --- a/src/trace_processor/importers/proto/v8_module.cc +++ b/src/trace_processor/importers/proto/v8_module.cc @@ -24,7 +24,6 @@ #include "protos/perfetto/trace/trace_packet.pbzero.h" #include "src/trace_processor/importers/common/parser_types.h" #include "src/trace_processor/importers/common/process_tracker.h" -#include "src/trace_processor/importers/proto/packet_sequence_state.h" #include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/v8_sequence_state.h" #include "src/trace_processor/importers/proto/v8_tracker.h" @@ -58,11 +57,12 @@ V8Module::V8Module(TraceProcessorContext* context) V8Module::~V8Module() = default; -ModuleResult V8Module::TokenizePacket(const TracePacket::Decoder&, - TraceBlobView* /*packet*/, - int64_t /*packet_timestamp*/, - PacketSequenceState* /*state*/, - uint32_t /*field_id*/) { +ModuleResult V8Module::TokenizePacket( + const TracePacket::Decoder&, + TraceBlobView* /*packet*/, + int64_t /*packet_timestamp*/, + RefPtr<PacketSequenceStateGeneration> /*state*/, + uint32_t /*field_id*/) { return ModuleResult::Ignored(); } diff --git a/src/trace_processor/importers/proto/v8_module.h b/src/trace_processor/importers/proto/v8_module.h index ea49b3208..e5825f717 100644 --- a/src/trace_processor/importers/proto/v8_module.h +++ b/src/trace_processor/importers/proto/v8_module.h @@ -22,6 +22,7 @@ #include "perfetto/ext/base/flat_hash_map.h" #include "perfetto/protozero/field.h" +#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h" #include "src/trace_processor/importers/proto/proto_importer_module.h" #include "src/trace_processor/storage/trace_storage.h" #include "src/trace_processor/tables/v8_tables_py.h" @@ -53,7 +54,7 @@ class V8Module : public ProtoImporterModule { const protos::pbzero::TracePacket_Decoder& decoder, TraceBlobView* packet, int64_t packet_timestamp, - PacketSequenceState* state, + RefPtr<PacketSequenceStateGeneration> state, uint32_t field_id) override; void ParseTracePacketData(const protos::pbzero::TracePacket_Decoder&, |