• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
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 TRACE_STDTYPE_H
17 #define TRACE_STDTYPE_H
18 
19 #include <array>
20 #include <deque>
21 #include <limits>
22 #include <map>
23 #include <mutex>
24 #include <optional>
25 #include <sstream>
26 #include <stdexcept>
27 #include <string>
28 #include <unordered_map>
29 #include <vector>
30 
31 #include "cfg/trace_streamer_config.h"
32 #include "double_map.h"
33 #include "log.h"
34 #include "ts_common.h"
35 
36 namespace SysTuning {
37 namespace TraceStdtype {
38 using namespace SysTuning::TraceCfg;
39 using namespace SysTuning::TraceStreamer;
40 class CacheBase {
41 public:
Size()42     size_t Size() const
43     {
44         return std::max(timeStamps_.size(), ids_.size());
45     }
IdsData()46     const std::deque<uint64_t>& IdsData() const
47     {
48         return ids_;
49     }
TimeStampData()50     const std::deque<uint64_t>& TimeStampData() const
51     {
52         return timeStamps_;
53     }
InternalTidsData()54     const std::deque<InternalTid>& InternalTidsData() const
55     {
56         return internalTids_;
57     }
Clear()58     virtual void Clear()
59     {
60         internalTids_.clear();
61         timeStamps_.clear();
62         ids_.clear();
63     }
64 
65 public:
66     std::deque<InternalTid> internalTids_ = {};
67     std::deque<uint64_t> timeStamps_ = {};
68     std::deque<uint64_t> ids_ = {};
69 };
70 
71 class CpuCacheBase {
72 public:
DursData()73     const std::deque<uint64_t>& DursData() const
74     {
75         return durs_;
76     }
77 
CpusData()78     const std::deque<uint32_t>& CpusData() const
79     {
80         return cpus_;
81     }
Clear()82     virtual void Clear()
83     {
84         durs_.clear();
85         cpus_.clear();
86     }
87     void SetDur(uint64_t index, uint64_t dur);
88 
89 public:
90     std::deque<uint64_t> durs_;
91     std::deque<uint32_t> cpus_;
92 };
93 class Thread {
94 public:
Thread(uint32_t t)95     explicit Thread(uint32_t t) : tid_(t) {}
96     InternalPid internalPid_ = INVALID_UINT32;
97     uint32_t tid_ = 0;
98     DataIndex nameIndex_ = 0;
99     InternalTime startT_ = 0;
100     InternalTime endT_ = 0;
101     uint32_t switchCount_ = 0;
102     uint32_t sliceSize_ = 0;
103     uint32_t cpuStatesCount_ = 0;
104 };
105 
106 class Process {
107 public:
Process(uint32_t p)108     explicit Process(uint32_t p) : pid_(p) {}
109     std::string cmdLine_ = "";
110     InternalTime startT_ = 0;
111     uint32_t pid_ = 0;
112     uint32_t memSize_ = 0;
113     uint32_t threadSize_ = 0;
114     uint32_t sliceSize_ = 0;
115     uint32_t switchCount_ = 0;
116     int32_t threadCount_ = -1;
117     uint32_t cpuStatesCount_ = 0;
118 };
119 
120 class ThreadStateData {
121 public:
122     TableRowId
123         AppendThreadState(InternalTime ts, InternalTime dur, InternalCpu cpu, InternalTid itid, TableRowId idState);
124     void SetDuration(TableRowId index, InternalTime dur);
125     TableRowId UpdateDuration(TableRowId index, InternalTime ts);
126     bool End(TableRowId index, InternalTime ts);
127     void UpdateState(TableRowId index, TableRowId idState);
128     void SetArgSetId(TableRowId index, uint32_t setId);
129     void UpdateDuration(TableRowId index, InternalTime ts, TableRowId idState);
130     void UpdateTidAndPid(TableRowId index, InternalTid tid, InternalTid pid);
131     TableRowId UpdateDuration(TableRowId index, InternalTime ts, InternalCpu cpu, TableRowId idState);
Clear()132     void Clear()
133     {
134         timeStamps_.clear();
135         durations_.clear();
136         itids_.clear();
137         tids_.clear();
138         pids_.clear();
139         states_.clear();
140         cpus_.clear();
141     }
Size()142     const uint32_t Size() const
143     {
144         return itids_.size();
145     }
146 
TimeStamsData()147     const std::deque<InternalTime>& TimeStamsData() const
148     {
149         return timeStamps_;
150     }
DursData()151     const std::deque<InternalTime>& DursData() const
152     {
153         return durations_;
154     }
ItidsData()155     const std::deque<InternalTid>& ItidsData() const
156     {
157         return itids_;
158     }
TidsData()159     const std::deque<InternalTid>& TidsData() const
160     {
161         return tids_;
162     }
PidsData()163     const std::deque<InternalPid>& PidsData() const
164     {
165         return pids_;
166     }
StatesData()167     const std::deque<DataIndex>& StatesData() const
168     {
169         return states_;
170     }
CpusData()171     const std::deque<InternalCpu>& CpusData() const
172     {
173         return cpus_;
174     }
ArgSetsData()175     const std::deque<uint32_t>& ArgSetsData() const
176     {
177         return argSetIds_;
178     }
179 
180 private:
181     std::deque<InternalTime> timeStamps_;
182     std::deque<InternalTime> durations_;
183     std::deque<InternalTid> itids_;
184     std::deque<InternalTid> tids_;
185     std::deque<InternalPid> pids_;
186     std::deque<DataIndex> states_;
187     std::deque<InternalCpu> cpus_;
188     std::deque<uint32_t> argSetIds_;
189 };
190 
191 class SchedSlice : public CacheBase, public CpuCacheBase {
192 public:
193     size_t AppendSchedSlice(uint64_t ts,
194                             uint64_t dur,
195                             uint64_t cpu,
196                             uint32_t internalTid,
197                             uint64_t endState,
198                             uint64_t priority);
199     void SetDuration(size_t index, uint64_t duration);
200     void Update(uint64_t index, uint64_t ts, uint64_t state);
201     void UpdateArg(uint64_t index, uint32_t argsetId);
202 
EndStatesData()203     const std::deque<uint64_t>& EndStatesData() const
204     {
205         return endStates_;
206     }
207 
PriorityData()208     const std::deque<uint64_t>& PriorityData() const
209     {
210         return priority_;
211     }
212 
ArgSetData()213     const std::deque<uint32_t>& ArgSetData() const
214     {
215         return argSets_;
216     }
TsEndData()217     const std::deque<uint64_t>& TsEndData() const
218     {
219         return tsEnds_;
220     }
InternalPidsData()221     const std::deque<InternalPid>& InternalPidsData() const
222     {
223         return internalPids_;
224     }
AppendInternalPid(InternalPid ipid)225     void AppendInternalPid(InternalPid ipid)
226     {
227         internalPids_.emplace_back(ipid);
228     }
Clear()229     void Clear() override
230     {
231         CacheBase::Clear();
232         CpuCacheBase::Clear();
233         endStates_.clear();
234         priority_.clear();
235         internalPids_.clear();
236         tsEnds_.clear();
237     }
238 
239 private:
240     std::deque<InternalPid> internalPids_ = {};
241     std::deque<uint64_t> tsEnds_ = {};
242     std::deque<uint64_t> endStates_ = {};
243     std::deque<uint64_t> priority_ = {};
244     std::deque<uint32_t> argSets_ = {};
245 };
246 
247 class CallStack : public CacheBase, public CpuCacheBase {
248 public:
249     size_t AppendInternalAsyncSlice(uint64_t startT,
250                                     uint64_t durationNs,
251                                     InternalTid internalTid,
252                                     DataIndex cat,
253                                     uint16_t nameIdentify,
254                                     DataIndex name,
255                                     uint8_t depth,
256                                     uint64_t cookid,
257                                     const std::optional<uint64_t>& parentId);
258     size_t AppendInternalSlice(uint64_t startT,
259                                uint64_t durationNs,
260                                InternalTid internalTid,
261                                DataIndex cat,
262                                uint16_t nameIdentify,
263                                DataIndex name,
264                                uint8_t depth,
265                                const std::optional<uint64_t>& parentId);
266     void SetDistributeInfo(size_t index,
267                            const std::string& chainId,
268                            const std::string& spanId,
269                            const std::string& parentSpanId,
270                            const std::string& flag,
271                            const std::string& args);
272     void AppendDistributeInfo(const std::string& chainId,
273                               const std::string& spanId,
274                               const std::string& parentSpanId,
275                               const std::string& flag,
276                               const std::string& args);
277     void AppendDistributeInfo();
278     void SetDuration(size_t index, uint64_t timeStamp);
279     void SetDurationWithFlag(size_t index, uint64_t timeStamp);
280     void SetFlag(size_t index, uint8_t flag);
281     void SetDurationEx(size_t index, uint32_t dur);
282     void SetIrqDurAndArg(size_t index, uint64_t timeStamp, uint32_t argSetId);
283     void SetTimeStamp(size_t index, uint64_t timeStamp);
284     void SetDepth(size_t index, uint8_t depth);
285     void SetArgSetId(size_t index, uint32_t argSetId);
Clear()286     void Clear() override
287     {
288         CacheBase::Clear();
289         CpuCacheBase::Clear();
290         cats_.clear();
291         cookies_.clear();
292         callIds_.clear();
293         names_.clear();
294         depths_.clear();
295         chainIds_.clear();
296         spanIds_.clear();
297         parentSpanIds_.clear();
298         flags_.clear();
299         args_.clear();
300         argSet_.clear();
301     }
302 
303     const std::deque<std::optional<uint64_t>>& ParentIdData() const;
304     const std::deque<DataIndex>& CatsData() const;
305     const std::deque<DataIndex>& NamesData() const;
306     const std::deque<uint8_t>& Depths() const;
307     const std::deque<uint64_t>& Cookies() const;
308     const std::deque<uint32_t>& CallIds() const;
309     const std::deque<uint16_t>& IdentifysData() const;
310     const std::deque<std::string>& ChainIds() const;
311     const std::deque<std::string>& SpanIds() const;
312     const std::deque<std::string>& ParentSpanIds() const;
313     const std::deque<std::string>& Flags() const;
314     const std::deque<std::string>& ArgsData() const;
315     const std::deque<uint32_t>& ArgSetIdsData() const;
316 
317 private:
318     void AppendCommonInfo(uint64_t startT, uint64_t durationNs, InternalTid internalTid);
319     void AppendCallStack(DataIndex cat, DataIndex name, uint8_t depth, std::optional<uint64_t> parentId);
320 
321 private:
322     std::deque<std::optional<uint64_t>> parentIds_;
323     std::deque<DataIndex> cats_ = {};
324     std::deque<uint64_t> cookies_ = {};
325     std::deque<uint32_t> callIds_ = {};
326     std::deque<uint16_t> identifys_ = {};
327     std::deque<DataIndex> names_ = {};
328     std::deque<uint8_t> depths_ = {};
329 
330     std::deque<std::string> chainIds_ = {};
331     std::deque<std::string> spanIds_ = {};
332     std::deque<std::string> parentSpanIds_ = {};
333     std::deque<std::string> flags_ = {};
334     std::deque<std::string> args_ = {};
335     std::deque<uint32_t> argSet_ = {};
336 };
337 
338 class Filter : public CacheBase {
339 public:
340     size_t AppendNewFilterData(std::string type, std::string name, uint64_t sourceArgSetId);
NameData()341     const std::deque<std::string>& NameData() const
342     {
343         return nameDeque_;
344     }
TypeData()345     const std::deque<std::string>& TypeData() const
346     {
347         return typeDeque_;
348     }
SourceArgSetIdData()349     const std::deque<uint64_t>& SourceArgSetIdData() const
350     {
351         return sourceArgSetId_;
352     }
Clear()353     void Clear() override
354     {
355         CacheBase::Clear();
356         nameDeque_.clear();
357         typeDeque_.clear();
358         sourceArgSetId_.clear();
359     }
360 
361 private:
362     std::deque<std::string> nameDeque_ = {};
363     std::deque<std::string> typeDeque_ = {};
364     std::deque<uint64_t> sourceArgSetId_ = {};
365 };
366 
367 class Measure : public CacheBase {
368 public:
369     size_t AppendMeasureData(uint32_t type, uint64_t timeStamp, int64_t value, uint32_t filterId);
TypeData()370     const std::deque<uint32_t>& TypeData() const
371     {
372         return typeDeque_;
373     }
ValuesData()374     const std::deque<int64_t>& ValuesData() const
375     {
376         return valuesDeque_;
377     }
DursData()378     const std::deque<uint64_t>& DursData() const
379     {
380         return durDeque_;
381     }
382     void SetDur(uint32_t row, uint64_t timeStamp);
FilterIdData()383     const std::deque<uint32_t>& FilterIdData() const
384     {
385         return filterIdDeque_;
386     }
Clear()387     void Clear() override
388     {
389         CacheBase::Clear();
390         typeDeque_.clear();
391         durDeque_.clear();
392         valuesDeque_.clear();
393         filterIdDeque_.clear();
394     }
395 
396 private:
397     std::deque<uint32_t> typeDeque_ = {};
398     std::deque<uint64_t> durDeque_ = {};
399     std::deque<int64_t> valuesDeque_ = {};
400     std::deque<uint32_t> filterIdDeque_ = {};
401 };
402 
403 class Raw : public CacheBase {
404 public:
405     size_t AppendRawData(uint32_t id, uint64_t timeStamp, uint32_t name, uint32_t cpu, uint32_t internalTid);
NameData()406     const std::deque<uint32_t>& NameData() const
407     {
408         return nameDeque_;
409     }
CpuData()410     const std::deque<uint32_t>& CpuData() const
411     {
412         return cpuDeque_;
413     }
InternalTidData()414     const std::deque<uint32_t>& InternalTidData() const
415     {
416         return itidDeque_;
417     }
Clear()418     void Clear() override
419     {
420         CacheBase::Clear();
421         nameDeque_.clear();
422         cpuDeque_.clear();
423         itidDeque_.clear();
424     }
425 
426 private:
427     std::deque<uint32_t> nameDeque_ = {};
428     std::deque<uint32_t> cpuDeque_ = {};
429     std::deque<uint32_t> itidDeque_ = {};
430 };
431 
432 class ThreadMeasureFilter {
433 public:
434     size_t AppendNewFilter(uint64_t filterId, uint32_t nameIndex, uint64_t internalTid);
Size()435     size_t Size() const
436     {
437         return filterId_.size();
438     }
FilterIdData()439     const std::deque<uint64_t>& FilterIdData() const
440     {
441         return filterId_;
442     }
InternalTidData()443     const std::deque<uint64_t>& InternalTidData() const
444     {
445         return internalTids_;
446     }
NameIndexData()447     const std::deque<uint32_t>& NameIndexData() const
448     {
449         return nameIndex_;
450     }
Clear()451     void Clear()
452     {
453         filterId_.clear();
454         internalTids_.clear();
455         nameIndex_.clear();
456     }
457 
458 private:
459     std::deque<uint64_t> filterId_ = {};
460     std::deque<uint64_t> internalTids_ = {};
461     std::deque<uint32_t> nameIndex_ = {};
462 };
463 
464 class CpuMeasureFilter : public CacheBase {
465 public:
AppendNewFilter(uint64_t filterId,DataIndex name,uint32_t cpu)466     inline size_t AppendNewFilter(uint64_t filterId, DataIndex name, uint32_t cpu)
467     {
468         ids_.emplace_back(filterId);
469         cpu_.emplace_back(cpu);
470         name_.emplace_back(name);
471         return Size() - 1;
472     }
473 
CpuData()474     const std::deque<uint32_t>& CpuData() const
475     {
476         return cpu_;
477     }
478 
TypeData()479     const std::deque<DataIndex>& TypeData() const
480     {
481         return type_;
482     }
483 
NameData()484     const std::deque<DataIndex>& NameData() const
485     {
486         return name_;
487     }
Clear()488     void Clear() override
489     {
490         CacheBase::Clear();
491         cpu_.clear();
492         type_.clear();
493         name_.clear();
494     }
495 
496 private:
497     std::deque<uint32_t> cpu_ = {};
498     std::deque<DataIndex> type_ = {};
499     std::deque<DataIndex> name_ = {};
500 };
501 
502 class Instants : public CacheBase {
503 public:
504     size_t AppendInstantEventData(uint64_t timeStamp,
505                                   DataIndex nameIndex,
506                                   int64_t internalTid,
507                                   int64_t wakeupFromInternalPid);
508 
NameIndexsData()509     const std::deque<DataIndex>& NameIndexsData() const
510     {
511         return NameIndexs_;
512     }
WakeupFromPidsData()513     const std::deque<int64_t>& WakeupFromPidsData() const
514     {
515         return wakeupFromInternalPids_;
516     }
Clear()517     void Clear() override
518     {
519         CacheBase::Clear();
520         NameIndexs_.clear();
521         wakeupFromInternalPids_.clear();
522     }
523 
524 private:
525     std::deque<DataIndex> NameIndexs_;
526     std::deque<int64_t> wakeupFromInternalPids_;
527 };
528 
529 class ProcessMeasureFilter : public CacheBase {
530 public:
531     size_t AppendNewFilter(uint64_t id, DataIndex name, uint32_t internalPid);
532 
UpidsData()533     const std::deque<uint32_t>& UpidsData() const
534     {
535         return internalPids_;
536     }
537 
NamesData()538     const std::deque<DataIndex>& NamesData() const
539     {
540         return names_;
541     }
Clear()542     void Clear() override
543     {
544         CacheBase::Clear();
545         internalPids_.clear();
546         names_.clear();
547     }
548 
549 private:
550     std::deque<uint32_t> internalPids_ = {};
551     std::deque<DataIndex> names_ = {};
552 };
553 class ClockEventData : public CacheBase {
554 public:
555     size_t AppendNewFilter(uint64_t id, DataIndex type, DataIndex name, uint64_t cpu);
556 
CpusData()557     const std::deque<uint64_t>& CpusData() const
558     {
559         return cpus_;
560     }
561 
NamesData()562     const std::deque<DataIndex>& NamesData() const
563     {
564         return names_;
565     }
TypesData()566     const std::deque<DataIndex>& TypesData() const
567     {
568         return types_;
569     }
Clear()570     void Clear() override
571     {
572         CacheBase::Clear();
573         cpus_.clear();
574         names_.clear();
575         types_.clear();
576     }
577 
578 private:
579     std::deque<uint64_t> cpus_ = {}; // in clock_set_rate event, it save cpu
580     std::deque<DataIndex> names_ = {};
581     std::deque<DataIndex> types_ = {};
582 };
583 class ClkEventData : public CacheBase {
584 public:
585     size_t AppendNewFilter(uint64_t id, uint64_t rate, DataIndex name, uint64_t cpu);
586 
NamesData()587     const std::deque<DataIndex>& NamesData() const
588     {
589         return names_;
590     }
RatesData()591     const std::deque<uint64_t>& RatesData() const
592     {
593         return rates_;
594     }
CpusData()595     const std::deque<uint64_t>& CpusData() const
596     {
597         return cpus_;
598     }
Clear()599     void Clear() override
600     {
601         CacheBase::Clear();
602         names_.clear();
603         rates_.clear();
604         cpus_.clear();
605     }
606 
607 private:
608     std::deque<DataIndex> names_;
609     std::deque<uint64_t> rates_;
610     std::deque<uint64_t> cpus_;
611 };
612 class SysCall : public CacheBase {
613 public:
614     size_t AppendSysCallData(int64_t sysCallNum, DataIndex type, uint32_t ipid, uint64_t timeStamp, int64_t ret);
SysCallsData()615     const std::deque<int64_t>& SysCallsData() const
616     {
617         return sysCallNums_;
618     }
TypesData()619     const std::deque<DataIndex>& TypesData() const
620     {
621         return types_;
622     }
IpidsData()623     const std::deque<uint32_t>& IpidsData() const
624     {
625         return ipids_;
626     }
RetsData()627     const std::deque<uint64_t>& RetsData() const
628     {
629         return rets_;
630     }
Clear()631     void Clear() override
632     {
633         CacheBase::Clear();
634         sysCallNums_.clear();
635         types_.clear();
636         ipids_.clear();
637         rets_.clear();
638     }
639 
640 private:
641     std::deque<int64_t> sysCallNums_ = {};
642     std::deque<DataIndex> types_ = {};
643     std::deque<uint32_t> ipids_ = {};
644     std::deque<uint64_t> rets_ = {};
645 };
646 class ArgSet : public CacheBase {
647 public:
648     size_t AppendNewArg(DataIndex nameId, BaseDataType dataType, int64_t value, size_t argSet);
649     const std::deque<BaseDataType>& DataTypes() const;
650     const std::deque<int64_t>& ValuesData() const;
651     const std::deque<uint64_t>& ArgsData() const;
652     const std::deque<DataIndex>& NamesData() const;
653 
Clear()654     void Clear() override
655     {
656         CacheBase::Clear();
657         names_.clear();
658         dataTypes_.clear();
659         values_.clear();
660         argset_.clear();
661     }
662 
663 private:
664     std::deque<uint64_t> names_ = {};
665     std::deque<BaseDataType> dataTypes_ = {};
666     std::deque<int64_t> values_ = {};
667     std::deque<uint64_t> argset_ = {};
668 };
669 class SysMeasureFilter : public CacheBase {
670 public:
671     size_t AppendNewFilter(uint64_t filterId, DataIndex type, DataIndex nameId);
672     const std::deque<DataIndex>& NamesData() const;
673     const std::deque<DataIndex>& TypesData() const;
Clear()674     void Clear() override
675     {
676         CacheBase::Clear();
677         types_.clear();
678         names_.clear();
679     }
680 
681 private:
682     std::deque<DataIndex> types_ = {};
683     std::deque<DataIndex> names_ = {};
684 };
685 class DataType : public CacheBase {
686 public:
687     size_t AppendNewDataType(BaseDataType dataType, DataIndex dataDescIndex);
688     const std::deque<BaseDataType>& DataTypes() const;
689     const std::deque<DataIndex>& DataDesc() const;
Clear()690     void Clear() override
691     {
692         CacheBase::Clear();
693         dataTypes_.clear();
694         descs_.clear();
695     }
696 
697 private:
698     std::deque<BaseDataType> dataTypes_ = {};
699     std::deque<DataIndex> descs_ = {};
700 };
701 class LogInfo : public CacheBase {
702 public:
703     size_t AppendNewLogInfo(uint64_t seq,
704                             uint64_t timeStamp,
705                             uint32_t pid,
706                             uint32_t tid,
707                             DataIndex level,
708                             DataIndex tag,
709                             DataIndex context,
710                             uint64_t originTs);
711     const std::deque<uint64_t>& HilogLineSeqs() const;
712     const std::deque<uint32_t>& Pids() const;
713     const std::deque<uint32_t>& Tids() const;
714     const std::deque<DataIndex>& Levels() const;
715     const std::deque<DataIndex>& Tags() const;
716     const std::deque<DataIndex>& Contexts() const;
717     const std::deque<uint64_t>& OriginTimeStamData() const;
Clear()718     void Clear() override
719     {
720         CacheBase::Clear();
721         hilogLineSeqs_.clear();
722         pids_.clear();
723         levels_.clear();
724         tags_.clear();
725         contexts_.clear();
726         originTs_.clear();
727     }
728 
729 private:
730     std::deque<uint64_t> hilogLineSeqs_ = {};
731     std::deque<uint32_t> pids_ = {};
732     std::deque<uint32_t> tids_ = {};
733     std::deque<DataIndex> levels_ = {};
734     std::deque<DataIndex> tags_ = {};
735     std::deque<DataIndex> contexts_ = {};
736     std::deque<uint64_t> originTs_ = {};
737 };
738 
739 class NativeHook : public CacheBase {
740 public:
741     size_t AppendNewNativeHookData(uint32_t callChainId,
742                                    uint32_t ipid,
743                                    uint32_t itid,
744                                    std::string eventType,
745                                    DataIndex subType,
746                                    uint64_t timeStamp,
747                                    uint64_t endTimeStamp,
748                                    uint64_t duration,
749                                    uint64_t addr,
750                                    int64_t memSize);
751     void UpdateCallChainId(size_t row, uint32_t callChainId);
752     void UpdateEndTimeStampAndDuration(size_t row, uint64_t endTimeStamp);
753     void UpdateCurrentSizeDur(size_t row, uint64_t timeStamp);
754     void UpdateMemMapSubType(uint64_t row, uint64_t tagId);
755     void UpdateLastCallerPathIndexs(std::unordered_map<uint32_t, uint64_t>& callIdToLasLibId);
756     const std::deque<uint32_t>& CallChainIds() const;
757     const std::deque<uint32_t>& Ipids() const;
758     const std::deque<uint32_t>& Itids() const;
759     const std::deque<std::string>& EventTypes() const;
760     const std::deque<DataIndex>& SubTypes() const;
761     const std::deque<uint64_t>& EndTimeStamps() const;
762     const std::deque<uint64_t>& Durations() const;
763     const std::deque<uint64_t>& Addrs() const;
764     const std::deque<int64_t>& MemSizes() const;
765     const std::deque<int64_t>& AllMemSizes() const;
766     const std::deque<uint64_t>& CurrentSizeDurs() const;
767     const std::deque<uint64_t>& LastCallerPathIndexs() const;
Clear()768     void Clear() override
769     {
770         CacheBase::Clear();
771         callChainIds_.clear();
772         ipids_.clear();
773         itids_.clear();
774         eventTypes_.clear();
775         subTypes_.clear();
776         endTimeStamps_.clear();
777         durations_.clear();
778         addrs_.clear();
779         memSizes_.clear();
780         allMemSizes_.clear();
781         currentSizeDurs_.clear();
782         lastCallerPathIndexs_.clear();
783     }
784 
785 private:
786     std::deque<uint32_t> callChainIds_ = {};
787     std::deque<uint32_t> ipids_ = {};
788     std::deque<uint32_t> itids_ = {};
789     std::deque<std::string> eventTypes_ = {};
790     std::deque<DataIndex> subTypes_ = {};
791     std::deque<uint64_t> endTimeStamps_ = {};
792     std::deque<uint64_t> durations_ = {};
793     std::deque<uint64_t> addrs_ = {};
794     std::deque<int64_t> memSizes_ = {};
795     std::deque<int64_t> allMemSizes_ = {};
796     std::deque<uint64_t> currentSizeDurs_ = {};
797     std::deque<uint64_t> lastCallerPathIndexs_ = {};
798     int64_t countHeapSizes_ = 0;
799     int64_t countMmapSizes_ = 0;
800     const std::string ALLOC_EVET = "AllocEvent";
801     const std::string FREE_EVENT = "FreeEvent";
802     const std::string MMAP_EVENT = "MmapEvent";
803     const std::string MUNMAP_EVENT = "MunmapEvent";
804 };
805 
806 class NativeHookFrame {
807 public:
808     size_t AppendNewNativeHookFrame(uint32_t callChainId,
809                                     uint64_t depth,
810                                     uint64_t ip,
811                                     uint64_t sp,
812                                     DataIndex symbolName,
813                                     DataIndex filePath,
814                                     uint64_t offset,
815                                     uint64_t symbolOffset);
816     size_t AppendNewNativeHookFrame(uint32_t callChainId,
817                                     uint64_t depth,
818                                     uint64_t ip,
819                                     uint64_t sp,
820                                     DataIndex symbolName,
821                                     DataIndex filePath,
822                                     uint64_t offset,
823                                     uint64_t symbolOffset,
824                                     const std::string& vaddr);
825     void UpdateFrameInfo(size_t row,
826                          DataIndex symbolIndex,
827                          DataIndex filePathIndex,
828                          uint64_t offset,
829                          uint64_t symbolOffset);
830     void UpdateSymbolIdToNameMap(uint64_t originSymbolId, uint64_t symbolId);
831     void UpdateSymbolId();
832     void UpdateSymbolId(size_t index, DataIndex symbolId);
833     void UpdateFileId(std::map<uint32_t, uint64_t>& filePathIdToFilePathName);
834     void UpdateVaddrs(std::deque<std::string>& vaddrs);
835     const std::deque<uint32_t>& CallChainIds() const;
836     const std::deque<uint64_t>& Depths() const;
837     const std::deque<uint64_t>& Ips() const;
838     const std::deque<uint64_t>& Sps() const;
839     const std::deque<DataIndex>& SymbolNames() const;
840     const std::deque<DataIndex>& FilePaths() const;
841     const std::deque<uint64_t>& Offsets() const;
842     const std::deque<uint64_t>& SymbolOffsets() const;
843     const std::deque<std::string>& Vaddrs() const;
Size()844     size_t Size() const
845     {
846         return callChainIds_.size();
847     }
Clear()848     void Clear()
849     {
850         callChainIds_.clear();
851         depths_.clear();
852         ips_.clear();
853         sps_.clear();
854         symbolNames_.clear();
855         filePaths_.clear();
856         offsets_.clear();
857         symbolOffsets_.clear();
858         vaddrs_.clear();
859     }
860 
861 private:
862     std::deque<uint32_t> callChainIds_ = {};
863     std::deque<uint64_t> depths_ = {};
864     std::deque<uint64_t> ips_ = {};
865     std::deque<uint64_t> sps_ = {};
866     std::deque<DataIndex> symbolNames_ = {};
867     std::deque<DataIndex> filePaths_ = {};
868     std::deque<uint64_t> offsets_ = {};
869     std::deque<uint64_t> symbolOffsets_ = {};
870     std::deque<std::string> vaddrs_ = {};
871     std::map<uint32_t, uint64_t> symbolIdToSymbolName_ = {};
872     DataIndex libcFilePathIndex_ = INVALID_UINT64;
873     DataIndex muslFilePathIndex_ = INVALID_UINT64;
874 };
875 
876 class NativeHookStatistic : public CacheBase {
877 public:
878     size_t AppendNewNativeHookStatistic(uint32_t ipid,
879                                         uint64_t timeStamp,
880                                         uint32_t callChainId,
881                                         uint32_t memoryType,
882                                         uint64_t applyCount,
883                                         uint64_t releaseCount,
884                                         uint64_t applySize,
885                                         uint64_t releaseSize);
886 
887     const std::deque<uint32_t>& Ipids() const;
888     const std::deque<uint32_t>& CallChainIds() const;
889     const std::deque<uint32_t>& MemoryTypes() const;
890     const std::deque<uint64_t>& ApplyCounts() const;
891     const std::deque<uint64_t>& ReleaseCounts() const;
892     const std::deque<uint64_t>& ApplySizes() const;
893     const std::deque<uint64_t>& ReleaseSizes() const;
Clear()894     void Clear() override
895     {
896         CacheBase::Clear();
897         ids_.clear();
898         ipids_.clear();
899         callChainIds_.clear();
900         timeStamps_.clear();
901         memoryTypes_.clear();
902         applyCounts_.clear();
903         releaseCounts_.clear();
904         applySizes_.clear();
905         releaseSizes_.clear();
906     }
907 
908 private:
909     std::deque<uint32_t> ipids_ = {};
910     std::deque<uint32_t> callChainIds_ = {};
911     std::deque<uint32_t> memoryTypes_ = {};
912     std::deque<uint64_t> applyCounts_ = {};
913     std::deque<uint64_t> releaseCounts_ = {};
914     std::deque<uint64_t> applySizes_ = {};
915     std::deque<uint64_t> releaseSizes_ = {};
916 };
917 
918 class Hidump : public CacheBase {
919 public:
920     size_t AppendNewHidumpInfo(uint64_t timeStamp, uint32_t fps);
921     const std::deque<uint32_t>& Fpss() const;
922 
923 private:
924     std::deque<uint32_t> fpss_ = {};
925 };
926 
927 class PerfCallChain : public CacheBase {
928 public:
929     size_t AppendNewPerfCallChain(uint64_t sampleId,
930                                   uint32_t callChainId,
931                                   uint64_t vaddrInFile,
932                                   uint64_t fileId,
933                                   uint64_t symbolId);
934     const std::deque<uint64_t>& SampleIds() const;
935     const std::deque<uint32_t>& CallChainIds() const;
936     const std::deque<uint64_t>& VaddrInFiles() const;
937     const std::deque<uint64_t>& FileIds() const;
938     const std::deque<uint64_t>& SymbolIds() const;
939     const std::deque<std::string>& Names() const;
940     void SetName(uint64_t index, const std::string& name);
941     void Clear() override;
942 
943 private:
944     std::deque<uint64_t> sampleIds_ = {};
945     std::deque<uint32_t> callChainIds_ = {};
946     std::deque<uint64_t> vaddrInFiles_ = {};
947     std::deque<uint64_t> fileIds_ = {};
948     std::deque<uint64_t> symbolIds_ = {};
949     std::deque<std::string> names_ = {};
950 };
951 
952 class PerfFiles : public CacheBase {
953 public:
954     size_t AppendNewPerfFiles(uint64_t fileIds, uint32_t serial, DataIndex symbols, DataIndex filePath);
955     const std::deque<uint64_t>& FileIds() const;
956     const std::deque<DataIndex>& Symbols() const;
957     const std::deque<DataIndex>& FilePaths() const;
958     const std::deque<uint32_t>& Serials() const;
959     void Clear() override;
960 
961 private:
962     std::deque<uint64_t> fileIds_ = {};
963     std::deque<uint32_t> serials_ = {};
964     std::deque<DataIndex> symbols_ = {};
965     std::deque<DataIndex> filePaths_ = {};
966 };
967 
968 class PerfSample : public CacheBase {
969 public:
970     size_t AppendNewPerfSample(uint32_t sampleId,
971                                uint64_t timeStamp,
972                                uint32_t tid,
973                                uint64_t eventCount,
974                                uint64_t eventTypeId,
975                                uint64_t timestampTrace,
976                                uint64_t cpuId,
977                                uint64_t threadState);
978     const std::deque<uint32_t>& SampleIds() const;
979     const std::deque<uint32_t>& Tids() const;
980     const std::deque<uint64_t>& EventCounts() const;
981     const std::deque<uint64_t>& EventTypeIds() const;
982     const std::deque<uint64_t>& TimestampTraces() const;
983     const std::deque<uint64_t>& CpuIds() const;
984     const std::deque<DataIndex>& ThreadStates() const;
985     void Clear() override;
986 
987 private:
988     std::deque<uint32_t> sampleIds_ = {};
989     std::deque<uint32_t> tids_ = {};
990     std::deque<uint64_t> eventCounts_ = {};
991     std::deque<uint64_t> eventTypeIds_ = {};
992     std::deque<uint64_t> timestampTraces_ = {};
993     std::deque<uint64_t> cpuIds_ = {};
994     std::deque<DataIndex> threadStates_ = {};
995 };
996 
997 class PerfThread : public CacheBase {
998 public:
999     size_t AppendNewPerfThread(uint32_t pid, uint32_t tid, DataIndex threadName);
1000     const std::deque<uint32_t>& Pids() const;
1001     const std::deque<uint32_t>& Tids() const;
1002     const std::deque<DataIndex>& ThreadNames() const;
1003     void Clear() override;
1004 
1005 private:
1006     std::deque<uint32_t> tids_ = {};
1007     std::deque<uint32_t> pids_ = {};
1008     std::deque<DataIndex> threadNames_ = {};
1009 };
1010 
1011 class PerfReport : public CacheBase {
1012 public:
1013     size_t AppendNewPerfReport(DataIndex type, DataIndex value);
1014     const std::deque<DataIndex>& Types() const;
1015     const std::deque<DataIndex>& Values() const;
1016 
1017 private:
1018     std::deque<DataIndex> types_ = {};
1019     std::deque<DataIndex> values_ = {};
1020 };
1021 class StatAndInfo {
1022 public:
1023     StatAndInfo();
1024     ~StatAndInfo() = default;
1025     void IncreaseStat(SupportedTraceEventType eventType, StatType type);
1026     const uint32_t& GetValue(SupportedTraceEventType eventType, StatType type) const;
1027     const std::string& GetEvent(SupportedTraceEventType eventType) const;
1028     const std::string& GetStat(StatType type) const;
1029     const std::string& GetSeverityDesc(SupportedTraceEventType eventType, StatType type) const;
1030     const StatSeverityLevel& GetSeverity(SupportedTraceEventType eventType, StatType type) const;
1031     std::map<BuiltinClocks, std::string> clockid2ClockNameMap_ = {};
1032 
1033 private:
1034     uint32_t statCount_[TRACE_EVENT_MAX][STAT_EVENT_MAX];
1035     std::string event_[TRACE_EVENT_MAX];
1036     std::string stat_[STAT_EVENT_MAX];
1037     std::string statSeverityDesc_[TRACE_EVENT_MAX][STAT_EVENT_MAX];
1038     StatSeverityLevel statSeverity_[TRACE_EVENT_MAX][STAT_EVENT_MAX];
1039     TraceStreamerConfig config_{};
1040 };
1041 class SymbolsData {
1042 public:
1043     SymbolsData() = default;
1044     ~SymbolsData() = default;
1045     uint64_t Size() const;
1046     void InsertSymbol(const DataIndex& name, const uint64_t& addr);
1047     const std::deque<DataIndex>& GetConstFuncNames() const;
1048     const std::deque<uint64_t>& GetConstAddrs() const;
Clear()1049     void Clear()
1050     {
1051         addrs_.clear();
1052         funcName_.clear();
1053     }
1054 
1055 private:
1056     std::deque<uint64_t> addrs_ = {};
1057     std::deque<DataIndex> funcName_ = {};
1058 };
1059 class DiskIOData : public CacheBase {
1060 public:
1061     DiskIOData() = default;
1062     ~DiskIOData() = default;
1063     void AppendNewData(uint64_t ts,
1064                        uint64_t dur,
1065                        uint64_t rd,
1066                        uint64_t wr,
1067                        uint64_t rdPerSec,
1068                        uint64_t wrPerSec,
1069                        double rdCountPerSec,
1070                        double wrCountPerSec,
1071                        uint64_t rdCount,
1072                        uint64_t wrCount);
1073     const std::deque<uint64_t>& Durs() const;
1074     const std::deque<uint64_t>& RdDatas() const;
1075     const std::deque<uint64_t>& WrDatas() const;
1076     const std::deque<double>& RdSpeedDatas() const;
1077     const std::deque<double>& WrSpeedDatas() const;
1078     const std::deque<double>& RdCountPerSecDatas() const;
1079     const std::deque<double>& WrCountPerSecDatas() const;
1080     const std::deque<uint64_t>& RdCountDatas() const;
1081     const std::deque<uint64_t>& WrCountDatas() const;
1082 
1083 private:
1084     std::deque<uint64_t> durs_ = {};
1085     std::deque<uint64_t> rdDatas_ = {};
1086     std::deque<uint64_t> wrDatas_ = {};
1087     std::deque<double> wrPerSec_ = {};
1088     std::deque<double> rdPerSec_ = {};
1089     std::deque<double> wrCountPerSec_ = {};
1090     std::deque<double> rdCountPerSec_ = {};
1091     std::deque<uint64_t> rdCountDatas_ = {};
1092     std::deque<uint64_t> wrCountDatas_ = {};
1093 };
1094 class MetaData {
1095 public:
1096     MetaData();
1097     ~MetaData() = default;
1098     void SetTraceType(const std::string& traceType);
1099     void SetSourceFileName(const std::string& fileName);
1100     void SetOutputFileName(const std::string& fileName);
1101     void SetParserToolVersion(const std::string& version);
1102     void SetParserToolPublishDateTime(const std::string& datetime);
1103     void SetTraceDataSize(uint64_t dataSize);
1104     void SetTraceDuration(uint64_t dur);
1105     const std::string& Value(uint64_t row) const;
1106     const std::string& Name(uint64_t row) const;
Clear()1107     void Clear()
1108     {
1109         columnNames_.clear();
1110         values_.clear();
1111     }
1112 
1113 private:
1114     const std::string METADATA_ITEM_DATASIZE_COLNAME = "datasize";
1115     const std::string METADATA_ITEM_PARSETOOL_NAME_COLNAME = "parse_tool";
1116     const std::string METADATA_ITEM_PARSERTOOL_VERSION_COLNAME = "tool_version";
1117     const std::string METADATA_ITEM_PARSERTOOL_PUBLISH_DATETIME_COLNAME = "tool_publish_time";
1118     const std::string METADATA_ITEM_SOURCE_FILENAME_COLNAME = "source_name";
1119     const std::string METADATA_ITEM_OUTPUT_FILENAME_COLNAME = "output_name";
1120     const std::string METADATA_ITEM_PARSERTIME_COLNAME = "runtime";
1121     const std::string METADATA_ITEM_TRACE_DURATION_COLNAME = "trace_duration";
1122     const std::string METADATA_ITEM_SOURCE_DATETYPE_COLNAME = "source_type";
1123 
1124     std::deque<std::string> columnNames_ = {};
1125     std::deque<std::string> values_ = {};
1126 };
1127 class DataDict {
1128 public:
Size()1129     size_t Size() const
1130     {
1131         return dataDict_.size();
1132     }
1133     DataIndex GetStringIndex(std::string_view str);
1134     DataIndex GetStringIndexNoWrite(std::string_view str) const;
GetDataFromDict(DataIndex id)1135     const std::string& GetDataFromDict(DataIndex id) const
1136     {
1137         TS_ASSERT(id < dataDict_.size());
1138         return dataDict_[id];
1139     }
1140     void Finish();
Clear()1141     void Clear()
1142     {
1143         dataDict_.clear();
1144     }
1145 
1146 public:
1147     std::deque<std::string> dataDict_;
1148     std::unordered_map<uint64_t, DataIndex> dataDictInnerMap_;
1149 
1150 private:
1151     std::hash<std::string_view> hashFun;
1152     std::mutex mutex_;
1153     const int8_t SPASCII_START = 0;
1154     const int8_t SPASCII_END = 32;
1155 };
1156 class NetDetailData : public CacheBase {
1157 public:
1158     size_t AppendNewNetData(uint64_t newTimeStamp,
1159                             uint64_t tx,
1160                             uint64_t rx,
1161                             uint64_t dur,
1162                             double rxSpeed,
1163                             double txSpeed,
1164                             uint64_t packetIn,
1165                             double packetInSec,
1166                             uint64_t packetOut,
1167                             double packetOutSec,
1168                             const std::string& netType);
1169     const std::deque<uint64_t>& Durs() const;
1170     const std::deque<double>& RxSpeed() const;
1171     const std::deque<double>& TxSpeed() const;
1172     const std::deque<std::string>& NetTypes() const;
1173     const std::deque<uint64_t>& RxDatas() const;
1174     const std::deque<uint64_t>& TxDatas() const;
1175     const std::deque<uint64_t>& PacketIn() const;
1176     const std::deque<double>& PacketInSec() const;
1177     const std::deque<uint64_t>& PacketOut() const;
1178     const std::deque<double>& PacketOutSec() const;
Clear()1179     void Clear() override
1180     {
1181         CacheBase::Clear();
1182         durs_.clear();
1183         rxSpeeds_.clear();
1184         txSpeeds_.clear();
1185         netTypes_.clear();
1186         packetIn_.clear();
1187         packetInSec_.clear();
1188         packetOut_.clear();
1189         packetOutSec_.clear();
1190     }
1191 
1192 private:
1193     std::deque<uint64_t> rxs_ = {};
1194     std::deque<uint64_t> txs_ = {};
1195     std::deque<uint64_t> durs_ = {};
1196     std::deque<double> rxSpeeds_ = {};
1197     std::deque<double> txSpeeds_ = {};
1198     std::deque<uint64_t> packetIn_ = {};
1199     std::deque<double> packetInSec_ = {};
1200     std::deque<uint64_t> packetOut_ = {};
1201     std::deque<double> packetOutSec_ = {};
1202     std::deque<std::string> netTypes_ = {};
1203 };
1204 class LiveProcessDetailData : public CacheBase {
1205 public:
1206     size_t AppendNewData(uint64_t newTimeStamp,
1207                          uint64_t dur,
1208                          int32_t processID,
1209                          std::string processName,
1210                          int32_t parentProcessID,
1211                          int32_t uid,
1212                          std::string userName,
1213                          double cpuUsage,
1214                          int32_t pssInfo,
1215                          uint64_t cpuTime,
1216                          int32_t threads,
1217                          int64_t diskWrites,
1218                          int64_t diskReads);
1219     const std::deque<uint64_t>& Durs() const;
1220     const std::deque<int32_t>& ProcessID() const;
1221     const std::deque<std::string>& ProcessName() const;
1222     const std::deque<int32_t>& ParentProcessID() const;
1223     const std::deque<int32_t>& Uid() const;
1224     const std::deque<std::string>& UserName() const;
1225     const std::deque<double>& CpuUsage() const;
1226     const std::deque<int32_t>& PssInfo() const;
1227     const std::deque<int32_t>& Threads() const;
1228     const std::deque<int64_t>& DiskWrites() const;
1229     const std::deque<int64_t>& DiskReads() const;
1230     const std::deque<uint64_t>& CpuTimes() const;
Clear()1231     void Clear() override
1232     {
1233         CacheBase::Clear();
1234         durs_.clear();
1235         processID_.clear();
1236         processName_.clear();
1237         parentProcessID_.clear();
1238         uid_.clear();
1239         userName_.clear();
1240         cpuUsage_.clear();
1241         pssInfo_.clear();
1242         threads_.clear();
1243         diskWrites_.clear();
1244         diskReads_.clear();
1245     }
1246 
1247 private:
1248     std::deque<uint64_t> durs_ = {};
1249     std::deque<int32_t> processID_ = {};
1250     std::deque<std::string> processName_ = {};
1251     std::deque<int32_t> parentProcessID_ = {};
1252     std::deque<int32_t> uid_ = {};
1253     std::deque<std::string> userName_ = {};
1254     std::deque<double> cpuUsage_ = {};
1255     std::deque<int32_t> pssInfo_ = {};
1256     std::deque<int32_t> threads_ = {};
1257     std::deque<int64_t> diskWrites_ = {};
1258     std::deque<int64_t> diskReads_ = {};
1259     std::deque<uint64_t> cpuTimes_ = {};
1260 };
1261 class CpuUsageDetailData : public CacheBase {
1262 public:
1263     size_t AppendNewData(uint64_t newTimeStamp,
1264                          uint64_t dur,
1265                          double totalLoad,
1266                          double userLoad,
1267                          double systemLoad,
1268                          int64_t threads);
1269     const std::deque<uint64_t>& Durs() const;
1270     const std::deque<double>& TotalLoad() const;
1271     const std::deque<double>& UserLoad() const;
1272     const std::deque<double>& SystemLoad() const;
1273     const std::deque<int64_t>& Threads() const;
Clear()1274     void Clear() override
1275     {
1276         CacheBase::Clear();
1277         durs_.clear();
1278         totalLoad_.clear();
1279         userLoad_.clear();
1280         systemLoad_.clear();
1281         threads_.clear();
1282     }
1283 
1284 private:
1285     std::deque<uint64_t> durs_ = {};
1286     std::deque<double> totalLoad_ = {};
1287     std::deque<double> userLoad_ = {};
1288     std::deque<double> systemLoad_ = {};
1289     std::deque<int64_t> threads_ = {};
1290 };
1291 class FileSystemSample : public CacheBase {
1292 public:
1293     size_t AppendNewData(uint32_t callChainId,
1294                          uint16_t type,
1295                          uint32_t ipid,
1296                          uint32_t itid,
1297                          uint64_t startTs,
1298                          uint64_t endTs,
1299                          uint64_t dur,
1300                          DataIndex returnValue,
1301                          DataIndex errorCode,
1302                          size_t size,
1303                          int32_t fd,
1304                          DataIndex fileId,
1305                          DataIndex firstArgument,
1306                          DataIndex secondArgument,
1307                          DataIndex thirdArgument,
1308                          DataIndex fourthArgument);
1309     const std::deque<uint32_t>& CallChainIds() const;
1310     const std::deque<uint16_t>& Types() const;
1311     const std::deque<uint32_t>& Ipids() const;
1312     const std::deque<uint32_t>& Itids() const;
1313     const std::deque<uint64_t>& StartTs() const;
1314     const std::deque<uint64_t>& EndTs() const;
1315     const std::deque<uint64_t>& Durs() const;
1316     const std::deque<DataIndex>& ReturnValues() const;
1317     const std::deque<DataIndex>& ErrorCodes() const;
1318     const std::deque<int32_t>& Fds() const;
1319     const std::deque<DataIndex>& FileIds() const;
1320     const std::deque<size_t>& Sizes() const;
1321     const std::deque<DataIndex>& FirstArguments() const;
1322     const std::deque<DataIndex>& SecondArguments() const;
1323     const std::deque<DataIndex>& ThirdArguments() const;
1324     const std::deque<DataIndex>& FourthArguments() const;
Clear()1325     void Clear() override
1326     {
1327         CacheBase::Clear();
1328         callChainIds_.clear();
1329         types_.clear();
1330         ipids_.clear();
1331         itids_.clear();
1332         startTs_.clear();
1333         endTs_.clear();
1334         durs_.clear();
1335         returnValues_.clear();
1336         errorCodes_.clear();
1337         fds_.clear();
1338         Sizes_.clear();
1339         firstArguments_.clear();
1340         secondArguments_.clear();
1341         thirdArguments_.clear();
1342         fourthArguments_.clear();
1343     }
1344 
1345 private:
1346     std::deque<uint32_t> callChainIds_ = {};
1347     std::deque<uint16_t> types_ = {};
1348     std::deque<uint32_t> ipids_ = {};
1349     std::deque<uint32_t> itids_ = {};
1350     std::deque<uint64_t> startTs_ = {};
1351     std::deque<uint64_t> endTs_ = {};
1352     std::deque<uint64_t> durs_ = {};
1353     std::deque<DataIndex> returnValues_ = {};
1354     std::deque<DataIndex> errorCodes_ = {};
1355     std::deque<int32_t> fds_ = {};
1356     std::deque<DataIndex> fileIds_ = {};
1357     std::deque<size_t> Sizes_ = {};
1358     std::deque<DataIndex> firstArguments_ = {};
1359     std::deque<DataIndex> secondArguments_ = {};
1360     std::deque<DataIndex> thirdArguments_ = {};
1361     std::deque<DataIndex> fourthArguments_ = {};
1362 };
1363 class EbpfCallStackData : public CacheBase {
1364 public:
1365     size_t AppendNewData(uint32_t callChainId, uint32_t depth, DataIndex ip, DataIndex symbolId, DataIndex filePathId);
1366     void UpdateSymbolAndFilePathIndex(size_t row, DataIndex symbolId, DataIndex filePathId);
1367     const std::deque<uint32_t>& CallChainIds() const;
1368     const std::deque<uint32_t>& Depths() const;
1369     const std::deque<DataIndex>& Ips() const;
1370     const std::deque<DataIndex>& SymbolIds() const;
1371     const std::deque<DataIndex>& FilePathIds() const;
Clear()1372     void Clear() override
1373     {
1374         CacheBase::Clear();
1375         callChainIds_.clear();
1376         depths_.clear();
1377         symbolIds_.clear();
1378         filePathIds_.clear();
1379     }
1380 
1381 private:
1382     std::deque<uint32_t> callChainIds_ = {};
1383     std::deque<uint32_t> depths_ = {};
1384     std::deque<DataIndex> ips_ = {};
1385     std::deque<DataIndex> symbolIds_ = {};
1386     std::deque<DataIndex> filePathIds_ = {};
1387 };
1388 class PagedMemorySampleData : public CacheBase {
1389 public:
1390     size_t AppendNewData(uint32_t callChainId,
1391                          uint16_t type,
1392                          uint32_t ipid,
1393                          uint64_t startTs,
1394                          uint64_t endTs,
1395                          uint64_t dur,
1396                          size_t size,
1397                          DataIndex addr,
1398                          uint32_t itid);
1399     const std::deque<uint32_t>& CallChainIds() const;
1400     const std::deque<uint16_t>& Types() const;
1401     const std::deque<uint32_t>& Ipids() const;
1402     const std::deque<uint64_t>& StartTs() const;
1403     const std::deque<uint64_t>& EndTs() const;
1404     const std::deque<uint64_t>& Durs() const;
1405     const std::deque<size_t>& Sizes() const;
1406     const std::deque<DataIndex>& Addr() const;
1407     const std::deque<uint32_t>& Itids() const;
Clear()1408     void Clear() override
1409     {
1410         CacheBase::Clear();
1411         callChainIds_.clear();
1412         types_.clear();
1413         ipids_.clear();
1414         startTs_.clear();
1415         endTs_.clear();
1416         durs_.clear();
1417         Sizes_.clear();
1418         addrs_.clear();
1419         itids_.clear();
1420     }
1421 
1422 private:
1423     std::deque<uint32_t> callChainIds_ = {};
1424     std::deque<uint16_t> types_ = {};
1425     std::deque<uint32_t> ipids_ = {};
1426     std::deque<uint64_t> startTs_ = {};
1427     std::deque<uint64_t> endTs_ = {};
1428     std::deque<uint64_t> durs_ = {};
1429     std::deque<size_t> Sizes_ = {};
1430     std::deque<DataIndex> addrs_ = {};
1431     std::deque<uint32_t> itids_ = {};
1432 };
1433 #if WITH_EBPF_HELP
1434 class EbpfProcessMaps : public CacheBase {
1435 public:
1436     size_t AppendNewData(uint64_t start,
1437                          uint64_t end,
1438                          uint32_t offset,
1439                          uint32_t pid,
1440                          uint32_t fileNameLen,
1441                          uint64_t fileNameIndex);
1442     const std::deque<uint64_t>& Starts() const;
1443     const std::deque<uint64_t>& Ends() const;
1444     const std::deque<uint32_t>& Offsets() const;
1445     const std::deque<uint32_t>& Pids() const;
1446     const std::deque<uint32_t>& FileNameLens() const;
1447     const std::deque<uint64_t>& FileNameIndexs() const;
Clear()1448     void Clear() override
1449     {
1450         CacheBase::Clear();
1451         starts_.clear();
1452         ends_.clear();
1453         offsets_.clear();
1454         pids_.clear();
1455         fileNameLens_.clear();
1456         fileNameIndexs_.clear();
1457     }
1458 
1459 private:
1460     std::deque<uint64_t> starts_ = {};
1461     std::deque<uint64_t> ends_ = {};
1462     std::deque<uint32_t> offsets_ = {};
1463     std::deque<uint32_t> pids_ = {};
1464     std::deque<uint32_t> fileNameLens_ = {};
1465     std::deque<uint64_t> fileNameIndexs_ = {};
1466 };
1467 
1468 class EbpfElf : public CacheBase {
1469 public:
1470     size_t AppendNewData(uint64_t elfId,
1471                          uint64_t textVaddr,
1472                          uint32_t textOffset,
1473                          uint32_t strTabLen,
1474                          uint32_t symTabLen,
1475                          uint32_t fileNameLen,
1476                          uint32_t symEntLen,
1477                          uint64_t fileNameIndex);
1478     const std::deque<uint64_t>& ElfIds() const;
1479     const std::deque<uint64_t>& TextVaddrs() const;
1480     const std::deque<uint32_t>& TextOffsets() const;
1481     const std::deque<uint32_t>& StrTabLens() const;
1482     const std::deque<uint32_t>& SymTabLens() const;
1483     const std::deque<uint32_t>& FileNameLens() const;
1484     const std::deque<uint32_t>& SymEntLens() const;
1485     const std::deque<uint64_t>& FileNameIndexs() const;
1486 
Clear()1487     void Clear() override
1488     {
1489         CacheBase::Clear();
1490         elfIds_.clear();
1491         textVaddrs_.clear();
1492         textOffsets_.clear();
1493         strTabLens_.clear();
1494         symTabLens_.clear();
1495         fileNameLens_.clear();
1496         symEntLens_.clear();
1497         fileNameIndexs_.clear();
1498     }
1499 
1500 private:
1501     std::deque<uint64_t> elfIds_ = {};
1502     std::deque<uint64_t> textVaddrs_ = {};
1503     std::deque<uint32_t> textOffsets_ = {};
1504     std::deque<uint32_t> strTabLens_ = {};
1505     std::deque<uint32_t> symTabLens_ = {};
1506     std::deque<uint32_t> fileNameLens_ = {};
1507     std::deque<uint32_t> symEntLens_ = {};
1508     std::deque<uint64_t> fileNameIndexs_ = {};
1509 };
1510 
1511 class EbpfElfSymbol : public CacheBase {
1512 public:
1513     size_t AppendNewData(uint64_t elfId, uint32_t stName, uint64_t stValue, uint64_t stSize);
1514     const std::deque<uint64_t>& ElfIds() const;
1515     const std::deque<uint32_t>& StNames() const;
1516     const std::deque<uint64_t>& StValues() const;
1517     const std::deque<uint64_t>& StSizes() const;
1518 
Clear()1519     void Clear() override
1520     {
1521         CacheBase::Clear();
1522         elfIds_.clear();
1523         stNames_.clear();
1524         stValues_.clear();
1525         stSizes_.clear();
1526     }
1527 
1528 private:
1529     std::deque<uint64_t> elfIds_ = {};
1530     std::deque<uint32_t> stNames_ = {};
1531     std::deque<uint64_t> stValues_ = {};
1532     std::deque<uint64_t> stSizes_ = {};
1533 };
1534 #endif
1535 class AppNames : public CacheBase {
1536 public:
1537     uint32_t AppendAppName(uint8_t flags, DataIndex eventSource, DataIndex appName);
1538     const std::deque<uint8_t>& Falgs() const;
1539     const std::deque<DataIndex>& EventSourceId() const;
1540     const std::deque<DataIndex>& AppName() const;
Clear()1541     void Clear() override
1542     {
1543         CacheBase::Clear();
1544         flags_.clear();
1545         appNames_.clear();
1546         keyNames_.clear();
1547     }
1548 
1549 private:
1550     std::deque<uint8_t> flags_ = {};
1551     std::deque<DataIndex> appNames_ = {};
1552     std::deque<DataIndex> keyNames_ = {};
1553     uint32_t rowCount_ = 0;
1554 };
1555 class SysEventMeasureData : public CacheBase {
1556 public:
1557     void AppendData(uint64_t serial,
1558                     uint64_t ts,
1559                     uint32_t nameId,
1560                     uint32_t keyId,
1561                     int32_t type,
1562                     double numericValue,
1563                     DataIndex stringValue);
1564     const std::deque<uint64_t>& Serial() const;
1565     const std::deque<uint64_t>& Ts() const;
1566     const std::deque<uint32_t>& NameFilterId() const;
1567     const std::deque<uint32_t>& AppKeyFilterId() const;
1568     const std::deque<int32_t>& Type() const;
1569     const std::deque<double>& NumValue() const;
1570     const std::deque<DataIndex>& StringValue() const;
Clear()1571     void Clear() override
1572     {
1573         CacheBase::Clear();
1574         serial_.clear();
1575         ts_.clear();
1576         nameFilterIds_.clear();
1577         appKeyFilterIds_.clear();
1578         types_.clear();
1579         numValues_.clear();
1580         stringValues_.clear();
1581     }
1582 
1583 private:
1584     std::deque<uint64_t> serial_ = {};
1585     std::deque<uint64_t> ts_ = {};
1586     std::deque<uint32_t> nameFilterIds_ = {};
1587     std::deque<uint32_t> appKeyFilterIds_ = {};
1588     std::deque<int32_t> types_ = {};
1589     std::deque<double> numValues_ = {};
1590     std::deque<DataIndex> stringValues_ = {};
1591     uint32_t rowCount_ = 0;
1592 };
1593 class DeviceStateData : public CacheBase {
1594 public:
1595     void AppendNewData(int32_t brightness,
1596                        int32_t btState,
1597                        int32_t location,
1598                        int32_t wifi,
1599                        int32_t streamDefault,
1600                        int32_t voiceCall,
1601                        int32_t music,
1602                        int32_t streamRing,
1603                        int32_t media,
1604                        int32_t voiceAssistant,
1605                        int32_t system,
1606                        int32_t alarm,
1607                        int32_t notification,
1608                        int32_t btSco,
1609                        int32_t enforcedAudible,
1610                        int32_t streamDtmf,
1611                        int32_t streamTts,
1612                        int32_t accessibility,
1613                        int32_t recording,
1614                        int32_t streamAll);
1615     const std::deque<int32_t>& Brightness() const;
1616     const std::deque<int32_t>& BtState() const;
1617     const std::deque<int32_t>& Location() const;
1618     const std::deque<int32_t>& Wifi() const;
1619     const std::deque<int32_t>& StreamDefault() const;
1620     const std::deque<int32_t>& VoiceCall() const;
1621     const std::deque<int32_t>& Music() const;
1622     const std::deque<int32_t>& StreamRing() const;
1623     const std::deque<int32_t>& Media() const;
1624     const std::deque<int32_t>& VoiceAssistant() const;
1625     const std::deque<int32_t>& System() const;
1626     const std::deque<int32_t>& Alarm() const;
1627     const std::deque<int32_t>& Notification() const;
1628     const std::deque<int32_t>& BtSco() const;
1629     const std::deque<int32_t>& EnforcedAudible() const;
1630     const std::deque<int32_t>& StreamDtmf() const;
1631     const std::deque<int32_t>& StreamTts() const;
1632     const std::deque<int32_t>& Accessibility() const;
1633     const std::deque<int32_t>& Recording() const;
1634     const std::deque<int32_t>& StreamAll() const;
Clear()1635     void Clear() override
1636     {
1637         CacheBase::Clear();
1638         brightness_.clear();
1639         btStates_.clear();
1640         locations_.clear();
1641         wifis_.clear();
1642         streamDefaults_.clear();
1643         voiceCalls_.clear();
1644         musics_.clear();
1645         streamRings_.clear();
1646         medias_.clear();
1647         voiceAssistants_.clear();
1648         systems_.clear();
1649         alarms_.clear();
1650         notifications_.clear();
1651         btScos_.clear();
1652         enforcedAudibles_.clear();
1653         streamDtmfs_.clear();
1654         streamTts_.clear();
1655         accessibilitys_.clear();
1656         recordings_.clear();
1657         streamAlls_.clear();
1658     }
1659 
1660 private:
1661     std::deque<uint32_t> stringValues_ = {};
1662     std::deque<int32_t> brightness_ = {};
1663     std::deque<int32_t> btStates_ = {};
1664     std::deque<int32_t> locations_ = {};
1665     std::deque<int32_t> wifis_ = {};
1666     std::deque<int32_t> streamDefaults_ = {};
1667     std::deque<int32_t> voiceCalls_ = {};
1668     std::deque<int32_t> musics_ = {};
1669     std::deque<int32_t> streamRings_ = {};
1670     std::deque<int32_t> medias_ = {};
1671     std::deque<int32_t> voiceAssistants_ = {};
1672     std::deque<int32_t> systems_ = {};
1673     std::deque<int32_t> alarms_ = {};
1674     std::deque<int32_t> notifications_ = {};
1675     std::deque<int32_t> btScos_ = {};
1676     std::deque<int32_t> enforcedAudibles_ = {};
1677     std::deque<int32_t> streamDtmfs_ = {};
1678     std::deque<int32_t> streamTts_ = {};
1679     std::deque<int32_t> accessibilitys_ = {};
1680     std::deque<int32_t> recordings_ = {};
1681     std::deque<int32_t> streamAlls_ = {};
1682     uint32_t rowCounts_ = 0;
1683 };
1684 class TraceConfigData : public CacheBase {
1685 public:
1686     void AppendNewData(std::string traceSource, std::string key, std::string value);
1687     const std::deque<std::string>& TraceSource() const;
1688     const std::deque<std::string>& Key() const;
1689     const std::deque<std::string>& Value() const;
Clear()1690     void Clear() override
1691     {
1692         CacheBase::Clear();
1693         traceSource_.clear();
1694         key_.clear();
1695         value_.clear();
1696     }
1697 
1698 private:
1699     std::deque<std::string> traceSource_ = {};
1700     std::deque<std::string> key_ = {};
1701     std::deque<std::string> value_ = {};
1702     uint32_t rowCounts_ = 0;
1703 };
1704 class SmapsData : public CacheBase {
1705 public:
1706     void AppendNewData(uint64_t timeStamp,
1707                        std::string startAddr,
1708                        std::string endAddr,
1709                        uint64_t dirty,
1710                        uint64_t swapper,
1711                        uint64_t rss,
1712                        uint64_t pss,
1713                        uint64_t size,
1714                        double reside,
1715                        DataIndex protectionId,
1716                        DataIndex pathId);
1717     const std::deque<uint64_t>& Id() const;
1718     const std::deque<uint64_t>& TimeStamps() const;
1719     const std::deque<std::string>& StartAddrs() const;
1720     const std::deque<std::string>& EndAddrs() const;
1721     const std::deque<uint64_t>& Dirtys() const;
1722     const std::deque<uint64_t>& Swappers() const;
1723     const std::deque<uint64_t>& Rss() const;
1724     const std::deque<uint64_t>& Pss() const;
1725     const std::deque<uint64_t>& Sizes() const;
1726     const std::deque<double>& Resides() const;
1727     const std::deque<DataIndex>& ProtectionIds() const;
1728     const std::deque<DataIndex>& PathIds() const;
Clear()1729     void Clear() override
1730     {
1731         CacheBase::Clear();
1732         startAddrs_.clear();
1733         endAddrs_.clear();
1734         dirtys_.clear();
1735         swappers_.clear();
1736         rss_.clear();
1737         pss_.clear();
1738         sizes_.clear();
1739         resides_.clear();
1740         protectionIds_.clear();
1741         pathIds_.clear();
1742     }
1743 
1744 private:
1745     std::deque<std::string> startAddrs_ = {};
1746     std::deque<std::string> endAddrs_ = {};
1747     std::deque<uint64_t> dirtys_ = {};
1748     std::deque<uint64_t> swappers_ = {};
1749     std::deque<uint64_t> rss_ = {};
1750     std::deque<uint64_t> pss_ = {};
1751     std::deque<uint64_t> sizes_ = {};
1752     std::deque<double> resides_ = {};
1753     std::deque<DataIndex> protectionIds_ = {};
1754     std::deque<DataIndex> pathIds_ = {};
1755     uint32_t rowCount_ = 0;
1756 };
1757 class BioLatencySampleData : public CacheBase {
1758 public:
1759     void AppendNewData(uint32_t callChainId,
1760                        uint64_t type,
1761                        uint32_t ipid,
1762                        uint32_t itid,
1763                        uint64_t startTs,
1764                        uint64_t endTs,
1765                        uint64_t latencyDur,
1766                        uint32_t tier,
1767                        uint64_t size,
1768                        uint64_t blockNumber,
1769                        uint64_t filePathId,
1770                        uint64_t durPer4k);
1771     const std::deque<uint64_t>& Id() const;
1772     const std::deque<uint32_t>& CallChainIds() const;
1773     const std::deque<uint64_t>& Types() const;
1774     const std::deque<uint32_t>& Ipids() const;
1775     const std::deque<uint32_t>& Itids() const;
1776     const std::deque<uint64_t>& StartTs() const;
1777     const std::deque<uint64_t>& EndTs() const;
1778     const std::deque<uint64_t>& LatencyDurs() const;
1779     const std::deque<uint32_t>& Tiers() const;
1780     const std::deque<uint64_t>& Sizes() const;
1781     const std::deque<uint64_t>& BlockNumbers() const;
1782     const std::deque<uint64_t>& FilePathIds() const;
1783     const std::deque<uint64_t>& DurPer4k() const;
Clear()1784     void Clear() override
1785     {
1786         CacheBase::Clear();
1787         callChainIds_.clear();
1788         types_.clear();
1789         ipids_.clear();
1790         itids_.clear();
1791         startTs_.clear();
1792         endTs_.clear();
1793         latencyDurs_.clear();
1794         tiers_.clear();
1795         sizes_.clear();
1796         blockNumbers_.clear();
1797         filePathIds_.clear();
1798         durPer4ks_.clear();
1799     }
1800 
1801 private:
1802     std::deque<uint32_t> callChainIds_ = {};
1803     std::deque<uint64_t> types_ = {};
1804     std::deque<uint32_t> ipids_ = {};
1805     std::deque<uint32_t> itids_ = {};
1806     std::deque<uint64_t> startTs_ = {};
1807     std::deque<uint64_t> endTs_ = {};
1808     std::deque<uint64_t> latencyDurs_ = {};
1809     std::deque<uint32_t> tiers_ = {};
1810     std::deque<uint64_t> sizes_ = {};
1811     std::deque<uint64_t> blockNumbers_ = {};
1812     std::deque<uint64_t> filePathIds_ = {};
1813     std::deque<uint64_t> durPer4ks_ = {};
1814     uint32_t rowCount_ = 0;
1815 };
1816 class ClockSnapshotData {
1817 public:
AppendNewSnapshot(uint8_t clockId,uint64_t ts,const std::string & name)1818     size_t AppendNewSnapshot(uint8_t clockId, uint64_t ts, const std::string& name)
1819     {
1820         clockIds_.emplace_back(clockId);
1821         ts_.emplace_back(ts);
1822         names_.emplace_back(name);
1823         return ts_.size();
1824     }
Size()1825     const size_t Size() const
1826     {
1827         return ts_.size();
1828     }
ClockIds()1829     const std::deque<uint8_t>& ClockIds() const
1830     {
1831         return clockIds_;
1832     }
Ts()1833     const std::deque<uint64_t>& Ts() const
1834     {
1835         return ts_;
1836     }
Names()1837     const std::deque<std::string>& Names() const
1838     {
1839         return names_;
1840     }
1841 
1842 private:
1843     std::deque<uint8_t> clockIds_ = {};
1844     std::deque<uint64_t> ts_ = {};
1845     std::deque<std::string> names_ = {};
1846 };
1847 class DataSourceClockIdData {
1848 public:
1849     DataSourceClockIdData();
AppendNewDataSourceClockId(const std::string & dataSoruceName,uint8_t clockId)1850     size_t AppendNewDataSourceClockId(const std::string& dataSoruceName, uint8_t clockId)
1851     {
1852         dataSourceNames_.emplace_back(dataSoruceName);
1853         clockIds_.emplace_back(clockId);
1854         return dataSourceNames_.size();
1855     }
Size()1856     const size_t Size() const
1857     {
1858         return dataSourceNames_.size();
1859     }
ClockIds()1860     const std::deque<uint8_t>& ClockIds() const
1861     {
1862         return clockIds_;
1863     }
Names()1864     const std::deque<std::string>& Names() const
1865     {
1866         return dataSourceNames_;
1867     }
1868     void SetDataSourceClockId(DataSourceType source, uint32_t id);
1869     void Finish();
1870 
1871 private:
1872     std::deque<std::string> dataSourceNames_ = {};
1873     std::deque<uint8_t> clockIds_ = {};
1874     std::map<DataSourceType, uint8_t> dataSource2ClockIdMap_ = {};
1875     std::map<DataSourceType, std::string> dataSource2PluginNameMap_ = {};
1876 };
1877 
1878 class FrameSlice : public CacheBase {
1879 public:
1880     size_t AppendFrame(uint64_t ts, uint32_t ipid, uint32_t itid, uint32_t vsyncId, uint64_t callStackSliceId);
1881     size_t AppendFrame(uint64_t ts,
1882                        uint32_t ipid,
1883                        uint32_t itid,
1884                        uint32_t vsyncId,
1885                        uint64_t callStackSliceId,
1886                        uint64_t end,
1887                        uint8_t type);
1888     void SetEndTime(uint64_t row, uint64_t end);
1889     void SetType(uint64_t row, uint8_t type);
1890     void SetDst(uint64_t row, uint64_t dst);
1891     void SetSrcs(uint64_t row, const std::vector<uint64_t>& fromSlices);
1892     void SetFlags(uint64_t row, const uint32_t flags);
1893     const std::deque<uint32_t> Ipids() const;
1894     const std::deque<uint32_t> VsyncIds() const;
1895     const std::deque<uint64_t> CallStackIds() const;
1896     const std::deque<uint64_t> EndTss() const;
1897     const std::deque<uint64_t> Dsts() const;
1898     const std::deque<uint64_t> Durs() const;
1899     const std::deque<uint8_t> Types() const;
1900     const std::deque<uint8_t> Flags() const;
1901     const std::deque<uint8_t> Depths() const;
1902     const std::deque<uint32_t> FrameNos() const;
1903     const std::deque<std::string>& Srcs() const;
1904     void UpdateCallStackSliceId(uint64_t row, uint64_t callStackSliceId);
1905     void SetEndTimeAndFlag(uint64_t row, uint64_t ts, uint64_t expectDur, uint64_t expectEnd);
1906     void Erase(uint64_t row);
1907 
1908 public:
1909     static const uint32_t ABNORMAL_START_END_TIME = 3;
1910     typedef enum FrameSliceType { ACTURAL_SLICE, EXPECT_SLICE } FrameSliceType;
1911 
1912 private:
1913     std::deque<uint32_t> ipids_ = {};
1914     std::deque<uint64_t> dsts_ = {};
1915     std::deque<std::string> srcs_ = {};
1916     std::deque<uint32_t> vsyncIds_ = {};
1917     std::deque<uint64_t> callStackIds_ = {};
1918     std::deque<uint64_t> endTss_ = {};
1919     std::deque<uint64_t> durs_ = {};
1920     std::deque<uint8_t> types_ = {};
1921     std::deque<uint8_t> flags_ = {};
1922     std::deque<uint8_t> depths_ = {};
1923     std::deque<uint32_t> frameNos_ = {};
1924     const uint32_t INVALID_ROW = 2;
1925 };
1926 class FrameMaps : public CacheBase {
1927 public:
1928     size_t AppendNew(FrameSlice* frameSlice, uint64_t src, uint64_t dst);
1929     const std::deque<uint64_t>& SrcIndexs() const;
1930     const std::deque<uint64_t>& DstIndexs() const;
1931 
1932 private:
1933     std::deque<uint64_t> srcs_ = {};
1934     std::deque<uint64_t> dsts_ = {};
1935 };
1936 
1937 class AppStartup : public CacheBase {
1938 public:
1939     size_t AppendNewData(uint32_t ipid,
1940                          uint32_t tid,
1941                          uint32_t callId,
1942                          uint64_t startTime,
1943                          uint64_t endTime,
1944                          uint32_t startName,
1945                          DataIndex packedName);
1946     const std::deque<uint32_t>& Pids() const;
1947     const std::deque<uint32_t>& Tids() const;
1948     const std::deque<uint32_t>& CallIds() const;
1949     const std::deque<uint64_t>& StartTimes() const;
1950     const std::deque<uint64_t>& EndTimes() const;
1951     const std::deque<uint32_t>& StartNames() const;
1952     const std::deque<DataIndex>& PackedNames() const;
1953 
Clear()1954     void Clear() override
1955     {
1956         CacheBase::Clear();
1957         ipids_.clear();
1958         tids_.clear();
1959         callIds_.clear();
1960         startTimes_.clear();
1961         endTimes_.clear();
1962         startNames_.clear();
1963         packedNames_.clear();
1964     }
1965 
1966 private:
1967     std::deque<uint32_t> ipids_ = {};
1968     std::deque<uint32_t> tids_ = {};
1969     std::deque<uint32_t> callIds_ = {};
1970     std::deque<uint64_t> startTimes_ = {};
1971     std::deque<uint64_t> endTimes_ = {};
1972     std::deque<uint32_t> startNames_ = {};
1973     std::deque<DataIndex> packedNames_ = {};
1974 };
1975 
1976 class SoStaticInitalization : public CacheBase {
1977 public:
1978     size_t AppendNewData(uint32_t ipid,
1979                          uint32_t tid,
1980                          uint32_t callId,
1981                          uint64_t startTime,
1982                          uint64_t endTime,
1983                          DataIndex soName,
1984                          uint32_t depth);
1985     const std::deque<uint32_t>& Pids() const;
1986     const std::deque<uint32_t>& Tids() const;
1987     const std::deque<uint32_t>& CallIds() const;
1988     const std::deque<uint64_t>& StartTimes() const;
1989     const std::deque<uint64_t>& EndTimes() const;
1990     const std::deque<DataIndex>& SoNames() const;
1991     const std::deque<uint32_t> Depths() const;
1992 
Clear()1993     void Clear() override
1994     {
1995         CacheBase::Clear();
1996         ipids_.clear();
1997         tids_.clear();
1998         callIds_.clear();
1999         startTimes_.clear();
2000         endTimes_.clear();
2001         soNames_.clear();
2002         depths_.clear();
2003     }
2004 
2005 private:
2006     std::deque<uint32_t> ipids_ = {};
2007     std::deque<uint32_t> tids_ = {};
2008     std::deque<uint32_t> callIds_ = {};
2009     std::deque<uint64_t> startTimes_ = {};
2010     std::deque<uint64_t> endTimes_ = {};
2011     std::deque<DataIndex> soNames_ = {};
2012     std::deque<uint32_t> depths_ = {};
2013 };
2014 
2015 class JsHeapFiles : public CacheBase {
2016 public:
2017     size_t AppendNewData(uint32_t id,
2018                          std::string filePath,
2019                          uint64_t startTime,
2020                          uint64_t endTime,
2021                          uint32_t ipid,
2022                          uint64_t selfSizeCount);
2023     const std::deque<uint32_t>& IDs() const;
2024     const std::deque<std::string>& FilePaths() const;
2025     const std::deque<uint64_t>& StartTimes() const;
2026     const std::deque<uint64_t>& EndTimes() const;
2027     const std::deque<uint32_t>& Pids() const;
2028     const std::deque<uint64_t>& SelfSizeCount() const;
Clear()2029     void Clear() override
2030     {
2031         CacheBase::Clear();
2032         fileIds_.clear();
2033         filePaths_.clear();
2034         startTimes_.clear();
2035         endTimes_.clear();
2036         ipids_.clear();
2037         selfSizeCount_.clear();
2038     }
2039 
2040 private:
2041     std::deque<uint32_t> fileIds_ = {};
2042     std::deque<std::string> filePaths_ = {};
2043     std::deque<uint64_t> startTimes_ = {};
2044     std::deque<uint64_t> endTimes_ = {};
2045     std::deque<uint32_t> ipids_ = {};
2046     std::deque<uint64_t> selfSizeCount_ = {};
2047 };
2048 
2049 class JsHeapEdges : public CacheBase {
2050 public:
2051     size_t AppendNewData(uint32_t fileId,
2052                          uint32_t edgeIndex,
2053                          uint32_t type,
2054                          uint32_t nameOrIndex,
2055                          uint32_t toNode,
2056                          uint32_t fromNodeId,
2057                          uint32_t toNodeId);
2058     const std::deque<uint32_t>& FileIds() const;
2059     const std::deque<uint32_t>& EdgeIndexs() const;
2060     const std::deque<uint32_t>& Types() const;
2061     const std::deque<uint32_t>& NameOrIndexs() const;
2062     const std::deque<uint32_t>& ToNodes() const;
2063     const std::deque<uint32_t>& FromNodeIds() const;
2064     const std::deque<uint32_t>& ToNodeIds() const;
Clear()2065     void Clear() override
2066     {
2067         CacheBase::Clear();
2068         fileIds_.clear();
2069         edgeIndexs_.clear();
2070         types_.clear();
2071         nameOrIndexs_.clear();
2072         toNodes_.clear();
2073         fromNodeIds_.clear();
2074         toNodeIds_.clear();
2075     }
2076 
2077 private:
2078     std::deque<uint32_t> fileIds_ = {};
2079     std::deque<uint32_t> edgeIndexs_ = {};
2080     std::deque<uint32_t> types_ = {};
2081     std::deque<uint32_t> nameOrIndexs_ = {};
2082     std::deque<uint32_t> toNodes_ = {};
2083     std::deque<uint32_t> fromNodeIds_ = {};
2084     std::deque<uint32_t> toNodeIds_ = {};
2085 };
2086 
2087 class JsHeapInfo : public CacheBase {
2088 public:
2089     size_t AppendNewData(uint32_t fileId, std::string key, uint32_t type, int32_t intValue, std::string strValue);
2090     const std::deque<uint32_t>& FileIds() const;
2091     const std::deque<std::string>& Keys() const;
2092     const std::deque<uint32_t>& Types() const;
2093     const std::deque<int32_t>& IntValues() const;
2094     const std::deque<std::string>& StrValues() const;
Clear()2095     void Clear() override
2096     {
2097         CacheBase::Clear();
2098         fileIds_.clear();
2099         keys_.clear();
2100         types_.clear();
2101         intValues_.clear();
2102         strValues_.clear();
2103     }
2104 
2105 private:
2106     std::deque<uint32_t> fileIds_ = {};
2107     std::deque<std::string> keys_ = {};
2108     std::deque<uint32_t> types_ = {};
2109     std::deque<int32_t> intValues_ = {};
2110     std::deque<std::string> strValues_ = {};
2111 };
2112 
2113 class JsHeapLocation : public CacheBase {
2114 public:
2115     size_t AppendNewData(uint32_t fileId, uint32_t objectIndex, uint32_t scriptId, uint32_t line, uint32_t column);
2116     const std::deque<uint32_t>& FileIds() const;
2117     const std::deque<uint32_t>& ObjectIndexs() const;
2118     const std::deque<uint32_t>& ScriptIds() const;
2119     const std::deque<uint32_t>& Lines() const;
2120     const std::deque<uint32_t>& Columns() const;
Clear()2121     void Clear() override
2122     {
2123         CacheBase::Clear();
2124         fileIds_.clear();
2125         objectIndexs_.clear();
2126         scriptIds_.clear();
2127         lines_.clear();
2128         columns_.clear();
2129     }
2130 
2131 private:
2132     std::deque<uint32_t> fileIds_ = {};
2133     std::deque<uint32_t> objectIndexs_ = {};
2134     std::deque<uint32_t> scriptIds_ = {};
2135     std::deque<uint32_t> lines_ = {};
2136     std::deque<uint32_t> columns_ = {};
2137 };
2138 
2139 class JsHeapNodes : public CacheBase {
2140 public:
2141     size_t AppendNewData(uint32_t fileId,
2142                          uint32_t nodeIndex,
2143                          uint32_t type,
2144                          uint32_t name,
2145                          uint32_t id,
2146                          uint32_t selfSize,
2147                          uint32_t edgeCount,
2148                          uint32_t traceNodeId,
2149                          uint32_t detachedNess);
2150     const std::deque<uint32_t>& FileIds() const;
2151     const std::deque<uint32_t>& NodeIndexs() const;
2152     const std::deque<uint32_t>& Types() const;
2153     const std::deque<uint32_t>& Names() const;
2154     const std::deque<uint32_t>& NodeIds() const;
2155     const std::deque<uint32_t>& SelfSizes() const;
2156     const std::deque<uint32_t>& EdgeCounts() const;
2157     const std::deque<uint32_t>& TraceNodeIds() const;
2158     const std::deque<uint32_t>& DetachedNess() const;
Clear()2159     void Clear() override
2160     {
2161         CacheBase::Clear();
2162         fileIds_.clear();
2163         nodeIndexs_.clear();
2164         types_.clear();
2165         names_.clear();
2166         nodeIds_.clear();
2167         selfSizes_.clear();
2168         edgeCounts_.clear();
2169         traceNodeIds_.clear();
2170         detachedNess_.clear();
2171     }
2172 
2173 private:
2174     std::deque<uint32_t> fileIds_ = {};
2175     std::deque<uint32_t> nodeIndexs_ = {};
2176     std::deque<uint32_t> types_ = {};
2177     std::deque<uint32_t> names_ = {};
2178     std::deque<uint32_t> nodeIds_ = {};
2179     std::deque<uint32_t> selfSizes_ = {};
2180     std::deque<uint32_t> edgeCounts_ = {};
2181     std::deque<uint32_t> traceNodeIds_ = {};
2182     std::deque<uint32_t> detachedNess_ = {};
2183 };
2184 
2185 class JsHeapSample : public CacheBase {
2186 public:
2187     size_t AppendNewData(uint32_t fileId, uint64_t timeStampUs, uint32_t lastAssignedId);
2188     const std::deque<uint32_t>& FileIds() const;
2189     const std::deque<uint64_t>& TimeStampUs() const;
2190     const std::deque<uint32_t>& LastAssignedIds() const;
Clear()2191     void Clear() override
2192     {
2193         CacheBase::Clear();
2194         fileIds_.clear();
2195         timeStampUs_.clear();
2196         lastAssignedIds_.clear();
2197     }
2198 
2199 private:
2200     std::deque<uint32_t> fileIds_ = {};
2201     std::deque<uint64_t> timeStampUs_ = {};
2202     std::deque<uint32_t> lastAssignedIds_ = {};
2203 };
2204 
2205 class JsHeapString : public CacheBase {
2206 public:
2207     size_t AppendNewData(uint32_t fileId, uint32_t fileIndex, std::string string);
2208     const std::deque<uint32_t>& FileIds() const;
2209     const std::deque<uint64_t>& FileIndexs() const;
2210     const std::deque<std::string>& Strings() const;
Clear()2211     void Clear() override
2212     {
2213         CacheBase::Clear();
2214         fileIds_.clear();
2215         fileIndexs_.clear();
2216         strings_.clear();
2217     }
2218 
2219 private:
2220     std::deque<uint32_t> fileIds_ = {};
2221     std::deque<uint64_t> fileIndexs_ = {};
2222     std::deque<std::string> strings_ = {};
2223 };
2224 
2225 class JsHeapTraceFuncInfo : public CacheBase {
2226 public:
2227     size_t AppendNewData(uint32_t fileId,
2228                          uint32_t functionIndex,
2229                          uint32_t functionId,
2230                          uint32_t name,
2231                          uint32_t scriptName,
2232                          uint32_t scriptId,
2233                          uint32_t line,
2234                          uint32_t column);
2235     const std::deque<uint32_t>& FileIds() const;
2236     const std::deque<uint32_t>& FunctionIndexs() const;
2237     const std::deque<uint32_t>& FunctionIds() const;
2238     const std::deque<uint32_t>& Names() const;
2239     const std::deque<uint32_t>& ScriptNames() const;
2240     const std::deque<uint32_t>& ScriptIds() const;
2241     const std::deque<uint32_t>& Lines() const;
2242     const std::deque<uint32_t>& Columns() const;
Clear()2243     void Clear() override
2244     {
2245         CacheBase::Clear();
2246         fileIds_.clear();
2247         functionIndexs_.clear();
2248         functionIds_.clear();
2249         names_.clear();
2250         scriptNames_.clear();
2251         scriptIds_.clear();
2252         lines_.clear();
2253         columns_.clear();
2254     }
2255 
2256 private:
2257     std::deque<uint32_t> fileIds_ = {};
2258     std::deque<uint32_t> functionIndexs_ = {};
2259     std::deque<uint32_t> functionIds_ = {};
2260     std::deque<uint32_t> names_ = {};
2261     std::deque<uint32_t> scriptNames_ = {};
2262     std::deque<uint32_t> scriptIds_ = {};
2263     std::deque<uint32_t> lines_ = {};
2264     std::deque<uint32_t> columns_ = {};
2265 };
2266 
2267 class JsHeapTraceNode : public CacheBase {
2268 public:
2269     size_t AppendNewData(uint32_t fileId,
2270                          uint32_t traceNodeId,
2271                          uint32_t functionInfoIndex,
2272                          uint32_t count,
2273                          uint32_t size,
2274                          int32_t parentId);
2275     const std::deque<uint32_t>& FileIds() const;
2276     const std::deque<uint32_t>& TraceNodeIDs() const;
2277     const std::deque<uint32_t>& FunctionInfoIndexs() const;
2278     const std::deque<uint32_t>& Counts() const;
2279     const std::deque<uint32_t>& NodeSizes() const;
2280     const std::deque<int32_t>& ParentIds() const;
Clear()2281     void Clear() override
2282     {
2283         CacheBase::Clear();
2284         fileIds_.clear();
2285         traceNodeIds_.clear();
2286         functionInfoIndexs_.clear();
2287         counts_.clear();
2288         sizes_.clear();
2289         parentIds_.clear();
2290     }
2291 
2292 private:
2293     std::deque<uint32_t> fileIds_ = {};
2294     std::deque<uint32_t> traceNodeIds_ = {};
2295     std::deque<uint32_t> functionInfoIndexs_ = {};
2296     std::deque<uint32_t> counts_ = {};
2297     std::deque<uint32_t> sizes_ = {};
2298     std::deque<int32_t> parentIds_ = {};
2299 };
2300 
2301 class GPUSlice {
2302 public:
2303     size_t AppendNew(uint32_t frameRow, uint64_t dur);
2304     const std::deque<uint32_t>& FrameRows() const;
2305     const std::deque<uint64_t>& Durs() const;
2306     const size_t Size() const;
2307 
2308 private:
2309     std::deque<uint32_t> frameRows_ = {};
2310     std::deque<uint64_t> durs_ = {};
2311 };
2312 
2313 class TaskPoolInfo : public CacheBase {
2314 public:
2315     size_t AppendAllocationTaskData(uint32_t allocationTaskRow,
2316                                     uint32_t allocationTaskId,
2317                                     uint32_t executeId,
2318                                     uint32_t priority,
2319                                     uint32_t executeState);
2320     size_t AppendExecuteTaskData(uint32_t executeTaskRow, uint32_t executeTaskId, uint32_t executeId);
2321     size_t AppendReturnTaskData(uint32_t returnTaskRow,
2322                                 uint32_t returnTaskId,
2323                                 uint32_t executeId,
2324                                 uint32_t returnState);
2325     void UpdateAllocationTaskData(uint32_t index,
2326                                   uint32_t allocationTaskRow,
2327                                   uint32_t allocationTaskId,
2328                                   uint32_t priority,
2329                                   uint32_t executeState);
2330     void UpdateExecuteTaskData(uint32_t index, uint32_t executeTaskRow, uint32_t executeTaskId);
2331     void UpdateReturnTaskData(uint32_t index, uint32_t returnTaskRow, uint32_t returnTaskId, uint32_t returnState);
2332 
2333     const std::deque<uint32_t>& AllocationTaskRows() const;
2334     const std::deque<uint32_t>& ExecuteTaskRows() const;
2335     const std::deque<uint32_t>& ReturnTaskRows() const;
2336     const std::deque<uint32_t>& AllocationTaskIds() const;
2337     const std::deque<uint32_t>& ExecuteTaskIds() const;
2338     const std::deque<uint32_t>& ReturnTaskIds() const;
2339     const std::deque<uint32_t>& ExecuteIds() const;
2340     const std::deque<uint32_t>& Prioritys() const;
2341     const std::deque<uint32_t>& ExecuteStates() const;
2342     const std::deque<uint32_t>& ReturnStates() const;
Clear()2343     void Clear() override
2344     {
2345         TaskPoolInfo::Clear();
2346         allocationTaskRows_.clear();
2347         executeTaskRows_.clear();
2348         returnTaskRows_.clear();
2349         allocationTaskIds_.clear();
2350         executeTaskIds_.clear();
2351         returnTaskIds_.clear();
2352         executeIds_.clear();
2353         prioritys_.clear();
2354         executeStates_.clear();
2355         returnStates_.clear();
2356     }
2357 
2358 private:
2359     std::deque<uint32_t> allocationTaskRows_ = {};
2360     std::deque<uint32_t> executeTaskRows_ = {};
2361     std::deque<uint32_t> returnTaskRows_ = {};
2362     std::deque<uint32_t> allocationTaskIds_ = {};
2363     std::deque<uint32_t> executeTaskIds_ = {};
2364     std::deque<uint32_t> returnTaskIds_ = {};
2365     std::deque<uint32_t> executeIds_ = {};
2366     std::deque<uint32_t> prioritys_ = {};
2367     std::deque<uint32_t> executeStates_ = {};
2368     std::deque<uint32_t> returnStates_ = {};
2369 };
2370 } // namespace TraceStdtype
2371 } // namespace SysTuning
2372 
2373 #endif // TRACE_STDTYPE_H
2374