• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef HTRACE_MEM_PARSER_H
16 #define HTRACE_MEM_PARSER_H
17 
18 #include <cstdint>
19 #include <limits>
20 #include <map>
21 #include <stdexcept>
22 #include <string>
23 #include "common_types.h"
24 #include "event_parser_base.h"
25 #include "htrace_plugin_time_parser.h"
26 #include "memory_plugin_result.pbreader.h"
27 #include "string_help.h"
28 #include "trace_data_cache.h"
29 #include "trace_streamer_config.h"
30 #include "trace_streamer_filters.h"
31 namespace SysTuning {
32 namespace TraceStreamer {
33 using namespace SysTuning::base;
34 class PbreaderMemParser : public EventParserBase, public HtracePluginTimeParser {
35 public:
36     PbreaderMemParser(TraceDataCache *dataCache, const TraceStreamerFilters *ctx);
37     ~PbreaderMemParser();
38     void Parse(PbreaderDataSegment &seg, uint64_t, BuiltinClocks clock);
39     void ParseMemoryConfig(PbreaderDataSegment &seg);
40     void Finish();
41     enum class SmapsMemType {
42         SMAPS_MEM_TYPE_CODE_SYS = 0,     // 系统代码段
43         SMAPS_MEM_TYPE_CODE_APP = 1,     // 应用代码段
44         SMAPS_MEM_TYPE_DATA_SYS = 2,     // 系统数据段
45         SMAPS_MEM_TYPE_DATA_APP = 3,     // 应用数据段
46         SMAPS_MEM_TYPE_UNKNOWN_ANON = 4, // 系统未知匿名内存
47         SMAPS_MEM_TYPE_STACK = 5,        // 栈
48         SMAPS_MEM_TYPE_JS_HEAP = 6,      // js堆
49         SMAPS_MEM_TYPE_JAVA_VM = 7,      // java虚拟机
50         SMAPS_MEM_TYPE_NATIVE_HEAP = 8,  // native堆
51         SMAPS_MEM_TYPE_ASHMEM = 9,       // Ashmem
52         SMAPS_MEM_TYPE_OTHER_SYS = 10,   // 系统其他杂类资源
53         SMAPS_MEM_TYPE_OTHER_APP = 11,   // 应用其他杂类资源
54         SMAPS_MEM_TYPE_FONT = 12,        // Font
55         SMAPS_MEM_TYPE_INVALID = 127,
56     };
57     enum class MemProcessType {
58         PID_TYPE_COMPOSER = 0,
59         PID_TYPE_RENDER_SERVICES,
60         PID_TYPE_APP,
61     };
62     enum class MemDeduplicateFlag {
63         MEM_DEDUPLICATE_FLAG_NOMAL = 0,
64         MEM_DEDUPLICATE_FLAG_DUP_SAME_PROCESS,
65         MEM_DEDUPLICATE_FLAG_DUP_DIFF_PROCESS,
66     };
67 
68 private:
69     uint32_t ParseSmapsPathTypeBySuffix(bool hasX, const std::string &path, const bool hasAppName) const;
70     uint32_t ParseSmapsPathTypeByPrefix(bool hasX, const std::string &path, const bool hasAppName) const;
71     void ParseProcessInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
72     void ParseMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
73     void ParseMemInfoEasy(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
74     void ParseVMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
75     void ParseVMemInfoEasy(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
76     void ParseSmapsInfoEasy(const ProtoReader::ProcessMemoryInfo_Reader *memInfo,
77                             uint64_t timeStamp,
78                             uint64_t ipid) const;
79     uint32_t ParseSmapsBlockType(ProtoReader::SmapsInfo_Reader &smapsInfo) const;
80     uint32_t ParseSmapsBlockDetail(ProtoReader::SmapsInfo_Reader &smapsInfo,
81                                    const std::string &path,
82                                    const bool hasAppName) const;
83     void ParseAshmemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
84     void ParseDmaMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
85     void ParseGpuProcessMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
86     void ParseGpuWindowMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
87     void AshMemDeduplicate() const;
88     void DmaMemDeduplicate() const;
89     MemProcessType GetMemProcessType(uint64_t ipid) const;
90     void FillGpuWindowMemInfo(const ProtoReader::GpuDumpInfo_Reader &gpuDumpInfo, uint64_t timeStamp) const;
91     void ParseWindowManagerServiceInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp);
92     void ParseCpuDumpInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
93     void ParseProfileMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
94     void ParseRSImageDumpInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const;
95 
96     void SpecialDataAddition(ProtoReader::ProcessMemoryInfo_Reader &processMemoryInfo,
97                              uint64_t timeStamp,
98                              uint32_t ipid,
99                              uint32_t hasValue) const;
100 
101     std::map<MemInfoType, DataIndex> memNameDictMap_ = {};
102     std::map<uint32_t, DataIndex> sysMemNameDictMap_ = {};
103     std::map<uint32_t, DataIndex> sysVMemNameDictMap_ = {};
104     uint64_t zram_ = 0;
105     uint64_t gpuLimit_ = 0;
106     uint64_t gpuUsed_ = 0;
107     const DataIndex zramIndex_ = traceDataCache_->GetDataIndex("sys.mem.zram");
108     const DataIndex gpuLimitSizeIndex_ = traceDataCache_->GetDataIndex("sys.mem.gpu.limit");
109     const DataIndex gpuUsedSizeIndex_ = traceDataCache_->GetDataIndex("sys.mem.gpu.used");
110     std::map<DataIndex, InternalPid> windowIdToipidMap_ = {};
111 
112     TraceStreamerConfig config_{};
113 };
114 } // namespace TraceStreamer
115 } // namespace SysTuning
116 
117 #endif // HTRACE_MEM_PARSER_H
118