diff options
Diffstat (limited to 'src/trace_processor/raw_table.cc')
-rw-r--r-- | src/trace_processor/raw_table.cc | 163 |
1 files changed, 22 insertions, 141 deletions
diff --git a/src/trace_processor/raw_table.cc b/src/trace_processor/raw_table.cc index 29d86ef75..c18e85101 100644 --- a/src/trace_processor/raw_table.cc +++ b/src/trace_processor/raw_table.cc @@ -18,24 +18,20 @@ #include <inttypes.h> -#include "perfetto/base/compiler.h" -#include "src/trace_processor/sqlite/sqlite_utils.h" -#include "src/trace_processor/variadic.h" +#include "src/trace_processor/ftrace_descriptors.h" +#include "src/trace_processor/sqlite_utils.h" -#include "protos/perfetto/trace/ftrace/binder.pbzero.h" -#include "protos/perfetto/trace/ftrace/clk.pbzero.h" -#include "protos/perfetto/trace/ftrace/filemap.pbzero.h" -#include "protos/perfetto/trace/ftrace/ftrace.pbzero.h" -#include "protos/perfetto/trace/ftrace/ftrace_event.pbzero.h" -#include "protos/perfetto/trace/ftrace/sched.pbzero.h" -#include "protos/perfetto/trace/ftrace/workqueue.pbzero.h" +#include "perfetto/trace/ftrace/binder.pbzero.h" +#include "perfetto/trace/ftrace/clk.pbzero.h" +#include "perfetto/trace/ftrace/ftrace.pbzero.h" +#include "perfetto/trace/ftrace/ftrace_event.pbzero.h" +#include "perfetto/trace/ftrace/sched.pbzero.h" namespace perfetto { namespace trace_processor { RawTable::RawTable(sqlite3* db, const TraceStorage* storage) : storage_(storage) { -#if PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE) auto fn = [](sqlite3_context* ctx, int argc, sqlite3_value** argv) { auto* thiz = static_cast<RawTable*>(sqlite3_user_data(ctx)); thiz->ToSystrace(ctx, argc, argv); @@ -43,13 +39,10 @@ RawTable::RawTable(sqlite3* db, const TraceStorage* storage) sqlite3_create_function(db, "to_ftrace", 1, SQLITE_UTF8 | SQLITE_DETERMINISTIC, this, fn, nullptr, nullptr); -#else // PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE) - base::ignore_result(db); -#endif // PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE) } void RawTable::RegisterTable(sqlite3* db, const TraceStorage* storage) { - SqliteTable::Register<RawTable>(db, storage, "raw"); + Table::Register<RawTable>(db, storage, "raw"); } StorageSchema RawTable::CreateStorageSchema() { @@ -70,19 +63,17 @@ uint32_t RawTable::RowCount() { int RawTable::BestIndex(const QueryConstraints& qc, BestIndexInfo* info) { info->estimated_cost = RowCount(); - info->sqlite_omit_order_by = true; // Only the string columns are handled by SQLite + info->order_by_consumed = true; size_t name_index = schema().ColumnIndexFromName("name"); for (size_t i = 0; i < qc.constraints().size(); i++) { - info->constraint_info[i].sqlite_omit = - qc.constraints()[i].iColumn != static_cast<int>(name_index); + info->omit[i] = qc.constraints()[i].iColumn != static_cast<int>(name_index); } return SQLITE_OK; } -#if PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE) void RawTable::FormatSystraceArgs(NullTermStringView event_name, ArgSetId arg_set_id, base::StringWriter* writer) { @@ -91,34 +82,20 @@ void RawTable::FormatSystraceArgs(NullTermStringView event_name, auto ub = std::find(lb, set_ids.end(), arg_set_id + 1); auto start_row = static_cast<uint32_t>(std::distance(set_ids.begin(), lb)); - auto end_row = static_cast<uint32_t>(std::distance(set_ids.begin(), ub)); + + using Variadic = TraceStorage::Args::Variadic; using ValueWriter = std::function<void(const Variadic&)>; auto write_value = [this, writer](const Variadic& value) { switch (value.type) { - case Variadic::kInt: + case TraceStorage::Args::Variadic::kInt: writer->AppendInt(value.int_value); break; - case Variadic::kUint: - writer->AppendUnsignedInt(value.uint_value); - break; - case Variadic::kString: { - const auto& str = storage_->GetString(value.string_value); - writer->AppendString(str.c_str(), str.size()); - break; - } - case Variadic::kReal: + case TraceStorage::Args::Variadic::kReal: writer->AppendDouble(value.real_value); break; - case Variadic::kPointer: - writer->AppendUnsignedInt(value.pointer_value); - break; - case Variadic::kBool: - writer->AppendBool(value.bool_value); - break; - case Variadic::kJson: { - const auto& str = storage_->GetString(value.json_value); + case TraceStorage::Args::Variadic::kString: { + const auto& str = storage_->GetString(value.string_value); writer->AppendString(str.c_str(), str.size()); - break; } } }; @@ -145,9 +122,8 @@ void RawTable::FormatSystraceArgs(NullTermStringView event_name, write_arg(SS::kPrevPidFieldNumber - 1, write_value); write_arg(SS::kPrevPrioFieldNumber - 1, write_value); write_arg(SS::kPrevStateFieldNumber - 1, [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kInt); auto state = static_cast<uint16_t>(value.int_value); - writer->AppendString(ftrace_utils::TaskState(state).ToString('|').data()); + writer->AppendString(ftrace_utils::TaskState(state).ToString().data()); }); writer->AppendLiteral(" ==>"); write_arg(SS::kNextCommFieldNumber - 1, write_value); @@ -160,7 +136,6 @@ void RawTable::FormatSystraceArgs(NullTermStringView event_name, write_arg(SW::kPidFieldNumber - 1, write_value); write_arg(SW::kPrioFieldNumber - 1, write_value); write_arg(SW::kTargetCpuFieldNumber - 1, [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kInt); writer->AppendPaddedInt<'0', 3>(value.int_value); }); return; @@ -196,14 +171,12 @@ void RawTable::FormatSystraceArgs(NullTermStringView event_name, writer->AppendString(" flags=0x"); write_value_at_index( BT::kFlagsFieldNumber - 1, [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); + writer->AppendHexInt(static_cast<uint32_t>(value.int_value)); }); writer->AppendString(" code=0x"); write_value_at_index( BT::kCodeFieldNumber - 1, [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); + writer->AppendHexInt(static_cast<uint32_t>(value.int_value)); }); return; } else if (event_name == "binder_transaction_alloc_buf") { @@ -218,40 +191,10 @@ void RawTable::FormatSystraceArgs(NullTermStringView event_name, writer->AppendString(" transaction="); write_value_at_index(BTR::kDebugIdFieldNumber - 1, write_value); return; - } else if (event_name == "mm_filemap_add_to_page_cache") { - using MFA = protos::pbzero::MmFilemapAddToPageCacheFtraceEvent; - writer->AppendString(" dev "); - write_value_at_index(MFA::kSDevFieldNumber - 1, - [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendUnsignedInt(value.uint_value >> 20); - }); - writer->AppendString(":"); - write_value_at_index( - MFA::kSDevFieldNumber - 1, [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendUnsignedInt(value.uint_value & ((1 << 20) - 1)); - }); - writer->AppendString(" ino "); - write_value_at_index(MFA::kIInoFieldNumber - 1, - [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); - }); - writer->AppendString(" page=0000000000000000"); - writer->AppendString(" pfn="); - write_value_at_index(MFA::kPfnFieldNumber - 1, write_value); - writer->AppendString(" ofs="); - write_value_at_index(MFA::kIndexFieldNumber - 1, - [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendUnsignedInt(value.uint_value << 12); - }); - return; } else if (event_name == "print") { - // 'ip' may be the first field or it may be dropped. We only care - // about the 'buf' field which will always appear last. - uint32_t arg_row = end_row - 1; + using P = protos::pbzero::PrintFtraceEvent; + + uint32_t arg_row = start_row + P::kBufFieldNumber - 1; const auto& args = storage_->args(); const auto& value = args.arg_values()[arg_row]; const auto& str = storage_->GetString(value.string_value); @@ -262,67 +205,6 @@ void RawTable::FormatSystraceArgs(NullTermStringView event_name, writer->AppendChar(' '); writer->AppendString(str.c_str(), chars_to_print); return; - } else if (event_name == "sched_blocked_reason") { - using SBR = protos::pbzero::SchedBlockedReasonFtraceEvent; - write_arg(SBR::kPidFieldNumber - 1, write_value); - write_arg(SBR::kIoWaitFieldNumber - 1, write_value); - write_arg(SBR::kCallerFieldNumber - 1, [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); - }); - return; - } else if (event_name == "workqueue_activate_work") { - using WAW = protos::pbzero::WorkqueueActivateWorkFtraceEvent; - writer->AppendString(" work struct "); - write_value_at_index(WAW::kWorkFieldNumber - 1, - [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); - }); - return; - } else if (event_name == "workqueue_execute_start") { - using WES = protos::pbzero::WorkqueueExecuteStartFtraceEvent; - writer->AppendString(" work struct "); - write_value_at_index(WES::kWorkFieldNumber - 1, - [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); - }); - writer->AppendString(": function "); - write_value_at_index(WES::kFunctionFieldNumber - 1, - [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); - }); - return; - } else if (event_name == "workqueue_execute_end") { - using WE = protos::pbzero::WorkqueueExecuteEndFtraceEvent; - writer->AppendString(" work struct "); - write_value_at_index(WE::kWorkFieldNumber - 1, - [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); - }); - return; - } else if (event_name == "workqueue_queue_work") { - using WQW = protos::pbzero::WorkqueueQueueWorkFtraceEvent; - writer->AppendString(" work struct="); - write_value_at_index(WQW::kWorkFieldNumber - 1, - [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); - }); - write_arg(WQW::kFunctionFieldNumber - 1, [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); - }); - write_arg(WQW::kWorkqueueFieldNumber - 1, [writer](const Variadic& value) { - PERFETTO_DCHECK(value.type == Variadic::Type::kUint); - writer->AppendHexInt(value.uint_value); - }); - write_value_at_index(WQW::kReqCpuFieldNumber - 1, write_value); - write_value_at_index(WQW::kCpuFieldNumber - 1, write_value); - return; } uint32_t arg = 0; @@ -372,7 +254,6 @@ void RawTable::ToSystrace(sqlite3_context* ctx, FormatSystraceArgs(event_name, raw_evts.arg_set_ids()[row], &writer); sqlite3_result_text(ctx, writer.CreateStringCopy(), -1, free); } -#endif // PERFETTO_BUILDFLAG(PERFETTO_TP_FTRACE) } // namespace trace_processor } // namespace perfetto |