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 
16 #include "trace_data_cache_writer.h"
17 namespace SysTuning {
18 namespace TraceStreamer {
19 using namespace TraceStdtype;
~TraceDataCacheWriter()20 TraceDataCacheWriter::~TraceDataCacheWriter() {}
GetProcessInternalPid(uint32_t pid)21 InternalPid TraceDataCacheWriter::GetProcessInternalPid(uint32_t pid)
22 {
23     internalProcessesData_.emplace_back(pid);
24     return static_cast<InternalPid>(internalProcessesData_.size() - 1);
25 }
GetProcessData(InternalPid internalPid)26 Process *TraceDataCacheWriter::GetProcessData(InternalPid internalPid)
27 {
28     TS_ASSERT(internalPid < internalProcessesData_.size());
29     return &internalProcessesData_[internalPid];
30 }
31 
32 uint32_t TraceDataCacheWriter::AppendNewProcessData(uint32_t pid, const std::string &name, uint64_t startTs)
33 {
34     internalProcessesData_.emplace_back(pid);
35     auto &process = internalProcessesData_.back();
36     process.cmdLine_ = name;
37     process.startT_ = startTs;
38     return internalProcessesData_.size() - 1;
39 }
40 
41 InternalTid TraceDataCacheWriter::NewInternalThread(uint32_t tid)
42 {
43     internalThreadsData_.emplace_back(tid);
44     return static_cast<InternalTid>(internalThreadsData_.size() - 1);
45 }
46 Thread *TraceDataCacheWriter::GetThreadData(InternalTid internalTid)
47 {
48     if (internalTid >= internalThreadsData_.size()) {
49         return nullptr;
50     }
51     return &internalThreadsData_[internalTid];
52 }
53 
UpdateTraceTime(uint64_t timeStamp)54 void TraceDataCacheWriter::UpdateTraceTime(uint64_t timeStamp)
55 {
56     if (isSplitFile_) {
57         return;
58     }
59     if (timeStamp) {
60         traceStartTime_ = std::min(traceStartTime_, timeStamp);
61         traceEndTime_ = std::max(traceEndTime_, timeStamp);
62     }
63 }
64 
UpdateTraceMinTime(uint64_t timestampMin)65 void TraceDataCacheWriter::UpdateTraceMinTime(uint64_t timestampMin)
66 {
67     if (isSplitFile_) {
68         return;
69     }
70     if (timestampMin) {
71         traceStartTime_ = timestampMin;
72     }
73 }
74 
MixTraceTime(uint64_t timestampMin, uint64_t timestampMax)75 void TraceDataCacheWriter::MixTraceTime(uint64_t timestampMin, uint64_t timestampMax)
76 {
77     if (isSplitFile_) {
78         return;
79     }
80     if (timestampMin == timestampMax) {
81         ++timestampMax;
82         --timestampMin;
83     }
84     if (timestampMin == std::numeric_limits<uint64_t>::max() || timestampMax == 0) {
85         return;
86     }
87     if (traceStartTime_ != std::numeric_limits<uint64_t>::max()) {
88         traceStartTime_ = std::min(traceStartTime_, timestampMin);
89     } else {
90         traceStartTime_ = timestampMin;
91     }
92     if (traceEndTime_) {
93         traceEndTime_ = std::max(traceEndTime_, timestampMax);
94     } else {
95         traceEndTime_ = timestampMax;
96     }
97 }
GetInternalSlicesData()98 CallStack *TraceDataCacheWriter::GetInternalSlicesData()
99 {
100     return &callstackData_;
101 }
GetIrqData()102 CallStack *TraceDataCacheWriter::GetIrqData()
103 {
104     return &irqData_;
105 }
106 
GetFilterData()107 Filter *TraceDataCacheWriter::GetFilterData()
108 {
109     return &filterData_;
110 }
111 
GetRawData()112 Raw *TraceDataCacheWriter::GetRawData()
113 {
114     return &rawData_;
115 }
116 
GetMeasureData()117 Measure *TraceDataCacheWriter::GetMeasureData()
118 {
119     return &measureData_;
120 }
121 
GetSysMemMeasureData()122 Measure *TraceDataCacheWriter::GetSysMemMeasureData()
123 {
124     return &sysMemMeasureData_;
125 }
GetProcessMeasureData()126 Measure *TraceDataCacheWriter::GetProcessMeasureData()
127 {
128     return &processMeasureData_;
129 }
GetXpowerMeasureData()130 Measure *TraceDataCacheWriter::GetXpowerMeasureData()
131 {
132     return &xpowerMeasureData_;
133 }
GetThreadStateData()134 ThreadStateData *TraceDataCacheWriter::GetThreadStateData()
135 {
136     return &threadStateData_;
137 }
138 
GetSchedSliceData()139 SchedSlice *TraceDataCacheWriter::GetSchedSliceData()
140 {
141     return &schedSliceData_;
142 }
143 
GetCpuMeasuresData()144 CpuMeasureFilter *TraceDataCacheWriter::GetCpuMeasuresData()
145 {
146     return &cpuMeasureData_;
147 }
148 
GetInstantsData()149 Instants *TraceDataCacheWriter::GetInstantsData()
150 {
151     return &instantsData_;
152 }
153 
GetProcessMeasureFilterData()154 ProcessMeasureFilter *TraceDataCacheWriter::GetProcessMeasureFilterData()
155 {
156     return &processMeasureFilterData_;
157 }
158 
GetClockEventFilterData()159 ClockEventData *TraceDataCacheWriter::GetClockEventFilterData()
160 {
161     return &clockEventFilterData_;
162 }
163 
GetClkEventFilterData()164 ClkEventData *TraceDataCacheWriter::GetClkEventFilterData()
165 {
166     return &clkEventFilterData_;
167 }
GetStatAndInfo()168 StatAndInfo *TraceDataCacheWriter::GetStatAndInfo()
169 {
170     return &stat_;
171 }
172 
GetMetaData()173 MetaData *TraceDataCacheWriter::GetMetaData()
174 {
175     return &metaData_;
176 }
177 
GetSymbolsData()178 SymbolsData *TraceDataCacheWriter::GetSymbolsData()
179 {
180     return &symbolsData_;
181 }
GetSysCallData()182 SysCall *TraceDataCacheWriter::GetSysCallData()
183 {
184     return &sysCallData_;
185 }
GetHilogData()186 LogInfo *TraceDataCacheWriter::GetHilogData()
187 {
188     return &hilogData_;
189 }
190 
GetNativeHookData()191 NativeHook *TraceDataCacheWriter::GetNativeHookData()
192 {
193     return &nativeHookData_;
194 }
195 
GetNativeHookFrameData()196 NativeHookFrame *TraceDataCacheWriter::GetNativeHookFrameData()
197 {
198     return &nativeHookFrameData_;
199 }
200 
GetNativeHookStatisticsData()201 NativeHookStatistic *TraceDataCacheWriter::GetNativeHookStatisticsData()
202 {
203     return &nativeHookStatisticData_;
204 }
GetHidumpData()205 Hidump *TraceDataCacheWriter::GetHidumpData()
206 {
207     return &hidumpData_;
208 }
GetPerfCallChainData()209 PerfCallChain *TraceDataCacheWriter::GetPerfCallChainData()
210 {
211     return &perfCallChain_;
212 }
GetPerfFilesData()213 PerfFiles *TraceDataCacheWriter::GetPerfFilesData()
214 {
215     return &perfFiles_;
216 }
GetPerfSampleData()217 PerfSample *TraceDataCacheWriter::GetPerfSampleData()
218 {
219     return &perfSample_;
220 }
GetPerfThreadData()221 PerfThread *TraceDataCacheWriter::GetPerfThreadData()
222 {
223     return &perfThread_;
224 }
GetPerfReportData()225 PerfReport *TraceDataCacheWriter::GetPerfReportData()
226 {
227     return &perfReport_;
228 }
GetPerfNapiAsyncData()229 PerfNapiAsync *TraceDataCacheWriter::GetPerfNapiAsyncData()
230 {
231     return &perfNapiAsync_;
232 }
GetArgSetData()233 ArgSet *TraceDataCacheWriter::GetArgSetData()
234 {
235     return &argSet_;
236 }
237 
GetDataTypeData()238 DataType *TraceDataCacheWriter::GetDataTypeData()
239 {
240     return &dataType_;
241 }
242 
GetSysMeasureFilterData()243 SysMeasureFilter *TraceDataCacheWriter::GetSysMeasureFilterData()
244 {
245     return &sysEvent_;
246 }
GetNetworkData()247 NetDetailData *TraceDataCacheWriter::GetNetworkData()
248 {
249     return &networkData_;
250 }
GetDiskIOData()251 DiskIOData *TraceDataCacheWriter::GetDiskIOData()
252 {
253     return &diskIOData_;
254 }
255 
GetCpuUsageInfoData()256 CpuUsageDetailData *TraceDataCacheWriter::GetCpuUsageInfoData()
257 {
258     return &cpuUsageData_;
259 }
GetLiveProcessData()260 LiveProcessDetailData *TraceDataCacheWriter::GetLiveProcessData()
261 {
262     return &liveProcessDetailData_;
263 }
GetFileSystemSample()264 FileSystemSample *TraceDataCacheWriter::GetFileSystemSample()
265 {
266     return &fileSamplingTableData_;
267 }
GetEbpfCallStack()268 EbpfCallStackData *TraceDataCacheWriter::GetEbpfCallStack()
269 {
270     return &ebpfCallStackData_;
271 }
GetPagedMemorySampleData()272 PagedMemorySampleData *TraceDataCacheWriter::GetPagedMemorySampleData()
273 {
274     return &pagedMemorySampleData_;
275 }
GetHiSysEventSubkeysData()276 HiSysEventSubkeys *TraceDataCacheWriter::GetHiSysEventSubkeysData()
277 {
278     return &sysEventNameIds_;
279 }
GetHiSysEventMeasureData()280 HiSysEventMeasureData *TraceDataCacheWriter::GetHiSysEventMeasureData()
281 {
282     return &sysEventMeasureData_;
283 }
GetHiSysEventDeviceStateData()284 HiSysEventDeviceStateData *TraceDataCacheWriter::GetHiSysEventDeviceStateData()
285 {
286     return &deviceStateData_;
287 }
GetTraceConfigData()288 TraceConfig *TraceDataCacheWriter::GetTraceConfigData()
289 {
290     return &traceConfigData_;
291 }
GetHiSysEventAllEventData()292 HiSysEventAllEventData *TraceDataCacheWriter::GetHiSysEventAllEventData()
293 {
294     return &hiSysEventAllEventData_;
295 }
GetSmapsData()296 SmapsData *TraceDataCacheWriter::GetSmapsData()
297 {
298     return &smapsData_;
299 }
GetBioLatencySampleData()300 BioLatencySampleData *TraceDataCacheWriter::GetBioLatencySampleData()
301 {
302     return &bioLatencySampleData_;
303 }
304 
GetClockSnapshotData()305 ClockSnapshotData *TraceDataCacheWriter::GetClockSnapshotData()
306 {
307     return &clockSnapshotData_;
308 }
GetDataSourceClockIdData()309 DataSourceClockIdData *TraceDataCacheWriter::GetDataSourceClockIdData()
310 {
311     return &dataSourceClockIdData_;
312 }
GetFrameSliceData()313 FrameSlice *TraceDataCacheWriter::GetFrameSliceData()
314 {
315     return &frameSliceData_;
316 }
GetFrameMapsData()317 FrameMaps *TraceDataCacheWriter::GetFrameMapsData()
318 {
319     return &frameMapsData_;
320 }
321 
GetGPUSliceData()322 GPUSlice *TraceDataCacheWriter::GetGPUSliceData()
323 {
324     return &gpuSliceData_;
325 }
GetDmaFenceData()326 DmaFence *TraceDataCacheWriter::GetDmaFenceData()
327 {
328     return &dmaFenceData_;
329 }
GetTaskPoolData()330 TaskPoolInfo *TraceDataCacheWriter::GetTaskPoolData()
331 {
332     return &taskPoolInfo_;
333 }
GetJsHeapFilesData()334 JsHeapFiles *TraceDataCacheWriter::GetJsHeapFilesData()
335 {
336     return &jsHeapFilesData_;
337 }
GetJsHeapEdgesData()338 JsHeapEdges *TraceDataCacheWriter::GetJsHeapEdgesData()
339 {
340     return &jsHeapEdgesData_;
341 }
GetJsHeapInfoData()342 JsHeapInfo *TraceDataCacheWriter::GetJsHeapInfoData()
343 {
344     return &jsHeapInfoData_;
345 }
GetJsHeapLocationData()346 JsHeapLocation *TraceDataCacheWriter::GetJsHeapLocationData()
347 {
348     return &jsHeapLocationData_;
349 }
GetJsHeapNodesData()350 JsHeapNodes *TraceDataCacheWriter::GetJsHeapNodesData()
351 {
352     return &jsHeapNodesData_;
353 }
GetJsHeapSampleData()354 JsHeapSample *TraceDataCacheWriter::GetJsHeapSampleData()
355 {
356     return &jsHeapSampleData_;
357 }
GetJsHeapStringData()358 JsHeapString *TraceDataCacheWriter::GetJsHeapStringData()
359 {
360     return &jsHeapStringData_;
361 }
GetJsHeapTraceFuncInfoData()362 JsHeapTraceFuncInfo *TraceDataCacheWriter::GetJsHeapTraceFuncInfoData()
363 {
364     return &jsHeapTraceFuncInfoData_;
365 }
GetJsHeapTraceNodeData()366 JsHeapTraceNode *TraceDataCacheWriter::GetJsHeapTraceNodeData()
367 {
368     return &jsHeapTraceNodeData_;
369 }
GetJsCpuProfilerNodeData()370 JsCpuProfilerNode *TraceDataCacheWriter::GetJsCpuProfilerNodeData()
371 {
372     return &jsCpuProfilerNodeData_;
373 }
GetJsCpuProfilerSampleData()374 JsCpuProfilerSample *TraceDataCacheWriter::GetJsCpuProfilerSampleData()
375 {
376     return &jsCpuProfilerSampleData_;
377 }
GetJsConfigData()378 JsConfig *TraceDataCacheWriter::GetJsConfigData()
379 {
380     return &jsConfigData_;
381 }
GetAppStartupData()382 AppStartup *TraceDataCacheWriter::GetAppStartupData()
383 {
384     return &appStartupData_;
385 }
GetSoStaticInitalizationData()386 SoStaticInitalization *TraceDataCacheWriter::GetSoStaticInitalizationData()
387 {
388     return &soStaticInitalizationData_;
389 }
GetAnimation()390 Animation *TraceDataCacheWriter::GetAnimation()
391 {
392     return &animation_;
393 }
GetDeviceInfo()394 DeviceInfo *TraceDataCacheWriter::GetDeviceInfo()
395 {
396     return &deviceInfo_;
397 }
GetDynamicFrame()398 DynamicFrame *TraceDataCacheWriter::GetDynamicFrame()
399 {
400     return &dynamicFrame_;
401 }
GetAshMemData()402 AshMemData *TraceDataCacheWriter::GetAshMemData()
403 {
404     return &ashMemData_;
405 }
GetDmaMemData()406 DmaMemData *TraceDataCacheWriter::GetDmaMemData()
407 {
408     return &dmaMemData_;
409 }
GetGpuProcessMemData()410 GpuProcessMemData *TraceDataCacheWriter::GetGpuProcessMemData()
411 {
412     return &gpuProcessMemData_;
413 }
GetGpuWindowMemData()414 GpuWindowMemData *TraceDataCacheWriter::GetGpuWindowMemData()
415 {
416     return &gpuWindowMemData_;
417 }
GetCpuDumpInfo()418 CpuDumpInfo *TraceDataCacheWriter::GetCpuDumpInfo()
419 {
420     return &cpuDumpInfo_;
421 }
GetProfileMemInfo()422 ProfileMemInfo *TraceDataCacheWriter::GetProfileMemInfo()
423 {
424     return &profileMemInfo_;
425 }
GetRSImageDumpInfo()426 RSImageDumpInfo *TraceDataCacheWriter::GetRSImageDumpInfo()
427 {
428     return &rsImageDumpInfo_;
429 }
ClearMeasure()430 void TraceDataCacheWriter::ClearMeasure()
431 {
432     filterData_.Clear();
433     measureData_.Clear();
434     cpuMeasureData_.Clear();
435     clockEventFilterData_.Clear();
436     clkEventFilterData_.Clear();
437     processMeasureFilterData_.Clear();
438 }
ClearHiperf()439 void TraceDataCacheWriter::ClearHiperf()
440 {
441     perfSample_.Clear();
442     perfCallChain_.Clear();
443     perfThread_.Clear();
444     perfFiles_.Clear();
445     perfReport_.Clear();
446 }
ClearArkTs()447 void TraceDataCacheWriter::ClearArkTs()
448 {
449     jsHeapFilesData_.Clear();
450     jsHeapEdgesData_.Clear();
451     jsHeapInfoData_.Clear();
452     jsHeapLocationData_.Clear();
453     jsHeapNodesData_.Clear();
454     jsHeapSampleData_.Clear();
455     jsHeapStringData_.Clear();
456     jsHeapTraceFuncInfoData_.Clear();
457     jsHeapTraceNodeData_.Clear();
458     jsCpuProfilerNodeData_.Clear();
459     jsCpuProfilerSampleData_.Clear();
460     jsConfigData_.Clear();
461 }
ClearNativeMemory()462 void TraceDataCacheWriter::ClearNativeMemory()
463 {
464     nativeHookData_.Clear();
465     nativeHookFrameData_.Clear();
466 }
ClearBase()467 void TraceDataCacheWriter::ClearBase()
468 {
469     internalProcessesData_.clear();
470     internalThreadsData_.clear();
471     metaData_.Clear();
472     symbolsData_.Clear();
473     argSet_.Clear();
474     dataType_.Clear();
475     dataDict_.Clear();
476 }
ClearEbpf()477 void TraceDataCacheWriter::ClearEbpf()
478 {
479     fileSamplingTableData_.Clear();
480     ebpfCallStackData_.Clear();
481     pagedMemorySampleData_.Clear();
482     bioLatencySampleData_.Clear();
483 }
ClearTemplate()484 void TraceDataCacheWriter::ClearTemplate()
485 {
486     // task pool business
487     taskPoolInfo_.Clear();
488     // app start up business
489     appStartupData_.Clear();
490     soStaticInitalizationData_.Clear();
491     // animation business
492     animation_.Clear();
493     deviceInfo_.Clear();
494     dynamicFrame_.Clear();
495 }
Clear()496 void TraceDataCacheWriter::Clear()
497 {
498     ClearBase();
499     ClearMeasure();
500     ClearHiperf();
501     ClearArkTs();
502     ClearNativeMemory();
503     ClearEbpf();
504     ClearTemplate();
505     rawData_.Clear();
506     threadStateData_.Clear();
507     instantsData_.Clear();
508     schedSliceData_.Clear();
509     callstackData_.Clear();
510     irqData_.Clear();
511     hilogData_.Clear();
512     hidumpData_.Clear();
513     sysCallData_.Clear();
514     sysEvent_.Clear();
515     networkData_.Clear();
516     networkDetailData_.Clear();
517     cpuUsageData_.Clear();
518     diskIOData_.Clear();
519     liveProcessDetailData_.Clear();
520     sysEventNameIds_.Clear();
521     sysEventMeasureData_.Clear();
522     deviceStateData_.Clear();
523     smapsData_.Clear();
524     ashMemData_.Clear();
525     dmaMemData_.Clear();
526     gpuProcessMemData_.Clear();
527     gpuWindowMemData_.Clear();
528     gpuSliceData_.Clear();
529     dmaFenceData_.Clear();
530     frameMapsData_.Clear();
531     frameSliceData_.Clear();
532 }
533 } // namespace TraceStreamer
534 } // namespace SysTuning
535