1 #ifndef SRC_TRACE_PROCESSOR_TABLES_PROFILER_TABLES_PY_H_ 2 #define SRC_TRACE_PROCESSOR_TABLES_PROFILER_TABLES_PY_H_ 3 4 #include <array> 5 #include <cstddef> 6 #include <cstdint> 7 #include <memory> 8 #include <optional> 9 #include <type_traits> 10 #include <utility> 11 #include <vector> 12 13 #include "perfetto/base/logging.h" 14 #include "perfetto/trace_processor/basic_types.h" 15 #include "perfetto/trace_processor/ref_counted.h" 16 #include "src/trace_processor/containers/bit_vector.h" 17 #include "src/trace_processor/containers/row_map.h" 18 #include "src/trace_processor/containers/string_pool.h" 19 #include "src/trace_processor/db/column/arrangement_overlay.h" 20 #include "src/trace_processor/db/column/data_layer.h" 21 #include "src/trace_processor/db/column/dense_null_overlay.h" 22 #include "src/trace_processor/db/column/numeric_storage.h" 23 #include "src/trace_processor/db/column/id_storage.h" 24 #include "src/trace_processor/db/column/null_overlay.h" 25 #include "src/trace_processor/db/column/range_overlay.h" 26 #include "src/trace_processor/db/column/selector_overlay.h" 27 #include "src/trace_processor/db/column/set_id_storage.h" 28 #include "src/trace_processor/db/column/string_storage.h" 29 #include "src/trace_processor/db/column/types.h" 30 #include "src/trace_processor/db/column_storage.h" 31 #include "src/trace_processor/db/column.h" 32 #include "src/trace_processor/db/table.h" 33 #include "src/trace_processor/db/typed_column.h" 34 #include "src/trace_processor/db/typed_column_internal.h" 35 #include "src/trace_processor/tables/macros_internal.h" 36 37 #include "src/trace_processor/tables/track_tables_py.h" 38 39 namespace perfetto::trace_processor::tables { 40 41 class StackProfileMappingTable : public macros_internal::MacroTable { 42 public: 43 static constexpr uint32_t kColumnCount = 9; 44 45 struct Id : public BaseId { 46 Id() = default; IdId47 explicit constexpr Id(uint32_t v) : BaseId(v) {} 48 }; 49 static_assert(std::is_trivially_destructible_v<Id>, 50 "Inheritance used without trivial destruction"); 51 52 struct ColumnIndex { 53 static constexpr uint32_t id = 0; 54 static constexpr uint32_t type = 1; 55 static constexpr uint32_t build_id = 2; 56 static constexpr uint32_t exact_offset = 3; 57 static constexpr uint32_t start_offset = 4; 58 static constexpr uint32_t start = 5; 59 static constexpr uint32_t end = 6; 60 static constexpr uint32_t load_bias = 7; 61 static constexpr uint32_t name = 8; 62 }; 63 struct ColumnType { 64 using id = IdColumn<StackProfileMappingTable::Id>; 65 using type = TypedColumn<StringPool::Id>; 66 using build_id = TypedColumn<StringPool::Id>; 67 using exact_offset = TypedColumn<int64_t>; 68 using start_offset = TypedColumn<int64_t>; 69 using start = TypedColumn<int64_t>; 70 using end = TypedColumn<int64_t>; 71 using load_bias = TypedColumn<int64_t>; 72 using name = TypedColumn<StringPool::Id>; 73 }; 74 struct Row : public macros_internal::RootParentTable::Row { 75 Row(StringPool::Id in_build_id = {}, 76 int64_t in_exact_offset = {}, 77 int64_t in_start_offset = {}, 78 int64_t in_start = {}, 79 int64_t in_end = {}, 80 int64_t in_load_bias = {}, 81 StringPool::Id in_name = {}, 82 std::nullptr_t = nullptr) RowRow83 : macros_internal::RootParentTable::Row(), 84 build_id(in_build_id), 85 exact_offset(in_exact_offset), 86 start_offset(in_start_offset), 87 start(in_start), 88 end(in_end), 89 load_bias(in_load_bias), 90 name(in_name) { 91 type_ = "stack_profile_mapping"; 92 } 93 StringPool::Id build_id; 94 int64_t exact_offset; 95 int64_t start_offset; 96 int64_t start; 97 int64_t end; 98 int64_t load_bias; 99 StringPool::Id name; 100 101 bool operator==(const StackProfileMappingTable::Row& other) const { 102 return type() == other.type() && ColumnType::build_id::Equals(build_id, other.build_id) && 103 ColumnType::exact_offset::Equals(exact_offset, other.exact_offset) && 104 ColumnType::start_offset::Equals(start_offset, other.start_offset) && 105 ColumnType::start::Equals(start, other.start) && 106 ColumnType::end::Equals(end, other.end) && 107 ColumnType::load_bias::Equals(load_bias, other.load_bias) && 108 ColumnType::name::Equals(name, other.name); 109 } 110 }; 111 struct ColumnFlag { 112 static constexpr uint32_t build_id = ColumnType::build_id::default_flags(); 113 static constexpr uint32_t exact_offset = ColumnType::exact_offset::default_flags(); 114 static constexpr uint32_t start_offset = ColumnType::start_offset::default_flags(); 115 static constexpr uint32_t start = ColumnType::start::default_flags(); 116 static constexpr uint32_t end = ColumnType::end::default_flags(); 117 static constexpr uint32_t load_bias = ColumnType::load_bias::default_flags(); 118 static constexpr uint32_t name = ColumnType::name::default_flags(); 119 }; 120 121 class RowNumber; 122 class ConstRowReference; 123 class RowReference; 124 125 class RowNumber : public macros_internal::AbstractRowNumber< 126 StackProfileMappingTable, ConstRowReference, RowReference> { 127 public: RowNumber(uint32_t row_number)128 explicit RowNumber(uint32_t row_number) 129 : AbstractRowNumber(row_number) {} 130 }; 131 static_assert(std::is_trivially_destructible_v<RowNumber>, 132 "Inheritance used without trivial destruction"); 133 134 class ConstRowReference : public macros_internal::AbstractConstRowReference< 135 StackProfileMappingTable, RowNumber> { 136 public: ConstRowReference(const StackProfileMappingTable * table,uint32_t row_number)137 ConstRowReference(const StackProfileMappingTable* table, uint32_t row_number) 138 : AbstractConstRowReference(table, row_number) {} 139 id()140 ColumnType::id::type id() const { 141 return table()->id()[row_number_]; 142 } type()143 ColumnType::type::type type() const { 144 return table()->type()[row_number_]; 145 } build_id()146 ColumnType::build_id::type build_id() const { 147 return table()->build_id()[row_number_]; 148 } exact_offset()149 ColumnType::exact_offset::type exact_offset() const { 150 return table()->exact_offset()[row_number_]; 151 } start_offset()152 ColumnType::start_offset::type start_offset() const { 153 return table()->start_offset()[row_number_]; 154 } start()155 ColumnType::start::type start() const { 156 return table()->start()[row_number_]; 157 } end()158 ColumnType::end::type end() const { 159 return table()->end()[row_number_]; 160 } load_bias()161 ColumnType::load_bias::type load_bias() const { 162 return table()->load_bias()[row_number_]; 163 } name()164 ColumnType::name::type name() const { 165 return table()->name()[row_number_]; 166 } 167 }; 168 static_assert(std::is_trivially_destructible_v<ConstRowReference>, 169 "Inheritance used without trivial destruction"); 170 class RowReference : public ConstRowReference { 171 public: RowReference(const StackProfileMappingTable * table,uint32_t row_number)172 RowReference(const StackProfileMappingTable* table, uint32_t row_number) 173 : ConstRowReference(table, row_number) {} 174 set_build_id(ColumnType::build_id::non_optional_type v)175 void set_build_id( 176 ColumnType::build_id::non_optional_type v) { 177 return mutable_table()->mutable_build_id()->Set(row_number_, v); 178 } set_exact_offset(ColumnType::exact_offset::non_optional_type v)179 void set_exact_offset( 180 ColumnType::exact_offset::non_optional_type v) { 181 return mutable_table()->mutable_exact_offset()->Set(row_number_, v); 182 } set_start_offset(ColumnType::start_offset::non_optional_type v)183 void set_start_offset( 184 ColumnType::start_offset::non_optional_type v) { 185 return mutable_table()->mutable_start_offset()->Set(row_number_, v); 186 } set_start(ColumnType::start::non_optional_type v)187 void set_start( 188 ColumnType::start::non_optional_type v) { 189 return mutable_table()->mutable_start()->Set(row_number_, v); 190 } set_end(ColumnType::end::non_optional_type v)191 void set_end( 192 ColumnType::end::non_optional_type v) { 193 return mutable_table()->mutable_end()->Set(row_number_, v); 194 } set_load_bias(ColumnType::load_bias::non_optional_type v)195 void set_load_bias( 196 ColumnType::load_bias::non_optional_type v) { 197 return mutable_table()->mutable_load_bias()->Set(row_number_, v); 198 } set_name(ColumnType::name::non_optional_type v)199 void set_name( 200 ColumnType::name::non_optional_type v) { 201 return mutable_table()->mutable_name()->Set(row_number_, v); 202 } 203 204 private: mutable_table()205 StackProfileMappingTable* mutable_table() const { 206 return const_cast<StackProfileMappingTable*>(table()); 207 } 208 }; 209 static_assert(std::is_trivially_destructible_v<RowReference>, 210 "Inheritance used without trivial destruction"); 211 212 class ConstIterator; 213 class ConstIterator : public macros_internal::AbstractConstIterator< 214 ConstIterator, StackProfileMappingTable, RowNumber, ConstRowReference> { 215 public: id()216 ColumnType::id::type id() const { 217 const auto& col = table()->id(); 218 return col.GetAtIdx( 219 iterator_.StorageIndexForColumn(col.index_in_table())); 220 } type()221 ColumnType::type::type type() const { 222 const auto& col = table()->type(); 223 return col.GetAtIdx( 224 iterator_.StorageIndexForColumn(col.index_in_table())); 225 } build_id()226 ColumnType::build_id::type build_id() const { 227 const auto& col = table()->build_id(); 228 return col.GetAtIdx( 229 iterator_.StorageIndexForColumn(col.index_in_table())); 230 } exact_offset()231 ColumnType::exact_offset::type exact_offset() const { 232 const auto& col = table()->exact_offset(); 233 return col.GetAtIdx( 234 iterator_.StorageIndexForColumn(col.index_in_table())); 235 } start_offset()236 ColumnType::start_offset::type start_offset() const { 237 const auto& col = table()->start_offset(); 238 return col.GetAtIdx( 239 iterator_.StorageIndexForColumn(col.index_in_table())); 240 } start()241 ColumnType::start::type start() const { 242 const auto& col = table()->start(); 243 return col.GetAtIdx( 244 iterator_.StorageIndexForColumn(col.index_in_table())); 245 } end()246 ColumnType::end::type end() const { 247 const auto& col = table()->end(); 248 return col.GetAtIdx( 249 iterator_.StorageIndexForColumn(col.index_in_table())); 250 } load_bias()251 ColumnType::load_bias::type load_bias() const { 252 const auto& col = table()->load_bias(); 253 return col.GetAtIdx( 254 iterator_.StorageIndexForColumn(col.index_in_table())); 255 } name()256 ColumnType::name::type name() const { 257 const auto& col = table()->name(); 258 return col.GetAtIdx( 259 iterator_.StorageIndexForColumn(col.index_in_table())); 260 } 261 262 protected: ConstIterator(const StackProfileMappingTable * table,Table::Iterator iterator)263 explicit ConstIterator(const StackProfileMappingTable* table, 264 Table::Iterator iterator) 265 : AbstractConstIterator(table, std::move(iterator)) {} 266 CurrentRowNumber()267 uint32_t CurrentRowNumber() const { 268 return iterator_.StorageIndexForLastOverlay(); 269 } 270 271 private: 272 friend class StackProfileMappingTable; 273 friend class macros_internal::AbstractConstIterator< 274 ConstIterator, StackProfileMappingTable, RowNumber, ConstRowReference>; 275 }; 276 class Iterator : public ConstIterator { 277 public: row_reference()278 RowReference row_reference() const { 279 return {const_cast<StackProfileMappingTable*>(table()), CurrentRowNumber()}; 280 } 281 282 private: 283 friend class StackProfileMappingTable; 284 Iterator(StackProfileMappingTable * table,Table::Iterator iterator)285 explicit Iterator(StackProfileMappingTable* table, Table::Iterator iterator) 286 : ConstIterator(table, std::move(iterator)) {} 287 }; 288 289 struct IdAndRow { 290 Id id; 291 uint32_t row; 292 RowReference row_reference; 293 RowNumber row_number; 294 }; 295 GetColumns(StackProfileMappingTable * self,const macros_internal::MacroTable * parent)296 static std::vector<ColumnLegacy> GetColumns( 297 StackProfileMappingTable* self, 298 const macros_internal::MacroTable* parent) { 299 std::vector<ColumnLegacy> columns = 300 CopyColumnsFromParentOrAddRootColumns(self, parent); 301 uint32_t olay_idx = OverlayCount(parent); 302 AddColumnToVector(columns, "build_id", &self->build_id_, ColumnFlag::build_id, 303 static_cast<uint32_t>(columns.size()), olay_idx); 304 AddColumnToVector(columns, "exact_offset", &self->exact_offset_, ColumnFlag::exact_offset, 305 static_cast<uint32_t>(columns.size()), olay_idx); 306 AddColumnToVector(columns, "start_offset", &self->start_offset_, ColumnFlag::start_offset, 307 static_cast<uint32_t>(columns.size()), olay_idx); 308 AddColumnToVector(columns, "start", &self->start_, ColumnFlag::start, 309 static_cast<uint32_t>(columns.size()), olay_idx); 310 AddColumnToVector(columns, "end", &self->end_, ColumnFlag::end, 311 static_cast<uint32_t>(columns.size()), olay_idx); 312 AddColumnToVector(columns, "load_bias", &self->load_bias_, ColumnFlag::load_bias, 313 static_cast<uint32_t>(columns.size()), olay_idx); 314 AddColumnToVector(columns, "name", &self->name_, ColumnFlag::name, 315 static_cast<uint32_t>(columns.size()), olay_idx); 316 return columns; 317 } 318 StackProfileMappingTable(StringPool * pool)319 PERFETTO_NO_INLINE explicit StackProfileMappingTable(StringPool* pool) 320 : macros_internal::MacroTable( 321 pool, 322 GetColumns(this, nullptr), 323 nullptr), 324 build_id_(ColumnStorage<ColumnType::build_id::stored_type>::Create<false>()), 325 exact_offset_(ColumnStorage<ColumnType::exact_offset::stored_type>::Create<false>()), 326 start_offset_(ColumnStorage<ColumnType::start_offset::stored_type>::Create<false>()), 327 start_(ColumnStorage<ColumnType::start::stored_type>::Create<false>()), 328 end_(ColumnStorage<ColumnType::end::stored_type>::Create<false>()), 329 load_bias_(ColumnStorage<ColumnType::load_bias::stored_type>::Create<false>()), 330 name_(ColumnStorage<ColumnType::name::stored_type>::Create<false>()) 331 , 332 id_storage_layer_(new column::IdStorage()), 333 type_storage_layer_( 334 new column::StringStorage(string_pool(), &type_.vector())), 335 build_id_storage_layer_( 336 new column::StringStorage(string_pool(), &build_id_.vector())), 337 exact_offset_storage_layer_( 338 new column::NumericStorage<ColumnType::exact_offset::non_optional_stored_type>( 339 &exact_offset_.vector(), 340 ColumnTypeHelper<ColumnType::exact_offset::stored_type>::ToColumnType(), 341 false)), 342 start_offset_storage_layer_( 343 new column::NumericStorage<ColumnType::start_offset::non_optional_stored_type>( 344 &start_offset_.vector(), 345 ColumnTypeHelper<ColumnType::start_offset::stored_type>::ToColumnType(), 346 false)), 347 start_storage_layer_( 348 new column::NumericStorage<ColumnType::start::non_optional_stored_type>( 349 &start_.vector(), 350 ColumnTypeHelper<ColumnType::start::stored_type>::ToColumnType(), 351 false)), 352 end_storage_layer_( 353 new column::NumericStorage<ColumnType::end::non_optional_stored_type>( 354 &end_.vector(), 355 ColumnTypeHelper<ColumnType::end::stored_type>::ToColumnType(), 356 false)), 357 load_bias_storage_layer_( 358 new column::NumericStorage<ColumnType::load_bias::non_optional_stored_type>( 359 &load_bias_.vector(), 360 ColumnTypeHelper<ColumnType::load_bias::stored_type>::ToColumnType(), 361 false)), 362 name_storage_layer_( 363 new column::StringStorage(string_pool(), &name_.vector())) 364 { 365 static_assert( 366 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::build_id::stored_type>( 367 ColumnFlag::build_id), 368 "Column type and flag combination is not valid"); 369 static_assert( 370 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::exact_offset::stored_type>( 371 ColumnFlag::exact_offset), 372 "Column type and flag combination is not valid"); 373 static_assert( 374 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::start_offset::stored_type>( 375 ColumnFlag::start_offset), 376 "Column type and flag combination is not valid"); 377 static_assert( 378 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::start::stored_type>( 379 ColumnFlag::start), 380 "Column type and flag combination is not valid"); 381 static_assert( 382 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::end::stored_type>( 383 ColumnFlag::end), 384 "Column type and flag combination is not valid"); 385 static_assert( 386 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::load_bias::stored_type>( 387 ColumnFlag::load_bias), 388 "Column type and flag combination is not valid"); 389 static_assert( 390 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::name::stored_type>( 391 ColumnFlag::name), 392 "Column type and flag combination is not valid"); 393 OnConstructionCompletedRegularConstructor( 394 {id_storage_layer_,type_storage_layer_,build_id_storage_layer_,exact_offset_storage_layer_,start_offset_storage_layer_,start_storage_layer_,end_storage_layer_,load_bias_storage_layer_,name_storage_layer_}, 395 {{},{},{},{},{},{},{},{},{}}); 396 } 397 ~StackProfileMappingTable() override; 398 Name()399 static const char* Name() { return "stack_profile_mapping"; } 400 ComputeStaticSchema()401 static Table::Schema ComputeStaticSchema() { 402 Table::Schema schema; 403 schema.columns.emplace_back(Table::Schema::Column{ 404 "id", SqlValue::Type::kLong, true, true, false, false}); 405 schema.columns.emplace_back(Table::Schema::Column{ 406 "type", SqlValue::Type::kString, false, false, false, false}); 407 schema.columns.emplace_back(Table::Schema::Column{ 408 "build_id", ColumnType::build_id::SqlValueType(), false, 409 false, 410 false, 411 false}); 412 schema.columns.emplace_back(Table::Schema::Column{ 413 "exact_offset", ColumnType::exact_offset::SqlValueType(), false, 414 false, 415 false, 416 false}); 417 schema.columns.emplace_back(Table::Schema::Column{ 418 "start_offset", ColumnType::start_offset::SqlValueType(), false, 419 false, 420 false, 421 false}); 422 schema.columns.emplace_back(Table::Schema::Column{ 423 "start", ColumnType::start::SqlValueType(), false, 424 false, 425 false, 426 false}); 427 schema.columns.emplace_back(Table::Schema::Column{ 428 "end", ColumnType::end::SqlValueType(), false, 429 false, 430 false, 431 false}); 432 schema.columns.emplace_back(Table::Schema::Column{ 433 "load_bias", ColumnType::load_bias::SqlValueType(), false, 434 false, 435 false, 436 false}); 437 schema.columns.emplace_back(Table::Schema::Column{ 438 "name", ColumnType::name::SqlValueType(), false, 439 false, 440 false, 441 false}); 442 return schema; 443 } 444 IterateRows()445 ConstIterator IterateRows() const { 446 return ConstIterator(this, Table::IterateRows()); 447 } 448 IterateRows()449 Iterator IterateRows() { return Iterator(this, Table::IterateRows()); } 450 FilterToIterator(const Query & q)451 ConstIterator FilterToIterator(const Query& q) const { 452 return ConstIterator(this, QueryToIterator(q)); 453 } 454 FilterToIterator(const Query & q)455 Iterator FilterToIterator(const Query& q) { 456 return Iterator(this, QueryToIterator(q)); 457 } 458 ShrinkToFit()459 void ShrinkToFit() { 460 type_.ShrinkToFit(); 461 build_id_.ShrinkToFit(); 462 exact_offset_.ShrinkToFit(); 463 start_offset_.ShrinkToFit(); 464 start_.ShrinkToFit(); 465 end_.ShrinkToFit(); 466 load_bias_.ShrinkToFit(); 467 name_.ShrinkToFit(); 468 } 469 470 ConstRowReference operator[](uint32_t r) const { 471 return ConstRowReference(this, r); 472 } 473 RowReference operator[](uint32_t r) { return RowReference(this, r); } 474 ConstRowReference operator[](RowNumber r) const { 475 return ConstRowReference(this, r.row_number()); 476 } 477 RowReference operator[](RowNumber r) { 478 return RowReference(this, r.row_number()); 479 } 480 FindById(Id find_id)481 std::optional<ConstRowReference> FindById(Id find_id) const { 482 std::optional<uint32_t> row = id().IndexOf(find_id); 483 return row ? std::make_optional(ConstRowReference(this, *row)) 484 : std::nullopt; 485 } 486 FindById(Id find_id)487 std::optional<RowReference> FindById(Id find_id) { 488 std::optional<uint32_t> row = id().IndexOf(find_id); 489 return row ? std::make_optional(RowReference(this, *row)) : std::nullopt; 490 } 491 Insert(const Row & row)492 IdAndRow Insert(const Row& row) { 493 uint32_t row_number = row_count(); 494 Id id = Id{row_number}; 495 type_.Append(string_pool()->InternString(row.type())); 496 mutable_build_id()->Append(row.build_id); 497 mutable_exact_offset()->Append(row.exact_offset); 498 mutable_start_offset()->Append(row.start_offset); 499 mutable_start()->Append(row.start); 500 mutable_end()->Append(row.end); 501 mutable_load_bias()->Append(row.load_bias); 502 mutable_name()->Append(row.name); 503 UpdateSelfOverlayAfterInsert(); 504 return IdAndRow{id, row_number, RowReference(this, row_number), 505 RowNumber(row_number)}; 506 } 507 508 509 id()510 const IdColumn<StackProfileMappingTable::Id>& id() const { 511 return static_cast<const ColumnType::id&>(columns()[ColumnIndex::id]); 512 } type()513 const TypedColumn<StringPool::Id>& type() const { 514 return static_cast<const ColumnType::type&>(columns()[ColumnIndex::type]); 515 } build_id()516 const TypedColumn<StringPool::Id>& build_id() const { 517 return static_cast<const ColumnType::build_id&>(columns()[ColumnIndex::build_id]); 518 } exact_offset()519 const TypedColumn<int64_t>& exact_offset() const { 520 return static_cast<const ColumnType::exact_offset&>(columns()[ColumnIndex::exact_offset]); 521 } start_offset()522 const TypedColumn<int64_t>& start_offset() const { 523 return static_cast<const ColumnType::start_offset&>(columns()[ColumnIndex::start_offset]); 524 } start()525 const TypedColumn<int64_t>& start() const { 526 return static_cast<const ColumnType::start&>(columns()[ColumnIndex::start]); 527 } end()528 const TypedColumn<int64_t>& end() const { 529 return static_cast<const ColumnType::end&>(columns()[ColumnIndex::end]); 530 } load_bias()531 const TypedColumn<int64_t>& load_bias() const { 532 return static_cast<const ColumnType::load_bias&>(columns()[ColumnIndex::load_bias]); 533 } name()534 const TypedColumn<StringPool::Id>& name() const { 535 return static_cast<const ColumnType::name&>(columns()[ColumnIndex::name]); 536 } 537 mutable_build_id()538 TypedColumn<StringPool::Id>* mutable_build_id() { 539 return static_cast<ColumnType::build_id*>( 540 GetColumn(ColumnIndex::build_id)); 541 } mutable_exact_offset()542 TypedColumn<int64_t>* mutable_exact_offset() { 543 return static_cast<ColumnType::exact_offset*>( 544 GetColumn(ColumnIndex::exact_offset)); 545 } mutable_start_offset()546 TypedColumn<int64_t>* mutable_start_offset() { 547 return static_cast<ColumnType::start_offset*>( 548 GetColumn(ColumnIndex::start_offset)); 549 } mutable_start()550 TypedColumn<int64_t>* mutable_start() { 551 return static_cast<ColumnType::start*>( 552 GetColumn(ColumnIndex::start)); 553 } mutable_end()554 TypedColumn<int64_t>* mutable_end() { 555 return static_cast<ColumnType::end*>( 556 GetColumn(ColumnIndex::end)); 557 } mutable_load_bias()558 TypedColumn<int64_t>* mutable_load_bias() { 559 return static_cast<ColumnType::load_bias*>( 560 GetColumn(ColumnIndex::load_bias)); 561 } mutable_name()562 TypedColumn<StringPool::Id>* mutable_name() { 563 return static_cast<ColumnType::name*>( 564 GetColumn(ColumnIndex::name)); 565 } 566 567 private: 568 569 570 ColumnStorage<ColumnType::build_id::stored_type> build_id_; 571 ColumnStorage<ColumnType::exact_offset::stored_type> exact_offset_; 572 ColumnStorage<ColumnType::start_offset::stored_type> start_offset_; 573 ColumnStorage<ColumnType::start::stored_type> start_; 574 ColumnStorage<ColumnType::end::stored_type> end_; 575 ColumnStorage<ColumnType::load_bias::stored_type> load_bias_; 576 ColumnStorage<ColumnType::name::stored_type> name_; 577 578 RefPtr<column::StorageLayer> id_storage_layer_; 579 RefPtr<column::StorageLayer> type_storage_layer_; 580 RefPtr<column::StorageLayer> build_id_storage_layer_; 581 RefPtr<column::StorageLayer> exact_offset_storage_layer_; 582 RefPtr<column::StorageLayer> start_offset_storage_layer_; 583 RefPtr<column::StorageLayer> start_storage_layer_; 584 RefPtr<column::StorageLayer> end_storage_layer_; 585 RefPtr<column::StorageLayer> load_bias_storage_layer_; 586 RefPtr<column::StorageLayer> name_storage_layer_; 587 588 589 }; 590 591 592 class StackProfileFrameTable : public macros_internal::MacroTable { 593 public: 594 static constexpr uint32_t kColumnCount = 7; 595 596 struct Id : public BaseId { 597 Id() = default; IdId598 explicit constexpr Id(uint32_t v) : BaseId(v) {} 599 }; 600 static_assert(std::is_trivially_destructible_v<Id>, 601 "Inheritance used without trivial destruction"); 602 603 struct ColumnIndex { 604 static constexpr uint32_t id = 0; 605 static constexpr uint32_t type = 1; 606 static constexpr uint32_t name = 2; 607 static constexpr uint32_t mapping = 3; 608 static constexpr uint32_t rel_pc = 4; 609 static constexpr uint32_t symbol_set_id = 5; 610 static constexpr uint32_t deobfuscated_name = 6; 611 }; 612 struct ColumnType { 613 using id = IdColumn<StackProfileFrameTable::Id>; 614 using type = TypedColumn<StringPool::Id>; 615 using name = TypedColumn<StringPool::Id>; 616 using mapping = TypedColumn<StackProfileMappingTable::Id>; 617 using rel_pc = TypedColumn<int64_t>; 618 using symbol_set_id = TypedColumn<std::optional<uint32_t>>; 619 using deobfuscated_name = TypedColumn<std::optional<StringPool::Id>>; 620 }; 621 struct Row : public macros_internal::RootParentTable::Row { 622 Row(StringPool::Id in_name = {}, 623 StackProfileMappingTable::Id in_mapping = {}, 624 int64_t in_rel_pc = {}, 625 std::optional<uint32_t> in_symbol_set_id = {}, 626 std::optional<StringPool::Id> in_deobfuscated_name = {}, 627 std::nullptr_t = nullptr) RowRow628 : macros_internal::RootParentTable::Row(), 629 name(in_name), 630 mapping(in_mapping), 631 rel_pc(in_rel_pc), 632 symbol_set_id(in_symbol_set_id), 633 deobfuscated_name(in_deobfuscated_name) { 634 type_ = "stack_profile_frame"; 635 } 636 StringPool::Id name; 637 StackProfileMappingTable::Id mapping; 638 int64_t rel_pc; 639 std::optional<uint32_t> symbol_set_id; 640 std::optional<StringPool::Id> deobfuscated_name; 641 642 bool operator==(const StackProfileFrameTable::Row& other) const { 643 return type() == other.type() && ColumnType::name::Equals(name, other.name) && 644 ColumnType::mapping::Equals(mapping, other.mapping) && 645 ColumnType::rel_pc::Equals(rel_pc, other.rel_pc) && 646 ColumnType::symbol_set_id::Equals(symbol_set_id, other.symbol_set_id) && 647 ColumnType::deobfuscated_name::Equals(deobfuscated_name, other.deobfuscated_name); 648 } 649 }; 650 struct ColumnFlag { 651 static constexpr uint32_t name = ColumnType::name::default_flags(); 652 static constexpr uint32_t mapping = ColumnType::mapping::default_flags(); 653 static constexpr uint32_t rel_pc = ColumnType::rel_pc::default_flags(); 654 static constexpr uint32_t symbol_set_id = static_cast<uint32_t>(ColumnLegacy::Flag::kDense) | ColumnType::symbol_set_id::default_flags(); 655 static constexpr uint32_t deobfuscated_name = ColumnType::deobfuscated_name::default_flags(); 656 }; 657 658 class RowNumber; 659 class ConstRowReference; 660 class RowReference; 661 662 class RowNumber : public macros_internal::AbstractRowNumber< 663 StackProfileFrameTable, ConstRowReference, RowReference> { 664 public: RowNumber(uint32_t row_number)665 explicit RowNumber(uint32_t row_number) 666 : AbstractRowNumber(row_number) {} 667 }; 668 static_assert(std::is_trivially_destructible_v<RowNumber>, 669 "Inheritance used without trivial destruction"); 670 671 class ConstRowReference : public macros_internal::AbstractConstRowReference< 672 StackProfileFrameTable, RowNumber> { 673 public: ConstRowReference(const StackProfileFrameTable * table,uint32_t row_number)674 ConstRowReference(const StackProfileFrameTable* table, uint32_t row_number) 675 : AbstractConstRowReference(table, row_number) {} 676 id()677 ColumnType::id::type id() const { 678 return table()->id()[row_number_]; 679 } type()680 ColumnType::type::type type() const { 681 return table()->type()[row_number_]; 682 } name()683 ColumnType::name::type name() const { 684 return table()->name()[row_number_]; 685 } mapping()686 ColumnType::mapping::type mapping() const { 687 return table()->mapping()[row_number_]; 688 } rel_pc()689 ColumnType::rel_pc::type rel_pc() const { 690 return table()->rel_pc()[row_number_]; 691 } symbol_set_id()692 ColumnType::symbol_set_id::type symbol_set_id() const { 693 return table()->symbol_set_id()[row_number_]; 694 } deobfuscated_name()695 ColumnType::deobfuscated_name::type deobfuscated_name() const { 696 return table()->deobfuscated_name()[row_number_]; 697 } 698 }; 699 static_assert(std::is_trivially_destructible_v<ConstRowReference>, 700 "Inheritance used without trivial destruction"); 701 class RowReference : public ConstRowReference { 702 public: RowReference(const StackProfileFrameTable * table,uint32_t row_number)703 RowReference(const StackProfileFrameTable* table, uint32_t row_number) 704 : ConstRowReference(table, row_number) {} 705 set_name(ColumnType::name::non_optional_type v)706 void set_name( 707 ColumnType::name::non_optional_type v) { 708 return mutable_table()->mutable_name()->Set(row_number_, v); 709 } set_mapping(ColumnType::mapping::non_optional_type v)710 void set_mapping( 711 ColumnType::mapping::non_optional_type v) { 712 return mutable_table()->mutable_mapping()->Set(row_number_, v); 713 } set_rel_pc(ColumnType::rel_pc::non_optional_type v)714 void set_rel_pc( 715 ColumnType::rel_pc::non_optional_type v) { 716 return mutable_table()->mutable_rel_pc()->Set(row_number_, v); 717 } set_symbol_set_id(ColumnType::symbol_set_id::non_optional_type v)718 void set_symbol_set_id( 719 ColumnType::symbol_set_id::non_optional_type v) { 720 return mutable_table()->mutable_symbol_set_id()->Set(row_number_, v); 721 } set_deobfuscated_name(ColumnType::deobfuscated_name::non_optional_type v)722 void set_deobfuscated_name( 723 ColumnType::deobfuscated_name::non_optional_type v) { 724 return mutable_table()->mutable_deobfuscated_name()->Set(row_number_, v); 725 } 726 727 private: mutable_table()728 StackProfileFrameTable* mutable_table() const { 729 return const_cast<StackProfileFrameTable*>(table()); 730 } 731 }; 732 static_assert(std::is_trivially_destructible_v<RowReference>, 733 "Inheritance used without trivial destruction"); 734 735 class ConstIterator; 736 class ConstIterator : public macros_internal::AbstractConstIterator< 737 ConstIterator, StackProfileFrameTable, RowNumber, ConstRowReference> { 738 public: id()739 ColumnType::id::type id() const { 740 const auto& col = table()->id(); 741 return col.GetAtIdx( 742 iterator_.StorageIndexForColumn(col.index_in_table())); 743 } type()744 ColumnType::type::type type() const { 745 const auto& col = table()->type(); 746 return col.GetAtIdx( 747 iterator_.StorageIndexForColumn(col.index_in_table())); 748 } name()749 ColumnType::name::type name() const { 750 const auto& col = table()->name(); 751 return col.GetAtIdx( 752 iterator_.StorageIndexForColumn(col.index_in_table())); 753 } mapping()754 ColumnType::mapping::type mapping() const { 755 const auto& col = table()->mapping(); 756 return col.GetAtIdx( 757 iterator_.StorageIndexForColumn(col.index_in_table())); 758 } rel_pc()759 ColumnType::rel_pc::type rel_pc() const { 760 const auto& col = table()->rel_pc(); 761 return col.GetAtIdx( 762 iterator_.StorageIndexForColumn(col.index_in_table())); 763 } symbol_set_id()764 ColumnType::symbol_set_id::type symbol_set_id() const { 765 const auto& col = table()->symbol_set_id(); 766 return col.GetAtIdx( 767 iterator_.StorageIndexForColumn(col.index_in_table())); 768 } deobfuscated_name()769 ColumnType::deobfuscated_name::type deobfuscated_name() const { 770 const auto& col = table()->deobfuscated_name(); 771 return col.GetAtIdx( 772 iterator_.StorageIndexForColumn(col.index_in_table())); 773 } 774 775 protected: ConstIterator(const StackProfileFrameTable * table,Table::Iterator iterator)776 explicit ConstIterator(const StackProfileFrameTable* table, 777 Table::Iterator iterator) 778 : AbstractConstIterator(table, std::move(iterator)) {} 779 CurrentRowNumber()780 uint32_t CurrentRowNumber() const { 781 return iterator_.StorageIndexForLastOverlay(); 782 } 783 784 private: 785 friend class StackProfileFrameTable; 786 friend class macros_internal::AbstractConstIterator< 787 ConstIterator, StackProfileFrameTable, RowNumber, ConstRowReference>; 788 }; 789 class Iterator : public ConstIterator { 790 public: row_reference()791 RowReference row_reference() const { 792 return {const_cast<StackProfileFrameTable*>(table()), CurrentRowNumber()}; 793 } 794 795 private: 796 friend class StackProfileFrameTable; 797 Iterator(StackProfileFrameTable * table,Table::Iterator iterator)798 explicit Iterator(StackProfileFrameTable* table, Table::Iterator iterator) 799 : ConstIterator(table, std::move(iterator)) {} 800 }; 801 802 struct IdAndRow { 803 Id id; 804 uint32_t row; 805 RowReference row_reference; 806 RowNumber row_number; 807 }; 808 GetColumns(StackProfileFrameTable * self,const macros_internal::MacroTable * parent)809 static std::vector<ColumnLegacy> GetColumns( 810 StackProfileFrameTable* self, 811 const macros_internal::MacroTable* parent) { 812 std::vector<ColumnLegacy> columns = 813 CopyColumnsFromParentOrAddRootColumns(self, parent); 814 uint32_t olay_idx = OverlayCount(parent); 815 AddColumnToVector(columns, "name", &self->name_, ColumnFlag::name, 816 static_cast<uint32_t>(columns.size()), olay_idx); 817 AddColumnToVector(columns, "mapping", &self->mapping_, ColumnFlag::mapping, 818 static_cast<uint32_t>(columns.size()), olay_idx); 819 AddColumnToVector(columns, "rel_pc", &self->rel_pc_, ColumnFlag::rel_pc, 820 static_cast<uint32_t>(columns.size()), olay_idx); 821 AddColumnToVector(columns, "symbol_set_id", &self->symbol_set_id_, ColumnFlag::symbol_set_id, 822 static_cast<uint32_t>(columns.size()), olay_idx); 823 AddColumnToVector(columns, "deobfuscated_name", &self->deobfuscated_name_, ColumnFlag::deobfuscated_name, 824 static_cast<uint32_t>(columns.size()), olay_idx); 825 return columns; 826 } 827 StackProfileFrameTable(StringPool * pool)828 PERFETTO_NO_INLINE explicit StackProfileFrameTable(StringPool* pool) 829 : macros_internal::MacroTable( 830 pool, 831 GetColumns(this, nullptr), 832 nullptr), 833 name_(ColumnStorage<ColumnType::name::stored_type>::Create<false>()), 834 mapping_(ColumnStorage<ColumnType::mapping::stored_type>::Create<false>()), 835 rel_pc_(ColumnStorage<ColumnType::rel_pc::stored_type>::Create<false>()), 836 symbol_set_id_(ColumnStorage<ColumnType::symbol_set_id::stored_type>::Create<true>()), 837 deobfuscated_name_(ColumnStorage<ColumnType::deobfuscated_name::stored_type>::Create<false>()) 838 , 839 id_storage_layer_(new column::IdStorage()), 840 type_storage_layer_( 841 new column::StringStorage(string_pool(), &type_.vector())), 842 name_storage_layer_( 843 new column::StringStorage(string_pool(), &name_.vector())), 844 mapping_storage_layer_( 845 new column::NumericStorage<ColumnType::mapping::non_optional_stored_type>( 846 &mapping_.vector(), 847 ColumnTypeHelper<ColumnType::mapping::stored_type>::ToColumnType(), 848 false)), 849 rel_pc_storage_layer_( 850 new column::NumericStorage<ColumnType::rel_pc::non_optional_stored_type>( 851 &rel_pc_.vector(), 852 ColumnTypeHelper<ColumnType::rel_pc::stored_type>::ToColumnType(), 853 false)), 854 symbol_set_id_storage_layer_( 855 new column::NumericStorage<ColumnType::symbol_set_id::non_optional_stored_type>( 856 &symbol_set_id_.non_null_vector(), 857 ColumnTypeHelper<ColumnType::symbol_set_id::stored_type>::ToColumnType(), 858 false)), 859 deobfuscated_name_storage_layer_( 860 new column::StringStorage(string_pool(), &deobfuscated_name_.vector())) 861 , 862 symbol_set_id_null_layer_(new column::DenseNullOverlay(symbol_set_id_.bv())) { 863 static_assert( 864 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::name::stored_type>( 865 ColumnFlag::name), 866 "Column type and flag combination is not valid"); 867 static_assert( 868 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::mapping::stored_type>( 869 ColumnFlag::mapping), 870 "Column type and flag combination is not valid"); 871 static_assert( 872 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::rel_pc::stored_type>( 873 ColumnFlag::rel_pc), 874 "Column type and flag combination is not valid"); 875 static_assert( 876 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::symbol_set_id::stored_type>( 877 ColumnFlag::symbol_set_id), 878 "Column type and flag combination is not valid"); 879 static_assert( 880 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::deobfuscated_name::stored_type>( 881 ColumnFlag::deobfuscated_name), 882 "Column type and flag combination is not valid"); 883 OnConstructionCompletedRegularConstructor( 884 {id_storage_layer_,type_storage_layer_,name_storage_layer_,mapping_storage_layer_,rel_pc_storage_layer_,symbol_set_id_storage_layer_,deobfuscated_name_storage_layer_}, 885 {{},{},{},{},{},symbol_set_id_null_layer_,{}}); 886 } 887 ~StackProfileFrameTable() override; 888 Name()889 static const char* Name() { return "stack_profile_frame"; } 890 ComputeStaticSchema()891 static Table::Schema ComputeStaticSchema() { 892 Table::Schema schema; 893 schema.columns.emplace_back(Table::Schema::Column{ 894 "id", SqlValue::Type::kLong, true, true, false, false}); 895 schema.columns.emplace_back(Table::Schema::Column{ 896 "type", SqlValue::Type::kString, false, false, false, false}); 897 schema.columns.emplace_back(Table::Schema::Column{ 898 "name", ColumnType::name::SqlValueType(), false, 899 false, 900 false, 901 false}); 902 schema.columns.emplace_back(Table::Schema::Column{ 903 "mapping", ColumnType::mapping::SqlValueType(), false, 904 false, 905 false, 906 false}); 907 schema.columns.emplace_back(Table::Schema::Column{ 908 "rel_pc", ColumnType::rel_pc::SqlValueType(), false, 909 false, 910 false, 911 false}); 912 schema.columns.emplace_back(Table::Schema::Column{ 913 "symbol_set_id", ColumnType::symbol_set_id::SqlValueType(), false, 914 false, 915 false, 916 false}); 917 schema.columns.emplace_back(Table::Schema::Column{ 918 "deobfuscated_name", ColumnType::deobfuscated_name::SqlValueType(), false, 919 false, 920 false, 921 false}); 922 return schema; 923 } 924 IterateRows()925 ConstIterator IterateRows() const { 926 return ConstIterator(this, Table::IterateRows()); 927 } 928 IterateRows()929 Iterator IterateRows() { return Iterator(this, Table::IterateRows()); } 930 FilterToIterator(const Query & q)931 ConstIterator FilterToIterator(const Query& q) const { 932 return ConstIterator(this, QueryToIterator(q)); 933 } 934 FilterToIterator(const Query & q)935 Iterator FilterToIterator(const Query& q) { 936 return Iterator(this, QueryToIterator(q)); 937 } 938 ShrinkToFit()939 void ShrinkToFit() { 940 type_.ShrinkToFit(); 941 name_.ShrinkToFit(); 942 mapping_.ShrinkToFit(); 943 rel_pc_.ShrinkToFit(); 944 symbol_set_id_.ShrinkToFit(); 945 deobfuscated_name_.ShrinkToFit(); 946 } 947 948 ConstRowReference operator[](uint32_t r) const { 949 return ConstRowReference(this, r); 950 } 951 RowReference operator[](uint32_t r) { return RowReference(this, r); } 952 ConstRowReference operator[](RowNumber r) const { 953 return ConstRowReference(this, r.row_number()); 954 } 955 RowReference operator[](RowNumber r) { 956 return RowReference(this, r.row_number()); 957 } 958 FindById(Id find_id)959 std::optional<ConstRowReference> FindById(Id find_id) const { 960 std::optional<uint32_t> row = id().IndexOf(find_id); 961 return row ? std::make_optional(ConstRowReference(this, *row)) 962 : std::nullopt; 963 } 964 FindById(Id find_id)965 std::optional<RowReference> FindById(Id find_id) { 966 std::optional<uint32_t> row = id().IndexOf(find_id); 967 return row ? std::make_optional(RowReference(this, *row)) : std::nullopt; 968 } 969 Insert(const Row & row)970 IdAndRow Insert(const Row& row) { 971 uint32_t row_number = row_count(); 972 Id id = Id{row_number}; 973 type_.Append(string_pool()->InternString(row.type())); 974 mutable_name()->Append(row.name); 975 mutable_mapping()->Append(row.mapping); 976 mutable_rel_pc()->Append(row.rel_pc); 977 mutable_symbol_set_id()->Append(row.symbol_set_id); 978 mutable_deobfuscated_name()->Append(row.deobfuscated_name); 979 UpdateSelfOverlayAfterInsert(); 980 return IdAndRow{id, row_number, RowReference(this, row_number), 981 RowNumber(row_number)}; 982 } 983 984 985 id()986 const IdColumn<StackProfileFrameTable::Id>& id() const { 987 return static_cast<const ColumnType::id&>(columns()[ColumnIndex::id]); 988 } type()989 const TypedColumn<StringPool::Id>& type() const { 990 return static_cast<const ColumnType::type&>(columns()[ColumnIndex::type]); 991 } name()992 const TypedColumn<StringPool::Id>& name() const { 993 return static_cast<const ColumnType::name&>(columns()[ColumnIndex::name]); 994 } mapping()995 const TypedColumn<StackProfileMappingTable::Id>& mapping() const { 996 return static_cast<const ColumnType::mapping&>(columns()[ColumnIndex::mapping]); 997 } rel_pc()998 const TypedColumn<int64_t>& rel_pc() const { 999 return static_cast<const ColumnType::rel_pc&>(columns()[ColumnIndex::rel_pc]); 1000 } symbol_set_id()1001 const TypedColumn<std::optional<uint32_t>>& symbol_set_id() const { 1002 return static_cast<const ColumnType::symbol_set_id&>(columns()[ColumnIndex::symbol_set_id]); 1003 } deobfuscated_name()1004 const TypedColumn<std::optional<StringPool::Id>>& deobfuscated_name() const { 1005 return static_cast<const ColumnType::deobfuscated_name&>(columns()[ColumnIndex::deobfuscated_name]); 1006 } 1007 mutable_name()1008 TypedColumn<StringPool::Id>* mutable_name() { 1009 return static_cast<ColumnType::name*>( 1010 GetColumn(ColumnIndex::name)); 1011 } mutable_mapping()1012 TypedColumn<StackProfileMappingTable::Id>* mutable_mapping() { 1013 return static_cast<ColumnType::mapping*>( 1014 GetColumn(ColumnIndex::mapping)); 1015 } mutable_rel_pc()1016 TypedColumn<int64_t>* mutable_rel_pc() { 1017 return static_cast<ColumnType::rel_pc*>( 1018 GetColumn(ColumnIndex::rel_pc)); 1019 } mutable_symbol_set_id()1020 TypedColumn<std::optional<uint32_t>>* mutable_symbol_set_id() { 1021 return static_cast<ColumnType::symbol_set_id*>( 1022 GetColumn(ColumnIndex::symbol_set_id)); 1023 } mutable_deobfuscated_name()1024 TypedColumn<std::optional<StringPool::Id>>* mutable_deobfuscated_name() { 1025 return static_cast<ColumnType::deobfuscated_name*>( 1026 GetColumn(ColumnIndex::deobfuscated_name)); 1027 } 1028 1029 private: 1030 1031 1032 ColumnStorage<ColumnType::name::stored_type> name_; 1033 ColumnStorage<ColumnType::mapping::stored_type> mapping_; 1034 ColumnStorage<ColumnType::rel_pc::stored_type> rel_pc_; 1035 ColumnStorage<ColumnType::symbol_set_id::stored_type> symbol_set_id_; 1036 ColumnStorage<ColumnType::deobfuscated_name::stored_type> deobfuscated_name_; 1037 1038 RefPtr<column::StorageLayer> id_storage_layer_; 1039 RefPtr<column::StorageLayer> type_storage_layer_; 1040 RefPtr<column::StorageLayer> name_storage_layer_; 1041 RefPtr<column::StorageLayer> mapping_storage_layer_; 1042 RefPtr<column::StorageLayer> rel_pc_storage_layer_; 1043 RefPtr<column::StorageLayer> symbol_set_id_storage_layer_; 1044 RefPtr<column::StorageLayer> deobfuscated_name_storage_layer_; 1045 1046 RefPtr<column::OverlayLayer> symbol_set_id_null_layer_; 1047 }; 1048 1049 1050 class StackProfileCallsiteTable : public macros_internal::MacroTable { 1051 public: 1052 static constexpr uint32_t kColumnCount = 5; 1053 1054 struct Id : public BaseId { 1055 Id() = default; IdId1056 explicit constexpr Id(uint32_t v) : BaseId(v) {} 1057 }; 1058 static_assert(std::is_trivially_destructible_v<Id>, 1059 "Inheritance used without trivial destruction"); 1060 1061 struct ColumnIndex { 1062 static constexpr uint32_t id = 0; 1063 static constexpr uint32_t type = 1; 1064 static constexpr uint32_t depth = 2; 1065 static constexpr uint32_t parent_id = 3; 1066 static constexpr uint32_t frame_id = 4; 1067 }; 1068 struct ColumnType { 1069 using id = IdColumn<StackProfileCallsiteTable::Id>; 1070 using type = TypedColumn<StringPool::Id>; 1071 using depth = TypedColumn<uint32_t>; 1072 using parent_id = TypedColumn<std::optional<StackProfileCallsiteTable::Id>>; 1073 using frame_id = TypedColumn<StackProfileFrameTable::Id>; 1074 }; 1075 struct Row : public macros_internal::RootParentTable::Row { 1076 Row(uint32_t in_depth = {}, 1077 std::optional<StackProfileCallsiteTable::Id> in_parent_id = {}, 1078 StackProfileFrameTable::Id in_frame_id = {}, 1079 std::nullptr_t = nullptr) RowRow1080 : macros_internal::RootParentTable::Row(), 1081 depth(in_depth), 1082 parent_id(in_parent_id), 1083 frame_id(in_frame_id) { 1084 type_ = "stack_profile_callsite"; 1085 } 1086 uint32_t depth; 1087 std::optional<StackProfileCallsiteTable::Id> parent_id; 1088 StackProfileFrameTable::Id frame_id; 1089 1090 bool operator==(const StackProfileCallsiteTable::Row& other) const { 1091 return type() == other.type() && ColumnType::depth::Equals(depth, other.depth) && 1092 ColumnType::parent_id::Equals(parent_id, other.parent_id) && 1093 ColumnType::frame_id::Equals(frame_id, other.frame_id); 1094 } 1095 }; 1096 struct ColumnFlag { 1097 static constexpr uint32_t depth = ColumnType::depth::default_flags(); 1098 static constexpr uint32_t parent_id = ColumnType::parent_id::default_flags(); 1099 static constexpr uint32_t frame_id = ColumnType::frame_id::default_flags(); 1100 }; 1101 1102 class RowNumber; 1103 class ConstRowReference; 1104 class RowReference; 1105 1106 class RowNumber : public macros_internal::AbstractRowNumber< 1107 StackProfileCallsiteTable, ConstRowReference, RowReference> { 1108 public: RowNumber(uint32_t row_number)1109 explicit RowNumber(uint32_t row_number) 1110 : AbstractRowNumber(row_number) {} 1111 }; 1112 static_assert(std::is_trivially_destructible_v<RowNumber>, 1113 "Inheritance used without trivial destruction"); 1114 1115 class ConstRowReference : public macros_internal::AbstractConstRowReference< 1116 StackProfileCallsiteTable, RowNumber> { 1117 public: ConstRowReference(const StackProfileCallsiteTable * table,uint32_t row_number)1118 ConstRowReference(const StackProfileCallsiteTable* table, uint32_t row_number) 1119 : AbstractConstRowReference(table, row_number) {} 1120 id()1121 ColumnType::id::type id() const { 1122 return table()->id()[row_number_]; 1123 } type()1124 ColumnType::type::type type() const { 1125 return table()->type()[row_number_]; 1126 } depth()1127 ColumnType::depth::type depth() const { 1128 return table()->depth()[row_number_]; 1129 } parent_id()1130 ColumnType::parent_id::type parent_id() const { 1131 return table()->parent_id()[row_number_]; 1132 } frame_id()1133 ColumnType::frame_id::type frame_id() const { 1134 return table()->frame_id()[row_number_]; 1135 } 1136 }; 1137 static_assert(std::is_trivially_destructible_v<ConstRowReference>, 1138 "Inheritance used without trivial destruction"); 1139 class RowReference : public ConstRowReference { 1140 public: RowReference(const StackProfileCallsiteTable * table,uint32_t row_number)1141 RowReference(const StackProfileCallsiteTable* table, uint32_t row_number) 1142 : ConstRowReference(table, row_number) {} 1143 set_depth(ColumnType::depth::non_optional_type v)1144 void set_depth( 1145 ColumnType::depth::non_optional_type v) { 1146 return mutable_table()->mutable_depth()->Set(row_number_, v); 1147 } set_parent_id(ColumnType::parent_id::non_optional_type v)1148 void set_parent_id( 1149 ColumnType::parent_id::non_optional_type v) { 1150 return mutable_table()->mutable_parent_id()->Set(row_number_, v); 1151 } set_frame_id(ColumnType::frame_id::non_optional_type v)1152 void set_frame_id( 1153 ColumnType::frame_id::non_optional_type v) { 1154 return mutable_table()->mutable_frame_id()->Set(row_number_, v); 1155 } 1156 1157 private: mutable_table()1158 StackProfileCallsiteTable* mutable_table() const { 1159 return const_cast<StackProfileCallsiteTable*>(table()); 1160 } 1161 }; 1162 static_assert(std::is_trivially_destructible_v<RowReference>, 1163 "Inheritance used without trivial destruction"); 1164 1165 class ConstIterator; 1166 class ConstIterator : public macros_internal::AbstractConstIterator< 1167 ConstIterator, StackProfileCallsiteTable, RowNumber, ConstRowReference> { 1168 public: id()1169 ColumnType::id::type id() const { 1170 const auto& col = table()->id(); 1171 return col.GetAtIdx( 1172 iterator_.StorageIndexForColumn(col.index_in_table())); 1173 } type()1174 ColumnType::type::type type() const { 1175 const auto& col = table()->type(); 1176 return col.GetAtIdx( 1177 iterator_.StorageIndexForColumn(col.index_in_table())); 1178 } depth()1179 ColumnType::depth::type depth() const { 1180 const auto& col = table()->depth(); 1181 return col.GetAtIdx( 1182 iterator_.StorageIndexForColumn(col.index_in_table())); 1183 } parent_id()1184 ColumnType::parent_id::type parent_id() const { 1185 const auto& col = table()->parent_id(); 1186 return col.GetAtIdx( 1187 iterator_.StorageIndexForColumn(col.index_in_table())); 1188 } frame_id()1189 ColumnType::frame_id::type frame_id() const { 1190 const auto& col = table()->frame_id(); 1191 return col.GetAtIdx( 1192 iterator_.StorageIndexForColumn(col.index_in_table())); 1193 } 1194 1195 protected: ConstIterator(const StackProfileCallsiteTable * table,Table::Iterator iterator)1196 explicit ConstIterator(const StackProfileCallsiteTable* table, 1197 Table::Iterator iterator) 1198 : AbstractConstIterator(table, std::move(iterator)) {} 1199 CurrentRowNumber()1200 uint32_t CurrentRowNumber() const { 1201 return iterator_.StorageIndexForLastOverlay(); 1202 } 1203 1204 private: 1205 friend class StackProfileCallsiteTable; 1206 friend class macros_internal::AbstractConstIterator< 1207 ConstIterator, StackProfileCallsiteTable, RowNumber, ConstRowReference>; 1208 }; 1209 class Iterator : public ConstIterator { 1210 public: row_reference()1211 RowReference row_reference() const { 1212 return {const_cast<StackProfileCallsiteTable*>(table()), CurrentRowNumber()}; 1213 } 1214 1215 private: 1216 friend class StackProfileCallsiteTable; 1217 Iterator(StackProfileCallsiteTable * table,Table::Iterator iterator)1218 explicit Iterator(StackProfileCallsiteTable* table, Table::Iterator iterator) 1219 : ConstIterator(table, std::move(iterator)) {} 1220 }; 1221 1222 struct IdAndRow { 1223 Id id; 1224 uint32_t row; 1225 RowReference row_reference; 1226 RowNumber row_number; 1227 }; 1228 GetColumns(StackProfileCallsiteTable * self,const macros_internal::MacroTable * parent)1229 static std::vector<ColumnLegacy> GetColumns( 1230 StackProfileCallsiteTable* self, 1231 const macros_internal::MacroTable* parent) { 1232 std::vector<ColumnLegacy> columns = 1233 CopyColumnsFromParentOrAddRootColumns(self, parent); 1234 uint32_t olay_idx = OverlayCount(parent); 1235 AddColumnToVector(columns, "depth", &self->depth_, ColumnFlag::depth, 1236 static_cast<uint32_t>(columns.size()), olay_idx); 1237 AddColumnToVector(columns, "parent_id", &self->parent_id_, ColumnFlag::parent_id, 1238 static_cast<uint32_t>(columns.size()), olay_idx); 1239 AddColumnToVector(columns, "frame_id", &self->frame_id_, ColumnFlag::frame_id, 1240 static_cast<uint32_t>(columns.size()), olay_idx); 1241 return columns; 1242 } 1243 StackProfileCallsiteTable(StringPool * pool)1244 PERFETTO_NO_INLINE explicit StackProfileCallsiteTable(StringPool* pool) 1245 : macros_internal::MacroTable( 1246 pool, 1247 GetColumns(this, nullptr), 1248 nullptr), 1249 depth_(ColumnStorage<ColumnType::depth::stored_type>::Create<false>()), 1250 parent_id_(ColumnStorage<ColumnType::parent_id::stored_type>::Create<false>()), 1251 frame_id_(ColumnStorage<ColumnType::frame_id::stored_type>::Create<false>()) 1252 , 1253 id_storage_layer_(new column::IdStorage()), 1254 type_storage_layer_( 1255 new column::StringStorage(string_pool(), &type_.vector())), 1256 depth_storage_layer_( 1257 new column::NumericStorage<ColumnType::depth::non_optional_stored_type>( 1258 &depth_.vector(), 1259 ColumnTypeHelper<ColumnType::depth::stored_type>::ToColumnType(), 1260 false)), 1261 parent_id_storage_layer_( 1262 new column::NumericStorage<ColumnType::parent_id::non_optional_stored_type>( 1263 &parent_id_.non_null_vector(), 1264 ColumnTypeHelper<ColumnType::parent_id::stored_type>::ToColumnType(), 1265 false)), 1266 frame_id_storage_layer_( 1267 new column::NumericStorage<ColumnType::frame_id::non_optional_stored_type>( 1268 &frame_id_.vector(), 1269 ColumnTypeHelper<ColumnType::frame_id::stored_type>::ToColumnType(), 1270 false)) 1271 , 1272 parent_id_null_layer_(new column::NullOverlay(parent_id_.bv())) { 1273 static_assert( 1274 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::depth::stored_type>( 1275 ColumnFlag::depth), 1276 "Column type and flag combination is not valid"); 1277 static_assert( 1278 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::parent_id::stored_type>( 1279 ColumnFlag::parent_id), 1280 "Column type and flag combination is not valid"); 1281 static_assert( 1282 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::frame_id::stored_type>( 1283 ColumnFlag::frame_id), 1284 "Column type and flag combination is not valid"); 1285 OnConstructionCompletedRegularConstructor( 1286 {id_storage_layer_,type_storage_layer_,depth_storage_layer_,parent_id_storage_layer_,frame_id_storage_layer_}, 1287 {{},{},{},parent_id_null_layer_,{}}); 1288 } 1289 ~StackProfileCallsiteTable() override; 1290 Name()1291 static const char* Name() { return "stack_profile_callsite"; } 1292 ComputeStaticSchema()1293 static Table::Schema ComputeStaticSchema() { 1294 Table::Schema schema; 1295 schema.columns.emplace_back(Table::Schema::Column{ 1296 "id", SqlValue::Type::kLong, true, true, false, false}); 1297 schema.columns.emplace_back(Table::Schema::Column{ 1298 "type", SqlValue::Type::kString, false, false, false, false}); 1299 schema.columns.emplace_back(Table::Schema::Column{ 1300 "depth", ColumnType::depth::SqlValueType(), false, 1301 false, 1302 false, 1303 false}); 1304 schema.columns.emplace_back(Table::Schema::Column{ 1305 "parent_id", ColumnType::parent_id::SqlValueType(), false, 1306 false, 1307 false, 1308 false}); 1309 schema.columns.emplace_back(Table::Schema::Column{ 1310 "frame_id", ColumnType::frame_id::SqlValueType(), false, 1311 false, 1312 false, 1313 false}); 1314 return schema; 1315 } 1316 IterateRows()1317 ConstIterator IterateRows() const { 1318 return ConstIterator(this, Table::IterateRows()); 1319 } 1320 IterateRows()1321 Iterator IterateRows() { return Iterator(this, Table::IterateRows()); } 1322 FilterToIterator(const Query & q)1323 ConstIterator FilterToIterator(const Query& q) const { 1324 return ConstIterator(this, QueryToIterator(q)); 1325 } 1326 FilterToIterator(const Query & q)1327 Iterator FilterToIterator(const Query& q) { 1328 return Iterator(this, QueryToIterator(q)); 1329 } 1330 ShrinkToFit()1331 void ShrinkToFit() { 1332 type_.ShrinkToFit(); 1333 depth_.ShrinkToFit(); 1334 parent_id_.ShrinkToFit(); 1335 frame_id_.ShrinkToFit(); 1336 } 1337 1338 ConstRowReference operator[](uint32_t r) const { 1339 return ConstRowReference(this, r); 1340 } 1341 RowReference operator[](uint32_t r) { return RowReference(this, r); } 1342 ConstRowReference operator[](RowNumber r) const { 1343 return ConstRowReference(this, r.row_number()); 1344 } 1345 RowReference operator[](RowNumber r) { 1346 return RowReference(this, r.row_number()); 1347 } 1348 FindById(Id find_id)1349 std::optional<ConstRowReference> FindById(Id find_id) const { 1350 std::optional<uint32_t> row = id().IndexOf(find_id); 1351 return row ? std::make_optional(ConstRowReference(this, *row)) 1352 : std::nullopt; 1353 } 1354 FindById(Id find_id)1355 std::optional<RowReference> FindById(Id find_id) { 1356 std::optional<uint32_t> row = id().IndexOf(find_id); 1357 return row ? std::make_optional(RowReference(this, *row)) : std::nullopt; 1358 } 1359 Insert(const Row & row)1360 IdAndRow Insert(const Row& row) { 1361 uint32_t row_number = row_count(); 1362 Id id = Id{row_number}; 1363 type_.Append(string_pool()->InternString(row.type())); 1364 mutable_depth()->Append(row.depth); 1365 mutable_parent_id()->Append(row.parent_id); 1366 mutable_frame_id()->Append(row.frame_id); 1367 UpdateSelfOverlayAfterInsert(); 1368 return IdAndRow{id, row_number, RowReference(this, row_number), 1369 RowNumber(row_number)}; 1370 } 1371 1372 1373 id()1374 const IdColumn<StackProfileCallsiteTable::Id>& id() const { 1375 return static_cast<const ColumnType::id&>(columns()[ColumnIndex::id]); 1376 } type()1377 const TypedColumn<StringPool::Id>& type() const { 1378 return static_cast<const ColumnType::type&>(columns()[ColumnIndex::type]); 1379 } depth()1380 const TypedColumn<uint32_t>& depth() const { 1381 return static_cast<const ColumnType::depth&>(columns()[ColumnIndex::depth]); 1382 } parent_id()1383 const TypedColumn<std::optional<StackProfileCallsiteTable::Id>>& parent_id() const { 1384 return static_cast<const ColumnType::parent_id&>(columns()[ColumnIndex::parent_id]); 1385 } frame_id()1386 const TypedColumn<StackProfileFrameTable::Id>& frame_id() const { 1387 return static_cast<const ColumnType::frame_id&>(columns()[ColumnIndex::frame_id]); 1388 } 1389 mutable_depth()1390 TypedColumn<uint32_t>* mutable_depth() { 1391 return static_cast<ColumnType::depth*>( 1392 GetColumn(ColumnIndex::depth)); 1393 } mutable_parent_id()1394 TypedColumn<std::optional<StackProfileCallsiteTable::Id>>* mutable_parent_id() { 1395 return static_cast<ColumnType::parent_id*>( 1396 GetColumn(ColumnIndex::parent_id)); 1397 } mutable_frame_id()1398 TypedColumn<StackProfileFrameTable::Id>* mutable_frame_id() { 1399 return static_cast<ColumnType::frame_id*>( 1400 GetColumn(ColumnIndex::frame_id)); 1401 } 1402 1403 private: 1404 1405 1406 ColumnStorage<ColumnType::depth::stored_type> depth_; 1407 ColumnStorage<ColumnType::parent_id::stored_type> parent_id_; 1408 ColumnStorage<ColumnType::frame_id::stored_type> frame_id_; 1409 1410 RefPtr<column::StorageLayer> id_storage_layer_; 1411 RefPtr<column::StorageLayer> type_storage_layer_; 1412 RefPtr<column::StorageLayer> depth_storage_layer_; 1413 RefPtr<column::StorageLayer> parent_id_storage_layer_; 1414 RefPtr<column::StorageLayer> frame_id_storage_layer_; 1415 1416 RefPtr<column::OverlayLayer> parent_id_null_layer_; 1417 }; 1418 1419 1420 class CpuProfileStackSampleTable : public macros_internal::MacroTable { 1421 public: 1422 static constexpr uint32_t kColumnCount = 6; 1423 1424 struct Id : public BaseId { 1425 Id() = default; IdId1426 explicit constexpr Id(uint32_t v) : BaseId(v) {} 1427 }; 1428 static_assert(std::is_trivially_destructible_v<Id>, 1429 "Inheritance used without trivial destruction"); 1430 1431 struct ColumnIndex { 1432 static constexpr uint32_t id = 0; 1433 static constexpr uint32_t type = 1; 1434 static constexpr uint32_t ts = 2; 1435 static constexpr uint32_t callsite_id = 3; 1436 static constexpr uint32_t utid = 4; 1437 static constexpr uint32_t process_priority = 5; 1438 }; 1439 struct ColumnType { 1440 using id = IdColumn<CpuProfileStackSampleTable::Id>; 1441 using type = TypedColumn<StringPool::Id>; 1442 using ts = TypedColumn<int64_t>; 1443 using callsite_id = TypedColumn<StackProfileCallsiteTable::Id>; 1444 using utid = TypedColumn<uint32_t>; 1445 using process_priority = TypedColumn<int32_t>; 1446 }; 1447 struct Row : public macros_internal::RootParentTable::Row { 1448 Row(int64_t in_ts = {}, 1449 StackProfileCallsiteTable::Id in_callsite_id = {}, 1450 uint32_t in_utid = {}, 1451 int32_t in_process_priority = {}, 1452 std::nullptr_t = nullptr) RowRow1453 : macros_internal::RootParentTable::Row(), 1454 ts(in_ts), 1455 callsite_id(in_callsite_id), 1456 utid(in_utid), 1457 process_priority(in_process_priority) { 1458 type_ = "cpu_profile_stack_sample"; 1459 } 1460 int64_t ts; 1461 StackProfileCallsiteTable::Id callsite_id; 1462 uint32_t utid; 1463 int32_t process_priority; 1464 1465 bool operator==(const CpuProfileStackSampleTable::Row& other) const { 1466 return type() == other.type() && ColumnType::ts::Equals(ts, other.ts) && 1467 ColumnType::callsite_id::Equals(callsite_id, other.callsite_id) && 1468 ColumnType::utid::Equals(utid, other.utid) && 1469 ColumnType::process_priority::Equals(process_priority, other.process_priority); 1470 } 1471 }; 1472 struct ColumnFlag { 1473 static constexpr uint32_t ts = ColumnType::ts::default_flags(); 1474 static constexpr uint32_t callsite_id = ColumnType::callsite_id::default_flags(); 1475 static constexpr uint32_t utid = ColumnType::utid::default_flags(); 1476 static constexpr uint32_t process_priority = ColumnType::process_priority::default_flags(); 1477 }; 1478 1479 class RowNumber; 1480 class ConstRowReference; 1481 class RowReference; 1482 1483 class RowNumber : public macros_internal::AbstractRowNumber< 1484 CpuProfileStackSampleTable, ConstRowReference, RowReference> { 1485 public: RowNumber(uint32_t row_number)1486 explicit RowNumber(uint32_t row_number) 1487 : AbstractRowNumber(row_number) {} 1488 }; 1489 static_assert(std::is_trivially_destructible_v<RowNumber>, 1490 "Inheritance used without trivial destruction"); 1491 1492 class ConstRowReference : public macros_internal::AbstractConstRowReference< 1493 CpuProfileStackSampleTable, RowNumber> { 1494 public: ConstRowReference(const CpuProfileStackSampleTable * table,uint32_t row_number)1495 ConstRowReference(const CpuProfileStackSampleTable* table, uint32_t row_number) 1496 : AbstractConstRowReference(table, row_number) {} 1497 id()1498 ColumnType::id::type id() const { 1499 return table()->id()[row_number_]; 1500 } type()1501 ColumnType::type::type type() const { 1502 return table()->type()[row_number_]; 1503 } ts()1504 ColumnType::ts::type ts() const { 1505 return table()->ts()[row_number_]; 1506 } callsite_id()1507 ColumnType::callsite_id::type callsite_id() const { 1508 return table()->callsite_id()[row_number_]; 1509 } utid()1510 ColumnType::utid::type utid() const { 1511 return table()->utid()[row_number_]; 1512 } process_priority()1513 ColumnType::process_priority::type process_priority() const { 1514 return table()->process_priority()[row_number_]; 1515 } 1516 }; 1517 static_assert(std::is_trivially_destructible_v<ConstRowReference>, 1518 "Inheritance used without trivial destruction"); 1519 class RowReference : public ConstRowReference { 1520 public: RowReference(const CpuProfileStackSampleTable * table,uint32_t row_number)1521 RowReference(const CpuProfileStackSampleTable* table, uint32_t row_number) 1522 : ConstRowReference(table, row_number) {} 1523 set_ts(ColumnType::ts::non_optional_type v)1524 void set_ts( 1525 ColumnType::ts::non_optional_type v) { 1526 return mutable_table()->mutable_ts()->Set(row_number_, v); 1527 } set_callsite_id(ColumnType::callsite_id::non_optional_type v)1528 void set_callsite_id( 1529 ColumnType::callsite_id::non_optional_type v) { 1530 return mutable_table()->mutable_callsite_id()->Set(row_number_, v); 1531 } set_utid(ColumnType::utid::non_optional_type v)1532 void set_utid( 1533 ColumnType::utid::non_optional_type v) { 1534 return mutable_table()->mutable_utid()->Set(row_number_, v); 1535 } set_process_priority(ColumnType::process_priority::non_optional_type v)1536 void set_process_priority( 1537 ColumnType::process_priority::non_optional_type v) { 1538 return mutable_table()->mutable_process_priority()->Set(row_number_, v); 1539 } 1540 1541 private: mutable_table()1542 CpuProfileStackSampleTable* mutable_table() const { 1543 return const_cast<CpuProfileStackSampleTable*>(table()); 1544 } 1545 }; 1546 static_assert(std::is_trivially_destructible_v<RowReference>, 1547 "Inheritance used without trivial destruction"); 1548 1549 class ConstIterator; 1550 class ConstIterator : public macros_internal::AbstractConstIterator< 1551 ConstIterator, CpuProfileStackSampleTable, RowNumber, ConstRowReference> { 1552 public: id()1553 ColumnType::id::type id() const { 1554 const auto& col = table()->id(); 1555 return col.GetAtIdx( 1556 iterator_.StorageIndexForColumn(col.index_in_table())); 1557 } type()1558 ColumnType::type::type type() const { 1559 const auto& col = table()->type(); 1560 return col.GetAtIdx( 1561 iterator_.StorageIndexForColumn(col.index_in_table())); 1562 } ts()1563 ColumnType::ts::type ts() const { 1564 const auto& col = table()->ts(); 1565 return col.GetAtIdx( 1566 iterator_.StorageIndexForColumn(col.index_in_table())); 1567 } callsite_id()1568 ColumnType::callsite_id::type callsite_id() const { 1569 const auto& col = table()->callsite_id(); 1570 return col.GetAtIdx( 1571 iterator_.StorageIndexForColumn(col.index_in_table())); 1572 } utid()1573 ColumnType::utid::type utid() const { 1574 const auto& col = table()->utid(); 1575 return col.GetAtIdx( 1576 iterator_.StorageIndexForColumn(col.index_in_table())); 1577 } process_priority()1578 ColumnType::process_priority::type process_priority() const { 1579 const auto& col = table()->process_priority(); 1580 return col.GetAtIdx( 1581 iterator_.StorageIndexForColumn(col.index_in_table())); 1582 } 1583 1584 protected: ConstIterator(const CpuProfileStackSampleTable * table,Table::Iterator iterator)1585 explicit ConstIterator(const CpuProfileStackSampleTable* table, 1586 Table::Iterator iterator) 1587 : AbstractConstIterator(table, std::move(iterator)) {} 1588 CurrentRowNumber()1589 uint32_t CurrentRowNumber() const { 1590 return iterator_.StorageIndexForLastOverlay(); 1591 } 1592 1593 private: 1594 friend class CpuProfileStackSampleTable; 1595 friend class macros_internal::AbstractConstIterator< 1596 ConstIterator, CpuProfileStackSampleTable, RowNumber, ConstRowReference>; 1597 }; 1598 class Iterator : public ConstIterator { 1599 public: row_reference()1600 RowReference row_reference() const { 1601 return {const_cast<CpuProfileStackSampleTable*>(table()), CurrentRowNumber()}; 1602 } 1603 1604 private: 1605 friend class CpuProfileStackSampleTable; 1606 Iterator(CpuProfileStackSampleTable * table,Table::Iterator iterator)1607 explicit Iterator(CpuProfileStackSampleTable* table, Table::Iterator iterator) 1608 : ConstIterator(table, std::move(iterator)) {} 1609 }; 1610 1611 struct IdAndRow { 1612 Id id; 1613 uint32_t row; 1614 RowReference row_reference; 1615 RowNumber row_number; 1616 }; 1617 GetColumns(CpuProfileStackSampleTable * self,const macros_internal::MacroTable * parent)1618 static std::vector<ColumnLegacy> GetColumns( 1619 CpuProfileStackSampleTable* self, 1620 const macros_internal::MacroTable* parent) { 1621 std::vector<ColumnLegacy> columns = 1622 CopyColumnsFromParentOrAddRootColumns(self, parent); 1623 uint32_t olay_idx = OverlayCount(parent); 1624 AddColumnToVector(columns, "ts", &self->ts_, ColumnFlag::ts, 1625 static_cast<uint32_t>(columns.size()), olay_idx); 1626 AddColumnToVector(columns, "callsite_id", &self->callsite_id_, ColumnFlag::callsite_id, 1627 static_cast<uint32_t>(columns.size()), olay_idx); 1628 AddColumnToVector(columns, "utid", &self->utid_, ColumnFlag::utid, 1629 static_cast<uint32_t>(columns.size()), olay_idx); 1630 AddColumnToVector(columns, "process_priority", &self->process_priority_, ColumnFlag::process_priority, 1631 static_cast<uint32_t>(columns.size()), olay_idx); 1632 return columns; 1633 } 1634 CpuProfileStackSampleTable(StringPool * pool)1635 PERFETTO_NO_INLINE explicit CpuProfileStackSampleTable(StringPool* pool) 1636 : macros_internal::MacroTable( 1637 pool, 1638 GetColumns(this, nullptr), 1639 nullptr), 1640 ts_(ColumnStorage<ColumnType::ts::stored_type>::Create<false>()), 1641 callsite_id_(ColumnStorage<ColumnType::callsite_id::stored_type>::Create<false>()), 1642 utid_(ColumnStorage<ColumnType::utid::stored_type>::Create<false>()), 1643 process_priority_(ColumnStorage<ColumnType::process_priority::stored_type>::Create<false>()) 1644 , 1645 id_storage_layer_(new column::IdStorage()), 1646 type_storage_layer_( 1647 new column::StringStorage(string_pool(), &type_.vector())), 1648 ts_storage_layer_( 1649 new column::NumericStorage<ColumnType::ts::non_optional_stored_type>( 1650 &ts_.vector(), 1651 ColumnTypeHelper<ColumnType::ts::stored_type>::ToColumnType(), 1652 false)), 1653 callsite_id_storage_layer_( 1654 new column::NumericStorage<ColumnType::callsite_id::non_optional_stored_type>( 1655 &callsite_id_.vector(), 1656 ColumnTypeHelper<ColumnType::callsite_id::stored_type>::ToColumnType(), 1657 false)), 1658 utid_storage_layer_( 1659 new column::NumericStorage<ColumnType::utid::non_optional_stored_type>( 1660 &utid_.vector(), 1661 ColumnTypeHelper<ColumnType::utid::stored_type>::ToColumnType(), 1662 false)), 1663 process_priority_storage_layer_( 1664 new column::NumericStorage<ColumnType::process_priority::non_optional_stored_type>( 1665 &process_priority_.vector(), 1666 ColumnTypeHelper<ColumnType::process_priority::stored_type>::ToColumnType(), 1667 false)) 1668 { 1669 static_assert( 1670 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::ts::stored_type>( 1671 ColumnFlag::ts), 1672 "Column type and flag combination is not valid"); 1673 static_assert( 1674 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::callsite_id::stored_type>( 1675 ColumnFlag::callsite_id), 1676 "Column type and flag combination is not valid"); 1677 static_assert( 1678 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::utid::stored_type>( 1679 ColumnFlag::utid), 1680 "Column type and flag combination is not valid"); 1681 static_assert( 1682 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::process_priority::stored_type>( 1683 ColumnFlag::process_priority), 1684 "Column type and flag combination is not valid"); 1685 OnConstructionCompletedRegularConstructor( 1686 {id_storage_layer_,type_storage_layer_,ts_storage_layer_,callsite_id_storage_layer_,utid_storage_layer_,process_priority_storage_layer_}, 1687 {{},{},{},{},{},{}}); 1688 } 1689 ~CpuProfileStackSampleTable() override; 1690 Name()1691 static const char* Name() { return "cpu_profile_stack_sample"; } 1692 ComputeStaticSchema()1693 static Table::Schema ComputeStaticSchema() { 1694 Table::Schema schema; 1695 schema.columns.emplace_back(Table::Schema::Column{ 1696 "id", SqlValue::Type::kLong, true, true, false, false}); 1697 schema.columns.emplace_back(Table::Schema::Column{ 1698 "type", SqlValue::Type::kString, false, false, false, false}); 1699 schema.columns.emplace_back(Table::Schema::Column{ 1700 "ts", ColumnType::ts::SqlValueType(), false, 1701 false, 1702 false, 1703 false}); 1704 schema.columns.emplace_back(Table::Schema::Column{ 1705 "callsite_id", ColumnType::callsite_id::SqlValueType(), false, 1706 false, 1707 false, 1708 false}); 1709 schema.columns.emplace_back(Table::Schema::Column{ 1710 "utid", ColumnType::utid::SqlValueType(), false, 1711 false, 1712 false, 1713 false}); 1714 schema.columns.emplace_back(Table::Schema::Column{ 1715 "process_priority", ColumnType::process_priority::SqlValueType(), false, 1716 false, 1717 false, 1718 false}); 1719 return schema; 1720 } 1721 IterateRows()1722 ConstIterator IterateRows() const { 1723 return ConstIterator(this, Table::IterateRows()); 1724 } 1725 IterateRows()1726 Iterator IterateRows() { return Iterator(this, Table::IterateRows()); } 1727 FilterToIterator(const Query & q)1728 ConstIterator FilterToIterator(const Query& q) const { 1729 return ConstIterator(this, QueryToIterator(q)); 1730 } 1731 FilterToIterator(const Query & q)1732 Iterator FilterToIterator(const Query& q) { 1733 return Iterator(this, QueryToIterator(q)); 1734 } 1735 ShrinkToFit()1736 void ShrinkToFit() { 1737 type_.ShrinkToFit(); 1738 ts_.ShrinkToFit(); 1739 callsite_id_.ShrinkToFit(); 1740 utid_.ShrinkToFit(); 1741 process_priority_.ShrinkToFit(); 1742 } 1743 1744 ConstRowReference operator[](uint32_t r) const { 1745 return ConstRowReference(this, r); 1746 } 1747 RowReference operator[](uint32_t r) { return RowReference(this, r); } 1748 ConstRowReference operator[](RowNumber r) const { 1749 return ConstRowReference(this, r.row_number()); 1750 } 1751 RowReference operator[](RowNumber r) { 1752 return RowReference(this, r.row_number()); 1753 } 1754 FindById(Id find_id)1755 std::optional<ConstRowReference> FindById(Id find_id) const { 1756 std::optional<uint32_t> row = id().IndexOf(find_id); 1757 return row ? std::make_optional(ConstRowReference(this, *row)) 1758 : std::nullopt; 1759 } 1760 FindById(Id find_id)1761 std::optional<RowReference> FindById(Id find_id) { 1762 std::optional<uint32_t> row = id().IndexOf(find_id); 1763 return row ? std::make_optional(RowReference(this, *row)) : std::nullopt; 1764 } 1765 Insert(const Row & row)1766 IdAndRow Insert(const Row& row) { 1767 uint32_t row_number = row_count(); 1768 Id id = Id{row_number}; 1769 type_.Append(string_pool()->InternString(row.type())); 1770 mutable_ts()->Append(row.ts); 1771 mutable_callsite_id()->Append(row.callsite_id); 1772 mutable_utid()->Append(row.utid); 1773 mutable_process_priority()->Append(row.process_priority); 1774 UpdateSelfOverlayAfterInsert(); 1775 return IdAndRow{id, row_number, RowReference(this, row_number), 1776 RowNumber(row_number)}; 1777 } 1778 1779 1780 id()1781 const IdColumn<CpuProfileStackSampleTable::Id>& id() const { 1782 return static_cast<const ColumnType::id&>(columns()[ColumnIndex::id]); 1783 } type()1784 const TypedColumn<StringPool::Id>& type() const { 1785 return static_cast<const ColumnType::type&>(columns()[ColumnIndex::type]); 1786 } ts()1787 const TypedColumn<int64_t>& ts() const { 1788 return static_cast<const ColumnType::ts&>(columns()[ColumnIndex::ts]); 1789 } callsite_id()1790 const TypedColumn<StackProfileCallsiteTable::Id>& callsite_id() const { 1791 return static_cast<const ColumnType::callsite_id&>(columns()[ColumnIndex::callsite_id]); 1792 } utid()1793 const TypedColumn<uint32_t>& utid() const { 1794 return static_cast<const ColumnType::utid&>(columns()[ColumnIndex::utid]); 1795 } process_priority()1796 const TypedColumn<int32_t>& process_priority() const { 1797 return static_cast<const ColumnType::process_priority&>(columns()[ColumnIndex::process_priority]); 1798 } 1799 mutable_ts()1800 TypedColumn<int64_t>* mutable_ts() { 1801 return static_cast<ColumnType::ts*>( 1802 GetColumn(ColumnIndex::ts)); 1803 } mutable_callsite_id()1804 TypedColumn<StackProfileCallsiteTable::Id>* mutable_callsite_id() { 1805 return static_cast<ColumnType::callsite_id*>( 1806 GetColumn(ColumnIndex::callsite_id)); 1807 } mutable_utid()1808 TypedColumn<uint32_t>* mutable_utid() { 1809 return static_cast<ColumnType::utid*>( 1810 GetColumn(ColumnIndex::utid)); 1811 } mutable_process_priority()1812 TypedColumn<int32_t>* mutable_process_priority() { 1813 return static_cast<ColumnType::process_priority*>( 1814 GetColumn(ColumnIndex::process_priority)); 1815 } 1816 1817 private: 1818 1819 1820 ColumnStorage<ColumnType::ts::stored_type> ts_; 1821 ColumnStorage<ColumnType::callsite_id::stored_type> callsite_id_; 1822 ColumnStorage<ColumnType::utid::stored_type> utid_; 1823 ColumnStorage<ColumnType::process_priority::stored_type> process_priority_; 1824 1825 RefPtr<column::StorageLayer> id_storage_layer_; 1826 RefPtr<column::StorageLayer> type_storage_layer_; 1827 RefPtr<column::StorageLayer> ts_storage_layer_; 1828 RefPtr<column::StorageLayer> callsite_id_storage_layer_; 1829 RefPtr<column::StorageLayer> utid_storage_layer_; 1830 RefPtr<column::StorageLayer> process_priority_storage_layer_; 1831 1832 1833 }; 1834 1835 1836 class ExperimentalFlamegraphTable : public macros_internal::MacroTable { 1837 public: 1838 static constexpr uint32_t kColumnCount = 23; 1839 1840 struct Id : public BaseId { 1841 Id() = default; IdId1842 explicit constexpr Id(uint32_t v) : BaseId(v) {} 1843 }; 1844 static_assert(std::is_trivially_destructible_v<Id>, 1845 "Inheritance used without trivial destruction"); 1846 1847 struct ColumnIndex { 1848 static constexpr uint32_t id = 0; 1849 static constexpr uint32_t type = 1; 1850 static constexpr uint32_t profile_type = 2; 1851 static constexpr uint32_t ts_in = 3; 1852 static constexpr uint32_t ts_constraint = 4; 1853 static constexpr uint32_t upid = 5; 1854 static constexpr uint32_t upid_group = 6; 1855 static constexpr uint32_t focus_str = 7; 1856 static constexpr uint32_t ts = 8; 1857 static constexpr uint32_t depth = 9; 1858 static constexpr uint32_t name = 10; 1859 static constexpr uint32_t map_name = 11; 1860 static constexpr uint32_t count = 12; 1861 static constexpr uint32_t cumulative_count = 13; 1862 static constexpr uint32_t size = 14; 1863 static constexpr uint32_t cumulative_size = 15; 1864 static constexpr uint32_t alloc_count = 16; 1865 static constexpr uint32_t cumulative_alloc_count = 17; 1866 static constexpr uint32_t alloc_size = 18; 1867 static constexpr uint32_t cumulative_alloc_size = 19; 1868 static constexpr uint32_t parent_id = 20; 1869 static constexpr uint32_t source_file = 21; 1870 static constexpr uint32_t line_number = 22; 1871 }; 1872 struct ColumnType { 1873 using id = IdColumn<ExperimentalFlamegraphTable::Id>; 1874 using type = TypedColumn<StringPool::Id>; 1875 using profile_type = TypedColumn<StringPool::Id>; 1876 using ts_in = TypedColumn<std::optional<int64_t>>; 1877 using ts_constraint = TypedColumn<std::optional<StringPool::Id>>; 1878 using upid = TypedColumn<std::optional<uint32_t>>; 1879 using upid_group = TypedColumn<std::optional<StringPool::Id>>; 1880 using focus_str = TypedColumn<std::optional<StringPool::Id>>; 1881 using ts = TypedColumn<int64_t>; 1882 using depth = TypedColumn<uint32_t>; 1883 using name = TypedColumn<StringPool::Id>; 1884 using map_name = TypedColumn<StringPool::Id>; 1885 using count = TypedColumn<int64_t>; 1886 using cumulative_count = TypedColumn<int64_t>; 1887 using size = TypedColumn<int64_t>; 1888 using cumulative_size = TypedColumn<int64_t>; 1889 using alloc_count = TypedColumn<int64_t>; 1890 using cumulative_alloc_count = TypedColumn<int64_t>; 1891 using alloc_size = TypedColumn<int64_t>; 1892 using cumulative_alloc_size = TypedColumn<int64_t>; 1893 using parent_id = TypedColumn<std::optional<ExperimentalFlamegraphTable::Id>>; 1894 using source_file = TypedColumn<std::optional<StringPool::Id>>; 1895 using line_number = TypedColumn<std::optional<uint32_t>>; 1896 }; 1897 struct Row : public macros_internal::RootParentTable::Row { 1898 Row(StringPool::Id in_profile_type = {}, 1899 std::optional<int64_t> in_ts_in = {}, 1900 std::optional<StringPool::Id> in_ts_constraint = {}, 1901 std::optional<uint32_t> in_upid = {}, 1902 std::optional<StringPool::Id> in_upid_group = {}, 1903 std::optional<StringPool::Id> in_focus_str = {}, 1904 int64_t in_ts = {}, 1905 uint32_t in_depth = {}, 1906 StringPool::Id in_name = {}, 1907 StringPool::Id in_map_name = {}, 1908 int64_t in_count = {}, 1909 int64_t in_cumulative_count = {}, 1910 int64_t in_size = {}, 1911 int64_t in_cumulative_size = {}, 1912 int64_t in_alloc_count = {}, 1913 int64_t in_cumulative_alloc_count = {}, 1914 int64_t in_alloc_size = {}, 1915 int64_t in_cumulative_alloc_size = {}, 1916 std::optional<ExperimentalFlamegraphTable::Id> in_parent_id = {}, 1917 std::optional<StringPool::Id> in_source_file = {}, 1918 std::optional<uint32_t> in_line_number = {}, 1919 std::nullptr_t = nullptr) RowRow1920 : macros_internal::RootParentTable::Row(), 1921 profile_type(in_profile_type), 1922 ts_in(in_ts_in), 1923 ts_constraint(in_ts_constraint), 1924 upid(in_upid), 1925 upid_group(in_upid_group), 1926 focus_str(in_focus_str), 1927 ts(in_ts), 1928 depth(in_depth), 1929 name(in_name), 1930 map_name(in_map_name), 1931 count(in_count), 1932 cumulative_count(in_cumulative_count), 1933 size(in_size), 1934 cumulative_size(in_cumulative_size), 1935 alloc_count(in_alloc_count), 1936 cumulative_alloc_count(in_cumulative_alloc_count), 1937 alloc_size(in_alloc_size), 1938 cumulative_alloc_size(in_cumulative_alloc_size), 1939 parent_id(in_parent_id), 1940 source_file(in_source_file), 1941 line_number(in_line_number) { 1942 type_ = "experimental_flamegraph"; 1943 } 1944 StringPool::Id profile_type; 1945 std::optional<int64_t> ts_in; 1946 std::optional<StringPool::Id> ts_constraint; 1947 std::optional<uint32_t> upid; 1948 std::optional<StringPool::Id> upid_group; 1949 std::optional<StringPool::Id> focus_str; 1950 int64_t ts; 1951 uint32_t depth; 1952 StringPool::Id name; 1953 StringPool::Id map_name; 1954 int64_t count; 1955 int64_t cumulative_count; 1956 int64_t size; 1957 int64_t cumulative_size; 1958 int64_t alloc_count; 1959 int64_t cumulative_alloc_count; 1960 int64_t alloc_size; 1961 int64_t cumulative_alloc_size; 1962 std::optional<ExperimentalFlamegraphTable::Id> parent_id; 1963 std::optional<StringPool::Id> source_file; 1964 std::optional<uint32_t> line_number; 1965 1966 bool operator==(const ExperimentalFlamegraphTable::Row& other) const { 1967 return type() == other.type() && ColumnType::profile_type::Equals(profile_type, other.profile_type) && 1968 ColumnType::ts_in::Equals(ts_in, other.ts_in) && 1969 ColumnType::ts_constraint::Equals(ts_constraint, other.ts_constraint) && 1970 ColumnType::upid::Equals(upid, other.upid) && 1971 ColumnType::upid_group::Equals(upid_group, other.upid_group) && 1972 ColumnType::focus_str::Equals(focus_str, other.focus_str) && 1973 ColumnType::ts::Equals(ts, other.ts) && 1974 ColumnType::depth::Equals(depth, other.depth) && 1975 ColumnType::name::Equals(name, other.name) && 1976 ColumnType::map_name::Equals(map_name, other.map_name) && 1977 ColumnType::count::Equals(count, other.count) && 1978 ColumnType::cumulative_count::Equals(cumulative_count, other.cumulative_count) && 1979 ColumnType::size::Equals(size, other.size) && 1980 ColumnType::cumulative_size::Equals(cumulative_size, other.cumulative_size) && 1981 ColumnType::alloc_count::Equals(alloc_count, other.alloc_count) && 1982 ColumnType::cumulative_alloc_count::Equals(cumulative_alloc_count, other.cumulative_alloc_count) && 1983 ColumnType::alloc_size::Equals(alloc_size, other.alloc_size) && 1984 ColumnType::cumulative_alloc_size::Equals(cumulative_alloc_size, other.cumulative_alloc_size) && 1985 ColumnType::parent_id::Equals(parent_id, other.parent_id) && 1986 ColumnType::source_file::Equals(source_file, other.source_file) && 1987 ColumnType::line_number::Equals(line_number, other.line_number); 1988 } 1989 }; 1990 struct ColumnFlag { 1991 static constexpr uint32_t profile_type = static_cast<uint32_t>(ColumnLegacy::Flag::kHidden) | ColumnType::profile_type::default_flags(); 1992 static constexpr uint32_t ts_in = static_cast<uint32_t>(ColumnLegacy::Flag::kSorted | ColumnLegacy::Flag::kHidden) | ColumnType::ts_in::default_flags(); 1993 static constexpr uint32_t ts_constraint = static_cast<uint32_t>(ColumnLegacy::Flag::kHidden) | ColumnType::ts_constraint::default_flags(); 1994 static constexpr uint32_t upid = static_cast<uint32_t>(ColumnLegacy::Flag::kHidden) | ColumnType::upid::default_flags(); 1995 static constexpr uint32_t upid_group = static_cast<uint32_t>(ColumnLegacy::Flag::kHidden) | ColumnType::upid_group::default_flags(); 1996 static constexpr uint32_t focus_str = static_cast<uint32_t>(ColumnLegacy::Flag::kHidden) | ColumnType::focus_str::default_flags(); 1997 static constexpr uint32_t ts = static_cast<uint32_t>(ColumnLegacy::Flag::kSorted) | ColumnType::ts::default_flags(); 1998 static constexpr uint32_t depth = ColumnType::depth::default_flags(); 1999 static constexpr uint32_t name = ColumnType::name::default_flags(); 2000 static constexpr uint32_t map_name = ColumnType::map_name::default_flags(); 2001 static constexpr uint32_t count = ColumnType::count::default_flags(); 2002 static constexpr uint32_t cumulative_count = ColumnType::cumulative_count::default_flags(); 2003 static constexpr uint32_t size = ColumnType::size::default_flags(); 2004 static constexpr uint32_t cumulative_size = ColumnType::cumulative_size::default_flags(); 2005 static constexpr uint32_t alloc_count = ColumnType::alloc_count::default_flags(); 2006 static constexpr uint32_t cumulative_alloc_count = ColumnType::cumulative_alloc_count::default_flags(); 2007 static constexpr uint32_t alloc_size = ColumnType::alloc_size::default_flags(); 2008 static constexpr uint32_t cumulative_alloc_size = ColumnType::cumulative_alloc_size::default_flags(); 2009 static constexpr uint32_t parent_id = ColumnType::parent_id::default_flags(); 2010 static constexpr uint32_t source_file = ColumnType::source_file::default_flags(); 2011 static constexpr uint32_t line_number = ColumnType::line_number::default_flags(); 2012 }; 2013 2014 class RowNumber; 2015 class ConstRowReference; 2016 class RowReference; 2017 2018 class RowNumber : public macros_internal::AbstractRowNumber< 2019 ExperimentalFlamegraphTable, ConstRowReference, RowReference> { 2020 public: RowNumber(uint32_t row_number)2021 explicit RowNumber(uint32_t row_number) 2022 : AbstractRowNumber(row_number) {} 2023 }; 2024 static_assert(std::is_trivially_destructible_v<RowNumber>, 2025 "Inheritance used without trivial destruction"); 2026 2027 class ConstRowReference : public macros_internal::AbstractConstRowReference< 2028 ExperimentalFlamegraphTable, RowNumber> { 2029 public: ConstRowReference(const ExperimentalFlamegraphTable * table,uint32_t row_number)2030 ConstRowReference(const ExperimentalFlamegraphTable* table, uint32_t row_number) 2031 : AbstractConstRowReference(table, row_number) {} 2032 id()2033 ColumnType::id::type id() const { 2034 return table()->id()[row_number_]; 2035 } type()2036 ColumnType::type::type type() const { 2037 return table()->type()[row_number_]; 2038 } profile_type()2039 ColumnType::profile_type::type profile_type() const { 2040 return table()->profile_type()[row_number_]; 2041 } ts_in()2042 ColumnType::ts_in::type ts_in() const { 2043 return table()->ts_in()[row_number_]; 2044 } ts_constraint()2045 ColumnType::ts_constraint::type ts_constraint() const { 2046 return table()->ts_constraint()[row_number_]; 2047 } upid()2048 ColumnType::upid::type upid() const { 2049 return table()->upid()[row_number_]; 2050 } upid_group()2051 ColumnType::upid_group::type upid_group() const { 2052 return table()->upid_group()[row_number_]; 2053 } focus_str()2054 ColumnType::focus_str::type focus_str() const { 2055 return table()->focus_str()[row_number_]; 2056 } ts()2057 ColumnType::ts::type ts() const { 2058 return table()->ts()[row_number_]; 2059 } depth()2060 ColumnType::depth::type depth() const { 2061 return table()->depth()[row_number_]; 2062 } name()2063 ColumnType::name::type name() const { 2064 return table()->name()[row_number_]; 2065 } map_name()2066 ColumnType::map_name::type map_name() const { 2067 return table()->map_name()[row_number_]; 2068 } count()2069 ColumnType::count::type count() const { 2070 return table()->count()[row_number_]; 2071 } cumulative_count()2072 ColumnType::cumulative_count::type cumulative_count() const { 2073 return table()->cumulative_count()[row_number_]; 2074 } size()2075 ColumnType::size::type size() const { 2076 return table()->size()[row_number_]; 2077 } cumulative_size()2078 ColumnType::cumulative_size::type cumulative_size() const { 2079 return table()->cumulative_size()[row_number_]; 2080 } alloc_count()2081 ColumnType::alloc_count::type alloc_count() const { 2082 return table()->alloc_count()[row_number_]; 2083 } cumulative_alloc_count()2084 ColumnType::cumulative_alloc_count::type cumulative_alloc_count() const { 2085 return table()->cumulative_alloc_count()[row_number_]; 2086 } alloc_size()2087 ColumnType::alloc_size::type alloc_size() const { 2088 return table()->alloc_size()[row_number_]; 2089 } cumulative_alloc_size()2090 ColumnType::cumulative_alloc_size::type cumulative_alloc_size() const { 2091 return table()->cumulative_alloc_size()[row_number_]; 2092 } parent_id()2093 ColumnType::parent_id::type parent_id() const { 2094 return table()->parent_id()[row_number_]; 2095 } source_file()2096 ColumnType::source_file::type source_file() const { 2097 return table()->source_file()[row_number_]; 2098 } line_number()2099 ColumnType::line_number::type line_number() const { 2100 return table()->line_number()[row_number_]; 2101 } 2102 }; 2103 static_assert(std::is_trivially_destructible_v<ConstRowReference>, 2104 "Inheritance used without trivial destruction"); 2105 class RowReference : public ConstRowReference { 2106 public: RowReference(const ExperimentalFlamegraphTable * table,uint32_t row_number)2107 RowReference(const ExperimentalFlamegraphTable* table, uint32_t row_number) 2108 : ConstRowReference(table, row_number) {} 2109 set_profile_type(ColumnType::profile_type::non_optional_type v)2110 void set_profile_type( 2111 ColumnType::profile_type::non_optional_type v) { 2112 return mutable_table()->mutable_profile_type()->Set(row_number_, v); 2113 } set_ts_in(ColumnType::ts_in::non_optional_type v)2114 void set_ts_in( 2115 ColumnType::ts_in::non_optional_type v) { 2116 return mutable_table()->mutable_ts_in()->Set(row_number_, v); 2117 } set_ts_constraint(ColumnType::ts_constraint::non_optional_type v)2118 void set_ts_constraint( 2119 ColumnType::ts_constraint::non_optional_type v) { 2120 return mutable_table()->mutable_ts_constraint()->Set(row_number_, v); 2121 } set_upid(ColumnType::upid::non_optional_type v)2122 void set_upid( 2123 ColumnType::upid::non_optional_type v) { 2124 return mutable_table()->mutable_upid()->Set(row_number_, v); 2125 } set_upid_group(ColumnType::upid_group::non_optional_type v)2126 void set_upid_group( 2127 ColumnType::upid_group::non_optional_type v) { 2128 return mutable_table()->mutable_upid_group()->Set(row_number_, v); 2129 } set_focus_str(ColumnType::focus_str::non_optional_type v)2130 void set_focus_str( 2131 ColumnType::focus_str::non_optional_type v) { 2132 return mutable_table()->mutable_focus_str()->Set(row_number_, v); 2133 } set_ts(ColumnType::ts::non_optional_type v)2134 void set_ts( 2135 ColumnType::ts::non_optional_type v) { 2136 return mutable_table()->mutable_ts()->Set(row_number_, v); 2137 } set_depth(ColumnType::depth::non_optional_type v)2138 void set_depth( 2139 ColumnType::depth::non_optional_type v) { 2140 return mutable_table()->mutable_depth()->Set(row_number_, v); 2141 } set_name(ColumnType::name::non_optional_type v)2142 void set_name( 2143 ColumnType::name::non_optional_type v) { 2144 return mutable_table()->mutable_name()->Set(row_number_, v); 2145 } set_map_name(ColumnType::map_name::non_optional_type v)2146 void set_map_name( 2147 ColumnType::map_name::non_optional_type v) { 2148 return mutable_table()->mutable_map_name()->Set(row_number_, v); 2149 } set_count(ColumnType::count::non_optional_type v)2150 void set_count( 2151 ColumnType::count::non_optional_type v) { 2152 return mutable_table()->mutable_count()->Set(row_number_, v); 2153 } set_cumulative_count(ColumnType::cumulative_count::non_optional_type v)2154 void set_cumulative_count( 2155 ColumnType::cumulative_count::non_optional_type v) { 2156 return mutable_table()->mutable_cumulative_count()->Set(row_number_, v); 2157 } set_size(ColumnType::size::non_optional_type v)2158 void set_size( 2159 ColumnType::size::non_optional_type v) { 2160 return mutable_table()->mutable_size()->Set(row_number_, v); 2161 } set_cumulative_size(ColumnType::cumulative_size::non_optional_type v)2162 void set_cumulative_size( 2163 ColumnType::cumulative_size::non_optional_type v) { 2164 return mutable_table()->mutable_cumulative_size()->Set(row_number_, v); 2165 } set_alloc_count(ColumnType::alloc_count::non_optional_type v)2166 void set_alloc_count( 2167 ColumnType::alloc_count::non_optional_type v) { 2168 return mutable_table()->mutable_alloc_count()->Set(row_number_, v); 2169 } set_cumulative_alloc_count(ColumnType::cumulative_alloc_count::non_optional_type v)2170 void set_cumulative_alloc_count( 2171 ColumnType::cumulative_alloc_count::non_optional_type v) { 2172 return mutable_table()->mutable_cumulative_alloc_count()->Set(row_number_, v); 2173 } set_alloc_size(ColumnType::alloc_size::non_optional_type v)2174 void set_alloc_size( 2175 ColumnType::alloc_size::non_optional_type v) { 2176 return mutable_table()->mutable_alloc_size()->Set(row_number_, v); 2177 } set_cumulative_alloc_size(ColumnType::cumulative_alloc_size::non_optional_type v)2178 void set_cumulative_alloc_size( 2179 ColumnType::cumulative_alloc_size::non_optional_type v) { 2180 return mutable_table()->mutable_cumulative_alloc_size()->Set(row_number_, v); 2181 } set_parent_id(ColumnType::parent_id::non_optional_type v)2182 void set_parent_id( 2183 ColumnType::parent_id::non_optional_type v) { 2184 return mutable_table()->mutable_parent_id()->Set(row_number_, v); 2185 } set_source_file(ColumnType::source_file::non_optional_type v)2186 void set_source_file( 2187 ColumnType::source_file::non_optional_type v) { 2188 return mutable_table()->mutable_source_file()->Set(row_number_, v); 2189 } set_line_number(ColumnType::line_number::non_optional_type v)2190 void set_line_number( 2191 ColumnType::line_number::non_optional_type v) { 2192 return mutable_table()->mutable_line_number()->Set(row_number_, v); 2193 } 2194 2195 private: mutable_table()2196 ExperimentalFlamegraphTable* mutable_table() const { 2197 return const_cast<ExperimentalFlamegraphTable*>(table()); 2198 } 2199 }; 2200 static_assert(std::is_trivially_destructible_v<RowReference>, 2201 "Inheritance used without trivial destruction"); 2202 2203 class ConstIterator; 2204 class ConstIterator : public macros_internal::AbstractConstIterator< 2205 ConstIterator, ExperimentalFlamegraphTable, RowNumber, ConstRowReference> { 2206 public: id()2207 ColumnType::id::type id() const { 2208 const auto& col = table()->id(); 2209 return col.GetAtIdx( 2210 iterator_.StorageIndexForColumn(col.index_in_table())); 2211 } type()2212 ColumnType::type::type type() const { 2213 const auto& col = table()->type(); 2214 return col.GetAtIdx( 2215 iterator_.StorageIndexForColumn(col.index_in_table())); 2216 } profile_type()2217 ColumnType::profile_type::type profile_type() const { 2218 const auto& col = table()->profile_type(); 2219 return col.GetAtIdx( 2220 iterator_.StorageIndexForColumn(col.index_in_table())); 2221 } ts_in()2222 ColumnType::ts_in::type ts_in() const { 2223 const auto& col = table()->ts_in(); 2224 return col.GetAtIdx( 2225 iterator_.StorageIndexForColumn(col.index_in_table())); 2226 } ts_constraint()2227 ColumnType::ts_constraint::type ts_constraint() const { 2228 const auto& col = table()->ts_constraint(); 2229 return col.GetAtIdx( 2230 iterator_.StorageIndexForColumn(col.index_in_table())); 2231 } upid()2232 ColumnType::upid::type upid() const { 2233 const auto& col = table()->upid(); 2234 return col.GetAtIdx( 2235 iterator_.StorageIndexForColumn(col.index_in_table())); 2236 } upid_group()2237 ColumnType::upid_group::type upid_group() const { 2238 const auto& col = table()->upid_group(); 2239 return col.GetAtIdx( 2240 iterator_.StorageIndexForColumn(col.index_in_table())); 2241 } focus_str()2242 ColumnType::focus_str::type focus_str() const { 2243 const auto& col = table()->focus_str(); 2244 return col.GetAtIdx( 2245 iterator_.StorageIndexForColumn(col.index_in_table())); 2246 } ts()2247 ColumnType::ts::type ts() const { 2248 const auto& col = table()->ts(); 2249 return col.GetAtIdx( 2250 iterator_.StorageIndexForColumn(col.index_in_table())); 2251 } depth()2252 ColumnType::depth::type depth() const { 2253 const auto& col = table()->depth(); 2254 return col.GetAtIdx( 2255 iterator_.StorageIndexForColumn(col.index_in_table())); 2256 } name()2257 ColumnType::name::type name() const { 2258 const auto& col = table()->name(); 2259 return col.GetAtIdx( 2260 iterator_.StorageIndexForColumn(col.index_in_table())); 2261 } map_name()2262 ColumnType::map_name::type map_name() const { 2263 const auto& col = table()->map_name(); 2264 return col.GetAtIdx( 2265 iterator_.StorageIndexForColumn(col.index_in_table())); 2266 } count()2267 ColumnType::count::type count() const { 2268 const auto& col = table()->count(); 2269 return col.GetAtIdx( 2270 iterator_.StorageIndexForColumn(col.index_in_table())); 2271 } cumulative_count()2272 ColumnType::cumulative_count::type cumulative_count() const { 2273 const auto& col = table()->cumulative_count(); 2274 return col.GetAtIdx( 2275 iterator_.StorageIndexForColumn(col.index_in_table())); 2276 } size()2277 ColumnType::size::type size() const { 2278 const auto& col = table()->size(); 2279 return col.GetAtIdx( 2280 iterator_.StorageIndexForColumn(col.index_in_table())); 2281 } cumulative_size()2282 ColumnType::cumulative_size::type cumulative_size() const { 2283 const auto& col = table()->cumulative_size(); 2284 return col.GetAtIdx( 2285 iterator_.StorageIndexForColumn(col.index_in_table())); 2286 } alloc_count()2287 ColumnType::alloc_count::type alloc_count() const { 2288 const auto& col = table()->alloc_count(); 2289 return col.GetAtIdx( 2290 iterator_.StorageIndexForColumn(col.index_in_table())); 2291 } cumulative_alloc_count()2292 ColumnType::cumulative_alloc_count::type cumulative_alloc_count() const { 2293 const auto& col = table()->cumulative_alloc_count(); 2294 return col.GetAtIdx( 2295 iterator_.StorageIndexForColumn(col.index_in_table())); 2296 } alloc_size()2297 ColumnType::alloc_size::type alloc_size() const { 2298 const auto& col = table()->alloc_size(); 2299 return col.GetAtIdx( 2300 iterator_.StorageIndexForColumn(col.index_in_table())); 2301 } cumulative_alloc_size()2302 ColumnType::cumulative_alloc_size::type cumulative_alloc_size() const { 2303 const auto& col = table()->cumulative_alloc_size(); 2304 return col.GetAtIdx( 2305 iterator_.StorageIndexForColumn(col.index_in_table())); 2306 } parent_id()2307 ColumnType::parent_id::type parent_id() const { 2308 const auto& col = table()->parent_id(); 2309 return col.GetAtIdx( 2310 iterator_.StorageIndexForColumn(col.index_in_table())); 2311 } source_file()2312 ColumnType::source_file::type source_file() const { 2313 const auto& col = table()->source_file(); 2314 return col.GetAtIdx( 2315 iterator_.StorageIndexForColumn(col.index_in_table())); 2316 } line_number()2317 ColumnType::line_number::type line_number() const { 2318 const auto& col = table()->line_number(); 2319 return col.GetAtIdx( 2320 iterator_.StorageIndexForColumn(col.index_in_table())); 2321 } 2322 2323 protected: ConstIterator(const ExperimentalFlamegraphTable * table,Table::Iterator iterator)2324 explicit ConstIterator(const ExperimentalFlamegraphTable* table, 2325 Table::Iterator iterator) 2326 : AbstractConstIterator(table, std::move(iterator)) {} 2327 CurrentRowNumber()2328 uint32_t CurrentRowNumber() const { 2329 return iterator_.StorageIndexForLastOverlay(); 2330 } 2331 2332 private: 2333 friend class ExperimentalFlamegraphTable; 2334 friend class macros_internal::AbstractConstIterator< 2335 ConstIterator, ExperimentalFlamegraphTable, RowNumber, ConstRowReference>; 2336 }; 2337 class Iterator : public ConstIterator { 2338 public: row_reference()2339 RowReference row_reference() const { 2340 return {const_cast<ExperimentalFlamegraphTable*>(table()), CurrentRowNumber()}; 2341 } 2342 2343 private: 2344 friend class ExperimentalFlamegraphTable; 2345 Iterator(ExperimentalFlamegraphTable * table,Table::Iterator iterator)2346 explicit Iterator(ExperimentalFlamegraphTable* table, Table::Iterator iterator) 2347 : ConstIterator(table, std::move(iterator)) {} 2348 }; 2349 2350 struct IdAndRow { 2351 Id id; 2352 uint32_t row; 2353 RowReference row_reference; 2354 RowNumber row_number; 2355 }; 2356 GetColumns(ExperimentalFlamegraphTable * self,const macros_internal::MacroTable * parent)2357 static std::vector<ColumnLegacy> GetColumns( 2358 ExperimentalFlamegraphTable* self, 2359 const macros_internal::MacroTable* parent) { 2360 std::vector<ColumnLegacy> columns = 2361 CopyColumnsFromParentOrAddRootColumns(self, parent); 2362 uint32_t olay_idx = OverlayCount(parent); 2363 AddColumnToVector(columns, "profile_type", &self->profile_type_, ColumnFlag::profile_type, 2364 static_cast<uint32_t>(columns.size()), olay_idx); 2365 AddColumnToVector(columns, "ts_in", &self->ts_in_, ColumnFlag::ts_in, 2366 static_cast<uint32_t>(columns.size()), olay_idx); 2367 AddColumnToVector(columns, "ts_constraint", &self->ts_constraint_, ColumnFlag::ts_constraint, 2368 static_cast<uint32_t>(columns.size()), olay_idx); 2369 AddColumnToVector(columns, "upid", &self->upid_, ColumnFlag::upid, 2370 static_cast<uint32_t>(columns.size()), olay_idx); 2371 AddColumnToVector(columns, "upid_group", &self->upid_group_, ColumnFlag::upid_group, 2372 static_cast<uint32_t>(columns.size()), olay_idx); 2373 AddColumnToVector(columns, "focus_str", &self->focus_str_, ColumnFlag::focus_str, 2374 static_cast<uint32_t>(columns.size()), olay_idx); 2375 AddColumnToVector(columns, "ts", &self->ts_, ColumnFlag::ts, 2376 static_cast<uint32_t>(columns.size()), olay_idx); 2377 AddColumnToVector(columns, "depth", &self->depth_, ColumnFlag::depth, 2378 static_cast<uint32_t>(columns.size()), olay_idx); 2379 AddColumnToVector(columns, "name", &self->name_, ColumnFlag::name, 2380 static_cast<uint32_t>(columns.size()), olay_idx); 2381 AddColumnToVector(columns, "map_name", &self->map_name_, ColumnFlag::map_name, 2382 static_cast<uint32_t>(columns.size()), olay_idx); 2383 AddColumnToVector(columns, "count", &self->count_, ColumnFlag::count, 2384 static_cast<uint32_t>(columns.size()), olay_idx); 2385 AddColumnToVector(columns, "cumulative_count", &self->cumulative_count_, ColumnFlag::cumulative_count, 2386 static_cast<uint32_t>(columns.size()), olay_idx); 2387 AddColumnToVector(columns, "size", &self->size_, ColumnFlag::size, 2388 static_cast<uint32_t>(columns.size()), olay_idx); 2389 AddColumnToVector(columns, "cumulative_size", &self->cumulative_size_, ColumnFlag::cumulative_size, 2390 static_cast<uint32_t>(columns.size()), olay_idx); 2391 AddColumnToVector(columns, "alloc_count", &self->alloc_count_, ColumnFlag::alloc_count, 2392 static_cast<uint32_t>(columns.size()), olay_idx); 2393 AddColumnToVector(columns, "cumulative_alloc_count", &self->cumulative_alloc_count_, ColumnFlag::cumulative_alloc_count, 2394 static_cast<uint32_t>(columns.size()), olay_idx); 2395 AddColumnToVector(columns, "alloc_size", &self->alloc_size_, ColumnFlag::alloc_size, 2396 static_cast<uint32_t>(columns.size()), olay_idx); 2397 AddColumnToVector(columns, "cumulative_alloc_size", &self->cumulative_alloc_size_, ColumnFlag::cumulative_alloc_size, 2398 static_cast<uint32_t>(columns.size()), olay_idx); 2399 AddColumnToVector(columns, "parent_id", &self->parent_id_, ColumnFlag::parent_id, 2400 static_cast<uint32_t>(columns.size()), olay_idx); 2401 AddColumnToVector(columns, "source_file", &self->source_file_, ColumnFlag::source_file, 2402 static_cast<uint32_t>(columns.size()), olay_idx); 2403 AddColumnToVector(columns, "line_number", &self->line_number_, ColumnFlag::line_number, 2404 static_cast<uint32_t>(columns.size()), olay_idx); 2405 return columns; 2406 } 2407 ExperimentalFlamegraphTable(StringPool * pool)2408 PERFETTO_NO_INLINE explicit ExperimentalFlamegraphTable(StringPool* pool) 2409 : macros_internal::MacroTable( 2410 pool, 2411 GetColumns(this, nullptr), 2412 nullptr), 2413 profile_type_(ColumnStorage<ColumnType::profile_type::stored_type>::Create<false>()), 2414 ts_in_(ColumnStorage<ColumnType::ts_in::stored_type>::Create<false>()), 2415 ts_constraint_(ColumnStorage<ColumnType::ts_constraint::stored_type>::Create<false>()), 2416 upid_(ColumnStorage<ColumnType::upid::stored_type>::Create<false>()), 2417 upid_group_(ColumnStorage<ColumnType::upid_group::stored_type>::Create<false>()), 2418 focus_str_(ColumnStorage<ColumnType::focus_str::stored_type>::Create<false>()), 2419 ts_(ColumnStorage<ColumnType::ts::stored_type>::Create<false>()), 2420 depth_(ColumnStorage<ColumnType::depth::stored_type>::Create<false>()), 2421 name_(ColumnStorage<ColumnType::name::stored_type>::Create<false>()), 2422 map_name_(ColumnStorage<ColumnType::map_name::stored_type>::Create<false>()), 2423 count_(ColumnStorage<ColumnType::count::stored_type>::Create<false>()), 2424 cumulative_count_(ColumnStorage<ColumnType::cumulative_count::stored_type>::Create<false>()), 2425 size_(ColumnStorage<ColumnType::size::stored_type>::Create<false>()), 2426 cumulative_size_(ColumnStorage<ColumnType::cumulative_size::stored_type>::Create<false>()), 2427 alloc_count_(ColumnStorage<ColumnType::alloc_count::stored_type>::Create<false>()), 2428 cumulative_alloc_count_(ColumnStorage<ColumnType::cumulative_alloc_count::stored_type>::Create<false>()), 2429 alloc_size_(ColumnStorage<ColumnType::alloc_size::stored_type>::Create<false>()), 2430 cumulative_alloc_size_(ColumnStorage<ColumnType::cumulative_alloc_size::stored_type>::Create<false>()), 2431 parent_id_(ColumnStorage<ColumnType::parent_id::stored_type>::Create<false>()), 2432 source_file_(ColumnStorage<ColumnType::source_file::stored_type>::Create<false>()), 2433 line_number_(ColumnStorage<ColumnType::line_number::stored_type>::Create<false>()) 2434 , 2435 id_storage_layer_(new column::IdStorage()), 2436 type_storage_layer_( 2437 new column::StringStorage(string_pool(), &type_.vector())), 2438 profile_type_storage_layer_( 2439 new column::StringStorage(string_pool(), &profile_type_.vector())), 2440 ts_in_storage_layer_( 2441 new column::NumericStorage<ColumnType::ts_in::non_optional_stored_type>( 2442 &ts_in_.non_null_vector(), 2443 ColumnTypeHelper<ColumnType::ts_in::stored_type>::ToColumnType(), 2444 true)), 2445 ts_constraint_storage_layer_( 2446 new column::StringStorage(string_pool(), &ts_constraint_.vector())), 2447 upid_storage_layer_( 2448 new column::NumericStorage<ColumnType::upid::non_optional_stored_type>( 2449 &upid_.non_null_vector(), 2450 ColumnTypeHelper<ColumnType::upid::stored_type>::ToColumnType(), 2451 false)), 2452 upid_group_storage_layer_( 2453 new column::StringStorage(string_pool(), &upid_group_.vector())), 2454 focus_str_storage_layer_( 2455 new column::StringStorage(string_pool(), &focus_str_.vector())), 2456 ts_storage_layer_( 2457 new column::NumericStorage<ColumnType::ts::non_optional_stored_type>( 2458 &ts_.vector(), 2459 ColumnTypeHelper<ColumnType::ts::stored_type>::ToColumnType(), 2460 true)), 2461 depth_storage_layer_( 2462 new column::NumericStorage<ColumnType::depth::non_optional_stored_type>( 2463 &depth_.vector(), 2464 ColumnTypeHelper<ColumnType::depth::stored_type>::ToColumnType(), 2465 false)), 2466 name_storage_layer_( 2467 new column::StringStorage(string_pool(), &name_.vector())), 2468 map_name_storage_layer_( 2469 new column::StringStorage(string_pool(), &map_name_.vector())), 2470 count_storage_layer_( 2471 new column::NumericStorage<ColumnType::count::non_optional_stored_type>( 2472 &count_.vector(), 2473 ColumnTypeHelper<ColumnType::count::stored_type>::ToColumnType(), 2474 false)), 2475 cumulative_count_storage_layer_( 2476 new column::NumericStorage<ColumnType::cumulative_count::non_optional_stored_type>( 2477 &cumulative_count_.vector(), 2478 ColumnTypeHelper<ColumnType::cumulative_count::stored_type>::ToColumnType(), 2479 false)), 2480 size_storage_layer_( 2481 new column::NumericStorage<ColumnType::size::non_optional_stored_type>( 2482 &size_.vector(), 2483 ColumnTypeHelper<ColumnType::size::stored_type>::ToColumnType(), 2484 false)), 2485 cumulative_size_storage_layer_( 2486 new column::NumericStorage<ColumnType::cumulative_size::non_optional_stored_type>( 2487 &cumulative_size_.vector(), 2488 ColumnTypeHelper<ColumnType::cumulative_size::stored_type>::ToColumnType(), 2489 false)), 2490 alloc_count_storage_layer_( 2491 new column::NumericStorage<ColumnType::alloc_count::non_optional_stored_type>( 2492 &alloc_count_.vector(), 2493 ColumnTypeHelper<ColumnType::alloc_count::stored_type>::ToColumnType(), 2494 false)), 2495 cumulative_alloc_count_storage_layer_( 2496 new column::NumericStorage<ColumnType::cumulative_alloc_count::non_optional_stored_type>( 2497 &cumulative_alloc_count_.vector(), 2498 ColumnTypeHelper<ColumnType::cumulative_alloc_count::stored_type>::ToColumnType(), 2499 false)), 2500 alloc_size_storage_layer_( 2501 new column::NumericStorage<ColumnType::alloc_size::non_optional_stored_type>( 2502 &alloc_size_.vector(), 2503 ColumnTypeHelper<ColumnType::alloc_size::stored_type>::ToColumnType(), 2504 false)), 2505 cumulative_alloc_size_storage_layer_( 2506 new column::NumericStorage<ColumnType::cumulative_alloc_size::non_optional_stored_type>( 2507 &cumulative_alloc_size_.vector(), 2508 ColumnTypeHelper<ColumnType::cumulative_alloc_size::stored_type>::ToColumnType(), 2509 false)), 2510 parent_id_storage_layer_( 2511 new column::NumericStorage<ColumnType::parent_id::non_optional_stored_type>( 2512 &parent_id_.non_null_vector(), 2513 ColumnTypeHelper<ColumnType::parent_id::stored_type>::ToColumnType(), 2514 false)), 2515 source_file_storage_layer_( 2516 new column::StringStorage(string_pool(), &source_file_.vector())), 2517 line_number_storage_layer_( 2518 new column::NumericStorage<ColumnType::line_number::non_optional_stored_type>( 2519 &line_number_.non_null_vector(), 2520 ColumnTypeHelper<ColumnType::line_number::stored_type>::ToColumnType(), 2521 false)) 2522 , 2523 ts_in_null_layer_(new column::NullOverlay(ts_in_.bv())), 2524 upid_null_layer_(new column::NullOverlay(upid_.bv())), 2525 parent_id_null_layer_(new column::NullOverlay(parent_id_.bv())), 2526 line_number_null_layer_(new column::NullOverlay(line_number_.bv())) { 2527 static_assert( 2528 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::profile_type::stored_type>( 2529 ColumnFlag::profile_type), 2530 "Column type and flag combination is not valid"); 2531 static_assert( 2532 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::ts_in::stored_type>( 2533 ColumnFlag::ts_in), 2534 "Column type and flag combination is not valid"); 2535 static_assert( 2536 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::ts_constraint::stored_type>( 2537 ColumnFlag::ts_constraint), 2538 "Column type and flag combination is not valid"); 2539 static_assert( 2540 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::upid::stored_type>( 2541 ColumnFlag::upid), 2542 "Column type and flag combination is not valid"); 2543 static_assert( 2544 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::upid_group::stored_type>( 2545 ColumnFlag::upid_group), 2546 "Column type and flag combination is not valid"); 2547 static_assert( 2548 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::focus_str::stored_type>( 2549 ColumnFlag::focus_str), 2550 "Column type and flag combination is not valid"); 2551 static_assert( 2552 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::ts::stored_type>( 2553 ColumnFlag::ts), 2554 "Column type and flag combination is not valid"); 2555 static_assert( 2556 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::depth::stored_type>( 2557 ColumnFlag::depth), 2558 "Column type and flag combination is not valid"); 2559 static_assert( 2560 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::name::stored_type>( 2561 ColumnFlag::name), 2562 "Column type and flag combination is not valid"); 2563 static_assert( 2564 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::map_name::stored_type>( 2565 ColumnFlag::map_name), 2566 "Column type and flag combination is not valid"); 2567 static_assert( 2568 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::count::stored_type>( 2569 ColumnFlag::count), 2570 "Column type and flag combination is not valid"); 2571 static_assert( 2572 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::cumulative_count::stored_type>( 2573 ColumnFlag::cumulative_count), 2574 "Column type and flag combination is not valid"); 2575 static_assert( 2576 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::size::stored_type>( 2577 ColumnFlag::size), 2578 "Column type and flag combination is not valid"); 2579 static_assert( 2580 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::cumulative_size::stored_type>( 2581 ColumnFlag::cumulative_size), 2582 "Column type and flag combination is not valid"); 2583 static_assert( 2584 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::alloc_count::stored_type>( 2585 ColumnFlag::alloc_count), 2586 "Column type and flag combination is not valid"); 2587 static_assert( 2588 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::cumulative_alloc_count::stored_type>( 2589 ColumnFlag::cumulative_alloc_count), 2590 "Column type and flag combination is not valid"); 2591 static_assert( 2592 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::alloc_size::stored_type>( 2593 ColumnFlag::alloc_size), 2594 "Column type and flag combination is not valid"); 2595 static_assert( 2596 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::cumulative_alloc_size::stored_type>( 2597 ColumnFlag::cumulative_alloc_size), 2598 "Column type and flag combination is not valid"); 2599 static_assert( 2600 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::parent_id::stored_type>( 2601 ColumnFlag::parent_id), 2602 "Column type and flag combination is not valid"); 2603 static_assert( 2604 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::source_file::stored_type>( 2605 ColumnFlag::source_file), 2606 "Column type and flag combination is not valid"); 2607 static_assert( 2608 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::line_number::stored_type>( 2609 ColumnFlag::line_number), 2610 "Column type and flag combination is not valid"); 2611 OnConstructionCompletedRegularConstructor( 2612 {id_storage_layer_,type_storage_layer_,profile_type_storage_layer_,ts_in_storage_layer_,ts_constraint_storage_layer_,upid_storage_layer_,upid_group_storage_layer_,focus_str_storage_layer_,ts_storage_layer_,depth_storage_layer_,name_storage_layer_,map_name_storage_layer_,count_storage_layer_,cumulative_count_storage_layer_,size_storage_layer_,cumulative_size_storage_layer_,alloc_count_storage_layer_,cumulative_alloc_count_storage_layer_,alloc_size_storage_layer_,cumulative_alloc_size_storage_layer_,parent_id_storage_layer_,source_file_storage_layer_,line_number_storage_layer_}, 2613 {{},{},{},ts_in_null_layer_,{},upid_null_layer_,{},{},{},{},{},{},{},{},{},{},{},{},{},{},parent_id_null_layer_,{},line_number_null_layer_}); 2614 } 2615 ~ExperimentalFlamegraphTable() override; 2616 Name()2617 static const char* Name() { return "experimental_flamegraph"; } 2618 ComputeStaticSchema()2619 static Table::Schema ComputeStaticSchema() { 2620 Table::Schema schema; 2621 schema.columns.emplace_back(Table::Schema::Column{ 2622 "id", SqlValue::Type::kLong, true, true, false, false}); 2623 schema.columns.emplace_back(Table::Schema::Column{ 2624 "type", SqlValue::Type::kString, false, false, false, false}); 2625 schema.columns.emplace_back(Table::Schema::Column{ 2626 "profile_type", ColumnType::profile_type::SqlValueType(), false, 2627 false, 2628 true, 2629 false}); 2630 schema.columns.emplace_back(Table::Schema::Column{ 2631 "ts_in", ColumnType::ts_in::SqlValueType(), false, 2632 true, 2633 true, 2634 false}); 2635 schema.columns.emplace_back(Table::Schema::Column{ 2636 "ts_constraint", ColumnType::ts_constraint::SqlValueType(), false, 2637 false, 2638 true, 2639 false}); 2640 schema.columns.emplace_back(Table::Schema::Column{ 2641 "upid", ColumnType::upid::SqlValueType(), false, 2642 false, 2643 true, 2644 false}); 2645 schema.columns.emplace_back(Table::Schema::Column{ 2646 "upid_group", ColumnType::upid_group::SqlValueType(), false, 2647 false, 2648 true, 2649 false}); 2650 schema.columns.emplace_back(Table::Schema::Column{ 2651 "focus_str", ColumnType::focus_str::SqlValueType(), false, 2652 false, 2653 true, 2654 false}); 2655 schema.columns.emplace_back(Table::Schema::Column{ 2656 "ts", ColumnType::ts::SqlValueType(), false, 2657 true, 2658 false, 2659 false}); 2660 schema.columns.emplace_back(Table::Schema::Column{ 2661 "depth", ColumnType::depth::SqlValueType(), false, 2662 false, 2663 false, 2664 false}); 2665 schema.columns.emplace_back(Table::Schema::Column{ 2666 "name", ColumnType::name::SqlValueType(), false, 2667 false, 2668 false, 2669 false}); 2670 schema.columns.emplace_back(Table::Schema::Column{ 2671 "map_name", ColumnType::map_name::SqlValueType(), false, 2672 false, 2673 false, 2674 false}); 2675 schema.columns.emplace_back(Table::Schema::Column{ 2676 "count", ColumnType::count::SqlValueType(), false, 2677 false, 2678 false, 2679 false}); 2680 schema.columns.emplace_back(Table::Schema::Column{ 2681 "cumulative_count", ColumnType::cumulative_count::SqlValueType(), false, 2682 false, 2683 false, 2684 false}); 2685 schema.columns.emplace_back(Table::Schema::Column{ 2686 "size", ColumnType::size::SqlValueType(), false, 2687 false, 2688 false, 2689 false}); 2690 schema.columns.emplace_back(Table::Schema::Column{ 2691 "cumulative_size", ColumnType::cumulative_size::SqlValueType(), false, 2692 false, 2693 false, 2694 false}); 2695 schema.columns.emplace_back(Table::Schema::Column{ 2696 "alloc_count", ColumnType::alloc_count::SqlValueType(), false, 2697 false, 2698 false, 2699 false}); 2700 schema.columns.emplace_back(Table::Schema::Column{ 2701 "cumulative_alloc_count", ColumnType::cumulative_alloc_count::SqlValueType(), false, 2702 false, 2703 false, 2704 false}); 2705 schema.columns.emplace_back(Table::Schema::Column{ 2706 "alloc_size", ColumnType::alloc_size::SqlValueType(), false, 2707 false, 2708 false, 2709 false}); 2710 schema.columns.emplace_back(Table::Schema::Column{ 2711 "cumulative_alloc_size", ColumnType::cumulative_alloc_size::SqlValueType(), false, 2712 false, 2713 false, 2714 false}); 2715 schema.columns.emplace_back(Table::Schema::Column{ 2716 "parent_id", ColumnType::parent_id::SqlValueType(), false, 2717 false, 2718 false, 2719 false}); 2720 schema.columns.emplace_back(Table::Schema::Column{ 2721 "source_file", ColumnType::source_file::SqlValueType(), false, 2722 false, 2723 false, 2724 false}); 2725 schema.columns.emplace_back(Table::Schema::Column{ 2726 "line_number", ColumnType::line_number::SqlValueType(), false, 2727 false, 2728 false, 2729 false}); 2730 return schema; 2731 } 2732 IterateRows()2733 ConstIterator IterateRows() const { 2734 return ConstIterator(this, Table::IterateRows()); 2735 } 2736 IterateRows()2737 Iterator IterateRows() { return Iterator(this, Table::IterateRows()); } 2738 FilterToIterator(const Query & q)2739 ConstIterator FilterToIterator(const Query& q) const { 2740 return ConstIterator(this, QueryToIterator(q)); 2741 } 2742 FilterToIterator(const Query & q)2743 Iterator FilterToIterator(const Query& q) { 2744 return Iterator(this, QueryToIterator(q)); 2745 } 2746 ShrinkToFit()2747 void ShrinkToFit() { 2748 type_.ShrinkToFit(); 2749 profile_type_.ShrinkToFit(); 2750 ts_in_.ShrinkToFit(); 2751 ts_constraint_.ShrinkToFit(); 2752 upid_.ShrinkToFit(); 2753 upid_group_.ShrinkToFit(); 2754 focus_str_.ShrinkToFit(); 2755 ts_.ShrinkToFit(); 2756 depth_.ShrinkToFit(); 2757 name_.ShrinkToFit(); 2758 map_name_.ShrinkToFit(); 2759 count_.ShrinkToFit(); 2760 cumulative_count_.ShrinkToFit(); 2761 size_.ShrinkToFit(); 2762 cumulative_size_.ShrinkToFit(); 2763 alloc_count_.ShrinkToFit(); 2764 cumulative_alloc_count_.ShrinkToFit(); 2765 alloc_size_.ShrinkToFit(); 2766 cumulative_alloc_size_.ShrinkToFit(); 2767 parent_id_.ShrinkToFit(); 2768 source_file_.ShrinkToFit(); 2769 line_number_.ShrinkToFit(); 2770 } 2771 2772 ConstRowReference operator[](uint32_t r) const { 2773 return ConstRowReference(this, r); 2774 } 2775 RowReference operator[](uint32_t r) { return RowReference(this, r); } 2776 ConstRowReference operator[](RowNumber r) const { 2777 return ConstRowReference(this, r.row_number()); 2778 } 2779 RowReference operator[](RowNumber r) { 2780 return RowReference(this, r.row_number()); 2781 } 2782 FindById(Id find_id)2783 std::optional<ConstRowReference> FindById(Id find_id) const { 2784 std::optional<uint32_t> row = id().IndexOf(find_id); 2785 return row ? std::make_optional(ConstRowReference(this, *row)) 2786 : std::nullopt; 2787 } 2788 FindById(Id find_id)2789 std::optional<RowReference> FindById(Id find_id) { 2790 std::optional<uint32_t> row = id().IndexOf(find_id); 2791 return row ? std::make_optional(RowReference(this, *row)) : std::nullopt; 2792 } 2793 Insert(const Row & row)2794 IdAndRow Insert(const Row& row) { 2795 uint32_t row_number = row_count(); 2796 Id id = Id{row_number}; 2797 type_.Append(string_pool()->InternString(row.type())); 2798 mutable_profile_type()->Append(row.profile_type); 2799 mutable_ts_in()->Append(row.ts_in); 2800 mutable_ts_constraint()->Append(row.ts_constraint); 2801 mutable_upid()->Append(row.upid); 2802 mutable_upid_group()->Append(row.upid_group); 2803 mutable_focus_str()->Append(row.focus_str); 2804 mutable_ts()->Append(row.ts); 2805 mutable_depth()->Append(row.depth); 2806 mutable_name()->Append(row.name); 2807 mutable_map_name()->Append(row.map_name); 2808 mutable_count()->Append(row.count); 2809 mutable_cumulative_count()->Append(row.cumulative_count); 2810 mutable_size()->Append(row.size); 2811 mutable_cumulative_size()->Append(row.cumulative_size); 2812 mutable_alloc_count()->Append(row.alloc_count); 2813 mutable_cumulative_alloc_count()->Append(row.cumulative_alloc_count); 2814 mutable_alloc_size()->Append(row.alloc_size); 2815 mutable_cumulative_alloc_size()->Append(row.cumulative_alloc_size); 2816 mutable_parent_id()->Append(row.parent_id); 2817 mutable_source_file()->Append(row.source_file); 2818 mutable_line_number()->Append(row.line_number); 2819 UpdateSelfOverlayAfterInsert(); 2820 return IdAndRow{id, row_number, RowReference(this, row_number), 2821 RowNumber(row_number)}; 2822 } 2823 2824 2825 id()2826 const IdColumn<ExperimentalFlamegraphTable::Id>& id() const { 2827 return static_cast<const ColumnType::id&>(columns()[ColumnIndex::id]); 2828 } type()2829 const TypedColumn<StringPool::Id>& type() const { 2830 return static_cast<const ColumnType::type&>(columns()[ColumnIndex::type]); 2831 } profile_type()2832 const TypedColumn<StringPool::Id>& profile_type() const { 2833 return static_cast<const ColumnType::profile_type&>(columns()[ColumnIndex::profile_type]); 2834 } ts_in()2835 const TypedColumn<std::optional<int64_t>>& ts_in() const { 2836 return static_cast<const ColumnType::ts_in&>(columns()[ColumnIndex::ts_in]); 2837 } ts_constraint()2838 const TypedColumn<std::optional<StringPool::Id>>& ts_constraint() const { 2839 return static_cast<const ColumnType::ts_constraint&>(columns()[ColumnIndex::ts_constraint]); 2840 } upid()2841 const TypedColumn<std::optional<uint32_t>>& upid() const { 2842 return static_cast<const ColumnType::upid&>(columns()[ColumnIndex::upid]); 2843 } upid_group()2844 const TypedColumn<std::optional<StringPool::Id>>& upid_group() const { 2845 return static_cast<const ColumnType::upid_group&>(columns()[ColumnIndex::upid_group]); 2846 } focus_str()2847 const TypedColumn<std::optional<StringPool::Id>>& focus_str() const { 2848 return static_cast<const ColumnType::focus_str&>(columns()[ColumnIndex::focus_str]); 2849 } ts()2850 const TypedColumn<int64_t>& ts() const { 2851 return static_cast<const ColumnType::ts&>(columns()[ColumnIndex::ts]); 2852 } depth()2853 const TypedColumn<uint32_t>& depth() const { 2854 return static_cast<const ColumnType::depth&>(columns()[ColumnIndex::depth]); 2855 } name()2856 const TypedColumn<StringPool::Id>& name() const { 2857 return static_cast<const ColumnType::name&>(columns()[ColumnIndex::name]); 2858 } map_name()2859 const TypedColumn<StringPool::Id>& map_name() const { 2860 return static_cast<const ColumnType::map_name&>(columns()[ColumnIndex::map_name]); 2861 } count()2862 const TypedColumn<int64_t>& count() const { 2863 return static_cast<const ColumnType::count&>(columns()[ColumnIndex::count]); 2864 } cumulative_count()2865 const TypedColumn<int64_t>& cumulative_count() const { 2866 return static_cast<const ColumnType::cumulative_count&>(columns()[ColumnIndex::cumulative_count]); 2867 } size()2868 const TypedColumn<int64_t>& size() const { 2869 return static_cast<const ColumnType::size&>(columns()[ColumnIndex::size]); 2870 } cumulative_size()2871 const TypedColumn<int64_t>& cumulative_size() const { 2872 return static_cast<const ColumnType::cumulative_size&>(columns()[ColumnIndex::cumulative_size]); 2873 } alloc_count()2874 const TypedColumn<int64_t>& alloc_count() const { 2875 return static_cast<const ColumnType::alloc_count&>(columns()[ColumnIndex::alloc_count]); 2876 } cumulative_alloc_count()2877 const TypedColumn<int64_t>& cumulative_alloc_count() const { 2878 return static_cast<const ColumnType::cumulative_alloc_count&>(columns()[ColumnIndex::cumulative_alloc_count]); 2879 } alloc_size()2880 const TypedColumn<int64_t>& alloc_size() const { 2881 return static_cast<const ColumnType::alloc_size&>(columns()[ColumnIndex::alloc_size]); 2882 } cumulative_alloc_size()2883 const TypedColumn<int64_t>& cumulative_alloc_size() const { 2884 return static_cast<const ColumnType::cumulative_alloc_size&>(columns()[ColumnIndex::cumulative_alloc_size]); 2885 } parent_id()2886 const TypedColumn<std::optional<ExperimentalFlamegraphTable::Id>>& parent_id() const { 2887 return static_cast<const ColumnType::parent_id&>(columns()[ColumnIndex::parent_id]); 2888 } source_file()2889 const TypedColumn<std::optional<StringPool::Id>>& source_file() const { 2890 return static_cast<const ColumnType::source_file&>(columns()[ColumnIndex::source_file]); 2891 } line_number()2892 const TypedColumn<std::optional<uint32_t>>& line_number() const { 2893 return static_cast<const ColumnType::line_number&>(columns()[ColumnIndex::line_number]); 2894 } 2895 mutable_profile_type()2896 TypedColumn<StringPool::Id>* mutable_profile_type() { 2897 return static_cast<ColumnType::profile_type*>( 2898 GetColumn(ColumnIndex::profile_type)); 2899 } mutable_ts_in()2900 TypedColumn<std::optional<int64_t>>* mutable_ts_in() { 2901 return static_cast<ColumnType::ts_in*>( 2902 GetColumn(ColumnIndex::ts_in)); 2903 } mutable_ts_constraint()2904 TypedColumn<std::optional<StringPool::Id>>* mutable_ts_constraint() { 2905 return static_cast<ColumnType::ts_constraint*>( 2906 GetColumn(ColumnIndex::ts_constraint)); 2907 } mutable_upid()2908 TypedColumn<std::optional<uint32_t>>* mutable_upid() { 2909 return static_cast<ColumnType::upid*>( 2910 GetColumn(ColumnIndex::upid)); 2911 } mutable_upid_group()2912 TypedColumn<std::optional<StringPool::Id>>* mutable_upid_group() { 2913 return static_cast<ColumnType::upid_group*>( 2914 GetColumn(ColumnIndex::upid_group)); 2915 } mutable_focus_str()2916 TypedColumn<std::optional<StringPool::Id>>* mutable_focus_str() { 2917 return static_cast<ColumnType::focus_str*>( 2918 GetColumn(ColumnIndex::focus_str)); 2919 } mutable_ts()2920 TypedColumn<int64_t>* mutable_ts() { 2921 return static_cast<ColumnType::ts*>( 2922 GetColumn(ColumnIndex::ts)); 2923 } mutable_depth()2924 TypedColumn<uint32_t>* mutable_depth() { 2925 return static_cast<ColumnType::depth*>( 2926 GetColumn(ColumnIndex::depth)); 2927 } mutable_name()2928 TypedColumn<StringPool::Id>* mutable_name() { 2929 return static_cast<ColumnType::name*>( 2930 GetColumn(ColumnIndex::name)); 2931 } mutable_map_name()2932 TypedColumn<StringPool::Id>* mutable_map_name() { 2933 return static_cast<ColumnType::map_name*>( 2934 GetColumn(ColumnIndex::map_name)); 2935 } mutable_count()2936 TypedColumn<int64_t>* mutable_count() { 2937 return static_cast<ColumnType::count*>( 2938 GetColumn(ColumnIndex::count)); 2939 } mutable_cumulative_count()2940 TypedColumn<int64_t>* mutable_cumulative_count() { 2941 return static_cast<ColumnType::cumulative_count*>( 2942 GetColumn(ColumnIndex::cumulative_count)); 2943 } mutable_size()2944 TypedColumn<int64_t>* mutable_size() { 2945 return static_cast<ColumnType::size*>( 2946 GetColumn(ColumnIndex::size)); 2947 } mutable_cumulative_size()2948 TypedColumn<int64_t>* mutable_cumulative_size() { 2949 return static_cast<ColumnType::cumulative_size*>( 2950 GetColumn(ColumnIndex::cumulative_size)); 2951 } mutable_alloc_count()2952 TypedColumn<int64_t>* mutable_alloc_count() { 2953 return static_cast<ColumnType::alloc_count*>( 2954 GetColumn(ColumnIndex::alloc_count)); 2955 } mutable_cumulative_alloc_count()2956 TypedColumn<int64_t>* mutable_cumulative_alloc_count() { 2957 return static_cast<ColumnType::cumulative_alloc_count*>( 2958 GetColumn(ColumnIndex::cumulative_alloc_count)); 2959 } mutable_alloc_size()2960 TypedColumn<int64_t>* mutable_alloc_size() { 2961 return static_cast<ColumnType::alloc_size*>( 2962 GetColumn(ColumnIndex::alloc_size)); 2963 } mutable_cumulative_alloc_size()2964 TypedColumn<int64_t>* mutable_cumulative_alloc_size() { 2965 return static_cast<ColumnType::cumulative_alloc_size*>( 2966 GetColumn(ColumnIndex::cumulative_alloc_size)); 2967 } mutable_parent_id()2968 TypedColumn<std::optional<ExperimentalFlamegraphTable::Id>>* mutable_parent_id() { 2969 return static_cast<ColumnType::parent_id*>( 2970 GetColumn(ColumnIndex::parent_id)); 2971 } mutable_source_file()2972 TypedColumn<std::optional<StringPool::Id>>* mutable_source_file() { 2973 return static_cast<ColumnType::source_file*>( 2974 GetColumn(ColumnIndex::source_file)); 2975 } mutable_line_number()2976 TypedColumn<std::optional<uint32_t>>* mutable_line_number() { 2977 return static_cast<ColumnType::line_number*>( 2978 GetColumn(ColumnIndex::line_number)); 2979 } 2980 2981 private: 2982 2983 2984 ColumnStorage<ColumnType::profile_type::stored_type> profile_type_; 2985 ColumnStorage<ColumnType::ts_in::stored_type> ts_in_; 2986 ColumnStorage<ColumnType::ts_constraint::stored_type> ts_constraint_; 2987 ColumnStorage<ColumnType::upid::stored_type> upid_; 2988 ColumnStorage<ColumnType::upid_group::stored_type> upid_group_; 2989 ColumnStorage<ColumnType::focus_str::stored_type> focus_str_; 2990 ColumnStorage<ColumnType::ts::stored_type> ts_; 2991 ColumnStorage<ColumnType::depth::stored_type> depth_; 2992 ColumnStorage<ColumnType::name::stored_type> name_; 2993 ColumnStorage<ColumnType::map_name::stored_type> map_name_; 2994 ColumnStorage<ColumnType::count::stored_type> count_; 2995 ColumnStorage<ColumnType::cumulative_count::stored_type> cumulative_count_; 2996 ColumnStorage<ColumnType::size::stored_type> size_; 2997 ColumnStorage<ColumnType::cumulative_size::stored_type> cumulative_size_; 2998 ColumnStorage<ColumnType::alloc_count::stored_type> alloc_count_; 2999 ColumnStorage<ColumnType::cumulative_alloc_count::stored_type> cumulative_alloc_count_; 3000 ColumnStorage<ColumnType::alloc_size::stored_type> alloc_size_; 3001 ColumnStorage<ColumnType::cumulative_alloc_size::stored_type> cumulative_alloc_size_; 3002 ColumnStorage<ColumnType::parent_id::stored_type> parent_id_; 3003 ColumnStorage<ColumnType::source_file::stored_type> source_file_; 3004 ColumnStorage<ColumnType::line_number::stored_type> line_number_; 3005 3006 RefPtr<column::StorageLayer> id_storage_layer_; 3007 RefPtr<column::StorageLayer> type_storage_layer_; 3008 RefPtr<column::StorageLayer> profile_type_storage_layer_; 3009 RefPtr<column::StorageLayer> ts_in_storage_layer_; 3010 RefPtr<column::StorageLayer> ts_constraint_storage_layer_; 3011 RefPtr<column::StorageLayer> upid_storage_layer_; 3012 RefPtr<column::StorageLayer> upid_group_storage_layer_; 3013 RefPtr<column::StorageLayer> focus_str_storage_layer_; 3014 RefPtr<column::StorageLayer> ts_storage_layer_; 3015 RefPtr<column::StorageLayer> depth_storage_layer_; 3016 RefPtr<column::StorageLayer> name_storage_layer_; 3017 RefPtr<column::StorageLayer> map_name_storage_layer_; 3018 RefPtr<column::StorageLayer> count_storage_layer_; 3019 RefPtr<column::StorageLayer> cumulative_count_storage_layer_; 3020 RefPtr<column::StorageLayer> size_storage_layer_; 3021 RefPtr<column::StorageLayer> cumulative_size_storage_layer_; 3022 RefPtr<column::StorageLayer> alloc_count_storage_layer_; 3023 RefPtr<column::StorageLayer> cumulative_alloc_count_storage_layer_; 3024 RefPtr<column::StorageLayer> alloc_size_storage_layer_; 3025 RefPtr<column::StorageLayer> cumulative_alloc_size_storage_layer_; 3026 RefPtr<column::StorageLayer> parent_id_storage_layer_; 3027 RefPtr<column::StorageLayer> source_file_storage_layer_; 3028 RefPtr<column::StorageLayer> line_number_storage_layer_; 3029 3030 RefPtr<column::OverlayLayer> ts_in_null_layer_; 3031 RefPtr<column::OverlayLayer> upid_null_layer_; 3032 RefPtr<column::OverlayLayer> parent_id_null_layer_; 3033 RefPtr<column::OverlayLayer> line_number_null_layer_; 3034 }; 3035 3036 3037 class GpuCounterGroupTable : public macros_internal::MacroTable { 3038 public: 3039 static constexpr uint32_t kColumnCount = 4; 3040 3041 struct Id : public BaseId { 3042 Id() = default; IdId3043 explicit constexpr Id(uint32_t v) : BaseId(v) {} 3044 }; 3045 static_assert(std::is_trivially_destructible_v<Id>, 3046 "Inheritance used without trivial destruction"); 3047 3048 struct ColumnIndex { 3049 static constexpr uint32_t id = 0; 3050 static constexpr uint32_t type = 1; 3051 static constexpr uint32_t group_id = 2; 3052 static constexpr uint32_t track_id = 3; 3053 }; 3054 struct ColumnType { 3055 using id = IdColumn<GpuCounterGroupTable::Id>; 3056 using type = TypedColumn<StringPool::Id>; 3057 using group_id = TypedColumn<int32_t>; 3058 using track_id = TypedColumn<TrackTable::Id>; 3059 }; 3060 struct Row : public macros_internal::RootParentTable::Row { 3061 Row(int32_t in_group_id = {}, 3062 TrackTable::Id in_track_id = {}, 3063 std::nullptr_t = nullptr) RowRow3064 : macros_internal::RootParentTable::Row(), 3065 group_id(in_group_id), 3066 track_id(in_track_id) { 3067 type_ = "gpu_counter_group"; 3068 } 3069 int32_t group_id; 3070 TrackTable::Id track_id; 3071 3072 bool operator==(const GpuCounterGroupTable::Row& other) const { 3073 return type() == other.type() && ColumnType::group_id::Equals(group_id, other.group_id) && 3074 ColumnType::track_id::Equals(track_id, other.track_id); 3075 } 3076 }; 3077 struct ColumnFlag { 3078 static constexpr uint32_t group_id = ColumnType::group_id::default_flags(); 3079 static constexpr uint32_t track_id = ColumnType::track_id::default_flags(); 3080 }; 3081 3082 class RowNumber; 3083 class ConstRowReference; 3084 class RowReference; 3085 3086 class RowNumber : public macros_internal::AbstractRowNumber< 3087 GpuCounterGroupTable, ConstRowReference, RowReference> { 3088 public: RowNumber(uint32_t row_number)3089 explicit RowNumber(uint32_t row_number) 3090 : AbstractRowNumber(row_number) {} 3091 }; 3092 static_assert(std::is_trivially_destructible_v<RowNumber>, 3093 "Inheritance used without trivial destruction"); 3094 3095 class ConstRowReference : public macros_internal::AbstractConstRowReference< 3096 GpuCounterGroupTable, RowNumber> { 3097 public: ConstRowReference(const GpuCounterGroupTable * table,uint32_t row_number)3098 ConstRowReference(const GpuCounterGroupTable* table, uint32_t row_number) 3099 : AbstractConstRowReference(table, row_number) {} 3100 id()3101 ColumnType::id::type id() const { 3102 return table()->id()[row_number_]; 3103 } type()3104 ColumnType::type::type type() const { 3105 return table()->type()[row_number_]; 3106 } group_id()3107 ColumnType::group_id::type group_id() const { 3108 return table()->group_id()[row_number_]; 3109 } track_id()3110 ColumnType::track_id::type track_id() const { 3111 return table()->track_id()[row_number_]; 3112 } 3113 }; 3114 static_assert(std::is_trivially_destructible_v<ConstRowReference>, 3115 "Inheritance used without trivial destruction"); 3116 class RowReference : public ConstRowReference { 3117 public: RowReference(const GpuCounterGroupTable * table,uint32_t row_number)3118 RowReference(const GpuCounterGroupTable* table, uint32_t row_number) 3119 : ConstRowReference(table, row_number) {} 3120 set_group_id(ColumnType::group_id::non_optional_type v)3121 void set_group_id( 3122 ColumnType::group_id::non_optional_type v) { 3123 return mutable_table()->mutable_group_id()->Set(row_number_, v); 3124 } set_track_id(ColumnType::track_id::non_optional_type v)3125 void set_track_id( 3126 ColumnType::track_id::non_optional_type v) { 3127 return mutable_table()->mutable_track_id()->Set(row_number_, v); 3128 } 3129 3130 private: mutable_table()3131 GpuCounterGroupTable* mutable_table() const { 3132 return const_cast<GpuCounterGroupTable*>(table()); 3133 } 3134 }; 3135 static_assert(std::is_trivially_destructible_v<RowReference>, 3136 "Inheritance used without trivial destruction"); 3137 3138 class ConstIterator; 3139 class ConstIterator : public macros_internal::AbstractConstIterator< 3140 ConstIterator, GpuCounterGroupTable, RowNumber, ConstRowReference> { 3141 public: id()3142 ColumnType::id::type id() const { 3143 const auto& col = table()->id(); 3144 return col.GetAtIdx( 3145 iterator_.StorageIndexForColumn(col.index_in_table())); 3146 } type()3147 ColumnType::type::type type() const { 3148 const auto& col = table()->type(); 3149 return col.GetAtIdx( 3150 iterator_.StorageIndexForColumn(col.index_in_table())); 3151 } group_id()3152 ColumnType::group_id::type group_id() const { 3153 const auto& col = table()->group_id(); 3154 return col.GetAtIdx( 3155 iterator_.StorageIndexForColumn(col.index_in_table())); 3156 } track_id()3157 ColumnType::track_id::type track_id() const { 3158 const auto& col = table()->track_id(); 3159 return col.GetAtIdx( 3160 iterator_.StorageIndexForColumn(col.index_in_table())); 3161 } 3162 3163 protected: ConstIterator(const GpuCounterGroupTable * table,Table::Iterator iterator)3164 explicit ConstIterator(const GpuCounterGroupTable* table, 3165 Table::Iterator iterator) 3166 : AbstractConstIterator(table, std::move(iterator)) {} 3167 CurrentRowNumber()3168 uint32_t CurrentRowNumber() const { 3169 return iterator_.StorageIndexForLastOverlay(); 3170 } 3171 3172 private: 3173 friend class GpuCounterGroupTable; 3174 friend class macros_internal::AbstractConstIterator< 3175 ConstIterator, GpuCounterGroupTable, RowNumber, ConstRowReference>; 3176 }; 3177 class Iterator : public ConstIterator { 3178 public: row_reference()3179 RowReference row_reference() const { 3180 return {const_cast<GpuCounterGroupTable*>(table()), CurrentRowNumber()}; 3181 } 3182 3183 private: 3184 friend class GpuCounterGroupTable; 3185 Iterator(GpuCounterGroupTable * table,Table::Iterator iterator)3186 explicit Iterator(GpuCounterGroupTable* table, Table::Iterator iterator) 3187 : ConstIterator(table, std::move(iterator)) {} 3188 }; 3189 3190 struct IdAndRow { 3191 Id id; 3192 uint32_t row; 3193 RowReference row_reference; 3194 RowNumber row_number; 3195 }; 3196 GetColumns(GpuCounterGroupTable * self,const macros_internal::MacroTable * parent)3197 static std::vector<ColumnLegacy> GetColumns( 3198 GpuCounterGroupTable* self, 3199 const macros_internal::MacroTable* parent) { 3200 std::vector<ColumnLegacy> columns = 3201 CopyColumnsFromParentOrAddRootColumns(self, parent); 3202 uint32_t olay_idx = OverlayCount(parent); 3203 AddColumnToVector(columns, "group_id", &self->group_id_, ColumnFlag::group_id, 3204 static_cast<uint32_t>(columns.size()), olay_idx); 3205 AddColumnToVector(columns, "track_id", &self->track_id_, ColumnFlag::track_id, 3206 static_cast<uint32_t>(columns.size()), olay_idx); 3207 return columns; 3208 } 3209 GpuCounterGroupTable(StringPool * pool)3210 PERFETTO_NO_INLINE explicit GpuCounterGroupTable(StringPool* pool) 3211 : macros_internal::MacroTable( 3212 pool, 3213 GetColumns(this, nullptr), 3214 nullptr), 3215 group_id_(ColumnStorage<ColumnType::group_id::stored_type>::Create<false>()), 3216 track_id_(ColumnStorage<ColumnType::track_id::stored_type>::Create<false>()) 3217 , 3218 id_storage_layer_(new column::IdStorage()), 3219 type_storage_layer_( 3220 new column::StringStorage(string_pool(), &type_.vector())), 3221 group_id_storage_layer_( 3222 new column::NumericStorage<ColumnType::group_id::non_optional_stored_type>( 3223 &group_id_.vector(), 3224 ColumnTypeHelper<ColumnType::group_id::stored_type>::ToColumnType(), 3225 false)), 3226 track_id_storage_layer_( 3227 new column::NumericStorage<ColumnType::track_id::non_optional_stored_type>( 3228 &track_id_.vector(), 3229 ColumnTypeHelper<ColumnType::track_id::stored_type>::ToColumnType(), 3230 false)) 3231 { 3232 static_assert( 3233 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::group_id::stored_type>( 3234 ColumnFlag::group_id), 3235 "Column type and flag combination is not valid"); 3236 static_assert( 3237 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::track_id::stored_type>( 3238 ColumnFlag::track_id), 3239 "Column type and flag combination is not valid"); 3240 OnConstructionCompletedRegularConstructor( 3241 {id_storage_layer_,type_storage_layer_,group_id_storage_layer_,track_id_storage_layer_}, 3242 {{},{},{},{}}); 3243 } 3244 ~GpuCounterGroupTable() override; 3245 Name()3246 static const char* Name() { return "gpu_counter_group"; } 3247 ComputeStaticSchema()3248 static Table::Schema ComputeStaticSchema() { 3249 Table::Schema schema; 3250 schema.columns.emplace_back(Table::Schema::Column{ 3251 "id", SqlValue::Type::kLong, true, true, false, false}); 3252 schema.columns.emplace_back(Table::Schema::Column{ 3253 "type", SqlValue::Type::kString, false, false, false, false}); 3254 schema.columns.emplace_back(Table::Schema::Column{ 3255 "group_id", ColumnType::group_id::SqlValueType(), false, 3256 false, 3257 false, 3258 false}); 3259 schema.columns.emplace_back(Table::Schema::Column{ 3260 "track_id", ColumnType::track_id::SqlValueType(), false, 3261 false, 3262 false, 3263 false}); 3264 return schema; 3265 } 3266 IterateRows()3267 ConstIterator IterateRows() const { 3268 return ConstIterator(this, Table::IterateRows()); 3269 } 3270 IterateRows()3271 Iterator IterateRows() { return Iterator(this, Table::IterateRows()); } 3272 FilterToIterator(const Query & q)3273 ConstIterator FilterToIterator(const Query& q) const { 3274 return ConstIterator(this, QueryToIterator(q)); 3275 } 3276 FilterToIterator(const Query & q)3277 Iterator FilterToIterator(const Query& q) { 3278 return Iterator(this, QueryToIterator(q)); 3279 } 3280 ShrinkToFit()3281 void ShrinkToFit() { 3282 type_.ShrinkToFit(); 3283 group_id_.ShrinkToFit(); 3284 track_id_.ShrinkToFit(); 3285 } 3286 3287 ConstRowReference operator[](uint32_t r) const { 3288 return ConstRowReference(this, r); 3289 } 3290 RowReference operator[](uint32_t r) { return RowReference(this, r); } 3291 ConstRowReference operator[](RowNumber r) const { 3292 return ConstRowReference(this, r.row_number()); 3293 } 3294 RowReference operator[](RowNumber r) { 3295 return RowReference(this, r.row_number()); 3296 } 3297 FindById(Id find_id)3298 std::optional<ConstRowReference> FindById(Id find_id) const { 3299 std::optional<uint32_t> row = id().IndexOf(find_id); 3300 return row ? std::make_optional(ConstRowReference(this, *row)) 3301 : std::nullopt; 3302 } 3303 FindById(Id find_id)3304 std::optional<RowReference> FindById(Id find_id) { 3305 std::optional<uint32_t> row = id().IndexOf(find_id); 3306 return row ? std::make_optional(RowReference(this, *row)) : std::nullopt; 3307 } 3308 Insert(const Row & row)3309 IdAndRow Insert(const Row& row) { 3310 uint32_t row_number = row_count(); 3311 Id id = Id{row_number}; 3312 type_.Append(string_pool()->InternString(row.type())); 3313 mutable_group_id()->Append(row.group_id); 3314 mutable_track_id()->Append(row.track_id); 3315 UpdateSelfOverlayAfterInsert(); 3316 return IdAndRow{id, row_number, RowReference(this, row_number), 3317 RowNumber(row_number)}; 3318 } 3319 3320 3321 id()3322 const IdColumn<GpuCounterGroupTable::Id>& id() const { 3323 return static_cast<const ColumnType::id&>(columns()[ColumnIndex::id]); 3324 } type()3325 const TypedColumn<StringPool::Id>& type() const { 3326 return static_cast<const ColumnType::type&>(columns()[ColumnIndex::type]); 3327 } group_id()3328 const TypedColumn<int32_t>& group_id() const { 3329 return static_cast<const ColumnType::group_id&>(columns()[ColumnIndex::group_id]); 3330 } track_id()3331 const TypedColumn<TrackTable::Id>& track_id() const { 3332 return static_cast<const ColumnType::track_id&>(columns()[ColumnIndex::track_id]); 3333 } 3334 mutable_group_id()3335 TypedColumn<int32_t>* mutable_group_id() { 3336 return static_cast<ColumnType::group_id*>( 3337 GetColumn(ColumnIndex::group_id)); 3338 } mutable_track_id()3339 TypedColumn<TrackTable::Id>* mutable_track_id() { 3340 return static_cast<ColumnType::track_id*>( 3341 GetColumn(ColumnIndex::track_id)); 3342 } 3343 3344 private: 3345 3346 3347 ColumnStorage<ColumnType::group_id::stored_type> group_id_; 3348 ColumnStorage<ColumnType::track_id::stored_type> track_id_; 3349 3350 RefPtr<column::StorageLayer> id_storage_layer_; 3351 RefPtr<column::StorageLayer> type_storage_layer_; 3352 RefPtr<column::StorageLayer> group_id_storage_layer_; 3353 RefPtr<column::StorageLayer> track_id_storage_layer_; 3354 3355 3356 }; 3357 3358 3359 class HeapGraphClassTable : public macros_internal::MacroTable { 3360 public: 3361 static constexpr uint32_t kColumnCount = 8; 3362 3363 struct Id : public BaseId { 3364 Id() = default; IdId3365 explicit constexpr Id(uint32_t v) : BaseId(v) {} 3366 }; 3367 static_assert(std::is_trivially_destructible_v<Id>, 3368 "Inheritance used without trivial destruction"); 3369 3370 struct ColumnIndex { 3371 static constexpr uint32_t id = 0; 3372 static constexpr uint32_t type = 1; 3373 static constexpr uint32_t name = 2; 3374 static constexpr uint32_t deobfuscated_name = 3; 3375 static constexpr uint32_t location = 4; 3376 static constexpr uint32_t superclass_id = 5; 3377 static constexpr uint32_t classloader_id = 6; 3378 static constexpr uint32_t kind = 7; 3379 }; 3380 struct ColumnType { 3381 using id = IdColumn<HeapGraphClassTable::Id>; 3382 using type = TypedColumn<StringPool::Id>; 3383 using name = TypedColumn<StringPool::Id>; 3384 using deobfuscated_name = TypedColumn<std::optional<StringPool::Id>>; 3385 using location = TypedColumn<std::optional<StringPool::Id>>; 3386 using superclass_id = TypedColumn<std::optional<HeapGraphClassTable::Id>>; 3387 using classloader_id = TypedColumn<std::optional<uint32_t>>; 3388 using kind = TypedColumn<StringPool::Id>; 3389 }; 3390 struct Row : public macros_internal::RootParentTable::Row { 3391 Row(StringPool::Id in_name = {}, 3392 std::optional<StringPool::Id> in_deobfuscated_name = {}, 3393 std::optional<StringPool::Id> in_location = {}, 3394 std::optional<HeapGraphClassTable::Id> in_superclass_id = {}, 3395 std::optional<uint32_t> in_classloader_id = {}, 3396 StringPool::Id in_kind = {}, 3397 std::nullptr_t = nullptr) RowRow3398 : macros_internal::RootParentTable::Row(), 3399 name(in_name), 3400 deobfuscated_name(in_deobfuscated_name), 3401 location(in_location), 3402 superclass_id(in_superclass_id), 3403 classloader_id(in_classloader_id), 3404 kind(in_kind) { 3405 type_ = "heap_graph_class"; 3406 } 3407 StringPool::Id name; 3408 std::optional<StringPool::Id> deobfuscated_name; 3409 std::optional<StringPool::Id> location; 3410 std::optional<HeapGraphClassTable::Id> superclass_id; 3411 std::optional<uint32_t> classloader_id; 3412 StringPool::Id kind; 3413 3414 bool operator==(const HeapGraphClassTable::Row& other) const { 3415 return type() == other.type() && ColumnType::name::Equals(name, other.name) && 3416 ColumnType::deobfuscated_name::Equals(deobfuscated_name, other.deobfuscated_name) && 3417 ColumnType::location::Equals(location, other.location) && 3418 ColumnType::superclass_id::Equals(superclass_id, other.superclass_id) && 3419 ColumnType::classloader_id::Equals(classloader_id, other.classloader_id) && 3420 ColumnType::kind::Equals(kind, other.kind); 3421 } 3422 }; 3423 struct ColumnFlag { 3424 static constexpr uint32_t name = ColumnType::name::default_flags(); 3425 static constexpr uint32_t deobfuscated_name = ColumnType::deobfuscated_name::default_flags(); 3426 static constexpr uint32_t location = ColumnType::location::default_flags(); 3427 static constexpr uint32_t superclass_id = ColumnType::superclass_id::default_flags(); 3428 static constexpr uint32_t classloader_id = ColumnType::classloader_id::default_flags(); 3429 static constexpr uint32_t kind = ColumnType::kind::default_flags(); 3430 }; 3431 3432 class RowNumber; 3433 class ConstRowReference; 3434 class RowReference; 3435 3436 class RowNumber : public macros_internal::AbstractRowNumber< 3437 HeapGraphClassTable, ConstRowReference, RowReference> { 3438 public: RowNumber(uint32_t row_number)3439 explicit RowNumber(uint32_t row_number) 3440 : AbstractRowNumber(row_number) {} 3441 }; 3442 static_assert(std::is_trivially_destructible_v<RowNumber>, 3443 "Inheritance used without trivial destruction"); 3444 3445 class ConstRowReference : public macros_internal::AbstractConstRowReference< 3446 HeapGraphClassTable, RowNumber> { 3447 public: ConstRowReference(const HeapGraphClassTable * table,uint32_t row_number)3448 ConstRowReference(const HeapGraphClassTable* table, uint32_t row_number) 3449 : AbstractConstRowReference(table, row_number) {} 3450 id()3451 ColumnType::id::type id() const { 3452 return table()->id()[row_number_]; 3453 } type()3454 ColumnType::type::type type() const { 3455 return table()->type()[row_number_]; 3456 } name()3457 ColumnType::name::type name() const { 3458 return table()->name()[row_number_]; 3459 } deobfuscated_name()3460 ColumnType::deobfuscated_name::type deobfuscated_name() const { 3461 return table()->deobfuscated_name()[row_number_]; 3462 } location()3463 ColumnType::location::type location() const { 3464 return table()->location()[row_number_]; 3465 } superclass_id()3466 ColumnType::superclass_id::type superclass_id() const { 3467 return table()->superclass_id()[row_number_]; 3468 } classloader_id()3469 ColumnType::classloader_id::type classloader_id() const { 3470 return table()->classloader_id()[row_number_]; 3471 } kind()3472 ColumnType::kind::type kind() const { 3473 return table()->kind()[row_number_]; 3474 } 3475 }; 3476 static_assert(std::is_trivially_destructible_v<ConstRowReference>, 3477 "Inheritance used without trivial destruction"); 3478 class RowReference : public ConstRowReference { 3479 public: RowReference(const HeapGraphClassTable * table,uint32_t row_number)3480 RowReference(const HeapGraphClassTable* table, uint32_t row_number) 3481 : ConstRowReference(table, row_number) {} 3482 set_name(ColumnType::name::non_optional_type v)3483 void set_name( 3484 ColumnType::name::non_optional_type v) { 3485 return mutable_table()->mutable_name()->Set(row_number_, v); 3486 } set_deobfuscated_name(ColumnType::deobfuscated_name::non_optional_type v)3487 void set_deobfuscated_name( 3488 ColumnType::deobfuscated_name::non_optional_type v) { 3489 return mutable_table()->mutable_deobfuscated_name()->Set(row_number_, v); 3490 } set_location(ColumnType::location::non_optional_type v)3491 void set_location( 3492 ColumnType::location::non_optional_type v) { 3493 return mutable_table()->mutable_location()->Set(row_number_, v); 3494 } set_superclass_id(ColumnType::superclass_id::non_optional_type v)3495 void set_superclass_id( 3496 ColumnType::superclass_id::non_optional_type v) { 3497 return mutable_table()->mutable_superclass_id()->Set(row_number_, v); 3498 } set_classloader_id(ColumnType::classloader_id::non_optional_type v)3499 void set_classloader_id( 3500 ColumnType::classloader_id::non_optional_type v) { 3501 return mutable_table()->mutable_classloader_id()->Set(row_number_, v); 3502 } set_kind(ColumnType::kind::non_optional_type v)3503 void set_kind( 3504 ColumnType::kind::non_optional_type v) { 3505 return mutable_table()->mutable_kind()->Set(row_number_, v); 3506 } 3507 3508 private: mutable_table()3509 HeapGraphClassTable* mutable_table() const { 3510 return const_cast<HeapGraphClassTable*>(table()); 3511 } 3512 }; 3513 static_assert(std::is_trivially_destructible_v<RowReference>, 3514 "Inheritance used without trivial destruction"); 3515 3516 class ConstIterator; 3517 class ConstIterator : public macros_internal::AbstractConstIterator< 3518 ConstIterator, HeapGraphClassTable, RowNumber, ConstRowReference> { 3519 public: id()3520 ColumnType::id::type id() const { 3521 const auto& col = table()->id(); 3522 return col.GetAtIdx( 3523 iterator_.StorageIndexForColumn(col.index_in_table())); 3524 } type()3525 ColumnType::type::type type() const { 3526 const auto& col = table()->type(); 3527 return col.GetAtIdx( 3528 iterator_.StorageIndexForColumn(col.index_in_table())); 3529 } name()3530 ColumnType::name::type name() const { 3531 const auto& col = table()->name(); 3532 return col.GetAtIdx( 3533 iterator_.StorageIndexForColumn(col.index_in_table())); 3534 } deobfuscated_name()3535 ColumnType::deobfuscated_name::type deobfuscated_name() const { 3536 const auto& col = table()->deobfuscated_name(); 3537 return col.GetAtIdx( 3538 iterator_.StorageIndexForColumn(col.index_in_table())); 3539 } location()3540 ColumnType::location::type location() const { 3541 const auto& col = table()->location(); 3542 return col.GetAtIdx( 3543 iterator_.StorageIndexForColumn(col.index_in_table())); 3544 } superclass_id()3545 ColumnType::superclass_id::type superclass_id() const { 3546 const auto& col = table()->superclass_id(); 3547 return col.GetAtIdx( 3548 iterator_.StorageIndexForColumn(col.index_in_table())); 3549 } classloader_id()3550 ColumnType::classloader_id::type classloader_id() const { 3551 const auto& col = table()->classloader_id(); 3552 return col.GetAtIdx( 3553 iterator_.StorageIndexForColumn(col.index_in_table())); 3554 } kind()3555 ColumnType::kind::type kind() const { 3556 const auto& col = table()->kind(); 3557 return col.GetAtIdx( 3558 iterator_.StorageIndexForColumn(col.index_in_table())); 3559 } 3560 3561 protected: ConstIterator(const HeapGraphClassTable * table,Table::Iterator iterator)3562 explicit ConstIterator(const HeapGraphClassTable* table, 3563 Table::Iterator iterator) 3564 : AbstractConstIterator(table, std::move(iterator)) {} 3565 CurrentRowNumber()3566 uint32_t CurrentRowNumber() const { 3567 return iterator_.StorageIndexForLastOverlay(); 3568 } 3569 3570 private: 3571 friend class HeapGraphClassTable; 3572 friend class macros_internal::AbstractConstIterator< 3573 ConstIterator, HeapGraphClassTable, RowNumber, ConstRowReference>; 3574 }; 3575 class Iterator : public ConstIterator { 3576 public: row_reference()3577 RowReference row_reference() const { 3578 return {const_cast<HeapGraphClassTable*>(table()), CurrentRowNumber()}; 3579 } 3580 3581 private: 3582 friend class HeapGraphClassTable; 3583 Iterator(HeapGraphClassTable * table,Table::Iterator iterator)3584 explicit Iterator(HeapGraphClassTable* table, Table::Iterator iterator) 3585 : ConstIterator(table, std::move(iterator)) {} 3586 }; 3587 3588 struct IdAndRow { 3589 Id id; 3590 uint32_t row; 3591 RowReference row_reference; 3592 RowNumber row_number; 3593 }; 3594 GetColumns(HeapGraphClassTable * self,const macros_internal::MacroTable * parent)3595 static std::vector<ColumnLegacy> GetColumns( 3596 HeapGraphClassTable* self, 3597 const macros_internal::MacroTable* parent) { 3598 std::vector<ColumnLegacy> columns = 3599 CopyColumnsFromParentOrAddRootColumns(self, parent); 3600 uint32_t olay_idx = OverlayCount(parent); 3601 AddColumnToVector(columns, "name", &self->name_, ColumnFlag::name, 3602 static_cast<uint32_t>(columns.size()), olay_idx); 3603 AddColumnToVector(columns, "deobfuscated_name", &self->deobfuscated_name_, ColumnFlag::deobfuscated_name, 3604 static_cast<uint32_t>(columns.size()), olay_idx); 3605 AddColumnToVector(columns, "location", &self->location_, ColumnFlag::location, 3606 static_cast<uint32_t>(columns.size()), olay_idx); 3607 AddColumnToVector(columns, "superclass_id", &self->superclass_id_, ColumnFlag::superclass_id, 3608 static_cast<uint32_t>(columns.size()), olay_idx); 3609 AddColumnToVector(columns, "classloader_id", &self->classloader_id_, ColumnFlag::classloader_id, 3610 static_cast<uint32_t>(columns.size()), olay_idx); 3611 AddColumnToVector(columns, "kind", &self->kind_, ColumnFlag::kind, 3612 static_cast<uint32_t>(columns.size()), olay_idx); 3613 return columns; 3614 } 3615 HeapGraphClassTable(StringPool * pool)3616 PERFETTO_NO_INLINE explicit HeapGraphClassTable(StringPool* pool) 3617 : macros_internal::MacroTable( 3618 pool, 3619 GetColumns(this, nullptr), 3620 nullptr), 3621 name_(ColumnStorage<ColumnType::name::stored_type>::Create<false>()), 3622 deobfuscated_name_(ColumnStorage<ColumnType::deobfuscated_name::stored_type>::Create<false>()), 3623 location_(ColumnStorage<ColumnType::location::stored_type>::Create<false>()), 3624 superclass_id_(ColumnStorage<ColumnType::superclass_id::stored_type>::Create<false>()), 3625 classloader_id_(ColumnStorage<ColumnType::classloader_id::stored_type>::Create<false>()), 3626 kind_(ColumnStorage<ColumnType::kind::stored_type>::Create<false>()) 3627 , 3628 id_storage_layer_(new column::IdStorage()), 3629 type_storage_layer_( 3630 new column::StringStorage(string_pool(), &type_.vector())), 3631 name_storage_layer_( 3632 new column::StringStorage(string_pool(), &name_.vector())), 3633 deobfuscated_name_storage_layer_( 3634 new column::StringStorage(string_pool(), &deobfuscated_name_.vector())), 3635 location_storage_layer_( 3636 new column::StringStorage(string_pool(), &location_.vector())), 3637 superclass_id_storage_layer_( 3638 new column::NumericStorage<ColumnType::superclass_id::non_optional_stored_type>( 3639 &superclass_id_.non_null_vector(), 3640 ColumnTypeHelper<ColumnType::superclass_id::stored_type>::ToColumnType(), 3641 false)), 3642 classloader_id_storage_layer_( 3643 new column::NumericStorage<ColumnType::classloader_id::non_optional_stored_type>( 3644 &classloader_id_.non_null_vector(), 3645 ColumnTypeHelper<ColumnType::classloader_id::stored_type>::ToColumnType(), 3646 false)), 3647 kind_storage_layer_( 3648 new column::StringStorage(string_pool(), &kind_.vector())) 3649 , 3650 superclass_id_null_layer_(new column::NullOverlay(superclass_id_.bv())), 3651 classloader_id_null_layer_(new column::NullOverlay(classloader_id_.bv())) { 3652 static_assert( 3653 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::name::stored_type>( 3654 ColumnFlag::name), 3655 "Column type and flag combination is not valid"); 3656 static_assert( 3657 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::deobfuscated_name::stored_type>( 3658 ColumnFlag::deobfuscated_name), 3659 "Column type and flag combination is not valid"); 3660 static_assert( 3661 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::location::stored_type>( 3662 ColumnFlag::location), 3663 "Column type and flag combination is not valid"); 3664 static_assert( 3665 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::superclass_id::stored_type>( 3666 ColumnFlag::superclass_id), 3667 "Column type and flag combination is not valid"); 3668 static_assert( 3669 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::classloader_id::stored_type>( 3670 ColumnFlag::classloader_id), 3671 "Column type and flag combination is not valid"); 3672 static_assert( 3673 ColumnLegacy::IsFlagsAndTypeValid<ColumnType::kind::stored_type>( 3674 ColumnFlag::kind), 3675 "Column type and flag combination is not valid"); 3676 OnConstructionCompletedRegularConstructor( 3677 {id_storage_layer_,type_storage_layer_,name_storage_layer_,deobfuscated_name_storage_layer_,location_storage_layer_,superclass_id_storage_layer_,classloader_id_storage_layer_,kind_storage_layer_}, 3678 {{},{},{},{},{},superclass_id_null_layer_,classloader_id_null_layer_,{}}); 3679 } 3680 ~HeapGraphClassTable() override; 3681 Name()3682 static const char* Name() { return "heap_graph_class"; } 3683 ComputeStaticSchema()3684 static Table::Schema ComputeStaticSchema() { 3685 Table::Schema schema; 3686 schema.columns.emplace_back(Table::Schema::Column{ 3687 "id", SqlValue::Type::kLong, true, true, false, false}); 3688 schema.columns.emplace_back(Table::Schema::Column{ 3689 "type", SqlValue::Type::kString, false, false, false, false}); 3690 schema.columns.emplace_back(Table::Schema::Column{ 3691 "name", ColumnType::name::SqlValueType(), false, 3692 false, 3693 false, 3694 false}); 3695 schema.columns.emplace_back(Table::Schema::Column{ 3696 "deobfuscated_name", ColumnType::deobfuscated_name::SqlValueType(), false, 3697 false, 3698 false, 3699 false}); 3700 schema.columns.emplace_back(Table::Schema::Column{ 3701 "location", ColumnType::location::SqlValueType(), false, 3702 false, 3703 false, 3704 false}); 3705 schema.columns.emplace_back(Table::Schema::Column{ 3706 "superclass_id", ColumnType::superclass_id::SqlValueType(), false, 3707 false, 3708 false, 3709 false}); 3710 schema.columns.emplace_back(Table::Schema::Column{ 3711 "classloader_id", ColumnType::classloader_id::SqlValueType(), false, 3712 false, 3713 false, 3714 false}); 3715 schema.columns.emplace_back(Table::Schema::Column{ 3716 "kind", ColumnType::kind::SqlValueType(), false, 3717 false, 3718 false, 3719 false}); 3720 return schema; 3721 } 3722 IterateRows()3723 ConstIterator IterateRows() const { 3724 return ConstIterator(this, Table::IterateRows()); 3725 } 3726 IterateRows()3727 Iterator IterateRows() { return Iterator(this, Table::IterateRows()); } 3728 FilterToIterator(const Query & q)3729 ConstIterator FilterToIterator(const Query& q) const { 3730 return ConstIterator(this, QueryToIterator(q)); 3731 } 3732 FilterToIterator(const Query & q)3733 Iterator FilterToIterator(const Query& q) { 3734 return Iterator(this, QueryToIterator(q)); 3735 } 3736 ShrinkToFit()3737 void ShrinkToFit() { 3738 type_.ShrinkToFit(); 3739 name_.ShrinkToFit(); 3740 deobfuscated_name_.ShrinkToFit(); 3741 location_.ShrinkToFit(); 3742 superclass_id_.ShrinkToFit(); 3743 classloader_id_.ShrinkToFit(); 3744 kind_.ShrinkToFit(); 3745 } 3746 3747 ConstRowReference operator[](uint32_t r) const { 3748 return ConstRowReference(this, r); 3749 } 3750 RowReference operator[](uint32_t r) { return RowReference(this, r); } 3751 ConstRowReference operator[](RowNumber r) const { 3752 return ConstRowReference(this, r.row_number()); 3753 } 3754 RowReference operator[](RowNumber r) { 3755 return RowReference(this, r.row_number()); 3756 } 3757 FindById(Id find_id)3758 std::optional<ConstRowReference> FindById(Id find_id) const { 3759 std::optional<uint32_t> row = id().IndexOf(find_id); 3760 return row ? std::make_optional(ConstRowReference(this, *row)) 3761 : std::nullopt; 3762 } 3763 FindById(Id find_id)3764 std::optional<RowReference> FindById(Id find_id) { 3765 std::optional<uint32_t> row = id().IndexOf(find_id); 3766 return row ? std::make_optional(RowReference(this, *row)) : std::nullopt; 3767 } 3768 Insert(const Row & row)3769 IdAndRow Insert(const Row& row) { 3770 uint32_t row_number = row_count(); 3771 Id id = Id{row_number}; 3772 type_.Append(string_pool()->InternString(row.type())); 3773 mutable_name()->Append(row.name); 3774 mutable_deobfuscated_name()->Append(row.deobfuscated_name); 3775 mutable_location()->Append(row.location); 3776 mutable_superclass_id()->Append(row.superclass_id); 3777 mutable_classloader_id()->Append(row.classloader_id); 3778 mutable_kind()->Append(row.kind); 3779 UpdateSelfOverlayAfterInsert(); 3780 return IdAndRow{id, row_number, RowReference(this, row_number), 3781 RowNumber(row_number)}; 3782 } 3783 3784 3785 id()3786 const IdColumn<HeapGraphClassTable::Id>& id() const { 3787 return static_cast<const ColumnType::id&>(columns()[ColumnIndex::id]); 3788 } type()3789 const TypedColumn<StringPool::Id>& type() const { 3790 return static_cast<const ColumnType::type&>(columns()[ColumnIndex::type]); 3791 } name()3792 const TypedColumn<StringPool::Id>& name() const { 3793 return static_cast<const ColumnType::name&>(columns()[ColumnIndex::name]); 3794 } deobfuscated_name()3795 const TypedColumn<std::optional<StringPool::Id>>& deobfuscated_name() const { 3796 return static_cast<const ColumnType::deobfuscated_name&>(columns()[ColumnIndex::deobfuscated_name]); 3797 } location()3798 const TypedColumn<std::optional<StringPool::Id>>& location() const { 3799 return static_cast<const ColumnType::location&>(columns()[ColumnIndex::location]); 3800 } superclass_id()3801 const TypedColumn<std::optional<HeapGraphClassTable::Id>>& superclass_id() const { 3802 return static_cast<const ColumnType::superclass_id&>(columns()[ColumnIndex::superclass_id]); 3803 } classloader_id()3804 const TypedColumn<std::optional<uint32_t>>& classloader_id() const { 3805 return static_cast<const ColumnType::classloader_id&>(columns()[ColumnIndex::classloader_id]); 3806 } kind()3807 const TypedColumn<StringPool::Id>& kind() const { 3808 return static_cast<const ColumnType::kind&>(columns()[ColumnIndex::kind]); 3809 } 3810 mutable_name()3811 TypedColumn<StringPool::Id>* mutable_name() { 3812 return static_cast<ColumnType::name*>( 3813 GetColumn(ColumnIndex::name)); 3814 } mutable_deobfuscated_name()3815 TypedColumn<std::optional<StringPool::Id>>* mutable_deobfuscated_name() { 3816 return static_cast<ColumnType::deobfuscated_name*>( 3817 GetColumn(ColumnIndex::deobfuscated_name)); 3818 } mutable_location()3819 TypedColumn<std::optional<StringPool::Id>>* mutable_location() { 3820 return static_cast<ColumnType::location*>( 3821 GetColumn(ColumnIndex::location)); 3822 } mutable_superclass_id()3823 TypedColumn<std::optional<HeapGraphClassTable::Id>>* mutable_superclass_id() { 3824 return static_cast<ColumnType::superclass_id*>( 3825 GetColumn(ColumnIndex::superclass_id)); 3826 } mutable_classloader_id()3827 TypedColumn<std::optional<uint32_t>>* mutable_classloader_id() { 3828 return static_cast<ColumnType::classloader_id*>( 3829 GetColumn(ColumnIndex::classloader_id)); 3830 } mutable_kind()3831 TypedColumn<StringPool::Id>* mutable_kind() { 3832 return static_cast<ColumnType::kind*>( 3833 GetColumn(ColumnIndex::kind)); 3834 } 3835 3836 private: 3837 3838 3839 ColumnStorage<ColumnType::name::stored_type> name_; 3840 ColumnStorage<ColumnType::deobfuscated_name::stored_type> deobfuscated_name_; 3841 ColumnStorage<ColumnType::location::stored_type> location_; 3842 ColumnStorage<ColumnType::superclass_id::stored_type> superclass_id_; 3843 ColumnStorage<ColumnType::classloader_id::stored_type> classloader_id_; 3844 ColumnStorage<ColumnType::kind::stored_type> kind_; 3845 3846 RefPtr<column::StorageLayer> id_storage_layer_; 3847 RefPtr<column::StorageLayer> type_storage_layer_; 3848 RefPtr<column::StorageLayer> name_storage_layer_; 3849 RefPtr<column::StorageLayer> deobfuscated_name_storage_layer_; 3850 RefPtr<column::StorageLayer> location_storage_layer_; 3851 RefPtr<column::StorageLayer> superclass_id_storage_layer_; 3852 RefPtr<column::StorageLayer> classloader_id_storage_layer_; 3853 RefPtr<column::StorageLayer> kind_storage_layer_; 3854 3855 RefPtr<column::OverlayLayer> superclass_id_null_layer_; 3856 RefPtr<column::OverlayLayer> classloader_id_null_layer_; 3857 }; 3858 3859 3860 class HeapGraphObjectTable : public macros_internal::MacroTable { 3861 public: 3862 static constexpr uint32_t kColumnCount = 11; 3863 3864 struct Id : public BaseId { 3865 Id() = default; IdId3866 explicit constexpr Id(uint32_t v) : BaseId(v) {} 3867 }; 3868 static_assert(std::is_trivially_destructible_v<Id>, 3869 "Inheritance used without trivial destruction"); 3870 3871 struct ColumnIndex { 3872 static constexpr uint32_t id = 0; 3873 static constexpr uint32_t type = 1; 3874 static constexpr uint32_t upid = 2; 3875 static constexpr uint32_t graph_sample_ts = 3; 3876 static constexpr uint32_t self_size = 4; 3877 static constexpr uint32_t native_size = 5; 3878 static constexpr uint32_t reference_set_id = 6; 3879 static constexpr uint32_t reachable = 7; 3880 static constexpr uint32_t type_id = 8; 3881 static constexpr uint32_t root_type = 9; 3882 static constexpr uint32_t root_distance = 10; 3883 }; 3884 struct ColumnType { 3885 using id = IdColumn<HeapGraphObjectTable::Id>; 3886 using type = TypedColumn<StringPool::Id>; 3887 using upid = TypedColumn<uint32_t>; 3888 using graph_sample_ts = TypedColumn<int64_t>; 3889 using self_size = TypedColumn<int64_t>; 3890 using native_size = TypedColumn<int64_t>; 3891 using reference_set_id = TypedColumn<std::optional<uint32_t>>; 3892 using reachable = TypedColumn<int32_t>; 3893 using type_id = TypedColumn<HeapGraphClassTable::Id>; 3894 using root_type = TypedColumn<std::optional<StringPool::Id>>; 3895 using root_distance = TypedColumn<int32_t>; 3896 }; 3897 struct Row : public macros_internal::RootParentTable::Row { 3898 Row(uint32_t in_upid = {}, 3899 int64_t in_graph_sample_ts = {}, 3900 int64_t in_self_size = {}, 3901 int64_t in_native_size = {}, 3902 std::optional<uint32_t> in_reference_set_id = {}, 3903 int32_t in_reachable = {}, 3904 HeapGraphClassTable::Id in_type_id = {}, 3905 std::optional<StringPool::Id> in_root_type = {}, 3906 int32_t in_root_distance = {}, 3907 std::nullptr_t = nullptr) RowRow3908 : macros_internal::RootParentTable::Row(), 3909 upid(in_upid), 3910 graph_sample_ts(in_graph_sample_ts), 3911 self_size(in_self_size), 3912 native_size(in_native_size), 3913 reference_set_id(in_reference_set_id), 3914 reachable(in_reachable), 3915 type_id(in_type_id), 3916 root_type(in_root_type), 3917 root_distance(in_root_distance) { 3918 type_ = "heap_graph_object"; 3919 } 3920 uint32_t upid; 3921 int64_t graph_sample_ts; 3922 int64_t self_size; 3923 int64_t native_size; 3924 std::optional<uint32_t> reference_set_id; 3925 int32_t reachable; 3926 HeapGraphClassTable::Id type_id; 3927 std::optional<StringPool::Id> root_type; 3928 int32_t root_distance; 3929 3930 bool operator==(const HeapGraphObjectTable::Row& other) const { 3931 return type() == other.type() && ColumnType::upid::Equals(upid, other.upid) && 3932 ColumnType::graph_sample_ts::Equals(graph_sample_ts, other.graph_sample_ts) && 3933 ColumnType::self_size::Equals(self_size, other.self_size) && 3934 ColumnType::native_size::Equals(native_size, other.native_size) && 3935 ColumnType::reference_set_id::Equals(reference_set_id, other.reference_set_id) && 3936 ColumnType::reachable::Equals(reachable, other.reachable) && 3937 ColumnType::type_id::Equals(type_id, other.type_id) && 3938 ColumnType::root_type::Equals(root_type, other.root_type) && 3939 ColumnType::root_distance::Equals(root_distance, other.root_distance); 3940 } 3941 }; 3942 struct ColumnFlag { 3943 static constexpr uint32_t upid = ColumnType::upid::default_flags(); 3944 static constexpr uint32_t graph_sample_ts = ColumnType::graph_sample_ts::default_flags(); 3945 static constexpr uint32_t self_size = ColumnType::self_size::default_flags(); 3946 static constexpr uint32_t native_size = ColumnType::native_size::default_flags(); 3947 static constexpr uint32_t reference_set_id = static_cast<uint32_t>(ColumnLegacy::Flag::kDense) | ColumnType::reference_set_id::default_flags(); 3948 static constexpr uint32_t reachable = ColumnType::reachable::default_flags(); 3949 static constexpr uint32_t type_id = ColumnType::type_id::default_flags(); 3950 static constexpr uint32_t root_type = ColumnType::root_type::default_flags(); 3951 static constexpr uint32_t root_distance = static_cast<uint32_t>(ColumnLegacy::Flag::kHidden) | ColumnType::root_distance::default_flags(); 3952 }; 3953 3954 class RowNumber; 3955 class ConstRowReference; 3956 class RowReference; 3957 3958 class RowNumber : public macros_internal::AbstractRowNumber< 3959 HeapGraphObjectTable, ConstRowReference, RowReference> { 3960 public: RowNumber(uint32_t row_number)3961 explicit RowNumber(uint32_t row_number) 3962 : AbstractRowNumber(row_number) {} 3963 }; 3964 static_assert(std::is_trivially_destructible_v<RowNumber>, 3965 "Inheritance used without trivial destruction"); 3966 3967 class ConstRowReference : public macros_internal::AbstractConstRowReference< 3968 HeapGraphObjectTable, RowNumber> { 3969 public: ConstRowReference(const HeapGraphObjectTable * table,uint32_t row_number)3970 ConstRowReference(const HeapGraphObjectTable* table, uint32_t row_number) 3971 : AbstractConstRowReference(table, row_number) {} 3972 id()3973 ColumnType::id::type id() const { 3974 return table()->id()[row_number_]; 3975 } type()3976 ColumnType::type::type type() const { 3977 return table()->type()[row_number_]; 3978 } upid()3979