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