blob: c2ce1bf9344118743a1f3bf1f72ada122000911c [file] [log] [blame]
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "src/trace_processor/tables/macros_internal.h"
#include <cstdint>
#include <initializer_list>
#include <type_traits>
#include <utility>
#include <vector>
#include "perfetto/base/logging.h"
#include "perfetto/public/compiler.h"
#include "perfetto/trace_processor/ref_counted.h"
#include "src/trace_processor/containers/bit_vector.h"
#include "src/trace_processor/containers/row_map.h"
#include "src/trace_processor/containers/string_pool.h"
#include "src/trace_processor/db/column.h"
#include "src/trace_processor/db/column/overlay_layer.h"
#include "src/trace_processor/db/column/selector_overlay.h"
#include "src/trace_processor/db/column/storage_layer.h"
#include "src/trace_processor/db/column_storage_overlay.h"
namespace perfetto::trace_processor::macros_internal {
PERFETTO_NO_INLINE MacroTable::MacroTable(StringPool* pool,
std::vector<ColumnLegacy> columns,
const MacroTable* parent)
: Table(pool, 0u, std::move(columns), EmptyOverlaysFromParent(parent)),
allow_inserts_(true),
parent_(parent) {}
PERFETTO_NO_INLINE MacroTable::MacroTable(StringPool* pool,
std::vector<ColumnLegacy> columns,
const MacroTable& parent,
const RowMap& parent_overlay)
: Table(pool,
parent_overlay.size(),
std::move(columns),
SelectedOverlaysFromParent(parent, parent_overlay)),
allow_inserts_(false),
parent_(&parent) {}
PERFETTO_NO_INLINE void MacroTable::UpdateOverlaysAfterParentInsert() {
CopyLastInsertFrom(parent_->overlays());
}
PERFETTO_NO_INLINE void MacroTable::UpdateSelfOverlayAfterInsert() {
IncrementRowCountAndAddToLastOverlay();
}
PERFETTO_NO_INLINE std::vector<ColumnLegacy>
MacroTable::CopyColumnsFromParentOrAddRootColumns(MacroTable* self,
const MacroTable* parent) {
std::vector<ColumnLegacy> columns;
if (parent) {
for (const ColumnLegacy& col : parent->columns()) {
columns.emplace_back(col, col.index_in_table(), col.overlay_index());
}
} else {
columns.emplace_back(ColumnLegacy::IdColumn(0, 0));
columns.emplace_back("type", &self->type_, ColumnLegacy::kNonNull, 1, 0);
}
return columns;
}
PERFETTO_NO_INLINE void MacroTable::OnConstructionCompletedRegularConstructor(
std::initializer_list<RefPtr<column::StorageLayer>> storage_layers,
std::initializer_list<RefPtr<column::OverlayLayer>> null_layers) {
std::vector<RefPtr<column::OverlayLayer>> overlay_layers(
OverlayCount(parent_) + 1);
for (uint32_t i = 0; i < overlay_layers.size() - 1; ++i) {
PERFETTO_CHECK(overlays()[i].row_map().IsBitVector());
overlay_layers[i].reset(
new column::SelectorOverlay(overlays()[i].row_map().GetIfBitVector()));
}
Table::OnConstructionCompleted(storage_layers, null_layers,
std::move(overlay_layers));
}
PERFETTO_NO_INLINE std::vector<ColumnStorageOverlay>
MacroTable::EmptyOverlaysFromParent(const MacroTable* parent) {
std::vector<ColumnStorageOverlay> overlays(parent ? parent->overlays().size()
: 0);
for (auto& overlay : overlays) {
overlay = ColumnStorageOverlay(BitVector());
}
overlays.emplace_back();
return overlays;
}
PERFETTO_NO_INLINE std::vector<ColumnStorageOverlay>
MacroTable::SelectedOverlaysFromParent(
const macros_internal::MacroTable& parent,
const RowMap& rm) {
std::vector<ColumnStorageOverlay> overlays;
for (const auto& overlay : parent.overlays()) {
overlays.emplace_back(overlay.SelectRows(rm));
PERFETTO_DCHECK(overlays.back().size() == rm.size());
}
overlays.emplace_back(rm.size());
return overlays;
}
BaseConstIterator::BaseConstIterator(const MacroTable* table,
Table::Iterator iterator)
: iterator_(std::move(iterator)), table_(table) {
static_assert(std::is_base_of<Table, MacroTable>::value,
"Template param should be a subclass of Table.");
}
BaseConstIterator::operator bool() const {
return bool(iterator_);
}
BaseConstIterator& BaseConstIterator::operator++() {
++iterator_;
return *this;
}
BaseRowReference::BaseRowReference(const MacroTable* table, uint32_t row_number)
: table_(table), row_number_(row_number) {}
} // namespace perfetto::trace_processor::macros_internal