1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PACKET_SEQUENCE_STATE_GENERATION_H_ 18 #define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PACKET_SEQUENCE_STATE_GENERATION_H_ 19 20 #include <optional> 21 #include <unordered_map> 22 23 #include "perfetto/trace_processor/ref_counted.h" 24 #include "src/trace_processor/util/interned_message_view.h" 25 26 #include "protos/perfetto/trace/trace_packet_defaults.pbzero.h" 27 #include "protos/perfetto/trace/track_event/track_event.pbzero.h" 28 29 namespace perfetto { 30 namespace trace_processor { 31 32 using InternedMessageMap = 33 std::unordered_map<uint64_t /*iid*/, InternedMessageView>; 34 using InternedFieldMap = 35 std::unordered_map<uint32_t /*field_id*/, InternedMessageMap>; 36 37 class PacketSequenceState; 38 39 class PacketSequenceStateGeneration : public RefCounted { 40 public: 41 // Returns |nullptr| if the message with the given |iid| was not found (also 42 // records a stat in this case). 43 template <uint32_t FieldId, typename MessageType> 44 typename MessageType::Decoder* LookupInternedMessage(uint64_t iid); 45 46 InternedMessageView* GetInternedMessageView(uint32_t field_id, uint64_t iid); 47 // Returns |nullptr| if no defaults were set. GetTracePacketDefaultsView()48 InternedMessageView* GetTracePacketDefaultsView() { 49 if (!trace_packet_defaults_) 50 return nullptr; 51 return &trace_packet_defaults_.value(); 52 } 53 54 // Returns |nullptr| if no defaults were set. GetTracePacketDefaults()55 protos::pbzero::TracePacketDefaults::Decoder* GetTracePacketDefaults() { 56 InternedMessageView* view = GetTracePacketDefaultsView(); 57 if (!view) 58 return nullptr; 59 return view->GetOrCreateDecoder<protos::pbzero::TracePacketDefaults>(); 60 } 61 62 // Returns |nullptr| if no TrackEventDefaults were set. GetTrackEventDefaults()63 protos::pbzero::TrackEventDefaults::Decoder* GetTrackEventDefaults() { 64 auto* packet_defaults_view = GetTracePacketDefaultsView(); 65 if (packet_defaults_view) { 66 auto* track_event_defaults_view = 67 packet_defaults_view 68 ->GetOrCreateSubmessageView<protos::pbzero::TracePacketDefaults, 69 protos::pbzero::TracePacketDefaults:: 70 kTrackEventDefaultsFieldNumber>(); 71 if (track_event_defaults_view) { 72 return track_event_defaults_view 73 ->GetOrCreateDecoder<protos::pbzero::TrackEventDefaults>(); 74 } 75 } 76 return nullptr; 77 } 78 state()79 PacketSequenceState* state() const { return state_; } generation_index()80 size_t generation_index() const { return generation_index_; } 81 82 private: 83 friend class PacketSequenceState; 84 PacketSequenceStateGeneration(PacketSequenceState * state,size_t generation_index)85 PacketSequenceStateGeneration(PacketSequenceState* state, 86 size_t generation_index) 87 : state_(state), generation_index_(generation_index) {} 88 PacketSequenceStateGeneration(PacketSequenceState * state,size_t generation_index,InternedFieldMap interned_data,TraceBlobView defaults)89 PacketSequenceStateGeneration(PacketSequenceState* state, 90 size_t generation_index, 91 InternedFieldMap interned_data, 92 TraceBlobView defaults) 93 : state_(state), 94 generation_index_(generation_index), 95 interned_data_(interned_data), 96 trace_packet_defaults_(InternedMessageView(std::move(defaults))) {} 97 98 void InternMessage(uint32_t field_id, TraceBlobView message); 99 SetTracePacketDefaults(TraceBlobView defaults)100 void SetTracePacketDefaults(TraceBlobView defaults) { 101 // Defaults should only be set once per generation. 102 PERFETTO_DCHECK(!trace_packet_defaults_); 103 trace_packet_defaults_ = InternedMessageView(std::move(defaults)); 104 } 105 106 PacketSequenceState* state_; 107 size_t generation_index_; 108 InternedFieldMap interned_data_; 109 std::optional<InternedMessageView> trace_packet_defaults_; 110 }; 111 112 } // namespace trace_processor 113 } // namespace perfetto 114 115 #endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PACKET_SEQUENCE_STATE_GENERATION_H_ 116