xref: /aosp_15_r20/external/perfetto/src/trace_processor/importers/proto/stack_profile_sequence_state.h (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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_STACK_PROFILE_SEQUENCE_STATE_H_
18 #define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_SEQUENCE_STATE_H_
19 
20 #include <cstdint>
21 #include <optional>
22 
23 #include "perfetto/ext/base/flat_hash_map.h"
24 #include "perfetto/ext/base/hash.h"
25 #include "perfetto/ext/base/string_view.h"
26 #include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
27 #include "src/trace_processor/storage/trace_storage.h"
28 #include "src/trace_processor/types/trace_processor_context.h"
29 
30 namespace perfetto {
31 namespace trace_processor {
32 
33 class TraceProcessorContext;
34 class VirtualMemoryMapping;
35 
36 class StackProfileSequenceState final
37     : public PacketSequenceStateGeneration::CustomState {
38  public:
39   explicit StackProfileSequenceState(TraceProcessorContext* context);
40 
41   StackProfileSequenceState(const StackProfileSequenceState&);
42 
43   virtual ~StackProfileSequenceState() override;
44 
45   // Returns `nullptr`if non could be found.
46   VirtualMemoryMapping* FindOrInsertMapping(uint64_t iid);
47   std::optional<CallsiteId> FindOrInsertCallstack(UniquePid upid, uint64_t iid);
48 
49  private:
50   std::optional<base::StringView> LookupInternedBuildId(uint64_t iid);
51   std::optional<base::StringView> LookupInternedMappingPath(uint64_t iid);
52   std::optional<base::StringView> LookupInternedFunctionName(uint64_t iid);
53 
54   // Returns `nullptr`if non could be found.
55   VirtualMemoryMapping* FindOrInsertMappingImpl(std::optional<UniquePid> upid,
56                                                 uint64_t iid);
57   std::optional<FrameId> FindOrInsertFrame(UniquePid upid, uint64_t iid);
58 
59   TraceProcessorContext* const context_;
60 
61   struct OptionalUniquePidAndIid {
62     std::optional<UniquePid> upid;
63     uint64_t iid;
64 
65     bool operator==(const OptionalUniquePidAndIid& o) const {
66       return upid == o.upid && iid == o.iid;
67     }
68 
69     struct Hasher {
operatorOptionalUniquePidAndIid::Hasher70       size_t operator()(const OptionalUniquePidAndIid& o) const {
71         base::Hasher h;
72         h.Update(o.iid);
73         if (o.upid) {
74           h.Update(*o.upid);
75         }
76         return static_cast<size_t>(h.digest());
77       }
78     };
79   };
80 
81   struct UniquePidAndIid {
82     UniquePid upid;
83     uint64_t iid;
84 
85     bool operator==(const UniquePidAndIid& o) const {
86       return upid == o.upid && iid == o.iid;
87     }
88 
89     struct Hasher {
operatorUniquePidAndIid::Hasher90       size_t operator()(const UniquePidAndIid& o) const {
91         return static_cast<size_t>(base::Hasher::Combine(o.upid, o.iid));
92       }
93     };
94   };
95   base::FlatHashMap<OptionalUniquePidAndIid,
96                     VirtualMemoryMapping*,
97                     OptionalUniquePidAndIid::Hasher>
98       cached_mappings_;
99   base::FlatHashMap<UniquePidAndIid, FrameId, UniquePidAndIid::Hasher>
100       cached_frames_;
101   base::FlatHashMap<UniquePidAndIid, CallsiteId, UniquePidAndIid::Hasher>
102       cached_callstacks_;
103 };
104 
105 }  // namespace trace_processor
106 }  // namespace perfetto
107 
108 #endif  // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_SEQUENCE_STATE_H_
109