1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2021. 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 
16 #ifndef MEMORY_DATA_PLUGIN_H
17 #define MEMORY_DATA_PLUGIN_H
18 
19 #include <algorithm>
20 #include <dirent.h>
21 #include <fcntl.h>
22 #include <inttypes.h>
23 #include <iomanip>
24 #include <sstream>
25 #include <string>
26 #include <sys/stat.h>
27 #include <sys/types.h>
28 #include <unistd.h>
29 #include <unordered_map>
30 #include <utility>
31 #include <v1_0/imemory_tracker_interface.h>
32 
33 #include "buffer_splitter.h"
34 #include "logging.h"
35 #include "memory_plugin_config.pb.h"
36 #include "memory_plugin_result.pb.h"
37 #include "plugin_module_api.h"
38 #include "smaps_stats.h"
39 #include "graphic_memory_collector.h"
40 
41 struct Proto2StrMapping {
42     int protobufid;
43     const char* procstr;
44 };
45 
46 constexpr Proto2StrMapping meminfoMapping[] = {
47     {SysMeminfoType::PMEM_UNSPECIFIED, "MemUnspecified"},
48     {SysMeminfoType::PMEM_MEM_TOTAL, "MemTotal"},
49     {SysMeminfoType::PMEM_MEM_FREE, "MemFree"},
50     {SysMeminfoType::PMEM_MEM_AVAILABLE, "MemAvailable"},
51     {SysMeminfoType::PMEM_BUFFERS, "Buffers"},
52     {SysMeminfoType::PMEM_CACHED, "Cached"},
53     {SysMeminfoType::PMEM_SWAP_CACHED, "SwapCached"},
54     {SysMeminfoType::PMEM_ACTIVE, "Active"},
55     {SysMeminfoType::PMEM_INACTIVE, "Inactive"},
56     {SysMeminfoType::PMEM_ACTIVE_ANON, "Active(anon)"},
57     {SysMeminfoType::PMEM_INACTIVE_ANON, "Inactive(anon)"},
58     {SysMeminfoType::PMEM_ACTIVE_FILE, "Active(file)"},
59     {SysMeminfoType::PMEM_INACTIVE_FILE, "Inactive(file)"},
60     {SysMeminfoType::PMEM_ACTIVE_PURG, "Active(purg)"},
61     {SysMeminfoType::PMEM_INACTIVE_PURG, "Inactive(purg)"},
62     {SysMeminfoType::PMEM_PINED_PURG, "Pined(purg)"},
63     {SysMeminfoType::PMEM_UNEVICTABLE, "Unevictable"},
64     {SysMeminfoType::PMEM_MLOCKED, "Mlocked"},
65     {SysMeminfoType::PMEM_SWAP_TOTAL, "SwapTotal"},
66     {SysMeminfoType::PMEM_SWAP_FREE, "SwapFree"},
67     {SysMeminfoType::PMEM_DIRTY, "Dirty"},
68     {SysMeminfoType::PMEM_WRITEBACK, "Writeback"},
69     {SysMeminfoType::PMEM_ANON_PAGES, "AnonPages"},
70     {SysMeminfoType::PMEM_MAPPED, "Mapped"},
71     {SysMeminfoType::PMEM_SHMEM, "Shmem"},
72     {SysMeminfoType::PMEM_SLAB, "Slab"},
73     {SysMeminfoType::PMEM_SLAB_RECLAIMABLE, "SReclaimable"},
74     {SysMeminfoType::PMEM_SLAB_UNRECLAIMABLE, "SUnreclaim"},
75     {SysMeminfoType::PMEM_KERNEL_STACK, "KernelStack"},
76     {SysMeminfoType::PMEM_PAGE_TABLES, "PageTables"},
77     {SysMeminfoType::PMEM_COMMIT_LIMIT, "CommitLimit"},
78     {SysMeminfoType::PMEM_COMMITED_AS, "Committed_AS"},
79     {SysMeminfoType::PMEM_VMALLOC_TOTAL, "VmallocTotal"},
80     {SysMeminfoType::PMEM_VMALLOC_USED, "VmallocUsed"},
81     {SysMeminfoType::PMEM_VMALLOC_CHUNK, "VmallocChunk"},
82     {SysMeminfoType::PMEM_CMA_TOTAL, "CmaTotal"},
83     {SysMeminfoType::PMEM_CMA_FREE, "CmaFree"},
84     {SysMeminfoType::PMEM_KERNEL_RECLAIMABLE, "KReclaimable"},
85 };
86 
87 constexpr Proto2StrMapping vmeminfoMapping[] = {
88     {SysVMeminfoType::VMEMINFO_UNSPECIFIED, "unspecified"},
89     {SysVMeminfoType::VMEMINFO_NR_FREE_PAGES, "nr_free_pages"},
90     {SysVMeminfoType::VMEMINFO_NR_ALLOC_BATCH, "nr_alloc_batch"},
91     {SysVMeminfoType::VMEMINFO_NR_INACTIVE_ANON, "nr_inactive_anon"},
92     {SysVMeminfoType::VMEMINFO_NR_ACTIVE_ANON, "nr_active_anon"},
93     {SysVMeminfoType::VMEMINFO_NR_INACTIVE_FILE, "nr_inactive_file"},
94     {SysVMeminfoType::VMEMINFO_NR_ACTIVE_FILE, "nr_active_file"},
95     {SysVMeminfoType::VMEMINFO_NR_UNEVICTABLE, "nr_unevictable"},
96     {SysVMeminfoType::VMEMINFO_NR_MLOCK, "nr_mlock"},
97     {SysVMeminfoType::VMEMINFO_NR_ANON_PAGES, "nr_anon_pages"},
98     {SysVMeminfoType::VMEMINFO_NR_MAPPED, "nr_mapped"},
99     {SysVMeminfoType::VMEMINFO_NR_FILE_PAGES, "nr_file_pages"},
100     {SysVMeminfoType::VMEMINFO_NR_DIRTY, "nr_dirty"},
101     {SysVMeminfoType::VMEMINFO_NR_WRITEBACK, "nr_writeback"},
102     {SysVMeminfoType::VMEMINFO_NR_SLAB_RECLAIMABLE, "nr_slab_reclaimable"},
103     {SysVMeminfoType::VMEMINFO_NR_SLAB_UNRECLAIMABLE, "nr_slab_unreclaimable"},
104     {SysVMeminfoType::VMEMINFO_NR_PAGE_TABLE_PAGES, "nr_page_table_pages"},
105     {SysVMeminfoType::VMEMINFO_NR_KERNEL_STACK, "nr_kernel_stack"},
106     {SysVMeminfoType::VMEMINFO_NR_OVERHEAD, "nr_overhead"},
107     {SysVMeminfoType::VMEMINFO_NR_UNSTABLE, "nr_unstable"},
108     {SysVMeminfoType::VMEMINFO_NR_BOUNCE, "nr_bounce"},
109     {SysVMeminfoType::VMEMINFO_NR_VMSCAN_WRITE, "nr_vmscan_write"},
110     {SysVMeminfoType::VMEMINFO_NR_VMSCAN_IMMEDIATE_RECLAIM, "nr_vmscan_immediate_reclaim"},
111     {SysVMeminfoType::VMEMINFO_NR_WRITEBACK_TEMP, "nr_writeback_temp"},
112     {SysVMeminfoType::VMEMINFO_NR_ISOLATED_ANON, "nr_isolated_anon"},
113     {SysVMeminfoType::VMEMINFO_NR_ISOLATED_FILE, "nr_isolated_file"},
114     {SysVMeminfoType::VMEMINFO_NR_SHMEM, "nr_shmem"},
115     {SysVMeminfoType::VMEMINFO_NR_DIRTIED, "nr_dirtied"},
116     {SysVMeminfoType::VMEMINFO_NR_WRITTEN, "nr_written"},
117     {SysVMeminfoType::VMEMINFO_NR_PAGES_SCANNED, "nr_pages_scanned"},
118     {SysVMeminfoType::VMEMINFO_WORKINGSET_REFAULT, "workingset_refault"},
119     {SysVMeminfoType::VMEMINFO_WORKINGSET_ACTIVATE, "workingset_activate"},
120     {SysVMeminfoType::VMEMINFO_WORKINGSET_NODERECLAIM, "workingset_nodereclaim"},
121     {SysVMeminfoType::VMEMINFO_NR_ANON_TRANSPARENT_HUGEPAGES, "nr_anon_transparent_hugepages"},
122     {SysVMeminfoType::VMEMINFO_NR_FREE_CMA, "nr_free_cma"},
123     {SysVMeminfoType::VMEMINFO_NR_SWAPCACHE, "nr_swapcache"},
124     {SysVMeminfoType::VMEMINFO_NR_DIRTY_THRESHOLD, "nr_dirty_threshold"},
125     {SysVMeminfoType::VMEMINFO_NR_DIRTY_BACKGROUND_THRESHOLD, "nr_dirty_background_threshold"},
126     {SysVMeminfoType::VMEMINFO_PGPGIN, "pgpgin"},
127     {SysVMeminfoType::VMEMINFO_PGPGOUT, "pgpgout"},
128     {SysVMeminfoType::VMEMINFO_PGPGOUTCLEAN, "pgpgoutclean"},
129     {SysVMeminfoType::VMEMINFO_PSWPIN, "pswpin"},
130     {SysVMeminfoType::VMEMINFO_PSWPOUT, "pswpou"},
131     {SysVMeminfoType::VMEMINFO_PGALLOC_DMA, "pgalloc_dma"},
132     {SysVMeminfoType::VMEMINFO_PGALLOC_NORMAL, "pgalloc_normal"},
133     {SysVMeminfoType::VMEMINFO_PGALLOC_MOVABLE, "pgalloc_movable"},
134     {SysVMeminfoType::VMEMINFO_PGFREE, "pgfree"},
135     {SysVMeminfoType::VMEMINFO_PGACTIVATE, "pgactivate"},
136     {SysVMeminfoType::VMEMINFO_PGDEACTIVATE, "pgdeactivate"},
137     {SysVMeminfoType::VMEMINFO_PGFAULT, "pgfault"},
138     {SysVMeminfoType::VMEMINFO_PGMAJFAULT, "pgmajfault"},
139     {SysVMeminfoType::VMEMINFO_PGREFILL_DMA, "pgrefill_dma"},
140     {SysVMeminfoType::VMEMINFO_PGREFILL_NORMAL, "pgrefill_normal"},
141     {SysVMeminfoType::VMEMINFO_PGREFILL_MOVABLE, "pgrefill_movable"},
142     {SysVMeminfoType::VMEMINFO_PGSTEAL_KSWAPD_DMA, "pgsteal_kswapd_dma"},
143     {SysVMeminfoType::VMEMINFO_PGSTEAL_KSWAPD_NORMAL, "pgsteal_kswapd_normal"},
144     {SysVMeminfoType::VMEMINFO_PGSTEAL_KSWAPD_MOVABLE, "pgsteal_kswapd_movable"},
145     {SysVMeminfoType::VMEMINFO_PGSTEAL_DIRECT_DMA, "pgsteal_direct_dma"},
146     {SysVMeminfoType::VMEMINFO_PGSTEAL_DIRECT_NORMAL, "pgsteal_direct_normal"},
147     {SysVMeminfoType::VMEMINFO_PGSTEAL_DIRECT_MOVABLE, "pgsteal_direct_movable"},
148     {SysVMeminfoType::VMEMINFO_PGSCAN_KSWAPD_DMA, "pgscan_kswapd_dma"},
149     {SysVMeminfoType::VMEMINFO_PGSCAN_KSWAPD_NORMAL, "pgscan_kswapd_normal"},
150     {SysVMeminfoType::VMEMINFO_PGSCAN_KSWAPD_MOVABLE, "pgscan_kswapd_movable"},
151     {SysVMeminfoType::VMEMINFO_PGSCAN_DIRECT_DMA, "pgscan_direct_dma"},
152     {SysVMeminfoType::VMEMINFO_PGSCAN_DIRECT_NORMAL, "pgscan_direct_normal"},
153     {SysVMeminfoType::VMEMINFO_PGSCAN_DIRECT_MOVABLE, "pgscan_direct_movable"},
154     {SysVMeminfoType::VMEMINFO_PGSCAN_DIRECT_THROTTLE, "pgscan_direct_throttle"},
155     {SysVMeminfoType::VMEMINFO_PGINODESTEAL, "pginodesteal"},
156     {SysVMeminfoType::VMEMINFO_SLABS_SCANNED, "slabs_scanned"},
157     {SysVMeminfoType::VMEMINFO_KSWAPD_INODESTEAL, "kswapd_inodesteal"},
158     {SysVMeminfoType::VMEMINFO_KSWAPD_LOW_WMARK_HIT_QUICKLY, "kswapd_low_wmark_hit_quickly"},
159     {SysVMeminfoType::VMEMINFO_KSWAPD_HIGH_WMARK_HIT_QUICKLY, "kswapd_high_wmark_hit_quickly"},
160     {SysVMeminfoType::VMEMINFO_PAGEOUTRUN, "pageoutrun"},
161     {SysVMeminfoType::VMEMINFO_ALLOCSTALL, "allocstall"},
162     {SysVMeminfoType::VMEMINFO_PGROTATED, "pgrotated"},
163     {SysVMeminfoType::VMEMINFO_DROP_PAGECACHE, "drop_pagecache"},
164     {SysVMeminfoType::VMEMINFO_DROP_SLAB, "drop_slab"},
165     {SysVMeminfoType::VMEMINFO_PGMIGRATE_SUCCESS, "pgmigrate_success"},
166     {SysVMeminfoType::VMEMINFO_PGMIGRATE_FAIL, "pgmigrate_fail"},
167     {SysVMeminfoType::VMEMINFO_COMPACT_MIGRATE_SCANNED, "compact_migrate_scanned"},
168     {SysVMeminfoType::VMEMINFO_COMPACT_FREE_SCANNED, "compact_free_scanned"},
169     {SysVMeminfoType::VMEMINFO_COMPACT_ISOLATED, "compact_isolated"},
170     {SysVMeminfoType::VMEMINFO_COMPACT_STALL, "compact_stall"},
171     {SysVMeminfoType::VMEMINFO_COMPACT_FAIL, "compact_fail"},
172     {SysVMeminfoType::VMEMINFO_COMPACT_SUCCESS, "compact_success"},
173     {SysVMeminfoType::VMEMINFO_COMPACT_DAEMON_WAKE, "compact_daemon_wake"},
174     {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_CULLED, "unevictable_pgs_culled"},
175     {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_SCANNED, "unevictable_pgs_scanned"},
176     {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_RESCUED, "unevictable_pgs_rescued"},
177     {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_MLOCKED, "unevictable_pgs_mlocked"},
178     {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_MUNLOCKED, "unevictable_pgs_munlocked"},
179     {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_CLEARED, "unevictable_pgs_cleared"},
180     {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_STRANDED, "unevictable_pgs_stranded"},
181     {SysVMeminfoType::VMEMINFO_NR_ZSPAGES, "nr_zspages"},
182     {SysVMeminfoType::VMEMINFO_NR_ION_HEAP, "nr_ion_heap"},
183     {SysVMeminfoType::VMEMINFO_NR_GPU_HEAP, "nr_gpu_heap"},
184     {SysVMeminfoType::VMEMINFO_ALLOCSTALL_DMA, "allocstall_dma"},
185     {SysVMeminfoType::VMEMINFO_ALLOCSTALL_MOVABLE, "allocstall_movable"},
186     {SysVMeminfoType::VMEMINFO_ALLOCSTALL_NORMAL, "allocstall_normal"},
187     {SysVMeminfoType::VMEMINFO_COMPACT_DAEMON_FREE_SCANNED, "compact_daemon_free_scanned"},
188     {SysVMeminfoType::VMEMINFO_COMPACT_DAEMON_MIGRATE_SCANNED, "compact_daemon_migrate_scanned"},
189     {SysVMeminfoType::VMEMINFO_NR_FASTRPC, "nr_fastrpc"},
190     {SysVMeminfoType::VMEMINFO_NR_INDIRECTLY_RECLAIMABLE, "nr_indirectly_reclaimable"},
191     {SysVMeminfoType::VMEMINFO_NR_ION_HEAP_POOL, "nr_ion_heap_pool"},
192     {SysVMeminfoType::VMEMINFO_NR_KERNEL_MISC_RECLAIMABLE, "nr_kernel_misc_reclaimable"},
193     {SysVMeminfoType::VMEMINFO_NR_SHADOW_CALL_STACK_BYTES, "nr_shadow_call_stack_bytes"},
194     {SysVMeminfoType::VMEMINFO_NR_SHMEM_HUGEPAGES, "nr_shmem_hugepages"},
195     {SysVMeminfoType::VMEMINFO_NR_SHMEM_PMDMAPPED, "nr_shmem_pmdmapped"},
196     {SysVMeminfoType::VMEMINFO_NR_UNRECLAIMABLE_PAGES, "nr_unreclaimable_pages"},
197     {SysVMeminfoType::VMEMINFO_NR_ZONE_ACTIVE_ANON, "nr_zone_active_anon"},
198     {SysVMeminfoType::VMEMINFO_NR_ZONE_ACTIVE_FILE, "nr_zone_active_file"},
199     {SysVMeminfoType::VMEMINFO_NR_ZONE_INACTIVE_ANON, "nr_zone_inactive_anon"},
200     {SysVMeminfoType::VMEMINFO_NR_ZONE_INACTIVE_FILE, "nr_zone_inactive_file"},
201     {SysVMeminfoType::VMEMINFO_NR_ZONE_UNEVICTABLE, "nr_zone_unevictable"},
202     {SysVMeminfoType::VMEMINFO_NR_ZONE_WRITE_PENDING, "nr_zone_write_pending"},
203     {SysVMeminfoType::VMEMINFO_OOM_KILL, "oom_kill"},
204     {SysVMeminfoType::VMEMINFO_PGLAZYFREE, "pglazyfree"},
205     {SysVMeminfoType::VMEMINFO_PGLAZYFREED, "pglazyfreed"},
206     {SysVMeminfoType::VMEMINFO_PGREFILL, "pgrefill"},
207     {SysVMeminfoType::VMEMINFO_PGSCAN_DIRECT, "pgscan_direct"},
208     {SysVMeminfoType::VMEMINFO_PGSCAN_KSWAPD, "pgscan_kswapd"},
209     {SysVMeminfoType::VMEMINFO_PGSKIP_DMA, "pgskip_dma"},
210     {SysVMeminfoType::VMEMINFO_PGSKIP_MOVABLE, "pgskip_movable"},
211     {SysVMeminfoType::VMEMINFO_PGSKIP_NORMAL, "pgskip_normal"},
212     {SysVMeminfoType::VMEMINFO_PGSTEAL_DIRECT, "pgsteal_direct"},
213     {SysVMeminfoType::VMEMINFO_PGSTEAL_KSWAPD, "pgsteal_kswapd"},
214     {SysVMeminfoType::VMEMINFO_SWAP_RA, "swap_ra"},
215     {SysVMeminfoType::VMEMINFO_SWAP_RA_HIT, "swap_ra_hit"},
216     {SysVMeminfoType::VMEMINFO_WORKINGSET_RESTORE, "workingset_restore"},
217 };
218 
219 struct ProcStatusMapping {
220     int procid;
221     const char* procstr;
222 };
223 
224 enum StatusType {
225     PRO_TGID = 1,
226     PRO_NAME,
227     PRO_VMSIZE,
228     PRO_VMRSS,
229     PRO_RSSANON,
230     PRO_RSSFILE,
231     PRO_RSSSHMEM,
232     PRO_VMSWAP,
233     PRO_VMLCK,
234     PRO_VMHWM,
235     PRO_PURGSUM,
236     PRO_PURGPIN,
237 };
238 
239 constexpr ProcStatusMapping procStatusMapping[] = {
240     {StatusType::PRO_TGID, "Tgid"},         {StatusType::PRO_NAME, "Name"},       {StatusType::PRO_VMSIZE, "VmSize"},
241     {StatusType::PRO_VMRSS, "VmRSS"},       {StatusType::PRO_RSSANON, "RssAnon"}, {StatusType::PRO_RSSFILE, "RssFile"},
242     {StatusType::PRO_RSSSHMEM, "RssShmem"}, {StatusType::PRO_VMSWAP, "VmSwap"},   {StatusType::PRO_VMLCK, "VmLck"},
243     {StatusType::PRO_VMHWM, "VmHWM"},       {StatusType::PRO_PURGSUM, "PurgSum"},
244     {StatusType::PRO_PURGPIN, "PurgPin"},
245 };
246 
247 enum ErrorType {
248     RET_NULL_ADDR,
249     RET_IVALID_PID,
250     RET_TGID_VALUE_NULL,
251     RET_FAIL = -1,
252     RET_SUCC = 0,
253 };
254 
255 enum FileType {
256     FILE_STATUS = 0,
257     FILE_OOM,
258     FILE_SMAPS,
259 };
260 
261 struct ProcfdMapping {
262     int procid;
263     const char* file;
264 };
265 
266 constexpr ProcfdMapping procfdMapping[] = {
267     {FileType::FILE_STATUS, "status"},
268     {FileType::FILE_OOM, "oom_score_adj"},
269     {FileType::FILE_SMAPS, "smaps"},
270 };
271 
272 enum AshmemType {
273     ASHMEM_PROCESS_NAME = 1,
274     ASHMEM_PID,
275     ASHMEM_FD,
276     ASHMEM_ADJ,
277     ASHMEM_NAME,
278     ASHMEM_SIZE,
279     ASHMEM_ID,
280     ASHMEM_TIME,
281     ASHMEM_REF_COUNT,
282     ASHMEM_PURGED,
283 };
284 
285 enum DmaType {
286     DMA_NAME = 1,
287     DMA_PID,
288     DMA_FD,
289     DMA_SIZE,
290     DMA_INO,
291     DMA_EXP_PID,
292     DMA_EXP_TASK_COMM,
293     DMA_BUF_NAME,
294     DMA_EXP_NAME,
295 };
296 
297 enum GpuMemoryType {
298     GPU_NAME = 1,
299     GPU_SIZE,
300 };
301 
302 enum GpuCtxType {
303     GPU_ADDR = 1,
304     GPU_TID,
305     GPU_PID,
306     GPU_USED_SIZE,
307 };
308 
309 enum RSImageDumpType {
310     RS_SIZE = 1,
311     RS_TYPE,
312     RS_PID,
313     RS_SURFACENAME = 5,
314 };
315 
316 enum WinMgrSvcType {
317     WINDOW_NAME = 1,
318     WINDOW_PID = 3,
319 };
320 
321 struct GraphicsMemory {
322     uint64_t gl = 0;
323     uint64_t graph = 0;
324 };
325 
326 const std::vector<std::pair<OHOS::HDI::Memorytracker::V1_0::MemoryTrackerType, std::string>> MEMORY_TRACKER_TYPES = {
327     {OHOS::HDI::Memorytracker::V1_0::MEMORY_TRACKER_TYPE_GL, "GL"},
328     {OHOS::HDI::Memorytracker::V1_0::MEMORY_TRACKER_TYPE_GRAPH, "Graph"},
329     {OHOS::HDI::Memorytracker::V1_0::MEMORY_TRACKER_TYPE_OTHER, "Other"}
330 };
331 
332 class MemoryDataPlugin {
333 public:
334     MemoryDataPlugin();
335     ~MemoryDataPlugin();
336     int Start(const uint8_t* configData, uint32_t configSize);
337     int Report(uint8_t* data, uint32_t dataSize);
338     int ReportOptimize(RandomWriteCtx* randomWrite);
339     int Stop();
SetPath(char* path)340     void SetPath(char* path)
341     {
342         testpath_ = path;
343     };
344 
345     // for UT
SetProtoConfig(MemoryConfig protoConfig)346     void SetProtoConfig(MemoryConfig protoConfig)
347     {
348         protoConfig_ = protoConfig;
349     };
350 
351     template <typename T> void WriteProcesseList(T& memoryData);
352 
353     template <typename T> void WriteProcinfoByPidfds(T& processMemoryInfo, int32_t pid);
354 
355     DIR* OpenDestDir(const char* dirPath);
356     int32_t GetValidPid(DIR* dirp);
357     // for test change static
358     int ParseNumber(std::string line);
359 
360 private:
361     /* data */
362     MemoryConfig protoConfig_;
363 
364     std::unique_ptr<uint8_t[]> buffer_;
365 
366     int meminfoFd_ = -1;
367     int vmstatFd_ = -1;
368     std::map<std::string, int> meminfoCounters_ = {};
369     std::map<std::string, int> vmstatCounters_ = {};
370 
371     void InitProto2StrVector();
372     std::vector<const char*> meminfoStrList_ = {};
373     std::vector<const char*> vmstatStrList_ = {};
374 
375     // SmapsStats *
376     template <typename T> void WriteVmstat(T& memoryData);
377 
378     template <typename T> void WriteMeminfo(T& memoryData);
379 
380     template <typename T> void WriteZramData(T& memoryData);
381 
382     std::unordered_map<int32_t, std::vector<int>> pidFds_ = {};
383     std::vector<int32_t> seenPids_ = {};
384     char* testpath_;
385     int32_t err_ = -1;
386     int32_t ReadFile(int fd);
387     std::string ReadFile(const std::string& path);
388     std::vector<int> OpenProcPidFiles(int32_t pid);
389     int32_t ReadProcPidFile(int32_t pid, const char* pFileName);
390 
391     template <typename T> void WriteProcessInfo(T& memoryData, int32_t pid);
392 
393     template <typename T> void WriteOomInfo(T& processMemoryInfo, int32_t pid);
394 
395     template <typename T> void WriteProcess(T& processMemoryInfo, const char* pFile, uint32_t fileLen, int32_t pid);
396 
397     template <typename T> void WriteAppsummary(T& processMemoryInfo, SmapsStats& smapInfo);
398 
399     template <typename T> void SetProcessInfo(T& processMemoryInfo, int key, const char* word);
400 
401     bool StringToUll(const char* word, uint64_t& value);
402 
403     bool BufnCmp(const char* src, int srcLen, const char* key, int keyLen);
404     bool addPidBySort(int32_t pid);
405     int GetProcStatusId(const char* src, int srcLen);
406 
ParseMemInfo(const char* data, T& processMemoryInfo)407     template <typename T> bool ParseMemInfo(const char* data, T& processMemoryInfo)
408     {
409         bool ready = false;
410         bool done = false;
411         std::istringstream ss(data);
412         std::string line;
413 
414         auto memsummary = processMemoryInfo.mutable_memsummary();
415         while (std::getline(ss, line)) {
416             std::string s(line);
417             if (s.find("App Summary") != s.npos) {
418                 ready = true;
419                 continue;
420             }
421 
422             if (ready) {
423                 if (s.find("Java Heap:") != s.npos) {
424                     memsummary->set_java_heap(ParseNumber(s));
425                     continue;
426                 }
427                 if (s.find("Native Heap:") != s.npos) {
428                     memsummary->set_native_heap(ParseNumber(s));
429                     continue;
430                 }
431                 if (s.find("Code:") != s.npos) {
432                     memsummary->set_code(ParseNumber(s));
433                     continue;
434                 }
435                 if (s.find("Stack:") != s.npos) {
436                     memsummary->set_stack(ParseNumber(s));
437                     continue;
438                 }
439                 if (s.find("Graphics:") != s.npos) {
440                     memsummary->set_graphics(ParseNumber(s));
441                     continue;
442                 }
443                 if (s.find("Private Other:") != s.npos) {
444                     memsummary->set_private_other(ParseNumber(s));
445                     continue;
446                 }
447                 if (s.find("System:") != s.npos) {
448                     memsummary->set_system(ParseNumber(s));
449                     done = true;
450                     break;
451                 }
452             }
453         }
454         return done;
455     }
456     int InitMemVmemFd();
457 
458     template <typename T, typename S> void WriteMemoryData(T& memoryDataProto, S smapsInfo);
459 
460     std::string RunCommand(const std::string& cmd);
461     int GetIndentNum(const std::string& line);
462     uint64_t SizeToBytes(const std::string& sizeStr, const std::string& type);
463     bool isRenderService(int pid);
464     bool GetRenderServiceGlSize(int32_t pid, GraphicsMemory& graphicsMemory);
465 
466     bool GetGraphicsMemory(int32_t pid, GraphicsMemory &graphicsMemory, OHOS::HiviewDFX::GraphicType graphicType);
467 
468     template <typename T> void WriteAshmemInfo(T& dataProto);
469     template <typename T> void WriteDmaInfo(T& dataProto);
470     template <typename T> void WriteGpuMemInfo(T& dataProto);
471     template <typename T> void WriteGpuDumpInfo(T& dataProto);
472     template <typename T> void WriteDumpProcessInfo(T& dataProto);
473     template <typename T> void WriteManagerServiceInfo(T& dataProto);
474     template <typename T> void WriteProfileMemInfo(T& dataProto);
475 
476     template <typename T> void SetAshmemInfo(T& ashmemInfo, int key, const char* word);
477     template <typename T> void SetDmaInfo(T& dmaInfo, int key, const char* word);
478     template <typename T> void SetGpuProcessInfo(T& gpuProcessInfo, int key, const char* word);
479     template <typename T> bool SetGpuDumpInfo(T& gpuDumpInfo, BufferSplitter& totalBuffer);
480     template <typename T> void SetRSImageDumpInfo(T& rsDumpInfo, int key, const char* word);
481     template <typename T> void SetManagerServiceInfo(T& windowInfo, int key, const char* word);
482 };
483 
484 #endif
485