• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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