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