diff --git a/Android.bp b/Android.bp index 0d8112e5792..7157b5aea5e 100644 --- a/Android.bp +++ b/Android.bp @@ -1725,7 +1725,9 @@ filegroup { "protos/perfetto/config/android/windowmanager_config.proto", "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -1805,7 +1807,9 @@ java_library { "protos/perfetto/config/android/windowmanager_config.proto", "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -3126,6 +3130,8 @@ cc_test { ":perfetto_src_trace_processor_plugins_experimental_flamegraph_experimental_flamegraph", ":perfetto_src_trace_processor_plugins_experimental_flat_slice_experimental_flat_slice", ":perfetto_src_trace_processor_plugins_experimental_slice_layout_experimental_slice_layout", + ":perfetto_src_trace_processor_plugins_flamegraph_flamegraph", + ":perfetto_src_trace_processor_plugins_flamegraph_intrinsics", ":perfetto_src_trace_processor_plugins_graph_scan_graph_scan", ":perfetto_src_trace_processor_plugins_graph_traversal_graph_traversal", ":perfetto_src_trace_processor_plugins_import_import", @@ -3537,7 +3543,9 @@ filegroup { "protos/perfetto/config/android/windowmanager_config.proto", "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -4608,7 +4616,9 @@ filegroup { srcs: [ "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -4653,7 +4663,9 @@ genrule { out: [ "external/perfetto/protos/perfetto/config/chrome/chrome_config.gen.cc", "external/perfetto/protos/perfetto/config/chrome/histogram_samples.gen.cc", + "external/perfetto/protos/perfetto/config/chrome/sampling_heap_profiler.gen.cc", "external/perfetto/protos/perfetto/config/chrome/scenario_config.gen.cc", + "external/perfetto/protos/perfetto/config/chrome/stack_sampling_profiler.gen.cc", "external/perfetto/protos/perfetto/config/chrome/system_metrics.gen.cc", "external/perfetto/protos/perfetto/config/chrome/v8_config.gen.cc", "external/perfetto/protos/perfetto/config/data_source_config.gen.cc", @@ -4698,7 +4710,9 @@ genrule { out: [ "external/perfetto/protos/perfetto/config/chrome/chrome_config.gen.h", "external/perfetto/protos/perfetto/config/chrome/histogram_samples.gen.h", + "external/perfetto/protos/perfetto/config/chrome/sampling_heap_profiler.gen.h", "external/perfetto/protos/perfetto/config/chrome/scenario_config.gen.h", + "external/perfetto/protos/perfetto/config/chrome/stack_sampling_profiler.gen.h", "external/perfetto/protos/perfetto/config/chrome/system_metrics.gen.h", "external/perfetto/protos/perfetto/config/chrome/v8_config.gen.h", "external/perfetto/protos/perfetto/config/data_source_config.gen.h", @@ -4759,7 +4773,9 @@ genrule { "protos/perfetto/config/android/windowmanager_config.proto", "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -5496,7 +5512,9 @@ filegroup { srcs: [ "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -5540,7 +5558,9 @@ genrule { out: [ "external/perfetto/protos/perfetto/config/chrome/chrome_config.pb.cc", "external/perfetto/protos/perfetto/config/chrome/histogram_samples.pb.cc", + "external/perfetto/protos/perfetto/config/chrome/sampling_heap_profiler.pb.cc", "external/perfetto/protos/perfetto/config/chrome/scenario_config.pb.cc", + "external/perfetto/protos/perfetto/config/chrome/stack_sampling_profiler.pb.cc", "external/perfetto/protos/perfetto/config/chrome/system_metrics.pb.cc", "external/perfetto/protos/perfetto/config/chrome/v8_config.pb.cc", "external/perfetto/protos/perfetto/config/data_source_config.pb.cc", @@ -5584,7 +5604,9 @@ genrule { out: [ "external/perfetto/protos/perfetto/config/chrome/chrome_config.pb.h", "external/perfetto/protos/perfetto/config/chrome/histogram_samples.pb.h", + "external/perfetto/protos/perfetto/config/chrome/sampling_heap_profiler.pb.h", "external/perfetto/protos/perfetto/config/chrome/scenario_config.pb.h", + "external/perfetto/protos/perfetto/config/chrome/stack_sampling_profiler.pb.h", "external/perfetto/protos/perfetto/config/chrome/system_metrics.pb.h", "external/perfetto/protos/perfetto/config/chrome/v8_config.pb.h", "external/perfetto/protos/perfetto/config/data_source_config.pb.h", @@ -6978,7 +7000,9 @@ filegroup { srcs: [ "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -7023,7 +7047,9 @@ genrule { out: [ "external/perfetto/protos/perfetto/config/chrome/chrome_config.pbzero.cc", "external/perfetto/protos/perfetto/config/chrome/histogram_samples.pbzero.cc", + "external/perfetto/protos/perfetto/config/chrome/sampling_heap_profiler.pbzero.cc", "external/perfetto/protos/perfetto/config/chrome/scenario_config.pbzero.cc", + "external/perfetto/protos/perfetto/config/chrome/stack_sampling_profiler.pbzero.cc", "external/perfetto/protos/perfetto/config/chrome/system_metrics.pbzero.cc", "external/perfetto/protos/perfetto/config/chrome/v8_config.pbzero.cc", "external/perfetto/protos/perfetto/config/data_source_config.pbzero.cc", @@ -7068,7 +7094,9 @@ genrule { out: [ "external/perfetto/protos/perfetto/config/chrome/chrome_config.pbzero.h", "external/perfetto/protos/perfetto/config/chrome/histogram_samples.pbzero.h", + "external/perfetto/protos/perfetto/config/chrome/sampling_heap_profiler.pbzero.h", "external/perfetto/protos/perfetto/config/chrome/scenario_config.pbzero.h", + "external/perfetto/protos/perfetto/config/chrome/stack_sampling_profiler.pbzero.h", "external/perfetto/protos/perfetto/config/chrome/system_metrics.pbzero.h", "external/perfetto/protos/perfetto/config/chrome/v8_config.pbzero.h", "external/perfetto/protos/perfetto/config/data_source_config.pbzero.h", @@ -8371,7 +8399,9 @@ genrule { "protos/perfetto/config/android/windowmanager_config.proto", "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -11285,7 +11315,9 @@ filegroup { "protos/perfetto/config/android/windowmanager_config.proto", "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -13677,7 +13709,9 @@ genrule { "protos/perfetto/config/android/windowmanager_config.proto", "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -18682,6 +18716,7 @@ filegroup { "src/trace_processor/perfetto_sql/engine/perfetto_sql_connection.cc", "src/trace_processor/perfetto_sql/engine/perfetto_sql_database.cc", "src/trace_processor/perfetto_sql/engine/runtime_table_function.cc", + "src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.cc", "src/trace_processor/perfetto_sql/engine/static_table_function_module.cc", ], } @@ -19161,7 +19196,6 @@ filegroup { filegroup { name: "perfetto_src_trace_processor_perfetto_sql_stdlib_viz_viz", srcs: [ - "src/trace_processor/perfetto_sql/stdlib/viz/flamegraph.sql", "src/trace_processor/perfetto_sql/stdlib/viz/slices.sql", "src/trace_processor/perfetto_sql/stdlib/viz/summary/counters.sql", "src/trace_processor/perfetto_sql/stdlib/viz/summary/processes.sql", @@ -19877,6 +19911,14 @@ filegroup { ], } +// GN: //src/trace_processor/plugins/flamegraph:intrinsics +filegroup { + name: "perfetto_src_trace_processor_plugins_flamegraph_intrinsics", + srcs: [ + "src/trace_processor/plugins/flamegraph/flamegraph_function.cc", + ], +} + // GN: //src/trace_processor/plugins/flamegraph:unittests filegroup { name: "perfetto_src_trace_processor_plugins_flamegraph_unittests", @@ -20709,9 +20751,11 @@ filegroup { filegroup { name: "perfetto_src_trace_processor_sqlite_sqlite", srcs: [ + "src/trace_processor/sqlite/file_system_vfs.cc", "src/trace_processor/sqlite/module_state_manager.cc", "src/trace_processor/sqlite/sql_source.cc", "src/trace_processor/sqlite/sqlite_connection.cc", + "src/trace_processor/sqlite/sqlite_export.cc", "src/trace_processor/sqlite/sqlite_utils.cc", ], } @@ -20720,6 +20764,7 @@ filegroup { filegroup { name: "perfetto_src_trace_processor_sqlite_unittests", srcs: [ + "src/trace_processor/sqlite/file_system_vfs_unittest.cc", "src/trace_processor/sqlite/module_state_manager_unittest.cc", "src/trace_processor/sqlite/sql_source_unittest.cc", "src/trace_processor/sqlite/sqlite_utils_unittest.cc", @@ -21047,6 +21092,8 @@ cc_library_static { ":perfetto_src_trace_processor_plugins_experimental_flamegraph_experimental_flamegraph", ":perfetto_src_trace_processor_plugins_experimental_flat_slice_experimental_flat_slice", ":perfetto_src_trace_processor_plugins_experimental_slice_layout_experimental_slice_layout", + ":perfetto_src_trace_processor_plugins_flamegraph_flamegraph", + ":perfetto_src_trace_processor_plugins_flamegraph_intrinsics", ":perfetto_src_trace_processor_plugins_graph_scan_graph_scan", ":perfetto_src_trace_processor_plugins_graph_traversal_graph_traversal", ":perfetto_src_trace_processor_plugins_import_import", @@ -22885,7 +22932,9 @@ java_library { "protos/perfetto/config/android/windowmanager_config.proto", "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -23358,7 +23407,9 @@ python_library_host { "protos/perfetto/config/android/windowmanager_config.proto", "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -23991,6 +24042,7 @@ cc_test { ":perfetto_src_trace_processor_plugins_experimental_slice_layout_experimental_slice_layout", ":perfetto_src_trace_processor_plugins_experimental_slice_layout_unittests", ":perfetto_src_trace_processor_plugins_flamegraph_flamegraph", + ":perfetto_src_trace_processor_plugins_flamegraph_intrinsics", ":perfetto_src_trace_processor_plugins_flamegraph_unittests", ":perfetto_src_trace_processor_plugins_graph_scan_graph_scan", ":perfetto_src_trace_processor_plugins_graph_traversal_graph_traversal", @@ -25115,6 +25167,8 @@ cc_library_static { ":perfetto_src_trace_processor_plugins_experimental_flamegraph_experimental_flamegraph", ":perfetto_src_trace_processor_plugins_experimental_flat_slice_experimental_flat_slice", ":perfetto_src_trace_processor_plugins_experimental_slice_layout_experimental_slice_layout", + ":perfetto_src_trace_processor_plugins_flamegraph_flamegraph", + ":perfetto_src_trace_processor_plugins_flamegraph_intrinsics", ":perfetto_src_trace_processor_plugins_graph_scan_graph_scan", ":perfetto_src_trace_processor_plugins_graph_traversal_graph_traversal", ":perfetto_src_trace_processor_plugins_import_import", @@ -25814,6 +25868,8 @@ cc_binary_host { ":perfetto_src_trace_processor_plugins_experimental_flamegraph_experimental_flamegraph", ":perfetto_src_trace_processor_plugins_experimental_flat_slice_experimental_flat_slice", ":perfetto_src_trace_processor_plugins_experimental_slice_layout_experimental_slice_layout", + ":perfetto_src_trace_processor_plugins_flamegraph_flamegraph", + ":perfetto_src_trace_processor_plugins_flamegraph_intrinsics", ":perfetto_src_trace_processor_plugins_graph_scan_graph_scan", ":perfetto_src_trace_processor_plugins_graph_traversal_graph_traversal", ":perfetto_src_trace_processor_plugins_import_import", diff --git a/BUILD b/BUILD index fada1b1f7a0..d50ba34561a 100644 --- a/BUILD +++ b/BUILD @@ -491,6 +491,8 @@ perfetto_cc_library( ":src_trace_processor_plugins_experimental_flat_slice_tables", ":src_trace_processor_plugins_experimental_slice_layout_experimental_slice_layout", ":src_trace_processor_plugins_experimental_slice_layout_tables", + ":src_trace_processor_plugins_flamegraph_flamegraph", + ":src_trace_processor_plugins_flamegraph_intrinsics", ":src_trace_processor_plugins_graph_scan_graph_scan", ":src_trace_processor_plugins_graph_traversal_graph_traversal", ":src_trace_processor_plugins_graph_traversal_tables", @@ -802,6 +804,8 @@ perfetto_cc_library( ":src_trace_processor_plugins_experimental_flat_slice_tables", ":src_trace_processor_plugins_experimental_slice_layout_experimental_slice_layout", ":src_trace_processor_plugins_experimental_slice_layout_tables", + ":src_trace_processor_plugins_flamegraph_flamegraph", + ":src_trace_processor_plugins_flamegraph_intrinsics", ":src_trace_processor_plugins_graph_scan_graph_scan", ":src_trace_processor_plugins_graph_traversal_graph_traversal", ":src_trace_processor_plugins_graph_traversal_tables", @@ -3682,6 +3686,8 @@ perfetto_filegroup( "src/trace_processor/perfetto_sql/engine/perfetto_sql_database.h", "src/trace_processor/perfetto_sql/engine/runtime_table_function.cc", "src/trace_processor/perfetto_sql/engine/runtime_table_function.h", + "src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.cc", + "src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.h", "src/trace_processor/perfetto_sql/engine/static_table_function_module.cc", "src/trace_processor/perfetto_sql/engine/static_table_function_module.h", ], @@ -4281,7 +4287,6 @@ perfetto_filegroup( name = "src_trace_processor_perfetto_sql_stdlib_viz_viz", srcs = [ ":src_trace_processor_perfetto_sql_stdlib_viz_summary_summary", - "src/trace_processor/perfetto_sql/stdlib/viz/flamegraph.sql", "src/trace_processor/perfetto_sql/stdlib/viz/slices.sql", "src/trace_processor/perfetto_sql/stdlib/viz/threads.sql", "src/trace_processor/perfetto_sql/stdlib/viz/track_event_callstacks.sql", @@ -4760,6 +4765,24 @@ perfetto_cc_tp_tables( ], ) +# GN target: //src/trace_processor/plugins/flamegraph:flamegraph +perfetto_filegroup( + name = "src_trace_processor_plugins_flamegraph_flamegraph", + srcs = [ + "src/trace_processor/plugins/flamegraph/flamegraph.cc", + "src/trace_processor/plugins/flamegraph/flamegraph.h", + ], +) + +# GN target: //src/trace_processor/plugins/flamegraph:intrinsics +perfetto_filegroup( + name = "src_trace_processor_plugins_flamegraph_intrinsics", + srcs = [ + "src/trace_processor/plugins/flamegraph/flamegraph_function.cc", + "src/trace_processor/plugins/flamegraph/flamegraph_function.h", + ], +) + # GN target: //src/trace_processor/plugins/graph_scan:graph_scan perfetto_filegroup( name = "src_trace_processor_plugins_graph_scan_graph_scan", @@ -5542,6 +5565,8 @@ perfetto_filegroup( name = "src_trace_processor_sqlite_sqlite", srcs = [ "src/trace_processor/sqlite/committed_state_manager.h", + "src/trace_processor/sqlite/file_system_vfs.cc", + "src/trace_processor/sqlite/file_system_vfs.h", "src/trace_processor/sqlite/module_state_manager.cc", "src/trace_processor/sqlite/module_state_manager.h", "src/trace_processor/sqlite/scoped_db.h", @@ -5550,6 +5575,9 @@ perfetto_filegroup( "src/trace_processor/sqlite/sqlite_connection.cc", "src/trace_processor/sqlite/sqlite_connection.h", "src/trace_processor/sqlite/sqlite_database.h", + "src/trace_processor/sqlite/sqlite_export.cc", + "src/trace_processor/sqlite/sqlite_export.h", + "src/trace_processor/sqlite/sqlite_tagged_args.h", "src/trace_processor/sqlite/sqlite_utils.cc", "src/trace_processor/sqlite/sqlite_utils.h", ], @@ -8312,7 +8340,9 @@ perfetto_proto_library( srcs = [ "protos/perfetto/config/chrome/chrome_config.proto", "protos/perfetto/config/chrome/histogram_samples.proto", + "protos/perfetto/config/chrome/sampling_heap_profiler.proto", "protos/perfetto/config/chrome/scenario_config.proto", + "protos/perfetto/config/chrome/stack_sampling_profiler.proto", "protos/perfetto/config/chrome/system_metrics.proto", "protos/perfetto/config/chrome/v8_config.proto", "protos/perfetto/config/data_source_config.proto", @@ -11586,6 +11616,8 @@ perfetto_cc_library( ":src_trace_processor_plugins_experimental_flat_slice_tables", ":src_trace_processor_plugins_experimental_slice_layout_experimental_slice_layout", ":src_trace_processor_plugins_experimental_slice_layout_tables", + ":src_trace_processor_plugins_flamegraph_flamegraph", + ":src_trace_processor_plugins_flamegraph_intrinsics", ":src_trace_processor_plugins_graph_scan_graph_scan", ":src_trace_processor_plugins_graph_traversal_graph_traversal", ":src_trace_processor_plugins_graph_traversal_tables", @@ -11928,6 +11960,8 @@ perfetto_cc_binary( ":src_trace_processor_plugins_experimental_flat_slice_tables", ":src_trace_processor_plugins_experimental_slice_layout_experimental_slice_layout", ":src_trace_processor_plugins_experimental_slice_layout_tables", + ":src_trace_processor_plugins_flamegraph_flamegraph", + ":src_trace_processor_plugins_flamegraph_intrinsics", ":src_trace_processor_plugins_graph_scan_graph_scan", ":src_trace_processor_plugins_graph_traversal_graph_traversal", ":src_trace_processor_plugins_graph_traversal_tables", diff --git a/CHANGELOG b/CHANGELOG index 1c2f91911c3..d0767784111 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,14 @@ Unreleased: + Tracing service and probes: + * + Trace Processor: + * + UI: + * Double-clicking a timeline slice now selects and zooms into it. + SDK: + * + +v58.0 - 2026-08-06: Tracing service and probes: * Added optional recording of the state changes of other concurrent tracing sessions, as ConcurrentSessionEvent packets. Opt-in via @@ -13,31 +23,6 @@ Unreleased: * Replaced TraceConfig.notes and `perfetto --add-note` with TraceConfig.trace_attributes and `--add-attribute`. Trace Processor: - * Added an embedder-provided filesystem interface. The interface is - disabled by default; trace_processor_shell allows SQL file access only - with --allow-sql-file-access. SQL file writes no longer require --dev, - and the integer file descriptor form of EXPORT_JSON has been removed. - * Introduced common stack_sample, stack_sample_session, - stack_sample_task_context, stack_sample_execution_context, - stack_sample_async_context, stack_sample_counter_track and - stack_sample_counter tables shared by all callstack profiler sources. - Async contexts preserve their structural parent relationships. The Linux - perf-specific perf_sample, perf_session and perf_counter_track tables - continue to expose all perf data, including counter-only samples. - * Chrome streaming profiles, legacy V8 cpu profiles, gecko profiles, - simpleperf proto traces, perf script text and macOS Instruments - traces now also populate profiler_sample; cpu_profile_stack_sample - and instruments_sample keep their schemas as views over it. - * The StackSample packet's counter descriptors now materialize as - counter tracks (scoped per profiler session, or per session and - cpu via the new CounterDescriptor.scope field, mirroring - perf_event scoping), with per-sample values as counter rows linked - through the counter set, exactly like linux perf counters. - * Fixed malformed TrackEvent timestamps overflowing into large positive - values, which could crash the UI. - * Added a client-server mode to `trace_processor_shell`: start a server - over a unix socket (`server unix`) or WebSocket (`server http`) and - connect a thin client with `--remote`. * Added trace merging: a ZIP or TAR archive containing several traces imports as one merged trace on a single timeline, with per-machine attribution. An optional `perfetto_manifest` JSON file in the archive @@ -45,16 +30,35 @@ Unreleased: See https://perfetto.dev/docs/analysis/merging-traces. * Added `trace_processor_shell util merge`: packs traces and an optional manifest into a merged-trace archive and sanity-checks the result. - * Trace attributes can now also come from the trace config. - * perfetto_manifest files can annotate an archive via `attributes`. - * Added a transport-neutral stack sampling format: the new - TracePacket.stack_sample attributes a callstack to a thread, process or - async context (goroutine, fiber, ...), measured against an explicit - counter timebase (wall-time, cycles, bytes, ...) with optional follower - counters. Callstacks can be interned or fully inline; per-sequence - StackSampleDefaults declare the profiler source and common counters. - Samples are parsed into the stack sample tables and share the existing - stack_profile_* callstack tables. + * Added a client-server mode to `trace_processor_shell`: start a server + over a unix socket (`server unix`) or WebSocket (`server http`) and + connect a thin client with `--remote`. + * Added a common stack sampling format that any profiler can emit: the + new TracePacket.stack_sample attributes a callstack to a thread, + process or async context (goroutine, fiber, ...), measured against an + explicit counter timebase (wall-time, cycles, bytes, ...) with + optional follower counters. Callstacks can be interned or fully + inline; per-sequence StackSampleDefaults declare the profiler source + and common counters. Samples are parsed into the stack sample tables + and share the existing stack_profile_* callstack tables. + * Introduced common stack_sample, stack_sample_session, + stack_sample_task_context, stack_sample_execution_context, + stack_sample_async_context, stack_sample_counter_track and + stack_sample_counter tables shared by all callstack profiler sources. + Async contexts keep their parent relationships. The Linux perf-specific + perf_sample, perf_session and perf_counter_track tables continue to + expose all perf data, including counter-only samples. + * Added `trace_processor_shell export arrow_tar`, which writes the + built-in tables as a tar of Arrow files for other tools to read. The + format is stable across versions, but the archive cannot be loaded + back into Trace Processor. + * Added `trace_processor_shell export perfetto`, which writes an archive + that another Trace Processor of the same version can load, so a large + trace only has to be parsed once. + * Added an embedder-provided filesystem interface. The interface is + disabled by default; trace_processor_shell allows SQL file access only + with --allow-sql-file-access. SQL file writes no longer require --dev, + and the integer file descriptor form of EXPORT_JSON has been removed. * Breaking change: the inline callstack message `TrackEvent.Callstack` moved to the top-level `InlineCallstack` message in trace/profiling/inline_callstack.proto, so track events and stack @@ -62,6 +66,12 @@ Unreleased: The wire format is unchanged; code referencing the generated `TrackEvent.Callstack` / `TrackEvent::Callstack` types must switch to `InlineCallstack`. + * `regexp()` now takes an optional third argument for matching flags: + `i` for case-insensitive matching, `c` for case-sensitive. + * Fixed negative timestamps wrapping around to large positive values and + crashing the UI, a crash on empty CpuInfo packets, a hang when + skipping an oversized proto field, and Apple Instruments Xcode 27 + traces losing their call stacks. UI: * Improved flamegraphs with clearer direction and filter controls, frame highlighting, and case-insensitive regular expression filtering. @@ -80,6 +90,12 @@ Unreleased: * Update node to v22.23.1 and pnpm to 10.34.5. * Allow pivoting on arg values in slice aggregation table. * Bump to vite v8.1.5 and typescript v7.0.2, vastly improving build times. + * Add memory tooling: + * Memscope: a live memory profiler that guides you through connecting + an Android/Linux device and recording memory traces. + * Memory overview: opens by default on traces containing smaps dumps + and shows a high-level breakdown of where memory is being used, + drawing on smaps, ART, and native memory data recorded in the trace. SDK: * Reworked the C SDK shared library export macros: static linking (the default) no longer needs any macros. Define @@ -93,6 +109,25 @@ Unreleased: preferred trace clock, so callers no longer need to pick the OS specific clock themselves. Also added DataSourceTimestamp::now() in the Rust SDK. + * `dev.perfetto.clock_sync` signpost events now fire on iOS as well as + macOS, so Instruments traces from iOS can be synchronized with + Perfetto traces. + Tools: + * Deprecated `traceconv`. Please use `trace_processor_shell`, which does + the same conversions as subcommands. The `traceconv` wrapper script + now fetches `trace_processor_shell` and runs it under the `traceconv` + name, so existing invocations keep working unchanged. The standalone + binary still ships for now. + AI: + * Much faster repeated queries with skills: the skill now loads a trace + once into a `trace_processor` session and reuses it, instead of + reparsing on every call. + * Added a `TraceConfig` reference and exemplar configs an agent can start + from when it needs a custom recording setup. + * Every analysis now ends by saving a markdown report with the question, + the findings and the queries that worked. + * Releases now include a skill zip for machines that cannot reach + github.com at install time. v57.2 - 2026-07-07: Trace Processor: diff --git a/contrib/rust-sdk/perfetto-sys/src/bindings.rs b/contrib/rust-sdk/perfetto-sys/src/bindings.rs index d61dc9f215b..2c08e6e245f 100644 --- a/contrib/rust-sdk/perfetto-sys/src/bindings.rs +++ b/contrib/rust-sdk/perfetto-sys/src/bindings.rs @@ -324,6 +324,9 @@ unsafe extern "C" { user_arg: *mut ::std::os::raw::c_void, ); } +unsafe extern "C" { + pub fn PerfettoDsTracerImplGetDropCount(tracer: *mut PerfettoDsTracerImpl) -> u64; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct PerfettoHeapBuffer { diff --git a/docs/concepts/buffers.md b/docs/concepts/buffers.md index b9a6c2fcfa8..cd1247ba7a2 100644 --- a/docs/concepts/buffers.md +++ b/docs/concepts/buffers.md @@ -261,6 +261,22 @@ traced_buf_chunks_di 0 info trace 0 traced_buf_chunks_ov 0 data_loss trace 0 ``` +When using [streaming mode] an overwrite is also a data loss: the overwritten +data is never written into the file, so the trace has a gap. This data is +available in the `stats` table, one entry per affected central buffer, where +`idx` is the buffer and `value` is the number of bytes it overwrote: + +```sql +> select * from stats where name = 'long_trace_mode_bytes_overwritten' +name idx severity source value +-------------------- -------------------- -------------------- ------- ----- +long_trace_mode_byte 0 data_loss trace 2048 +``` + +Traces with a `file_write_period_ms` of a day or more do not get this stat: a +write that far out never really happens, so the buffer is a plain ring buffer +again. Traceur does this because detached mode forces `write_into_file` on it. + Summary: the best way to detect and debug data losses is to use Trace Processor and issue the query: `select * from stats where severity = 'data_loss' and value != 0` diff --git a/docs/contributing/ui-plugins.md b/docs/contributing/ui-plugins.md index fce152b9fb7..e518b6fc094 100644 --- a/docs/contributing/ui-plugins.md +++ b/docs/contributing/ui-plugins.md @@ -1478,30 +1478,51 @@ async function selectProcess( This feature allows for creating interactive workflows directly within the omnibox, guided by your plugin. -### Area Selection Tabs +### Selection Tabs -Plugins can register tabs to be displayed in the details panel when an area of -the timeline is selected. +Plugins can register custom subtabs in the bottom details panel for timeline selections. -To register an area selection tab, use the -`trace.selection.registerAreaSelectionTab` method. +Perfetto provides convenience helpers targeting specific selection types, as well as a generic method: + +- `trace.selection.registerTrackEventSelectionTab`: Registers a tab for track events (slices). +- `trace.selection.registerAreaSelectionTab`: Registers a tab for area selections. +- `trace.selection.registerSelectionTab`: Generic registration for any selection type (`Selection` union). + +#### Track Event Selection Tab Example + +```ts +trace.selection.registerTrackEventSelectionTab({ + id: 'my-slice-tab', + name: 'My Slice Tab', + render: (selection) => { + return { + isLoading: false, + content: m('div', `Selected event: ${selection.eventId} on track ${selection.trackUri}`), + }; + }, +}); +``` + +#### Area Selection Tab Example ```ts trace.selection.registerAreaSelectionTab({ id: 'my-area-selection-tab', name: 'My Area Selection Tab', render: (selection) => { - return m('div', `Selected area: ${selection.start} - ${selection.end}`); + return { + isLoading: false, + content: m('div', `Selected area: ${selection.start} - ${selection.end}`), + }; }, }); ``` -The `render` callback should return mithril content to be displayed in the tab. -The `selection` argument is an `AreaSelection` object, which contains -information about the selected area. +The `render` callback should return a `ContentWithLoadingFlag` object (or `undefined` if the tab is not applicable to the current selection). Examples: +- [com.android.AndroidLockContention](https://github.com/google/perfetto/blob/main/ui/src/plugins/com.android.AndroidLockContention/index.ts). - [dev.perfetto.TraceProcessorTrack/index.ts](https://github.com/google/perfetto/blob/main/ui/src/plugins/dev.perfetto.TraceProcessorTrack/index.ts). ### Metric Visualisations diff --git a/docs/images/memscope-bitmaps.png b/docs/images/memscope-bitmaps.png new file mode 100644 index 00000000000..d8032bb90ce Binary files /dev/null and b/docs/images/memscope-bitmaps.png differ diff --git a/docs/images/memscope-composition-over-time.png b/docs/images/memscope-composition-over-time.png new file mode 100644 index 00000000000..6411f466183 Binary files /dev/null and b/docs/images/memscope-composition-over-time.png differ diff --git a/docs/images/memscope-connected.png b/docs/images/memscope-connected.png new file mode 100644 index 00000000000..7f039ce08d0 Binary files /dev/null and b/docs/images/memscope-connected.png differ diff --git a/docs/images/memscope-java-memory.png b/docs/images/memscope-java-memory.png new file mode 100644 index 00000000000..1f0718d9dc5 Binary files /dev/null and b/docs/images/memscope-java-memory.png differ diff --git a/docs/images/memscope-landing.png b/docs/images/memscope-landing.png new file mode 100644 index 00000000000..552bedb21bc Binary files /dev/null and b/docs/images/memscope-landing.png differ diff --git a/docs/images/memscope-mandelbrot-hover.png b/docs/images/memscope-mandelbrot-hover.png new file mode 100644 index 00000000000..6abcf762ac0 Binary files /dev/null and b/docs/images/memscope-mandelbrot-hover.png differ diff --git a/docs/images/memscope-mandelbrot-profile-stop-open.png b/docs/images/memscope-mandelbrot-profile-stop-open.png new file mode 100644 index 00000000000..d3e97a7f060 Binary files /dev/null and b/docs/images/memscope-mandelbrot-profile-stop-open.png differ diff --git a/docs/images/memscope-mandelbrot-trace-opened.png b/docs/images/memscope-mandelbrot-trace-opened.png new file mode 100644 index 00000000000..305a747a7d7 Binary files /dev/null and b/docs/images/memscope-mandelbrot-trace-opened.png differ diff --git a/docs/images/memscope-native-memory.png b/docs/images/memscope-native-memory.png new file mode 100644 index 00000000000..70f4ffbe9e9 Binary files /dev/null and b/docs/images/memscope-native-memory.png differ diff --git a/docs/images/memscope-process-table.png b/docs/images/memscope-process-table.png new file mode 100644 index 00000000000..19562f4503c Binary files /dev/null and b/docs/images/memscope-process-table.png differ diff --git a/docs/images/memscope-smaps-detail.png b/docs/images/memscope-smaps-detail.png new file mode 100644 index 00000000000..7368c36716c Binary files /dev/null and b/docs/images/memscope-smaps-detail.png differ diff --git a/docs/images/memscope-where-did-memory-go.png b/docs/images/memscope-where-did-memory-go.png new file mode 100644 index 00000000000..da5025a45b0 Binary files /dev/null and b/docs/images/memscope-where-did-memory-go.png differ diff --git a/docs/toc.md b/docs/toc.md index 47d4ec1b8e8..93b96cc3e2c 100644 --- a/docs/toc.md +++ b/docs/toc.md @@ -100,6 +100,7 @@ - [Embedding the UI](visualization/embedding-the-ui.md) {.tag-android .tag-linux .tag-cpp-rust .tag-chrome .tag-perf} - [Debug Tracks](analysis/debug-tracks.md) {.tag-android .tag-linux .tag-cpp-rust .tag-chrome .tag-perf} - [Heap Dump Explorer](visualization/heap-dump-explorer.md) {.tag-android} + - [Memscope & Memory Overview](visualization/memscope.md) {.tag-android .tag-linux} - [Extending the UI](#) diff --git a/docs/visualization/memscope.md b/docs/visualization/memscope.md new file mode 100644 index 00000000000..3da053b574a --- /dev/null +++ b/docs/visualization/memscope.md @@ -0,0 +1,222 @@ +# Memscope and Memory Overview + +NOTE: Memscope and Memory Overview are currently available on the Autopush and +Canary channels. Switch channels using the +[release channel flag](https://ui.perfetto.dev/#!/flags/releaseChannel). + +Perfetto provides two complementary features for memory analysis: + +- **Memscope** - A live memory monitor showing system-level and per-process + stats from a running device. Provides shortcuts to start tracing a specific + process. +- **Memory Overview** - Appears after recording a trace, providing a high-level + overview of the memory information, blending smaps snapshots, ART heap dumps + and native profiling, with links to drill down further using + [Heap Dump Explorer](/docs/visualization/heap-dump-explorer.md) and the + existing memory tracks on the timeline. + +This guide walks through recording a trace with Memscope and analyzing it in the +Memory Overview page. + +NOTE: Recording smaps snapshots requires Android build `ZP1A.260626.001` or +newer. + +## Memscope: Live Memory Profiling + +Memscope lets you connect to an Android device or Linux host and watch system +and per-process memory metrics update in real time. It is useful for: + +- Checking the overall health of the system (memory pressure / thrashing / + LMKs). +- Finding which processes are growing over time. +- Spot-checking memory usage before and after a specific action. +- Starting a trace for a specific process. + +### Starting a live Memscope session + +1. Open https://ui.perfetto.dev and click **Memscope** in the sidebar. + + ![Perfetto UI with the Memscope entry highlighted in the sidebar](../images/memscope-landing.png) + +2. Connect to your device or host using one of the available transports. The + recording options are identical to those on the record page. If you are + unsure which to pick, WebUSB is the easiest option for Android devices + connected via USB. + +3. Once connected, Memscope displays a dashboard of system stats and a + task-manager-style list of running processes and their memory stats. The + dashboard updates every few seconds. + + ![Memscope connected view showing system stats and process list](../images/memscope-connected.png) + + ![Memscope process table with RSS, sparkline trends, and memory stats](../images/memscope-process-table.png) + + You can click through the tabs at the top of the page to see various + system-level memory stats such as page cache usage and memory pressure. + +### Process monitoring + +Use the process table to: + +- **Sort by memory usage** - by default the process list is sorted by descending + RSS Anon + Swap usage. +- **Watch trends** - the sparkline next to each process shows recent RSS + direction - processes with consistently upward trends are good candidates for + deeper investigation. +- **Search for a process** - use the filter box to search for a specific process + or package by name. +- **Profile a process** - hover over a process row to reveal the **Profile** + button - click it to start a heap profile for that process. + + ![Memscope filtered to the Mandelbrot process, with an arrow pointing to the Profile button](../images/memscope-mandelbrot-hover.png) + + In this example, we are going to test a dummy app that intentionally leaks + native memory. + +### Recording and opening a trace + +After clicking **Profile**, Memscope starts recording the selected process using +a pre-configured memory trace configuration. + +This pre-configured trace config includes: + +- Periodic [Java (ART) heap dumps](/docs/data-sources/java-heap-profiler.md) + (every 10s). +- Periodic smaps dumps (every 10s). +- [Native heap profiling](/docs/data-sources/native-heap-profiler.md) (dumped + every 5s). + +Exercise the app or otherwise reproduce the behavior you want to investigate, +then click **Stop & Open Trace**. You can monitor the high-level memory usage +using the stacked area graph on this page. + +![Memscope recording the Mandelbrot process, with an arrow pointing to Stop & Open Trace](../images/memscope-mandelbrot-profile-stop-open.png) + +## Memory Overview: Post-Hoc Memory Triage + +The Memory Overview page opens by default for any trace that contains smaps +snapshots, but you can also find it in the sidebar under **Memory Overview**. It +provides a comprehensive view of memory usage for a given process over the +duration of the trace. + +NOTE: For Googlers, you can find good examples of traces with smaps dumps via +the +[process_smaps dashboard](https://apconsole.corp.google.com/dashboards/process_smaps). +However, these usually contain only a single dump, so the timeline view on this +page will be hidden. + +### Process selector and headline stats + +At the top of the page, the process selector lets you pick which process to +inspect. By default, the process with the highest number of memory-relevant +stats is selected. If you have recorded a trace via Memscope, this process will +be selected automatically, as it only records a single process. + +![Memory Overview as it opens from a Memscope trace, with the process selector showing the profiled app](../images/memscope-mandelbrot-trace-opened.png) + +### Composition chart + +The composition-over-time chart shows how memory is broken down by category +(anon, file, shmem, etc.) based on the information in the smaps snapshots. This +is used for top-level temporal navigation for the rest of the page. You can: + +- **Select single snapshots** - click points on the chart to inspect specific + snapshots. The following sections show a breakdown of this snapshot only. +- **Drag across a range** - click and drag across multiple snapshots to compare + snapshots and see how memory use has changed over time. + +![Composition over time chart for the profiled app](../images/memscope-composition-over-time.png) + +In this example, we can see that native memory started increasing rapidly +towards the end of the trace (after we started interacting with the app). + +#### Where the growth went + +This bar shows a breakdown of how the memory growth within the selected region +is split into the various high-level categories. If a single snapshot is +selected, it shows the delta from the start of the trace. + +### Memory breakdown sections + +Below the chart, Memory Overview provides several sections for drilling into +memory usage. + +#### Where did all the memory go? + +This section provides a breakdown of resident memory based on smaps data for the +selected snapshot (absolute, not delta). Use it to determine which sections +below are consuming the most memory. + +![Where did all the memory go section with the resident memory breakdown](../images/memscope-where-did-memory-go.png) + +In this example, we can see that native memory is using a large proportion. + +#### Java heap + +For ART processes, the Java section explains heap usage and lists the heaviest +retained objects by various metrics, grouped by class name. Clicking any of the +class names reveals the contributing objects in Heap Dump Explorer. + +![Java heap memory breakdown for the profiled app](../images/memscope-java-memory.png) + +#### Bitmaps + +The bitmap section summarizes the largest and most frequent bitmaps grouped by +dimension. + +![Bitmaps section summarizing the heaviest bitmaps](../images/memscope-bitmaps.png) + +#### Native allocations + +The native allocation section shows the top unreleased memory allocation call +sites (allocations for which we haven't seen a subsequent free). Note that it +cannot account for all native memory usage - only for allocations made since we +started recording the trace. In our example it covers 87%, so we can get a good +idea of where the memory is going. + +![Native memory breakdown for the profiled app](../images/memscope-native-memory.png) + +We can see that a native function in the mandelbrot engine has allocated 182 MB +without freeing it. This function originates from a native tile rendering +library in the dummy app used to generate the mandelbrot bitmaps and send them +back to the Java runtime for composition. It should not retain much, if any, +memory. The intentional leak was, in fact, caused by skipping the call to free +the image buffer for rendered tiles, so every call into the native code would +leak one 512x512px buffer, which has added up steadily over time. + +Click on the 'Show in timeline' button to drill down into the native allocation +flamegraph in more detail. + +#### Smaps Detail + +Scrolling back up to the top of the page, click the **Smaps Detail** tab at the +top of Memory Overview to inspect the raw `/proc//smaps` data. The table +groups mappings using the same categories as the composition chart. + +![Smaps Detail tab showing the raw smaps mappings grouped by category](../images/memscope-smaps-detail.png) + +## Putting it together: A workflow + +In summary, a typical memory investigation workflow looks like this: + +1. **Find the process** - use Memscope to monitor memory live and identify which + process is growing or find the process you're looking to monitor. +2. **Start tracing the process** - click to start profiling the offending + process, then open the trace in the UI. +3. **Triage in Memory Overview** - open the trace and use the composition chart + and breakdown sections to understand where the memory went. +4. **Go deeper** - if needed, start a native heap profile from Memscope or + record a new trace with heap profiling enabled to get allocation call stacks. + +## See also + +- [Memory Profiling guide](/docs/getting-started/memory-profiling.md) - overview + of native heap profiling, ART heap dumps, and allocation profiling. +- [Memory counters](/docs/data-sources/memory-counters.md) - per-process memory + counters and events from the kernel. +- [Native heap profiler](/docs/data-sources/native-heap-profiler.md) - deep dive + into heapprofd allocation profiling. +- [Heap Dump Explorer](/docs/visualization/heap-dump-explorer.md) - analyzing + ART heap dumps object by object. +- [Memory usage case study](/docs/case-studies/memory.md) - end-to-end guide to + debugging memory issues on Android. diff --git a/include/perfetto/ext/base/file_utils.h b/include/perfetto/ext/base/file_utils.h index 8fab8ed096d..a69c2ec2aa4 100644 --- a/include/perfetto/ext/base/file_utils.h +++ b/include/perfetto/ext/base/file_utils.h @@ -19,6 +19,7 @@ #include // For mode_t & O_RDONLY/RDWR. Exists also on Windows. #include +#include #include #include @@ -100,6 +101,16 @@ int PERFETTO_EXPORT_COMPONENT CloseFile(int fd); bool FlushFile(int fd); +// Moves the file offset to |offset| bytes from the beginning of the file. +// Returns false if |offset| cannot be represented by the platform or the seek +// fails. +bool SeekFile(int fd, uint64_t offset); + +// Changes the size of an open file to |size| bytes. +// Returns false if |size| cannot be represented by the platform or truncation +// fails. +bool TruncateFile(int fd, uint64_t size); + // Returns true if mkdir succeeds, false if it fails (see errno in that case). // `mode` is the permission bits for the new directory; it is ignored on // Windows. @@ -147,6 +158,22 @@ std::string Basename(const std::string& path); // Dirname("C:\\Windows\\System32") => "C:\\Windows" std::string Dirname(const std::string& path); +// Returns the length of the leading root component of a path: "/" on UNIX, +// "C:\" or "\\" (UNC) on Windows. Returns 0 if the path is relative. Like +// Basename() and Dirname(), both '/' and '\' are recognized on all platforms. +// Stripping the returned prefix turns the path into a relative one. +// Examples: +// PathRootPrefixLength("/usr/bin/ls") => 1 +// PathRootPrefixLength("//usr/bin") => 2 +// PathRootPrefixLength("C:\\Windows") => 3 +// PathRootPrefixLength("C:foo") => 0 (relative to the current dir of drive +// C:) PathRootPrefixLength("foo/bar") => 0 +size_t PathRootPrefixLength(const std::string& path); + +// Returns true if the path starts with a root component. See +// PathRootPrefixLength(). +bool IsAbsolutePath(const std::string& path); + // Puts the path to all files under |dir_path| in |output|, recursively walking // subdirectories. File paths are relative to |dir_path|. Only files are // included, not directories. Path separator is always '/', even on windows (not @@ -172,6 +199,13 @@ std::optional GetFileSize(const std::string& path); // Returns the size of the open file |fd|, or nullopt in case of error. std::optional GetFileSize(PlatformHandle fd); +#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) +// On Windows PlatformHandle is a HANDLE, not a file descriptor. This overload +// accepts the CRT file descriptors returned by base::OpenFile(). On other +// platforms PlatformHandle is an int, so the overload above already covers it. +std::optional GetFileSize(int fd); +#endif + // This class uses inotify (on Linux/Android) to watch for the creation of // files in the filesystem. When the specified file is created, it triggers a // callback function. diff --git a/include/perfetto/ext/base/utils.h b/include/perfetto/ext/base/utils.h index 8ad842a5e38..23c1a8f3d11 100644 --- a/include/perfetto/ext/base/utils.h +++ b/include/perfetto/ext/base/utils.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -73,6 +74,32 @@ constexpr size_t ArraySize(const T (&)[TSize]) { return TSize; } +// Adds `a` and `b` into `*result`, returning false on overflow. The value of +// `*result` is unspecified when false is returned. +inline bool CheckedAdd(int64_t a, int64_t b, int64_t* result) { +#if defined(__clang__) || defined(__GNUC__) + return !__builtin_add_overflow(a, b, result); +#else + constexpr int64_t kMax = std::numeric_limits::max(); + constexpr int64_t kMin = std::numeric_limits::min(); + if ((b > 0 && a > kMax - b) || (b < 0 && a < kMin - b)) + return false; + *result = a + b; + return true; +#endif +} + +// Returns whether `value` is positive or negative zero. Compares the bit +// pattern so it can be used in translation units compiled with -Wfloat-equal. +inline bool IsZero(double value) { + uint64_t bits; + memcpy(&bits, &value, sizeof(bits)); + return (bits << 1) == 0; +} +inline bool IsZero(int64_t value) { + return value == 0; +} + // Adds `a` and `b`, clamping to INT64_MIN / INT64_MAX on overflow instead of // wrapping (which is UB and can flip the sign of the result). inline int64_t SaturatingAdd(int64_t a, int64_t b) { diff --git a/include/perfetto/public/abi/data_source_abi.h b/include/perfetto/public/abi/data_source_abi.h index f01072f54b9..17df6f70418 100644 --- a/include/perfetto/public/abi/data_source_abi.h +++ b/include/perfetto/public/abi/data_source_abi.h @@ -408,6 +408,17 @@ PERFETTO_SDK_EXPORT void PerfettoDsTracerImplFlush( PerfettoDsTracerOnFlushCb cb, void* user_arg); +// Returns the number of times `tracer` entered a mode in which it started +// dropping data (e.g. because the shared memory buffer was exhausted and the +// buffer exhausted policy is PERFETTO_DS_BUFFER_EXHAUSTED_POLICY_DROP). +// +// Note that this does *not* necessarily correspond to the number of dropped +// packets, as multiple packets can be dropped on each entry into the drop +// mode. A non-zero (or increased) value indicates that some data written on +// this tracer was lost. +PERFETTO_SDK_EXPORT uint64_t +PerfettoDsTracerImplGetDropCount(struct PerfettoDsTracerImpl* tracer); + #ifdef __cplusplus } #endif diff --git a/include/perfetto/public/data_source.h b/include/perfetto/public/data_source.h index f80c99d29b3..8f163d2d2be 100644 --- a/include/perfetto/public/data_source.h +++ b/include/perfetto/public/data_source.h @@ -302,4 +302,18 @@ static inline void PerfettoDsTracerFlush( PerfettoDsTracerImplFlush(iterator->impl.tracer, cb, ctx); } +// Returns the number of times the data source instance pointed by `iterator` +// entered a mode in which it started dropping data (e.g. because the shared +// memory buffer was exhausted and the buffer exhausted policy is +// PERFETTO_DS_BUFFER_EXHAUSTED_POLICY_DROP). +// +// Note that this does *not* necessarily correspond to the number of dropped +// packets, as multiple packets can be dropped on each entry into the drop +// mode. A non-zero (or increased) value indicates that some data written on +// this thread was lost. +static inline uint64_t PerfettoDsTracerGetDropCount( + struct PerfettoDsTracerIterator* iterator) { + return PerfettoDsTracerImplGetDropCount(iterator->impl.tracer); +} + #endif // INCLUDE_PERFETTO_PUBLIC_DATA_SOURCE_H_ diff --git a/include/perfetto/public/protos/config/data_source_config.pzc.h b/include/perfetto/public/protos/config/data_source_config.pzc.h index 39e1c5db5f2..603c0a6b444 100644 --- a/include/perfetto/public/protos/config/data_source_config.pzc.h +++ b/include/perfetto/public/protos/config/data_source_config.pzc.h @@ -37,6 +37,8 @@ PERFETTO_PB_MSG_DECL(perfetto_protos_AndroidUserListConfig); PERFETTO_PB_MSG_DECL(perfetto_protos_AppWakelocksConfig); PERFETTO_PB_MSG_DECL(perfetto_protos_ChromeConfig); PERFETTO_PB_MSG_DECL(perfetto_protos_ChromiumHistogramSamplesConfig); +PERFETTO_PB_MSG_DECL(perfetto_protos_ChromiumSamplingHeapProfilerConfig); +PERFETTO_PB_MSG_DECL(perfetto_protos_ChromiumStackSamplingProfilerConfig); PERFETTO_PB_MSG_DECL(perfetto_protos_ChromiumSystemMetricsConfig); PERFETTO_PB_MSG_DECL(perfetto_protos_CpuPerUidConfig); PERFETTO_PB_MSG_DECL(perfetto_protos_DisplayVideoConfig); @@ -362,6 +364,16 @@ PERFETTO_PB_FIELD(perfetto_protos_DataSourceConfig, perfetto_protos_DisplayVideoConfig, display_video_config, 142); +PERFETTO_PB_FIELD(perfetto_protos_DataSourceConfig, + MSG, + perfetto_protos_ChromiumStackSamplingProfilerConfig, + chromium_stack_sampling_profiler, + 143); +PERFETTO_PB_FIELD(perfetto_protos_DataSourceConfig, + MSG, + perfetto_protos_ChromiumSamplingHeapProfilerConfig, + chromium_sampling_heap_profiler, + 144); PERFETTO_PB_FIELD(perfetto_protos_DataSourceConfig, MSG, perfetto_protos_QnxConfig, diff --git a/include/perfetto/trace_processor/io.h b/include/perfetto/trace_processor/io.h index 072f2ac1819..26af4e4f228 100644 --- a/include/perfetto/trace_processor/io.h +++ b/include/perfetto/trace_processor/io.h @@ -18,6 +18,7 @@ #define INCLUDE_PERFETTO_TRACE_PROCESSOR_IO_H_ #include +#include #include #include @@ -26,7 +27,8 @@ namespace perfetto::trace_processor::io { -// A synchronous writable file. Each instance is used from a single thread. +// A synchronous random-access file. Each instance is used from a single thread +// and implementations do not need to support concurrent calls. class PERFETTO_EXPORT_COMPONENT File { public: File(); @@ -35,10 +37,35 @@ class PERFETTO_EXPORT_COMPONENT File { File(const File&) = delete; File& operator=(const File&) = delete; - virtual base::Status Write(const void* data, size_t size) = 0; + // Reads up to |size| bytes starting at |offset|. A short read indicates EOF. + virtual base::Status ReadAt(uint64_t offset, + void* data, + size_t size, + size_t* bytes_read) = 0; + + // Writes all |size| bytes starting at |offset|. + virtual base::Status WriteAt(uint64_t offset, + const void* data, + size_t size) = 0; + + virtual base::Status Truncate(uint64_t size) = 0; + virtual base::Status GetSize(uint64_t* size) = 0; + virtual base::Status Flush() = 0; +}; + +enum class FileAccess { + kReadOnly, + kWriteOnly, + kReadWrite, }; -// A synchronous filesystem used by Trace Processor features which write named +struct FileOpenOptions { + FileAccess access = FileAccess::kReadOnly; + bool create = false; + bool truncate = false; +}; + +// A synchronous filesystem used by Trace Processor features which need named // files. Paths are opaque to Trace Processor and interpreted by the embedder. // Implementations must be thread-safe, although each returned File is only // used from one thread. @@ -50,10 +77,14 @@ class PERFETTO_EXPORT_COMPONENT FileSystem { FileSystem(const FileSystem&) = delete; FileSystem& operator=(const FileSystem&) = delete; - // Opens |path| for writing, creating it if needed and replacing any existing - // contents. On success, stores the opened file in |file|. + // Opens |path| with the given |options|. On success, stores the opened + // random-access file in |file|. virtual base::Status OpenFile(const std::string& path, + const FileOpenOptions& options, std::unique_ptr* file) = 0; + + virtual base::Status DeleteFile(const std::string& path) = 0; + virtual base::Status FileExists(const std::string& path, bool* exists) = 0; }; } // namespace perfetto::trace_processor::io diff --git a/include/perfetto/trace_processor/trace_processor.h b/include/perfetto/trace_processor/trace_processor.h index 24faa4ac928..ed2b13ffd49 100644 --- a/include/perfetto/trace_processor/trace_processor.h +++ b/include/perfetto/trace_processor/trace_processor.h @@ -294,6 +294,11 @@ class PERFETTO_EXPORT_COMPONENT TraceProcessor : public TraceProcessorStorage { // notice. Do not depend on this interface in production code. enum class ExportFormat { + // A standard SQLite database containing all SQL-visible Perfetto tables + // and views, including objects created at runtime. This format requires an + // ExportOutput which provides a file path. + kSqlite, + // A Perfetto-internal archive that can be loaded as input by a fresh Trace // Processor instance from the same version. Loading it in a different // version may work but is not guaranteed. diff --git a/include/perfetto/tracing/data_source.h b/include/perfetto/tracing/data_source.h index 1b8b91c52c2..61d271acb00 100644 --- a/include/perfetto/tracing/data_source.h +++ b/include/perfetto/tracing/data_source.h @@ -359,6 +359,15 @@ class DataSource : public DataSourceBase { // This can be useful for splitting protos that might grow very large. uint64_t written() { return tls_inst_->trace_writer->written(); } + // Returns the number of times the trace writer for the current thread and + // data source instance entered a mode in which it started dropping data + // (e.g. because the shared memory buffer was exhausted and the buffer + // exhausted policy is kDrop). Note that this does *not* necessarily + // correspond to the number of dropped packets, as multiple packets can be + // dropped on each entry into the drop mode. A non-zero (or increased) + // value indicates that some data written on this thread was lost. + uint64_t drop_count() { return tls_inst_->trace_writer->drop_count(); } + // Returns a RAII handle to access the data source instance, guaranteeing // that it won't be deleted on another thread (because of trace stopping) // while accessing it from within the Trace() lambda. diff --git a/infra/perfetto.dev/package.json b/infra/perfetto.dev/package.json index 6e5c21c5cb7..3daae5efc65 100644 --- a/infra/perfetto.dev/package.json +++ b/infra/perfetto.dev/package.json @@ -7,7 +7,7 @@ "author": "Perfetto Team", "license": "Apache-2.0", "dependencies": { - "mermaid": "^11.15.0", + "mermaid": "^11.16.1", "sass": "^1.94.0", "yargs": "^17.7.2" }, diff --git a/infra/perfetto.dev/pnpm-lock.yaml b/infra/perfetto.dev/pnpm-lock.yaml index 5476259c707..23047d1e94a 100644 --- a/infra/perfetto.dev/pnpm-lock.yaml +++ b/infra/perfetto.dev/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: mermaid: - specifier: ^11.15.0 - version: 11.16.0 + specifier: ^11.16.1 + version: 11.16.1 sass: specifier: ^1.94.0 version: 1.101.0 @@ -217,8 +217,8 @@ packages: '@types/d3-format@3.0.4': resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} - '@types/d3-geo@3.1.0': - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + '@types/d3-geo@3.1.1': + resolution: {integrity: sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==} '@types/d3-hierarchy@3.1.7': resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} @@ -499,8 +499,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - dompurify@3.4.12: - resolution: {integrity: sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==} + dompurify@3.4.13: + resolution: {integrity: sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==} ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} @@ -510,8 +510,8 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - es-toolkit@1.49.0: - resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} + es-toolkit@1.50.0: + resolution: {integrity: sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==} escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} @@ -603,8 +603,8 @@ packages: engines: {node: '>= 12'} hasBin: true - mermaid@11.16.0: - resolution: {integrity: sha512-Zvm3kbstgdpvIJPPItlL7fppIZ3kibvc1oZIGxdvk9t6UFz6flv+Jw7FtRGKwfcI8OckmH04LqG6LlS6X4B1pA==} + mermaid@11.16.1: + resolution: {integrity: sha512-TQsq6u22fAn3rek5VOubrhKPo1g5hwC3FXUN9hiyupTckcYiGuuKGkNQrKYwGJkXUxZdojwRG46gsSCFZMDp4g==} minimatch@5.1.9: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} @@ -617,8 +617,8 @@ packages: resolution: {integrity: sha512-RinNxoz4W1cep1b928fuFhvAQ5ag/+1UlMDV7rbyGthBIgsiEouS4kvRayvvboxii4m8eolKOIBo3OjDqbc+uQ==} engines: {node: '>=6'} - package-manager-detector@1.7.0: - resolution: {integrity: sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==} + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} @@ -680,8 +680,8 @@ packages: stylis@4.4.0: resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} - tinyexec@1.2.4: - resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} ts-dedent@2.3.0: @@ -719,8 +719,8 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 1.7.0 - tinyexec: 1.2.4 + package-manager-detector: 1.8.0 + tinyexec: 1.3.0 '@braintree/sanitize-url@7.1.2': {} @@ -858,7 +858,7 @@ snapshots: '@types/d3-format@3.0.4': {} - '@types/d3-geo@3.1.0': + '@types/d3-geo@3.1.1': dependencies: '@types/geojson': 7946.0.16 @@ -919,7 +919,7 @@ snapshots: '@types/d3-fetch': 3.0.7 '@types/d3-force': 3.0.10 '@types/d3-format': 3.0.4 - '@types/d3-geo': 3.1.0 + '@types/d3-geo': 3.1.1 '@types/d3-hierarchy': 3.1.7 '@types/d3-interpolate': 3.0.4 '@types/d3-path': 3.1.1 @@ -1189,7 +1189,7 @@ snapshots: detect-libc@2.1.2: optional: true - dompurify@3.4.12: + dompurify@3.4.13: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -1199,7 +1199,7 @@ snapshots: emoji-regex@8.0.0: {} - es-toolkit@1.49.0: {} + es-toolkit@1.50.0: {} escalade@3.2.0: {} @@ -1274,7 +1274,7 @@ snapshots: marked@4.3.0: {} - mermaid@11.16.0: + mermaid@11.16.1: dependencies: '@braintree/sanitize-url': 7.1.2 '@iconify/utils': 3.1.4 @@ -1288,8 +1288,8 @@ snapshots: d3-sankey: 0.12.3 dagre-d3-es: 7.0.14 dayjs: 1.11.21 - dompurify: 3.4.12 - es-toolkit: 1.49.0 + dompurify: 3.4.13 + es-toolkit: 1.50.0 katex: 0.16.47 khroma: 2.1.0 marked: 16.4.2 @@ -1307,7 +1307,7 @@ snapshots: node-watch@0.7.4: {} - package-manager-detector@1.7.0: {} + package-manager-detector@1.8.0: {} path-data-parser@0.1.0: {} @@ -1376,7 +1376,7 @@ snapshots: stylis@4.4.0: {} - tinyexec@1.2.4: {} + tinyexec@1.3.0: {} ts-dedent@2.3.0: {} diff --git a/protos/perfetto/config/BUILD.gn b/protos/perfetto/config/BUILD.gn index 69ec9441337..7ba0950e6f0 100644 --- a/protos/perfetto/config/BUILD.gn +++ b/protos/perfetto/config/BUILD.gn @@ -43,7 +43,9 @@ perfetto_proto_library("@TYPE@") { sources = [ "chrome/chrome_config.proto", "chrome/histogram_samples.proto", + "chrome/sampling_heap_profiler.proto", "chrome/scenario_config.proto", + "chrome/stack_sampling_profiler.proto", "chrome/system_metrics.proto", "chrome/v8_config.proto", "data_source_config.proto", diff --git a/protos/perfetto/config/chrome/sampling_heap_profiler.proto b/protos/perfetto/config/chrome/sampling_heap_profiler.proto new file mode 100644 index 00000000000..c0b95cdfd27 --- /dev/null +++ b/protos/perfetto/config/chrome/sampling_heap_profiler.proto @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2026 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. + */ + +syntax = "proto2"; + +package perfetto.protos; + +message ChromiumSamplingHeapProfilerConfig { + // Sampling interval in bytes. + optional uint64 sampling_interval_bytes = 1; + + // Sampling interval in milliseconds. + optional uint32 sampling_interval_ms = 2; +} diff --git a/protos/perfetto/config/chrome/stack_sampling_profiler.proto b/protos/perfetto/config/chrome/stack_sampling_profiler.proto new file mode 100644 index 00000000000..8894a323111 --- /dev/null +++ b/protos/perfetto/config/chrome/stack_sampling_profiler.proto @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2026 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. + */ + +syntax = "proto2"; + +package perfetto.protos; + +message ChromiumStackSamplingProfilerConfig { + // Sampling interval in milliseconds. + optional uint32 sampling_interval_ms = 1; +} diff --git a/protos/perfetto/config/data_source_config.proto b/protos/perfetto/config/data_source_config.proto index f3c0db87c3a..cc80d6df483 100644 --- a/protos/perfetto/config/data_source_config.proto +++ b/protos/perfetto/config/data_source_config.proto @@ -62,11 +62,13 @@ import "protos/perfetto/config/test_config.proto"; import "protos/perfetto/config/track_event/track_event_config.proto"; import "protos/perfetto/config/system_info/system_info_config.proto"; import "protos/perfetto/config/chrome/histogram_samples.proto"; +import "protos/perfetto/config/chrome/sampling_heap_profiler.proto"; +import "protos/perfetto/config/chrome/stack_sampling_profiler.proto"; import "protos/perfetto/config/linux/journald_config.proto"; import "protos/perfetto/config/qnx/qnx_config.proto"; // The configuration that is passed to each data source when starting tracing. -// Next id: 143 +// Next id: 145 message DataSourceConfig { enum SessionInitiator { SESSION_INITIATOR_UNSPECIFIED = 0; @@ -313,6 +315,14 @@ message DataSourceConfig { // Data source name: android.display.video optional DisplayVideoConfig display_video_config = 142 [lazy = true]; + // Data source name: org.chromium.sampler_profiler + optional ChromiumStackSamplingProfilerConfig + chromium_stack_sampling_profiler = 143 [lazy = true]; + + // Data source name: org.chromium.native_heap_profiler + optional ChromiumSamplingHeapProfilerConfig chromium_sampling_heap_profiler = + 144 [lazy = true]; + // Data source name: qnx.kernel optional QnxConfig qnx_config = 150 [lazy = true]; diff --git a/protos/perfetto/config/perfetto_config.proto b/protos/perfetto/config/perfetto_config.proto index a8da664c9b1..c846a271b73 100644 --- a/protos/perfetto/config/perfetto_config.proto +++ b/protos/perfetto/config/perfetto_config.proto @@ -1412,6 +1412,27 @@ message ChromiumHistogramSamplesConfig { // End of protos/perfetto/config/chrome/histogram_samples.proto +// Begin of protos/perfetto/config/chrome/sampling_heap_profiler.proto + +message ChromiumSamplingHeapProfilerConfig { + // Sampling interval in bytes. + optional uint64 sampling_interval_bytes = 1; + + // Sampling interval in milliseconds. + optional uint32 sampling_interval_ms = 2; +} + +// End of protos/perfetto/config/chrome/sampling_heap_profiler.proto + +// Begin of protos/perfetto/config/chrome/stack_sampling_profiler.proto + +message ChromiumStackSamplingProfilerConfig { + // Sampling interval in milliseconds. + optional uint32 sampling_interval_ms = 1; +} + +// End of protos/perfetto/config/chrome/stack_sampling_profiler.proto + // Begin of protos/perfetto/config/chrome/system_metrics.proto message ChromiumSystemMetricsConfig { @@ -4793,7 +4814,7 @@ message TrackEventConfig { // Begin of protos/perfetto/config/data_source_config.proto // The configuration that is passed to each data source when starting tracing. -// Next id: 143 +// Next id: 145 message DataSourceConfig { enum SessionInitiator { SESSION_INITIATOR_UNSPECIFIED = 0; @@ -5040,6 +5061,14 @@ message DataSourceConfig { // Data source name: android.display.video optional DisplayVideoConfig display_video_config = 142 [lazy = true]; + // Data source name: org.chromium.sampler_profiler + optional ChromiumStackSamplingProfilerConfig + chromium_stack_sampling_profiler = 143 [lazy = true]; + + // Data source name: org.chromium.native_heap_profiler + optional ChromiumSamplingHeapProfilerConfig chromium_sampling_heap_profiler = + 144 [lazy = true]; + // Data source name: qnx.kernel optional QnxConfig qnx_config = 150 [lazy = true]; diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto index f5ba05cf5e7..fa8b3ad772d 100644 --- a/protos/perfetto/trace/perfetto_trace.proto +++ b/protos/perfetto/trace/perfetto_trace.proto @@ -1412,6 +1412,27 @@ message ChromiumHistogramSamplesConfig { // End of protos/perfetto/config/chrome/histogram_samples.proto +// Begin of protos/perfetto/config/chrome/sampling_heap_profiler.proto + +message ChromiumSamplingHeapProfilerConfig { + // Sampling interval in bytes. + optional uint64 sampling_interval_bytes = 1; + + // Sampling interval in milliseconds. + optional uint32 sampling_interval_ms = 2; +} + +// End of protos/perfetto/config/chrome/sampling_heap_profiler.proto + +// Begin of protos/perfetto/config/chrome/stack_sampling_profiler.proto + +message ChromiumStackSamplingProfilerConfig { + // Sampling interval in milliseconds. + optional uint32 sampling_interval_ms = 1; +} + +// End of protos/perfetto/config/chrome/stack_sampling_profiler.proto + // Begin of protos/perfetto/config/chrome/system_metrics.proto message ChromiumSystemMetricsConfig { @@ -4793,7 +4814,7 @@ message TrackEventConfig { // Begin of protos/perfetto/config/data_source_config.proto // The configuration that is passed to each data source when starting tracing. -// Next id: 143 +// Next id: 145 message DataSourceConfig { enum SessionInitiator { SESSION_INITIATOR_UNSPECIFIED = 0; @@ -5040,6 +5061,14 @@ message DataSourceConfig { // Data source name: android.display.video optional DisplayVideoConfig display_video_config = 142 [lazy = true]; + // Data source name: org.chromium.sampler_profiler + optional ChromiumStackSamplingProfilerConfig + chromium_stack_sampling_profiler = 143 [lazy = true]; + + // Data source name: org.chromium.native_heap_profiler + optional ChromiumSamplingHeapProfilerConfig chromium_sampling_heap_profiler = + 144 [lazy = true]; + // Data source name: qnx.kernel optional QnxConfig qnx_config = 150 [lazy = true]; diff --git a/protos/perfetto/trace_processor/trace_processor.proto b/protos/perfetto/trace_processor/trace_processor.proto index 43bf0e4b0dc..4e4eadcb815 100644 --- a/protos/perfetto/trace_processor/trace_processor.proto +++ b/protos/perfetto/trace_processor/trace_processor.proto @@ -554,6 +554,7 @@ message ExportArgs { FORMAT_UNSPECIFIED = 0; PERFETTO = 1; ARROW_TAR = 2; + SQLITE = 3; } optional Format format = 1; } diff --git a/protos/third_party/chromium/optimization_guide/common_quality_data.proto b/protos/third_party/chromium/optimization_guide/common_quality_data.proto index b21ff3caa3a..30deade2dbd 100644 --- a/protos/third_party/chromium/optimization_guide/common_quality_data.proto +++ b/protos/third_party/chromium/optimization_guide/common_quality_data.proto @@ -377,21 +377,21 @@ message ContentAttributes { // The geometry of the content, in the page coordinate system. // Next ID: 9 -// NOTE: If `visual_bounding_box` is empty, i.e., the content is offscreen and +// NOTE: If `visible_bounding_box` is empty, i.e., the content is offscreen and // it's in an iframe, the `outer_bounding_box` may be incorrect. See crbug.com/384996050 // for details. // // Only populated for ANNOTATED_PAGE_CONTENT_MODE_ACTIONABLE_ELEMENTS. message Geometry { // The bounding box of the content node mapped to the viewport ignoring any - // ancestor clips (including the viewport clip). This can be thought of as the + // ancestor clips (including the viewport clip). This can be thought of as // where the element would be relative to the viewport if it "popped out" of // the page and was painted on top of all the content. A few use-case for this // are: // // - If empty, this implies the node is not hit-testable, even once // scrolled onscreen. - // - The rect's origin indicates whether whether it starts above or below the + // - The rect's origin indicates whether it starts above or below the // viewport. A negative y-coordinate means the node's content starts above // the viewport. BoundingRect outer_bounding_box = 1 [features = { field_presence: EXPLICIT }]; diff --git a/python/perfetto/protos/perfetto/trace/perfetto_trace_pb2.py b/python/perfetto/protos/perfetto/trace/perfetto_trace_pb2.py index e9335699b80..d03a3280c4a 100644 --- a/python/perfetto/protos/perfetto/trace/perfetto_trace_pb2.py +++ b/python/perfetto/protos/perfetto/trace/perfetto_trace_pb2.py @@ -24,7 +24,7 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*protos/perfetto/trace/perfetto_trace.proto\x12\x0fperfetto.protos\"\x94\x01\n\x10\x46traceDescriptor\x12K\n\x11\x61trace_categories\x18\x01 \x03(\x0b\x32\x30.perfetto.protos.FtraceDescriptor.AtraceCategory\x1a\x33\n\x0e\x41traceCategory\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"\x9f\x0f\n\x14GpuCounterDescriptor\x12\x43\n\x05specs\x18\x01 \x03(\x0b\x32\x34.perfetto.protos.GpuCounterDescriptor.GpuCounterSpec\x12\x45\n\x06\x62locks\x18\x02 \x03(\x0b\x32\x35.perfetto.protos.GpuCounterDescriptor.GpuCounterBlock\x12Q\n\x0e\x63ounter_groups\x18\x06 \x03(\x0b\x32\x39.perfetto.protos.GpuCounterDescriptor.GpuCounterGroupSpec\x12\x1e\n\x16min_sampling_period_ns\x18\x03 \x01(\x04\x12\x1e\n\x16max_sampling_period_ns\x18\x04 \x01(\x04\x12&\n\x1esupports_instrumented_sampling\x18\x05 \x01(\x08\x12\x1e\n\x16supports_counter_names\x18\x07 \x01(\x08\x12#\n\x1bsupports_counter_name_globs\x18\x08 \x01(\x08\x1a\xec\x04\n\x0eGpuCounterSpec\x12\x12\n\ncounter_id\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x18\n\x0eint_peak_value\x18\x05 \x01(\x03H\x00\x12\x1b\n\x11\x64ouble_peak_value\x18\x06 \x01(\x01H\x00\x12J\n\x0fnumerator_units\x18\x07 \x03(\x0e\x32\x31.perfetto.protos.GpuCounterDescriptor.MeasureUnit\x12L\n\x11\x64\x65nominator_units\x18\x08 \x03(\x0e\x32\x31.perfetto.protos.GpuCounterDescriptor.MeasureUnit\x12\x19\n\x11select_by_default\x18\t \x01(\x08\x12\x45\n\x06groups\x18\n \x03(\x0e\x32\x35.perfetto.protos.GpuCounterDescriptor.GpuCounterGroup\x12\\\n\x0fvalue_direction\x18\x0b \x01(\x0e\x32\x43.perfetto.protos.GpuCounterDescriptor.GpuCounterSpec.ValueDirection\"~\n\x0eValueDirection\x12\x1f\n\x1bVALUE_DIRECTION_UNSPECIFIED\x10\x00\x12%\n!VALUE_DIRECTION_BACKWARDS_LOOKING\x10\x01\x12$\n VALUE_DIRECTION_FORWARDS_LOOKING\x10\x02\x42\x0c\n\npeak_valueJ\x04\x08\x04\x10\x05\x1as\n\x0fGpuCounterBlock\x12\x10\n\x08\x62lock_id\x18\x01 \x01(\r\x12\x16\n\x0e\x62lock_capacity\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x13\n\x0b\x63ounter_ids\x18\x05 \x03(\r\x1a_\n\x13GpuCounterGroupSpec\x12\x10\n\x08group_id\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x13\n\x0b\x63ounter_ids\x18\x04 \x03(\r\"\x86\x01\n\x0fGpuCounterGroup\x12\x10\n\x0cUNCLASSIFIED\x10\x00\x12\n\n\x06SYSTEM\x10\x01\x12\x0c\n\x08VERTICES\x10\x02\x12\r\n\tFRAGMENTS\x10\x03\x12\x0e\n\nPRIMITIVES\x10\x04\x12\n\n\x06MEMORY\x10\x05\x12\x0b\n\x07\x43OMPUTE\x10\x06\x12\x0f\n\x0bRAY_TRACING\x10\x07\"\xac\x04\n\x0bMeasureUnit\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03\x42IT\x10\x01\x12\x0b\n\x07KILOBIT\x10\x02\x12\x0b\n\x07MEGABIT\x10\x03\x12\x0b\n\x07GIGABIT\x10\x04\x12\x0b\n\x07TERABIT\x10\x05\x12\x0b\n\x07PETABIT\x10\x06\x12\x08\n\x04\x42YTE\x10\x07\x12\x0c\n\x08KILOBYTE\x10\x08\x12\x0c\n\x08MEGABYTE\x10\t\x12\x0c\n\x08GIGABYTE\x10\n\x12\x0c\n\x08TERABYTE\x10\x0b\x12\x0c\n\x08PETABYTE\x10\x0c\x12\t\n\x05HERTZ\x10\r\x12\r\n\tKILOHERTZ\x10\x0e\x12\r\n\tMEGAHERTZ\x10\x0f\x12\r\n\tGIGAHERTZ\x10\x10\x12\r\n\tTERAHERTZ\x10\x11\x12\r\n\tPETAHERTZ\x10\x12\x12\x0e\n\nNANOSECOND\x10\x13\x12\x0f\n\x0bMICROSECOND\x10\x14\x12\x0f\n\x0bMILLISECOND\x10\x15\x12\n\n\x06SECOND\x10\x16\x12\n\n\x06MINUTE\x10\x17\x12\x08\n\x04HOUR\x10\x18\x12\n\n\x06VERTEX\x10\x19\x12\t\n\x05PIXEL\x10\x1a\x12\x0c\n\x08TRIANGLE\x10\x1b\x12\r\n\tPRIMITIVE\x10&\x12\x0c\n\x08\x46RAGMENT\x10\'\x12\r\n\tMILLIWATT\x10\x1c\x12\x08\n\x04WATT\x10\x1d\x12\x0c\n\x08KILOWATT\x10\x1e\x12\t\n\x05JOULE\x10\x1f\x12\x08\n\x04VOLT\x10 \x12\n\n\x06\x41MPERE\x10!\x12\x0b\n\x07\x43\x45LSIUS\x10\"\x12\x0e\n\nFAHRENHEIT\x10#\x12\n\n\x06KELVIN\x10$\x12\x0b\n\x07PERCENT\x10%\x12\x0f\n\x0bINSTRUCTION\x10(\"E\n\x12TrackEventCategory\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0c\n\x04tags\x18\x03 \x03(\t\"Y\n\x14TrackEventDescriptor\x12\x41\n\x14\x61vailable_categories\x18\x01 \x03(\x0b\x32#.perfetto.protos.TrackEventCategory\"R\n\tVmProgram\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x34\n\x0cinstructions\x18\x02 \x03(\x0b\x32\x1e.perfetto.protos.VmInstruction\"\xde\x03\n\rVmInstruction\x12-\n\x06select\x18\x01 \x01(\x0b\x32\x1b.perfetto.protos.VmOpSelectH\x00\x12\x30\n\x08reg_load\x18\x02 \x01(\x0b\x32\x1c.perfetto.protos.VmOpRegLoadH\x00\x12+\n\x05merge\x18\x03 \x01(\x0b\x32\x1a.perfetto.protos.VmOpMergeH\x00\x12\'\n\x03set\x18\x04 \x01(\x0b\x32\x18.perfetto.protos.VmOpSetH\x00\x12\'\n\x03\x64\x65l\x18\x05 \x01(\x0b\x32\x18.perfetto.protos.VmOpDelH\x00\x12>\n\x0b\x61\x62ort_level\x18\x06 \x01(\x0e\x32).perfetto.protos.VmInstruction.AbortLevel\x12;\n\x13nested_instructions\x18\x07 \x03(\x0b\x32\x1e.perfetto.protos.VmInstruction\"c\n\nAbortLevel\x12\x1c\n\x18SKIP_CURRENT_INSTRUCTION\x10\x01\x12,\n(SKIP_CURRENT_INSTRUCTION_AND_BREAK_OUTER\x10\x02\x12\t\n\x05\x41\x42ORT\x10\x03\x42\x0b\n\toperation\"\xd7\x02\n\nVmOpSelect\x12-\n\x06\x63ursor\x18\x01 \x01(\x0e\x32\x1d.perfetto.protos.VmCursorEnum\x12@\n\rrelative_path\x18\x02 \x03(\x0b\x32).perfetto.protos.VmOpSelect.PathComponent\x12\x1b\n\x13\x63reate_if_not_exist\x18\x03 \x01(\x08\x1a\xba\x01\n\rPathComponent\x12\x12\n\x08\x66ield_id\x18\x01 \x01(\rH\x00\x12\x15\n\x0b\x61rray_index\x18\x02 \x01(\rH\x00\x12\x1a\n\x10map_key_field_id\x18\x03 \x01(\rH\x00\x12\x13\n\x0bis_repeated\x18\x05 \x01(\x08\x12\x19\n\x11register_to_match\x18\x06 \x01(\r\x12)\n!store_foreach_index_into_register\x18\x07 \x01(\rB\x07\n\x05\x66ield\"R\n\x0bVmOpRegLoad\x12-\n\x06\x63ursor\x18\x01 \x01(\x0e\x32\x1d.perfetto.protos.VmCursorEnum\x12\x14\n\x0c\x64st_register\x18\x02 \x01(\r\"?\n\tVmOpMerge\x12\x18\n\x10skip_submessages\x18\x01 \x01(\x08\x12\x18\n\x10\x64\x65l_if_src_empty\x18\x02 \x01(\x08\"\t\n\x07VmOpSet\"\t\n\x07VmOpDel\"\xb3\x03\n\x14\x44\x61taSourceDescriptor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x07 \x01(\x04\x12\x1b\n\x13will_notify_on_stop\x18\x02 \x01(\x08\x12\x1c\n\x14will_notify_on_start\x18\x03 \x01(\x08\x12\'\n\x1fhandles_incremental_state_clear\x18\x04 \x01(\x08\x12\x10\n\x08no_flush\x18\t \x01(\x08\x12\x33\n\x0fprotovm_program\x18\n \x01(\x0b\x32\x1a.perfetto.protos.VmProgram\x12I\n\x16gpu_counter_descriptor\x18\x05 \x01(\x0b\x32%.perfetto.protos.GpuCounterDescriptorB\x02(\x01\x12I\n\x16track_event_descriptor\x18\x06 \x01(\x0b\x32%.perfetto.protos.TrackEventDescriptorB\x02(\x01\x12@\n\x11\x66trace_descriptor\x18\x08 \x01(\x0b\x32!.perfetto.protos.FtraceDescriptorB\x02(\x01\"\xe2\x06\n\x13TracingServiceState\x12@\n\tproducers\x18\x01 \x03(\x0b\x32-.perfetto.protos.TracingServiceState.Producer\x12\x45\n\x0c\x64\x61ta_sources\x18\x02 \x03(\x0b\x32/.perfetto.protos.TracingServiceState.DataSource\x12M\n\x10tracing_sessions\x18\x06 \x03(\x0b\x32\x33.perfetto.protos.TracingServiceState.TracingSession\x12!\n\x19supports_tracing_sessions\x18\x07 \x01(\x08\x12\x14\n\x0cnum_sessions\x18\x03 \x01(\x05\x12\x1c\n\x14num_sessions_started\x18\x04 \x01(\x05\x12\x1f\n\x17tracing_service_version\x18\x05 \x01(\t\x1a\x8d\x01\n\x08Producer\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0b\n\x03pid\x18\x05 \x01(\x05\x12\x0b\n\x03uid\x18\x03 \x01(\x05\x12\x13\n\x0bsdk_version\x18\x04 \x01(\t\x12\x0e\n\x06\x66rozen\x18\x06 \x01(\x08\x12\x12\n\nmachine_id\x18\x07 \x01(\r\x12\x14\n\x0cmachine_name\x18\x08 \x01(\t\x1a_\n\nDataSource\x12<\n\rds_descriptor\x18\x01 \x01(\x0b\x32%.perfetto.protos.DataSourceDescriptor\x12\x13\n\x0bproducer_id\x18\x02 \x01(\x05\x1a\x89\x02\n\x0eTracingSession\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x0c\x63onsumer_uid\x18\x02 \x01(\x05\x12\r\n\x05state\x18\x03 \x01(\t\x12\x1b\n\x13unique_session_name\x18\x04 \x01(\t\x12\x16\n\x0e\x62uffer_size_kb\x18\x05 \x03(\r\x12\x13\n\x0b\x64uration_ms\x18\x06 \x01(\r\x12\x18\n\x10num_data_sources\x18\x07 \x01(\r\x12\x19\n\x11start_realtime_ns\x18\x08 \x01(\x03\x12\x17\n\x0f\x62ugreport_score\x18\t \x01(\x05\x12\x1a\n\x12\x62ugreport_filename\x18\n \x01(\t\x12\x12\n\nis_started\x18\x0b \x01(\x08\"\xa1\x01\n\x0fTraceAttributes\x12=\n\tattribute\x18\x01 \x03(\x0b\x32*.perfetto.protos.TraceAttributes.Attribute\x1aO\n\tAttribute\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x14\n\nlong_value\x18\x02 \x01(\x03H\x00\x12\x16\n\x0cstring_value\x18\x03 \x01(\tH\x00\x42\x07\n\x05value\"&\n\x13\x41ndroidAflagsConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\"@\n!AndroidGameInterventionListConfig\x12\x1b\n\x13package_name_filter\x18\x01 \x03(\t\"\xef\x04\n\x17\x41ndroidInputEventConfig\x12@\n\x04mode\x18\x01 \x01(\x0e\x32\x32.perfetto.protos.AndroidInputEventConfig.TraceMode\x12\x41\n\x05rules\x18\x02 \x03(\x0b\x32\x32.perfetto.protos.AndroidInputEventConfig.TraceRule\x12%\n\x1dtrace_dispatcher_input_events\x18\x03 \x01(\x08\x12(\n trace_dispatcher_window_dispatch\x18\x04 \x01(\x08\x12\x1a\n\x12trace_evdev_events\x18\x05 \x01(\x08\x1a\xc8\x01\n\tTraceRule\x12H\n\x0btrace_level\x18\x01 \x01(\x0e\x32\x33.perfetto.protos.AndroidInputEventConfig.TraceLevel\x12\x1a\n\x12match_all_packages\x18\x02 \x03(\t\x12\x1a\n\x12match_any_packages\x18\x03 \x03(\t\x12\x14\n\x0cmatch_secure\x18\x04 \x01(\x08\x12#\n\x1bmatch_ime_connection_active\x18\x05 \x01(\x08\"?\n\tTraceMode\x12\x18\n\x14TRACE_MODE_TRACE_ALL\x10\x00\x12\x18\n\x14TRACE_MODE_USE_RULES\x10\x01\"V\n\nTraceLevel\x12\x14\n\x10TRACE_LEVEL_NONE\x10\x00\x12\x18\n\x14TRACE_LEVEL_REDACTED\x10\x01\x12\x18\n\x14TRACE_LEVEL_COMPLETE\x10\x02\"\xb1\x01\n\x10\x41ndroidLogConfig\x12.\n\x07log_ids\x18\x01 \x03(\x0e\x32\x1d.perfetto.protos.AndroidLogId\x12\x35\n\x08min_prio\x18\x03 \x01(\x0e\x32#.perfetto.protos.AndroidLogPriority\x12\x13\n\x0b\x66ilter_tags\x18\x04 \x03(\t\x12\x1b\n\x13preserve_log_buffer\x18\x05 \x01(\x08J\x04\x08\x02\x10\x03\"+\n\x18\x41ndroidPolledStateConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\"\x8a\x01\n\x1c\x41ndroidSdkSyspropGuardConfig\x12(\n surfaceflinger_skia_track_events\x18\x01 \x01(\x08\x12\x1e\n\x16hwui_skia_track_events\x18\x02 \x01(\x08\x12 \n\x18hwui_package_name_filter\x18\x03 \x03(\t\"E\n\x1b\x41ndroidSystemPropertyConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\x12\x15\n\rproperty_name\x18\x02 \x03(\t\"f\n\x12\x41ppWakelocksConfig\x12\x16\n\x0ewrite_delay_ms\x18\x01 \x01(\x05\x12 \n\x18\x66ilter_duration_below_ms\x18\x02 \x01(\x05\x12\x16\n\x0e\x64rop_owner_pid\x18\x03 \x01(\x08\"\"\n\x0f\x43puPerUidConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\"\xf8\x01\n\x12\x44isplayVideoConfig\x12\r\n\x05scale\x18\x01 \x01(\x02\x12:\n\x06\x66ormat\x18\x02 \x01(\x0e\x32*.perfetto.protos.DisplayVideoConfig.Format\x12\x1f\n\x17key_frame_interval_secs\x18\x03 \x01(\r\x12\x1d\n\x15max_stream_size_bytes\x18\x04 \x01(\x04\x12\x13\n\x0b\x62itrate_bps\x18\x05 \x01(\r\"B\n\x06\x46ormat\x12\x16\n\x12\x46ORMAT_UNSPECIFIED\x10\x00\x12\x0f\n\x0b\x46ORMAT_H264\x10\x01\x12\x0f\n\x0b\x46ORMAT_HEVC\x10\x02\"M\n\x11InputMethodConfig\x12\x0e\n\x06\x63lient\x18\x01 \x01(\x08\x12\x0f\n\x07service\x18\x02 \x01(\x08\x12\x17\n\x0fmanager_service\x18\x03 \x01(\x08\"(\n\x15KernelWakelocksConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\"\xab\x01\n\x18NetworkPacketTraceConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\x12\x1d\n\x15\x61ggregation_threshold\x18\x02 \x01(\r\x12\x14\n\x0cintern_limit\x18\x03 \x01(\r\x12\x17\n\x0f\x64rop_local_port\x18\x04 \x01(\x08\x12\x18\n\x10\x64rop_remote_port\x18\x05 \x01(\x08\x12\x16\n\x0e\x64rop_tcp_flags\x18\x06 \x01(\x08\"|\n\x12PackagesListConfig\x12\x1b\n\x13package_name_filter\x18\x01 \x03(\t\x12!\n\x19package_name_regex_filter\x18\x03 \x03(\t\x12&\n\x1eonly_write_on_cpu_use_every_ms\x18\x02 \x01(\r\"\x84\x02\n\x10PixelModemConfig\x12\x41\n\x0b\x65vent_group\x18\x01 \x01(\x0e\x32,.perfetto.protos.PixelModemConfig.EventGroup\x12\x1f\n\x17pigweed_hash_allow_list\x18\x02 \x03(\x03\x12\x1e\n\x16pigweed_hash_deny_list\x18\x03 \x03(\x03\"l\n\nEventGroup\x12\x17\n\x13\x45VENT_GROUP_UNKNOWN\x10\x00\x12\x1d\n\x19\x45VENT_GROUP_LOW_BANDWIDTH\x10\x01\x12&\n\"EVENT_GROUP_HIGH_AND_LOW_BANDWIDTH\x10\x02\"\xf8\x01\n\x0eProtoLogConfig\x12\x37\n\x0fgroup_overrides\x18\x01 \x03(\x0b\x32\x1e.perfetto.protos.ProtoLogGroup\x12\x41\n\x0ctracing_mode\x18\x02 \x01(\x0e\x32+.perfetto.protos.ProtoLogConfig.TracingMode\x12>\n\x16\x64\x65\x66\x61ult_log_from_level\x18\x03 \x01(\x0e\x32\x1e.perfetto.protos.ProtoLogLevel\"*\n\x0bTracingMode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0e\n\nENABLE_ALL\x10\x01\"q\n\rProtoLogGroup\x12\x12\n\ngroup_name\x18\x01 \x01(\t\x12\x30\n\x08log_from\x18\x02 \x01(\x0e\x32\x1e.perfetto.protos.ProtoLogLevel\x12\x1a\n\x12\x63ollect_stacktrace\x18\x03 \x01(\x08\"\x83\x04\n\x1aSurfaceFlingerLayersConfig\x12>\n\x04mode\x18\x01 \x01(\x0e\x32\x30.perfetto.protos.SurfaceFlingerLayersConfig.Mode\x12J\n\x0btrace_flags\x18\x02 \x03(\x0e\x32\x35.perfetto.protos.SurfaceFlingerLayersConfig.TraceFlag\"\x85\x01\n\x04Mode\x12\x14\n\x10MODE_UNSPECIFIED\x10\x00\x12\x0f\n\x0bMODE_ACTIVE\x10\x01\x12\x12\n\x0eMODE_GENERATED\x10\x02\x12\r\n\tMODE_DUMP\x10\x03\x12!\n\x1dMODE_GENERATED_BUGREPORT_ONLY\x10\x04\x12\x10\n\x0cMODE_PROTOVM\x10\x05\"\xd0\x01\n\tTraceFlag\x12\x1a\n\x16TRACE_FLAG_UNSPECIFIED\x10\x00\x12\x14\n\x10TRACE_FLAG_INPUT\x10\x02\x12\x1a\n\x16TRACE_FLAG_COMPOSITION\x10\x04\x12\x14\n\x10TRACE_FLAG_EXTRA\x10\x08\x12\x12\n\x0eTRACE_FLAG_HWC\x10\x10\x12\x16\n\x12TRACE_FLAG_BUFFERS\x10 \x12\x1f\n\x1bTRACE_FLAG_VIRTUAL_DISPLAYS\x10@\x12\x12\n\x0eTRACE_FLAG_ALL\x10\x0e\"\xac\x01\n SurfaceFlingerTransactionsConfig\x12\x44\n\x04mode\x18\x01 \x01(\x0e\x32\x36.perfetto.protos.SurfaceFlingerTransactionsConfig.Mode\"B\n\x04Mode\x12\x14\n\x10MODE_UNSPECIFIED\x10\x00\x12\x13\n\x0fMODE_CONTINUOUS\x10\x01\x12\x0f\n\x0bMODE_ACTIVE\x10\x02\"1\n\x15\x41ndroidUserListConfig\x12\x18\n\x10user_type_filter\x18\x01 \x03(\t\"\xab\x04\n\x13WindowManagerConfig\x12H\n\rlog_frequency\x18\x01 \x01(\x0e\x32\x31.perfetto.protos.WindowManagerConfig.LogFrequency\x12@\n\tlog_level\x18\x02 \x01(\x0e\x32-.perfetto.protos.WindowManagerConfig.LogLevel\x12>\n\x08log_mode\x18\x03 \x01(\x0e\x32,.perfetto.protos.WindowManagerConfig.LogMode\"\x84\x01\n\x0cLogFrequency\x12\x1d\n\x19LOG_FREQUENCY_UNSPECIFIED\x10\x00\x12\x17\n\x13LOG_FREQUENCY_FRAME\x10\x01\x12\x1d\n\x19LOG_FREQUENCY_TRANSACTION\x10\x02\x12\x1d\n\x19LOG_FREQUENCY_SINGLE_DUMP\x10\x03\"i\n\x08LogLevel\x12\x19\n\x15LOG_LEVEL_UNSPECIFIED\x10\x00\x12\x15\n\x11LOG_LEVEL_VERBOSE\x10\x01\x12\x13\n\x0fLOG_LEVEL_DEBUG\x10\x02\x12\x16\n\x12LOG_LEVEL_CRITICAL\x10\x03\"V\n\x07LogMode\x12\x18\n\x14LOG_MODE_UNSPECIFIED\x10\x00\x12\x17\n\x13LOG_MODE_FULL_STATE\x10\x01\x12\x18\n\x14LOG_MODE_INCREMENTAL\x10\x02\"\xbd\x02\n\x0c\x43hromeConfig\x12\x14\n\x0ctrace_config\x18\x01 \x01(\t\x12!\n\x19privacy_filtering_enabled\x18\x02 \x01(\x08\x12\x1e\n\x16\x63onvert_to_legacy_json\x18\x03 \x01(\x08\x12\x45\n\x0f\x63lient_priority\x18\x04 \x01(\x0e\x32,.perfetto.protos.ChromeConfig.ClientPriority\x12\x1f\n\x17json_agent_label_filter\x18\x05 \x01(\t\x12)\n!event_package_name_filter_enabled\x18\x06 \x01(\x08\"A\n\x0e\x43lientPriority\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nBACKGROUND\x10\x01\x12\x12\n\x0eUSER_INITIATED\x10\x02\"\xe6\x01\n\x1e\x43hromiumHistogramSamplesConfig\x12S\n\nhistograms\x18\x01 \x03(\x0b\x32?.perfetto.protos.ChromiumHistogramSamplesConfig.HistogramSample\x12\x1e\n\x16\x66ilter_histogram_names\x18\x02 \x01(\x08\x1aO\n\x0fHistogramSample\x12\x16\n\x0ehistogram_name\x18\x01 \x01(\t\x12\x11\n\tmin_value\x18\x02 \x01(\x03\x12\x11\n\tmax_value\x18\x03 \x01(\x03\";\n\x1b\x43hromiumSystemMetricsConfig\x12\x1c\n\x14sampling_interval_ms\x18\x01 \x01(\r\"@\n\x08V8Config\x12\x1a\n\x12log_script_sources\x18\x01 \x01(\x08\x12\x18\n\x10log_instructions\x18\x02 \x01(\x08\"\xc0\x02\n\tEtwConfig\x12?\n\x0ckernel_flags\x18\x01 \x03(\x0e\x32%.perfetto.protos.EtwConfig.KernelFlagB\x02\x18\x01\x12!\n\x19scheduler_provider_events\x18\x02 \x03(\t\x12\x1e\n\x16memory_provider_events\x18\x03 \x03(\t\x12 \n\x14\x66ile_provider_events\x18\x04 \x03(\tB\x02\x18\x01\x12\x1d\n\x15stack_sampling_events\x18\x05 \x03(\t\x12 \n\x14\x64isk_provider_events\x18\x06 \x03(\tB\x02\x18\x01\x12!\n\x19system_io_provider_events\x18\x07 \x03(\t\")\n\nKernelFlag\x12\x0b\n\x07\x43SWITCH\x10\x00\x12\x0e\n\nDISPATCHER\x10\x01\"+\n\x12\x46rozenFtraceConfig\x12\x15\n\rinstance_name\x18\x01 \x01(\t\"\xca\x0e\n\x0c\x46traceConfig\x12\x15\n\rftrace_events\x18\x01 \x03(\t\x12\x19\n\x11\x61trace_categories\x18\x02 \x03(\t\x12\x13\n\x0b\x61trace_apps\x18\x03 \x03(\t\x12$\n\x1c\x61trace_categories_prefer_sdk\x18\x1c \x03(\t\x12\x1d\n\x15\x61trace_userspace_only\x18\" \x01(\x08\x12\x16\n\x0e\x62uffer_size_kb\x18\n \x01(\r\x12\x1f\n\x17\x62uffer_size_lower_bound\x18\x1b \x01(\x08\x12\x17\n\x0f\x64rain_period_ms\x18\x0b \x01(\r\x12\x1c\n\x14\x64rain_buffer_percent\x18\x1d \x01(\r\x12G\n\rcompact_sched\x18\x0c \x01(\x0b\x32\x30.perfetto.protos.FtraceConfig.CompactSchedConfig\x12?\n\x0cprint_filter\x18\x16 \x01(\x0b\x32).perfetto.protos.FtraceConfig.PrintFilter\x12\x17\n\x0fsymbolize_ksyms\x18\r \x01(\x08\x12\x46\n\x10ksyms_mem_policy\x18\x11 \x01(\x0e\x32,.perfetto.protos.FtraceConfig.KsymsMemPolicy\x12\x19\n\x11throttle_rss_stat\x18\x0f \x01(\x08\x12%\n\x1d\x64\x65nser_generic_event_encoding\x18 \x01(\x08\x12\x1e\n\x16\x64isable_generic_events\x18\x10 \x01(\x08\x12\x16\n\x0esyscall_events\x18\x12 \x03(\t\x12\x1d\n\x15\x65nable_function_graph\x18\x13 \x01(\x08\x12\x18\n\x10\x66unction_filters\x18\x14 \x03(\t\x12\x1c\n\x14\x66unction_graph_roots\x18\x15 \x03(\t\x12 \n\x18\x66unction_graph_max_depth\x18! \x01(\r\x12@\n\rkprobe_events\x18\x1e \x03(\x0b\x32).perfetto.protos.FtraceConfig.KprobeEvent\x12\x1e\n\x16preserve_ftrace_buffer\x18\x17 \x01(\x08\x12\x1f\n\x17use_monotonic_raw_clock\x18\x18 \x01(\x08\x12\x15\n\rinstance_name\x18\x19 \x01(\t\x12\x18\n\x10\x64\x65\x62ug_ftrace_abi\x18\x1f \x01(\x08\x12\x15\n\rtids_to_trace\x18# \x03(\r\x12\x44\n\x0ftracefs_options\x18$ \x03(\x0b\x32+.perfetto.protos.FtraceConfig.TracefsOption\x12\x17\n\x0ftracing_cpumask\x18% \x01(\t\x12\x36\n*initialize_ksyms_synchronously_for_testing\x18\x0e \x01(\x08\x42\x02\x18\x01\x1a%\n\x12\x43ompactSchedConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a\x82\x02\n\x0bPrintFilter\x12=\n\x05rules\x18\x01 \x03(\x0b\x32..perfetto.protos.FtraceConfig.PrintFilter.Rule\x1a\xb3\x01\n\x04Rule\x12\x10\n\x06prefix\x18\x01 \x01(\tH\x00\x12R\n\natrace_msg\x18\x03 \x01(\x0b\x32<.perfetto.protos.FtraceConfig.PrintFilter.Rule.AtraceMessageH\x00\x12\r\n\x05\x61llow\x18\x02 \x01(\x08\x1a-\n\rAtraceMessage\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0e\n\x06prefix\x18\x02 \x01(\tB\x07\n\x05match\x1a\xd0\x01\n\x0bKprobeEvent\x12\r\n\x05probe\x18\x01 \x01(\t\x12\x42\n\x04type\x18\x02 \x01(\x0e\x32\x34.perfetto.protos.FtraceConfig.KprobeEvent.KprobeType\"n\n\nKprobeType\x12\x17\n\x13KPROBE_TYPE_UNKNOWN\x10\x00\x12\x16\n\x12KPROBE_TYPE_KPROBE\x10\x01\x12\x19\n\x15KPROBE_TYPE_KRETPROBE\x10\x02\x12\x14\n\x10KPROBE_TYPE_BOTH\x10\x03\x1a\xa2\x01\n\rTracefsOption\x12\x0c\n\x04name\x18\x01 \x01(\t\x12@\n\x05state\x18\x02 \x01(\x0e\x32\x31.perfetto.protos.FtraceConfig.TracefsOption.State\"A\n\x05State\x12\x11\n\rSTATE_UNKNOWN\x10\x00\x12\x11\n\rSTATE_ENABLED\x10\x01\x12\x12\n\x0eSTATE_DISABLED\x10\x02\"T\n\x0eKsymsMemPolicy\x12\x15\n\x11KSYMS_UNSPECIFIED\x10\x00\x12\x19\n\x15KSYMS_CLEANUP_ON_STOP\x10\x01\x12\x10\n\x0cKSYMS_RETAIN\x10\x02J\x04\x08\x1a\x10\x1b\"\xe7\x06\n\x10GpuCounterConfig\x12\x19\n\x11\x63ounter_period_ns\x18\x01 \x01(\x04\x12\x13\n\x0b\x63ounter_ids\x18\x02 \x03(\r\x12\x15\n\rcounter_names\x18\x06 \x03(\t\x12\x1f\n\x15instrumented_sampling\x18\x03 \x01(\x08H\x00\x12\x64\n\x1cinstrumented_sampling_config\x18\x05 \x01(\x0b\x32<.perfetto.protos.GpuCounterConfig.InstrumentedSamplingConfigH\x00\x12\x15\n\rfix_gpu_clock\x18\x04 \x01(\x08\x1a\xcf\x04\n\x1aInstrumentedSamplingConfig\x12n\n\x15\x61\x63tivity_name_filters\x18\x03 \x03(\x0b\x32O.perfetto.protos.GpuCounterConfig.InstrumentedSamplingConfig.ActivityNameFilter\x12!\n\x19\x61\x63tivity_tx_include_globs\x18\x06 \x03(\t\x12!\n\x19\x61\x63tivity_tx_exclude_globs\x18\x07 \x03(\t\x12\x63\n\x0f\x61\x63tivity_ranges\x18\x05 \x03(\x0b\x32J.perfetto.protos.GpuCounterConfig.InstrumentedSamplingConfig.ActivityRange\x1a\xe7\x01\n\x12\x41\x63tivityNameFilter\x12\x11\n\tname_glob\x18\x01 \x01(\t\x12k\n\tname_base\x18\x02 \x01(\x0e\x32X.perfetto.protos.GpuCounterConfig.InstrumentedSamplingConfig.ActivityNameFilter.NameBase\"Q\n\x08NameBase\x12\x17\n\x13MANGLED_KERNEL_NAME\x10\x00\x12\x19\n\x15\x44\x45MANGLED_KERNEL_NAME\x10\x01\x12\x11\n\rFUNCTION_NAME\x10\x02\x1a,\n\rActivityRange\x12\x0c\n\x04skip\x18\x01 \x01(\r\x12\r\n\x05\x63ount\x18\x02 \x01(\rB\x1c\n\x1ainstrumented_sampling_mode\"\\\n\x15GpuRenderStagesConfig\x12\x16\n\x0e\x66ull_loadstore\x18\x01 \x01(\x08\x12\x14\n\x0clow_overhead\x18\x02 \x01(\x08\x12\x15\n\rtrace_metrics\x18\x03 \x03(\t\"Z\n\x12VulkanMemoryConfig\x12!\n\x19track_driver_memory_usage\x18\x01 \x01(\x08\x12!\n\x19track_device_memory_usage\x18\x02 \x01(\x08\"\xa3\x02\n\x0fInodeFileConfig\x12\x18\n\x10scan_interval_ms\x18\x01 \x01(\r\x12\x15\n\rscan_delay_ms\x18\x02 \x01(\r\x12\x17\n\x0fscan_batch_size\x18\x03 \x01(\r\x12\x13\n\x0b\x64o_not_scan\x18\x04 \x01(\x08\x12\x19\n\x11scan_mount_points\x18\x05 \x03(\t\x12T\n\x13mount_point_mapping\x18\x06 \x03(\x0b\x32\x37.perfetto.protos.InodeFileConfig.MountPointMappingEntry\x1a@\n\x16MountPointMappingEntry\x12\x12\n\nmountpoint\x18\x01 \x01(\t\x12\x12\n\nscan_roots\x18\x02 \x03(\t\"\xa5\x01\n\rConsoleConfig\x12\x35\n\x06output\x18\x01 \x01(\x0e\x32%.perfetto.protos.ConsoleConfig.Output\x12\x15\n\renable_colors\x18\x02 \x01(\x08\"F\n\x06Output\x12\x16\n\x12OUTPUT_UNSPECIFIED\x10\x00\x12\x11\n\rOUTPUT_STDOUT\x10\x01\x12\x11\n\rOUTPUT_STDERR\x10\x02\"Y\n\x11InterceptorConfig\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x36\n\x0e\x63onsole_config\x18\x64 \x01(\x0b\x32\x1e.perfetto.protos.ConsoleConfig\"[\n\x15SystemdJournaldConfig\x12\x10\n\x08min_prio\x18\x01 \x01(\r\x12\x1a\n\x12\x66ilter_identifiers\x18\x02 \x03(\t\x12\x14\n\x0c\x66ilter_units\x18\x03 \x03(\t\"\xc0\x03\n\x12\x41ndroidPowerConfig\x12\x17\n\x0f\x62\x61ttery_poll_ms\x18\x01 \x01(\r\x12M\n\x10\x62\x61ttery_counters\x18\x02 \x03(\x0e\x32\x33.perfetto.protos.AndroidPowerConfig.BatteryCounters\x12\x1b\n\x13\x63ollect_power_rails\x18\x03 \x01(\x08\x12+\n#collect_energy_estimation_breakdown\x18\x04 \x01(\x08\x12&\n\x1e\x63ollect_entity_state_residency\x18\x05 \x01(\x08\"\xcf\x01\n\x0f\x42\x61tteryCounters\x12\x1f\n\x1b\x42\x41TTERY_COUNTER_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x42\x41TTERY_COUNTER_CHARGE\x10\x01\x12$\n BATTERY_COUNTER_CAPACITY_PERCENT\x10\x02\x12\x1b\n\x17\x42\x41TTERY_COUNTER_CURRENT\x10\x03\x12\x1f\n\x1b\x42\x41TTERY_COUNTER_CURRENT_AVG\x10\x04\x12\x1b\n\x17\x42\x41TTERY_COUNTER_VOLTAGE\x10\x05\"\xbf\x01\n\x13PriorityBoostConfig\x12@\n\x06policy\x18\x01 \x01(\x0e\x32\x30.perfetto.protos.PriorityBoostConfig.BoostPolicy\x12\x10\n\x08priority\x18\x02 \x01(\r\"T\n\x0b\x42oostPolicy\x12\x16\n\x12POLICY_UNSPECIFIED\x10\x00\x12\x16\n\x12POLICY_SCHED_OTHER\x10\x01\x12\x15\n\x11POLICY_SCHED_FIFO\x10\x02\"\xeb\x03\n\x12ProcessStatsConfig\x12:\n\x06quirks\x18\x01 \x03(\x0e\x32*.perfetto.protos.ProcessStatsConfig.Quirks\x12#\n\x1bscan_all_processes_on_start\x18\x02 \x01(\x08\x12\x1b\n\x13record_thread_names\x18\x03 \x01(\x08\x12\x1a\n\x12proc_stats_poll_ms\x18\x04 \x01(\r\x12\x1f\n\x17proc_stats_cache_ttl_ms\x18\x06 \x01(\r\x12\x19\n\x11scan_smaps_rollup\x18\n \x01(\x08\x12\x1a\n\x12record_process_age\x18\x0b \x01(\x08\x12\x1e\n\x16record_process_runtime\x18\x0c \x01(\x08\x12!\n\x19record_process_dmabuf_rss\x18\r \x01(\x08\x12\x1b\n\x13resolve_process_fds\x18\t \x01(\x08\x12 \n\x18skip_main_thread_message\x18\x0e \x01(\x08\"U\n\x06Quirks\x12\x16\n\x12QUIRKS_UNSPECIFIED\x10\x00\x12\x1c\n\x14\x44ISABLE_INITIAL_DUMP\x10\x01\x1a\x02\x08\x01\x12\x15\n\x11\x44ISABLE_ON_DEMAND\x10\x02J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"\xcc\x06\n\x0fHeapprofdConfig\x12\x1f\n\x17sampling_interval_bytes\x18\x01 \x01(\x04\x12)\n!adaptive_sampling_shmem_threshold\x18\x18 \x01(\x04\x12\x35\n-adaptive_sampling_max_sampling_interval_bytes\x18\x19 \x01(\x04\x12\x17\n\x0fprocess_cmdline\x18\x02 \x03(\t\x12\x0b\n\x03pid\x18\x04 \x03(\x04\x12\x1b\n\x13target_installed_by\x18\x1a \x03(\t\x12\r\n\x05heaps\x18\x14 \x03(\t\x12\x15\n\rexclude_heaps\x18\x1b \x03(\t\x12\x1a\n\x12stream_allocations\x18\x17 \x01(\x08\x12\x1f\n\x17heap_sampling_intervals\x18\x16 \x03(\x04\x12\x11\n\tall_heaps\x18\x15 \x01(\x08\x12\x0b\n\x03\x61ll\x18\x05 \x01(\x08\x12\x1f\n\x17min_anonymous_memory_kb\x18\x0f \x01(\r\x12\x1f\n\x17max_heapprofd_memory_kb\x18\x10 \x01(\r\x12\x1e\n\x16max_heapprofd_cpu_secs\x18\x11 \x01(\x04\x12\x1a\n\x12skip_symbol_prefix\x18\x07 \x03(\t\x12U\n\x16\x63ontinuous_dump_config\x18\x06 \x01(\x0b\x32\x35.perfetto.protos.HeapprofdConfig.ContinuousDumpConfig\x12\x18\n\x10shmem_size_bytes\x18\x08 \x01(\x04\x12\x14\n\x0c\x62lock_client\x18\t \x01(\x08\x12\x1f\n\x17\x62lock_client_timeout_us\x18\x0e \x01(\r\x12\x12\n\nno_startup\x18\n \x01(\x08\x12\x12\n\nno_running\x18\x0b \x01(\x08\x12\x13\n\x0b\x64ump_at_max\x18\r \x01(\x08\x12\x1d\n\x15\x64isable_fork_teardown\x18\x12 \x01(\x08\x12\x1f\n\x17\x64isable_vfork_detection\x18\x13 \x01(\x08\x1aG\n\x14\x43ontinuousDumpConfig\x12\x15\n\rdump_phase_ms\x18\x05 \x01(\r\x12\x18\n\x10\x64ump_interval_ms\x18\x06 \x01(\rJ\x04\x08\x0c\x10\r\"\xe0\x03\n\x0bSmapsConfig\x12\x39\n\nvma_fields\x18\x01 \x03(\x0e\x32%.perfetto.protos.SmapsConfig.VmaField\x12\x14\n\x0cunaggregated\x18\x02 \x01(\x08\x12<\n\x14name_redaction_rules\x18\x03 \x03(\x0b\x32\x1e.perfetto.protos.RedactionRule\"\xc1\x02\n\x08VmaField\x12\x15\n\x11VMA_FIELD_UNKNOWN\x10\x00\x12\x12\n\x0eVMA_FIELD_SIZE\x10\x01\x12\x11\n\rVMA_FIELD_RSS\x10\x02\x12\x17\n\x13VMA_FIELD_ANONYMOUS\x10\x03\x12\x12\n\x0eVMA_FIELD_SWAP\x10\x04\x12\x1a\n\x16VMA_FIELD_SHARED_CLEAN\x10\x05\x12\x1a\n\x16VMA_FIELD_SHARED_DIRTY\x10\x06\x12\x1b\n\x17VMA_FIELD_PRIVATE_CLEAN\x10\x07\x12\x1b\n\x17VMA_FIELD_PRIVATE_DIRTY\x10\x08\x12\x14\n\x10VMA_FIELD_LOCKED\x10\t\x12\x11\n\rVMA_FIELD_PSS\x10\n\x12\x17\n\x13VMA_FIELD_PSS_DIRTY\x10\x0b\x12\x16\n\x12VMA_FIELD_SWAP_PSS\x10\x0c\"\xb6\x02\n\rRedactionRule\x12\x0f\n\x07pattern\x18\x01 \x01(\t\x12<\n\nmatch_mode\x18\x02 \x01(\x0e\x32(.perfetto.protos.RedactionRule.MatchMode\x12\x11\n\tkeep_full\x18\x03 \x01(\x08\x12\x18\n\x10replacement_name\x18\x04 \x01(\t\x12\x1b\n\x13keep_file_extension\x18\x05 \x01(\x08\x12\x1a\n\x12keep_path_elements\x18\x06 \x01(\r\"p\n\tMatchMode\x12\x16\n\x12MATCH_MODE_UNKNOWN\x10\x00\x12\x15\n\x11MATCH_MODE_PREFIX\x10\x01\x12\x18\n\x14MATCH_MODE_GLOB_PATH\x10\x02\x12\x1a\n\x16MATCH_MODE_GLOB_STRING\x10\x03\"\xd1\x03\n\x0fJavaHprofConfig\x12\x17\n\x0fprocess_cmdline\x18\x01 \x03(\t\x12\x0b\n\x03pid\x18\x02 \x03(\x04\x12\x1b\n\x13target_installed_by\x18\x07 \x03(\t\x12U\n\x16\x63ontinuous_dump_config\x18\x03 \x01(\x0b\x32\x35.perfetto.protos.JavaHprofConfig.ContinuousDumpConfig\x12\x1f\n\x17min_anonymous_memory_kb\x18\x04 \x01(\r\x12\x1d\n\x15min_java_heap_size_kb\x18\t \x01(\r\x12\x12\n\ndump_smaps\x18\x05 \x01(\x08\x12\x32\n\x0csmaps_config\x18\x08 \x01(\x0b\x32\x1c.perfetto.protos.SmapsConfig\x12\x15\n\rignored_types\x18\x06 \x03(\t\x12\x1b\n\x13\x64ump_oome_callstack\x18\n \x01(\x08\x1ah\n\x14\x43ontinuousDumpConfig\x12\x15\n\rdump_phase_ms\x18\x01 \x01(\r\x12\x18\n\x10\x64ump_interval_ms\x18\x02 \x01(\r\x12\x1f\n\x17scan_pids_only_on_start\x18\x03 \x01(\x08\"\xc9\n\n\nPerfEvents\x1a\x9d\x03\n\x08Timebase\x12\x13\n\tfrequency\x18\x02 \x01(\x04H\x00\x12\x10\n\x06period\x18\x01 \x01(\x04H\x00\x12\x18\n\x0epoll_period_ms\x18\x06 \x01(\rH\x00\x12\x36\n\x07\x63ounter\x18\x04 \x01(\x0e\x32#.perfetto.protos.PerfEvents.CounterH\x01\x12<\n\ntracepoint\x18\x03 \x01(\x0b\x32&.perfetto.protos.PerfEvents.TracepointH\x01\x12\x39\n\traw_event\x18\x05 \x01(\x0b\x32$.perfetto.protos.PerfEvents.RawEventH\x01\x12<\n\tmodifiers\x18\x0c \x03(\x0e\x32).perfetto.protos.PerfEvents.EventModifier\x12>\n\x0ftimestamp_clock\x18\x0b \x01(\x0e\x32%.perfetto.protos.PerfEvents.PerfClock\x12\x0c\n\x04name\x18\n \x01(\tB\n\n\x08intervalB\x07\n\x05\x65vent\x1a*\n\nTracepoint\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x66ilter\x18\x02 \x01(\t\x1a\\\n\x08RawEvent\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0e\n\x06\x63onfig\x18\x02 \x01(\x04\x12\x0f\n\x07\x63onfig1\x18\x03 \x01(\x04\x12\x0f\n\x07\x63onfig2\x18\x04 \x01(\x04\x12\x10\n\x08pmu_name\x18\x05 \x01(\t\"\xe8\x03\n\x07\x43ounter\x12\x13\n\x0fUNKNOWN_COUNTER\x10\x00\x12\x10\n\x0cSW_CPU_CLOCK\x10\x01\x12\x12\n\x0eSW_PAGE_FAULTS\x10\x02\x12\x11\n\rSW_TASK_CLOCK\x10\x03\x12\x17\n\x13SW_CONTEXT_SWITCHES\x10\x04\x12\x15\n\x11SW_CPU_MIGRATIONS\x10\x05\x12\x16\n\x12SW_PAGE_FAULTS_MIN\x10\x06\x12\x16\n\x12SW_PAGE_FAULTS_MAJ\x10\x07\x12\x17\n\x13SW_ALIGNMENT_FAULTS\x10\x08\x12\x17\n\x13SW_EMULATION_FAULTS\x10\t\x12\x0c\n\x08SW_DUMMY\x10\x14\x12\x11\n\rHW_CPU_CYCLES\x10\n\x12\x13\n\x0fHW_INSTRUCTIONS\x10\x0b\x12\x17\n\x13HW_CACHE_REFERENCES\x10\x0c\x12\x13\n\x0fHW_CACHE_MISSES\x10\r\x12\x1a\n\x16HW_BRANCH_INSTRUCTIONS\x10\x0e\x12\x14\n\x10HW_BRANCH_MISSES\x10\x0f\x12\x11\n\rHW_BUS_CYCLES\x10\x10\x12\x1e\n\x1aHW_STALLED_CYCLES_FRONTEND\x10\x11\x12\x1d\n\x19HW_STALLED_CYCLES_BACKEND\x10\x12\x12\x15\n\x11HW_REF_CPU_CYCLES\x10\x13\"\x8d\x01\n\tPerfClock\x12\x16\n\x12UNKNOWN_PERF_CLOCK\x10\x00\x12\x17\n\x13PERF_CLOCK_REALTIME\x10\x01\x12\x18\n\x14PERF_CLOCK_MONOTONIC\x10\x02\x12\x1c\n\x18PERF_CLOCK_MONOTONIC_RAW\x10\x03\x12\x17\n\x13PERF_CLOCK_BOOTTIME\x10\x04\"\x95\x01\n\rEventModifier\x12\x1a\n\x16UNKNOWN_EVENT_MODIFIER\x10\x00\x12\"\n\x1e\x45VENT_MODIFIER_COUNT_USERSPACE\x10\x01\x12\x1f\n\x1b\x45VENT_MODIFIER_COUNT_KERNEL\x10\x02\x12#\n\x1f\x45VENT_MODIFIER_COUNT_HYPERVISOR\x10\x03\"\x95\x02\n\rFollowerEvent\x12\x36\n\x07\x63ounter\x18\x01 \x01(\x0e\x32#.perfetto.protos.PerfEvents.CounterH\x00\x12<\n\ntracepoint\x18\x02 \x01(\x0b\x32&.perfetto.protos.PerfEvents.TracepointH\x00\x12\x39\n\traw_event\x18\x03 \x01(\x0b\x32$.perfetto.protos.PerfEvents.RawEventH\x00\x12<\n\tmodifiers\x18\x05 \x03(\x0e\x32).perfetto.protos.PerfEvents.EventModifier\x12\x0c\n\x04name\x18\x04 \x01(\tB\x07\n\x05\x65vent\"\x85\t\n\x0fPerfEventConfig\x12\x36\n\x08timebase\x18\x0f \x01(\x0b\x32$.perfetto.protos.PerfEvents.Timebase\x12\x31\n\tfollowers\x18\x13 \x03(\x0b\x32\x1e.perfetto.protos.FollowerEvent\x12N\n\x12\x63\x61llstack_sampling\x18\x10 \x01(\x0b\x32\x32.perfetto.protos.PerfEventConfig.CallstackSampling\x12\x12\n\ntarget_cpu\x18\x14 \x03(\r\x12\x1b\n\x13ignore_open_failure\x18\x15 \x01(\x08\x12\r\n\x05\x63puid\x18\x16 \x03(\t\x12\"\n\x1aring_buffer_read_period_ms\x18\x08 \x01(\r\x12\x19\n\x11ring_buffer_pages\x18\x03 \x01(\r\x12!\n\x19max_enqueued_footprint_kb\x18\x11 \x01(\x04\x12\x1c\n\x14max_daemon_memory_kb\x18\r \x01(\r\x12$\n\x1cremote_descriptor_timeout_ms\x18\t \x01(\r\x12$\n\x1cunwind_state_clear_period_ms\x18\n \x01(\r\x12\x1b\n\x13target_installed_by\x18\x12 \x03(\t\x12\x10\n\x08\x61ll_cpus\x18\x01 \x01(\x08\x12\x1a\n\x12sampling_frequency\x18\x02 \x01(\r\x12\x15\n\rkernel_frames\x18\x0c \x01(\x08\x12\x12\n\ntarget_pid\x18\x04 \x03(\x05\x12\x16\n\x0etarget_cmdline\x18\x05 \x03(\t\x12\x13\n\x0b\x65xclude_pid\x18\x06 \x03(\x05\x12\x17\n\x0f\x65xclude_cmdline\x18\x07 \x03(\t\x12 \n\x18\x61\x64\x64itional_cmdline_count\x18\x0b \x01(\r\x1a\xa3\x01\n\x11\x43\x61llstackSampling\x12\x35\n\x05scope\x18\x01 \x01(\x0b\x32&.perfetto.protos.PerfEventConfig.Scope\x12\x15\n\rkernel_frames\x18\x02 \x01(\x08\x12@\n\x0buser_frames\x18\x03 \x01(\x0e\x32+.perfetto.protos.PerfEventConfig.UnwindMode\x1a\xa0\x01\n\x05Scope\x12\x12\n\ntarget_pid\x18\x01 \x03(\x05\x12\x16\n\x0etarget_cmdline\x18\x02 \x03(\t\x12\x13\n\x0b\x65xclude_pid\x18\x03 \x03(\x05\x12\x17\n\x0f\x65xclude_cmdline\x18\x04 \x03(\t\x12 \n\x18\x61\x64\x64itional_cmdline_count\x18\x05 \x01(\r\x12\x1b\n\x13process_shard_count\x18\x06 \x01(\r\"~\n\nUnwindMode\x12\x12\n\x0eUNWIND_UNKNOWN\x10\x00\x12\x0f\n\x0bUNWIND_SKIP\x10\x01\x12\x10\n\x0cUNWIND_DWARF\x10\x02\x12\x18\n\x14UNWIND_FRAME_POINTER\x10\x03\x12\x1f\n\x1bUNWIND_KERNEL_FRAME_POINTER\x10\x04J\x04\x08\x0e\x10\x0f\"(\n\rProtoVmConfig\x12\x17\n\x0fmemory_limit_kb\x18\x01 \x01(\r\"\xbf\x01\n\tQnxConfig\x12\x1a\n\x12qnx_kernel_buffers\x18\x01 \x01(\r\x12\x1b\n\x13qnx_kernel_kbuffers\x18\x02 \x01(\r\x12\x1e\n\x16qnx_kernel_wide_events\x18\x03 \x01(\x08\x12\x17\n\x0fqnx_cache_pages\x18\x04 \x01(\r\x12\x1b\n\x13qnx_cache_max_pages\x18\x05 \x01(\x05\x12#\n\x1bqnx_trace_buffer_init_bytes\x18\x06 \x01(\r\"\x9a\x01\n\x13StatsdTracingConfig\x12-\n\x0cpush_atom_id\x18\x01 \x03(\x0e\x32\x17.perfetto.protos.AtomId\x12\x18\n\x10raw_push_atom_id\x18\x02 \x03(\x05\x12:\n\x0bpull_config\x18\x03 \x03(\x0b\x32%.perfetto.protos.StatsdPullAtomConfig\"\x8c\x01\n\x14StatsdPullAtomConfig\x12-\n\x0cpull_atom_id\x18\x01 \x03(\x0e\x32\x17.perfetto.protos.AtomId\x12\x18\n\x10raw_pull_atom_id\x18\x02 \x03(\x05\x12\x19\n\x11pull_frequency_ms\x18\x03 \x01(\x05\x12\x10\n\x08packages\x18\x04 \x03(\t\"\x84\x05\n\x0eSysStatsConfig\x12\x19\n\x11meminfo_period_ms\x18\x01 \x01(\r\x12:\n\x10meminfo_counters\x18\x02 \x03(\x0e\x32 .perfetto.protos.MeminfoCounters\x12\x18\n\x10vmstat_period_ms\x18\x03 \x01(\r\x12\x38\n\x0fvmstat_counters\x18\x04 \x03(\x0e\x32\x1f.perfetto.protos.VmstatCounters\x12\x16\n\x0estat_period_ms\x18\x05 \x01(\r\x12\x43\n\rstat_counters\x18\x06 \x03(\x0e\x32,.perfetto.protos.SysStatsConfig.StatCounters\x12\x19\n\x11\x64\x65vfreq_period_ms\x18\x07 \x01(\r\x12\x19\n\x11\x63pufreq_period_ms\x18\x08 \x01(\r\x12\x1b\n\x13\x62uddyinfo_period_ms\x18\t \x01(\r\x12\x1a\n\x12\x64iskstat_period_ms\x18\n \x01(\r\x12\x15\n\rpsi_period_ms\x18\x0b \x01(\r\x12\x19\n\x11thermal_period_ms\x18\x0c \x01(\r\x12\x19\n\x11\x63puidle_period_ms\x18\r \x01(\r\x12\x19\n\x11gpufreq_period_ms\x18\x0e \x01(\r\x12\x16\n\x0eslab_period_ms\x18\x0f \x01(\r\"{\n\x0cStatCounters\x12\x14\n\x10STAT_UNSPECIFIED\x10\x00\x12\x12\n\x0eSTAT_CPU_TIMES\x10\x01\x12\x13\n\x0fSTAT_IRQ_COUNTS\x10\x02\x12\x17\n\x13STAT_SOFTIRQ_COUNTS\x10\x03\x12\x13\n\x0fSTAT_FORK_COUNT\x10\x04\"%\n\x10SystemInfoConfig\x12\x11\n\tirq_names\x18\x01 \x01(\x08\"\x8d\x04\n\nTestConfig\x12\x15\n\rmessage_count\x18\x01 \x01(\r\x12\x1f\n\x17max_messages_per_second\x18\x02 \x01(\r\x12\x0c\n\x04seed\x18\x03 \x01(\r\x12\x14\n\x0cmessage_size\x18\x04 \x01(\r\x12\x1e\n\x16send_batch_on_register\x18\x05 \x01(\x08\x12=\n\x0c\x64ummy_fields\x18\x06 \x01(\x0b\x32\'.perfetto.protos.TestConfig.DummyFields\x1a\xc3\x02\n\x0b\x44ummyFields\x12\x14\n\x0c\x66ield_uint32\x18\x01 \x01(\r\x12\x13\n\x0b\x66ield_int32\x18\x02 \x01(\x05\x12\x14\n\x0c\x66ield_uint64\x18\x03 \x01(\x04\x12\x13\n\x0b\x66ield_int64\x18\x04 \x01(\x03\x12\x15\n\rfield_fixed64\x18\x05 \x01(\x06\x12\x16\n\x0e\x66ield_sfixed64\x18\x06 \x01(\x10\x12\x15\n\rfield_fixed32\x18\x07 \x01(\x07\x12\x16\n\x0e\x66ield_sfixed32\x18\x08 \x01(\x0f\x12\x14\n\x0c\x66ield_double\x18\t \x01(\x01\x12\x13\n\x0b\x66ield_float\x18\n \x01(\x02\x12\x14\n\x0c\x66ield_sint64\x18\x0b \x01(\x12\x12\x14\n\x0c\x66ield_sint32\x18\x0c \x01(\x11\x12\x14\n\x0c\x66ield_string\x18\r \x01(\t\x12\x13\n\x0b\x66ield_bytes\x18\x0e \x01(\x0c\"\xd2\x02\n\x10TrackEventConfig\x12\x1b\n\x13\x64isabled_categories\x18\x01 \x03(\t\x12\x1a\n\x12\x65nabled_categories\x18\x02 \x03(\t\x12\x15\n\rdisabled_tags\x18\x03 \x03(\t\x12\x14\n\x0c\x65nabled_tags\x18\x04 \x03(\t\x12&\n\x1e\x64isable_incremental_timestamps\x18\x05 \x01(\x08\x12!\n\x19timestamp_unit_multiplier\x18\x06 \x01(\x04\x12 \n\x18\x66ilter_debug_annotations\x18\x07 \x01(\x08\x12#\n\x1b\x65nable_thread_time_sampling\x18\x08 \x01(\x08\x12\"\n\x1athread_time_subsampling_ns\x18\n \x01(\x04\x12\"\n\x1a\x66ilter_dynamic_event_names\x18\t \x01(\x08\"\x80\x1f\n\x10\x44\x61taSourceConfig\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rtarget_buffer\x18\x02 \x01(\r\x12\x1a\n\x12target_buffer_name\x18\x0b \x01(\t\x12\x19\n\x11trace_duration_ms\x18\x03 \x01(\r\x12)\n!prefer_suspend_clock_for_duration\x18z \x01(\x08\x12\x17\n\x0fstop_timeout_ms\x18\x07 \x01(\r\x12\x1f\n\x17\x65nable_extra_guardrails\x18\x06 \x01(\x08\x12M\n\x11session_initiator\x18\x08 \x01(\x0e\x32\x32.perfetto.protos.DataSourceConfig.SessionInitiator\x12\x1a\n\x12tracing_session_id\x18\x04 \x01(\x04\x12X\n\x17\x62uffer_exhausted_policy\x18\t \x01(\x0e\x32\x37.perfetto.protos.DataSourceConfig.BufferExhaustedPolicy\x12<\n\x0epriority_boost\x18\n \x01(\x0b\x32$.perfetto.protos.PriorityBoostConfig\x12\x36\n\x0eprotovm_config\x18\x0c \x01(\x0b\x32\x1e.perfetto.protos.ProtoVmConfig\x12\x38\n\rftrace_config\x18\x64 \x01(\x0b\x32\x1d.perfetto.protos.FtraceConfigB\x02(\x01\x12?\n\x11inode_file_config\x18\x66 \x01(\x0b\x32 .perfetto.protos.InodeFileConfigB\x02(\x01\x12\x45\n\x14process_stats_config\x18g \x01(\x0b\x32#.perfetto.protos.ProcessStatsConfigB\x02(\x01\x12=\n\x10sys_stats_config\x18h \x01(\x0b\x32\x1f.perfetto.protos.SysStatsConfigB\x02(\x01\x12>\n\x10heapprofd_config\x18i \x01(\x0b\x32 .perfetto.protos.HeapprofdConfigB\x02(\x01\x12?\n\x11java_hprof_config\x18n \x01(\x0b\x32 .perfetto.protos.JavaHprofConfigB\x02(\x01\x12\x45\n\x14\x61ndroid_power_config\x18j \x01(\x0b\x32#.perfetto.protos.AndroidPowerConfigB\x02(\x01\x12\x41\n\x12\x61ndroid_log_config\x18k \x01(\x0b\x32!.perfetto.protos.AndroidLogConfigB\x02(\x01\x12\x41\n\x12gpu_counter_config\x18l \x01(\x0b\x32!.perfetto.protos.GpuCounterConfigB\x02(\x01\x12\x65\n%android_game_intervention_list_config\x18t \x01(\x0b\x32\x32.perfetto.protos.AndroidGameInterventionListConfigB\x02(\x01\x12\x45\n\x14packages_list_config\x18m \x01(\x0b\x32#.perfetto.protos.PackagesListConfigB\x02(\x01\x12?\n\x11perf_event_config\x18o \x01(\x0b\x32 .perfetto.protos.PerfEventConfigB\x02(\x01\x12\x45\n\x14vulkan_memory_config\x18p \x01(\x0b\x32#.perfetto.protos.VulkanMemoryConfigB\x02(\x01\x12\x41\n\x12track_event_config\x18q \x01(\x0b\x32!.perfetto.protos.TrackEventConfigB\x02(\x01\x12R\n\x1b\x61ndroid_polled_state_config\x18r \x01(\x0b\x32).perfetto.protos.AndroidPolledStateConfigB\x02(\x01\x12X\n\x1e\x61ndroid_system_property_config\x18v \x01(\x0b\x32,.perfetto.protos.AndroidSystemPropertyConfigB\x02(\x01\x12G\n\x15statsd_tracing_config\x18u \x01(\x0b\x32$.perfetto.protos.StatsdTracingConfigB\x02(\x01\x12=\n\x12system_info_config\x18w \x01(\x0b\x32!.perfetto.protos.SystemInfoConfig\x12\x46\n\x14\x66rozen_ftrace_config\x18\x88\x01 \x01(\x0b\x32#.perfetto.protos.FrozenFtraceConfigB\x02(\x01\x12\x34\n\rchrome_config\x18\x65 \x01(\x0b\x32\x1d.perfetto.protos.ChromeConfig\x12\x30\n\tv8_config\x18\x7f \x01(\x0b\x32\x19.perfetto.protos.V8ConfigB\x02(\x01\x12>\n\x12interceptor_config\x18s \x01(\x0b\x32\".perfetto.protos.InterceptorConfig\x12R\n\x1bnetwork_packet_trace_config\x18x \x01(\x0b\x32).perfetto.protos.NetworkPacketTraceConfigB\x02(\x01\x12U\n\x1csurfaceflinger_layers_config\x18y \x01(\x0b\x32+.perfetto.protos.SurfaceFlingerLayersConfigB\x02(\x01\x12\x61\n\"surfaceflinger_transactions_config\x18{ \x01(\x0b\x32\x31.perfetto.protos.SurfaceFlingerTransactionsConfigB\x02(\x01\x12[\n android_sdk_sysprop_guard_config\x18| \x01(\x0b\x32-.perfetto.protos.AndroidSdkSyspropGuardConfigB\x02(\x01\x12\x32\n\netw_config\x18} \x01(\x0b\x32\x1a.perfetto.protos.EtwConfigB\x02(\x01\x12<\n\x0fprotolog_config\x18~ \x01(\x0b\x32\x1f.perfetto.protos.ProtoLogConfigB\x02(\x01\x12Q\n\x1a\x61ndroid_input_event_config\x18\x80\x01 \x01(\x0b\x32(.perfetto.protos.AndroidInputEventConfigB\x02(\x01\x12\x42\n\x12pixel_modem_config\x18\x81\x01 \x01(\x0b\x32!.perfetto.protos.PixelModemConfigB\x02(\x01\x12G\n\x14windowmanager_config\x18\x82\x01 \x01(\x0b\x32$.perfetto.protos.WindowManagerConfigB\x02(\x01\x12R\n\x17\x63hromium_system_metrics\x18\x83\x01 \x01(\x0b\x32,.perfetto.protos.ChromiumSystemMetricsConfigB\x02(\x01\x12L\n\x17kernel_wakelocks_config\x18\x84\x01 \x01(\x0b\x32&.perfetto.protos.KernelWakelocksConfigB\x02(\x01\x12L\n\x17gpu_renderstages_config\x18\x85\x01 \x01(\x0b\x32&.perfetto.protos.GpuRenderStagesConfigB\x02(\x01\x12X\n\x1a\x63hromium_histogram_samples\x18\x86\x01 \x01(\x0b\x32/.perfetto.protos.ChromiumHistogramSamplesConfigB\x02(\x01\x12\x46\n\x14\x61pp_wakelocks_config\x18\x87\x01 \x01(\x0b\x32#.perfetto.protos.AppWakelocksConfigB\x02(\x01\x12\x41\n\x12\x63pu_per_uid_config\x18\x89\x01 \x01(\x0b\x32 .perfetto.protos.CpuPerUidConfigB\x02(\x01\x12\x45\n\x10user_list_config\x18\x8a\x01 \x01(\x0b\x32&.perfetto.protos.AndroidUserListConfigB\x02(\x01\x12\x43\n\x12inputmethod_config\x18\x8b\x01 \x01(\x0b\x32\".perfetto.protos.InputMethodConfigB\x02(\x01\x12H\n\x15\x61ndroid_aflags_config\x18\x8c\x01 \x01(\x0b\x32$.perfetto.protos.AndroidAflagsConfigB\x02(\x01\x12\x44\n\x0fjournald_config\x18\x8d\x01 \x01(\x0b\x32&.perfetto.protos.SystemdJournaldConfigB\x02(\x01\x12\x46\n\x14\x64isplay_video_config\x18\x8e\x01 \x01(\x0b\x32#.perfetto.protos.DisplayVideoConfigB\x02(\x01\x12\x33\n\nqnx_config\x18\x96\x01 \x01(\x0b\x32\x1a.perfetto.protos.QnxConfigB\x02(\x01\x12\x16\n\rlegacy_config\x18\xe8\x07 \x01(\t\x12\x31\n\x0b\x66or_testing\x18\xe9\x07 \x01(\x0b\x32\x1b.perfetto.protos.TestConfig\"[\n\x10SessionInitiator\x12!\n\x1dSESSION_INITIATOR_UNSPECIFIED\x10\x00\x12$\n SESSION_INITIATOR_TRUSTED_SYSTEM\x10\x01\"\xa1\x01\n\x15\x42ufferExhaustedPolicy\x12 \n\x1c\x42UFFER_EXHAUSTED_UNSPECIFIED\x10\x00\x12\x19\n\x15\x42UFFER_EXHAUSTED_DROP\x10\x01\x12%\n!BUFFER_EXHAUSTED_STALL_THEN_ABORT\x10\x02\x12$\n BUFFER_EXHAUSTED_STALL_THEN_DROP\x10\x03J\x0b\x08\xff\xff\xff\x7f\x10\x80\x80\x80\x80\x01\"\xe4-\n\x0bTraceConfig\x12:\n\x07\x62uffers\x18\x01 \x03(\x0b\x32).perfetto.protos.TraceConfig.BufferConfig\x12=\n\x0c\x64\x61ta_sources\x18\x02 \x03(\x0b\x32\'.perfetto.protos.TraceConfig.DataSource\x12L\n\x14\x62uiltin_data_sources\x18\x14 \x01(\x0b\x32..perfetto.protos.TraceConfig.BuiltinDataSource\x12\x13\n\x0b\x64uration_ms\x18\x03 \x01(\r\x12)\n!prefer_suspend_clock_for_duration\x18$ \x01(\x08\x12\x1f\n\x17\x65nable_extra_guardrails\x18\x04 \x01(\x08\x12I\n\rlockdown_mode\x18\x05 \x01(\x0e\x32\x32.perfetto.protos.TraceConfig.LockdownModeOperation\x12>\n\tproducers\x18\x06 \x03(\x0b\x32+.perfetto.protos.TraceConfig.ProducerConfig\x12\x44\n\x0fstatsd_metadata\x18\x07 \x01(\x0b\x32+.perfetto.protos.TraceConfig.StatsdMetadata\x12\x17\n\x0fwrite_into_file\x18\x08 \x01(\x08\x12\x13\n\x0boutput_path\x18\x1d \x01(\t\x12\x1c\n\x14\x66ile_write_period_ms\x18\t \x01(\r\x12\x1b\n\x13max_file_size_bytes\x18\n \x01(\x04\x12L\n\x13guardrail_overrides\x18\x0b \x01(\x0b\x32/.perfetto.protos.TraceConfig.GuardrailOverrides\x12\x16\n\x0e\x64\x65\x66\x65rred_start\x18\x0c \x01(\x08\x12\x17\n\x0f\x66lush_period_ms\x18\r \x01(\r\x12\x18\n\x10\x66lush_timeout_ms\x18\x0e \x01(\r\x12#\n\x1b\x64\x61ta_source_stop_timeout_ms\x18\x17 \x01(\r\x12\x16\n\x0enotify_traceur\x18\x10 \x01(\x08\x12\x17\n\x0f\x62ugreport_score\x18\x1e \x01(\x05\x12\x1a\n\x12\x62ugreport_filename\x18& \x01(\t\x12\x42\n\x0etrigger_config\x18\x11 \x01(\x0b\x32*.perfetto.protos.TraceConfig.TriggerConfig\x12\x19\n\x11\x61\x63tivate_triggers\x18\x12 \x03(\t\x12U\n\x18incremental_state_config\x18\x15 \x01(\x0b\x32\x33.perfetto.protos.TraceConfig.IncrementalStateConfig\x12$\n\x18\x61llow_user_build_tracing\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x1b\n\x13unique_session_name\x18\x16 \x01(\t\x12J\n\x10\x63ompression_type\x18\x18 \x01(\x0e\x32,.perfetto.protos.TraceConfig.CompressionTypeB\x02\x18\x01\x12\x43\n\x0b\x63ompression\x18/ \x01(\x0b\x32..perfetto.protos.TraceConfig.CompressionConfig\x12Q\n\x16incident_report_config\x18\x19 \x01(\x0b\x32\x31.perfetto.protos.TraceConfig.IncidentReportConfig\x12\x42\n\x0estatsd_logging\x18\x1f \x01(\x0e\x32*.perfetto.protos.TraceConfig.StatsdLogging\x12\x1a\n\x0etrace_uuid_msb\x18\x1b \x01(\x03\x42\x02\x18\x01\x12\x1a\n\x0etrace_uuid_lsb\x18\x1c \x01(\x03\x42\x02\x18\x01\x12>\n\x0ctrace_filter\x18! \x01(\x0b\x32(.perfetto.protos.TraceConfig.TraceFilter\x12O\n\x15\x61ndroid_report_config\x18\" \x01(\x0b\x32\x30.perfetto.protos.TraceConfig.AndroidReportConfig\x12N\n\x15\x63md_trace_start_delay\x18# \x01(\x0b\x32/.perfetto.protos.TraceConfig.CmdTraceStartDelay\x12I\n\x12session_semaphores\x18\' \x03(\x0b\x32-.perfetto.protos.TraceConfig.SessionSemaphore\x12<\n\x0epriority_boost\x18( \x01(\x0b\x32$.perfetto.protos.PriorityBoostConfig\x12\x16\n\x0e\x65xclusive_prio\x18) \x01(\r\x12\x45\n\x10write_flush_mode\x18, \x01(\x0e\x32+.perfetto.protos.TraceConfig.WriteFlushMode\x12\x42\n\x11\x66\x66lush_post_write\x18- \x01(\x0e\x32\'.perfetto.protos.TraceConfig.FFlushMode\x12\x1a\n\x12trace_all_machines\x18+ \x01(\x08\x12:\n\x10trace_attributes\x18\x30 \x01(\x0b\x32 .perfetto.protos.TraceAttributes\x1a\x94\x03\n\x0c\x42ufferConfig\x12\x0f\n\x07size_kb\x18\x01 \x01(\r\x12I\n\x0b\x66ill_policy\x18\x04 \x01(\x0e\x32\x34.perfetto.protos.TraceConfig.BufferConfig.FillPolicy\x12\x19\n\x11transfer_on_clone\x18\x05 \x01(\x08\x12\x1a\n\x12\x63lear_before_clone\x18\x06 \x01(\x08\x12\x0c\n\x04name\x18\x07 \x01(\t\x12U\n\x11\x65xperimental_mode\x18\x08 \x01(\x0e\x32:.perfetto.protos.TraceConfig.BufferConfig.ExperimentalMode\";\n\nFillPolicy\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0f\n\x0bRING_BUFFER\x10\x01\x12\x0b\n\x07\x44ISCARD\x10\x02\"C\n\x10\x45xperimentalMode\x12\x14\n\x10MODE_UNSPECIFIED\x10\x00\x12\x13\n\x0fTRACE_BUFFER_V2\x10\x01\"\x04\x08\x02\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04\x1a\x9e\x01\n\nDataSource\x12\x31\n\x06\x63onfig\x18\x01 \x01(\x0b\x32!.perfetto.protos.DataSourceConfig\x12\x1c\n\x14producer_name_filter\x18\x02 \x03(\t\x12\"\n\x1aproducer_name_regex_filter\x18\x03 \x03(\t\x12\x1b\n\x13machine_name_filter\x18\x04 \x03(\t\x1a\x90\x03\n\x11\x42uiltinDataSource\x12\"\n\x1a\x64isable_clock_snapshotting\x18\x01 \x01(\x08\x12\x1c\n\x14\x64isable_trace_config\x18\x02 \x01(\x08\x12\x1b\n\x13\x64isable_system_info\x18\x03 \x01(\x08\x12\x1e\n\x16\x64isable_service_events\x18\x04 \x01(\x08\x12:\n\x13primary_trace_clock\x18\x05 \x01(\x0e\x32\x1d.perfetto.protos.BuiltinClock\x12\x1c\n\x14snapshot_interval_ms\x18\x06 \x01(\r\x12)\n!prefer_suspend_clock_for_snapshot\x18\x07 \x01(\x08\x12&\n\x1e\x64isable_chunk_usage_histograms\x18\x08 \x01(\x08\x12%\n\x1d\x64isable_extension_descriptors\x18\t \x01(\x08\x12(\n enable_concurrent_session_events\x18\n \x01(\x08\x1aR\n\x0eProducerConfig\x12\x15\n\rproducer_name\x18\x01 \x01(\t\x12\x13\n\x0bshm_size_kb\x18\x02 \x01(\r\x12\x14\n\x0cpage_size_kb\x18\x03 \x01(\r\x1a\x8e\x01\n\x0eStatsdMetadata\x12\x1b\n\x13triggering_alert_id\x18\x01 \x01(\x03\x12\x1d\n\x15triggering_config_uid\x18\x02 \x01(\x05\x12\x1c\n\x14triggering_config_id\x18\x03 \x01(\x03\x12\"\n\x1atriggering_subscription_id\x18\x04 \x01(\x03\x1a^\n\x12GuardrailOverrides\x12$\n\x18max_upload_per_day_bytes\x18\x01 \x01(\x04\x42\x02\x18\x01\x12\"\n\x1amax_tracing_buffer_size_kb\x18\x02 \x01(\r\x1a\xca\x03\n\rTriggerConfig\x12L\n\x0ctrigger_mode\x18\x01 \x01(\x0e\x32\x36.perfetto.protos.TraceConfig.TriggerConfig.TriggerMode\x12\'\n\x1fuse_clone_snapshot_if_available\x18\x05 \x01(\x08\x12\x44\n\x08triggers\x18\x02 \x03(\x0b\x32\x32.perfetto.protos.TraceConfig.TriggerConfig.Trigger\x12\x1a\n\x12trigger_timeout_ms\x18\x03 \x01(\r\x1a{\n\x07Trigger\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x13producer_name_regex\x18\x02 \x01(\t\x12\x15\n\rstop_delay_ms\x18\x03 \x01(\r\x12\x14\n\x0cmax_per_24_h\x18\x04 \x01(\r\x12\x18\n\x10skip_probability\x18\x05 \x01(\x01\"]\n\x0bTriggerMode\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x11\n\rSTART_TRACING\x10\x01\x12\x10\n\x0cSTOP_TRACING\x10\x02\x12\x12\n\x0e\x43LONE_SNAPSHOT\x10\x04\"\x04\x08\x03\x10\x03J\x04\x08\x04\x10\x05\x1a\x31\n\x16IncrementalStateConfig\x12\x17\n\x0f\x63lear_period_ms\x18\x01 \x01(\r\x1a\xc1\x01\n\x11\x43ompressionConfig\x12G\n\x07\x64\x65\x66late\x18\x01 \x01(\x0b\x32\x36.perfetto.protos.TraceConfig.CompressionConfig.Deflate\x12\x41\n\x04zstd\x18\x02 \x01(\x0b\x32\x33.perfetto.protos.TraceConfig.CompressionConfig.Zstd\x1a\t\n\x07\x44\x65\x66late\x1a\x15\n\x04Zstd\x12\r\n\x05level\x18\x01 \x01(\x05\x1a\x97\x01\n\x14IncidentReportConfig\x12\x1b\n\x13\x64\x65stination_package\x18\x01 \x01(\t\x12\x19\n\x11\x64\x65stination_class\x18\x02 \x01(\t\x12\x15\n\rprivacy_level\x18\x03 \x01(\x05\x12\x16\n\x0eskip_incidentd\x18\x05 \x01(\x08\x12\x18\n\x0cskip_dropbox\x18\x04 \x01(\x08\x42\x02\x18\x01\x1a\x94\x06\n\x0bTraceFilter\x12\x10\n\x08\x62ytecode\x18\x01 \x01(\x0c\x12\x13\n\x0b\x62ytecode_v2\x18\x02 \x01(\x0c\x12W\n\x13string_filter_chain\x18\x03 \x01(\x0b\x32:.perfetto.protos.TraceConfig.TraceFilter.StringFilterChain\x12\x1c\n\x14\x62ytecode_overlay_v54\x18\x04 \x01(\x0c\x12[\n\x17string_filter_chain_v54\x18\x05 \x01(\x0b\x32:.perfetto.protos.TraceConfig.TraceFilter.StringFilterChain\x1a\xde\x01\n\x10StringFilterRule\x12K\n\x06policy\x18\x01 \x01(\x0e\x32;.perfetto.protos.TraceConfig.TraceFilter.StringFilterPolicy\x12\x15\n\rregex_pattern\x18\x02 \x01(\t\x12\"\n\x1a\x61trace_payload_starts_with\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x34\n\rsemantic_type\x18\x05 \x03(\x0e\x32\x1d.perfetto.protos.SemanticType\x1a]\n\x11StringFilterChain\x12H\n\x05rules\x18\x01 \x03(\x0b\x32\x39.perfetto.protos.TraceConfig.TraceFilter.StringFilterRule\"\xc9\x01\n\x12StringFilterPolicy\x12\x13\n\x0fSFP_UNSPECIFIED\x10\x00\x12\x1b\n\x17SFP_MATCH_REDACT_GROUPS\x10\x01\x12\"\n\x1eSFP_ATRACE_MATCH_REDACT_GROUPS\x10\x02\x12\x13\n\x0fSFP_MATCH_BREAK\x10\x03\x12\x1a\n\x16SFP_ATRACE_MATCH_BREAK\x10\x04\x12,\n(SFP_ATRACE_REPEATED_SEARCH_REDACT_GROUPS\x10\x05\x1a\x97\x01\n\x13\x41ndroidReportConfig\x12 \n\x18reporter_service_package\x18\x01 \x01(\t\x12\x1e\n\x16reporter_service_class\x18\x02 \x01(\t\x12\x13\n\x0bskip_report\x18\x03 \x01(\x08\x12)\n!use_pipe_in_framework_for_testing\x18\x04 \x01(\x08\x1a@\n\x12\x43mdTraceStartDelay\x12\x14\n\x0cmin_delay_ms\x18\x01 \x01(\r\x12\x14\n\x0cmax_delay_ms\x18\x02 \x01(\r\x1a\x41\n\x10SessionSemaphore\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1f\n\x17max_other_session_count\x18\x02 \x01(\x04\"U\n\x15LockdownModeOperation\x12\x16\n\x12LOCKDOWN_UNCHANGED\x10\x00\x12\x12\n\x0eLOCKDOWN_CLEAR\x10\x01\x12\x10\n\x0cLOCKDOWN_SET\x10\x02\"Q\n\x0f\x43ompressionType\x12 \n\x1c\x43OMPRESSION_TYPE_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43OMPRESSION_TYPE_DEFLATE\x10\x01\"h\n\rStatsdLogging\x12\x1e\n\x1aSTATSD_LOGGING_UNSPECIFIED\x10\x00\x12\x1a\n\x16STATSD_LOGGING_ENABLED\x10\x01\x12\x1b\n\x17STATSD_LOGGING_DISABLED\x10\x02\"v\n\x0eWriteFlushMode\x12\x1b\n\x17WRITE_FLUSH_UNSPECIFIED\x10\x00\x12\x14\n\x10WRITE_FLUSH_AUTO\x10\x01\x12\x18\n\x14WRITE_FLUSH_DISABLED\x10\x02\x12\x17\n\x13WRITE_FLUSH_ENABLED\x10\x03\"M\n\nFFlushMode\x12\x16\n\x12\x46\x46LUSH_UNSPECIFIED\x10\x00\x12\x13\n\x0f\x46\x46LUSH_DISABLED\x10\x01\x12\x12\n\x0e\x46\x46LUSH_ENABLED\x10\x02J\x04\x08\x0f\x10\x10J\x04\x08%\x10&J\x04\x08\x1a\x10\x1bJ\x04\x08 \x10!J\x04\x08*\x10+J\x04\x08.\x10/R\x05notes\"M\n\x07Utsname\x12\x0f\n\x07sysname\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x0f\n\x07release\x18\x03 \x01(\t\x12\x0f\n\x07machine\x18\x04 \x01(\t\"\xf2\x03\n\nSystemInfo\x12)\n\x07utsname\x18\x01 \x01(\x0b\x32\x18.perfetto.protos.Utsname\x12!\n\x19\x61ndroid_build_fingerprint\x18\x02 \x01(\t\x12#\n\x1b\x61ndroid_device_manufacturer\x18\x0e \x01(\t\x12\x19\n\x11\x61ndroid_soc_model\x18\t \x01(\t\x12\x1f\n\x17\x61ndroid_guest_soc_model\x18\r \x01(\t\x12!\n\x19\x61ndroid_hardware_revision\x18\n \x01(\t\x12\x1d\n\x15\x61ndroid_storage_model\x18\x0b \x01(\t\x12\x19\n\x11\x61ndroid_ram_model\x18\x0c \x01(\t\x12\x1e\n\x16\x61ndroid_serial_console\x18\x0f \x01(\t\x12\x1f\n\x17tracing_service_version\x18\x04 \x01(\t\x12\x1b\n\x13\x61ndroid_sdk_version\x18\x05 \x01(\x04\x12\x11\n\tpage_size\x18\x06 \x01(\r\x12\x10\n\x08num_cpus\x18\x08 \x01(\r\x12\x19\n\x11timezone_off_mins\x18\x07 \x01(\x05\x12\n\n\x02hz\x18\x03 \x01(\x03\x12\x18\n\x10system_ram_bytes\x18\x10 \x01(\x04\x12\x14\n\x0cmachine_name\x18\x11 \x01(\t\"\xb1\x0c\n\nTraceStats\x12=\n\x0c\x62uffer_stats\x18\x01 \x03(\x0b\x32\'.perfetto.protos.TraceStats.BufferStats\x12#\n\x1b\x63hunk_payload_histogram_def\x18\x11 \x03(\x03\x12=\n\x0cwriter_stats\x18\x12 \x03(\x0b\x32\'.perfetto.protos.TraceStats.WriterStats\x12\x1b\n\x13producers_connected\x18\x02 \x01(\r\x12\x16\n\x0eproducers_seen\x18\x03 \x01(\x04\x12\x1f\n\x17\x64\x61ta_sources_registered\x18\x04 \x01(\r\x12\x19\n\x11\x64\x61ta_sources_seen\x18\x05 \x01(\x04\x12\x18\n\x10tracing_sessions\x18\x06 \x01(\r\x12\x15\n\rtotal_buffers\x18\x07 \x01(\r\x12\x18\n\x10\x63hunks_discarded\x18\x08 \x01(\x04\x12\x19\n\x11patches_discarded\x18\t \x01(\x04\x12\x17\n\x0finvalid_packets\x18\n \x01(\x04\x12=\n\x0c\x66ilter_stats\x18\x0b \x01(\x0b\x32\'.perfetto.protos.TraceStats.FilterStats\x12\x19\n\x11\x66lushes_requested\x18\x0c \x01(\x04\x12\x19\n\x11\x66lushes_succeeded\x18\r \x01(\x04\x12\x16\n\x0e\x66lushes_failed\x18\x0e \x01(\x04\x12J\n\x13\x66inal_flush_outcome\x18\x0f \x01(\x0e\x32-.perfetto.protos.TraceStats.FinalFlushOutcome\x1a\xaa\x04\n\x0b\x42ufferStats\x12\x13\n\x0b\x62uffer_size\x18\x0c \x01(\x04\x12\x15\n\rbytes_written\x18\x01 \x01(\x04\x12\x19\n\x11\x62ytes_overwritten\x18\r \x01(\x04\x12\x12\n\nbytes_read\x18\x0e \x01(\x04\x12\x1d\n\x15padding_bytes_written\x18\x0f \x01(\x04\x12\x1d\n\x15padding_bytes_cleared\x18\x10 \x01(\x04\x12\x16\n\x0e\x63hunks_written\x18\x02 \x01(\x04\x12\x18\n\x10\x63hunks_rewritten\x18\n \x01(\x04\x12\x18\n\x10\x63hunks_relocated\x18\x14 \x01(\x04\x12\x1a\n\x12\x63hunks_overwritten\x18\x03 \x01(\x04\x12\x18\n\x10\x63hunks_discarded\x18\x12 \x01(\x04\x12\x13\n\x0b\x63hunks_read\x18\x11 \x01(\x04\x12%\n\x1d\x63hunks_committed_out_of_order\x18\x0b \x01(\x04\x12\x18\n\x10write_wrap_count\x18\x04 \x01(\x04\x12\x19\n\x11patches_succeeded\x18\x05 \x01(\x04\x12\x16\n\x0epatches_failed\x18\x06 \x01(\x04\x12\x1c\n\x14readaheads_succeeded\x18\x07 \x01(\x04\x12\x19\n\x11readaheads_failed\x18\x08 \x01(\x04\x12\x16\n\x0e\x61\x62i_violations\x18\t \x01(\x04\x12 \n\x18trace_writer_packet_loss\x18\x13 \x01(\x04J\x04\x08\x15\x10\x16\x1a\x87\x01\n\x0bWriterStats\x12\x13\n\x0bsequence_id\x18\x01 \x01(\x04\x12\x0e\n\x06\x62uffer\x18\x04 \x01(\r\x12*\n\x1e\x63hunk_payload_histogram_counts\x18\x02 \x03(\x04\x42\x02\x10\x01\x12\'\n\x1b\x63hunk_payload_histogram_sum\x18\x03 \x03(\x03\x42\x02\x10\x01\x1a\x9a\x01\n\x0b\x46ilterStats\x12\x15\n\rinput_packets\x18\x01 \x01(\x04\x12\x13\n\x0binput_bytes\x18\x02 \x01(\x04\x12\x14\n\x0coutput_bytes\x18\x03 \x01(\x04\x12\x0e\n\x06\x65rrors\x18\x04 \x01(\x04\x12\x15\n\rtime_taken_ns\x18\x05 \x01(\x04\x12\"\n\x1a\x62ytes_discarded_per_buffer\x18\x14 \x03(\x04\"c\n\x11\x46inalFlushOutcome\x12\x1b\n\x17\x46INAL_FLUSH_UNSPECIFIED\x10\x00\x12\x19\n\x15\x46INAL_FLUSH_SUCCEEDED\x10\x01\x12\x16\n\x12\x46INAL_FLUSH_FAILED\x10\x02\"\xd6\x07\n\rAndroidAflags\x12\x32\n\x05\x66lags\x18\x01 \x03(\x0b\x32#.perfetto.protos.AndroidAflags.Flag\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x1a\x82\x03\n\x04\x46lag\x12\x16\n\x0e\x66lag_namespace\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0b\n\x03pkg\x18\x03 \x01(\t\x12\x11\n\tcontainer\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\t\x12\x14\n\x0cstaged_value\x18\x06 \x01(\t\x12\x41\n\npermission\x18\x07 \x01(\x0e\x32-.perfetto.protos.AndroidAflags.FlagPermission\x12I\n\x11value_picked_from\x18\x08 \x01(\x0e\x32..perfetto.protos.AndroidAflags.ValuePickedFrom\x12J\n\x0fstorage_backend\x18\t \x01(\x0e\x32\x31.perfetto.protos.AndroidAflags.FlagStorageBackend\x12\x35\n\x04type\x18\n \x01(\x0e\x32\'.perfetto.protos.AndroidAflags.FlagType\"p\n\x0e\x46lagPermission\x12\x1f\n\x1b\x46LAG_PERMISSION_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x46LAG_PERMISSION_READ_ONLY\x10\x01\x12\x1e\n\x1a\x46LAG_PERMISSION_READ_WRITE\x10\x02\"\x8e\x01\n\x0fValuePickedFrom\x12!\n\x1dVALUE_PICKED_FROM_UNSPECIFIED\x10\x00\x12\x1d\n\x19VALUE_PICKED_FROM_DEFAULT\x10\x01\x12\x1c\n\x18VALUE_PICKED_FROM_SERVER\x10\x02\x12\x1b\n\x17VALUE_PICKED_FROM_LOCAL\x10\x03\"\xa4\x01\n\x12\x46lagStorageBackend\x12$\n FLAG_STORAGE_BACKEND_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x46LAG_STORAGE_BACKEND_NONE\x10\x01\x12!\n\x1d\x46LAG_STORAGE_BACKEND_ACONFIGD\x10\x02\x12&\n\"FLAG_STORAGE_BACKEND_DEVICE_CONFIG\x10\x03\"S\n\x08\x46lagType\x12\x19\n\x15\x46LAG_TYPE_UNSPECIFIED\x10\x00\x12\x15\n\x11\x46LAG_TYPE_BOOLEAN\x10\x01\x12\x15\n\x11\x46LAG_TYPE_INTEGER\x10\x02\"\x8f\x03\n\x1b\x41ndroidGameInterventionList\x12S\n\rgame_packages\x18\x01 \x03(\x0b\x32<.perfetto.protos.AndroidGameInterventionList.GamePackageInfo\x12\x13\n\x0bparse_error\x18\x02 \x01(\x08\x12\x12\n\nread_error\x18\x03 \x01(\x08\x1aZ\n\x0cGameModeInfo\x12\x0c\n\x04mode\x18\x01 \x01(\r\x12\x11\n\tuse_angle\x18\x02 \x01(\x08\x12\x1c\n\x14resolution_downscale\x18\x03 \x01(\x02\x12\x0b\n\x03\x66ps\x18\x04 \x01(\x02\x1a\x95\x01\n\x0fGamePackageInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03uid\x18\x02 \x01(\x04\x12\x14\n\x0c\x63urrent_mode\x18\x03 \x01(\r\x12Q\n\x0egame_mode_info\x18\x04 \x03(\x0b\x32\x39.perfetto.protos.AndroidGameInterventionList.GameModeInfo\"\xb2\x04\n\x10\x41ndroidLogPacket\x12:\n\x06\x65vents\x18\x01 \x03(\x0b\x32*.perfetto.protos.AndroidLogPacket.LogEvent\x12\x36\n\x05stats\x18\x02 \x01(\x0b\x32\'.perfetto.protos.AndroidLogPacket.Stats\x1a\xe4\x02\n\x08LogEvent\x12-\n\x06log_id\x18\x01 \x01(\x0e\x32\x1d.perfetto.protos.AndroidLogId\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0b\n\x03tid\x18\x03 \x01(\x05\x12\x0b\n\x03uid\x18\x04 \x01(\x05\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12\x0b\n\x03tag\x18\x06 \x01(\t\x12\x31\n\x04prio\x18\x07 \x01(\x0e\x32#.perfetto.protos.AndroidLogPriority\x12\x0f\n\x07message\x18\x08 \x01(\t\x12<\n\x04\x61rgs\x18\t \x03(\x0b\x32..perfetto.protos.AndroidLogPacket.LogEvent.Arg\x1a`\n\x03\x41rg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\tint_value\x18\x02 \x01(\x03H\x00\x12\x15\n\x0b\x66loat_value\x18\x03 \x01(\x02H\x00\x12\x16\n\x0cstring_value\x18\x04 \x01(\tH\x00\x42\x07\n\x05value\x1a\x43\n\x05Stats\x12\x11\n\tnum_total\x18\x01 \x01(\x04\x12\x12\n\nnum_failed\x18\x02 \x01(\x04\x12\x13\n\x0bnum_skipped\x18\x03 \x01(\x04\"\x8b\x01\n\x15\x41ndroidSystemProperty\x12\x44\n\x06values\x18\x01 \x03(\x0b\x32\x34.perfetto.protos.AndroidSystemProperty.PropertyValue\x1a,\n\rPropertyValue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"R\n\rCpuPerUidData\x12\x15\n\rcluster_count\x18\x01 \x01(\r\x12\x0f\n\x03uid\x18\x02 \x03(\rB\x02\x10\x01\x12\x19\n\rtotal_time_ms\x18\x03 \x03(\x04\x42\x02\x10\x01\"\xf1\x03\n\x12GraphicsFrameEvent\x12\x45\n\x0c\x62uffer_event\x18\x01 \x01(\x0b\x32/.perfetto.protos.GraphicsFrameEvent.BufferEvent\x1a\xa2\x01\n\x0b\x42ufferEvent\x12\x14\n\x0c\x66rame_number\x18\x01 \x01(\r\x12\x41\n\x04type\x18\x02 \x01(\x0e\x32\x33.perfetto.protos.GraphicsFrameEvent.BufferEventType\x12\x12\n\nlayer_name\x18\x03 \x01(\t\x12\x13\n\x0b\x64uration_ns\x18\x04 \x01(\x04\x12\x11\n\tbuffer_id\x18\x05 \x01(\r\"\xee\x01\n\x0f\x42ufferEventType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0b\n\x07\x44\x45QUEUE\x10\x01\x12\t\n\x05QUEUE\x10\x02\x12\x08\n\x04POST\x10\x03\x12\x11\n\rACQUIRE_FENCE\x10\x04\x12\t\n\x05LATCH\x10\x05\x12\x1a\n\x16HWC_COMPOSITION_QUEUED\x10\x06\x12\x18\n\x14\x46\x41LLBACK_COMPOSITION\x10\x07\x12\x11\n\rPRESENT_FENCE\x10\x08\x12\x11\n\rRELEASE_FENCE\x10\t\x12\n\n\x06MODIFY\x10\n\x12\n\n\x06\x44\x45TACH\x10\x0b\x12\n\n\x06\x41TTACH\x10\x0c\x12\n\n\x06\x43\x41NCEL\x10\r\"@\n\x13InitialDisplayState\x12\x15\n\rdisplay_state\x18\x01 \x01(\x05\x12\x12\n\nbrightness\x18\x02 \x01(\x01\"\xfa\x02\n\x12KernelWakelockData\x12>\n\x08wakelock\x18\x01 \x03(\x0b\x32,.perfetto.protos.KernelWakelockData.Wakelock\x12\x17\n\x0bwakelock_id\x18\x02 \x03(\rB\x02\x10\x01\x12\x1c\n\x10time_held_millis\x18\x03 \x03(\x04\x42\x02\x10\x01\x12\x13\n\x0b\x65rror_flags\x18\x04 \x01(\x04\x1a\xd7\x01\n\x08Wakelock\x12\x13\n\x0bwakelock_id\x18\x01 \x01(\r\x12\x15\n\rwakelock_name\x18\x02 \x01(\t\x12H\n\rwakelock_type\x18\x03 \x01(\x0e\x32\x31.perfetto.protos.KernelWakelockData.Wakelock.Type\"U\n\x04Type\x12\x19\n\x15WAKELOCK_TYPE_UNKNOWN\x10\x00\x12\x18\n\x14WAKELOCK_TYPE_KERNEL\x10\x01\x12\x18\n\x14WAKELOCK_TYPE_NATIVE\x10\x02\"\xe8\x01\n\x0cPackagesList\x12;\n\x08packages\x18\x01 \x03(\x0b\x32).perfetto.protos.PackagesList.PackageInfo\x12\x13\n\x0bparse_error\x18\x02 \x01(\x08\x12\x12\n\nread_error\x18\x03 \x01(\x08\x1ar\n\x0bPackageInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03uid\x18\x02 \x01(\x04\x12\x12\n\ndebuggable\x18\x03 \x01(\x08\x12\x1e\n\x16profileable_from_shell\x18\x04 \x01(\x08\x12\x14\n\x0cversion_code\x18\x05 \x01(\x03\"<\n\x10PixelModemEvents\x12\x0e\n\x06\x65vents\x18\x01 \x03(\x0c\x12\x18\n\x10\x65vent_time_nanos\x18\x02 \x03(\x04\"+\n\x17PixelModemTokenDatabase\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\x0c\"\x81\x01\n\x0f\x41ndroidUserList\x12\x38\n\x05users\x18\x01 \x03(\x0b\x32).perfetto.protos.AndroidUserList.UserInfo\x12\r\n\x05\x65rror\x18\x02 \x01(\x05\x1a%\n\x08UserInfo\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0b\n\x03uid\x18\x02 \x01(\x05\"\xf2\x01\n\x17\x43hromeBenchmarkMetadata\x12\x1f\n\x17\x62\x65nchmark_start_time_us\x18\x01 \x01(\x03\x12\x19\n\x11story_run_time_us\x18\x02 \x01(\x03\x12\x16\n\x0e\x62\x65nchmark_name\x18\x03 \x01(\t\x12\x1d\n\x15\x62\x65nchmark_description\x18\x04 \x01(\t\x12\r\n\x05label\x18\x05 \x01(\t\x12\x12\n\nstory_name\x18\x06 \x01(\t\x12\x12\n\nstory_tags\x18\x07 \x03(\t\x12\x17\n\x0fstory_run_index\x18\x08 \x01(\x05\x12\x14\n\x0chad_failures\x18\t \x01(\x08\"\xe8\x02\n\x14\x43hromeMetadataPacket\x12O\n\x1b\x62\x61\x63kground_tracing_metadata\x18\x01 \x01(\x0b\x32*.perfetto.protos.BackgroundTracingMetadata\x12\x1b\n\x13\x63hrome_version_code\x18\x02 \x01(\x05\x12\x1a\n\x12\x65nabled_categories\x18\x03 \x01(\t\x12K\n\x12\x66ield_trial_hashes\x18\x04 \x03(\x0b\x32/.perfetto.protos.ChromeMetadataPacket.FinchHash\x12\x18\n\x10\x61pp_package_name\x18\x05 \x01(\t\x12\x13\n\x0b\x61pp_version\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x0f\n\x07os_name\x18\x08 \x01(\t\x1a(\n\tFinchHash\x12\x0c\n\x04name\x18\x01 \x01(\r\x12\r\n\x05group\x18\x02 \x01(\r\"\x95\x08\n\x19\x42\x61\x63kgroundTracingMetadata\x12N\n\x0etriggered_rule\x18\x01 \x01(\x0b\x32\x36.perfetto.protos.BackgroundTracingMetadata.TriggerRule\x12L\n\x0c\x61\x63tive_rules\x18\x02 \x03(\x0b\x32\x36.perfetto.protos.BackgroundTracingMetadata.TriggerRule\x12\x1a\n\x12scenario_name_hash\x18\x03 \x01(\x07\x1a\xbd\x06\n\x0bTriggerRule\x12X\n\x0ctrigger_type\x18\x01 \x01(\x0e\x32\x42.perfetto.protos.BackgroundTracingMetadata.TriggerRule.TriggerType\x12\\\n\x0ehistogram_rule\x18\x02 \x01(\x0b\x32\x44.perfetto.protos.BackgroundTracingMetadata.TriggerRule.HistogramRule\x12T\n\nnamed_rule\x18\x03 \x01(\x0b\x32@.perfetto.protos.BackgroundTracingMetadata.TriggerRule.NamedRule\x12\x11\n\tname_hash\x18\x04 \x01(\x07\x1aj\n\rHistogramRule\x12\x1b\n\x13histogram_name_hash\x18\x01 \x01(\x06\x12\x1d\n\x15histogram_min_trigger\x18\x02 \x01(\x03\x12\x1d\n\x15histogram_max_trigger\x18\x03 \x01(\x03\x1a\x96\x02\n\tNamedRule\x12^\n\nevent_type\x18\x01 \x01(\x0e\x32J.perfetto.protos.BackgroundTracingMetadata.TriggerRule.NamedRule.EventType\x12!\n\x19\x63ontent_trigger_name_hash\x18\x02 \x01(\x06\"\x85\x01\n\tEventType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x13\n\x0fSESSION_RESTORE\x10\x01\x12\x0e\n\nNAVIGATION\x10\x02\x12\x0b\n\x07STARTUP\x10\x03\x12\x10\n\x0cREACHED_CODE\x10\x04\x12\x13\n\x0f\x43ONTENT_TRIGGER\x10\x05\x12\x0e\n\tTEST_RULE\x10\xe8\x07\"\x87\x01\n\x0bTriggerType\x12\x17\n\x13TRIGGER_UNSPECIFIED\x10\x00\x12\x36\n2MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE\x10\x01\x12\'\n#MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED\x10\x02\"\xd3\x02\n\x11\x43hromeTracedValue\x12\x42\n\x0bnested_type\x18\x01 \x01(\x0e\x32-.perfetto.protos.ChromeTracedValue.NestedType\x12\x11\n\tdict_keys\x18\x02 \x03(\t\x12\x37\n\x0b\x64ict_values\x18\x03 \x03(\x0b\x32\".perfetto.protos.ChromeTracedValue\x12\x38\n\x0c\x61rray_values\x18\x04 \x03(\x0b\x32\".perfetto.protos.ChromeTracedValue\x12\x11\n\tint_value\x18\x05 \x01(\x05\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x12\n\nbool_value\x18\x07 \x01(\x08\x12\x14\n\x0cstring_value\x18\x08 \x01(\t\"!\n\nNestedType\x12\x08\n\x04\x44ICT\x10\x00\x12\t\n\x05\x41RRAY\x10\x01\"6\n\x16\x43hromeStringTableEntry\x12\r\n\x05value\x18\x01 \x01(\t\x12\r\n\x05index\x18\x02 \x01(\x05\"\x81\x05\n\x10\x43hromeTraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x03\x12\r\n\x05phase\x18\x03 \x01(\x05\x12\x11\n\tthread_id\x18\x04 \x01(\x05\x12\x10\n\x08\x64uration\x18\x05 \x01(\x03\x12\x17\n\x0fthread_duration\x18\x06 \x01(\x03\x12\r\n\x05scope\x18\x07 \x01(\t\x12\n\n\x02id\x18\x08 \x01(\x04\x12\r\n\x05\x66lags\x18\t \x01(\r\x12\x1b\n\x13\x63\x61tegory_group_name\x18\n \x01(\t\x12\x12\n\nprocess_id\x18\x0b \x01(\x05\x12\x18\n\x10thread_timestamp\x18\x0c \x01(\x03\x12\x0f\n\x07\x62ind_id\x18\r \x01(\x04\x12\x33\n\x04\x61rgs\x18\x0e \x03(\x0b\x32%.perfetto.protos.ChromeTraceEvent.Arg\x12\x12\n\nname_index\x18\x0f \x01(\r\x12!\n\x19\x63\x61tegory_group_name_index\x18\x10 \x01(\r\x1a\x8c\x02\n\x03\x41rg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\nbool_value\x18\x02 \x01(\x08H\x00\x12\x14\n\nuint_value\x18\x03 \x01(\x04H\x00\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x00\x12\x16\n\x0c\x64ouble_value\x18\x05 \x01(\x01H\x00\x12\x16\n\x0cstring_value\x18\x06 \x01(\tH\x00\x12\x17\n\rpointer_value\x18\x07 \x01(\x04H\x00\x12\x14\n\njson_value\x18\x08 \x01(\tH\x00\x12:\n\x0ctraced_value\x18\n \x01(\x0b\x32\".perfetto.protos.ChromeTracedValueH\x00\x12\x12\n\nname_index\x18\t \x01(\rB\x07\n\x05value\"\x80\x01\n\x0e\x43hromeMetadata\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x14\n\nbool_value\x18\x03 \x01(\x08H\x00\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x00\x12\x14\n\njson_value\x18\x05 \x01(\tH\x00\x42\x07\n\x05value\"\x94\x01\n\x15\x43hromeLegacyJsonTrace\x12>\n\x04type\x18\x01 \x01(\x0e\x32\x30.perfetto.protos.ChromeLegacyJsonTrace.TraceType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"-\n\tTraceType\x12\x0e\n\nUSER_TRACE\x10\x00\x12\x10\n\x0cSYSTEM_TRACE\x10\x01\"\xa7\x02\n\x11\x43hromeEventBundle\x12;\n\x0ctrace_events\x18\x01 \x03(\x0b\x32!.perfetto.protos.ChromeTraceEventB\x02\x18\x01\x12\x31\n\x08metadata\x18\x02 \x03(\x0b\x32\x1f.perfetto.protos.ChromeMetadata\x12\x1c\n\x14legacy_ftrace_output\x18\x04 \x03(\t\x12\x41\n\x11legacy_json_trace\x18\x05 \x03(\x0b\x32&.perfetto.protos.ChromeLegacyJsonTrace\x12\x41\n\x0cstring_table\x18\x03 \x03(\x0b\x32\'.perfetto.protos.ChromeStringTableEntryB\x02\x18\x01\"Q\n\rChromeTrigger\x12\x14\n\x0ctrigger_name\x18\x01 \x01(\t\x12\x19\n\x11trigger_name_hash\x18\x02 \x01(\x07\x12\x0f\n\x07\x66low_id\x18\x03 \x01(\x06\"V\n\x08V8String\x12\x10\n\x06latin1\x18\x01 \x01(\x0cH\x00\x12\x12\n\x08utf16_le\x18\x02 \x01(\x0cH\x00\x12\x12\n\x08utf16_be\x18\x03 \x01(\x0cH\x00\x42\x10\n\x0e\x65ncoded_string\"k\n\x10InternedV8String\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x10\n\x06latin1\x18\x02 \x01(\x0cH\x00\x12\x12\n\x08utf16_le\x18\x03 \x01(\x0cH\x00\x12\x12\n\x08utf16_be\x18\x04 \x01(\x0cH\x00\x42\x10\n\x0e\x65ncoded_string\"\xc5\x02\n\x12InternedV8JsScript\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x11\n\tscript_id\x18\x02 \x01(\x05\x12\x36\n\x04type\x18\x03 \x01(\x0e\x32(.perfetto.protos.InternedV8JsScript.Type\x12\'\n\x04name\x18\x04 \x01(\x0b\x32\x19.perfetto.protos.V8String\x12)\n\x06source\x18\x05 \x01(\x0b\x32\x19.perfetto.protos.V8String\"\x82\x01\n\x04Type\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\x0f\n\x0bTYPE_NORMAL\x10\x01\x12\r\n\tTYPE_EVAL\x10\x02\x12\x0f\n\x0bTYPE_MODULE\x10\x03\x12\x0f\n\x0bTYPE_NATIVE\x10\x04\x12\x12\n\x0eTYPE_EXTENSION\x10\x05\x12\x12\n\x0eTYPE_INSPECTOR\x10\x06\"W\n\x14InternedV8WasmScript\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x11\n\tscript_id\x18\x02 \x01(\x05\x12\x0b\n\x03url\x18\x03 \x01(\t\x12\x12\n\nwire_bytes\x18\x04 \x01(\x0c\"\xd5\x08\n\x14InternedV8JsFunction\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x1f\n\x17v8_js_function_name_iid\x18\x02 \x01(\x04\x12\x18\n\x10v8_js_script_iid\x18\x03 \x01(\x04\x12\x13\n\x0bis_toplevel\x18\x04 \x01(\x08\x12\x38\n\x04kind\x18\x05 \x01(\x0e\x32*.perfetto.protos.InternedV8JsFunction.Kind\x12\x13\n\x0b\x62yte_offset\x18\x06 \x01(\r\x12\x0c\n\x04line\x18\x07 \x01(\r\x12\x0e\n\x06\x63olumn\x18\x08 \x01(\r\"\xf2\x06\n\x04Kind\x12\x10\n\x0cKIND_UNKNOWN\x10\x00\x12\x18\n\x14KIND_NORMAL_FUNCTION\x10\x01\x12\x0f\n\x0bKIND_MODULE\x10\x02\x12\x15\n\x11KIND_ASYNC_MODULE\x10\x03\x12\x19\n\x15KIND_BASE_CONSTRUCTOR\x10\x04\x12!\n\x1dKIND_DEFAULT_BASE_CONSTRUCTOR\x10\x05\x12$\n KIND_DEFAULT_DERIVED_CONSTRUCTOR\x10\x06\x12\x1c\n\x18KIND_DERIVED_CONSTRUCTOR\x10\x07\x12\x18\n\x14KIND_GETTER_FUNCTION\x10\x08\x12\x1f\n\x1bKIND_STATIC_GETTER_FUNCTION\x10\t\x12\x18\n\x14KIND_SETTER_FUNCTION\x10\n\x12\x1f\n\x1bKIND_STATIC_SETTER_FUNCTION\x10\x0b\x12\x17\n\x13KIND_ARROW_FUNCTION\x10\x0c\x12\x1d\n\x19KIND_ASYNC_ARROW_FUNCTION\x10\r\x12\x17\n\x13KIND_ASYNC_FUNCTION\x10\x0e\x12\x1d\n\x19KIND_ASYNC_CONCISE_METHOD\x10\x0f\x12$\n KIND_STATIC_ASYNC_CONCISE_METHOD\x10\x10\x12\'\n#KIND_ASYNC_CONCISE_GENERATOR_METHOD\x10\x11\x12.\n*KIND_STATIC_ASYNC_CONCISE_GENERATOR_METHOD\x10\x12\x12!\n\x1dKIND_ASYNC_GENERATOR_FUNCTION\x10\x13\x12\x1b\n\x17KIND_GENERATOR_FUNCTION\x10\x14\x12!\n\x1dKIND_CONCISE_GENERATOR_METHOD\x10\x15\x12(\n$KIND_STATIC_CONCISE_GENERATOR_METHOD\x10\x16\x12\x17\n\x13KIND_CONCISE_METHOD\x10\x17\x12\x1e\n\x1aKIND_STATIC_CONCISE_METHOD\x10\x18\x12+\n\'KIND_CLASS_MEMBERS_INITIALIZER_FUNCTION\x10\x19\x12*\n&KIND_CLASS_STATIC_INITIALIZER_FUNCTION\x10\x1a\x12\x10\n\x0cKIND_INVALID\x10\x1b\"\xc7\x02\n\x11InternedV8Isolate\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x12\n\nisolate_id\x18\x03 \x01(\x05\x12@\n\ncode_range\x18\x04 \x01(\x0b\x32,.perfetto.protos.InternedV8Isolate.CodeRange\x12(\n embedded_blob_code_start_address\x18\x05 \x01(\x04\x12\x1f\n\x17\x65mbedded_blob_code_size\x18\x06 \x01(\x04\x1aw\n\tCodeRange\x12\x14\n\x0c\x62\x61se_address\x18\x01 \x01(\x04\x12\x0c\n\x04size\x18\x02 \x01(\x04\x12-\n%embedded_blob_code_copy_start_address\x18\x03 \x01(\x04\x12\x17\n\x0fis_process_wide\x18\x04 \x01(\x08\"\xd8\x03\n\x08V8JsCode\x12\x16\n\x0ev8_isolate_iid\x18\x01 \x01(\x04\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12\x1a\n\x12v8_js_function_iid\x18\x03 \x01(\x04\x12,\n\x04tier\x18\x04 \x01(\x0e\x32\x1e.perfetto.protos.V8JsCode.Tier\x12\x19\n\x11instruction_start\x18\x05 \x01(\x04\x12\x1e\n\x16instruction_size_bytes\x18\x06 \x01(\x04\x12\x16\n\x0cmachine_code\x18\x07 \x01(\x0cH\x00\x12\x12\n\x08\x62ytecode\x18\x08 \x01(\x0cH\x00\x12\x1a\n\x10source_positions\x18\t \x01(\x0cH\x01\x12\x1c\n\x12\x62ytecode_positions\x18\n \x01(\x0cH\x01\x12$\n\x1ainlined_bytecode_positions\x18\x0b \x01(\x0cH\x01\"x\n\x04Tier\x12\x10\n\x0cTIER_UNKNOWN\x10\x00\x12\x11\n\rTIER_IGNITION\x10\x01\x12\x12\n\x0eTIER_SPARKPLUG\x10\x02\x12\x0f\n\x0bTIER_MAGLEV\x10\x03\x12\x13\n\x0fTIER_TURBOSHAFT\x10\x04\x12\x11\n\rTIER_TURBOFAN\x10\x05\x42\x0e\n\x0cinstructionsB\x0c\n\nsource_map\"\xe1\x03\n\x0eV8InternalCode\x12\x16\n\x0ev8_isolate_iid\x18\x01 \x01(\x04\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x32\n\x04type\x18\x04 \x01(\x0e\x32$.perfetto.protos.V8InternalCode.Type\x12\x12\n\nbuiltin_id\x18\x05 \x01(\x05\x12\x19\n\x11instruction_start\x18\x06 \x01(\x04\x12\x1e\n\x16instruction_size_bytes\x18\x07 \x01(\x04\x12\x14\n\x0cmachine_code\x18\x08 \x01(\x0c\"\x82\x02\n\x04Type\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\x19\n\x15TYPE_BYTECODE_HANDLER\x10\x01\x12\x14\n\x10TYPE_FOR_TESTING\x10\x02\x12\x10\n\x0cTYPE_BUILTIN\x10\x03\x12\x16\n\x12TYPE_WASM_FUNCTION\x10\x04\x12\x1e\n\x1aTYPE_WASM_TO_CAPI_FUNCTION\x10\x05\x12\x1c\n\x18TYPE_WASM_TO_JS_FUNCTION\x10\x06\x12\x1c\n\x18TYPE_JS_TO_WASM_FUNCTION\x10\x07\x12\x1a\n\x16TYPE_JS_TO_JS_FUNCTION\x10\x08\x12\x15\n\x11TYPE_C_WASM_ENTRY\x10\t\"\xc3\x02\n\nV8WasmCode\x12\x16\n\x0ev8_isolate_iid\x18\x01 \x01(\x04\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12\x1a\n\x12v8_wasm_script_iid\x18\x03 \x01(\x04\x12\x15\n\rfunction_name\x18\x04 \x01(\t\x12.\n\x04tier\x18\x05 \x01(\x0e\x32 .perfetto.protos.V8WasmCode.Tier\x12\x1d\n\x15\x63ode_offset_in_module\x18\x06 \x01(\x05\x12\x19\n\x11instruction_start\x18\x07 \x01(\x04\x12\x1e\n\x16instruction_size_bytes\x18\x08 \x01(\x04\x12\x14\n\x0cmachine_code\x18\t \x01(\x0c\"=\n\x04Tier\x12\x10\n\x0cTIER_UNKNOWN\x10\x00\x12\x10\n\x0cTIER_LIFTOFF\x10\x01\x12\x11\n\rTIER_TURBOFAN\x10\x02\"\xb0\x01\n\x0cV8RegExpCode\x12\x16\n\x0ev8_isolate_iid\x18\x01 \x01(\x04\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12*\n\x07pattern\x18\x03 \x01(\x0b\x32\x19.perfetto.protos.V8String\x12\x19\n\x11instruction_start\x18\x04 \x01(\x04\x12\x1e\n\x16instruction_size_bytes\x18\x05 \x01(\x04\x12\x14\n\x0cmachine_code\x18\x06 \x01(\x0c\"\xe1\x01\n\nV8CodeMove\x12\x13\n\x0bisolate_iid\x18\x01 \x01(\x04\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12&\n\x1e\x66rom_instruction_start_address\x18\x03 \x01(\x04\x12$\n\x1cto_instruction_start_address\x18\x04 \x01(\x04\x12\x1e\n\x16instruction_size_bytes\x18\x05 \x01(\x04\x12\x19\n\x0fto_machine_code\x18\x06 \x01(\x0cH\x00\x12\x15\n\x0bto_bytecode\x18\x07 \x01(\x0cH\x00\x42\x11\n\x0fto_instructions\"\x1d\n\x0eV8CodeDefaults\x12\x0b\n\x03tid\x18\x01 \x01(\r\"\x92\x03\n\rClockSnapshot\x12\x34\n\x06\x63locks\x18\x01 \x03(\x0b\x32$.perfetto.protos.ClockSnapshot.Clock\x12:\n\x13primary_trace_clock\x18\x02 \x01(\x0e\x32\x1d.perfetto.protos.BuiltinClock\x1a\x8e\x02\n\x05\x43lock\x12\x10\n\x08\x63lock_id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x16\n\x0eis_incremental\x18\x03 \x01(\x08\x12\x1a\n\x12unit_multiplier_ns\x18\x04 \x01(\x04\"\xab\x01\n\rBuiltinClocks\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0c\n\x08REALTIME\x10\x01\x12\x13\n\x0fREALTIME_COARSE\x10\x02\x12\r\n\tMONOTONIC\x10\x03\x12\x14\n\x10MONOTONIC_COARSE\x10\x04\x12\x11\n\rMONOTONIC_RAW\x10\x05\x12\x0c\n\x08\x42OOTTIME\x10\x06\x12\x18\n\x14\x42UILTIN_CLOCK_MAX_ID\x10?\"\x04\x08\x07\x10\x07\"\x04\x08\x08\x10\x08\"\xd2\x0c\n\x0f\x43SwitchEtwEvent\x12\x15\n\rnew_thread_id\x18\x01 \x01(\r\x12\x15\n\rold_thread_id\x18\x02 \x01(\r\x12\x1b\n\x13new_thread_priority\x18\x03 \x01(\x11\x12\x1b\n\x13old_thread_priority\x18\x04 \x01(\x11\x12\x18\n\x10previous_c_state\x18\x05 \x01(\r\x12V\n\x16old_thread_wait_reason\x18\x06 \x01(\x0e\x32\x34.perfetto.protos.CSwitchEtwEvent.OldThreadWaitReasonH\x00\x12$\n\x1aold_thread_wait_reason_int\x18\x0b \x01(\x05H\x00\x12R\n\x14old_thread_wait_mode\x18\x07 \x01(\x0e\x32\x32.perfetto.protos.CSwitchEtwEvent.OldThreadWaitModeH\x01\x12\"\n\x18old_thread_wait_mode_int\x18\x0c \x01(\x05H\x01\x12K\n\x10old_thread_state\x18\x08 \x01(\x0e\x32/.perfetto.protos.CSwitchEtwEvent.OldThreadStateH\x02\x12\x1e\n\x14old_thread_state_int\x18\r \x01(\x11H\x02\x12\'\n\x1fold_thread_wait_ideal_processor\x18\t \x01(\x11\x12\x1c\n\x14new_thread_wait_time\x18\n \x01(\r\"\xe9\x05\n\x13OldThreadWaitReason\x12\r\n\tEXECUTIVE\x10\x00\x12\r\n\tFREE_PAGE\x10\x01\x12\x0b\n\x07PAGE_IN\x10\x02\x12\x13\n\x0fPOOL_ALLOCATION\x10\x03\x12\x13\n\x0f\x44\x45LAY_EXECUTION\x10\x04\x12\x0b\n\x07SUSPEND\x10\x05\x12\x10\n\x0cUSER_REQUEST\x10\x06\x12\x10\n\x0cWR_EXECUTIVE\x10\x07\x12\x10\n\x0cWR_FREE_PAGE\x10\x08\x12\x0e\n\nWR_PAGE_IN\x10\t\x12\x16\n\x12WR_POOL_ALLOCATION\x10\n\x12\x16\n\x12WR_DELAY_EXECUTION\x10\x0b\x12\x10\n\x0cWR_SUSPENDED\x10\x0c\x12\x13\n\x0fWR_USER_REQUEST\x10\r\x12\x11\n\rWR_EVENT_PAIR\x10\x0e\x12\x0c\n\x08WR_QUEUE\x10\x0f\x12\x13\n\x0fWR_LPC_RECEIVER\x10\x10\x12\x10\n\x0cWR_LPC_REPLY\x10\x11\x12\x15\n\x11WR_VIRTUAL_MEMORY\x10\x12\x12\x0f\n\x0bWR_PAGE_OUT\x10\x13\x12\x12\n\x0eWR_RENDEZ_VOUS\x10\x14\x12\x12\n\x0eWR_KEYED_EVENT\x10\x15\x12\x11\n\rWR_TERMINATED\x10\x16\x12\x16\n\x12WR_PROCESS_IN_SWAP\x10\x17\x12\x17\n\x13WR_CPU_RATE_CONTROL\x10\x18\x12\x14\n\x10WR_CALLOUT_STACK\x10\x19\x12\r\n\tWR_KERNEL\x10\x1a\x12\x0f\n\x0bWR_RESOURCE\x10\x1b\x12\x10\n\x0cWR_PUSH_LOCK\x10\x1c\x12\x0c\n\x08WR_MUTEX\x10\x1d\x12\x12\n\x0eWR_QUANTUM_END\x10\x1e\x12\x13\n\x0fWR_DISPATCH_INT\x10\x1f\x12\x10\n\x0cWR_PREEMPTED\x10 \x12\x16\n\x12WR_YIELD_EXECUTION\x10!\x12\x11\n\rWR_FAST_MUTEX\x10\"\x12\x12\n\x0eWR_GUARD_MUTEX\x10#\x12\x0e\n\nWR_RUNDOWN\x10$\x12\x17\n\x13MAXIMUM_WAIT_REASON\x10%\"3\n\x11OldThreadWaitMode\x12\x0f\n\x0bKERNEL_MODE\x10\x00\x12\r\n\tUSER_MODE\x10\x01\"\x87\x01\n\x0eOldThreadState\x12\x0f\n\x0bINITIALIZED\x10\x00\x12\t\n\x05READY\x10\x01\x12\x0b\n\x07RUNNING\x10\x02\x12\x0b\n\x07STANDBY\x10\x03\x12\x0e\n\nTERMINATED\x10\x04\x12\x0b\n\x07WAITING\x10\x05\x12\x0e\n\nTRANSITION\x10\x06\x12\x12\n\x0e\x44\x45\x46\x45RRED_READY\x10\x07\x42$\n\"old_thread_wait_reason_enum_or_intB\"\n old_thread_wait_mode_enum_or_intB\x1e\n\x1cold_thread_state_enum_or_int\"\x88\x04\n\x13ReadyThreadEtwEvent\x12\x13\n\x0bt_thread_id\x18\x01 \x01(\r\x12J\n\radjust_reason\x18\x02 \x01(\x0e\x32\x31.perfetto.protos.ReadyThreadEtwEvent.AdjustReasonH\x00\x12\x1b\n\x11\x61\x64just_reason_int\x18\x05 \x01(\x05H\x00\x12\x18\n\x10\x61\x64just_increment\x18\x03 \x01(\x11\x12>\n\x04\x66lag\x18\x04 \x01(\x0e\x32..perfetto.protos.ReadyThreadEtwEvent.TraceFlagH\x01\x12\x12\n\x08\x66lag_int\x18\x06 \x01(\x05H\x01\"X\n\x0c\x41\x64justReason\x12\x18\n\x14IGNORE_THE_INCREMENT\x10\x00\x12\x13\n\x0f\x41PPLY_INCREMENT\x10\x01\x12\x19\n\x15\x41PPLY_INCREMENT_BOOST\x10\x02\"z\n\tTraceFlag\x12\x1a\n\x16TRACE_FLAG_UNSPECIFIED\x10\x00\x12\x12\n\x0eTHREAD_READIED\x10\x01\x12\x1c\n\x18KERNEL_STACK_SWAPPED_OUT\x10\x02\x12\x1f\n\x1bPROCESS_ADDRESS_SWAPPED_OUT\x10\x04\x42\x1b\n\x19\x61\x64just_reason_enum_or_intB\x12\n\x10\x66lag_enum_or_int\"\x90\x03\n\x0fMemInfoEtwEvent\x12\x17\n\x0fpriority_levels\x18\x01 \x01(\r\x12\x17\n\x0fzero_page_count\x18\x02 \x01(\x04\x12\x17\n\x0f\x66ree_page_count\x18\x03 \x01(\x04\x12\x1b\n\x13modified_page_count\x18\x04 \x01(\x04\x12$\n\x1cmodified_no_write_page_count\x18\x05 \x01(\x04\x12\x16\n\x0e\x62\x61\x64_page_count\x18\x06 \x01(\x04\x12\x1b\n\x13standby_page_counts\x18\x07 \x03(\x04\x12\x1e\n\x16repurposed_page_counts\x18\x08 \x03(\x04\x12%\n\x1dmodified_page_count_page_file\x18\t \x01(\x04\x12\x1d\n\x15paged_pool_page_count\x18\n \x01(\x04\x12!\n\x19non_paged_pool_page_count\x18\x0b \x01(\x04\x12\x16\n\x0emdl_page_count\x18\x0c \x01(\x04\x12\x19\n\x11\x63ommit_page_count\x18\r \x01(\x04\"\xa4\x01\n\x14\x46ileIoCreateEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x02 \x01(\x04\x12\x0c\n\x04ttid\x18\x03 \x01(\r\x12\x16\n\x0e\x63reate_options\x18\x04 \x01(\r\x12\x17\n\x0f\x66ile_attributes\x18\x05 \x01(\r\x12\x14\n\x0cshare_access\x18\x06 \x01(\r\x12\x11\n\topen_path\x18\x07 \x01(\t\"\xb8\x01\n\x15\x46ileIoDirEnumEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x02 \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x03 \x01(\x04\x12\x0c\n\x04ttid\x18\x04 \x01(\r\x12\x0e\n\x06length\x18\x05 \x01(\r\x12\x12\n\ninfo_class\x18\x06 \x01(\r\x12\x12\n\nfile_index\x18\x07 \x01(\r\x12\x11\n\tfile_name\x18\x08 \x01(\t\x12\x0e\n\x06opcode\x18\t \x01(\r\"\x92\x01\n\x12\x46ileIoInfoEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x02 \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x03 \x01(\x04\x12\x12\n\nextra_info\x18\x04 \x01(\x04\x12\x0c\n\x04ttid\x18\x05 \x01(\r\x12\x12\n\ninfo_class\x18\x06 \x01(\r\x12\x0e\n\x06opcode\x18\x07 \x01(\r\"\xa2\x01\n\x17\x46ileIoReadWriteEtwEvent\x12\x0e\n\x06offset\x18\x01 \x01(\x04\x12\x0f\n\x07irp_ptr\x18\x02 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x03 \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x04 \x01(\x04\x12\x0c\n\x04ttid\x18\x05 \x01(\r\x12\x0f\n\x07io_size\x18\x06 \x01(\r\x12\x10\n\x08io_flags\x18\x07 \x01(\r\x12\x0e\n\x06opcode\x18\x08 \x01(\r\"n\n\x16\x46ileIoSimpleOpEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x02 \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x03 \x01(\x04\x12\x0c\n\x04ttid\x18\x04 \x01(\r\x12\x0e\n\x06opcode\x18\x05 \x01(\r\"M\n\x13\x46ileIoOpEndEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x12\n\nextra_info\x18\x02 \x01(\x04\x12\x11\n\tnt_status\x18\x03 \x01(\r\"\xae\x01\n\x1b\x46ileIoPathOperationEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x02 \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x03 \x01(\x04\x12\x12\n\nextra_info\x18\x04 \x01(\x04\x12\x0c\n\x04ttid\x18\x05 \x01(\r\x12\x12\n\ninfo_class\x18\x06 \x01(\r\x12\x11\n\tfile_name\x18\x07 \x01(\t\x12\x0e\n\x06opcode\x18\x08 \x01(\r\";\n\x11StackWalkEtwEvent\x12\x0f\n\x07trigger\x18\x01 \x01(\t\x12\x15\n\rcallstack_iid\x18\x02 \x01(\x04\"\xcc\x01\n\x0e\x44iskIoEtwEvent\x12\x13\n\x0b\x64isk_number\x18\x01 \x01(\r\x12\x11\n\tirp_flags\x18\x02 \x01(\r\x12\x15\n\rtransfer_size\x18\x03 \x01(\r\x12\x13\n\x0b\x62yte_offset\x18\x04 \x01(\x03\x12\x13\n\x0b\x66ile_object\x18\x05 \x01(\x04\x12\x0f\n\x07irp_ptr\x18\x06 \x01(\x04\x12\x15\n\rresponse_time\x18\x07 \x01(\x03\x12\x19\n\x11issuing_thread_id\x18\x08 \x01(\r\x12\x0e\n\x06opcode\x18\t \x01(\r\"\xc3\x06\n\rEtwTraceEvent\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x0b\n\x03\x63pu\x18\x04 \x01(\r\x12\x11\n\tthread_id\x18\x05 \x01(\r\x12\x34\n\x08\x63_switch\x18\x02 \x01(\x0b\x32 .perfetto.protos.CSwitchEtwEventH\x00\x12<\n\x0cready_thread\x18\x03 \x01(\x0b\x32$.perfetto.protos.ReadyThreadEtwEventH\x00\x12\x34\n\x08mem_info\x18\x06 \x01(\x0b\x32 .perfetto.protos.MemInfoEtwEventH\x00\x12?\n\x0e\x66ile_io_create\x18\x07 \x01(\x0b\x32%.perfetto.protos.FileIoCreateEtwEventH\x00\x12\x42\n\x10\x66ile_io_dir_enum\x18\x08 \x01(\x0b\x32&.perfetto.protos.FileIoDirEnumEtwEventH\x00\x12;\n\x0c\x66ile_io_info\x18\t \x01(\x0b\x32#.perfetto.protos.FileIoInfoEtwEventH\x00\x12\x46\n\x12\x66ile_io_read_write\x18\n \x01(\x0b\x32(.perfetto.protos.FileIoReadWriteEtwEventH\x00\x12\x44\n\x11\x66ile_io_simple_op\x18\x0b \x01(\x0b\x32\'.perfetto.protos.FileIoSimpleOpEtwEventH\x00\x12>\n\x0e\x66ile_io_op_end\x18\x0c \x01(\x0b\x32$.perfetto.protos.FileIoOpEndEtwEventH\x00\x12\x38\n\nstack_walk\x18\r \x01(\x0b\x32\".perfetto.protos.StackWalkEtwEventH\x00\x12N\n\x16\x66ile_io_path_operation\x18\x0e \x01(\x0b\x32,.perfetto.protos.FileIoPathOperationEtwEventH\x00\x12\x32\n\x07\x64isk_io\x18\x0f \x01(\x0b\x32\x1f.perfetto.protos.DiskIoEtwEventH\x00\x42\x07\n\x05\x65vent\"Q\n\x13\x45twTraceEventBundle\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12-\n\x05\x65vent\x18\x02 \x03(\x0b\x32\x1e.perfetto.protos.EtwTraceEvent\"G\n\x11\x46ileDescriptorSet\x12\x32\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.perfetto.protos.FileDescriptorProto\"\xbf\x02\n\x13\x46ileDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07package\x18\x02 \x01(\t\x12\x12\n\ndependency\x18\x03 \x03(\t\x12\x19\n\x11public_dependency\x18\n \x03(\x05\x12\x17\n\x0fweak_dependency\x18\x0b \x03(\x05\x12\x36\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .perfetto.protos.DescriptorProto\x12\x37\n\tenum_type\x18\x05 \x03(\x0b\x32$.perfetto.protos.EnumDescriptorProto\x12\x38\n\textension\x18\x07 \x03(\x0b\x32%.perfetto.protos.FieldDescriptorProtoJ\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\nJ\x04\x08\x0c\x10\r\"\xd2\x03\n\x0f\x44\x65scriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x34\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.perfetto.protos.FieldDescriptorProto\x12\x38\n\textension\x18\x06 \x03(\x0b\x32%.perfetto.protos.FieldDescriptorProto\x12\x35\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .perfetto.protos.DescriptorProto\x12\x37\n\tenum_type\x18\x04 \x03(\x0b\x32$.perfetto.protos.EnumDescriptorProto\x12\x39\n\noneof_decl\x18\x08 \x03(\x0b\x32%.perfetto.protos.OneofDescriptorProto\x12\x46\n\x0ereserved_range\x18\t \x03(\x0b\x32..perfetto.protos.DescriptorProto.ReservedRange\x12\x15\n\rreserved_name\x18\n \x03(\t\x1a+\n\rReservedRange\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x05J\x04\x08\x05\x10\x06J\x04\x08\x07\x10\x08\"\x9e\x02\n\x13UninterpretedOption\x12;\n\x04name\x18\x02 \x03(\x0b\x32-.perfetto.protos.UninterpretedOption.NamePart\x12\x18\n\x10identifier_value\x18\x03 \x01(\t\x12\x1a\n\x12positive_int_value\x18\x04 \x01(\x04\x12\x1a\n\x12negative_int_value\x18\x05 \x01(\x03\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x14\n\x0cstring_value\x18\x07 \x01(\x0c\x12\x17\n\x0f\x61ggregate_value\x18\x08 \x01(\t\x1a\x33\n\x08NamePart\x12\x11\n\tname_part\x18\x01 \x01(\t\x12\x14\n\x0cis_extension\x18\x02 \x01(\x08\"c\n\x0c\x46ieldOptions\x12\x0e\n\x06packed\x18\x02 \x01(\x08\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.perfetto.protos.UninterpretedOption\"\xaf\x05\n\x14\x46ieldDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x03 \x01(\x05\x12:\n\x05label\x18\x04 \x01(\x0e\x32+.perfetto.protos.FieldDescriptorProto.Label\x12\x38\n\x04type\x18\x05 \x01(\x0e\x32*.perfetto.protos.FieldDescriptorProto.Type\x12\x11\n\ttype_name\x18\x06 \x01(\t\x12\x10\n\x08\x65xtendee\x18\x02 \x01(\t\x12\x15\n\rdefault_value\x18\x07 \x01(\t\x12.\n\x07options\x18\x08 \x01(\x0b\x32\x1d.perfetto.protos.FieldOptions\x12\x13\n\x0boneof_index\x18\t \x01(\x05\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\x12\x12\n\x0eLABEL_REPEATED\x10\x03J\x04\x08\n\x10\x0b\"T\n\x14OneofDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\x07options\x18\x02 \x01(\x0b\x32\x1d.perfetto.protos.OneofOptions\"\x80\x01\n\x13\x45numDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\x05value\x18\x02 \x03(\x0b\x32).perfetto.protos.EnumValueDescriptorProto\x12\x15\n\rreserved_name\x18\x05 \x03(\tJ\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05\">\n\x18\x45numValueDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x02 \x01(\x05J\x04\x08\x03\x10\x04\"!\n\x0cOneofOptions*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x06\x08\xe7\x07\x10\xe8\x07\"\x91\x01\n\x13\x45xtensionDescriptor\x12;\n\rextension_set\x18\x01 \x01(\x0b\x32\".perfetto.protos.FileDescriptorSetH\x00\x12\x1c\n\x12\x65xtension_set_gzip\x18\x02 \x01(\x0cH\x00\x12\x11\n\tfile_name\x18\x03 \x01(\tB\x0c\n\ndescriptor\"\x88\x02\n\x0cInodeFileMap\x12\x17\n\x0f\x62lock_device_id\x18\x01 \x01(\x04\x12\x14\n\x0cmount_points\x18\x02 \x03(\t\x12\x34\n\x07\x65ntries\x18\x03 \x03(\x0b\x32#.perfetto.protos.InodeFileMap.Entry\x1a\x92\x01\n\x05\x45ntry\x12\x14\n\x0cinode_number\x18\x01 \x01(\x04\x12\r\n\x05paths\x18\x02 \x03(\t\x12\x36\n\x04type\x18\x03 \x01(\x0e\x32(.perfetto.protos.InodeFileMap.Entry.Type\",\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04\x46ILE\x10\x01\x12\r\n\tDIRECTORY\x10\x02\"M\n\x1f\x41ndroidFsDatareadEndFtraceEvent\x12\r\n\x05\x62ytes\x18\x01 \x01(\x05\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\"\x8e\x01\n!AndroidFsDatareadStartFtraceEvent\x12\r\n\x05\x62ytes\x18\x01 \x01(\x05\x12\x0f\n\x07\x63mdline\x18\x02 \x01(\t\x12\x0e\n\x06i_size\x18\x03 \x01(\x03\x12\x0b\n\x03ino\x18\x04 \x01(\x04\x12\x0e\n\x06offset\x18\x05 \x01(\x03\x12\x0f\n\x07pathbuf\x18\x06 \x01(\t\x12\x0b\n\x03pid\x18\x07 \x01(\x05\"N\n AndroidFsDatawriteEndFtraceEvent\x12\r\n\x05\x62ytes\x18\x01 \x01(\x05\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\"\x8f\x01\n\"AndroidFsDatawriteStartFtraceEvent\x12\r\n\x05\x62ytes\x18\x01 \x01(\x05\x12\x0f\n\x07\x63mdline\x18\x02 \x01(\t\x12\x0e\n\x06i_size\x18\x03 \x01(\x03\x12\x0b\n\x03ino\x18\x04 \x01(\x04\x12\x0e\n\x06offset\x18\x05 \x01(\x03\x12\x0f\n\x07pathbuf\x18\x06 \x01(\t\x12\x0b\n\x03pid\x18\x07 \x01(\x05\"J\n\x1c\x41ndroidFsFsyncEndFtraceEvent\x12\r\n\x05\x62ytes\x18\x01 \x01(\x05\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\"l\n\x1e\x41ndroidFsFsyncStartFtraceEvent\x12\x0f\n\x07\x63mdline\x18\x01 \x01(\t\x12\x0e\n\x06i_size\x18\x02 \x01(\x03\x12\x0b\n\x03ino\x18\x03 \x01(\x04\x12\x0f\n\x07pathbuf\x18\x04 \x01(\t\x12\x0b\n\x03pid\x18\x05 \x01(\x05\"\xbd\x01\n\x18\x42\x63lIrqTriggerFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x10\n\x08throttle\x18\x02 \x01(\x05\x12\x12\n\ncpu0_limit\x18\x03 \x01(\x05\x12\x12\n\ncpu1_limit\x18\x04 \x01(\x05\x12\x12\n\ncpu2_limit\x18\x05 \x01(\x05\x12\x11\n\ttpu_limit\x18\x06 \x01(\x05\x12\x11\n\tgpu_limit\x18\x07 \x01(\x05\x12\x0f\n\x07voltage\x18\x08 \x01(\x05\x12\x10\n\x08\x63\x61pacity\x18\t \x01(\x05\"\x95\x01\n\x1c\x42inderTransactionFtraceEvent\x12\x10\n\x08\x64\x65\x62ug_id\x18\x01 \x01(\x05\x12\x13\n\x0btarget_node\x18\x02 \x01(\x05\x12\x0f\n\x07to_proc\x18\x03 \x01(\x05\x12\x11\n\tto_thread\x18\x04 \x01(\x05\x12\r\n\x05reply\x18\x05 \x01(\x05\x12\x0c\n\x04\x63ode\x18\x06 \x01(\r\x12\r\n\x05\x66lags\x18\x07 \x01(\r\"8\n$BinderTransactionReceivedFtraceEvent\x12\x10\n\x08\x64\x65\x62ug_id\x18\x01 \x01(\x05\"v\n\x1c\x42inderSetPriorityFtraceEvent\x12\x0c\n\x04proc\x18\x01 \x01(\x05\x12\x0e\n\x06thread\x18\x02 \x01(\x05\x12\x10\n\x08old_prio\x18\x03 \x01(\r\x12\x10\n\x08new_prio\x18\x04 \x01(\r\x12\x14\n\x0c\x64\x65sired_prio\x18\x05 \x01(\r\"$\n\x15\x42inderLockFtraceEvent\x12\x0b\n\x03tag\x18\x01 \x01(\t\"&\n\x17\x42inderLockedFtraceEvent\x12\x0b\n\x03tag\x18\x01 \x01(\t\"&\n\x17\x42inderUnlockFtraceEvent\x12\x0b\n\x03tag\x18\x01 \x01(\t\"}\n$BinderTransactionAllocBufFtraceEvent\x12\x11\n\tdata_size\x18\x01 \x01(\x04\x12\x10\n\x08\x64\x65\x62ug_id\x18\x02 \x01(\x05\x12\x14\n\x0coffsets_size\x18\x03 \x01(\x04\x12\x1a\n\x12\x65xtra_buffers_size\x18\x04 \x01(\x04\"\'\n\x18\x42inderCommandFtraceEvent\x12\x0b\n\x03\x63md\x18\x01 \x01(\r\"&\n\x17\x42inderReturnFtraceEvent\x12\x0b\n\x03\x63md\x18\x01 \x01(\r\"\x81\x01\n\x17\x42lockRqIssueFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\r\n\x05\x62ytes\x18\x04 \x01(\r\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\x12\x0c\n\x04\x63omm\x18\x06 \x01(\t\x12\x0b\n\x03\x63md\x18\x07 \x01(\t\"j\n\x1c\x42lockBioBackmergeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"g\n\x19\x42lockBioBounceFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"j\n\x1b\x42lockBioCompleteFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\r\n\x05\x65rror\x18\x04 \x01(\x05\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\"k\n\x1d\x42lockBioFrontmergeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"f\n\x18\x42lockBioQueueFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"}\n\x18\x42lockBioRemapFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0f\n\x07old_dev\x18\x04 \x01(\x04\x12\x12\n\nold_sector\x18\x05 \x01(\x04\x12\x0c\n\x04rwbs\x18\x06 \x01(\t\"H\n\x1b\x42lockDirtyBufferFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x04\"c\n\x15\x42lockGetrqFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"$\n\x14\x42lockPlugFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\"t\n\x17\x42lockRqAbortFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0e\n\x06\x65rrors\x18\x04 \x01(\x05\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\x12\x0b\n\x03\x63md\x18\x06 \x01(\t\"\x86\x01\n\x1a\x42lockRqCompleteFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0e\n\x06\x65rrors\x18\x04 \x01(\x05\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\x12\x0b\n\x03\x63md\x18\x06 \x01(\t\x12\r\n\x05\x65rror\x18\x07 \x01(\x05\"\x82\x01\n\x18\x42lockRqInsertFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\r\n\x05\x62ytes\x18\x04 \x01(\r\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\x12\x0c\n\x04\x63omm\x18\x06 \x01(\t\x12\x0b\n\x03\x63md\x18\x07 \x01(\t\"\x8d\x01\n\x17\x42lockRqRemapFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0f\n\x07old_dev\x18\x04 \x01(\x04\x12\x12\n\nold_sector\x18\x05 \x01(\x04\x12\x0f\n\x07nr_bios\x18\x06 \x01(\r\x12\x0c\n\x04rwbs\x18\x07 \x01(\t\"v\n\x19\x42lockRqRequeueFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0e\n\x06\x65rrors\x18\x04 \x01(\x05\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\x12\x0b\n\x03\x63md\x18\x06 \x01(\t\"e\n\x17\x42lockSleeprqFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"d\n\x15\x42lockSplitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x12\n\nnew_sector\x18\x03 \x01(\x04\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"H\n\x1b\x42lockTouchBufferFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x04\"5\n\x16\x42lockUnplugFtraceEvent\x12\r\n\x05nr_rq\x18\x01 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\"\x91\x01\n\x17\x42lockIoStartFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\r\n\x05\x62ytes\x18\x04 \x01(\r\x12\x0e\n\x06ioprio\x18\x05 \x01(\r\x12\x0c\n\x04rwbs\x18\x06 \x01(\t\x12\x0c\n\x04\x63omm\x18\x07 \x01(\t\x12\x0b\n\x03\x63md\x18\x08 \x01(\t\"\x90\x01\n\x16\x42lockIoDoneFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\r\n\x05\x62ytes\x18\x04 \x01(\r\x12\x0e\n\x06ioprio\x18\x05 \x01(\r\x12\x0c\n\x04rwbs\x18\x06 \x01(\t\x12\x0c\n\x04\x63omm\x18\x07 \x01(\t\x12\x0b\n\x03\x63md\x18\x08 \x01(\t\"\x8e\x01\n\x1b\x43groupAttachTaskFtraceEvent\x12\x10\n\x08\x64st_root\x18\x01 \x01(\x05\x12\x0e\n\x06\x64st_id\x18\x02 \x01(\x05\x12\x0b\n\x03pid\x18\x03 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x04 \x01(\t\x12\r\n\x05\x63name\x18\x05 \x01(\t\x12\x11\n\tdst_level\x18\x06 \x01(\x05\x12\x10\n\x08\x64st_path\x18\x07 \x01(\t\"^\n\x16\x43groupMkdirFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x63name\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\t\"G\n\x18\x43groupRemountFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\x0f\n\x07ss_mask\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\"^\n\x16\x43groupRmdirFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x63name\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\t\"\x91\x01\n\x1e\x43groupTransferTasksFtraceEvent\x12\x10\n\x08\x64st_root\x18\x01 \x01(\x05\x12\x0e\n\x06\x64st_id\x18\x02 \x01(\x05\x12\x0b\n\x03pid\x18\x03 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x04 \x01(\t\x12\r\n\x05\x63name\x18\x05 \x01(\t\x12\x11\n\tdst_level\x18\x06 \x01(\x05\x12\x10\n\x08\x64st_path\x18\x07 \x01(\t\"K\n\x1c\x43groupDestroyRootFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\x0f\n\x07ss_mask\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\"`\n\x18\x43groupReleaseFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x63name\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\t\"_\n\x17\x43groupRenameFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x63name\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\t\"I\n\x1a\x43groupSetupRootFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\x0f\n\x07ss_mask\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\"$\n\x14\x43lkEnableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"%\n\x15\x43lkDisableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"3\n\x15\x43lkSetRateFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04rate\x18\x02 \x01(\x04\"F\n\x18\x43maAllocStartFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\r\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\"\xc4\x01\n\x17\x43maAllocInfoFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\r\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x0f\n\x07\x65rr_iso\x18\x03 \x01(\r\x12\x0f\n\x07\x65rr_mig\x18\x04 \x01(\r\x12\x10\n\x08\x65rr_test\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x11\n\tnr_mapped\x18\x07 \x01(\x04\x12\x13\n\x0bnr_migrated\x18\x08 \x01(\x04\x12\x14\n\x0cnr_reclaimed\x18\t \x01(\x04\x12\x0b\n\x03pfn\x18\n \x01(\x04\"s\n\x19\x43maAllocFinishFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03pfn\x18\x02 \x01(\x04\x12\x0c\n\x04page\x18\x03 \x01(\x04\x12\r\n\x05\x63ount\x18\x04 \x01(\x04\x12\r\n\x05\x61lign\x18\x05 \x01(\r\x12\x0f\n\x07\x65rrorno\x18\x06 \x01(\x05\"y\n\x1cMmCompactionBeginFtraceEvent\x12\x12\n\nzone_start\x18\x01 \x01(\x04\x12\x13\n\x0bmigrate_pfn\x18\x02 \x01(\x04\x12\x10\n\x08\x66ree_pfn\x18\x03 \x01(\x04\x12\x10\n\x08zone_end\x18\x04 \x01(\x04\x12\x0c\n\x04sync\x18\x05 \x01(\r\"\x90\x01\n&MmCompactionDeferCompactionFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\x0b\n\x03idx\x18\x02 \x01(\r\x12\r\n\x05order\x18\x03 \x01(\x05\x12\x12\n\nconsidered\x18\x04 \x01(\r\x12\x13\n\x0b\x64\x65\x66\x65r_shift\x18\x05 \x01(\r\x12\x14\n\x0corder_failed\x18\x06 \x01(\x05\"\x89\x01\n\x1fMmCompactionDeferredFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\x0b\n\x03idx\x18\x02 \x01(\r\x12\r\n\x05order\x18\x03 \x01(\x05\x12\x12\n\nconsidered\x18\x04 \x01(\r\x12\x13\n\x0b\x64\x65\x66\x65r_shift\x18\x05 \x01(\r\x12\x14\n\x0corder_failed\x18\x06 \x01(\x05\"\x8b\x01\n!MmCompactionDeferResetFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\x0b\n\x03idx\x18\x02 \x01(\r\x12\r\n\x05order\x18\x03 \x01(\x05\x12\x12\n\nconsidered\x18\x04 \x01(\r\x12\x13\n\x0b\x64\x65\x66\x65r_shift\x18\x05 \x01(\r\x12\x14\n\x0corder_failed\x18\x06 \x01(\x05\"\x87\x01\n\x1aMmCompactionEndFtraceEvent\x12\x12\n\nzone_start\x18\x01 \x01(\x04\x12\x13\n\x0bmigrate_pfn\x18\x02 \x01(\x04\x12\x10\n\x08\x66ree_pfn\x18\x03 \x01(\x04\x12\x10\n\x08zone_end\x18\x04 \x01(\x04\x12\x0c\n\x04sync\x18\x05 \x01(\r\x12\x0e\n\x06status\x18\x06 \x01(\x05\"W\n\x1fMmCompactionFinishedFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\x0b\n\x03idx\x18\x02 \x01(\r\x12\r\n\x05order\x18\x03 \x01(\x05\x12\x0b\n\x03ret\x18\x04 \x01(\x05\"s\n\'MmCompactionIsolateFreepagesFtraceEvent\x12\x11\n\tstart_pfn\x18\x01 \x01(\x04\x12\x0f\n\x07\x65nd_pfn\x18\x02 \x01(\x04\x12\x12\n\nnr_scanned\x18\x03 \x01(\x04\x12\x10\n\x08nr_taken\x18\x04 \x01(\x04\"v\n*MmCompactionIsolateMigratepagesFtraceEvent\x12\x11\n\tstart_pfn\x18\x01 \x01(\x04\x12\x0f\n\x07\x65nd_pfn\x18\x02 \x01(\x04\x12\x12\n\nnr_scanned\x18\x03 \x01(\x04\x12\x10\n\x08nr_taken\x18\x04 \x01(\x04\"4\n%MmCompactionKcompactdSleepFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\"r\n$MmCompactionKcompactdWakeFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\r\n\x05order\x18\x02 \x01(\x05\x12\x15\n\rclasszone_idx\x18\x03 \x01(\r\x12\x17\n\x0fhighest_zoneidx\x18\x04 \x01(\r\"M\n#MmCompactionMigratepagesFtraceEvent\x12\x13\n\x0bnr_migrated\x18\x01 \x01(\x04\x12\x11\n\tnr_failed\x18\x02 \x01(\x04\"W\n\x1fMmCompactionSuitableFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\x0b\n\x03idx\x18\x02 \x01(\r\x12\r\n\x05order\x18\x03 \x01(\x05\x12\x0b\n\x03ret\x18\x04 \x01(\x05\"g\n(MmCompactionTryToCompactPagesFtraceEvent\x12\r\n\x05order\x18\x01 \x01(\x05\x12\x10\n\x08gfp_mask\x18\x02 \x01(\r\x12\x0c\n\x04mode\x18\x03 \x01(\r\x12\x0c\n\x04prio\x18\x04 \x01(\x05\"t\n&MmCompactionWakeupKcompactdFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\r\n\x05order\x18\x02 \x01(\x05\x12\x15\n\rclasszone_idx\x18\x03 \x01(\r\x12\x17\n\x0fhighest_zoneidx\x18\x04 \x01(\r\"M\n\x1bParamSetValueCpmFtraceEvent\x12\x0c\n\x04\x62ody\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r\x12\x11\n\ttimestamp\x18\x03 \x01(\x03\"L\n\x14\x43puhpExitFtraceEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12\x0b\n\x03idx\x18\x02 \x01(\x05\x12\x0b\n\x03ret\x18\x03 \x01(\x05\x12\r\n\x05state\x18\x04 \x01(\x05\"S\n\x1a\x43puhpMultiEnterFtraceEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12\x0b\n\x03\x66un\x18\x02 \x01(\x04\x12\x0b\n\x03idx\x18\x03 \x01(\x05\x12\x0e\n\x06target\x18\x04 \x01(\x05\"N\n\x15\x43puhpEnterFtraceEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12\x0b\n\x03\x66un\x18\x02 \x01(\x04\x12\x0b\n\x03idx\x18\x03 \x01(\x05\x12\x0e\n\x06target\x18\x04 \x01(\x05\"P\n\x17\x43puhpLatencyFtraceEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12\x0b\n\x03ret\x18\x02 \x01(\x05\x12\r\n\x05state\x18\x03 \x01(\r\x12\x0c\n\x04time\x18\x04 \x01(\x04\"W\n\x15\x43puhpPauseFtraceEvent\x12\x13\n\x0b\x61\x63tive_cpus\x18\x01 \x01(\r\x12\x0c\n\x04\x63pus\x18\x02 \x01(\r\x12\r\n\x05pause\x18\x03 \x01(\r\x12\x0c\n\x04time\x18\x04 \x01(\r\"\xaa\x01\n\x1e\x43rosEcSensorhubDataFtraceEvent\x12\x14\n\x0c\x63urrent_time\x18\x01 \x01(\x03\x12\x19\n\x11\x63urrent_timestamp\x18\x02 \x01(\x03\x12\r\n\x05\x64\x65lta\x18\x03 \x01(\x03\x12\x19\n\x11\x65\x63_fifo_timestamp\x18\x04 \x01(\r\x12\x15\n\rec_sensor_num\x18\x05 \x01(\r\x12\x16\n\x0e\x66ifo_timestamp\x18\x06 \x01(\x03\"1\n\x14\x44\x63vshFreqFtraceEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\x04\x12\x0c\n\x04\x66req\x18\x02 \x01(\x04\"w\n\x1b\x44\x65vfreqFrequencyFtraceEvent\x12\x10\n\x08\x64\x65v_name\x18\x01 \x01(\t\x12\x0c\n\x04\x66req\x18\x02 \x01(\x04\x12\x11\n\tprev_freq\x18\x03 \x01(\x04\x12\x11\n\tbusy_time\x18\x04 \x01(\x04\x12\x12\n\ntotal_time\x18\x05 \x01(\x04\"[\n\x17\x44maFenceInitFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"[\n\x17\x44maFenceEmitFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"_\n\x1b\x44maFenceSignaledFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"`\n\x1c\x44maFenceWaitStartFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"^\n\x1a\x44maFenceWaitEndFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"M\n\x16\x44maHeapStatFtraceEvent\x12\r\n\x05inode\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\x03\x12\x17\n\x0ftotal_allocated\x18\x03 \x01(\x04\"\x81\x01\n\x1e\x44puTracingMarkWriteFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x12\n\ntrace_name\x18\x02 \x01(\t\x12\x13\n\x0btrace_begin\x18\x03 \x01(\r\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0c\n\x04type\x18\x05 \x01(\r\x12\r\n\x05value\x18\x06 \x01(\x05\"A\n\x1e\x44puDsiCmdFifoStatusFtraceEvent\x12\x0e\n\x06header\x18\x01 \x01(\r\x12\x0f\n\x07payload\x18\x02 \x01(\r\"2\n\x13\x44puDsiRxFtraceEvent\x12\x0b\n\x03\x63md\x18\x01 \x01(\r\x12\x0e\n\x06rx_buf\x18\x03 \x01(\x0c\"S\n\x13\x44puDsiTxFtraceEvent\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0c\n\x04last\x18\x03 \x01(\r\x12\x10\n\x08\x64\x65lay_ms\x18\x04 \x01(\r\x12\x0e\n\x06tx_buf\x18\x05 \x01(\x0c\"X\n\x1d\x44puDispDpuUnderrunFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x16\n\x0e\x66rames_pending\x18\x02 \x01(\x05\x12\x13\n\x0bvsync_count\x18\x03 \x01(\x05\"R\n!DpuDispVblankIrqEnableFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x11\n\toutput_id\x18\x02 \x01(\x05\x12\x0e\n\x06\x65nable\x18\x03 \x01(\x05\"\x8d\x01\n\"DpuDispFrameDoneTimeoutFtraceEvent\x12\x12\n\ndisplay_id\x18\x01 \x01(\x05\x12\x11\n\toutput_id\x18\x02 \x01(\r\x12\x16\n\x0e\x66rames_pending\x18\x03 \x01(\x05\x12\x10\n\x08te_count\x18\x04 \x01(\x05\x12\x16\n\x0e\x64uring_disable\x18\x05 \x01(\r\"v\n#DpuDispFrameStartTimeoutFtraceEvent\x12\x12\n\ndisplay_id\x18\x01 \x01(\x05\x12\x11\n\toutput_id\x18\x02 \x01(\r\x12\x16\n\x0e\x66rames_pending\x18\x03 \x01(\x05\x12\x10\n\x08te_count\x18\x04 \x01(\x05\"u\n\"DpuDispFrameDoneMissingFtraceEvent\x12\x12\n\ndisplay_id\x18\x01 \x01(\x05\x12\x11\n\toutput_id\x18\x02 \x01(\r\x12\x16\n\x0e\x66rames_pending\x18\x03 \x01(\x05\x12\x10\n\x08te_count\x18\x04 \x01(\x05\"v\n#DpuDispFrameStartMissingFtraceEvent\x12\x12\n\ndisplay_id\x18\x01 \x01(\x05\x12\x11\n\toutput_id\x18\x02 \x01(\r\x12\x16\n\x0e\x66rames_pending\x18\x03 \x01(\x05\x12\x10\n\x08te_count\x18\x04 \x01(\x05\"\\\n!DpuDispDpuLineUnderrunFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x16\n\x0e\x66rames_pending\x18\x02 \x01(\x05\x12\x13\n\x0bvsync_count\x18\x03 \x01(\x05\"W\n\x19\x44rmVblankEventFtraceEvent\x12\x0c\n\x04\x63rtc\x18\x01 \x01(\x05\x12\x11\n\thigh_prec\x18\x02 \x01(\r\x12\x0b\n\x03seq\x18\x03 \x01(\r\x12\x0c\n\x04time\x18\x04 \x01(\x03\"M\n\"DrmVblankEventDeliveredFtraceEvent\x12\x0c\n\x04\x63rtc\x18\x01 \x01(\x05\x12\x0c\n\x04\x66ile\x18\x02 \x01(\x04\x12\x0b\n\x03seq\x18\x03 \x01(\r\"\xa2\x01\n\x1b\x44wc3AllocRequestFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03req\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tual\x18\x03 \x01(\r\x12\x0e\n\x06length\x18\x04 \x01(\r\x12\x0e\n\x06status\x18\x05 \x01(\x05\x12\x0c\n\x04zero\x18\x06 \x01(\x05\x12\x14\n\x0cshort_not_ok\x18\x07 \x01(\x05\x12\x14\n\x0cno_interrupt\x18\x08 \x01(\x05\"\xc0\x01\n\x1a\x44wc3CompleteTrbFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03trb\x18\x02 \x01(\x04\x12\x11\n\tallocated\x18\x03 \x01(\r\x12\x0e\n\x06queued\x18\x04 \x01(\r\x12\x0b\n\x03\x62pl\x18\x05 \x01(\r\x12\x0b\n\x03\x62ph\x18\x06 \x01(\r\x12\x0c\n\x04size\x18\x07 \x01(\r\x12\x0c\n\x04\x63trl\x18\x08 \x01(\r\x12\x0c\n\x04type\x18\t \x01(\r\x12\x0f\n\x07\x65nqueue\x18\n \x01(\r\x12\x0f\n\x07\x64\x65queue\x18\x0b \x01(\r\"~\n\x16\x44wc3CtrlReqFtraceEvent\x12\x14\n\x0c\x62RequestType\x18\x01 \x01(\r\x12\x10\n\x08\x62Request\x18\x02 \x01(\r\x12\x0e\n\x06wValue\x18\x03 \x01(\r\x12\x0e\n\x06wIndex\x18\x04 \x01(\r\x12\x0f\n\x07wLength\x18\x05 \x01(\r\x12\x0b\n\x03str\x18\x06 \x01(\t\"\x9f\x01\n\x18\x44wc3EpDequeueFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03req\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tual\x18\x03 \x01(\r\x12\x0e\n\x06length\x18\x04 \x01(\r\x12\x0e\n\x06status\x18\x05 \x01(\x05\x12\x0c\n\x04zero\x18\x06 \x01(\x05\x12\x14\n\x0cshort_not_ok\x18\x07 \x01(\x05\x12\x14\n\x0cno_interrupt\x18\x08 \x01(\x05\"\x9d\x01\n\x16\x44wc3EpQueueFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03req\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tual\x18\x03 \x01(\r\x12\x0e\n\x06length\x18\x04 \x01(\r\x12\x0e\n\x06status\x18\x05 \x01(\x05\x12\x0c\n\x04zero\x18\x06 \x01(\x05\x12\x14\n\x0cshort_not_ok\x18\x07 \x01(\x05\x12\x14\n\x0cno_interrupt\x18\x08 \x01(\x05\"D\n\x14\x44wc3EventFtraceEvent\x12\r\n\x05\x65vent\x18\x01 \x01(\r\x12\x10\n\x08\x65p0state\x18\x02 \x01(\r\x12\x0b\n\x03str\x18\x03 \x01(\t\"\xa1\x01\n\x1a\x44wc3FreeRequestFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03req\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tual\x18\x03 \x01(\r\x12\x0e\n\x06length\x18\x04 \x01(\r\x12\x0e\n\x06status\x18\x05 \x01(\x05\x12\x0c\n\x04zero\x18\x06 \x01(\x05\x12\x14\n\x0cshort_not_ok\x18\x07 \x01(\x05\x12\x14\n\x0cno_interrupt\x18\x08 \x01(\x05\"{\n\x1a\x44wc3GadgetEpCmdFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03\x63md\x18\x02 \x01(\r\x12\x0e\n\x06param0\x18\x03 \x01(\r\x12\x0e\n\x06param1\x18\x04 \x01(\r\x12\x0e\n\x06param2\x18\x05 \x01(\r\x12\x12\n\ncmd_status\x18\x06 \x01(\x05\"\xcd\x01\n\x1e\x44wc3GadgetEpDisableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tmaxpacket\x18\x02 \x01(\r\x12\x17\n\x0fmaxpacket_limit\x18\x03 \x01(\r\x12\x13\n\x0bmax_streams\x18\x04 \x01(\r\x12\x10\n\x08maxburst\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x06 \x01(\r\x12\x11\n\tdirection\x18\x07 \x01(\r\x12\x13\n\x0btrb_enqueue\x18\x08 \x01(\r\x12\x13\n\x0btrb_dequeue\x18\t \x01(\r\"\xcc\x01\n\x1d\x44wc3GadgetEpEnableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tmaxpacket\x18\x02 \x01(\r\x12\x17\n\x0fmaxpacket_limit\x18\x03 \x01(\r\x12\x13\n\x0bmax_streams\x18\x04 \x01(\r\x12\x10\n\x08maxburst\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x06 \x01(\r\x12\x11\n\tdirection\x18\x07 \x01(\r\x12\x13\n\x0btrb_enqueue\x18\x08 \x01(\r\x12\x13\n\x0btrb_dequeue\x18\t \x01(\r\"M\n\x1f\x44wc3GadgetGenericCmdFtraceEvent\x12\x0b\n\x03\x63md\x18\x01 \x01(\r\x12\r\n\x05param\x18\x02 \x01(\r\x12\x0e\n\x06status\x18\x03 \x01(\x05\"\xa4\x01\n\x1d\x44wc3GadgetGivebackFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03req\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tual\x18\x03 \x01(\r\x12\x0e\n\x06length\x18\x04 \x01(\r\x12\x0e\n\x06status\x18\x05 \x01(\x05\x12\x0c\n\x04zero\x18\x06 \x01(\x05\x12\x14\n\x0cshort_not_ok\x18\x07 \x01(\x05\x12\x14\n\x0cno_interrupt\x18\x08 \x01(\x05\"\xbf\x01\n\x19\x44wc3PrepareTrbFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03trb\x18\x02 \x01(\x04\x12\x11\n\tallocated\x18\x03 \x01(\r\x12\x0e\n\x06queued\x18\x04 \x01(\r\x12\x0b\n\x03\x62pl\x18\x05 \x01(\r\x12\x0b\n\x03\x62ph\x18\x06 \x01(\r\x12\x0c\n\x04size\x18\x07 \x01(\r\x12\x0c\n\x04\x63trl\x18\x08 \x01(\r\x12\x0c\n\x04type\x18\t \x01(\r\x12\x0f\n\x07\x65nqueue\x18\n \x01(\r\x12\x0f\n\x07\x64\x65queue\x18\x0b \x01(\r\"P\n\x14\x44wc3ReadlFtraceEvent\x12\x0c\n\x04\x62\x61se\x18\x01 \x01(\x04\x12\x0e\n\x06offset\x18\x02 \x01(\r\x12\r\n\x05value\x18\x03 \x01(\r\x12\x0b\n\x03msg\x18\x04 \x01(\t\"Q\n\x15\x44wc3WritelFtraceEvent\x12\x0c\n\x04\x62\x61se\x18\x01 \x01(\x04\x12\x0e\n\x06offset\x18\x02 \x01(\r\x12\r\n\x05value\x18\x03 \x01(\r\x12\x0b\n\x03msg\x18\x04 \x01(\t\"`\n\x1b\x45xt4DaWriteBeginFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"_\n\x19\x45xt4DaWriteEndFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0e\n\x06\x63opied\x18\x05 \x01(\r\"Z\n\x1c\x45xt4SyncFileEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06parent\x18\x03 \x01(\x04\x12\x10\n\x08\x64\x61tasync\x18\x04 \x01(\x05\"D\n\x1b\x45xt4SyncFileExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"b\n\x1c\x45xt4AllocDaBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x13\n\x0b\x64\x61ta_blocks\x18\x03 \x01(\r\x12\x13\n\x0bmeta_blocks\x18\x04 \x01(\r\"\xc1\x01\n\x1d\x45xt4AllocateBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x62lock\x18\x03 \x01(\x04\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0f\n\x07logical\x18\x05 \x01(\r\x12\r\n\x05lleft\x18\x06 \x01(\r\x12\x0e\n\x06lright\x18\x07 \x01(\r\x12\x0c\n\x04goal\x18\x08 \x01(\x04\x12\r\n\x05pleft\x18\t \x01(\x04\x12\x0e\n\x06pright\x18\n \x01(\x04\x12\r\n\x05\x66lags\x18\x0b \x01(\r\"S\n\x1c\x45xt4AllocateInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03\x64ir\x18\x03 \x01(\x04\x12\x0c\n\x04mode\x18\x04 \x01(\r\"Q\n#Ext4BeginOrderedTruncateFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x10\n\x08new_size\x18\x03 \x01(\x03\"U\n\x1c\x45xt4CollapseRangeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\"\xca\x01\n\x1d\x45xt4DaReleaseSpaceFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x10\n\x08i_blocks\x18\x03 \x01(\x04\x12\x14\n\x0c\x66reed_blocks\x18\x04 \x01(\x05\x12\x1c\n\x14reserved_data_blocks\x18\x05 \x01(\x05\x12\x1c\n\x14reserved_meta_blocks\x18\x06 \x01(\x05\x12\x1d\n\x15\x61llocated_meta_blocks\x18\x07 \x01(\x05\x12\x0c\n\x04mode\x18\x08 \x01(\r\"\xa8\x01\n\x1d\x45xt4DaReserveSpaceFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x10\n\x08i_blocks\x18\x03 \x01(\x04\x12\x1c\n\x14reserved_data_blocks\x18\x04 \x01(\x05\x12\x1c\n\x14reserved_meta_blocks\x18\x05 \x01(\x05\x12\x0c\n\x04mode\x18\x06 \x01(\r\x12\x11\n\tmd_needed\x18\x07 \x01(\x05\"\xe4\x01\n#Ext4DaUpdateReserveSpaceFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x10\n\x08i_blocks\x18\x03 \x01(\x04\x12\x13\n\x0bused_blocks\x18\x04 \x01(\x05\x12\x1c\n\x14reserved_data_blocks\x18\x05 \x01(\x05\x12\x1c\n\x14reserved_meta_blocks\x18\x06 \x01(\x05\x12\x1d\n\x15\x61llocated_meta_blocks\x18\x07 \x01(\x05\x12\x13\n\x0bquota_claim\x18\x08 \x01(\x05\x12\x0c\n\x04mode\x18\t \x01(\r\"\xcf\x01\n\x1b\x45xt4DaWritePagesFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x12\n\nfirst_page\x18\x03 \x01(\x04\x12\x13\n\x0bnr_to_write\x18\x04 \x01(\x03\x12\x11\n\tsync_mode\x18\x05 \x01(\x05\x12\x11\n\tb_blocknr\x18\x06 \x01(\x04\x12\x0e\n\x06\x62_size\x18\x07 \x01(\r\x12\x0f\n\x07\x62_state\x18\x08 \x01(\r\x12\x0f\n\x07io_done\x18\t \x01(\x05\x12\x15\n\rpages_written\x18\n \x01(\x05\"g\n!Ext4DaWritePagesExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\x04\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"^\n\x1c\x45xt4DirectIOEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x04\x12\n\n\x02rw\x18\x05 \x01(\x05\"j\n\x1b\x45xt4DirectIOExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x04\x12\n\n\x02rw\x18\x05 \x01(\x05\x12\x0b\n\x03ret\x18\x06 \x01(\x05\"G\n\x1c\x45xt4DiscardBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03\x62lk\x18\x02 \x01(\x04\x12\r\n\x05\x63ount\x18\x03 \x01(\x04\"]\n$Ext4DiscardPreallocationsFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03len\x18\x03 \x01(\r\x12\x0e\n\x06needed\x18\x04 \x01(\r\"B\n\x18\x45xt4DropInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04\x64rop\x18\x03 \x01(\x05\"q\n\x1c\x45xt4EsCacheExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0c\n\x04pblk\x18\x05 \x01(\x04\x12\x0e\n\x06status\x18\x06 \x01(\r\"V\n,Ext4EsFindDelayedExtentRangeEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\"\x80\x01\n+Ext4EsFindDelayedExtentRangeExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0c\n\x04pblk\x18\x05 \x01(\x04\x12\x0e\n\x06status\x18\x06 \x01(\x04\"r\n\x1d\x45xt4EsInsertExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0c\n\x04pblk\x18\x05 \x01(\x04\x12\x0e\n\x06status\x18\x06 \x01(\x04\"L\n\"Ext4EsLookupExtentEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\"\x85\x01\n!Ext4EsLookupExtentExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0c\n\x04pblk\x18\x05 \x01(\x04\x12\x0e\n\x06status\x18\x06 \x01(\x04\x12\r\n\x05\x66ound\x18\x07 \x01(\x05\"T\n\x1d\x45xt4EsRemoveExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\"q\n\x17\x45xt4EsShrinkFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x11\n\tnr_shrunk\x18\x02 \x01(\x05\x12\x11\n\tscan_time\x18\x03 \x01(\x04\x12\x12\n\nnr_skipped\x18\x04 \x01(\x05\x12\x0f\n\x07retried\x18\x05 \x01(\x05\"R\n\x1c\x45xt4EsShrinkCountFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x12\n\nnr_to_scan\x18\x02 \x01(\x05\x12\x11\n\tcache_cnt\x18\x03 \x01(\x05\"V\n Ext4EsShrinkScanEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x12\n\nnr_to_scan\x18\x02 \x01(\x05\x12\x11\n\tcache_cnt\x18\x03 \x01(\x05\"T\n\x1f\x45xt4EsShrinkScanExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x11\n\tnr_shrunk\x18\x02 \x01(\x05\x12\x11\n\tcache_cnt\x18\x03 \x01(\x05\"D\n\x19\x45xt4EvictInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05nlink\x18\x03 \x01(\x05\"\x95\x01\n+Ext4ExtConvertToInitializedEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06m_lblk\x18\x03 \x01(\r\x12\r\n\x05m_len\x18\x04 \x01(\r\x12\x0e\n\x06u_lblk\x18\x05 \x01(\r\x12\r\n\x05u_len\x18\x06 \x01(\r\x12\x0e\n\x06u_pblk\x18\x07 \x01(\x04\"\xc7\x01\n.Ext4ExtConvertToInitializedFastpathFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06m_lblk\x18\x03 \x01(\r\x12\r\n\x05m_len\x18\x04 \x01(\r\x12\x0e\n\x06u_lblk\x18\x05 \x01(\r\x12\r\n\x05u_len\x18\x06 \x01(\r\x12\x0e\n\x06u_pblk\x18\x07 \x01(\x04\x12\x0e\n\x06i_lblk\x18\x08 \x01(\r\x12\r\n\x05i_len\x18\t \x01(\r\x12\x0e\n\x06i_pblk\x18\n \x01(\x04\"\x9f\x01\n(Ext4ExtHandleUnwrittenExtentsFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x66lags\x18\x03 \x01(\x05\x12\x0c\n\x04lblk\x18\x04 \x01(\r\x12\x0c\n\x04pblk\x18\x05 \x01(\x04\x12\x0b\n\x03len\x18\x06 \x01(\r\x12\x11\n\tallocated\x18\x07 \x01(\r\x12\x0e\n\x06newblk\x18\x08 \x01(\x04\"P\n\x19\x45xt4ExtInCacheFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03ret\x18\x04 \x01(\x05\"T\n\x1c\x45xt4ExtLoadExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pblk\x18\x03 \x01(\x04\x12\x0c\n\x04lblk\x18\x04 \x01(\r\"f\n Ext4ExtMapBlocksEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"\x90\x01\n\x1f\x45xt4ExtMapBlocksExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x0c\n\x04pblk\x18\x04 \x01(\x04\x12\x0c\n\x04lblk\x18\x05 \x01(\r\x12\x0b\n\x03len\x18\x06 \x01(\r\x12\x0e\n\x06mflags\x18\x07 \x01(\r\x12\x0b\n\x03ret\x18\x08 \x01(\x05\"b\n\x1c\x45xt4ExtPutInCacheFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05start\x18\x05 \x01(\x04\"d\n\x1d\x45xt4ExtRemoveSpaceFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05start\x18\x03 \x01(\r\x12\x0b\n\x03\x65nd\x18\x04 \x01(\r\x12\r\n\x05\x64\x65pth\x18\x05 \x01(\x05\"\xc1\x01\n!Ext4ExtRemoveSpaceDoneFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05start\x18\x03 \x01(\r\x12\x0b\n\x03\x65nd\x18\x04 \x01(\r\x12\r\n\x05\x64\x65pth\x18\x05 \x01(\x05\x12\x0f\n\x07partial\x18\x06 \x01(\x03\x12\x12\n\neh_entries\x18\x07 \x01(\r\x12\x0f\n\x07pc_lblk\x18\x08 \x01(\r\x12\x0f\n\x07pc_pclu\x18\t \x01(\x04\x12\x10\n\x08pc_state\x18\n \x01(\x05\"A\n\x17\x45xt4ExtRmIdxFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pblk\x18\x03 \x01(\x04\"\xba\x01\n\x18\x45xt4ExtRmLeafFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0f\n\x07partial\x18\x03 \x01(\x03\x12\r\n\x05start\x18\x04 \x01(\r\x12\x0f\n\x07\x65\x65_lblk\x18\x05 \x01(\r\x12\x0f\n\x07\x65\x65_pblk\x18\x06 \x01(\x04\x12\x0e\n\x06\x65\x65_len\x18\x07 \x01(\x05\x12\x0f\n\x07pc_lblk\x18\x08 \x01(\r\x12\x0f\n\x07pc_pclu\x18\t \x01(\x04\x12\x10\n\x08pc_state\x18\n \x01(\x05\"a\n\x1c\x45xt4ExtShowExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pblk\x18\x03 \x01(\x04\x12\x0c\n\x04lblk\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\"q\n\x1d\x45xt4FallocateEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\x12\x0c\n\x04mode\x18\x05 \x01(\x05\x12\x0b\n\x03pos\x18\x06 \x01(\x03\"b\n\x1c\x45xt4FallocateExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0e\n\x06\x62locks\x18\x04 \x01(\r\x12\x0b\n\x03ret\x18\x05 \x01(\x05\"\x89\x01\n Ext4FindDelallocRangeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04\x66rom\x18\x03 \x01(\r\x12\n\n\x02to\x18\x04 \x01(\r\x12\x0f\n\x07reverse\x18\x05 \x01(\x05\x12\r\n\x05\x66ound\x18\x06 \x01(\x05\x12\x11\n\tfound_blk\x18\x07 \x01(\r\"c\n\x15\x45xt4ForgetFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x62lock\x18\x03 \x01(\x04\x12\x13\n\x0bis_metadata\x18\x04 \x01(\x05\x12\x0c\n\x04mode\x18\x05 \x01(\r\"p\n\x19\x45xt4FreeBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x62lock\x18\x03 \x01(\x04\x12\r\n\x05\x63ount\x18\x04 \x01(\x04\x12\r\n\x05\x66lags\x18\x05 \x01(\x05\x12\x0c\n\x04mode\x18\x06 \x01(\r\"l\n\x18\x45xt4FreeInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03uid\x18\x03 \x01(\r\x12\x0b\n\x03gid\x18\x04 \x01(\r\x12\x0e\n\x06\x62locks\x18\x05 \x01(\x04\x12\x0c\n\x04mode\x18\x06 \x01(\r\"}\n)Ext4GetImpliedClusterAllocExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0c\n\x04pblk\x18\x04 \x01(\x04\x12\x0b\n\x03len\x18\x05 \x01(\r\x12\x0b\n\x03ret\x18\x06 \x01(\x05\"]\n&Ext4GetReservedClusterAllocFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\"f\n Ext4IndMapBlocksEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"\x90\x01\n\x1f\x45xt4IndMapBlocksExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x0c\n\x04pblk\x18\x04 \x01(\x04\x12\x0c\n\x04lblk\x18\x05 \x01(\r\x12\x0b\n\x03len\x18\x06 \x01(\r\x12\x0e\n\x06mflags\x18\x07 \x01(\r\x12\x0b\n\x03ret\x18\x08 \x01(\x05\"S\n\x1a\x45xt4InsertRangeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\"h\n\x1d\x45xt4InvalidatepageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\x12\x0e\n\x06offset\x18\x04 \x01(\x04\x12\x0e\n\x06length\x18\x05 \x01(\r\"\x81\x01\n\x1b\x45xt4JournalStartFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\n\n\x02ip\x18\x02 \x01(\x04\x12\x0e\n\x06\x62locks\x18\x03 \x01(\x05\x12\x12\n\nrsv_blocks\x18\x04 \x01(\x05\x12\x0f\n\x07nblocks\x18\x05 \x01(\x05\x12\x14\n\x0crevoke_creds\x18\x06 \x01(\x05\"N\n#Ext4JournalStartReservedFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\n\n\x02ip\x18\x02 \x01(\x04\x12\x0e\n\x06\x62locks\x18\x03 \x01(\x05\"r\n\'Ext4JournalledInvalidatepageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\x12\x0e\n\x06offset\x18\x04 \x01(\x04\x12\x0e\n\x06length\x18\x05 \x01(\r\"g\n!Ext4JournalledWriteEndFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0e\n\x06\x63opied\x18\x05 \x01(\r\"4\n\x18\x45xt4LoadInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\"<\n\x1e\x45xt4LoadInodeBitmapFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05group\x18\x02 \x01(\r\"E\n\x1d\x45xt4MarkInodeDirtyFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\n\n\x02ip\x18\x03 \x01(\x04\"9\n\x1b\x45xt4MbBitmapLoadFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05group\x18\x02 \x01(\r\">\n Ext4MbBuddyBitmapLoadFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05group\x18\x02 \x01(\r\"E\n&Ext4MbDiscardPreallocationsFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06needed\x18\x02 \x01(\x05\"m\n\x1b\x45xt4MbNewGroupPaFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x11\n\tpa_pstart\x18\x03 \x01(\x04\x12\x11\n\tpa_lstart\x18\x04 \x01(\x04\x12\x0e\n\x06pa_len\x18\x05 \x01(\r\"m\n\x1b\x45xt4MbNewInodePaFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x11\n\tpa_pstart\x18\x03 \x01(\x04\x12\x11\n\tpa_lstart\x18\x04 \x01(\x04\x12\x0e\n\x06pa_len\x18\x05 \x01(\r\"Q\n\x1f\x45xt4MbReleaseGroupPaFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x11\n\tpa_pstart\x18\x02 \x01(\x04\x12\x0e\n\x06pa_len\x18\x03 \x01(\r\"Y\n\x1f\x45xt4MbReleaseInodePaFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x62lock\x18\x03 \x01(\x04\x12\r\n\x05\x63ount\x18\x04 \x01(\r\"\x86\x03\n\x1b\x45xt4MballocAllocFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x14\n\x0corig_logical\x18\x03 \x01(\r\x12\x12\n\norig_start\x18\x04 \x01(\x05\x12\x12\n\norig_group\x18\x05 \x01(\r\x12\x10\n\x08orig_len\x18\x06 \x01(\x05\x12\x14\n\x0cgoal_logical\x18\x07 \x01(\r\x12\x12\n\ngoal_start\x18\x08 \x01(\x05\x12\x12\n\ngoal_group\x18\t \x01(\r\x12\x10\n\x08goal_len\x18\n \x01(\x05\x12\x16\n\x0eresult_logical\x18\x0b \x01(\r\x12\x14\n\x0cresult_start\x18\x0c \x01(\x05\x12\x14\n\x0cresult_group\x18\r \x01(\r\x12\x12\n\nresult_len\x18\x0e \x01(\x05\x12\r\n\x05\x66ound\x18\x0f \x01(\r\x12\x0e\n\x06groups\x18\x10 \x01(\r\x12\r\n\x05\x62uddy\x18\x11 \x01(\r\x12\r\n\x05\x66lags\x18\x12 \x01(\r\x12\x0c\n\x04tail\x18\x13 \x01(\r\x12\n\n\x02\x63r\x18\x14 \x01(\r\"y\n\x1d\x45xt4MballocDiscardFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x14\n\x0cresult_start\x18\x03 \x01(\x05\x12\x14\n\x0cresult_group\x18\x04 \x01(\r\x12\x12\n\nresult_len\x18\x05 \x01(\x05\"v\n\x1a\x45xt4MballocFreeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x14\n\x0cresult_start\x18\x03 \x01(\x05\x12\x14\n\x0cresult_group\x18\x04 \x01(\r\x12\x12\n\nresult_len\x18\x05 \x01(\x05\"\xe2\x01\n\x1e\x45xt4MballocPreallocFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x14\n\x0corig_logical\x18\x03 \x01(\r\x12\x12\n\norig_start\x18\x04 \x01(\x05\x12\x12\n\norig_group\x18\x05 \x01(\r\x12\x10\n\x08orig_len\x18\x06 \x01(\x05\x12\x16\n\x0eresult_logical\x18\x07 \x01(\r\x12\x14\n\x0cresult_start\x18\x08 \x01(\x05\x12\x14\n\x0cresult_group\x18\t \x01(\r\x12\x12\n\nresult_len\x18\n \x01(\x05\"y\n#Ext4OtherInodeUpdateTimeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x10\n\x08orig_ino\x18\x03 \x01(\x04\x12\x0b\n\x03uid\x18\x04 \x01(\r\x12\x0b\n\x03gid\x18\x05 \x01(\r\x12\x0c\n\x04mode\x18\x06 \x01(\r\"_\n\x18\x45xt4PunchHoleFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\x12\x0c\n\x04mode\x18\x05 \x01(\x05\"R\n\"Ext4ReadBlockBitmapLoadFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05group\x18\x02 \x01(\r\x12\x10\n\x08prefetch\x18\x03 \x01(\r\"B\n\x17\x45xt4ReadpageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\"E\n\x1a\x45xt4ReleasepageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\"\xc8\x01\n\x1b\x45xt4RemoveBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04\x66rom\x18\x03 \x01(\r\x12\n\n\x02to\x18\x04 \x01(\r\x12\x0f\n\x07partial\x18\x05 \x01(\x03\x12\x0f\n\x07\x65\x65_pblk\x18\x06 \x01(\x04\x12\x0f\n\x07\x65\x65_lblk\x18\x07 \x01(\r\x12\x0e\n\x06\x65\x65_len\x18\x08 \x01(\r\x12\x0f\n\x07pc_lblk\x18\t \x01(\r\x12\x0f\n\x07pc_pclu\x18\n \x01(\x04\x12\x10\n\x08pc_state\x18\x0b \x01(\x05\"\xb1\x01\n\x1c\x45xt4RequestBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03len\x18\x03 \x01(\r\x12\x0f\n\x07logical\x18\x04 \x01(\r\x12\r\n\x05lleft\x18\x05 \x01(\r\x12\x0e\n\x06lright\x18\x06 \x01(\r\x12\x0c\n\x04goal\x18\x07 \x01(\x04\x12\r\n\x05pleft\x18\x08 \x01(\x04\x12\x0e\n\x06pright\x18\t \x01(\x04\x12\r\n\x05\x66lags\x18\n \x01(\r\"E\n\x1b\x45xt4RequestInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03\x64ir\x18\x02 \x01(\x04\x12\x0c\n\x04mode\x18\x03 \x01(\r\"2\n\x15\x45xt4SyncFsFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0c\n\x04wait\x18\x02 \x01(\x05\"m\n\x1a\x45xt4TrimAllFreeFtraceEvent\x12\x11\n\tdev_major\x18\x01 \x01(\x05\x12\x11\n\tdev_minor\x18\x02 \x01(\x05\x12\r\n\x05group\x18\x03 \x01(\r\x12\r\n\x05start\x18\x04 \x01(\x05\x12\x0b\n\x03len\x18\x05 \x01(\x05\"l\n\x19\x45xt4TrimExtentFtraceEvent\x12\x11\n\tdev_major\x18\x01 \x01(\x05\x12\x11\n\tdev_minor\x18\x02 \x01(\x05\x12\r\n\x05group\x18\x03 \x01(\r\x12\r\n\x05start\x18\x04 \x01(\x05\x12\x0b\n\x03len\x18\x05 \x01(\x05\"H\n\x1c\x45xt4TruncateEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06\x62locks\x18\x03 \x01(\x04\"G\n\x1b\x45xt4TruncateExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06\x62locks\x18\x03 \x01(\x04\"T\n\x1a\x45xt4UnlinkEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06parent\x18\x03 \x01(\x04\x12\x0c\n\x04size\x18\x04 \x01(\x03\"B\n\x19\x45xt4UnlinkExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"^\n\x19\x45xt4WriteBeginFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"]\n\x17\x45xt4WriteEndFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0e\n\x06\x63opied\x18\x05 \x01(\r\"C\n\x18\x45xt4WritepageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\"\xe0\x01\n\x19\x45xt4WritepagesFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x13\n\x0bnr_to_write\x18\x03 \x01(\x03\x12\x15\n\rpages_skipped\x18\x04 \x01(\x03\x12\x13\n\x0brange_start\x18\x05 \x01(\x03\x12\x11\n\trange_end\x18\x06 \x01(\x03\x12\x17\n\x0fwriteback_index\x18\x07 \x01(\x04\x12\x11\n\tsync_mode\x18\x08 \x01(\x05\x12\x13\n\x0b\x66or_kupdate\x18\t \x01(\r\x12\x14\n\x0crange_cyclic\x18\n \x01(\r\"\xa2\x01\n\x1f\x45xt4WritepagesResultFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\x12\x15\n\rpages_written\x18\x04 \x01(\x05\x12\x15\n\rpages_skipped\x18\x05 \x01(\x03\x12\x17\n\x0fwriteback_index\x18\x06 \x01(\x04\x12\x11\n\tsync_mode\x18\x07 \x01(\x05\"_\n\x18\x45xt4ZeroRangeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\x12\x0c\n\x04mode\x18\x05 \x01(\x05\"d\n\x1a\x46\x32\x66sDoSubmitBioFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05\x62type\x18\x02 \x01(\x05\x12\x0c\n\x04sync\x18\x03 \x01(\r\x12\x0e\n\x06sector\x18\x04 \x01(\x04\x12\x0c\n\x04size\x18\x05 \x01(\r\"\x8e\x01\n\x19\x46\x32\x66sEvictInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pino\x18\x03 \x01(\x04\x12\x0c\n\x04mode\x18\x04 \x01(\r\x12\x0c\n\x04size\x18\x05 \x01(\x03\x12\r\n\x05nlink\x18\x06 \x01(\r\x12\x0e\n\x06\x62locks\x18\x07 \x01(\x04\x12\x0e\n\x06\x61\x64vise\x18\x08 \x01(\r\"\x8a\x01\n\x18\x46\x32\x66sFallocateFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04mode\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x0b\n\x03len\x18\x05 \x01(\x03\x12\x0c\n\x04size\x18\x06 \x01(\x03\x12\x0e\n\x06\x62locks\x18\x07 \x01(\x04\x12\x0b\n\x03ret\x18\x08 \x01(\x05\"w\n\x1b\x46\x32\x66sGetDataBlockFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06iblock\x18\x03 \x01(\x04\x12\x10\n\x08\x62h_start\x18\x04 \x01(\x04\x12\x0f\n\x07\x62h_size\x18\x05 \x01(\x04\x12\x0b\n\x03ret\x18\x06 \x01(\x05\"\xce\x01\n\x18\x46\x32\x66sGetVictimFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0c\n\x04type\x18\x02 \x01(\x05\x12\x0f\n\x07gc_type\x18\x03 \x01(\x05\x12\x12\n\nalloc_mode\x18\x04 \x01(\x05\x12\x0f\n\x07gc_mode\x18\x05 \x01(\x05\x12\x0e\n\x06victim\x18\x06 \x01(\r\x12\x10\n\x08ofs_unit\x18\x07 \x01(\r\x12\x12\n\npre_victim\x18\x08 \x01(\r\x12\x0f\n\x07prefree\x18\t \x01(\r\x12\x0c\n\x04\x66ree\x18\n \x01(\r\x12\x0c\n\x04\x63ost\x18\x0b \x01(\r\"\x88\x01\n\x13\x46\x32\x66sIgetFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pino\x18\x03 \x01(\x04\x12\x0c\n\x04mode\x18\x04 \x01(\r\x12\x0c\n\x04size\x18\x05 \x01(\x03\x12\r\n\x05nlink\x18\x06 \x01(\r\x12\x0e\n\x06\x62locks\x18\x07 \x01(\x04\x12\x0e\n\x06\x61\x64vise\x18\x08 \x01(\r\"@\n\x17\x46\x32\x66sIgetExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"@\n\x17\x46\x32\x66sNewInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"\x8f\x01\n\x17\x46\x32\x66sReadpageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\x12\x0f\n\x07\x62lkaddr\x18\x04 \x01(\x04\x12\x0c\n\x04type\x18\x05 \x01(\x05\x12\x0b\n\x03\x64ir\x18\x06 \x01(\x05\x12\r\n\x05\x64irty\x18\x07 \x01(\x05\x12\x10\n\x08uptodate\x18\x08 \x01(\x05\"O\n\x1e\x46\x32\x66sReserveNewBlockFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03nid\x18\x02 \x01(\r\x12\x13\n\x0bofs_in_node\x18\x03 \x01(\r\"\x82\x01\n\x1b\x46\x32\x66sSetPageDirtyFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x0b\n\x03\x64ir\x18\x04 \x01(\x05\x12\r\n\x05index\x18\x05 \x01(\x04\x12\r\n\x05\x64irty\x18\x06 \x01(\x05\x12\x10\n\x08uptodate\x18\x07 \x01(\x05\"f\n\x1e\x46\x32\x66sSubmitWritePageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\r\n\x05index\x18\x04 \x01(\x04\x12\r\n\x05\x62lock\x18\x05 \x01(\r\"\x91\x01\n\x1c\x46\x32\x66sSyncFileEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pino\x18\x03 \x01(\x04\x12\x0c\n\x04mode\x18\x04 \x01(\r\x12\x0c\n\x04size\x18\x05 \x01(\x03\x12\r\n\x05nlink\x18\x06 \x01(\r\x12\x0e\n\x06\x62locks\x18\x07 \x01(\x04\x12\x0e\n\x06\x61\x64vise\x18\x08 \x01(\r\"z\n\x1b\x46\x32\x66sSyncFileExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0f\n\x07need_cp\x18\x03 \x01(\r\x12\x10\n\x08\x64\x61tasync\x18\x04 \x01(\x05\x12\x0b\n\x03ret\x18\x05 \x01(\x05\x12\x11\n\tcp_reason\x18\x06 \x01(\x05\"A\n\x15\x46\x32\x66sSyncFsFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05\x64irty\x18\x02 \x01(\x05\x12\x0c\n\x04wait\x18\x03 \x01(\x05\"\x8c\x01\n\x17\x46\x32\x66sTruncateFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pino\x18\x03 \x01(\x04\x12\x0c\n\x04mode\x18\x04 \x01(\r\x12\x0c\n\x04size\x18\x05 \x01(\x03\x12\r\n\x05nlink\x18\x06 \x01(\r\x12\x0e\n\x06\x62locks\x18\x07 \x01(\x04\x12\x0e\n\x06\x61\x64vise\x18\x08 \x01(\r\"j\n\"F2fsTruncateBlocksEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x03\x12\x0e\n\x06\x62locks\x18\x04 \x01(\x04\x12\x0c\n\x04\x66rom\x18\x05 \x01(\x04\"J\n!F2fsTruncateBlocksExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"j\n&F2fsTruncateDataBlocksRangeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03nid\x18\x03 \x01(\r\x12\x0b\n\x03ofs\x18\x04 \x01(\r\x12\x0c\n\x04\x66ree\x18\x05 \x01(\x05\"o\n\'F2fsTruncateInodeBlocksEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x03\x12\x0e\n\x06\x62locks\x18\x04 \x01(\x04\x12\x0c\n\x04\x66rom\x18\x05 \x01(\x04\"O\n&F2fsTruncateInodeBlocksExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"V\n\x1b\x46\x32\x66sTruncateNodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03nid\x18\x03 \x01(\r\x12\x10\n\x08\x62lk_addr\x18\x04 \x01(\r\"\\\n!F2fsTruncateNodesEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03nid\x18\x03 \x01(\r\x12\x10\n\x08\x62lk_addr\x18\x04 \x01(\r\"I\n F2fsTruncateNodesExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"h\n#F2fsTruncatePartialNodesFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03nid\x18\x03 \x01(\r\x12\r\n\x05\x64\x65pth\x18\x04 \x01(\x05\x12\x0b\n\x03\x65rr\x18\x05 \x01(\x05\"b\n\x1a\x46\x32\x66sUnlinkEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x03\x12\x0e\n\x06\x62locks\x18\x04 \x01(\x04\x12\x0c\n\x04name\x18\x05 \x01(\t\"B\n\x19\x46\x32\x66sUnlinkExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"\x83\x01\n\x1c\x46\x32\x66sVmPageMkwriteFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x0b\n\x03\x64ir\x18\x04 \x01(\x05\x12\r\n\x05index\x18\x05 \x01(\x04\x12\r\n\x05\x64irty\x18\x06 \x01(\x05\x12\x10\n\x08uptodate\x18\x07 \x01(\x05\"^\n\x19\x46\x32\x66sWriteBeginFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"l\n\x1e\x46\x32\x66sWriteCheckpointFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x11\n\tis_umount\x18\x02 \x01(\r\x12\x0b\n\x03msg\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\x05\x12\r\n\x05phase\x18\x05 \x01(\r\"]\n\x17\x46\x32\x66sWriteEndFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0e\n\x06\x63opied\x18\x05 \x01(\r\"\xa9\x03\n\x15\x46\x32\x66sIostatFtraceEvent\x12\x0f\n\x07\x61pp_bio\x18\x01 \x01(\x04\x12\x10\n\x08\x61pp_brio\x18\x02 \x01(\x04\x12\x0f\n\x07\x61pp_dio\x18\x03 \x01(\x04\x12\x10\n\x08\x61pp_drio\x18\x04 \x01(\x04\x12\x0f\n\x07\x61pp_mio\x18\x05 \x01(\x04\x12\x10\n\x08\x61pp_mrio\x18\x06 \x01(\x04\x12\x0f\n\x07\x61pp_rio\x18\x07 \x01(\x04\x12\x0f\n\x07\x61pp_wio\x18\x08 \x01(\x04\x12\x0b\n\x03\x64\x65v\x18\t \x01(\x04\x12\x10\n\x08\x66s_cdrio\x18\n \x01(\x04\x12\x11\n\tfs_cp_dio\x18\x0b \x01(\x04\x12\x11\n\tfs_cp_mio\x18\x0c \x01(\x04\x12\x11\n\tfs_cp_nio\x18\r \x01(\x04\x12\x0e\n\x06\x66s_dio\x18\x0e \x01(\x04\x12\x12\n\nfs_discard\x18\x0f \x01(\x04\x12\x0f\n\x07\x66s_drio\x18\x10 \x01(\x04\x12\x11\n\tfs_gc_dio\x18\x11 \x01(\x04\x12\x11\n\tfs_gc_nio\x18\x12 \x01(\x04\x12\x10\n\x08\x66s_gdrio\x18\x13 \x01(\x04\x12\x0e\n\x06\x66s_mio\x18\x14 \x01(\x04\x12\x0f\n\x07\x66s_mrio\x18\x15 \x01(\x04\x12\x0e\n\x06\x66s_nio\x18\x16 \x01(\x04\x12\x0f\n\x07\x66s_nrio\x18\x17 \x01(\x04\"\xc7\x04\n\x1c\x46\x32\x66sIostatLatencyFtraceEvent\x12\x10\n\x08\x64_rd_avg\x18\x01 \x01(\r\x12\x10\n\x08\x64_rd_cnt\x18\x02 \x01(\r\x12\x11\n\td_rd_peak\x18\x03 \x01(\r\x12\x13\n\x0b\x64_wr_as_avg\x18\x04 \x01(\r\x12\x13\n\x0b\x64_wr_as_cnt\x18\x05 \x01(\r\x12\x14\n\x0c\x64_wr_as_peak\x18\x06 \x01(\r\x12\x12\n\nd_wr_s_avg\x18\x07 \x01(\r\x12\x12\n\nd_wr_s_cnt\x18\x08 \x01(\r\x12\x13\n\x0b\x64_wr_s_peak\x18\t \x01(\r\x12\x0b\n\x03\x64\x65v\x18\n \x01(\x04\x12\x10\n\x08m_rd_avg\x18\x0b \x01(\r\x12\x10\n\x08m_rd_cnt\x18\x0c \x01(\r\x12\x11\n\tm_rd_peak\x18\r \x01(\r\x12\x13\n\x0bm_wr_as_avg\x18\x0e \x01(\r\x12\x13\n\x0bm_wr_as_cnt\x18\x0f \x01(\r\x12\x14\n\x0cm_wr_as_peak\x18\x10 \x01(\r\x12\x12\n\nm_wr_s_avg\x18\x11 \x01(\r\x12\x12\n\nm_wr_s_cnt\x18\x12 \x01(\r\x12\x13\n\x0bm_wr_s_peak\x18\x13 \x01(\r\x12\x10\n\x08n_rd_avg\x18\x14 \x01(\r\x12\x10\n\x08n_rd_cnt\x18\x15 \x01(\r\x12\x11\n\tn_rd_peak\x18\x16 \x01(\r\x12\x13\n\x0bn_wr_as_avg\x18\x17 \x01(\r\x12\x13\n\x0bn_wr_as_cnt\x18\x18 \x01(\r\x12\x14\n\x0cn_wr_as_peak\x18\x19 \x01(\r\x12\x12\n\nn_wr_s_avg\x18\x1a \x01(\r\x12\x12\n\nn_wr_s_cnt\x18\x1b \x01(\r\x12\x13\n\x0bn_wr_s_peak\x18\x1c \x01(\r\"Z\n\x1b\x46\x32\x66sBackgroundGcFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0f\n\x07wait_ms\x18\x02 \x01(\r\x12\x0f\n\x07prefree\x18\x03 \x01(\r\x12\x0c\n\x04\x66ree\x18\x04 \x01(\r\"\x8e\x02\n\x16\x46\x32\x66sGcBeginFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0c\n\x04sync\x18\x02 \x01(\r\x12\x12\n\nbackground\x18\x03 \x01(\r\x12\x13\n\x0b\x64irty_nodes\x18\x04 \x01(\x03\x12\x13\n\x0b\x64irty_dents\x18\x05 \x01(\x03\x12\x13\n\x0b\x64irty_imeta\x18\x06 \x01(\x03\x12\x10\n\x08\x66ree_sec\x18\x07 \x01(\r\x12\x10\n\x08\x66ree_seg\x18\x08 \x01(\r\x12\x14\n\x0creserved_seg\x18\t \x01(\x05\x12\x13\n\x0bprefree_seg\x18\n \x01(\r\x12\x0f\n\x07gc_type\x18\x0b \x01(\x05\x12\x10\n\x08no_bg_gc\x18\x0c \x01(\r\x12\x14\n\x0cnr_free_secs\x18\r \x01(\r\"\xe4\x01\n\x14\x46\x32\x66sGcEndFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ret\x18\x02 \x01(\x05\x12\x11\n\tseg_freed\x18\x03 \x01(\x05\x12\x11\n\tsec_freed\x18\x04 \x01(\x05\x12\x13\n\x0b\x64irty_nodes\x18\x05 \x01(\x03\x12\x13\n\x0b\x64irty_dents\x18\x06 \x01(\x03\x12\x13\n\x0b\x64irty_imeta\x18\x07 \x01(\x03\x12\x10\n\x08\x66ree_sec\x18\x08 \x01(\r\x12\x10\n\x08\x66ree_seg\x18\t \x01(\r\x12\x14\n\x0creserved_seg\x18\n \x01(\x05\x12\x13\n\x0bprefree_seg\x18\x0b \x01(\r\"\x92\x02\n\x1e\x46\x32\x66sLockElapsedTimeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\x12\x0b\n\x03pid\x18\x03 \x01(\x05\x12\x0c\n\x04prio\x18\x04 \x01(\x05\x12\x14\n\x0cioprio_class\x18\x05 \x01(\x05\x12\x13\n\x0bioprio_data\x18\x06 \x01(\x05\x12\x11\n\tlock_name\x18\x07 \x01(\r\x12\x10\n\x08is_write\x18\x08 \x01(\r\x12\x12\n\ntotal_time\x18\t \x01(\x04\x12\x14\n\x0crunning_time\x18\n \x01(\x04\x12\x15\n\rrunnable_time\x18\x0b \x01(\x04\x12\x15\n\rio_sleep_time\x18\x0c \x01(\x04\x12\x12\n\nother_time\x18\r \x01(\x04\"N\n\x19\x46\x61strpcDmaStatFtraceEvent\x12\x0b\n\x03\x63id\x18\x01 \x01(\x05\x12\x0b\n\x03len\x18\x02 \x01(\x03\x12\x17\n\x0ftotal_allocated\x18\x03 \x01(\x04\"D\n\x19\x46\x61strpcDmaFreeFtraceEvent\x12\x0b\n\x03\x63id\x18\x01 \x01(\x05\x12\x0c\n\x04phys\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x04\"c\n\x1a\x46\x61strpcDmaAllocFtraceEvent\x12\x0b\n\x03\x63id\x18\x01 \x01(\x05\x12\x0c\n\x04phys\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x04\x12\x0c\n\x04\x61ttr\x18\x04 \x01(\x04\x12\x0e\n\x06mflags\x18\x05 \x01(\x05\"E\n\x1a\x46\x61strpcDmaUnmapFtraceEvent\x12\x0b\n\x03\x63id\x18\x01 \x01(\x05\x12\x0c\n\x04phys\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x04\"z\n\x18\x46\x61strpcDmaMapFtraceEvent\x12\x0b\n\x03\x63id\x18\x01 \x01(\x05\x12\n\n\x02\x66\x64\x18\x02 \x01(\x05\x12\x0c\n\x04phys\x18\x03 \x01(\x04\x12\x0c\n\x04size\x18\x04 \x01(\x04\x12\x0b\n\x03len\x18\x05 \x01(\x04\x12\x0c\n\x04\x61ttr\x18\x06 \x01(\r\x12\x0e\n\x06mflags\x18\x07 \x01(\x05\"X\n\x14\x46\x65nceInitFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"[\n\x17\x46\x65nceDestroyFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"`\n\x1c\x46\x65nceEnableSignalFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"\\\n\x18\x46\x65nceSignaledFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"l\n\"MmFilemapAddToPageCacheFtraceEvent\x12\x0b\n\x03pfn\x18\x01 \x01(\x04\x12\r\n\x05i_ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\x12\r\n\x05s_dev\x18\x04 \x01(\x04\x12\x0c\n\x04page\x18\x05 \x01(\x04\"q\n\'MmFilemapDeleteFromPageCacheFtraceEvent\x12\x0b\n\x03pfn\x18\x01 \x01(\x04\x12\r\n\x05i_ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\x12\r\n\x05s_dev\x18\x04 \x01(\x04\x12\x0c\n\x04page\x18\x05 \x01(\x04\"E\n\x14\x44oSysOpenFtraceEvent\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\r\n\x05\x66lags\x18\x02 \x01(\x05\x12\x0c\n\x04mode\x18\x03 \x01(\x05\"\'\n\x13OpenExecFtraceEvent\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\"+\n\x10PrintFtraceEvent\x12\n\n\x02ip\x18\x01 \x01(\x04\x12\x0b\n\x03\x62uf\x18\x02 \x01(\t\"8\n\x19\x46uncgraphEntryFtraceEvent\x12\r\n\x05\x64\x65pth\x18\x01 \x01(\x05\x12\x0c\n\x04\x66unc\x18\x02 \x01(\x04\"k\n\x18\x46uncgraphExitFtraceEvent\x12\x10\n\x08\x63\x61lltime\x18\x01 \x01(\x04\x12\r\n\x05\x64\x65pth\x18\x02 \x01(\x05\x12\x0c\n\x04\x66unc\x18\x03 \x01(\x04\x12\x0f\n\x07overrun\x18\x04 \x01(\x04\x12\x0f\n\x07rettime\x18\x05 \x01(\x04\"t\n\x1e\x46wtpPerfettoCounterFtraceEvent\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x10\n\x08track_id\x18\x02 \x01(\r\x12\x10\n\x08\x63\x61tegory\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\r\"r\n\x1c\x46wtpPerfettoSliceFtraceEvent\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x10\n\x08track_id\x18\x02 \x01(\r\x12\x10\n\x08\x63\x61tegory\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\r\n\x05\x62\x65gin\x18\x05 \x01(\r\"X\n\x1eG2dTracingMarkWriteFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0c\n\x04type\x18\x05 \x01(\r\x12\r\n\x05value\x18\x06 \x01(\x05\"\xc2\x01\n\x12GenericFtraceEvent\x12\x12\n\nevent_name\x18\x01 \x01(\t\x12\x38\n\x05\x66ield\x18\x02 \x03(\x0b\x32).perfetto.protos.GenericFtraceEvent.Field\x1a^\n\x05\x46ield\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\tstr_value\x18\x03 \x01(\tH\x00\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x00\x12\x14\n\nuint_value\x18\x05 \x01(\x04H\x00\x42\x07\n\x05value\"\xbe\x01\n\x0bKprobeEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x35\n\x04type\x18\x02 \x01(\x0e\x32\'.perfetto.protos.KprobeEvent.KprobeType\"j\n\nKprobeType\x12\x17\n\x13KPROBE_TYPE_UNKNOWN\x10\x00\x12\x15\n\x11KPROBE_TYPE_BEGIN\x10\x01\x12\x13\n\x0fKPROBE_TYPE_END\x10\x02\x12\x17\n\x13KPROBE_TYPE_INSTANT\x10\x03\"=\n\x19GoogleIccEventFtraceEvent\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\"=\n\x19GoogleIrmEventFtraceEvent\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\"C\n\x16GpuMemTotalFtraceEvent\x12\x0e\n\x06gpu_id\x18\x01 \x01(\r\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x0c\n\x04size\x18\x03 \x01(\x04\"z\n\x16\x44rmSchedJobFtraceEvent\x12\x0e\n\x06\x65ntity\x18\x01 \x01(\x04\x12\r\n\x05\x66\x65nce\x18\x02 \x01(\x04\x12\x14\n\x0chw_job_count\x18\x03 \x01(\x05\x12\n\n\x02id\x18\x04 \x01(\x04\x12\x11\n\tjob_count\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\"x\n\x14\x44rmRunJobFtraceEvent\x12\x0e\n\x06\x65ntity\x18\x01 \x01(\x04\x12\r\n\x05\x66\x65nce\x18\x02 \x01(\x04\x12\x14\n\x0chw_job_count\x18\x03 \x01(\x05\x12\n\n\x02id\x18\x04 \x01(\x04\x12\x11\n\tjob_count\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\".\n\x1d\x44rmSchedProcessJobFtraceEvent\x12\r\n\x05\x66\x65nce\x18\x01 \x01(\x04\"f\n\x1c\x44rmSchedJobAddDepFtraceEvent\x12\x15\n\rfence_context\x18\x01 \x01(\x04\x12\x13\n\x0b\x66\x65nce_seqno\x18\x02 \x01(\x04\x12\x0b\n\x03\x63tx\x18\x03 \x01(\x04\x12\r\n\x05seqno\x18\x04 \x01(\x04\"H\n\x1a\x44rmSchedJobDoneFtraceEvent\x12\x15\n\rfence_context\x18\x01 \x01(\x04\x12\x13\n\x0b\x66\x65nce_seqno\x18\x02 \x01(\x04\"\xa0\x01\n\x1b\x44rmSchedJobQueueFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tjob_count\x18\x02 \x01(\r\x12\x14\n\x0chw_job_count\x18\x03 \x01(\x05\x12\x0b\n\x03\x64\x65v\x18\x04 \x01(\t\x12\x15\n\rfence_context\x18\x05 \x01(\x04\x12\x13\n\x0b\x66\x65nce_seqno\x18\x06 \x01(\x04\x12\x11\n\tclient_id\x18\x07 \x01(\x04\"\x9e\x01\n\x19\x44rmSchedJobRunFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tjob_count\x18\x02 \x01(\r\x12\x14\n\x0chw_job_count\x18\x03 \x01(\x05\x12\x0b\n\x03\x64\x65v\x18\x04 \x01(\t\x12\x15\n\rfence_context\x18\x05 \x01(\x04\x12\x13\n\x0b\x66\x65nce_seqno\x18\x06 \x01(\x04\x12\x11\n\tclient_id\x18\x07 \x01(\x04\"m\n#DrmSchedJobUnschedulableFtraceEvent\x12\x15\n\rfence_context\x18\x01 \x01(\x04\x12\x13\n\x0b\x66\x65nce_seqno\x18\x02 \x01(\x04\x12\x0b\n\x03\x63tx\x18\x03 \x01(\x04\x12\r\n\x05seqno\x18\x04 \x01(\x04\"\x15\n\x13HypEnterFtraceEvent\"\x14\n\x12HypExitFtraceEvent\"3\n\x14HostHcallFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x0f\n\x07invalid\x18\x02 \x01(\r\"3\n\x12HostSmcFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x11\n\tforwarded\x18\x02 \x01(\r\"4\n\x17HostMemAbortFtraceEvent\x12\x0b\n\x03\x65sr\x18\x01 \x01(\x04\x12\x0c\n\x04\x61\x64\x64r\x18\x02 \x01(\x04\"\x87\x01\n\x16HostFfaCallFtraceEvent\x12\x0f\n\x07\x66unc_id\x18\x01 \x01(\x04\x12\x0e\n\x06res_a1\x18\x02 \x01(\x04\x12\x0e\n\x06res_a2\x18\x03 \x01(\x04\x12\x0e\n\x06res_a3\x18\x04 \x01(\x04\x12\x0e\n\x06res_a4\x18\x05 \x01(\x04\x12\x0f\n\x07handled\x18\x06 \x01(\x05\x12\x0b\n\x03\x65rr\x18\x07 \x01(\x05\"?\n\x15IommuIdmapFtraceEvent\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x04\x12\n\n\x02to\x18\x02 \x01(\x04\x12\x0c\n\x04prot\x18\x03 \x01(\x05\"7\n\x19PsciMemProtectFtraceEvent\x12\r\n\x05\x63ount\x18\x01 \x01(\x04\x12\x0b\n\x03was\x18\x02 \x01(\x04\"=\n\x1eHypervisorHostHcallFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x0f\n\x07invalid\x18\x02 \x01(\r\"=\n\x1cHypervisorHostSmcFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x11\n\tforwarded\x18\x02 \x01(\r\"\x1e\n\x1cHypervisorHypExitFtraceEvent\"I\n\x1fHypervisorIommuIdmapFtraceEvent\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x04\x12\n\n\x02to\x18\x02 \x01(\x04\x12\x0c\n\x04prot\x18\x03 \x01(\x05\"A\n#HypervisorPsciMemProtectFtraceEvent\x12\r\n\x05\x63ount\x18\x01 \x01(\x04\x12\x0b\n\x03was\x18\x02 \x01(\x04\">\n!HypervisorHostMemAbortFtraceEvent\x12\x0b\n\x03\x65sr\x18\x01 \x01(\x04\x12\x0c\n\x04\x61\x64\x64r\x18\x02 \x01(\x04\"\x1f\n\x1dHypervisorHypEnterFtraceEvent\"6\n\'HypervisorIommuIdmapCompleteFtraceEvent\x12\x0b\n\x03map\x18\x01 \x01(\r\"3\n$HypervisorVcpuIllegalTrapFtraceEvent\x12\x0b\n\x03\x65sr\x18\x01 \x01(\x04\"b\n\x12I2cReadFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0e\n\x06msg_nr\x18\x02 \x01(\r\x12\x0c\n\x04\x61\x64\x64r\x18\x03 \x01(\r\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\"p\n\x13I2cWriteFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0e\n\x06msg_nr\x18\x02 \x01(\r\x12\x0c\n\x04\x61\x64\x64r\x18\x03 \x01(\r\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\x12\x0b\n\x03\x62uf\x18\x07 \x01(\x0c\"H\n\x14I2cResultFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0f\n\x07nr_msgs\x18\x02 \x01(\r\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"p\n\x13I2cReplyFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0e\n\x06msg_nr\x18\x02 \x01(\r\x12\x0c\n\x04\x61\x64\x64r\x18\x03 \x01(\r\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\x12\x0b\n\x03\x62uf\x18\x07 \x01(\x0c\"j\n\x14SmbusReadFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\x0c\n\x04\x61\x64\x64r\x18\x03 \x01(\r\x12\x0f\n\x07\x63ommand\x18\x04 \x01(\r\x12\x10\n\x08protocol\x18\x05 \x01(\r\"x\n\x15SmbusWriteFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0c\n\x04\x61\x64\x64r\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x0f\n\x07\x63ommand\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\x12\x10\n\x08protocol\x18\x06 \x01(\r\"\x8d\x01\n\x16SmbusResultFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0c\n\x04\x61\x64\x64r\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x12\n\nread_write\x18\x04 \x01(\r\x12\x0f\n\x07\x63ommand\x18\x05 \x01(\r\x12\x0b\n\x03res\x18\x06 \x01(\x05\x12\x10\n\x08protocol\x18\x07 \x01(\r\"x\n\x15SmbusReplyFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0c\n\x04\x61\x64\x64r\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x0f\n\x07\x63ommand\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\x12\x10\n\x08protocol\x18\x06 \x01(\r\"M\n\x12IonStatFtraceEvent\x12\x11\n\tbuffer_id\x18\x01 \x01(\r\x12\x0b\n\x03len\x18\x02 \x01(\x03\x12\x17\n\x0ftotal_allocated\x18\x03 \x01(\x04\"%\n\x13IpiEntryFtraceEvent\x12\x0e\n\x06reason\x18\x01 \x01(\t\"$\n\x12IpiExitFtraceEvent\x12\x0e\n\x06reason\x18\x01 \x01(\t\":\n\x13IpiRaiseFtraceEvent\x12\x13\n\x0btarget_cpus\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"&\n\x17SoftirqEntryFtraceEvent\x12\x0b\n\x03vec\x18\x01 \x01(\r\"%\n\x16SoftirqExitFtraceEvent\x12\x0b\n\x03vec\x18\x01 \x01(\r\"&\n\x17SoftirqRaiseFtraceEvent\x12\x0b\n\x03vec\x18\x01 \x01(\r\"H\n\x1aIrqHandlerEntryFtraceEvent\x12\x0b\n\x03irq\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07handler\x18\x03 \x01(\r\"5\n\x19IrqHandlerExitFtraceEvent\x12\x0b\n\x03irq\x18\x01 \x01(\x05\x12\x0b\n\x03ret\x18\x02 \x01(\x05\",\n\x1aLocalTimerEntryFtraceEvent\x12\x0e\n\x06vector\x18\x01 \x01(\x05\"+\n\x19LocalTimerExitFtraceEvent\x12\x0e\n\x06vector\x18\x01 \x01(\x05\"?\n\x1bKgslGpuFrequencyFtraceEvent\x12\x10\n\x08gpu_freq\x18\x01 \x01(\r\x12\x0e\n\x06gpu_id\x18\x02 \x01(\r\"q\n#KgslAdrenoCmdbatchQueuedFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\r\x12\x0e\n\x06queued\x18\x03 \x01(\r\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0c\n\x04prio\x18\x05 \x01(\r\"\xf9\x01\n&KgslAdrenoCmdbatchSubmittedFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\r\x12\x10\n\x08inflight\x18\x03 \x01(\x03\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\r\n\x05ticks\x18\x05 \x01(\x04\x12\x0c\n\x04secs\x18\x06 \x01(\x04\x12\r\n\x05usecs\x18\x07 \x01(\x04\x12\x0c\n\x04prio\x18\x08 \x01(\x05\x12\r\n\x05rb_id\x18\t \x01(\x05\x12\x0c\n\x04rptr\x18\n \x01(\r\x12\x0c\n\x04wptr\x18\x0b \x01(\r\x12\x12\n\nq_inflight\x18\x0c \x01(\x05\x12\x16\n\x0e\x64ispatch_queue\x18\r \x01(\x05\"_\n!KgslAdrenoCmdbatchSyncFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\r\x12\r\n\x05ticks\x18\x03 \x01(\x04\x12\x0c\n\x04prio\x18\x04 \x01(\x05\"\xd5\x02\n$KgslAdrenoCmdbatchRetiredFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\r\x12\x10\n\x08inflight\x18\x03 \x01(\x03\x12\x10\n\x08recovery\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\x12\r\n\x05start\x18\x06 \x01(\x04\x12\x0e\n\x06retire\x18\x07 \x01(\x04\x12\x0c\n\x04prio\x18\x08 \x01(\x05\x12\r\n\x05rb_id\x18\t \x01(\x05\x12\x0c\n\x04rptr\x18\n \x01(\r\x12\x0c\n\x04wptr\x18\x0b \x01(\r\x12\x12\n\nq_inflight\x18\x0c \x01(\x05\x12\x16\n\x0e\x66\x61ult_recovery\x18\r \x01(\x04\x12\x16\n\x0e\x64ispatch_queue\x18\x0e \x01(\r\x12\x17\n\x0fsubmitted_to_rb\x18\x0f \x01(\x04\x12\x16\n\x0eretired_on_gmu\x18\x10 \x01(\x04\x12\x0e\n\x06\x61\x63tive\x18\x11 \x01(\x04\"A\n\x1d\x41llocPagesIommuEndFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"B\n\x1e\x41llocPagesIommuFailFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"C\n\x1f\x41llocPagesIommuStartFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"?\n\x1b\x41llocPagesSysEndFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"@\n\x1c\x41llocPagesSysFailFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"A\n\x1d\x41llocPagesSysStartFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"3\n\"DmaAllocContiguousRetryFtraceEvent\x12\r\n\x05tries\x18\x01 \x01(\x05\"S\n\x18IommuMapRangeFtraceEvent\x12\x12\n\nchunk_size\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\n\n\x02pa\x18\x03 \x01(\x04\x12\n\n\x02va\x18\x04 \x01(\x04\"f\n\"IommuSecPtblMapRangeEndFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\x04\x12\x0b\n\x03num\x18\x02 \x01(\x05\x12\n\n\x02pa\x18\x03 \x01(\r\x12\x0e\n\x06sec_id\x18\x04 \x01(\x05\x12\n\n\x02va\x18\x05 \x01(\x04\"h\n$IommuSecPtblMapRangeStartFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\x04\x12\x0b\n\x03num\x18\x02 \x01(\x05\x12\n\n\x02pa\x18\x03 \x01(\r\x12\x0e\n\x06sec_id\x18\x04 \x01(\x05\x12\n\n\x02va\x18\x05 \x01(\x04\"p\n\x1cIonAllocBufferEndFtraceEvent\x12\x13\n\x0b\x63lient_name\x18\x01 \x01(\t\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\x12\x0c\n\x04mask\x18\x05 \x01(\r\"\x80\x01\n\x1dIonAllocBufferFailFtraceEvent\x12\x13\n\x0b\x63lient_name\x18\x01 \x01(\t\x12\r\n\x05\x65rror\x18\x02 \x01(\x03\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x11\n\theap_name\x18\x04 \x01(\t\x12\x0b\n\x03len\x18\x05 \x01(\x04\x12\x0c\n\x04mask\x18\x06 \x01(\r\"\x84\x01\n!IonAllocBufferFallbackFtraceEvent\x12\x13\n\x0b\x63lient_name\x18\x01 \x01(\t\x12\r\n\x05\x65rror\x18\x02 \x01(\x03\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x11\n\theap_name\x18\x04 \x01(\t\x12\x0b\n\x03len\x18\x05 \x01(\x04\x12\x0c\n\x04mask\x18\x06 \x01(\r\"r\n\x1eIonAllocBufferStartFtraceEvent\x12\x13\n\x0b\x63lient_name\x18\x01 \x01(\t\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\x12\x0c\n\x04mask\x18\x05 \x01(\r\"+\n\x1aIonCpAllocRetryFtraceEvent\x12\r\n\x05tries\x18\x01 \x01(\x05\"_\n\x1fIonCpSecureBufferEndFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\x04\x12\r\n\x05\x66lags\x18\x02 \x01(\x04\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\"a\n!IonCpSecureBufferStartFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\x04\x12\r\n\x05\x66lags\x18\x02 \x01(\x04\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\"(\n\x19IonPrefetchingFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\x04\"[\n#IonSecureCmaAddToPoolEndFtraceEvent\x12\x13\n\x0bis_prefetch\x18\x01 \x01(\r\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\x12\n\npool_total\x18\x03 \x01(\x05\"]\n%IonSecureCmaAddToPoolStartFtraceEvent\x12\x13\n\x0bis_prefetch\x18\x01 \x01(\r\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\x12\n\npool_total\x18\x03 \x01(\x05\"b\n\"IonSecureCmaAllocateEndFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\x04\x12\r\n\x05\x66lags\x18\x02 \x01(\x04\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\"d\n$IonSecureCmaAllocateStartFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\x04\x12\r\n\x05\x66lags\x18\x02 \x01(\x04\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\"R\n$IonSecureCmaShrinkPoolEndFtraceEvent\x12\x14\n\x0c\x64rained_size\x18\x01 \x01(\x04\x12\x14\n\x0cskipped_size\x18\x02 \x01(\x04\"T\n&IonSecureCmaShrinkPoolStartFtraceEvent\x12\x14\n\x0c\x64rained_size\x18\x01 \x01(\x04\x12\x14\n\x0cskipped_size\x18\x02 \x01(\x04\"2\n\x10KfreeFtraceEvent\x12\x11\n\tcall_site\x18\x01 \x01(\x04\x12\x0b\n\x03ptr\x18\x02 \x01(\x04\"o\n\x12KmallocFtraceEvent\x12\x13\n\x0b\x62ytes_alloc\x18\x01 \x01(\x04\x12\x11\n\tbytes_req\x18\x02 \x01(\x04\x12\x11\n\tcall_site\x18\x03 \x01(\x04\x12\x11\n\tgfp_flags\x18\x04 \x01(\r\x12\x0b\n\x03ptr\x18\x05 \x01(\x04\"\x81\x01\n\x16KmallocNodeFtraceEvent\x12\x13\n\x0b\x62ytes_alloc\x18\x01 \x01(\x04\x12\x11\n\tbytes_req\x18\x02 \x01(\x04\x12\x11\n\tcall_site\x18\x03 \x01(\x04\x12\x11\n\tgfp_flags\x18\x04 \x01(\r\x12\x0c\n\x04node\x18\x05 \x01(\x05\x12\x0b\n\x03ptr\x18\x06 \x01(\x04\"v\n\x19KmemCacheAllocFtraceEvent\x12\x13\n\x0b\x62ytes_alloc\x18\x01 \x01(\x04\x12\x11\n\tbytes_req\x18\x02 \x01(\x04\x12\x11\n\tcall_site\x18\x03 \x01(\x04\x12\x11\n\tgfp_flags\x18\x04 \x01(\r\x12\x0b\n\x03ptr\x18\x05 \x01(\x04\"\x88\x01\n\x1dKmemCacheAllocNodeFtraceEvent\x12\x13\n\x0b\x62ytes_alloc\x18\x01 \x01(\x04\x12\x11\n\tbytes_req\x18\x02 \x01(\x04\x12\x11\n\tcall_site\x18\x03 \x01(\x04\x12\x11\n\tgfp_flags\x18\x04 \x01(\r\x12\x0c\n\x04node\x18\x05 \x01(\x05\x12\x0b\n\x03ptr\x18\x06 \x01(\x04\":\n\x18KmemCacheFreeFtraceEvent\x12\x11\n\tcall_site\x18\x01 \x01(\x04\x12\x0b\n\x03ptr\x18\x02 \x01(\x04\"*\n\x1aMigratePagesEndFtraceEvent\x12\x0c\n\x04mode\x18\x01 \x01(\x05\",\n\x1cMigratePagesStartFtraceEvent\x12\x0c\n\x04mode\x18\x01 \x01(\x05\"(\n\x17MigrateRetryFtraceEvent\x12\r\n\x05tries\x18\x01 \x01(\x05\"j\n\x16MmPageAllocFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\x13\n\x0bmigratetype\x18\x02 \x01(\x05\x12\r\n\x05order\x18\x03 \x01(\r\x12\x0c\n\x04page\x18\x04 \x01(\x04\x12\x0b\n\x03pfn\x18\x05 \x01(\x04\"\xba\x01\n\x1dMmPageAllocExtfragFtraceEvent\x12\x19\n\x11\x61lloc_migratetype\x18\x01 \x01(\x05\x12\x13\n\x0b\x61lloc_order\x18\x02 \x01(\x05\x12\x1c\n\x14\x66\x61llback_migratetype\x18\x03 \x01(\x05\x12\x16\n\x0e\x66\x61llback_order\x18\x04 \x01(\x05\x12\x0c\n\x04page\x18\x05 \x01(\x04\x12\x18\n\x10\x63hange_ownership\x18\x06 \x01(\x05\x12\x0b\n\x03pfn\x18\x07 \x01(\x04\"a\n MmPageAllocZoneLockedFtraceEvent\x12\x13\n\x0bmigratetype\x18\x01 \x01(\x05\x12\r\n\x05order\x18\x02 \x01(\r\x12\x0c\n\x04page\x18\x03 \x01(\x04\x12\x0b\n\x03pfn\x18\x04 \x01(\x04\"A\n\x15MmPageFreeFtraceEvent\x12\r\n\x05order\x18\x01 \x01(\r\x12\x0c\n\x04page\x18\x02 \x01(\x04\x12\x0b\n\x03pfn\x18\x03 \x01(\x04\"G\n\x1cMmPageFreeBatchedFtraceEvent\x12\x0c\n\x04\x63old\x18\x01 \x01(\x05\x12\x0c\n\x04page\x18\x02 \x01(\x04\x12\x0b\n\x03pfn\x18\x03 \x01(\x04\"[\n\x1aMmPagePcpuDrainFtraceEvent\x12\x13\n\x0bmigratetype\x18\x01 \x01(\x05\x12\r\n\x05order\x18\x02 \x01(\r\x12\x0c\n\x04page\x18\x03 \x01(\x04\x12\x0b\n\x03pfn\x18\x04 \x01(\x04\"O\n\x12RssStatFtraceEvent\x12\x0e\n\x06member\x18\x01 \x01(\x05\x12\x0c\n\x04size\x18\x02 \x01(\x03\x12\x0c\n\x04\x63urr\x18\x03 \x01(\r\x12\r\n\x05mm_id\x18\x04 \x01(\r\"S\n\x18IonHeapShrinkFtraceEvent\x12\x11\n\theap_name\x18\x01 \x01(\t\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\x17\n\x0ftotal_allocated\x18\x03 \x01(\x03\"Q\n\x16IonHeapGrowFtraceEvent\x12\x11\n\theap_name\x18\x01 \x01(\t\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\x17\n\x0ftotal_allocated\x18\x03 \x01(\x03\"7\n\x1aIonBufferCreateFtraceEvent\x12\x0c\n\x04\x61\x64\x64r\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\x04\"8\n\x1bIonBufferDestroyFtraceEvent\x12\x0c\n\x04\x61\x64\x64r\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\x04\"\x99\x01\n(MmAllocContigMigrateRangeInfoFtraceEvent\x12\r\n\x05start\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\x12\x13\n\x0bnr_migrated\x18\x03 \x01(\x04\x12\x14\n\x0cnr_reclaimed\x18\x04 \x01(\x04\x12\x11\n\tnr_mapped\x18\x05 \x01(\x04\x12\x13\n\x0bmigratetype\x18\x06 \x01(\x05\"I\n\x18\x44mabufRssStatFtraceEvent\x12\x0b\n\x03rss\x18\x01 \x01(\x04\x12\x11\n\trss_delta\x18\x02 \x01(\x03\x12\r\n\x05i_ino\x18\x03 \x01(\x04\"(\n\x19KvmAccessFaultFtraceEvent\x12\x0b\n\x03ipa\x18\x01 \x01(\x04\"4\n\x14KvmAckIrqFtraceEvent\x12\x0f\n\x07irqchip\x18\x01 \x01(\r\x12\x0b\n\x03pin\x18\x02 \x01(\r\"2\n\x14KvmAgeHvaFtraceEvent\x12\x0b\n\x03\x65nd\x18\x01 \x01(\x04\x12\r\n\x05start\x18\x02 \x01(\x04\"T\n\x15KvmAgePageFtraceEvent\x12\x0b\n\x03gfn\x18\x01 \x01(\x04\x12\x0b\n\x03hva\x18\x02 \x01(\x04\x12\r\n\x05level\x18\x03 \x01(\r\x12\x12\n\nreferenced\x18\x04 \x01(\r\"2\n\x1bKvmArmClearDebugFtraceEvent\x12\x13\n\x0bguest_debug\x18\x01 \x01(\r\"9\n\x1aKvmArmSetDreg32FtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r\"7\n\x1aKvmArmSetRegsetFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\"@\n\x1bKvmArmSetupDebugFtraceEvent\x12\x13\n\x0bguest_debug\x18\x01 \x01(\r\x12\x0c\n\x04vcpu\x18\x02 \x01(\x04\"&\n\x13KvmEntryFtraceEvent\x12\x0f\n\x07vcpu_pc\x18\x01 \x01(\x04\"B\n\x12KvmExitFtraceEvent\x12\x0e\n\x06\x65sr_ec\x18\x01 \x01(\r\x12\x0b\n\x03ret\x18\x02 \x01(\x05\x12\x0f\n\x07vcpu_pc\x18\x03 \x01(\x04\"!\n\x11KvmFpuFtraceEvent\x12\x0c\n\x04load\x18\x01 \x01(\r\"o\n\x19KvmGetTimerMapFtraceEvent\x12\x15\n\rdirect_ptimer\x18\x01 \x01(\x05\x12\x15\n\rdirect_vtimer\x18\x02 \x01(\x05\x12\x13\n\x0b\x65mul_ptimer\x18\x03 \x01(\x05\x12\x0f\n\x07vcpu_id\x18\x04 \x01(\x04\"T\n\x18KvmGuestFaultFtraceEvent\x12\x0b\n\x03hsr\x18\x01 \x01(\x04\x12\r\n\x05hxfar\x18\x02 \x01(\x04\x12\x0b\n\x03ipa\x18\x03 \x01(\x04\x12\x0f\n\x07vcpu_pc\x18\x04 \x01(\x04\")\n\x1aKvmHandleSysRegFtraceEvent\x12\x0b\n\x03hsr\x18\x01 \x01(\x04\"B\n\x16KvmHvcArm64FtraceEvent\x12\x0b\n\x03imm\x18\x01 \x01(\x04\x12\n\n\x02r0\x18\x02 \x01(\x04\x12\x0f\n\x07vcpu_pc\x18\x03 \x01(\x04\"W\n\x15KvmIrqLineFtraceEvent\x12\x0f\n\x07irq_num\x18\x01 \x01(\x05\x12\r\n\x05level\x18\x02 \x01(\x05\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\x10\n\x08vcpu_idx\x18\x04 \x01(\x05\"I\n\x12KvmMmioFtraceEvent\x12\x0b\n\x03gpa\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\r\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\x0b\n\x03val\x18\x04 \x01(\x04\"I\n\x19KvmMmioEmulateFtraceEvent\x12\x0c\n\x04\x63psr\x18\x01 \x01(\x04\x12\r\n\x05instr\x18\x02 \x01(\x04\x12\x0f\n\x07vcpu_pc\x18\x03 \x01(\x04\"@\n\x1bKvmSetGuestDebugFtraceEvent\x12\x13\n\x0bguest_debug\x18\x01 \x01(\r\x12\x0c\n\x04vcpu\x18\x02 \x01(\x04\"I\n\x14KvmSetIrqFtraceEvent\x12\x0b\n\x03gsi\x18\x01 \x01(\r\x12\x15\n\rirq_source_id\x18\x02 \x01(\x05\x12\r\n\x05level\x18\x03 \x01(\x05\"\'\n\x18KvmSetSpteHvaFtraceEvent\x12\x0b\n\x03hva\x18\x01 \x01(\x04\";\n\x19KvmSetWayFlushFtraceEvent\x12\r\n\x05\x63\x61\x63he\x18\x01 \x01(\r\x12\x0f\n\x07vcpu_pc\x18\x02 \x01(\x04\"\x8b\x01\n\x17KvmSysAccessFtraceEvent\x12\x0b\n\x03\x43Rm\x18\x01 \x01(\r\x12\x0b\n\x03\x43Rn\x18\x02 \x01(\r\x12\x0b\n\x03Op0\x18\x03 \x01(\r\x12\x0b\n\x03Op1\x18\x04 \x01(\r\x12\x0b\n\x03Op2\x18\x05 \x01(\r\x12\x10\n\x08is_write\x18\x06 \x01(\r\x12\x0c\n\x04name\x18\x07 \x01(\t\x12\x0f\n\x07vcpu_pc\x18\x08 \x01(\x04\"\'\n\x18KvmTestAgeHvaFtraceEvent\x12\x0b\n\x03hva\x18\x01 \x01(\x04\"D\n\x1aKvmTimerEmulateFtraceEvent\x12\x13\n\x0bshould_fire\x18\x01 \x01(\r\x12\x11\n\ttimer_idx\x18\x02 \x01(\x05\"5\n KvmTimerHrtimerExpireFtraceEvent\x12\x11\n\ttimer_idx\x18\x01 \x01(\x05\"O\n\x1fKvmTimerRestoreStateFtraceEvent\x12\x0b\n\x03\x63tl\x18\x01 \x01(\x04\x12\x0c\n\x04\x63val\x18\x02 \x01(\x04\x12\x11\n\ttimer_idx\x18\x03 \x01(\x05\"L\n\x1cKvmTimerSaveStateFtraceEvent\x12\x0b\n\x03\x63tl\x18\x01 \x01(\x04\x12\x0c\n\x04\x63val\x18\x02 \x01(\x04\x12\x11\n\ttimer_idx\x18\x03 \x01(\x05\"K\n\x1cKvmTimerUpdateIrqFtraceEvent\x12\x0b\n\x03irq\x18\x01 \x01(\r\x12\r\n\x05level\x18\x02 \x01(\x05\x12\x0f\n\x07vcpu_id\x18\x03 \x01(\x04\"F\n\x19KvmToggleCacheFtraceEvent\x12\x0b\n\x03now\x18\x01 \x01(\r\x12\x0f\n\x07vcpu_pc\x18\x02 \x01(\x04\x12\x0b\n\x03was\x18\x03 \x01(\r\"9\n\x1bKvmUnmapHvaRangeFtraceEvent\x12\x0b\n\x03\x65nd\x18\x01 \x01(\x04\x12\r\n\x05start\x18\x02 \x01(\x04\"-\n\x1bKvmUserspaceExitFtraceEvent\x12\x0e\n\x06reason\x18\x01 \x01(\r\"E\n\x18KvmVcpuWakeupFtraceEvent\x12\n\n\x02ns\x18\x01 \x01(\x04\x12\r\n\x05valid\x18\x02 \x01(\r\x12\x0e\n\x06waited\x18\x03 \x01(\r\"9\n\x16KvmWfxArm64FtraceEvent\x12\x0e\n\x06is_wfe\x18\x01 \x01(\r\x12\x0f\n\x07vcpu_pc\x18\x02 \x01(\x04\"T\n\x12TrapRegFtraceEvent\x12\n\n\x02\x66n\x18\x01 \x01(\t\x12\x10\n\x08is_write\x18\x02 \x01(\r\x12\x0b\n\x03reg\x18\x03 \x01(\x05\x12\x13\n\x0bwrite_value\x18\x04 \x01(\x04\"N\n\x1fVgicUpdateIrqPendingFtraceEvent\x12\x0b\n\x03irq\x18\x01 \x01(\r\x12\r\n\x05level\x18\x02 \x01(\r\x12\x0f\n\x07vcpu_id\x18\x03 \x01(\x04\"t\n\x18LowmemoryKillFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x16\n\x0epagecache_size\x18\x03 \x01(\x03\x12\x17\n\x0fpagecache_limit\x18\x04 \x01(\x03\x12\x0c\n\x04\x66ree\x18\x05 \x01(\x03\"q\n\x1fLwisTracingMarkWriteFtraceEvent\x12\x11\n\tlwis_name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\r\x12\x0b\n\x03pid\x18\x03 \x01(\x05\x12\x11\n\tfunc_name\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\x03\"Y\n\x1fMaliTracingMarkWriteFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\r\n\x05value\x18\x04 \x01(\x05\"u\n\x1dMaliMaliKCPUCQSSETFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\tinfo_val1\x18\x02 \x01(\x04\x12\x11\n\tinfo_val2\x18\x03 \x01(\x04\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\x11\n\tkctx_tgid\x18\x05 \x01(\x05\"{\n#MaliMaliKCPUCQSWAITSTARTFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\tinfo_val1\x18\x02 \x01(\x04\x12\x11\n\tinfo_val2\x18\x03 \x01(\x04\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\x11\n\tkctx_tgid\x18\x05 \x01(\x05\"y\n!MaliMaliKCPUCQSWAITENDFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\tinfo_val1\x18\x02 \x01(\x04\x12\x11\n\tinfo_val2\x18\x03 \x01(\x04\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\x11\n\tkctx_tgid\x18\x05 \x01(\x05\"z\n\"MaliMaliKCPUFENCESIGNALFtraceEvent\x12\x11\n\tinfo_val1\x18\x01 \x01(\x04\x12\x11\n\tinfo_val2\x18\x02 \x01(\x04\x12\x11\n\tkctx_tgid\x18\x03 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\n\n\x02id\x18\x05 \x01(\r\"}\n%MaliMaliKCPUFENCEWAITSTARTFtraceEvent\x12\x11\n\tinfo_val1\x18\x01 \x01(\x04\x12\x11\n\tinfo_val2\x18\x02 \x01(\x04\x12\x11\n\tkctx_tgid\x18\x03 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\n\n\x02id\x18\x05 \x01(\r\"{\n#MaliMaliKCPUFENCEWAITENDFtraceEvent\x12\x11\n\tinfo_val1\x18\x01 \x01(\x04\x12\x11\n\tinfo_val2\x18\x02 \x01(\x04\x12\x11\n\tkctx_tgid\x18\x03 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\n\n\x02id\x18\x05 \x01(\r\"\\\n$MaliMaliCSFINTERRUPTSTARTFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"Z\n\"MaliMaliCSFINTERRUPTENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"l\n4MaliMaliPMMCUHCTLCORESDOWNSCALENOTIFYPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"c\n+MaliMaliPMMCUHCTLCORESNOTIFYPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"d\n,MaliMaliPMMCUHCTLCOREINACTIVEPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"`\n(MaliMaliPMMCUHCTLMCUONRECHECKFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"f\n.MaliMaliPMMCUHCTLSHADERSCOREOFFPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"b\n*MaliMaliPMMCUHCTLSHADERSPENDOFFFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"a\n)MaliMaliPMMCUHCTLSHADERSPENDONFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"c\n+MaliMaliPMMCUHCTLSHADERSREADYOFFFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"W\n\x1fMaliMaliPMMCUINSLEEPFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"S\n\x1bMaliMaliPMMCUOFFFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"R\n\x1aMaliMaliPMMCUONFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"d\n,MaliMaliPMMCUONCOREATTRUPDATEPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"_\n\'MaliMaliPMMCUONGLBREINITPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"V\n\x1eMaliMaliPMMCUONHALTFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"^\n&MaliMaliPMMCUONHWCNTDISABLEFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"]\n%MaliMaliPMMCUONHWCNTENABLEFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"Z\n\"MaliMaliPMMCUONPENDHALTFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"[\n#MaliMaliPMMCUONPENDSLEEPFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"_\n\'MaliMaliPMMCUONSLEEPINITIATEFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"W\n\x1fMaliMaliPMMCUPENDOFFFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"\\\n$MaliMaliPMMCUPENDONRELOADFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"Y\n!MaliMaliPMMCUPOWERDOWNFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"Y\n!MaliMaliPMMCURESETWAITFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"W\n\x1cMaliGpuPowerStateFtraceEvent\x12\x11\n\tchange_ns\x18\x01 \x01(\x04\x12\x12\n\nfrom_state\x18\x02 \x01(\x05\x12\x10\n\x08to_state\x18\x03 \x01(\x05\"@\n\x18MdpCmdKickoffFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\x12\x13\n\x0bkickoff_cnt\x18\x02 \x01(\x05\"Z\n\x14MdpCommitFtraceEvent\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x10\n\x08play_cnt\x18\x02 \x01(\r\x12\x10\n\x08\x63lk_rate\x18\x03 \x01(\r\x12\x11\n\tbandwidth\x18\x04 \x01(\x04\"[\n\x17MdpPerfSetOtFtraceEvent\x12\x0c\n\x04pnum\x18\x01 \x01(\r\x12\x0e\n\x06xin_id\x18\x02 \x01(\r\x12\x0e\n\x06rd_lim\x18\x03 \x01(\r\x12\x12\n\nis_vbif_rt\x18\x04 \x01(\r\"\x8c\x02\n\x18MdpSsppChangeFtraceEvent\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x10\n\x08play_cnt\x18\x02 \x01(\r\x12\r\n\x05mixer\x18\x03 \x01(\r\x12\r\n\x05stage\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\x12\x0e\n\x06\x66ormat\x18\x06 \x01(\r\x12\r\n\x05img_w\x18\x07 \x01(\r\x12\r\n\x05img_h\x18\x08 \x01(\r\x12\r\n\x05src_x\x18\t \x01(\r\x12\r\n\x05src_y\x18\n \x01(\r\x12\r\n\x05src_w\x18\x0b \x01(\r\x12\r\n\x05src_h\x18\x0c \x01(\r\x12\r\n\x05\x64st_x\x18\r \x01(\r\x12\r\n\x05\x64st_y\x18\x0e \x01(\r\x12\r\n\x05\x64st_w\x18\x0f \x01(\r\x12\r\n\x05\x64st_h\x18\x10 \x01(\r\"S\n\x1bTracingMarkWriteFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x12\n\ntrace_name\x18\x02 \x01(\t\x12\x13\n\x0btrace_begin\x18\x03 \x01(\r\"d\n\x1dMdpCmdPingpongDoneFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\x12\x10\n\x08intf_num\x18\x02 \x01(\r\x12\x0e\n\x06pp_num\x18\x03 \x01(\r\x12\x10\n\x08koff_cnt\x18\x04 \x01(\x05\"\xa4\x01\n\x17MdpCompareBwFtraceEvent\x12\x0e\n\x06new_ab\x18\x01 \x01(\x04\x12\x0e\n\x06new_ib\x18\x02 \x01(\x04\x12\x0e\n\x06new_wb\x18\x03 \x01(\x04\x12\x0e\n\x06old_ab\x18\x04 \x01(\x04\x12\x0e\n\x06old_ib\x18\x05 \x01(\x04\x12\x0e\n\x06old_wb\x18\x06 \x01(\x04\x12\x16\n\x0eparams_changed\x18\x07 \x01(\r\x12\x11\n\tupdate_bw\x18\x08 \x01(\r\"p\n\x1eMdpPerfSetPanicLutsFtraceEvent\x12\x0c\n\x04pnum\x18\x01 \x01(\r\x12\x0b\n\x03\x66mt\x18\x02 \x01(\r\x12\x0c\n\x04mode\x18\x03 \x01(\r\x12\x11\n\tpanic_lut\x18\x04 \x01(\r\x12\x12\n\nrobust_lut\x18\x05 \x01(\r\"\x89\x02\n\x15MdpSsppSetFtraceEvent\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x10\n\x08play_cnt\x18\x02 \x01(\r\x12\r\n\x05mixer\x18\x03 \x01(\r\x12\r\n\x05stage\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\x12\x0e\n\x06\x66ormat\x18\x06 \x01(\r\x12\r\n\x05img_w\x18\x07 \x01(\r\x12\r\n\x05img_h\x18\x08 \x01(\r\x12\r\n\x05src_x\x18\t \x01(\r\x12\r\n\x05src_y\x18\n \x01(\r\x12\r\n\x05src_w\x18\x0b \x01(\r\x12\r\n\x05src_h\x18\x0c \x01(\r\x12\r\n\x05\x64st_x\x18\r \x01(\r\x12\r\n\x05\x64st_y\x18\x0e \x01(\r\x12\r\n\x05\x64st_w\x18\x0f \x01(\r\x12\r\n\x05\x64st_h\x18\x10 \x01(\r\"A\n\x1cMdpCmdReadptrDoneFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\x12\x10\n\x08koff_cnt\x18\x02 \x01(\x05\"I\n\x15MdpMisrCrcFtraceEvent\x12\x10\n\x08\x62lock_id\x18\x01 \x01(\r\x12\x11\n\tvsync_cnt\x18\x02 \x01(\r\x12\x0b\n\x03\x63rc\x18\x03 \x01(\r\"}\n\x1cMdpPerfSetQosLutsFtraceEvent\x12\x0c\n\x04pnum\x18\x01 \x01(\r\x12\x0b\n\x03\x66mt\x18\x02 \x01(\r\x12\x0c\n\x04intf\x18\x03 \x01(\r\x12\x0b\n\x03rot\x18\x04 \x01(\r\x12\n\n\x02\x66l\x18\x05 \x01(\r\x12\x0b\n\x03lut\x18\x06 \x01(\r\x12\x0e\n\x06linear\x18\x07 \x01(\r\"N\n\x1aMdpTraceCounterFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x14\n\x0c\x63ounter_name\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x05\"-\n\x1aMdpCmdReleaseBwFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\".\n\x19MdpMixerUpdateFtraceEvent\x12\x11\n\tmixer_num\x18\x01 \x01(\r\"\xa0\x01\n\x1dMdpPerfSetWmLevelsFtraceEvent\x12\x0c\n\x04pnum\x18\x01 \x01(\r\x12\x11\n\tuse_space\x18\x02 \x01(\r\x12\x16\n\x0epriority_bytes\x18\x03 \x01(\r\x12\x0b\n\x03wm0\x18\x04 \x01(\r\x12\x0b\n\x03wm1\x18\x05 \x01(\r\x12\x0b\n\x03wm2\x18\x06 \x01(\r\x12\x0e\n\x06mb_cnt\x18\x07 \x01(\r\x12\x0f\n\x07mb_size\x18\x08 \x01(\r\"H\n\x1fMdpVideoUnderrunDoneFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\x12\x14\n\x0cunderrun_cnt\x18\x02 \x01(\r\"E\n\x1dMdpCmdWaitPingpongFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\x12\x13\n\x0bkickoff_cnt\x18\x02 \x01(\x05\"\xce\x01\n\x1dMdpPerfPrefillCalcFtraceEvent\x12\x0c\n\x04pnum\x18\x01 \x01(\r\x12\x13\n\x0blatency_buf\x18\x02 \x01(\r\x12\n\n\x02ot\x18\x03 \x01(\r\x12\r\n\x05y_buf\x18\x04 \x01(\r\x12\x10\n\x08y_scaler\x18\x05 \x01(\r\x12\x10\n\x08pp_lines\x18\x06 \x01(\r\x12\x10\n\x08pp_bytes\x18\x07 \x01(\r\x12\x0f\n\x07post_sc\x18\x08 \x01(\r\x12\x11\n\tfbc_bytes\x18\t \x01(\r\x12\x15\n\rprefill_bytes\x18\n \x01(\r\"Q\n\x1bMdpPerfUpdateBusFtraceEvent\x12\x0e\n\x06\x63lient\x18\x01 \x01(\x05\x12\x10\n\x08\x61\x62_quota\x18\x02 \x01(\x04\x12\x10\n\x08ib_quota\x18\x03 \x01(\x04\"0\n\x1fRotatorBwAoAsContextFtraceEvent\x12\r\n\x05state\x18\x01 \x01(\r\"Y\n\x18MmEventRecordFtraceEvent\x12\x0f\n\x07\x61vg_lat\x18\x01 \x01(\r\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x0f\n\x07max_lat\x18\x03 \x01(\r\x12\x0c\n\x04type\x18\x04 \x01(\r\"H\n\x1aNetifReceiveSkbFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07skbaddr\x18\x03 \x01(\x04\"O\n\x15NetDevXmitFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\n\n\x02rc\x18\x03 \x01(\x05\x12\x0f\n\x07skbaddr\x18\x04 \x01(\x04\"\xfb\x02\n\x1eNapiGroReceiveEntryFtraceEvent\x12\x10\n\x08\x64\x61ta_len\x18\x01 \x01(\r\x12\x10\n\x08gso_size\x18\x02 \x01(\r\x12\x10\n\x08gso_type\x18\x03 \x01(\r\x12\x0c\n\x04hash\x18\x04 \x01(\r\x12\x11\n\tip_summed\x18\x05 \x01(\r\x12\x0f\n\x07l4_hash\x18\x06 \x01(\r\x12\x0b\n\x03len\x18\x07 \x01(\r\x12\x12\n\nmac_header\x18\x08 \x01(\x05\x12\x18\n\x10mac_header_valid\x18\t \x01(\r\x12\x0c\n\x04name\x18\n \x01(\t\x12\x0f\n\x07napi_id\x18\x0b \x01(\r\x12\x10\n\x08nr_frags\x18\x0c \x01(\r\x12\x10\n\x08protocol\x18\r \x01(\r\x12\x15\n\rqueue_mapping\x18\x0e \x01(\r\x12\x0f\n\x07skbaddr\x18\x0f \x01(\x04\x12\x10\n\x08truesize\x18\x10 \x01(\r\x12\x12\n\nvlan_proto\x18\x11 \x01(\r\x12\x13\n\x0bvlan_tagged\x18\x12 \x01(\r\x12\x10\n\x08vlan_tci\x18\x13 \x01(\r\",\n\x1dNapiGroReceiveExitFtraceEvent\x12\x0b\n\x03ret\x18\x01 \x01(\x05\"P\n\x1cOomScoreAdjUpdateFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x15\n\room_score_adj\x18\x02 \x01(\x05\x12\x0b\n\x03pid\x18\x03 \x01(\x05\"$\n\x15MarkVictimFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\">\n\x1b\x44siCmdFifoStatusFtraceEvent\x12\x0e\n\x06header\x18\x01 \x01(\r\x12\x0f\n\x07payload\x18\x02 \x01(\r\"/\n\x10\x44siRxFtraceEvent\x12\x0b\n\x03\x63md\x18\x01 \x01(\r\x12\x0e\n\x06rx_buf\x18\x03 \x01(\x0c\">\n\x10\x44siTxFtraceEvent\x12\x0c\n\x04last\x18\x01 \x01(\r\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\x0e\n\x06tx_buf\x18\x04 \x01(\x0c\"\x7f\n\x1cPanelWriteGenericFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x12\n\ntrace_name\x18\x02 \x01(\t\x12\x13\n\x0btrace_begin\x18\x03 \x01(\r\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0c\n\x04type\x18\x05 \x01(\r\x12\r\n\x05value\x18\x06 \x01(\x05\"F\n\x18GramCollisionFtraceEvent\x12\x13\n\x0bpanel_index\x18\x01 \x01(\x05\x12\x15\n\rcollision_cnt\x18\x02 \x01(\r\"\xc5\x01\n\x1cPanelSettingsFullFtraceEvent\x12\x13\n\x0bpanel_index\x18\x01 \x01(\x05\x12\x0b\n\x03hbm\x18\x02 \x01(\r\x12\x0b\n\x03irc\x18\x03 \x01(\r\x12\r\n\x05h_pwm\x18\x04 \x01(\r\x12\x0f\n\x07\x66i_auto\x18\x05 \x01(\r\x12\x11\n\tfi_manual\x18\x06 \x01(\r\x12\x12\n\nearly_exit\x18\x07 \x01(\r\x12\x0e\n\x06min_rr\x18\x08 \x01(\r\x12\x0e\n\x06max_rr\x18\t \x01(\r\x12\x0f\n\x07te_freq\x18\n \x01(\r\"q\n\x1cPanelSettingsLiteFtraceEvent\x12\x13\n\x0bpanel_index\x18\x01 \x01(\x05\x12\x0b\n\x03vrr\x18\x02 \x01(\r\x12\x0e\n\x06min_rr\x18\x03 \x01(\r\x12\x0e\n\x06max_rr\x18\x04 \x01(\r\x12\x0f\n\x07te_freq\x18\x05 \x01(\r\"\x84\x03\n\x1eSchedSwitchWithCtrsFtraceEvent\x12\x0f\n\x07old_pid\x18\x01 \x01(\x05\x12\x0f\n\x07new_pid\x18\x02 \x01(\x05\x12\x0c\n\x04\x63\x63tr\x18\x03 \x01(\x04\x12\x0c\n\x04\x63tr0\x18\x04 \x01(\x04\x12\x0c\n\x04\x63tr1\x18\x05 \x01(\x04\x12\x0c\n\x04\x63tr2\x18\x06 \x01(\x04\x12\x0c\n\x04\x63tr3\x18\x07 \x01(\x04\x12\r\n\x05lctr0\x18\x08 \x01(\r\x12\r\n\x05lctr1\x18\t \x01(\r\x12\x0c\n\x04\x63tr4\x18\n \x01(\x04\x12\x0c\n\x04\x63tr5\x18\x0b \x01(\x04\x12\x11\n\tprev_comm\x18\x0c \x01(\t\x12\x10\n\x08prev_pid\x18\r \x01(\x05\x12\x0b\n\x03\x63yc\x18\x0e \x01(\r\x12\x0c\n\x04inst\x18\x0f \x01(\r\x12\x0f\n\x07stallbm\x18\x10 \x01(\r\x12\x0c\n\x04l3dm\x18\x11 \x01(\r\x12\x10\n\x08next_pid\x18\x12 \x01(\x05\x12\x11\n\tnext_comm\x18\x13 \x01(\t\x12\x12\n\nprev_state\x18\x14 \x01(\x03\x12\x0c\n\x04\x61mu0\x18\x15 \x01(\x04\x12\x0c\n\x04\x61mu1\x18\x16 \x01(\x04\x12\x0c\n\x04\x61mu2\x18\x17 \x01(\x04\"0\n\x1cPixelMmKswapdWakeFtraceEvent\x12\x10\n\x08whatever\x18\x01 \x01(\x05\"\x85\x01\n\x1cPixelMmKswapdDoneFtraceEvent\x12\x18\n\x10\x64\x65lta_nr_scanned\x18\x01 \x01(\x04\x12\x1a\n\x12\x64\x65lta_nr_reclaimed\x18\x02 \x01(\x04\x12\x1a\n\x12\x64\x65lta_nr_allocated\x18\x03 \x01(\x04\x12\x13\n\x0b\x64uration_ns\x18\x04 \x01(\x04\"8\n\x17\x43puFrequencyFtraceEvent\x12\r\n\x05state\x18\x01 \x01(\r\x12\x0e\n\x06\x63pu_id\x18\x02 \x01(\r\"S\n\x1d\x43puFrequencyLimitsFtraceEvent\x12\x10\n\x08min_freq\x18\x01 \x01(\r\x12\x10\n\x08max_freq\x18\x02 \x01(\r\x12\x0e\n\x06\x63pu_id\x18\x03 \x01(\r\"3\n\x12\x43puIdleFtraceEvent\x12\r\n\x05state\x18\x01 \x01(\r\x12\x0e\n\x06\x63pu_id\x18\x02 \x01(\r\"E\n\x16\x43lockEnableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x04\x12\x0e\n\x06\x63pu_id\x18\x03 \x01(\x04\"F\n\x17\x43lockDisableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x04\x12\x0e\n\x06\x63pu_id\x18\x03 \x01(\x04\"F\n\x17\x43lockSetRateFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x04\x12\x0e\n\x06\x63pu_id\x18\x03 \x01(\x04\"F\n\x18SuspendResumeFtraceEvent\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x0b\n\x03val\x18\x02 \x01(\x05\x12\r\n\x05start\x18\x03 \x01(\r\"8\n\x17GpuFrequencyFtraceEvent\x12\x0e\n\x06gpu_id\x18\x01 \x01(\r\x12\r\n\x05state\x18\x02 \x01(\r\">\n\x1fWakeupSourceActivateFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x04\"@\n!WakeupSourceDeactivateFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x04\"\x85\x01\n\x18GpuWorkPeriodFtraceEvent\x12\x0e\n\x06gpu_id\x18\x01 \x01(\r\x12\x0b\n\x03uid\x18\x02 \x01(\r\x12\x15\n\rstart_time_ns\x18\x03 \x01(\x04\x12\x13\n\x0b\x65nd_time_ns\x18\x04 \x01(\x04\x12 \n\x18total_active_duration_ns\x18\x05 \x01(\x04\"q\n DevicePmCallbackStartFtraceEvent\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\t\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\x0e\n\x06parent\x18\x03 \x01(\t\x12\x0e\n\x06pm_ops\x18\x04 \x01(\t\x12\r\n\x05\x65vent\x18\x05 \x01(\x05\"O\n\x1e\x44\x65vicePmCallbackEndFtraceEvent\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\t\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\x05\"@\n\x18GpuPowerStateFtraceEvent\x12\x11\n\told_state\x18\x01 \x01(\x05\x12\x11\n\tnew_state\x18\x02 \x01(\x05\"N\n\x1dPsciDomainIdleExitFtraceEvent\x12\x0e\n\x06\x63pu_id\x18\x01 \x01(\r\x12\r\n\x05state\x18\x02 \x01(\r\x12\x0e\n\x06s2idle\x18\x03 \x01(\r\"O\n\x1ePsciDomainIdleEnterFtraceEvent\x12\x0e\n\x06\x63pu_id\x18\x01 \x01(\r\x12\r\n\x05state\x18\x02 \x01(\r\x12\x0e\n\x06s2idle\x18\x03 \x01(\r\"!\n\x12\x43onsoleFtraceEvent\x12\x0b\n\x03msg\x18\x01 \x01(\t\"/\n\x13SysEnterFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0c\n\x04\x61rgs\x18\x02 \x03(\x04\"-\n\x12SysExitFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0b\n\x03ret\x18\x02 \x01(\x03\"+\n\x1bRegulatorDisableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"3\n#RegulatorDisableCompleteFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"*\n\x1aRegulatorEnableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"2\n\"RegulatorEnableCompleteFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"/\n\x1fRegulatorEnableDelayFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"H\n\x1eRegulatorSetVoltageFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03min\x18\x02 \x01(\x05\x12\x0b\n\x03max\x18\x03 \x01(\x05\"C\n&RegulatorSetVoltageCompleteFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03val\x18\x02 \x01(\r\"4\n\x14RpmStatusFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\x05\"}\n\"SamsungTracingMarkWriteFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x12\n\ntrace_name\x18\x02 \x01(\t\x12\x13\n\x0btrace_begin\x18\x03 \x01(\r\x12\x12\n\ntrace_type\x18\x04 \x01(\r\x12\r\n\x05value\x18\x05 \x01(\x05\"\x9c\x01\n\x16SchedSwitchFtraceEvent\x12\x11\n\tprev_comm\x18\x01 \x01(\t\x12\x10\n\x08prev_pid\x18\x02 \x01(\x05\x12\x11\n\tprev_prio\x18\x03 \x01(\x05\x12\x12\n\nprev_state\x18\x04 \x01(\x03\x12\x11\n\tnext_comm\x18\x05 \x01(\t\x12\x10\n\x08next_pid\x18\x06 \x01(\x05\x12\x11\n\tnext_prio\x18\x07 \x01(\x05\"f\n\x16SchedWakeupFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\x12\x0f\n\x07success\x18\x04 \x01(\x05\x12\x12\n\ntarget_cpu\x18\x05 \x01(\x05\"M\n\x1dSchedBlockedReasonFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0e\n\x06\x63\x61ller\x18\x02 \x01(\x04\x12\x0f\n\x07io_wait\x18\x03 \x01(\r\"Q\n\x1aSchedCpuHotplugFtraceEvent\x12\x14\n\x0c\x61\x66\x66\x65\x63ted_cpu\x18\x01 \x01(\x05\x12\r\n\x05\x65rror\x18\x02 \x01(\x05\x12\x0e\n\x06status\x18\x03 \x01(\x05\"f\n\x16SchedWakingFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\x12\x0f\n\x07success\x18\x04 \x01(\x05\x12\x12\n\ntarget_cpu\x18\x05 \x01(\x05\"i\n\x19SchedWakeupNewFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\x12\x0f\n\x07success\x18\x04 \x01(\x05\x12\x12\n\ntarget_cpu\x18\x05 \x01(\x05\"M\n\x1bSchedProcessExecFtraceEvent\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0f\n\x07old_pid\x18\x03 \x01(\x05\"T\n\x1bSchedProcessExitFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04tgid\x18\x03 \x01(\x05\x12\x0c\n\x04prio\x18\x04 \x01(\x05\"m\n\x1bSchedProcessForkFtraceEvent\x12\x13\n\x0bparent_comm\x18\x01 \x01(\t\x12\x12\n\nparent_pid\x18\x02 \x01(\x05\x12\x12\n\nchild_comm\x18\x03 \x01(\t\x12\x11\n\tchild_pid\x18\x04 \x01(\x05\"F\n\x1bSchedProcessFreeFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\"8\n\x1bSchedProcessHangFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\"F\n\x1bSchedProcessWaitFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\"X\n\x19SchedPiSetprioFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0f\n\x07newprio\x18\x02 \x01(\x05\x12\x0f\n\x07oldprio\x18\x03 \x01(\x05\x12\x0b\n\x03pid\x18\x04 \x01(\x05\"\xc8\x02\n\x1aSchedCpuUtilCfsFtraceEvent\x12\x0e\n\x06\x61\x63tive\x18\x01 \x01(\x05\x12\x10\n\x08\x63\x61pacity\x18\x02 \x01(\x04\x12\x15\n\rcapacity_orig\x18\x03 \x01(\x04\x12\x0b\n\x03\x63pu\x18\x04 \x01(\r\x12\x16\n\x0e\x63pu_importance\x18\x05 \x01(\x04\x12\x10\n\x08\x63pu_util\x18\x06 \x01(\x04\x12\x10\n\x08\x65xit_lat\x18\x07 \x01(\r\x12\x16\n\x0egroup_capacity\x18\x08 \x01(\x04\x12\x18\n\x10grp_overutilized\x18\t \x01(\r\x12\x10\n\x08idle_cpu\x18\n \x01(\r\x12\x12\n\nnr_running\x18\x0b \x01(\r\x12\x11\n\tspare_cap\x18\x0c \x01(\x03\x12\x11\n\ttask_fits\x18\r \x01(\r\x12\x17\n\x0fwake_group_util\x18\x0e \x01(\x04\x12\x11\n\twake_util\x18\x0f \x01(\x04\"\x89\x01\n\x1bSchedMigrateTaskFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\x12\x10\n\x08orig_cpu\x18\x04 \x01(\x05\x12\x10\n\x08\x64\x65st_cpu\x18\x05 \x01(\x05\x12\x0f\n\x07running\x18\x06 \x01(\x05\x12\x0c\n\x04load\x18\x07 \x01(\r\"|\n\x1eSchedWakeupTaskAttrFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x14\n\x0c\x63pu_affinity\x18\x02 \x01(\x04\x12\x11\n\ttask_util\x18\x03 \x01(\x04\x12\x12\n\nuclamp_min\x18\x04 \x01(\x04\x12\x10\n\x08vruntime\x18\x05 \x01(\x04\"[\n\x1cSchedGroupTrackerFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\r\n\x05group\x18\x03 \x01(\t\x12\x11\n\tgroup_num\x18\x04 \x01(\x05\"B\n\x17ScmCallStartFtraceEvent\x12\x0f\n\x07\x61rginfo\x18\x01 \x01(\r\x12\n\n\x02x0\x18\x02 \x01(\x04\x12\n\n\x02x5\x18\x03 \x01(\x04\"\x17\n\x15ScmCallEndFtraceEvent\"\xfc\x01\n\x1fScsiDispatchCmdErrorFtraceEvent\x12\x0f\n\x07host_no\x18\x01 \x01(\r\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\r\x12\n\n\x02id\x18\x03 \x01(\r\x12\x0b\n\x03lun\x18\x04 \x01(\r\x12\x0b\n\x03rtn\x18\x05 \x01(\x05\x12\x0e\n\x06opcode\x18\x06 \x01(\r\x12\x0f\n\x07\x63md_len\x18\x07 \x01(\r\x12\x12\n\ndata_sglen\x18\x08 \x01(\r\x12\x12\n\nprot_sglen\x18\t \x01(\r\x12\x0f\n\x07prot_op\x18\n \x01(\r\x12\x12\n\ndriver_tag\x18\x0c \x01(\x05\x12\x15\n\rscheduler_tag\x18\r \x01(\x05\x12\x0c\n\x04\x63mnd\x18\x0e \x01(\x0c\"\xaf\x02\n!ScsiDispatchCmdTimeoutFtraceEvent\x12\x0f\n\x07host_no\x18\x01 \x01(\r\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\r\x12\n\n\x02id\x18\x03 \x01(\r\x12\x0b\n\x03lun\x18\x04 \x01(\r\x12\x0e\n\x06result\x18\x05 \x01(\x05\x12\x0e\n\x06opcode\x18\x06 \x01(\r\x12\x0f\n\x07\x63md_len\x18\x07 \x01(\r\x12\x12\n\ndata_sglen\x18\x08 \x01(\r\x12\x12\n\nprot_sglen\x18\t \x01(\r\x12\x0f\n\x07prot_op\x18\n \x01(\r\x12\x12\n\ndriver_tag\x18\x0c \x01(\x05\x12\x15\n\rscheduler_tag\x18\r \x01(\x05\x12\x11\n\tsense_key\x18\x0e \x01(\r\x12\x0b\n\x03\x61sc\x18\x0f \x01(\r\x12\x0c\n\x04\x61scq\x18\x10 \x01(\r\x12\x0c\n\x04\x63mnd\x18\x11 \x01(\x0c\"*\n\x17ScsiEhWakeupFtraceEvent\x12\x0f\n\x07host_no\x18\x01 \x01(\r\"y\n\x1eSdeTracingMarkWriteFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x12\n\ntrace_name\x18\x02 \x01(\t\x12\x12\n\ntrace_type\x18\x03 \x01(\r\x12\r\n\x05value\x18\x04 \x01(\x05\x12\x13\n\x0btrace_begin\x18\x05 \x01(\r\"\x8d\x02\n\x17SdeSdeEvtlogFtraceEvent\x12\x12\n\nevtlog_tag\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0e\n\x06tag_id\x18\x03 \x01(\r\x12\x0b\n\x03\x64\x30\x30\x18\x04 \x01(\r\x12\x0b\n\x03\x64\x30\x31\x18\x05 \x01(\r\x12\x0b\n\x03\x64\x30\x32\x18\x06 \x01(\r\x12\x0b\n\x03\x64\x30\x33\x18\x07 \x01(\r\x12\x0b\n\x03\x64\x30\x34\x18\x08 \x01(\r\x12\x0b\n\x03\x64\x30\x35\x18\t \x01(\r\x12\x0b\n\x03\x64\x30\x36\x18\n \x01(\r\x12\x0b\n\x03\x64\x30\x37\x18\x0b \x01(\r\x12\x0b\n\x03\x64\x30\x38\x18\x0c \x01(\r\x12\x0b\n\x03\x64\x30\x39\x18\r \x01(\r\x12\x0b\n\x03\x64\x31\x30\x18\x0e \x01(\r\x12\x0b\n\x03\x64\x31\x31\x18\x0f \x01(\r\x12\x0b\n\x03\x64\x31\x32\x18\x10 \x01(\r\x12\x0b\n\x03\x64\x31\x33\x18\x11 \x01(\r\x12\x0b\n\x03\x64\x31\x34\x18\x12 \x01(\r\"\xb4\x01\n\x1dSdeSdePerfCalcCrtcFtraceEvent\x12\x12\n\nbw_ctl_ebi\x18\x01 \x01(\x04\x12\x13\n\x0b\x62w_ctl_llcc\x18\x02 \x01(\x04\x12\x13\n\x0b\x62w_ctl_mnoc\x18\x03 \x01(\x04\x12\x15\n\rcore_clk_rate\x18\x04 \x01(\r\x12\x0c\n\x04\x63rtc\x18\x05 \x01(\r\x12\x0e\n\x06ib_ebi\x18\x06 \x01(\x04\x12\x0f\n\x07ib_llcc\x18\x07 \x01(\x04\x12\x0f\n\x07ib_mnoc\x18\x08 \x01(\x04\"\x9b\x02\n\x1fSdeSdePerfCrtcUpdateFtraceEvent\x12\x12\n\nbw_ctl_ebi\x18\x01 \x01(\x04\x12\x13\n\x0b\x62w_ctl_llcc\x18\x02 \x01(\x04\x12\x13\n\x0b\x62w_ctl_mnoc\x18\x03 \x01(\x04\x12\x15\n\rcore_clk_rate\x18\x04 \x01(\r\x12\x0c\n\x04\x63rtc\x18\x05 \x01(\r\x12\x0e\n\x06params\x18\x06 \x01(\x05\x12\x17\n\x0fper_pipe_ib_ebi\x18\x07 \x01(\x04\x12\x18\n\x10per_pipe_ib_llcc\x18\x08 \x01(\x04\x12\x18\n\x10per_pipe_ib_mnoc\x18\t \x01(\x04\x12\x10\n\x08stop_req\x18\n \x01(\r\x12\x12\n\nupdate_bus\x18\x0b \x01(\r\x12\x12\n\nupdate_clk\x18\x0c \x01(\r\"t\n\x1fSdeSdePerfSetQosLutsFtraceEvent\x12\n\n\x02\x66l\x18\x01 \x01(\r\x12\x0b\n\x03\x66mt\x18\x02 \x01(\r\x12\x0b\n\x03lut\x18\x03 \x01(\x04\x12\x11\n\tlut_usage\x18\x04 \x01(\r\x12\x0c\n\x04pnum\x18\x05 \x01(\r\x12\n\n\x02rt\x18\x06 \x01(\r\"d\n\x1eSdeSdePerfUpdateBusFtraceEvent\x12\x10\n\x08\x61\x62_quota\x18\x01 \x01(\x04\x12\x0e\n\x06\x62us_id\x18\x02 \x01(\r\x12\x0e\n\x06\x63lient\x18\x03 \x01(\x05\x12\x10\n\x08ib_quota\x18\x04 \x01(\x04\"G\n\x18SignalDeliverFtraceEvent\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x10\n\x08sa_flags\x18\x02 \x01(\x04\x12\x0b\n\x03sig\x18\x03 \x01(\x05\"p\n\x19SignalGenerateFtraceEvent\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\x12\r\n\x05group\x18\x03 \x01(\x05\x12\x0b\n\x03pid\x18\x04 \x01(\x05\x12\x0e\n\x06result\x18\x05 \x01(\x05\x12\x0b\n\x03sig\x18\x06 \x01(\x05\"J\n\x13KfreeSkbFtraceEvent\x12\x10\n\x08location\x18\x01 \x01(\x04\x12\x10\n\x08protocol\x18\x02 \x01(\r\x12\x0f\n\x07skbaddr\x18\x03 \x01(\x04\"\xaf\x01\n\x1bInetSockSetStateFtraceEvent\x12\r\n\x05\x64\x61\x64\x64r\x18\x01 \x01(\r\x12\r\n\x05\x64port\x18\x02 \x01(\r\x12\x0e\n\x06\x66\x61mily\x18\x03 \x01(\r\x12\x10\n\x08newstate\x18\x04 \x01(\x05\x12\x10\n\x08oldstate\x18\x05 \x01(\x05\x12\x10\n\x08protocol\x18\x06 \x01(\r\x12\r\n\x05saddr\x18\x07 \x01(\r\x12\x0e\n\x06skaddr\x18\x08 \x01(\x04\x12\r\n\x05sport\x18\t \x01(\r\"4\n\x11SyncPtFtraceEvent\x12\x10\n\x08timeline\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"6\n\x17SyncTimelineFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"B\n\x13SyncWaitFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\x05\x12\r\n\x05\x62\x65gin\x18\x03 \x01(\r\"X\n\x1bRssStatThrottledFtraceEvent\x12\x0c\n\x04\x63urr\x18\x01 \x01(\r\x12\x0e\n\x06member\x18\x02 \x01(\x05\x12\r\n\x05mm_id\x18\x03 \x01(\r\x12\x0c\n\x04size\x18\x04 \x01(\x03\"0\n\x1fSuspendResumeMinimalFtraceEvent\x12\r\n\x05start\x18\x01 \x01(\r\"I\n\x0fZeroFtraceEvent\x12\x0c\n\x04\x66lag\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0b\n\x03pid\x18\x03 \x01(\x05\x12\r\n\x05value\x18\x04 \x01(\x03\"_\n\x16TaskNewtaskFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\x12\x13\n\x0b\x63lone_flags\x18\x03 \x01(\x04\x12\x15\n\room_score_adj\x18\x04 \x01(\x05\"]\n\x15TaskRenameFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0f\n\x07oldcomm\x18\x02 \x01(\t\x12\x0f\n\x07newcomm\x18\x03 \x01(\t\x12\x15\n\room_score_adj\x18\x04 \x01(\x05\"\x89\x01\n\x1bTcpRetransmitSkbFtraceEvent\x12\r\n\x05\x64\x61\x64\x64r\x18\x01 \x01(\r\x12\r\n\x05\x64port\x18\x02 \x01(\r\x12\r\n\x05saddr\x18\x03 \x01(\r\x12\x0e\n\x06skaddr\x18\x04 \x01(\x04\x12\x0f\n\x07skbaddr\x18\x05 \x01(\x04\x12\r\n\x05sport\x18\x06 \x01(\r\x12\r\n\x05state\x18\x07 \x01(\x05\"b\n\x1dThermalTemperatureFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04temp\x18\x02 \x01(\x05\x12\x11\n\ttemp_prev\x18\x03 \x01(\x05\x12\x14\n\x0cthermal_zone\x18\x04 \x01(\t\"5\n\x15\x43\x64\x65vUpdateFtraceEvent\x12\x0e\n\x06target\x18\x01 \x01(\x04\x12\x0c\n\x04type\x18\x02 \x01(\t\"\xe4\x01\n ThermalExynosAcpmBulkFtraceEvent\x12\r\n\x05tz_id\x18\x01 \x01(\r\x12\x14\n\x0c\x63urrent_temp\x18\x02 \x01(\r\x12\x11\n\tctrl_temp\x18\x03 \x01(\r\x12\x12\n\ncdev_state\x18\x04 \x01(\r\x12\x10\n\x08pid_et_p\x18\x05 \x01(\x05\x12\x17\n\x0fpid_power_range\x18\x06 \x01(\x05\x12\r\n\x05pid_p\x18\x07 \x01(\x05\x12\r\n\x05pid_i\x18\x08 \x01(\x05\x12\x0b\n\x03k_p\x18\t \x01(\x05\x12\x0b\n\x03k_i\x18\n \x01(\x05\x12\x11\n\ttimestamp\x18\x0b \x01(\x04\"\xa2\x01\n(ThermalExynosAcpmHighOverheadFtraceEvent\x12\r\n\x05tz_id\x18\x01 \x01(\x05\x12\x14\n\x0c\x63urrent_temp\x18\x02 \x01(\r\x12\x11\n\tctrl_temp\x18\x03 \x01(\r\x12\x12\n\ncdev_state\x18\x04 \x01(\r\x12\x10\n\x08pid_et_p\x18\x05 \x01(\x05\x12\x0b\n\x03k_p\x18\x06 \x01(\x05\x12\x0b\n\x03k_i\x18\x07 \x01(\x05\"p\n\x17HrtimerStartFtraceEvent\x12\x0f\n\x07hrtimer\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\x12\x0f\n\x07\x65xpires\x18\x03 \x01(\x03\x12\x13\n\x0bsoftexpires\x18\x04 \x01(\x03\x12\x0c\n\x04mode\x18\x05 \x01(\r\"+\n\x18HrtimerCancelFtraceEvent\x12\x0f\n\x07hrtimer\x18\x01 \x01(\x04\"O\n\x1dHrtimerExpireEntryFtraceEvent\x12\x0f\n\x07hrtimer\x18\x01 \x01(\x04\x12\x0b\n\x03now\x18\x02 \x01(\x03\x12\x10\n\x08\x66unction\x18\x03 \x01(\x04\"/\n\x1cHrtimerExpireExitFtraceEvent\x12\x0f\n\x07hrtimer\x18\x01 \x01(\x04\"\x90\x01\n\x15TimerStartFtraceEvent\x12\r\n\x05timer\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\x12\x0f\n\x07\x65xpires\x18\x03 \x01(\x04\x12\x0b\n\x03now\x18\x04 \x01(\x04\x12\x12\n\ndeferrable\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x06 \x01(\r\x12\x15\n\rbucket_expiry\x18\x07 \x01(\x04\"\'\n\x16TimerCancelFtraceEvent\x12\r\n\x05timer\x18\x01 \x01(\x04\"\\\n\x1bTimerExpireEntryFtraceEvent\x12\r\n\x05timer\x18\x01 \x01(\x04\x12\x0b\n\x03now\x18\x02 \x01(\x04\x12\x10\n\x08\x66unction\x18\x03 \x01(\x04\x12\x0f\n\x07\x62\x61seclk\x18\x04 \x01(\x04\"+\n\x1aTimerExpireExitFtraceEvent\x12\r\n\x05timer\x18\x01 \x01(\x04\"F\n\x14TrustySmcFtraceEvent\x12\n\n\x02r0\x18\x01 \x01(\x04\x12\n\n\x02r1\x18\x02 \x01(\x04\x12\n\n\x02r2\x18\x03 \x01(\x04\x12\n\n\x02r3\x18\x04 \x01(\x04\"\'\n\x18TrustySmcDoneFtraceEvent\x12\x0b\n\x03ret\x18\x01 \x01(\x04\"L\n\x1aTrustyStdCall32FtraceEvent\x12\n\n\x02r0\x18\x01 \x01(\x04\x12\n\n\x02r1\x18\x02 \x01(\x04\x12\n\n\x02r2\x18\x03 \x01(\x04\x12\n\n\x02r3\x18\x04 \x01(\x04\"-\n\x1eTrustyStdCall32DoneFtraceEvent\x12\x0b\n\x03ret\x18\x01 \x01(\x03\"H\n\x1cTrustyShareMemoryFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\x04\x12\x0c\n\x04lend\x18\x02 \x01(\r\x12\r\n\x05nents\x18\x03 \x01(\r\"i\n TrustyShareMemoryDoneFtraceEvent\x12\x0e\n\x06handle\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\x0c\n\x04lend\x18\x03 \x01(\r\x12\r\n\x05nents\x18\x04 \x01(\r\x12\x0b\n\x03ret\x18\x05 \x01(\x05\",\n\x1eTrustyReclaimMemoryFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x04\"=\n\"TrustyReclaimMemoryDoneFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0b\n\x03ret\x18\x02 \x01(\x05\"#\n\x14TrustyIrqFtraceEvent\x12\x0b\n\x03irq\x18\x01 \x01(\x05\"S\n\x1fTrustyIpcHandleEventFtraceEvent\x12\x0c\n\x04\x63han\x18\x01 \x01(\r\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\r\x12\x10\n\x08srv_name\x18\x03 \x01(\t\"H\n\x1bTrustyIpcConnectFtraceEvent\x12\x0c\n\x04\x63han\x18\x01 \x01(\r\x12\x0c\n\x04port\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x05\"J\n\x1eTrustyIpcConnectEndFtraceEvent\x12\x0c\n\x04\x63han\x18\x01 \x01(\r\x12\x0b\n\x03\x65rr\x18\x02 \x01(\x05\x12\r\n\x05state\x18\x03 \x01(\x05\"\x82\x01\n\x19TrustyIpcWriteFtraceEvent\x12\x0e\n\x06\x62uf_id\x18\x01 \x01(\x04\x12\x0c\n\x04\x63han\x18\x02 \x01(\r\x12\x10\n\x08kind_shm\x18\x03 \x01(\x05\x12\x12\n\nlen_or_err\x18\x04 \x01(\x05\x12\x0f\n\x07shm_cnt\x18\x05 \x01(\x04\x12\x10\n\x08srv_name\x18\x06 \x01(\t\"M\n\x18TrustyIpcPollFtraceEvent\x12\x0c\n\x04\x63han\x18\x01 \x01(\r\x12\x11\n\tpoll_mask\x18\x02 \x01(\r\x12\x10\n\x08srv_name\x18\x03 \x01(\t\":\n\x18TrustyIpcReadFtraceEvent\x12\x0c\n\x04\x63han\x18\x01 \x01(\r\x12\x10\n\x08srv_name\x18\x02 \x01(\t\"r\n\x1bTrustyIpcReadEndFtraceEvent\x12\x0e\n\x06\x62uf_id\x18\x01 \x01(\x04\x12\x0c\n\x04\x63han\x18\x02 \x01(\r\x12\x12\n\nlen_or_err\x18\x03 \x01(\x05\x12\x0f\n\x07shm_cnt\x18\x04 \x01(\x04\x12\x10\n\x08srv_name\x18\x05 \x01(\t\"H\n\x16TrustyIpcRxFtraceEvent\x12\x0e\n\x06\x62uf_id\x18\x01 \x01(\x04\x12\x0c\n\x04\x63han\x18\x02 \x01(\r\x12\x10\n\x08srv_name\x18\x03 \x01(\t\"G\n\x1bTrustyEnqueueNopFtraceEvent\x12\x0c\n\x04\x61rg1\x18\x01 \x01(\r\x12\x0c\n\x04\x61rg2\x18\x02 \x01(\r\x12\x0c\n\x04\x61rg3\x18\x03 \x01(\r\"\xba\x01\n\x18UfshcdCommandFtraceEvent\x12\x10\n\x08\x64\x65v_name\x18\x01 \x01(\t\x12\x10\n\x08\x64oorbell\x18\x02 \x01(\r\x12\x0c\n\x04intr\x18\x03 \x01(\r\x12\x0b\n\x03lba\x18\x04 \x01(\x04\x12\x0e\n\x06opcode\x18\x05 \x01(\r\x12\x0b\n\x03str\x18\x06 \x01(\t\x12\x0b\n\x03tag\x18\x07 \x01(\r\x12\x14\n\x0ctransfer_len\x18\x08 \x01(\x05\x12\x10\n\x08group_id\x18\t \x01(\r\x12\r\n\x05str_t\x18\n \x01(\r\"=\n\x1aUfshcdClkGatingFtraceEvent\x12\x10\n\x08\x64\x65v_name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x05\"\x9b\x03\n\x13V4l2QbufFtraceEvent\x12\x11\n\tbytesused\x18\x01 \x01(\r\x12\r\n\x05\x66ield\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\r\n\x05index\x18\x04 \x01(\r\x12\r\n\x05minor\x18\x05 \x01(\x05\x12\x10\n\x08sequence\x18\x06 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x07 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x08 \x01(\r\x12\x16\n\x0etimecode_hours\x18\t \x01(\r\x12\x18\n\x10timecode_minutes\x18\n \x01(\r\x12\x18\n\x10timecode_seconds\x18\x0b \x01(\r\x12\x15\n\rtimecode_type\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0e \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\x0f \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x10 \x01(\r\x12\x11\n\ttimestamp\x18\x11 \x01(\x03\x12\x0c\n\x04type\x18\x12 \x01(\r\"\x9c\x03\n\x14V4l2DqbufFtraceEvent\x12\x11\n\tbytesused\x18\x01 \x01(\r\x12\r\n\x05\x66ield\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\r\n\x05index\x18\x04 \x01(\r\x12\r\n\x05minor\x18\x05 \x01(\x05\x12\x10\n\x08sequence\x18\x06 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x07 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x08 \x01(\r\x12\x16\n\x0etimecode_hours\x18\t \x01(\r\x12\x18\n\x10timecode_minutes\x18\n \x01(\r\x12\x18\n\x10timecode_seconds\x18\x0b \x01(\r\x12\x15\n\rtimecode_type\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0e \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\x0f \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x10 \x01(\r\x12\x11\n\ttimestamp\x18\x11 \x01(\x03\x12\x0c\n\x04type\x18\x12 \x01(\r\"\xf2\x02\n\x1aVb2V4l2BufQueueFtraceEvent\x12\r\n\x05\x66ield\x18\x01 \x01(\r\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\r\n\x05minor\x18\x03 \x01(\x05\x12\x10\n\x08sequence\x18\x04 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x05 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x06 \x01(\r\x12\x16\n\x0etimecode_hours\x18\x07 \x01(\r\x12\x18\n\x10timecode_minutes\x18\x08 \x01(\r\x12\x18\n\x10timecode_seconds\x18\t \x01(\r\x12\x15\n\rtimecode_type\x18\n \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\x0b \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x0e \x01(\r\x12\x11\n\ttimestamp\x18\x0f \x01(\x03\"\xf1\x02\n\x19Vb2V4l2BufDoneFtraceEvent\x12\r\n\x05\x66ield\x18\x01 \x01(\r\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\r\n\x05minor\x18\x03 \x01(\x05\x12\x10\n\x08sequence\x18\x04 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x05 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x06 \x01(\r\x12\x16\n\x0etimecode_hours\x18\x07 \x01(\r\x12\x18\n\x10timecode_minutes\x18\x08 \x01(\r\x12\x18\n\x10timecode_seconds\x18\t \x01(\r\x12\x15\n\rtimecode_type\x18\n \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\x0b \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x0e \x01(\r\x12\x11\n\ttimestamp\x18\x0f \x01(\x03\"\xee\x02\n\x16Vb2V4l2QbufFtraceEvent\x12\r\n\x05\x66ield\x18\x01 \x01(\r\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\r\n\x05minor\x18\x03 \x01(\x05\x12\x10\n\x08sequence\x18\x04 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x05 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x06 \x01(\r\x12\x16\n\x0etimecode_hours\x18\x07 \x01(\r\x12\x18\n\x10timecode_minutes\x18\x08 \x01(\r\x12\x18\n\x10timecode_seconds\x18\t \x01(\r\x12\x15\n\rtimecode_type\x18\n \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\x0b \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x0e \x01(\r\x12\x11\n\ttimestamp\x18\x0f \x01(\x03\"\xef\x02\n\x17Vb2V4l2DqbufFtraceEvent\x12\r\n\x05\x66ield\x18\x01 \x01(\r\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\r\n\x05minor\x18\x03 \x01(\x05\x12\x10\n\x08sequence\x18\x04 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x05 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x06 \x01(\r\x12\x16\n\x0etimecode_hours\x18\x07 \x01(\r\x12\x18\n\x10timecode_minutes\x18\x08 \x01(\r\x12\x18\n\x10timecode_seconds\x18\t \x01(\r\x12\x15\n\rtimecode_type\x18\n \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\x0b \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x0e \x01(\r\x12\x11\n\ttimestamp\x18\x0f \x01(\x03\"\xa5\x01\n\x1cVirtioGpuCmdQueueFtraceEvent\x12\x0e\n\x06\x63tx_id\x18\x01 \x01(\r\x12\x0b\n\x03\x64\x65v\x18\x02 \x01(\x05\x12\x10\n\x08\x66\x65nce_id\x18\x03 \x01(\x04\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x10\n\x08num_free\x18\x06 \x01(\r\x12\r\n\x05seqno\x18\x07 \x01(\r\x12\x0c\n\x04type\x18\x08 \x01(\r\x12\n\n\x02vq\x18\t \x01(\r\"\xa8\x01\n\x1fVirtioGpuCmdResponseFtraceEvent\x12\x0e\n\x06\x63tx_id\x18\x01 \x01(\r\x12\x0b\n\x03\x64\x65v\x18\x02 \x01(\x05\x12\x10\n\x08\x66\x65nce_id\x18\x03 \x01(\x04\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x10\n\x08num_free\x18\x06 \x01(\r\x12\r\n\x05seqno\x18\x07 \x01(\r\x12\x0c\n\x04type\x18\x08 \x01(\r\x12\n\n\x02vq\x18\t \x01(\r\"<\n\x19VirtioVideoCmdFtraceEvent\x12\x11\n\tstream_id\x18\x01 \x01(\r\x12\x0c\n\x04type\x18\x02 \x01(\r\"@\n\x1dVirtioVideoCmdDoneFtraceEvent\x12\x11\n\tstream_id\x18\x01 \x01(\r\x12\x0c\n\x04type\x18\x02 \x01(\r\"\xc4\x01\n#VirtioVideoResourceQueueFtraceEvent\x12\x12\n\ndata_size0\x18\x01 \x01(\r\x12\x12\n\ndata_size1\x18\x02 \x01(\r\x12\x12\n\ndata_size2\x18\x03 \x01(\r\x12\x12\n\ndata_size3\x18\x04 \x01(\r\x12\x12\n\nqueue_type\x18\x05 \x01(\r\x12\x13\n\x0bresource_id\x18\x06 \x01(\x05\x12\x11\n\tstream_id\x18\x07 \x01(\x05\x12\x11\n\ttimestamp\x18\x08 \x01(\x04\"\xc8\x01\n\'VirtioVideoResourceQueueDoneFtraceEvent\x12\x12\n\ndata_size0\x18\x01 \x01(\r\x12\x12\n\ndata_size1\x18\x02 \x01(\r\x12\x12\n\ndata_size2\x18\x03 \x01(\r\x12\x12\n\ndata_size3\x18\x04 \x01(\r\x12\x12\n\nqueue_type\x18\x05 \x01(\r\x12\x13\n\x0bresource_id\x18\x06 \x01(\x05\x12\x11\n\tstream_id\x18\x07 \x01(\x05\x12\x11\n\ttimestamp\x18\x08 \x01(\x04\"`\n%MmVmscanDirectReclaimBeginFtraceEvent\x12\r\n\x05order\x18\x01 \x01(\x05\x12\x15\n\rmay_writepage\x18\x02 \x01(\x05\x12\x11\n\tgfp_flags\x18\x03 \x01(\r\";\n#MmVmscanDirectReclaimEndFtraceEvent\x12\x14\n\x0cnr_reclaimed\x18\x01 \x01(\x04\"H\n\x1dMmVmscanKswapdWakeFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\r\n\x05order\x18\x02 \x01(\x05\x12\x0b\n\x03zid\x18\x03 \x01(\x05\"-\n\x1eMmVmscanKswapdSleepFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\"\xe9\x01\n\x1cMmShrinkSlabStartFtraceEvent\x12\x13\n\x0b\x63\x61\x63he_items\x18\x01 \x01(\x04\x12\r\n\x05\x64\x65lta\x18\x02 \x01(\x04\x12\x11\n\tgfp_flags\x18\x03 \x01(\r\x12\x0f\n\x07lru_pgs\x18\x04 \x01(\x04\x12\x1c\n\x14nr_objects_to_shrink\x18\x05 \x01(\x03\x12\x13\n\x0bpgs_scanned\x18\x06 \x01(\x04\x12\x0b\n\x03shr\x18\x07 \x01(\x04\x12\x0e\n\x06shrink\x18\x08 \x01(\x04\x12\x12\n\ntotal_scan\x18\t \x01(\x04\x12\x0b\n\x03nid\x18\n \x01(\x05\x12\x10\n\x08priority\x18\x0b \x01(\x05\"\x91\x01\n\x1aMmShrinkSlabEndFtraceEvent\x12\x10\n\x08new_scan\x18\x01 \x01(\x03\x12\x0e\n\x06retval\x18\x02 \x01(\x05\x12\x0b\n\x03shr\x18\x03 \x01(\x04\x12\x0e\n\x06shrink\x18\x04 \x01(\x04\x12\x12\n\ntotal_scan\x18\x05 \x01(\x03\x12\x13\n\x0bunused_scan\x18\x06 \x01(\x03\x12\x0b\n\x03nid\x18\x07 \x01(\x05\"_\n$MmVmscanMemcgReclaimBeginFtraceEvent\x12\r\n\x05order\x18\x01 \x01(\x05\x12\x15\n\rmay_writepage\x18\x02 \x01(\x05\x12\x11\n\tgfp_flags\x18\x03 \x01(\x04\":\n\"MmVmscanMemcgReclaimEndFtraceEvent\x12\x14\n\x0cnr_reclaimed\x18\x01 \x01(\x04\"B\n WorkqueueActivateWorkFtraceEvent\x12\x0c\n\x04work\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\"@\n\x1eWorkqueueExecuteEndFtraceEvent\x12\x0c\n\x04work\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\"B\n WorkqueueExecuteStartFtraceEvent\x12\x0c\n\x04work\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\"p\n\x1dWorkqueueQueueWorkFtraceEvent\x12\x0c\n\x04work\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\x12\x0f\n\x07req_cpu\x18\x04 \x01(\x05\x12\x0b\n\x03\x63pu\x18\x05 \x01(\x05\x12\x11\n\tworkqueue\x18\x06 \x01(\t\"\x83\xec\x02\n\x0b\x46traceEvent\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x14\n\x0c\x63ommon_flags\x18\x05 \x01(\r\x12\x32\n\x05print\x18\x03 \x01(\x0b\x32!.perfetto.protos.PrintFtraceEventH\x00\x12?\n\x0csched_switch\x18\x04 \x01(\x0b\x32\'.perfetto.protos.SchedSwitchFtraceEventH\x00\x12\x41\n\rcpu_frequency\x18\x0b \x01(\x0b\x32(.perfetto.protos.CpuFrequencyFtraceEventH\x00\x12N\n\x14\x63pu_frequency_limits\x18\x0c \x01(\x0b\x32..perfetto.protos.CpuFrequencyLimitsFtraceEventH\x00\x12\x37\n\x08\x63pu_idle\x18\r \x01(\x0b\x32#.perfetto.protos.CpuIdleFtraceEventH\x00\x12?\n\x0c\x63lock_enable\x18\x0e \x01(\x0b\x32\'.perfetto.protos.ClockEnableFtraceEventH\x00\x12\x41\n\rclock_disable\x18\x0f \x01(\x0b\x32(.perfetto.protos.ClockDisableFtraceEventH\x00\x12\x42\n\x0e\x63lock_set_rate\x18\x10 \x01(\x0b\x32(.perfetto.protos.ClockSetRateFtraceEventH\x00\x12?\n\x0csched_wakeup\x18\x11 \x01(\x0b\x32\'.perfetto.protos.SchedWakeupFtraceEventH\x00\x12N\n\x14sched_blocked_reason\x18\x12 \x01(\x0b\x32..perfetto.protos.SchedBlockedReasonFtraceEventH\x00\x12H\n\x11sched_cpu_hotplug\x18\x13 \x01(\x0b\x32+.perfetto.protos.SchedCpuHotplugFtraceEventH\x00\x12?\n\x0csched_waking\x18\x14 \x01(\x0b\x32\'.perfetto.protos.SchedWakingFtraceEventH\x00\x12\x39\n\tipi_entry\x18\x15 \x01(\x0b\x32$.perfetto.protos.IpiEntryFtraceEventH\x00\x12\x37\n\x08ipi_exit\x18\x16 \x01(\x0b\x32#.perfetto.protos.IpiExitFtraceEventH\x00\x12\x39\n\tipi_raise\x18\x17 \x01(\x0b\x32$.perfetto.protos.IpiRaiseFtraceEventH\x00\x12\x41\n\rsoftirq_entry\x18\x18 \x01(\x0b\x32(.perfetto.protos.SoftirqEntryFtraceEventH\x00\x12?\n\x0csoftirq_exit\x18\x19 \x01(\x0b\x32\'.perfetto.protos.SoftirqExitFtraceEventH\x00\x12\x41\n\rsoftirq_raise\x18\x1a \x01(\x0b\x32(.perfetto.protos.SoftirqRaiseFtraceEventH\x00\x12\x37\n\x08i2c_read\x18\x1b \x01(\x0b\x32#.perfetto.protos.I2cReadFtraceEventH\x00\x12\x39\n\ti2c_write\x18\x1c \x01(\x0b\x32$.perfetto.protos.I2cWriteFtraceEventH\x00\x12;\n\ni2c_result\x18\x1d \x01(\x0b\x32%.perfetto.protos.I2cResultFtraceEventH\x00\x12\x39\n\ti2c_reply\x18\x1e \x01(\x0b\x32$.perfetto.protos.I2cReplyFtraceEventH\x00\x12;\n\nsmbus_read\x18\x1f \x01(\x0b\x32%.perfetto.protos.SmbusReadFtraceEventH\x00\x12=\n\x0bsmbus_write\x18 \x01(\x0b\x32&.perfetto.protos.SmbusWriteFtraceEventH\x00\x12?\n\x0csmbus_result\x18! \x01(\x0b\x32\'.perfetto.protos.SmbusResultFtraceEventH\x00\x12=\n\x0bsmbus_reply\x18\" \x01(\x0b\x32&.perfetto.protos.SmbusReplyFtraceEventH\x00\x12\x43\n\x0elowmemory_kill\x18# \x01(\x0b\x32).perfetto.protos.LowmemoryKillFtraceEventH\x00\x12H\n\x11irq_handler_entry\x18$ \x01(\x0b\x32+.perfetto.protos.IrqHandlerEntryFtraceEventH\x00\x12\x46\n\x10irq_handler_exit\x18% \x01(\x0b\x32*.perfetto.protos.IrqHandlerExitFtraceEventH\x00\x12\x35\n\x07sync_pt\x18& \x01(\x0b\x32\".perfetto.protos.SyncPtFtraceEventH\x00\x12\x41\n\rsync_timeline\x18\' \x01(\x0b\x32(.perfetto.protos.SyncTimelineFtraceEventH\x00\x12\x39\n\tsync_wait\x18( \x01(\x0b\x32$.perfetto.protos.SyncWaitFtraceEventH\x00\x12K\n\x13\x65xt4_da_write_begin\x18) \x01(\x0b\x32,.perfetto.protos.Ext4DaWriteBeginFtraceEventH\x00\x12G\n\x11\x65xt4_da_write_end\x18* \x01(\x0b\x32*.perfetto.protos.Ext4DaWriteEndFtraceEventH\x00\x12M\n\x14\x65xt4_sync_file_enter\x18+ \x01(\x0b\x32-.perfetto.protos.Ext4SyncFileEnterFtraceEventH\x00\x12K\n\x13\x65xt4_sync_file_exit\x18, \x01(\x0b\x32,.perfetto.protos.Ext4SyncFileExitFtraceEventH\x00\x12\x42\n\x0e\x62lock_rq_issue\x18- \x01(\x0b\x32(.perfetto.protos.BlockRqIssueFtraceEventH\x00\x12`\n\x1emm_vmscan_direct_reclaim_begin\x18. \x01(\x0b\x32\x36.perfetto.protos.MmVmscanDirectReclaimBeginFtraceEventH\x00\x12\\\n\x1cmm_vmscan_direct_reclaim_end\x18/ \x01(\x0b\x32\x34.perfetto.protos.MmVmscanDirectReclaimEndFtraceEventH\x00\x12O\n\x15mm_vmscan_kswapd_wake\x18\x30 \x01(\x0b\x32..perfetto.protos.MmVmscanKswapdWakeFtraceEventH\x00\x12Q\n\x16mm_vmscan_kswapd_sleep\x18\x31 \x01(\x0b\x32/.perfetto.protos.MmVmscanKswapdSleepFtraceEventH\x00\x12K\n\x12\x62inder_transaction\x18\x32 \x01(\x0b\x32-.perfetto.protos.BinderTransactionFtraceEventH\x00\x12\\\n\x1b\x62inder_transaction_received\x18\x33 \x01(\x0b\x32\x35.perfetto.protos.BinderTransactionReceivedFtraceEventH\x00\x12L\n\x13\x62inder_set_priority\x18\x34 \x01(\x0b\x32-.perfetto.protos.BinderSetPriorityFtraceEventH\x00\x12=\n\x0b\x62inder_lock\x18\x35 \x01(\x0b\x32&.perfetto.protos.BinderLockFtraceEventH\x00\x12\x41\n\rbinder_locked\x18\x36 \x01(\x0b\x32(.perfetto.protos.BinderLockedFtraceEventH\x00\x12\x41\n\rbinder_unlock\x18\x37 \x01(\x0b\x32(.perfetto.protos.BinderUnlockFtraceEventH\x00\x12T\n\x17workqueue_activate_work\x18\x38 \x01(\x0b\x32\x31.perfetto.protos.WorkqueueActivateWorkFtraceEventH\x00\x12P\n\x15workqueue_execute_end\x18\x39 \x01(\x0b\x32/.perfetto.protos.WorkqueueExecuteEndFtraceEventH\x00\x12T\n\x17workqueue_execute_start\x18: \x01(\x0b\x32\x31.perfetto.protos.WorkqueueExecuteStartFtraceEventH\x00\x12N\n\x14workqueue_queue_work\x18; \x01(\x0b\x32..perfetto.protos.WorkqueueQueueWorkFtraceEventH\x00\x12I\n\x11regulator_disable\x18< \x01(\x0b\x32,.perfetto.protos.RegulatorDisableFtraceEventH\x00\x12Z\n\x1aregulator_disable_complete\x18= \x01(\x0b\x32\x34.perfetto.protos.RegulatorDisableCompleteFtraceEventH\x00\x12G\n\x10regulator_enable\x18> \x01(\x0b\x32+.perfetto.protos.RegulatorEnableFtraceEventH\x00\x12X\n\x19regulator_enable_complete\x18? \x01(\x0b\x32\x33.perfetto.protos.RegulatorEnableCompleteFtraceEventH\x00\x12R\n\x16regulator_enable_delay\x18@ \x01(\x0b\x32\x30.perfetto.protos.RegulatorEnableDelayFtraceEventH\x00\x12P\n\x15regulator_set_voltage\x18\x41 \x01(\x0b\x32/.perfetto.protos.RegulatorSetVoltageFtraceEventH\x00\x12\x61\n\x1eregulator_set_voltage_complete\x18\x42 \x01(\x0b\x32\x37.perfetto.protos.RegulatorSetVoltageCompleteFtraceEventH\x00\x12J\n\x12\x63group_attach_task\x18\x43 \x01(\x0b\x32,.perfetto.protos.CgroupAttachTaskFtraceEventH\x00\x12?\n\x0c\x63group_mkdir\x18\x44 \x01(\x0b\x32\'.perfetto.protos.CgroupMkdirFtraceEventH\x00\x12\x43\n\x0e\x63group_remount\x18\x45 \x01(\x0b\x32).perfetto.protos.CgroupRemountFtraceEventH\x00\x12?\n\x0c\x63group_rmdir\x18\x46 \x01(\x0b\x32\'.perfetto.protos.CgroupRmdirFtraceEventH\x00\x12P\n\x15\x63group_transfer_tasks\x18G \x01(\x0b\x32/.perfetto.protos.CgroupTransferTasksFtraceEventH\x00\x12L\n\x13\x63group_destroy_root\x18H \x01(\x0b\x32-.perfetto.protos.CgroupDestroyRootFtraceEventH\x00\x12\x43\n\x0e\x63group_release\x18I \x01(\x0b\x32).perfetto.protos.CgroupReleaseFtraceEventH\x00\x12\x41\n\rcgroup_rename\x18J \x01(\x0b\x32(.perfetto.protos.CgroupRenameFtraceEventH\x00\x12H\n\x11\x63group_setup_root\x18K \x01(\x0b\x32+.perfetto.protos.CgroupSetupRootFtraceEventH\x00\x12\x44\n\x0fmdp_cmd_kickoff\x18L \x01(\x0b\x32).perfetto.protos.MdpCmdKickoffFtraceEventH\x00\x12;\n\nmdp_commit\x18M \x01(\x0b\x32%.perfetto.protos.MdpCommitFtraceEventH\x00\x12\x43\n\x0fmdp_perf_set_ot\x18N \x01(\x0b\x32(.perfetto.protos.MdpPerfSetOtFtraceEventH\x00\x12\x44\n\x0fmdp_sspp_change\x18O \x01(\x0b\x32).perfetto.protos.MdpSsppChangeFtraceEventH\x00\x12J\n\x12tracing_mark_write\x18P \x01(\x0b\x32,.perfetto.protos.TracingMarkWriteFtraceEventH\x00\x12O\n\x15mdp_cmd_pingpong_done\x18Q \x01(\x0b\x32..perfetto.protos.MdpCmdPingpongDoneFtraceEventH\x00\x12\x42\n\x0emdp_compare_bw\x18R \x01(\x0b\x32(.perfetto.protos.MdpCompareBwFtraceEventH\x00\x12R\n\x17mdp_perf_set_panic_luts\x18S \x01(\x0b\x32/.perfetto.protos.MdpPerfSetPanicLutsFtraceEventH\x00\x12>\n\x0cmdp_sspp_set\x18T \x01(\x0b\x32&.perfetto.protos.MdpSsppSetFtraceEventH\x00\x12M\n\x14mdp_cmd_readptr_done\x18U \x01(\x0b\x32-.perfetto.protos.MdpCmdReadptrDoneFtraceEventH\x00\x12>\n\x0cmdp_misr_crc\x18V \x01(\x0b\x32&.perfetto.protos.MdpMisrCrcFtraceEventH\x00\x12N\n\x15mdp_perf_set_qos_luts\x18W \x01(\x0b\x32-.perfetto.protos.MdpPerfSetQosLutsFtraceEventH\x00\x12H\n\x11mdp_trace_counter\x18X \x01(\x0b\x32+.perfetto.protos.MdpTraceCounterFtraceEventH\x00\x12I\n\x12mdp_cmd_release_bw\x18Y \x01(\x0b\x32+.perfetto.protos.MdpCmdReleaseBwFtraceEventH\x00\x12\x46\n\x10mdp_mixer_update\x18Z \x01(\x0b\x32*.perfetto.protos.MdpMixerUpdateFtraceEventH\x00\x12P\n\x16mdp_perf_set_wm_levels\x18[ \x01(\x0b\x32..perfetto.protos.MdpPerfSetWmLevelsFtraceEventH\x00\x12S\n\x17mdp_video_underrun_done\x18\\ \x01(\x0b\x32\x30.perfetto.protos.MdpVideoUnderrunDoneFtraceEventH\x00\x12O\n\x15mdp_cmd_wait_pingpong\x18] \x01(\x0b\x32..perfetto.protos.MdpCmdWaitPingpongFtraceEventH\x00\x12O\n\x15mdp_perf_prefill_calc\x18^ \x01(\x0b\x32..perfetto.protos.MdpPerfPrefillCalcFtraceEventH\x00\x12K\n\x13mdp_perf_update_bus\x18_ \x01(\x0b\x32,.perfetto.protos.MdpPerfUpdateBusFtraceEventH\x00\x12T\n\x18rotator_bw_ao_as_context\x18` \x01(\x0b\x32\x30.perfetto.protos.RotatorBwAoAsContextFtraceEventH\x00\x12[\n\x1cmm_filemap_add_to_page_cache\x18\x61 \x01(\x0b\x32\x33.perfetto.protos.MmFilemapAddToPageCacheFtraceEventH\x00\x12\x65\n!mm_filemap_delete_from_page_cache\x18\x62 \x01(\x0b\x32\x38.perfetto.protos.MmFilemapDeleteFromPageCacheFtraceEventH\x00\x12L\n\x13mm_compaction_begin\x18\x63 \x01(\x0b\x32-.perfetto.protos.MmCompactionBeginFtraceEventH\x00\x12\x61\n\x1emm_compaction_defer_compaction\x18\x64 \x01(\x0b\x32\x37.perfetto.protos.MmCompactionDeferCompactionFtraceEventH\x00\x12R\n\x16mm_compaction_deferred\x18\x65 \x01(\x0b\x32\x30.perfetto.protos.MmCompactionDeferredFtraceEventH\x00\x12W\n\x19mm_compaction_defer_reset\x18\x66 \x01(\x0b\x32\x32.perfetto.protos.MmCompactionDeferResetFtraceEventH\x00\x12H\n\x11mm_compaction_end\x18g \x01(\x0b\x32+.perfetto.protos.MmCompactionEndFtraceEventH\x00\x12R\n\x16mm_compaction_finished\x18h \x01(\x0b\x32\x30.perfetto.protos.MmCompactionFinishedFtraceEventH\x00\x12\x63\n\x1fmm_compaction_isolate_freepages\x18i \x01(\x0b\x32\x38.perfetto.protos.MmCompactionIsolateFreepagesFtraceEventH\x00\x12i\n\"mm_compaction_isolate_migratepages\x18j \x01(\x0b\x32;.perfetto.protos.MmCompactionIsolateMigratepagesFtraceEventH\x00\x12_\n\x1dmm_compaction_kcompactd_sleep\x18k \x01(\x0b\x32\x36.perfetto.protos.MmCompactionKcompactdSleepFtraceEventH\x00\x12]\n\x1cmm_compaction_kcompactd_wake\x18l \x01(\x0b\x32\x35.perfetto.protos.MmCompactionKcompactdWakeFtraceEventH\x00\x12Z\n\x1amm_compaction_migratepages\x18m \x01(\x0b\x32\x34.perfetto.protos.MmCompactionMigratepagesFtraceEventH\x00\x12R\n\x16mm_compaction_suitable\x18n \x01(\x0b\x32\x30.perfetto.protos.MmCompactionSuitableFtraceEventH\x00\x12g\n\"mm_compaction_try_to_compact_pages\x18o \x01(\x0b\x32\x39.perfetto.protos.MmCompactionTryToCompactPagesFtraceEventH\x00\x12\x61\n\x1emm_compaction_wakeup_kcompactd\x18p \x01(\x0b\x32\x37.perfetto.protos.MmCompactionWakeupKcompactdFtraceEventH\x00\x12\x43\n\x0esuspend_resume\x18q \x01(\x0b\x32).perfetto.protos.SuspendResumeFtraceEventH\x00\x12\x46\n\x10sched_wakeup_new\x18r \x01(\x0b\x32*.perfetto.protos.SchedWakeupNewFtraceEventH\x00\x12L\n\x13\x62lock_bio_backmerge\x18s \x01(\x0b\x32-.perfetto.protos.BlockBioBackmergeFtraceEventH\x00\x12\x46\n\x10\x62lock_bio_bounce\x18t \x01(\x0b\x32*.perfetto.protos.BlockBioBounceFtraceEventH\x00\x12J\n\x12\x62lock_bio_complete\x18u \x01(\x0b\x32,.perfetto.protos.BlockBioCompleteFtraceEventH\x00\x12N\n\x14\x62lock_bio_frontmerge\x18v \x01(\x0b\x32..perfetto.protos.BlockBioFrontmergeFtraceEventH\x00\x12\x44\n\x0f\x62lock_bio_queue\x18w \x01(\x0b\x32).perfetto.protos.BlockBioQueueFtraceEventH\x00\x12\x44\n\x0f\x62lock_bio_remap\x18x \x01(\x0b\x32).perfetto.protos.BlockBioRemapFtraceEventH\x00\x12J\n\x12\x62lock_dirty_buffer\x18y \x01(\x0b\x32,.perfetto.protos.BlockDirtyBufferFtraceEventH\x00\x12=\n\x0b\x62lock_getrq\x18z \x01(\x0b\x32&.perfetto.protos.BlockGetrqFtraceEventH\x00\x12;\n\nblock_plug\x18{ \x01(\x0b\x32%.perfetto.protos.BlockPlugFtraceEventH\x00\x12\x42\n\x0e\x62lock_rq_abort\x18| \x01(\x0b\x32(.perfetto.protos.BlockRqAbortFtraceEventH\x00\x12H\n\x11\x62lock_rq_complete\x18} \x01(\x0b\x32+.perfetto.protos.BlockRqCompleteFtraceEventH\x00\x12\x44\n\x0f\x62lock_rq_insert\x18~ \x01(\x0b\x32).perfetto.protos.BlockRqInsertFtraceEventH\x00\x12\x43\n\x0e\x62lock_rq_remap\x18\x80\x01 \x01(\x0b\x32(.perfetto.protos.BlockRqRemapFtraceEventH\x00\x12G\n\x10\x62lock_rq_requeue\x18\x81\x01 \x01(\x0b\x32*.perfetto.protos.BlockRqRequeueFtraceEventH\x00\x12\x42\n\rblock_sleeprq\x18\x82\x01 \x01(\x0b\x32(.perfetto.protos.BlockSleeprqFtraceEventH\x00\x12>\n\x0b\x62lock_split\x18\x83\x01 \x01(\x0b\x32&.perfetto.protos.BlockSplitFtraceEventH\x00\x12K\n\x12\x62lock_touch_buffer\x18\x84\x01 \x01(\x0b\x32,.perfetto.protos.BlockTouchBufferFtraceEventH\x00\x12@\n\x0c\x62lock_unplug\x18\x85\x01 \x01(\x0b\x32\'.perfetto.protos.BlockUnplugFtraceEventH\x00\x12N\n\x14\x65xt4_alloc_da_blocks\x18\x86\x01 \x01(\x0b\x32-.perfetto.protos.Ext4AllocDaBlocksFtraceEventH\x00\x12O\n\x14\x65xt4_allocate_blocks\x18\x87\x01 \x01(\x0b\x32..perfetto.protos.Ext4AllocateBlocksFtraceEventH\x00\x12M\n\x13\x65xt4_allocate_inode\x18\x88\x01 \x01(\x0b\x32-.perfetto.protos.Ext4AllocateInodeFtraceEventH\x00\x12\\\n\x1b\x65xt4_begin_ordered_truncate\x18\x89\x01 \x01(\x0b\x32\x34.perfetto.protos.Ext4BeginOrderedTruncateFtraceEventH\x00\x12M\n\x13\x65xt4_collapse_range\x18\x8a\x01 \x01(\x0b\x32-.perfetto.protos.Ext4CollapseRangeFtraceEventH\x00\x12P\n\x15\x65xt4_da_release_space\x18\x8b\x01 \x01(\x0b\x32..perfetto.protos.Ext4DaReleaseSpaceFtraceEventH\x00\x12P\n\x15\x65xt4_da_reserve_space\x18\x8c\x01 \x01(\x0b\x32..perfetto.protos.Ext4DaReserveSpaceFtraceEventH\x00\x12]\n\x1c\x65xt4_da_update_reserve_space\x18\x8d\x01 \x01(\x0b\x32\x34.perfetto.protos.Ext4DaUpdateReserveSpaceFtraceEventH\x00\x12L\n\x13\x65xt4_da_write_pages\x18\x8e\x01 \x01(\x0b\x32,.perfetto.protos.Ext4DaWritePagesFtraceEventH\x00\x12Y\n\x1a\x65xt4_da_write_pages_extent\x18\x8f\x01 \x01(\x0b\x32\x32.perfetto.protos.Ext4DaWritePagesExtentFtraceEventH\x00\x12N\n\x14\x65xt4_direct_IO_enter\x18\x90\x01 \x01(\x0b\x32-.perfetto.protos.Ext4DirectIOEnterFtraceEventH\x00\x12L\n\x13\x65xt4_direct_IO_exit\x18\x91\x01 \x01(\x0b\x32,.perfetto.protos.Ext4DirectIOExitFtraceEventH\x00\x12M\n\x13\x65xt4_discard_blocks\x18\x92\x01 \x01(\x0b\x32-.perfetto.protos.Ext4DiscardBlocksFtraceEventH\x00\x12]\n\x1b\x65xt4_discard_preallocations\x18\x93\x01 \x01(\x0b\x32\x35.perfetto.protos.Ext4DiscardPreallocationsFtraceEventH\x00\x12\x45\n\x0f\x65xt4_drop_inode\x18\x94\x01 \x01(\x0b\x32).perfetto.protos.Ext4DropInodeFtraceEventH\x00\x12N\n\x14\x65xt4_es_cache_extent\x18\x95\x01 \x01(\x0b\x32-.perfetto.protos.Ext4EsCacheExtentFtraceEventH\x00\x12q\n\'ext4_es_find_delayed_extent_range_enter\x18\x96\x01 \x01(\x0b\x32=.perfetto.protos.Ext4EsFindDelayedExtentRangeEnterFtraceEventH\x00\x12o\n&ext4_es_find_delayed_extent_range_exit\x18\x97\x01 \x01(\x0b\x32<.perfetto.protos.Ext4EsFindDelayedExtentRangeExitFtraceEventH\x00\x12P\n\x15\x65xt4_es_insert_extent\x18\x98\x01 \x01(\x0b\x32..perfetto.protos.Ext4EsInsertExtentFtraceEventH\x00\x12[\n\x1b\x65xt4_es_lookup_extent_enter\x18\x99\x01 \x01(\x0b\x32\x33.perfetto.protos.Ext4EsLookupExtentEnterFtraceEventH\x00\x12Y\n\x1a\x65xt4_es_lookup_extent_exit\x18\x9a\x01 \x01(\x0b\x32\x32.perfetto.protos.Ext4EsLookupExtentExitFtraceEventH\x00\x12P\n\x15\x65xt4_es_remove_extent\x18\x9b\x01 \x01(\x0b\x32..perfetto.protos.Ext4EsRemoveExtentFtraceEventH\x00\x12\x43\n\x0e\x65xt4_es_shrink\x18\x9c\x01 \x01(\x0b\x32(.perfetto.protos.Ext4EsShrinkFtraceEventH\x00\x12N\n\x14\x65xt4_es_shrink_count\x18\x9d\x01 \x01(\x0b\x32-.perfetto.protos.Ext4EsShrinkCountFtraceEventH\x00\x12W\n\x19\x65xt4_es_shrink_scan_enter\x18\x9e\x01 \x01(\x0b\x32\x31.perfetto.protos.Ext4EsShrinkScanEnterFtraceEventH\x00\x12U\n\x18\x65xt4_es_shrink_scan_exit\x18\x9f\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4EsShrinkScanExitFtraceEventH\x00\x12G\n\x10\x65xt4_evict_inode\x18\xa0\x01 \x01(\x0b\x32*.perfetto.protos.Ext4EvictInodeFtraceEventH\x00\x12n\n%ext4_ext_convert_to_initialized_enter\x18\xa1\x01 \x01(\x0b\x32<.perfetto.protos.Ext4ExtConvertToInitializedEnterFtraceEventH\x00\x12t\n(ext4_ext_convert_to_initialized_fastpath\x18\xa2\x01 \x01(\x0b\x32?.perfetto.protos.Ext4ExtConvertToInitializedFastpathFtraceEventH\x00\x12g\n!ext4_ext_handle_unwritten_extents\x18\xa3\x01 \x01(\x0b\x32\x39.perfetto.protos.Ext4ExtHandleUnwrittenExtentsFtraceEventH\x00\x12H\n\x11\x65xt4_ext_in_cache\x18\xa4\x01 \x01(\x0b\x32*.perfetto.protos.Ext4ExtInCacheFtraceEventH\x00\x12N\n\x14\x65xt4_ext_load_extent\x18\xa5\x01 \x01(\x0b\x32-.perfetto.protos.Ext4ExtLoadExtentFtraceEventH\x00\x12W\n\x19\x65xt4_ext_map_blocks_enter\x18\xa6\x01 \x01(\x0b\x32\x31.perfetto.protos.Ext4ExtMapBlocksEnterFtraceEventH\x00\x12U\n\x18\x65xt4_ext_map_blocks_exit\x18\xa7\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4ExtMapBlocksExitFtraceEventH\x00\x12O\n\x15\x65xt4_ext_put_in_cache\x18\xa8\x01 \x01(\x0b\x32-.perfetto.protos.Ext4ExtPutInCacheFtraceEventH\x00\x12P\n\x15\x65xt4_ext_remove_space\x18\xa9\x01 \x01(\x0b\x32..perfetto.protos.Ext4ExtRemoveSpaceFtraceEventH\x00\x12Y\n\x1a\x65xt4_ext_remove_space_done\x18\xaa\x01 \x01(\x0b\x32\x32.perfetto.protos.Ext4ExtRemoveSpaceDoneFtraceEventH\x00\x12\x44\n\x0f\x65xt4_ext_rm_idx\x18\xab\x01 \x01(\x0b\x32(.perfetto.protos.Ext4ExtRmIdxFtraceEventH\x00\x12\x46\n\x10\x65xt4_ext_rm_leaf\x18\xac\x01 \x01(\x0b\x32).perfetto.protos.Ext4ExtRmLeafFtraceEventH\x00\x12N\n\x14\x65xt4_ext_show_extent\x18\xad\x01 \x01(\x0b\x32-.perfetto.protos.Ext4ExtShowExtentFtraceEventH\x00\x12O\n\x14\x65xt4_fallocate_enter\x18\xae\x01 \x01(\x0b\x32..perfetto.protos.Ext4FallocateEnterFtraceEventH\x00\x12M\n\x13\x65xt4_fallocate_exit\x18\xaf\x01 \x01(\x0b\x32-.perfetto.protos.Ext4FallocateExitFtraceEventH\x00\x12V\n\x18\x65xt4_find_delalloc_range\x18\xb0\x01 \x01(\x0b\x32\x31.perfetto.protos.Ext4FindDelallocRangeFtraceEventH\x00\x12>\n\x0b\x65xt4_forget\x18\xb1\x01 \x01(\x0b\x32&.perfetto.protos.Ext4ForgetFtraceEventH\x00\x12G\n\x10\x65xt4_free_blocks\x18\xb2\x01 \x01(\x0b\x32*.perfetto.protos.Ext4FreeBlocksFtraceEventH\x00\x12\x45\n\x0f\x65xt4_free_inode\x18\xb3\x01 \x01(\x0b\x32).perfetto.protos.Ext4FreeInodeFtraceEventH\x00\x12j\n#ext4_get_implied_cluster_alloc_exit\x18\xb4\x01 \x01(\x0b\x32:.perfetto.protos.Ext4GetImpliedClusterAllocExitFtraceEventH\x00\x12\x63\n\x1f\x65xt4_get_reserved_cluster_alloc\x18\xb5\x01 \x01(\x0b\x32\x37.perfetto.protos.Ext4GetReservedClusterAllocFtraceEventH\x00\x12W\n\x19\x65xt4_ind_map_blocks_enter\x18\xb6\x01 \x01(\x0b\x32\x31.perfetto.protos.Ext4IndMapBlocksEnterFtraceEventH\x00\x12U\n\x18\x65xt4_ind_map_blocks_exit\x18\xb7\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4IndMapBlocksExitFtraceEventH\x00\x12I\n\x11\x65xt4_insert_range\x18\xb8\x01 \x01(\x0b\x32+.perfetto.protos.Ext4InsertRangeFtraceEventH\x00\x12N\n\x13\x65xt4_invalidatepage\x18\xb9\x01 \x01(\x0b\x32..perfetto.protos.Ext4InvalidatepageFtraceEventH\x00\x12K\n\x12\x65xt4_journal_start\x18\xba\x01 \x01(\x0b\x32,.perfetto.protos.Ext4JournalStartFtraceEventH\x00\x12\\\n\x1b\x65xt4_journal_start_reserved\x18\xbb\x01 \x01(\x0b\x32\x34.perfetto.protos.Ext4JournalStartReservedFtraceEventH\x00\x12\x63\n\x1e\x65xt4_journalled_invalidatepage\x18\xbc\x01 \x01(\x0b\x32\x38.perfetto.protos.Ext4JournalledInvalidatepageFtraceEventH\x00\x12X\n\x19\x65xt4_journalled_write_end\x18\xbd\x01 \x01(\x0b\x32\x32.perfetto.protos.Ext4JournalledWriteEndFtraceEventH\x00\x12\x45\n\x0f\x65xt4_load_inode\x18\xbe\x01 \x01(\x0b\x32).perfetto.protos.Ext4LoadInodeFtraceEventH\x00\x12R\n\x16\x65xt4_load_inode_bitmap\x18\xbf\x01 \x01(\x0b\x32/.perfetto.protos.Ext4LoadInodeBitmapFtraceEventH\x00\x12P\n\x15\x65xt4_mark_inode_dirty\x18\xc0\x01 \x01(\x0b\x32..perfetto.protos.Ext4MarkInodeDirtyFtraceEventH\x00\x12L\n\x13\x65xt4_mb_bitmap_load\x18\xc1\x01 \x01(\x0b\x32,.perfetto.protos.Ext4MbBitmapLoadFtraceEventH\x00\x12W\n\x19\x65xt4_mb_buddy_bitmap_load\x18\xc2\x01 \x01(\x0b\x32\x31.perfetto.protos.Ext4MbBuddyBitmapLoadFtraceEventH\x00\x12\x62\n\x1e\x65xt4_mb_discard_preallocations\x18\xc3\x01 \x01(\x0b\x32\x37.perfetto.protos.Ext4MbDiscardPreallocationsFtraceEventH\x00\x12M\n\x14\x65xt4_mb_new_group_pa\x18\xc4\x01 \x01(\x0b\x32,.perfetto.protos.Ext4MbNewGroupPaFtraceEventH\x00\x12M\n\x14\x65xt4_mb_new_inode_pa\x18\xc5\x01 \x01(\x0b\x32,.perfetto.protos.Ext4MbNewInodePaFtraceEventH\x00\x12U\n\x18\x65xt4_mb_release_group_pa\x18\xc6\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4MbReleaseGroupPaFtraceEventH\x00\x12U\n\x18\x65xt4_mb_release_inode_pa\x18\xc7\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4MbReleaseInodePaFtraceEventH\x00\x12K\n\x12\x65xt4_mballoc_alloc\x18\xc8\x01 \x01(\x0b\x32,.perfetto.protos.Ext4MballocAllocFtraceEventH\x00\x12O\n\x14\x65xt4_mballoc_discard\x18\xc9\x01 \x01(\x0b\x32..perfetto.protos.Ext4MballocDiscardFtraceEventH\x00\x12I\n\x11\x65xt4_mballoc_free\x18\xca\x01 \x01(\x0b\x32+.perfetto.protos.Ext4MballocFreeFtraceEventH\x00\x12Q\n\x15\x65xt4_mballoc_prealloc\x18\xcb\x01 \x01(\x0b\x32/.perfetto.protos.Ext4MballocPreallocFtraceEventH\x00\x12]\n\x1c\x65xt4_other_inode_update_time\x18\xcc\x01 \x01(\x0b\x32\x34.perfetto.protos.Ext4OtherInodeUpdateTimeFtraceEventH\x00\x12\x45\n\x0f\x65xt4_punch_hole\x18\xcd\x01 \x01(\x0b\x32).perfetto.protos.Ext4PunchHoleFtraceEventH\x00\x12[\n\x1b\x65xt4_read_block_bitmap_load\x18\xce\x01 \x01(\x0b\x32\x33.perfetto.protos.Ext4ReadBlockBitmapLoadFtraceEventH\x00\x12\x42\n\rext4_readpage\x18\xcf\x01 \x01(\x0b\x32(.perfetto.protos.Ext4ReadpageFtraceEventH\x00\x12H\n\x10\x65xt4_releasepage\x18\xd0\x01 \x01(\x0b\x32+.perfetto.protos.Ext4ReleasepageFtraceEventH\x00\x12K\n\x12\x65xt4_remove_blocks\x18\xd1\x01 \x01(\x0b\x32,.perfetto.protos.Ext4RemoveBlocksFtraceEventH\x00\x12M\n\x13\x65xt4_request_blocks\x18\xd2\x01 \x01(\x0b\x32-.perfetto.protos.Ext4RequestBlocksFtraceEventH\x00\x12K\n\x12\x65xt4_request_inode\x18\xd3\x01 \x01(\x0b\x32,.perfetto.protos.Ext4RequestInodeFtraceEventH\x00\x12?\n\x0c\x65xt4_sync_fs\x18\xd4\x01 \x01(\x0b\x32&.perfetto.protos.Ext4SyncFsFtraceEventH\x00\x12J\n\x12\x65xt4_trim_all_free\x18\xd5\x01 \x01(\x0b\x32+.perfetto.protos.Ext4TrimAllFreeFtraceEventH\x00\x12G\n\x10\x65xt4_trim_extent\x18\xd6\x01 \x01(\x0b\x32*.perfetto.protos.Ext4TrimExtentFtraceEventH\x00\x12M\n\x13\x65xt4_truncate_enter\x18\xd7\x01 \x01(\x0b\x32-.perfetto.protos.Ext4TruncateEnterFtraceEventH\x00\x12K\n\x12\x65xt4_truncate_exit\x18\xd8\x01 \x01(\x0b\x32,.perfetto.protos.Ext4TruncateExitFtraceEventH\x00\x12I\n\x11\x65xt4_unlink_enter\x18\xd9\x01 \x01(\x0b\x32+.perfetto.protos.Ext4UnlinkEnterFtraceEventH\x00\x12G\n\x10\x65xt4_unlink_exit\x18\xda\x01 \x01(\x0b\x32*.perfetto.protos.Ext4UnlinkExitFtraceEventH\x00\x12G\n\x10\x65xt4_write_begin\x18\xdb\x01 \x01(\x0b\x32*.perfetto.protos.Ext4WriteBeginFtraceEventH\x00\x12\x43\n\x0e\x65xt4_write_end\x18\xe6\x01 \x01(\x0b\x32(.perfetto.protos.Ext4WriteEndFtraceEventH\x00\x12\x44\n\x0e\x65xt4_writepage\x18\xe7\x01 \x01(\x0b\x32).perfetto.protos.Ext4WritepageFtraceEventH\x00\x12\x46\n\x0f\x65xt4_writepages\x18\xe8\x01 \x01(\x0b\x32*.perfetto.protos.Ext4WritepagesFtraceEventH\x00\x12S\n\x16\x65xt4_writepages_result\x18\xe9\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4WritepagesResultFtraceEventH\x00\x12\x45\n\x0f\x65xt4_zero_range\x18\xea\x01 \x01(\x0b\x32).perfetto.protos.Ext4ZeroRangeFtraceEventH\x00\x12@\n\x0ctask_newtask\x18\xeb\x01 \x01(\x0b\x32\'.perfetto.protos.TaskNewtaskFtraceEventH\x00\x12>\n\x0btask_rename\x18\xec\x01 \x01(\x0b\x32&.perfetto.protos.TaskRenameFtraceEventH\x00\x12K\n\x12sched_process_exec\x18\xed\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessExecFtraceEventH\x00\x12K\n\x12sched_process_exit\x18\xee\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessExitFtraceEventH\x00\x12K\n\x12sched_process_fork\x18\xef\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessForkFtraceEventH\x00\x12K\n\x12sched_process_free\x18\xf0\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessFreeFtraceEventH\x00\x12K\n\x12sched_process_hang\x18\xf1\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessHangFtraceEventH\x00\x12K\n\x12sched_process_wait\x18\xf2\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessWaitFtraceEventH\x00\x12J\n\x12\x66\x32\x66s_do_submit_bio\x18\xf3\x01 \x01(\x0b\x32+.perfetto.protos.F2fsDoSubmitBioFtraceEventH\x00\x12G\n\x10\x66\x32\x66s_evict_inode\x18\xf4\x01 \x01(\x0b\x32*.perfetto.protos.F2fsEvictInodeFtraceEventH\x00\x12\x44\n\x0e\x66\x32\x66s_fallocate\x18\xf5\x01 \x01(\x0b\x32).perfetto.protos.F2fsFallocateFtraceEventH\x00\x12L\n\x13\x66\x32\x66s_get_data_block\x18\xf6\x01 \x01(\x0b\x32,.perfetto.protos.F2fsGetDataBlockFtraceEventH\x00\x12\x45\n\x0f\x66\x32\x66s_get_victim\x18\xf7\x01 \x01(\x0b\x32).perfetto.protos.F2fsGetVictimFtraceEventH\x00\x12:\n\tf2fs_iget\x18\xf8\x01 \x01(\x0b\x32$.perfetto.protos.F2fsIgetFtraceEventH\x00\x12\x43\n\x0e\x66\x32\x66s_iget_exit\x18\xf9\x01 \x01(\x0b\x32(.perfetto.protos.F2fsIgetExitFtraceEventH\x00\x12\x43\n\x0e\x66\x32\x66s_new_inode\x18\xfa\x01 \x01(\x0b\x32(.perfetto.protos.F2fsNewInodeFtraceEventH\x00\x12\x42\n\rf2fs_readpage\x18\xfb\x01 \x01(\x0b\x32(.perfetto.protos.F2fsReadpageFtraceEventH\x00\x12R\n\x16\x66\x32\x66s_reserve_new_block\x18\xfc\x01 \x01(\x0b\x32/.perfetto.protos.F2fsReserveNewBlockFtraceEventH\x00\x12L\n\x13\x66\x32\x66s_set_page_dirty\x18\xfd\x01 \x01(\x0b\x32,.perfetto.protos.F2fsSetPageDirtyFtraceEventH\x00\x12R\n\x16\x66\x32\x66s_submit_write_page\x18\xfe\x01 \x01(\x0b\x32/.perfetto.protos.F2fsSubmitWritePageFtraceEventH\x00\x12N\n\x14\x66\x32\x66s_sync_file_enter\x18\xff\x01 \x01(\x0b\x32-.perfetto.protos.F2fsSyncFileEnterFtraceEventH\x00\x12L\n\x13\x66\x32\x66s_sync_file_exit\x18\x80\x02 \x01(\x0b\x32,.perfetto.protos.F2fsSyncFileExitFtraceEventH\x00\x12?\n\x0c\x66\x32\x66s_sync_fs\x18\x81\x02 \x01(\x0b\x32&.perfetto.protos.F2fsSyncFsFtraceEventH\x00\x12\x42\n\rf2fs_truncate\x18\x82\x02 \x01(\x0b\x32(.perfetto.protos.F2fsTruncateFtraceEventH\x00\x12Z\n\x1a\x66\x32\x66s_truncate_blocks_enter\x18\x83\x02 \x01(\x0b\x32\x33.perfetto.protos.F2fsTruncateBlocksEnterFtraceEventH\x00\x12X\n\x19\x66\x32\x66s_truncate_blocks_exit\x18\x84\x02 \x01(\x0b\x32\x32.perfetto.protos.F2fsTruncateBlocksExitFtraceEventH\x00\x12\x63\n\x1f\x66\x32\x66s_truncate_data_blocks_range\x18\x85\x02 \x01(\x0b\x32\x37.perfetto.protos.F2fsTruncateDataBlocksRangeFtraceEventH\x00\x12\x65\n f2fs_truncate_inode_blocks_enter\x18\x86\x02 \x01(\x0b\x32\x38.perfetto.protos.F2fsTruncateInodeBlocksEnterFtraceEventH\x00\x12\x63\n\x1f\x66\x32\x66s_truncate_inode_blocks_exit\x18\x87\x02 \x01(\x0b\x32\x37.perfetto.protos.F2fsTruncateInodeBlocksExitFtraceEventH\x00\x12K\n\x12\x66\x32\x66s_truncate_node\x18\x88\x02 \x01(\x0b\x32,.perfetto.protos.F2fsTruncateNodeFtraceEventH\x00\x12X\n\x19\x66\x32\x66s_truncate_nodes_enter\x18\x89\x02 \x01(\x0b\x32\x32.perfetto.protos.F2fsTruncateNodesEnterFtraceEventH\x00\x12V\n\x18\x66\x32\x66s_truncate_nodes_exit\x18\x8a\x02 \x01(\x0b\x32\x31.perfetto.protos.F2fsTruncateNodesExitFtraceEventH\x00\x12\\\n\x1b\x66\x32\x66s_truncate_partial_nodes\x18\x8b\x02 \x01(\x0b\x32\x34.perfetto.protos.F2fsTruncatePartialNodesFtraceEventH\x00\x12I\n\x11\x66\x32\x66s_unlink_enter\x18\x8c\x02 \x01(\x0b\x32+.perfetto.protos.F2fsUnlinkEnterFtraceEventH\x00\x12G\n\x10\x66\x32\x66s_unlink_exit\x18\x8d\x02 \x01(\x0b\x32*.perfetto.protos.F2fsUnlinkExitFtraceEventH\x00\x12N\n\x14\x66\x32\x66s_vm_page_mkwrite\x18\x8e\x02 \x01(\x0b\x32-.perfetto.protos.F2fsVmPageMkwriteFtraceEventH\x00\x12G\n\x10\x66\x32\x66s_write_begin\x18\x8f\x02 \x01(\x0b\x32*.perfetto.protos.F2fsWriteBeginFtraceEventH\x00\x12Q\n\x15\x66\x32\x66s_write_checkpoint\x18\x90\x02 \x01(\x0b\x32/.perfetto.protos.F2fsWriteCheckpointFtraceEventH\x00\x12\x43\n\x0e\x66\x32\x66s_write_end\x18\x91\x02 \x01(\x0b\x32(.perfetto.protos.F2fsWriteEndFtraceEventH\x00\x12P\n\x15\x61lloc_pages_iommu_end\x18\x92\x02 \x01(\x0b\x32..perfetto.protos.AllocPagesIommuEndFtraceEventH\x00\x12R\n\x16\x61lloc_pages_iommu_fail\x18\x93\x02 \x01(\x0b\x32/.perfetto.protos.AllocPagesIommuFailFtraceEventH\x00\x12T\n\x17\x61lloc_pages_iommu_start\x18\x94\x02 \x01(\x0b\x32\x30.perfetto.protos.AllocPagesIommuStartFtraceEventH\x00\x12L\n\x13\x61lloc_pages_sys_end\x18\x95\x02 \x01(\x0b\x32,.perfetto.protos.AllocPagesSysEndFtraceEventH\x00\x12N\n\x14\x61lloc_pages_sys_fail\x18\x96\x02 \x01(\x0b\x32-.perfetto.protos.AllocPagesSysFailFtraceEventH\x00\x12P\n\x15\x61lloc_pages_sys_start\x18\x97\x02 \x01(\x0b\x32..perfetto.protos.AllocPagesSysStartFtraceEventH\x00\x12Z\n\x1a\x64ma_alloc_contiguous_retry\x18\x98\x02 \x01(\x0b\x32\x33.perfetto.protos.DmaAllocContiguousRetryFtraceEventH\x00\x12\x45\n\x0fiommu_map_range\x18\x99\x02 \x01(\x0b\x32).perfetto.protos.IommuMapRangeFtraceEventH\x00\x12\\\n\x1ciommu_sec_ptbl_map_range_end\x18\x9a\x02 \x01(\x0b\x32\x33.perfetto.protos.IommuSecPtblMapRangeEndFtraceEventH\x00\x12`\n\x1eiommu_sec_ptbl_map_range_start\x18\x9b\x02 \x01(\x0b\x32\x35.perfetto.protos.IommuSecPtblMapRangeStartFtraceEventH\x00\x12N\n\x14ion_alloc_buffer_end\x18\x9c\x02 \x01(\x0b\x32-.perfetto.protos.IonAllocBufferEndFtraceEventH\x00\x12P\n\x15ion_alloc_buffer_fail\x18\x9d\x02 \x01(\x0b\x32..perfetto.protos.IonAllocBufferFailFtraceEventH\x00\x12X\n\x19ion_alloc_buffer_fallback\x18\x9e\x02 \x01(\x0b\x32\x32.perfetto.protos.IonAllocBufferFallbackFtraceEventH\x00\x12R\n\x16ion_alloc_buffer_start\x18\x9f\x02 \x01(\x0b\x32/.perfetto.protos.IonAllocBufferStartFtraceEventH\x00\x12J\n\x12ion_cp_alloc_retry\x18\xa0\x02 \x01(\x0b\x32+.perfetto.protos.IonCpAllocRetryFtraceEventH\x00\x12U\n\x18ion_cp_secure_buffer_end\x18\xa1\x02 \x01(\x0b\x32\x30.perfetto.protos.IonCpSecureBufferEndFtraceEventH\x00\x12Y\n\x1aion_cp_secure_buffer_start\x18\xa2\x02 \x01(\x0b\x32\x32.perfetto.protos.IonCpSecureBufferStartFtraceEventH\x00\x12\x46\n\x0fion_prefetching\x18\xa3\x02 \x01(\x0b\x32*.perfetto.protos.IonPrefetchingFtraceEventH\x00\x12_\n\x1eion_secure_cma_add_to_pool_end\x18\xa4\x02 \x01(\x0b\x32\x34.perfetto.protos.IonSecureCmaAddToPoolEndFtraceEventH\x00\x12\x63\n ion_secure_cma_add_to_pool_start\x18\xa5\x02 \x01(\x0b\x32\x36.perfetto.protos.IonSecureCmaAddToPoolStartFtraceEventH\x00\x12[\n\x1bion_secure_cma_allocate_end\x18\xa6\x02 \x01(\x0b\x32\x33.perfetto.protos.IonSecureCmaAllocateEndFtraceEventH\x00\x12_\n\x1dion_secure_cma_allocate_start\x18\xa7\x02 \x01(\x0b\x32\x35.perfetto.protos.IonSecureCmaAllocateStartFtraceEventH\x00\x12`\n\x1eion_secure_cma_shrink_pool_end\x18\xa8\x02 \x01(\x0b\x32\x35.perfetto.protos.IonSecureCmaShrinkPoolEndFtraceEventH\x00\x12\x64\n ion_secure_cma_shrink_pool_start\x18\xa9\x02 \x01(\x0b\x32\x37.perfetto.protos.IonSecureCmaShrinkPoolStartFtraceEventH\x00\x12\x33\n\x05kfree\x18\xaa\x02 \x01(\x0b\x32!.perfetto.protos.KfreeFtraceEventH\x00\x12\x37\n\x07kmalloc\x18\xab\x02 \x01(\x0b\x32#.perfetto.protos.KmallocFtraceEventH\x00\x12@\n\x0ckmalloc_node\x18\xac\x02 \x01(\x0b\x32\'.perfetto.protos.KmallocNodeFtraceEventH\x00\x12G\n\x10kmem_cache_alloc\x18\xad\x02 \x01(\x0b\x32*.perfetto.protos.KmemCacheAllocFtraceEventH\x00\x12P\n\x15kmem_cache_alloc_node\x18\xae\x02 \x01(\x0b\x32..perfetto.protos.KmemCacheAllocNodeFtraceEventH\x00\x12\x45\n\x0fkmem_cache_free\x18\xaf\x02 \x01(\x0b\x32).perfetto.protos.KmemCacheFreeFtraceEventH\x00\x12I\n\x11migrate_pages_end\x18\xb0\x02 \x01(\x0b\x32+.perfetto.protos.MigratePagesEndFtraceEventH\x00\x12M\n\x13migrate_pages_start\x18\xb1\x02 \x01(\x0b\x32-.perfetto.protos.MigratePagesStartFtraceEventH\x00\x12\x42\n\rmigrate_retry\x18\xb2\x02 \x01(\x0b\x32(.perfetto.protos.MigrateRetryFtraceEventH\x00\x12\x41\n\rmm_page_alloc\x18\xb3\x02 \x01(\x0b\x32\'.perfetto.protos.MmPageAllocFtraceEventH\x00\x12P\n\x15mm_page_alloc_extfrag\x18\xb4\x02 \x01(\x0b\x32..perfetto.protos.MmPageAllocExtfragFtraceEventH\x00\x12W\n\x19mm_page_alloc_zone_locked\x18\xb5\x02 \x01(\x0b\x32\x31.perfetto.protos.MmPageAllocZoneLockedFtraceEventH\x00\x12?\n\x0cmm_page_free\x18\xb6\x02 \x01(\x0b\x32&.perfetto.protos.MmPageFreeFtraceEventH\x00\x12N\n\x14mm_page_free_batched\x18\xb7\x02 \x01(\x0b\x32-.perfetto.protos.MmPageFreeBatchedFtraceEventH\x00\x12J\n\x12mm_page_pcpu_drain\x18\xb8\x02 \x01(\x0b\x32+.perfetto.protos.MmPagePcpuDrainFtraceEventH\x00\x12\x38\n\x08rss_stat\x18\xb9\x02 \x01(\x0b\x32#.perfetto.protos.RssStatFtraceEventH\x00\x12\x45\n\x0fion_heap_shrink\x18\xba\x02 \x01(\x0b\x32).perfetto.protos.IonHeapShrinkFtraceEventH\x00\x12\x41\n\rion_heap_grow\x18\xbb\x02 \x01(\x0b\x32\'.perfetto.protos.IonHeapGrowFtraceEventH\x00\x12<\n\nfence_init\x18\xbc\x02 \x01(\x0b\x32%.perfetto.protos.FenceInitFtraceEventH\x00\x12\x42\n\rfence_destroy\x18\xbd\x02 \x01(\x0b\x32(.perfetto.protos.FenceDestroyFtraceEventH\x00\x12M\n\x13\x66\x65nce_enable_signal\x18\xbe\x02 \x01(\x0b\x32-.perfetto.protos.FenceEnableSignalFtraceEventH\x00\x12\x44\n\x0e\x66\x65nce_signaled\x18\xbf\x02 \x01(\x0b\x32).perfetto.protos.FenceSignaledFtraceEventH\x00\x12<\n\nclk_enable\x18\xc0\x02 \x01(\x0b\x32%.perfetto.protos.ClkEnableFtraceEventH\x00\x12>\n\x0b\x63lk_disable\x18\xc1\x02 \x01(\x0b\x32&.perfetto.protos.ClkDisableFtraceEventH\x00\x12?\n\x0c\x63lk_set_rate\x18\xc2\x02 \x01(\x0b\x32&.perfetto.protos.ClkSetRateFtraceEventH\x00\x12^\n\x1c\x62inder_transaction_alloc_buf\x18\xc3\x02 \x01(\x0b\x32\x35.perfetto.protos.BinderTransactionAllocBufFtraceEventH\x00\x12\x44\n\x0esignal_deliver\x18\xc4\x02 \x01(\x0b\x32).perfetto.protos.SignalDeliverFtraceEventH\x00\x12\x46\n\x0fsignal_generate\x18\xc5\x02 \x01(\x0b\x32*.perfetto.protos.SignalGenerateFtraceEventH\x00\x12N\n\x14oom_score_adj_update\x18\xc6\x02 \x01(\x0b\x32-.perfetto.protos.OomScoreAdjUpdateFtraceEventH\x00\x12\x37\n\x07generic\x18\xc7\x02 \x01(\x0b\x32#.perfetto.protos.GenericFtraceEventH\x00\x12\x45\n\x0fmm_event_record\x18\xc8\x02 \x01(\x0b\x32).perfetto.protos.MmEventRecordFtraceEventH\x00\x12:\n\tsys_enter\x18\xc9\x02 \x01(\x0b\x32$.perfetto.protos.SysEnterFtraceEventH\x00\x12\x38\n\x08sys_exit\x18\xca\x02 \x01(\x0b\x32#.perfetto.protos.SysExitFtraceEventH\x00\x12\x31\n\x04zero\x18\xcb\x02 \x01(\x0b\x32 .perfetto.protos.ZeroFtraceEventH\x00\x12\x42\n\rgpu_frequency\x18\xcc\x02 \x01(\x0b\x32(.perfetto.protos.GpuFrequencyFtraceEventH\x00\x12R\n\x16sde_tracing_mark_write\x18\xcd\x02 \x01(\x0b\x32/.perfetto.protos.SdeTracingMarkWriteFtraceEventH\x00\x12>\n\x0bmark_victim\x18\xce\x02 \x01(\x0b\x32&.perfetto.protos.MarkVictimFtraceEventH\x00\x12\x38\n\x08ion_stat\x18\xcf\x02 \x01(\x0b\x32#.perfetto.protos.IonStatFtraceEventH\x00\x12I\n\x11ion_buffer_create\x18\xd0\x02 \x01(\x0b\x32+.perfetto.protos.IonBufferCreateFtraceEventH\x00\x12K\n\x12ion_buffer_destroy\x18\xd1\x02 \x01(\x0b\x32,.perfetto.protos.IonBufferDestroyFtraceEventH\x00\x12\x43\n\x0escm_call_start\x18\xd2\x02 \x01(\x0b\x32(.perfetto.protos.ScmCallStartFtraceEventH\x00\x12?\n\x0cscm_call_end\x18\xd3\x02 \x01(\x0b\x32&.perfetto.protos.ScmCallEndFtraceEventH\x00\x12\x41\n\rgpu_mem_total\x18\xd4\x02 \x01(\x0b\x32\'.perfetto.protos.GpuMemTotalFtraceEventH\x00\x12N\n\x13thermal_temperature\x18\xd5\x02 \x01(\x0b\x32..perfetto.protos.ThermalTemperatureFtraceEventH\x00\x12>\n\x0b\x63\x64\x65v_update\x18\xd6\x02 \x01(\x0b\x32&.perfetto.protos.CdevUpdateFtraceEventH\x00\x12<\n\ncpuhp_exit\x18\xd7\x02 \x01(\x0b\x32%.perfetto.protos.CpuhpExitFtraceEventH\x00\x12I\n\x11\x63puhp_multi_enter\x18\xd8\x02 \x01(\x0b\x32+.perfetto.protos.CpuhpMultiEnterFtraceEventH\x00\x12>\n\x0b\x63puhp_enter\x18\xd9\x02 \x01(\x0b\x32&.perfetto.protos.CpuhpEnterFtraceEventH\x00\x12\x42\n\rcpuhp_latency\x18\xda\x02 \x01(\x0b\x32(.perfetto.protos.CpuhpLatencyFtraceEventH\x00\x12G\n\x10\x66\x61strpc_dma_stat\x18\xdb\x02 \x01(\x0b\x32*.perfetto.protos.FastrpcDmaStatFtraceEventH\x00\x12R\n\x16\x64pu_tracing_mark_write\x18\xdc\x02 \x01(\x0b\x32/.perfetto.protos.DpuTracingMarkWriteFtraceEventH\x00\x12R\n\x16g2d_tracing_mark_write\x18\xdd\x02 \x01(\x0b\x32/.perfetto.protos.G2dTracingMarkWriteFtraceEventH\x00\x12T\n\x17mali_tracing_mark_write\x18\xde\x02 \x01(\x0b\x32\x30.perfetto.protos.MaliTracingMarkWriteFtraceEventH\x00\x12\x41\n\rdma_heap_stat\x18\xdf\x02 \x01(\x0b\x32\'.perfetto.protos.DmaHeapStatFtraceEventH\x00\x12>\n\x0b\x63puhp_pause\x18\xe0\x02 \x01(\x0b\x32&.perfetto.protos.CpuhpPauseFtraceEventH\x00\x12G\n\x10sched_pi_setprio\x18\xe1\x02 \x01(\x0b\x32*.perfetto.protos.SchedPiSetprioFtraceEventH\x00\x12\x43\n\x0esde_sde_evtlog\x18\xe2\x02 \x01(\x0b\x32(.perfetto.protos.SdeSdeEvtlogFtraceEventH\x00\x12Q\n\x16sde_sde_perf_calc_crtc\x18\xe3\x02 \x01(\x0b\x32..perfetto.protos.SdeSdePerfCalcCrtcFtraceEventH\x00\x12U\n\x18sde_sde_perf_crtc_update\x18\xe4\x02 \x01(\x0b\x32\x30.perfetto.protos.SdeSdePerfCrtcUpdateFtraceEventH\x00\x12V\n\x19sde_sde_perf_set_qos_luts\x18\xe5\x02 \x01(\x0b\x32\x30.perfetto.protos.SdeSdePerfSetQosLutsFtraceEventH\x00\x12S\n\x17sde_sde_perf_update_bus\x18\xe6\x02 \x01(\x0b\x32/.perfetto.protos.SdeSdePerfUpdateBusFtraceEventH\x00\x12K\n\x12rss_stat_throttled\x18\xe7\x02 \x01(\x0b\x32,.perfetto.protos.RssStatThrottledFtraceEventH\x00\x12I\n\x11netif_receive_skb\x18\xe8\x02 \x01(\x0b\x32+.perfetto.protos.NetifReceiveSkbFtraceEventH\x00\x12?\n\x0cnet_dev_xmit\x18\xe9\x02 \x01(\x0b\x32&.perfetto.protos.NetDevXmitFtraceEventH\x00\x12L\n\x13inet_sock_set_state\x18\xea\x02 \x01(\x0b\x32,.perfetto.protos.InetSockSetStateFtraceEventH\x00\x12K\n\x12tcp_retransmit_skb\x18\xeb\x02 \x01(\x0b\x32,.perfetto.protos.TcpRetransmitSkbFtraceEventH\x00\x12R\n\x16\x63ros_ec_sensorhub_data\x18\xec\x02 \x01(\x0b\x32/.perfetto.protos.CrosEcSensorhubDataFtraceEventH\x00\x12R\n\x16napi_gro_receive_entry\x18\xed\x02 \x01(\x0b\x32/.perfetto.protos.NapiGroReceiveEntryFtraceEventH\x00\x12P\n\x15napi_gro_receive_exit\x18\xee\x02 \x01(\x0b\x32..perfetto.protos.NapiGroReceiveExitFtraceEventH\x00\x12:\n\tkfree_skb\x18\xef\x02 \x01(\x0b\x32$.perfetto.protos.KfreeSkbFtraceEventH\x00\x12G\n\x10kvm_access_fault\x18\xf0\x02 \x01(\x0b\x32*.perfetto.protos.KvmAccessFaultFtraceEventH\x00\x12=\n\x0bkvm_ack_irq\x18\xf1\x02 \x01(\x0b\x32%.perfetto.protos.KvmAckIrqFtraceEventH\x00\x12=\n\x0bkvm_age_hva\x18\xf2\x02 \x01(\x0b\x32%.perfetto.protos.KvmAgeHvaFtraceEventH\x00\x12?\n\x0ckvm_age_page\x18\xf3\x02 \x01(\x0b\x32&.perfetto.protos.KvmAgePageFtraceEventH\x00\x12L\n\x13kvm_arm_clear_debug\x18\xf4\x02 \x01(\x0b\x32,.perfetto.protos.KvmArmClearDebugFtraceEventH\x00\x12J\n\x12kvm_arm_set_dreg32\x18\xf5\x02 \x01(\x0b\x32+.perfetto.protos.KvmArmSetDreg32FtraceEventH\x00\x12J\n\x12kvm_arm_set_regset\x18\xf6\x02 \x01(\x0b\x32+.perfetto.protos.KvmArmSetRegsetFtraceEventH\x00\x12L\n\x13kvm_arm_setup_debug\x18\xf7\x02 \x01(\x0b\x32,.perfetto.protos.KvmArmSetupDebugFtraceEventH\x00\x12:\n\tkvm_entry\x18\xf8\x02 \x01(\x0b\x32$.perfetto.protos.KvmEntryFtraceEventH\x00\x12\x38\n\x08kvm_exit\x18\xf9\x02 \x01(\x0b\x32#.perfetto.protos.KvmExitFtraceEventH\x00\x12\x36\n\x07kvm_fpu\x18\xfa\x02 \x01(\x0b\x32\".perfetto.protos.KvmFpuFtraceEventH\x00\x12H\n\x11kvm_get_timer_map\x18\xfb\x02 \x01(\x0b\x32*.perfetto.protos.KvmGetTimerMapFtraceEventH\x00\x12\x45\n\x0fkvm_guest_fault\x18\xfc\x02 \x01(\x0b\x32).perfetto.protos.KvmGuestFaultFtraceEventH\x00\x12J\n\x12kvm_handle_sys_reg\x18\xfd\x02 \x01(\x0b\x32+.perfetto.protos.KvmHandleSysRegFtraceEventH\x00\x12\x41\n\rkvm_hvc_arm64\x18\xfe\x02 \x01(\x0b\x32\'.perfetto.protos.KvmHvcArm64FtraceEventH\x00\x12?\n\x0ckvm_irq_line\x18\xff\x02 \x01(\x0b\x32&.perfetto.protos.KvmIrqLineFtraceEventH\x00\x12\x38\n\x08kvm_mmio\x18\x80\x03 \x01(\x0b\x32#.perfetto.protos.KvmMmioFtraceEventH\x00\x12G\n\x10kvm_mmio_emulate\x18\x81\x03 \x01(\x0b\x32*.perfetto.protos.KvmMmioEmulateFtraceEventH\x00\x12L\n\x13kvm_set_guest_debug\x18\x82\x03 \x01(\x0b\x32,.perfetto.protos.KvmSetGuestDebugFtraceEventH\x00\x12=\n\x0bkvm_set_irq\x18\x83\x03 \x01(\x0b\x32%.perfetto.protos.KvmSetIrqFtraceEventH\x00\x12\x46\n\x10kvm_set_spte_hva\x18\x84\x03 \x01(\x0b\x32).perfetto.protos.KvmSetSpteHvaFtraceEventH\x00\x12H\n\x11kvm_set_way_flush\x18\x85\x03 \x01(\x0b\x32*.perfetto.protos.KvmSetWayFlushFtraceEventH\x00\x12\x43\n\x0ekvm_sys_access\x18\x86\x03 \x01(\x0b\x32(.perfetto.protos.KvmSysAccessFtraceEventH\x00\x12\x46\n\x10kvm_test_age_hva\x18\x87\x03 \x01(\x0b\x32).perfetto.protos.KvmTestAgeHvaFtraceEventH\x00\x12I\n\x11kvm_timer_emulate\x18\x88\x03 \x01(\x0b\x32+.perfetto.protos.KvmTimerEmulateFtraceEventH\x00\x12V\n\x18kvm_timer_hrtimer_expire\x18\x89\x03 \x01(\x0b\x32\x31.perfetto.protos.KvmTimerHrtimerExpireFtraceEventH\x00\x12T\n\x17kvm_timer_restore_state\x18\x8a\x03 \x01(\x0b\x32\x30.perfetto.protos.KvmTimerRestoreStateFtraceEventH\x00\x12N\n\x14kvm_timer_save_state\x18\x8b\x03 \x01(\x0b\x32-.perfetto.protos.KvmTimerSaveStateFtraceEventH\x00\x12N\n\x14kvm_timer_update_irq\x18\x8c\x03 \x01(\x0b\x32-.perfetto.protos.KvmTimerUpdateIrqFtraceEventH\x00\x12G\n\x10kvm_toggle_cache\x18\x8d\x03 \x01(\x0b\x32*.perfetto.protos.KvmToggleCacheFtraceEventH\x00\x12L\n\x13kvm_unmap_hva_range\x18\x8e\x03 \x01(\x0b\x32,.perfetto.protos.KvmUnmapHvaRangeFtraceEventH\x00\x12K\n\x12kvm_userspace_exit\x18\x8f\x03 \x01(\x0b\x32,.perfetto.protos.KvmUserspaceExitFtraceEventH\x00\x12\x45\n\x0fkvm_vcpu_wakeup\x18\x90\x03 \x01(\x0b\x32).perfetto.protos.KvmVcpuWakeupFtraceEventH\x00\x12\x41\n\rkvm_wfx_arm64\x18\x91\x03 \x01(\x0b\x32\'.perfetto.protos.KvmWfxArm64FtraceEventH\x00\x12\x38\n\x08trap_reg\x18\x92\x03 \x01(\x0b\x32#.perfetto.protos.TrapRegFtraceEventH\x00\x12T\n\x17vgic_update_irq_pending\x18\x93\x03 \x01(\x0b\x32\x30.perfetto.protos.VgicUpdateIrqPendingFtraceEventH\x00\x12S\n\x16wakeup_source_activate\x18\x94\x03 \x01(\x0b\x32\x30.perfetto.protos.WakeupSourceActivateFtraceEventH\x00\x12W\n\x18wakeup_source_deactivate\x18\x95\x03 \x01(\x0b\x32\x32.perfetto.protos.WakeupSourceDeactivateFtraceEventH\x00\x12\x44\n\x0eufshcd_command\x18\x96\x03 \x01(\x0b\x32).perfetto.protos.UfshcdCommandFtraceEventH\x00\x12I\n\x11ufshcd_clk_gating\x18\x97\x03 \x01(\x0b\x32+.perfetto.protos.UfshcdClkGatingFtraceEventH\x00\x12\x37\n\x07\x63onsole\x18\x98\x03 \x01(\x0b\x32#.perfetto.protos.ConsoleFtraceEventH\x00\x12G\n\x10\x64rm_vblank_event\x18\x99\x03 \x01(\x0b\x32*.perfetto.protos.DrmVblankEventFtraceEventH\x00\x12Z\n\x1a\x64rm_vblank_event_delivered\x18\x9a\x03 \x01(\x0b\x32\x33.perfetto.protos.DrmVblankEventDeliveredFtraceEventH\x00\x12\x41\n\rdrm_sched_job\x18\x9b\x03 \x01(\x0b\x32\'.perfetto.protos.DrmSchedJobFtraceEventH\x00\x12=\n\x0b\x64rm_run_job\x18\x9c\x03 \x01(\x0b\x32%.perfetto.protos.DrmRunJobFtraceEventH\x00\x12P\n\x15\x64rm_sched_process_job\x18\x9d\x03 \x01(\x0b\x32..perfetto.protos.DrmSchedProcessJobFtraceEventH\x00\x12\x43\n\x0e\x64ma_fence_init\x18\x9e\x03 \x01(\x0b\x32(.perfetto.protos.DmaFenceInitFtraceEventH\x00\x12\x43\n\x0e\x64ma_fence_emit\x18\x9f\x03 \x01(\x0b\x32(.perfetto.protos.DmaFenceEmitFtraceEventH\x00\x12K\n\x12\x64ma_fence_signaled\x18\xa0\x03 \x01(\x0b\x32,.perfetto.protos.DmaFenceSignaledFtraceEventH\x00\x12N\n\x14\x64ma_fence_wait_start\x18\xa1\x03 \x01(\x0b\x32-.perfetto.protos.DmaFenceWaitStartFtraceEventH\x00\x12J\n\x12\x64ma_fence_wait_end\x18\xa2\x03 \x01(\x0b\x32+.perfetto.protos.DmaFenceWaitEndFtraceEventH\x00\x12>\n\x0b\x66\x32\x66s_iostat\x18\xa3\x03 \x01(\x0b\x32&.perfetto.protos.F2fsIostatFtraceEventH\x00\x12M\n\x13\x66\x32\x66s_iostat_latency\x18\xa4\x03 \x01(\x0b\x32-.perfetto.protos.F2fsIostatLatencyFtraceEventH\x00\x12J\n\x12sched_cpu_util_cfs\x18\xa5\x03 \x01(\x0b\x32+.perfetto.protos.SchedCpuUtilCfsFtraceEventH\x00\x12:\n\tv4l2_qbuf\x18\xa6\x03 \x01(\x0b\x32$.perfetto.protos.V4l2QbufFtraceEventH\x00\x12<\n\nv4l2_dqbuf\x18\xa7\x03 \x01(\x0b\x32%.perfetto.protos.V4l2DqbufFtraceEventH\x00\x12J\n\x12vb2_v4l2_buf_queue\x18\xa8\x03 \x01(\x0b\x32+.perfetto.protos.Vb2V4l2BufQueueFtraceEventH\x00\x12H\n\x11vb2_v4l2_buf_done\x18\xa9\x03 \x01(\x0b\x32*.perfetto.protos.Vb2V4l2BufDoneFtraceEventH\x00\x12\x41\n\rvb2_v4l2_qbuf\x18\xaa\x03 \x01(\x0b\x32\'.perfetto.protos.Vb2V4l2QbufFtraceEventH\x00\x12\x43\n\x0evb2_v4l2_dqbuf\x18\xab\x03 \x01(\x0b\x32(.perfetto.protos.Vb2V4l2DqbufFtraceEventH\x00\x12L\n\x13\x64si_cmd_fifo_status\x18\xac\x03 \x01(\x0b\x32,.perfetto.protos.DsiCmdFifoStatusFtraceEventH\x00\x12\x34\n\x06\x64si_rx\x18\xad\x03 \x01(\x0b\x32!.perfetto.protos.DsiRxFtraceEventH\x00\x12\x34\n\x06\x64si_tx\x18\xae\x03 \x01(\x0b\x32!.perfetto.protos.DsiTxFtraceEventH\x00\x12T\n\x17\x61ndroid_fs_dataread_end\x18\xaf\x03 \x01(\x0b\x32\x30.perfetto.protos.AndroidFsDatareadEndFtraceEventH\x00\x12X\n\x19\x61ndroid_fs_dataread_start\x18\xb0\x03 \x01(\x0b\x32\x32.perfetto.protos.AndroidFsDatareadStartFtraceEventH\x00\x12V\n\x18\x61ndroid_fs_datawrite_end\x18\xb1\x03 \x01(\x0b\x32\x31.perfetto.protos.AndroidFsDatawriteEndFtraceEventH\x00\x12Z\n\x1a\x61ndroid_fs_datawrite_start\x18\xb2\x03 \x01(\x0b\x32\x33.perfetto.protos.AndroidFsDatawriteStartFtraceEventH\x00\x12N\n\x14\x61ndroid_fs_fsync_end\x18\xb3\x03 \x01(\x0b\x32-.perfetto.protos.AndroidFsFsyncEndFtraceEventH\x00\x12R\n\x16\x61ndroid_fs_fsync_start\x18\xb4\x03 \x01(\x0b\x32/.perfetto.protos.AndroidFsFsyncStartFtraceEventH\x00\x12\x46\n\x0f\x66uncgraph_entry\x18\xb5\x03 \x01(\x0b\x32*.perfetto.protos.FuncgraphEntryFtraceEventH\x00\x12\x44\n\x0e\x66uncgraph_exit\x18\xb6\x03 \x01(\x0b\x32).perfetto.protos.FuncgraphExitFtraceEventH\x00\x12G\n\x10virtio_video_cmd\x18\xb7\x03 \x01(\x0b\x32*.perfetto.protos.VirtioVideoCmdFtraceEventH\x00\x12P\n\x15virtio_video_cmd_done\x18\xb8\x03 \x01(\x0b\x32..perfetto.protos.VirtioVideoCmdDoneFtraceEventH\x00\x12\\\n\x1bvirtio_video_resource_queue\x18\xb9\x03 \x01(\x0b\x32\x34.perfetto.protos.VirtioVideoResourceQueueFtraceEventH\x00\x12\x65\n virtio_video_resource_queue_done\x18\xba\x03 \x01(\x0b\x32\x38.perfetto.protos.VirtioVideoResourceQueueDoneFtraceEventH\x00\x12N\n\x14mm_shrink_slab_start\x18\xbb\x03 \x01(\x0b\x32-.perfetto.protos.MmShrinkSlabStartFtraceEventH\x00\x12J\n\x12mm_shrink_slab_end\x18\xbc\x03 \x01(\x0b\x32+.perfetto.protos.MmShrinkSlabEndFtraceEventH\x00\x12<\n\ntrusty_smc\x18\xbd\x03 \x01(\x0b\x32%.perfetto.protos.TrustySmcFtraceEventH\x00\x12\x45\n\x0ftrusty_smc_done\x18\xbe\x03 \x01(\x0b\x32).perfetto.protos.TrustySmcDoneFtraceEventH\x00\x12I\n\x11trusty_std_call32\x18\xbf\x03 \x01(\x0b\x32+.perfetto.protos.TrustyStdCall32FtraceEventH\x00\x12R\n\x16trusty_std_call32_done\x18\xc0\x03 \x01(\x0b\x32/.perfetto.protos.TrustyStdCall32DoneFtraceEventH\x00\x12M\n\x13trusty_share_memory\x18\xc1\x03 \x01(\x0b\x32-.perfetto.protos.TrustyShareMemoryFtraceEventH\x00\x12V\n\x18trusty_share_memory_done\x18\xc2\x03 \x01(\x0b\x32\x31.perfetto.protos.TrustyShareMemoryDoneFtraceEventH\x00\x12Q\n\x15trusty_reclaim_memory\x18\xc3\x03 \x01(\x0b\x32/.perfetto.protos.TrustyReclaimMemoryFtraceEventH\x00\x12Z\n\x1atrusty_reclaim_memory_done\x18\xc4\x03 \x01(\x0b\x32\x33.perfetto.protos.TrustyReclaimMemoryDoneFtraceEventH\x00\x12<\n\ntrusty_irq\x18\xc5\x03 \x01(\x0b\x32%.perfetto.protos.TrustyIrqFtraceEventH\x00\x12T\n\x17trusty_ipc_handle_event\x18\xc6\x03 \x01(\x0b\x32\x30.perfetto.protos.TrustyIpcHandleEventFtraceEventH\x00\x12K\n\x12trusty_ipc_connect\x18\xc7\x03 \x01(\x0b\x32,.perfetto.protos.TrustyIpcConnectFtraceEventH\x00\x12R\n\x16trusty_ipc_connect_end\x18\xc8\x03 \x01(\x0b\x32/.perfetto.protos.TrustyIpcConnectEndFtraceEventH\x00\x12G\n\x10trusty_ipc_write\x18\xc9\x03 \x01(\x0b\x32*.perfetto.protos.TrustyIpcWriteFtraceEventH\x00\x12\x45\n\x0ftrusty_ipc_poll\x18\xca\x03 \x01(\x0b\x32).perfetto.protos.TrustyIpcPollFtraceEventH\x00\x12\x45\n\x0ftrusty_ipc_read\x18\xcc\x03 \x01(\x0b\x32).perfetto.protos.TrustyIpcReadFtraceEventH\x00\x12L\n\x13trusty_ipc_read_end\x18\xcd\x03 \x01(\x0b\x32,.perfetto.protos.TrustyIpcReadEndFtraceEventH\x00\x12\x41\n\rtrusty_ipc_rx\x18\xce\x03 \x01(\x0b\x32\'.perfetto.protos.TrustyIpcRxFtraceEventH\x00\x12K\n\x12trusty_enqueue_nop\x18\xd0\x03 \x01(\x0b\x32,.perfetto.protos.TrustyEnqueueNopFtraceEventH\x00\x12\x45\n\x0f\x63ma_alloc_start\x18\xd1\x03 \x01(\x0b\x32).perfetto.protos.CmaAllocStartFtraceEventH\x00\x12\x43\n\x0e\x63ma_alloc_info\x18\xd2\x03 \x01(\x0b\x32(.perfetto.protos.CmaAllocInfoFtraceEventH\x00\x12T\n\x17lwis_tracing_mark_write\x18\xd3\x03 \x01(\x0b\x32\x30.perfetto.protos.LwisTracingMarkWriteFtraceEventH\x00\x12N\n\x14virtio_gpu_cmd_queue\x18\xd4\x03 \x01(\x0b\x32-.perfetto.protos.VirtioGpuCmdQueueFtraceEventH\x00\x12T\n\x17virtio_gpu_cmd_response\x18\xd5\x03 \x01(\x0b\x32\x30.perfetto.protos.VirtioGpuCmdResponseFtraceEventH\x00\x12Q\n\x16mali_mali_KCPU_CQS_SET\x18\xd6\x03 \x01(\x0b\x32..perfetto.protos.MaliMaliKCPUCQSSETFtraceEventH\x00\x12^\n\x1dmali_mali_KCPU_CQS_WAIT_START\x18\xd7\x03 \x01(\x0b\x32\x34.perfetto.protos.MaliMaliKCPUCQSWAITSTARTFtraceEventH\x00\x12Z\n\x1bmali_mali_KCPU_CQS_WAIT_END\x18\xd8\x03 \x01(\x0b\x32\x32.perfetto.protos.MaliMaliKCPUCQSWAITENDFtraceEventH\x00\x12[\n\x1bmali_mali_KCPU_FENCE_SIGNAL\x18\xd9\x03 \x01(\x0b\x32\x33.perfetto.protos.MaliMaliKCPUFENCESIGNALFtraceEventH\x00\x12\x62\n\x1fmali_mali_KCPU_FENCE_WAIT_START\x18\xda\x03 \x01(\x0b\x32\x36.perfetto.protos.MaliMaliKCPUFENCEWAITSTARTFtraceEventH\x00\x12^\n\x1dmali_mali_KCPU_FENCE_WAIT_END\x18\xdb\x03 \x01(\x0b\x32\x34.perfetto.protos.MaliMaliKCPUFENCEWAITENDFtraceEventH\x00\x12:\n\thyp_enter\x18\xdc\x03 \x01(\x0b\x32$.perfetto.protos.HypEnterFtraceEventH\x00\x12\x38\n\x08hyp_exit\x18\xdd\x03 \x01(\x0b\x32#.perfetto.protos.HypExitFtraceEventH\x00\x12<\n\nhost_hcall\x18\xde\x03 \x01(\x0b\x32%.perfetto.protos.HostHcallFtraceEventH\x00\x12\x38\n\x08host_smc\x18\xdf\x03 \x01(\x0b\x32#.perfetto.protos.HostSmcFtraceEventH\x00\x12\x43\n\x0ehost_mem_abort\x18\xe0\x03 \x01(\x0b\x32(.perfetto.protos.HostMemAbortFtraceEventH\x00\x12S\n\x16suspend_resume_minimal\x18\xe1\x03 \x01(\x0b\x32\x30.perfetto.protos.SuspendResumeMinimalFtraceEventH\x00\x12_\n\x1dmali_mali_CSF_INTERRUPT_START\x18\xe2\x03 \x01(\x0b\x32\x35.perfetto.protos.MaliMaliCSFINTERRUPTSTARTFtraceEventH\x00\x12[\n\x1bmali_mali_CSF_INTERRUPT_END\x18\xe3\x03 \x01(\x0b\x32\x33.perfetto.protos.MaliMaliCSFINTERRUPTENDFtraceEventH\x00\x12Z\n\x1asamsung_tracing_mark_write\x18\xe4\x03 \x01(\x0b\x32\x33.perfetto.protos.SamsungTracingMarkWriteFtraceEventH\x00\x12\x44\n\x0e\x62inder_command\x18\xe5\x03 \x01(\x0b\x32).perfetto.protos.BinderCommandFtraceEventH\x00\x12\x42\n\rbinder_return\x18\xe6\x03 \x01(\x0b\x32(.perfetto.protos.BinderReturnFtraceEventH\x00\x12R\n\x16sched_switch_with_ctrs\x18\xe7\x03 \x01(\x0b\x32/.perfetto.protos.SchedSwitchWithCtrsFtraceEventH\x00\x12\x45\n\x0fgpu_work_period\x18\xe8\x03 \x01(\x0b\x32).perfetto.protos.GpuWorkPeriodFtraceEventH\x00\x12<\n\nrpm_status\x18\xe9\x03 \x01(\x0b\x32%.perfetto.protos.RpmStatusFtraceEventH\x00\x12M\n\x13panel_write_generic\x18\xea\x03 \x01(\x0b\x32-.perfetto.protos.PanelWriteGenericFtraceEventH\x00\x12K\n\x12sched_migrate_task\x18\xeb\x03 \x01(\x0b\x32,.perfetto.protos.SchedMigrateTaskFtraceEventH\x00\x12S\n\x17\x64pu_dsi_cmd_fifo_status\x18\xec\x03 \x01(\x0b\x32/.perfetto.protos.DpuDsiCmdFifoStatusFtraceEventH\x00\x12;\n\ndpu_dsi_rx\x18\xed\x03 \x01(\x0b\x32$.perfetto.protos.DpuDsiRxFtraceEventH\x00\x12;\n\ndpu_dsi_tx\x18\xee\x03 \x01(\x0b\x32$.perfetto.protos.DpuDsiTxFtraceEventH\x00\x12K\n\x12\x66\x32\x66s_background_gc\x18\xef\x03 \x01(\x0b\x32,.perfetto.protos.F2fsBackgroundGcFtraceEventH\x00\x12\x41\n\rf2fs_gc_begin\x18\xf0\x03 \x01(\x0b\x32\'.perfetto.protos.F2fsGcBeginFtraceEventH\x00\x12=\n\x0b\x66\x32\x66s_gc_end\x18\xf1\x03 \x01(\x0b\x32%.perfetto.protos.F2fsGcEndFtraceEventH\x00\x12G\n\x10\x66\x61strpc_dma_free\x18\xf2\x03 \x01(\x0b\x32*.perfetto.protos.FastrpcDmaFreeFtraceEventH\x00\x12I\n\x11\x66\x61strpc_dma_alloc\x18\xf3\x03 \x01(\x0b\x32+.perfetto.protos.FastrpcDmaAllocFtraceEventH\x00\x12I\n\x11\x66\x61strpc_dma_unmap\x18\xf4\x03 \x01(\x0b\x32+.perfetto.protos.FastrpcDmaUnmapFtraceEventH\x00\x12\x45\n\x0f\x66\x61strpc_dma_map\x18\xf5\x03 \x01(\x0b\x32).perfetto.protos.FastrpcDmaMapFtraceEventH\x00\x12G\n\x10google_icc_event\x18\xf6\x03 \x01(\x0b\x32*.perfetto.protos.GoogleIccEventFtraceEventH\x00\x12G\n\x10google_irm_event\x18\xf7\x03 \x01(\x0b\x32*.perfetto.protos.GoogleIrmEventFtraceEventH\x00\x12V\n\x18\x64\x65vice_pm_callback_start\x18\xf8\x03 \x01(\x0b\x32\x31.perfetto.protos.DevicePmCallbackStartFtraceEventH\x00\x12R\n\x16\x64\x65vice_pm_callback_end\x18\xf9\x03 \x01(\x0b\x32/.perfetto.protos.DevicePmCallbackEndFtraceEventH\x00\x12V\n\x18thermal_exynos_acpm_bulk\x18\xfa\x03 \x01(\x0b\x32\x31.perfetto.protos.ThermalExynosAcpmBulkFtraceEventH\x00\x12g\n!thermal_exynos_acpm_high_overhead\x18\xfb\x03 \x01(\x0b\x32\x39.perfetto.protos.ThermalExynosAcpmHighOverheadFtraceEventH\x00\x12<\n\ndcvsh_freq\x18\xfc\x03 \x01(\x0b\x32%.perfetto.protos.DcvshFreqFtraceEventH\x00\x12K\n\x12kgsl_gpu_frequency\x18\xfd\x03 \x01(\x0b\x32,.perfetto.protos.KgslGpuFrequencyFtraceEventH\x00\x12\x84\x01\n2mali_mali_PM_MCU_HCTL_CORES_DOWN_SCALE_NOTIFY_PEND\x18\xfe\x03 \x01(\x0b\x32\x45.perfetto.protos.MaliMaliPMMCUHCTLCORESDOWNSCALENOTIFYPENDFtraceEventH\x00\x12p\n\'mali_mali_PM_MCU_HCTL_CORES_NOTIFY_PEND\x18\xff\x03 \x01(\x0b\x32<.perfetto.protos.MaliMaliPMMCUHCTLCORESNOTIFYPENDFtraceEventH\x00\x12r\n(mali_mali_PM_MCU_HCTL_CORE_INACTIVE_PEND\x18\x80\x04 \x01(\x0b\x32=.perfetto.protos.MaliMaliPMMCUHCTLCOREINACTIVEPENDFtraceEventH\x00\x12j\n$mali_mali_PM_MCU_HCTL_MCU_ON_RECHECK\x18\x81\x04 \x01(\x0b\x32\x39.perfetto.protos.MaliMaliPMMCUHCTLMCUONRECHECKFtraceEventH\x00\x12w\n+mali_mali_PM_MCU_HCTL_SHADERS_CORE_OFF_PEND\x18\x82\x04 \x01(\x0b\x32?.perfetto.protos.MaliMaliPMMCUHCTLSHADERSCOREOFFPENDFtraceEventH\x00\x12n\n&mali_mali_PM_MCU_HCTL_SHADERS_PEND_OFF\x18\x83\x04 \x01(\x0b\x32;.perfetto.protos.MaliMaliPMMCUHCTLSHADERSPENDOFFFtraceEventH\x00\x12l\n%mali_mali_PM_MCU_HCTL_SHADERS_PEND_ON\x18\x84\x04 \x01(\x0b\x32:.perfetto.protos.MaliMaliPMMCUHCTLSHADERSPENDONFtraceEventH\x00\x12p\n\'mali_mali_PM_MCU_HCTL_SHADERS_READY_OFF\x18\x85\x04 \x01(\x0b\x32<.perfetto.protos.MaliMaliPMMCUHCTLSHADERSREADYOFFFtraceEventH\x00\x12V\n\x19mali_mali_PM_MCU_IN_SLEEP\x18\x86\x04 \x01(\x0b\x32\x30.perfetto.protos.MaliMaliPMMCUINSLEEPFtraceEventH\x00\x12M\n\x14mali_mali_PM_MCU_OFF\x18\x87\x04 \x01(\x0b\x32,.perfetto.protos.MaliMaliPMMCUOFFFtraceEventH\x00\x12K\n\x13mali_mali_PM_MCU_ON\x18\x88\x04 \x01(\x0b\x32+.perfetto.protos.MaliMaliPMMCUONFtraceEventH\x00\x12s\n)mali_mali_PM_MCU_ON_CORE_ATTR_UPDATE_PEND\x18\x89\x04 \x01(\x0b\x32=.perfetto.protos.MaliMaliPMMCUONCOREATTRUPDATEPENDFtraceEventH\x00\x12h\n#mali_mali_PM_MCU_ON_GLB_REINIT_PEND\x18\x8a\x04 \x01(\x0b\x32\x38.perfetto.protos.MaliMaliPMMCUONGLBREINITPENDFtraceEventH\x00\x12T\n\x18mali_mali_PM_MCU_ON_HALT\x18\x8b\x04 \x01(\x0b\x32/.perfetto.protos.MaliMaliPMMCUONHALTFtraceEventH\x00\x12\x65\n!mali_mali_PM_MCU_ON_HWCNT_DISABLE\x18\x8c\x04 \x01(\x0b\x32\x37.perfetto.protos.MaliMaliPMMCUONHWCNTDISABLEFtraceEventH\x00\x12\x63\n mali_mali_PM_MCU_ON_HWCNT_ENABLE\x18\x8d\x04 \x01(\x0b\x32\x36.perfetto.protos.MaliMaliPMMCUONHWCNTENABLEFtraceEventH\x00\x12]\n\x1dmali_mali_PM_MCU_ON_PEND_HALT\x18\x8e\x04 \x01(\x0b\x32\x33.perfetto.protos.MaliMaliPMMCUONPENDHALTFtraceEventH\x00\x12_\n\x1emali_mali_PM_MCU_ON_PEND_SLEEP\x18\x8f\x04 \x01(\x0b\x32\x34.perfetto.protos.MaliMaliPMMCUONPENDSLEEPFtraceEventH\x00\x12g\n\"mali_mali_PM_MCU_ON_SLEEP_INITIATE\x18\x90\x04 \x01(\x0b\x32\x38.perfetto.protos.MaliMaliPMMCUONSLEEPINITIATEFtraceEventH\x00\x12V\n\x19mali_mali_PM_MCU_PEND_OFF\x18\x91\x04 \x01(\x0b\x32\x30.perfetto.protos.MaliMaliPMMCUPENDOFFFtraceEventH\x00\x12\x61\n\x1fmali_mali_PM_MCU_PEND_ON_RELOAD\x18\x92\x04 \x01(\x0b\x32\x35.perfetto.protos.MaliMaliPMMCUPENDONRELOADFtraceEventH\x00\x12Z\n\x1bmali_mali_PM_MCU_POWER_DOWN\x18\x93\x04 \x01(\x0b\x32\x32.perfetto.protos.MaliMaliPMMCUPOWERDOWNFtraceEventH\x00\x12Z\n\x1bmali_mali_PM_MCU_RESET_WAIT\x18\x94\x04 \x01(\x0b\x32\x32.perfetto.protos.MaliMaliPMMCURESETWAITFtraceEventH\x00\x12\x45\n\x0f\x62\x63l_irq_trigger\x18\x95\x04 \x01(\x0b\x32).perfetto.protos.BclIrqTriggerFtraceEventH\x00\x12\\\n\x1bkgsl_adreno_cmdbatch_queued\x18\x96\x04 \x01(\x0b\x32\x34.perfetto.protos.KgslAdrenoCmdbatchQueuedFtraceEventH\x00\x12\x62\n\x1ekgsl_adreno_cmdbatch_submitted\x18\x97\x04 \x01(\x0b\x32\x37.perfetto.protos.KgslAdrenoCmdbatchSubmittedFtraceEventH\x00\x12X\n\x19kgsl_adreno_cmdbatch_sync\x18\x98\x04 \x01(\x0b\x32\x32.perfetto.protos.KgslAdrenoCmdbatchSyncFtraceEventH\x00\x12^\n\x1ckgsl_adreno_cmdbatch_retired\x18\x99\x04 \x01(\x0b\x32\x35.perfetto.protos.KgslAdrenoCmdbatchRetiredFtraceEventH\x00\x12N\n\x14pixel_mm_kswapd_wake\x18\x9a\x04 \x01(\x0b\x32-.perfetto.protos.PixelMmKswapdWakeFtraceEventH\x00\x12N\n\x14pixel_mm_kswapd_done\x18\x9b\x04 \x01(\x0b\x32-.perfetto.protos.PixelMmKswapdDoneFtraceEventH\x00\x12R\n\x16sched_wakeup_task_attr\x18\x9c\x04 \x01(\x0b\x32/.perfetto.protos.SchedWakeupTaskAttrFtraceEventH\x00\x12J\n\x11\x64\x65vfreq_frequency\x18\x9d\x04 \x01(\x0b\x32,.perfetto.protos.DevfreqFrequencyFtraceEventH\x00\x12\x35\n\x0ckprobe_event\x18\x9e\x04 \x01(\x0b\x32\x1c.perfetto.protos.KprobeEventH\x00\x12L\n\x13param_set_value_cpm\x18\x9f\x04 \x01(\x0b\x32,.perfetto.protos.ParamSetValueCpmFtraceEventH\x00\x12=\n\x0b\x64o_sys_open\x18\xa0\x04 \x01(\x0b\x32%.perfetto.protos.DoSysOpenFtraceEventH\x00\x12:\n\topen_exec\x18\xa1\x04 \x01(\x0b\x32$.perfetto.protos.OpenExecFtraceEventH\x00\x12\x43\n\x0e\x62lock_io_start\x18\xa2\x04 \x01(\x0b\x32(.perfetto.protos.BlockIoStartFtraceEventH\x00\x12\x41\n\rblock_io_done\x18\xa3\x04 \x01(\x0b\x32\'.perfetto.protos.BlockIoDoneFtraceEventH\x00\x12N\n\x14mali_gpu_power_state\x18\xa4\x04 \x01(\x0b\x32-.perfetto.protos.MaliGpuPowerStateFtraceEventH\x00\x12P\n\x15\x64pu_disp_dpu_underrun\x18\xa5\x04 \x01(\x0b\x32..perfetto.protos.DpuDispDpuUnderrunFtraceEventH\x00\x12Y\n\x1a\x64pu_disp_vblank_irq_enable\x18\xa6\x04 \x01(\x0b\x32\x32.perfetto.protos.DpuDispVblankIrqEnableFtraceEventH\x00\x12\x42\n\rhrtimer_start\x18\xa7\x04 \x01(\x0b\x32(.perfetto.protos.HrtimerStartFtraceEventH\x00\x12\x44\n\x0ehrtimer_cancel\x18\xa8\x04 \x01(\x0b\x32).perfetto.protos.HrtimerCancelFtraceEventH\x00\x12O\n\x14hrtimer_expire_entry\x18\xa9\x04 \x01(\x0b\x32..perfetto.protos.HrtimerExpireEntryFtraceEventH\x00\x12M\n\x13hrtimer_expire_exit\x18\xaa\x04 \x01(\x0b\x32-.perfetto.protos.HrtimerExpireExitFtraceEventH\x00\x12>\n\x0btimer_start\x18\xab\x04 \x01(\x0b\x32&.perfetto.protos.TimerStartFtraceEventH\x00\x12@\n\x0ctimer_cancel\x18\xac\x04 \x01(\x0b\x32\'.perfetto.protos.TimerCancelFtraceEventH\x00\x12K\n\x12timer_expire_entry\x18\xad\x04 \x01(\x0b\x32,.perfetto.protos.TimerExpireEntryFtraceEventH\x00\x12I\n\x11timer_expire_exit\x18\xae\x04 \x01(\x0b\x32+.perfetto.protos.TimerExpireExitFtraceEventH\x00\x12I\n\x11local_timer_entry\x18\xaf\x04 \x01(\x0b\x32+.perfetto.protos.LocalTimerEntryFtraceEventH\x00\x12G\n\x10local_timer_exit\x18\xb0\x04 \x01(\x0b\x32*.perfetto.protos.LocalTimerExitFtraceEventH\x00\x12K\n\x12\x64wc3_alloc_request\x18\xb1\x04 \x01(\x0b\x32,.perfetto.protos.Dwc3AllocRequestFtraceEventH\x00\x12I\n\x11\x64wc3_complete_trb\x18\xb2\x04 \x01(\x0b\x32+.perfetto.protos.Dwc3CompleteTrbFtraceEventH\x00\x12\x41\n\rdwc3_ctrl_req\x18\xb3\x04 \x01(\x0b\x32\'.perfetto.protos.Dwc3CtrlReqFtraceEventH\x00\x12\x45\n\x0f\x64wc3_ep_dequeue\x18\xb4\x04 \x01(\x0b\x32).perfetto.protos.Dwc3EpDequeueFtraceEventH\x00\x12\x41\n\rdwc3_ep_queue\x18\xb5\x04 \x01(\x0b\x32\'.perfetto.protos.Dwc3EpQueueFtraceEventH\x00\x12<\n\ndwc3_event\x18\xb6\x04 \x01(\x0b\x32%.perfetto.protos.Dwc3EventFtraceEventH\x00\x12I\n\x11\x64wc3_free_request\x18\xb7\x04 \x01(\x0b\x32+.perfetto.protos.Dwc3FreeRequestFtraceEventH\x00\x12J\n\x12\x64wc3_gadget_ep_cmd\x18\xb8\x04 \x01(\x0b\x32+.perfetto.protos.Dwc3GadgetEpCmdFtraceEventH\x00\x12R\n\x16\x64wc3_gadget_ep_disable\x18\xb9\x04 \x01(\x0b\x32/.perfetto.protos.Dwc3GadgetEpDisableFtraceEventH\x00\x12P\n\x15\x64wc3_gadget_ep_enable\x18\xba\x04 \x01(\x0b\x32..perfetto.protos.Dwc3GadgetEpEnableFtraceEventH\x00\x12T\n\x17\x64wc3_gadget_generic_cmd\x18\xbb\x04 \x01(\x0b\x32\x30.perfetto.protos.Dwc3GadgetGenericCmdFtraceEventH\x00\x12O\n\x14\x64wc3_gadget_giveback\x18\xbc\x04 \x01(\x0b\x32..perfetto.protos.Dwc3GadgetGivebackFtraceEventH\x00\x12G\n\x10\x64wc3_prepare_trb\x18\xbd\x04 \x01(\x0b\x32*.perfetto.protos.Dwc3PrepareTrbFtraceEventH\x00\x12<\n\ndwc3_readl\x18\xbe\x04 \x01(\x0b\x32%.perfetto.protos.Dwc3ReadlFtraceEventH\x00\x12>\n\x0b\x64wc3_writel\x18\xbf\x04 \x01(\x0b\x32&.perfetto.protos.Dwc3WritelFtraceEventH\x00\x12G\n\x10\x63ma_alloc_finish\x18\xc0\x04 \x01(\x0b\x32*.perfetto.protos.CmaAllocFinishFtraceEventH\x00\x12h\n\"mm_alloc_contig_migrate_range_info\x18\xc1\x04 \x01(\x0b\x32\x39.perfetto.protos.MmAllocContigMigrateRangeInfoFtraceEventH\x00\x12\x41\n\rhost_ffa_call\x18\xc2\x04 \x01(\x0b\x32\'.perfetto.protos.HostFfaCallFtraceEventH\x00\x12\x45\n\x0f\x64mabuf_rss_stat\x18\xc3\x04 \x01(\x0b\x32).perfetto.protos.DmabufRssStatFtraceEventH\x00\x12>\n\x0biommu_idmap\x18\xc4\x04 \x01(\x0b\x32&.perfetto.protos.IommuIdmapFtraceEventH\x00\x12G\n\x10psci_mem_protect\x18\xc5\x04 \x01(\x0b\x32*.perfetto.protos.PsciMemProtectFtraceEventH\x00\x12Q\n\x15hypervisor_host_hcall\x18\xc6\x04 \x01(\x0b\x32/.perfetto.protos.HypervisorHostHcallFtraceEventH\x00\x12M\n\x13hypervisor_host_smc\x18\xc7\x04 \x01(\x0b\x32-.perfetto.protos.HypervisorHostSmcFtraceEventH\x00\x12M\n\x13hypervisor_hyp_exit\x18\xc8\x04 \x01(\x0b\x32-.perfetto.protos.HypervisorHypExitFtraceEventH\x00\x12S\n\x16hypervisor_iommu_idmap\x18\xc9\x04 \x01(\x0b\x32\x30.perfetto.protos.HypervisorIommuIdmapFtraceEventH\x00\x12\\\n\x1bhypervisor_psci_mem_protect\x18\xca\x04 \x01(\x0b\x32\x34.perfetto.protos.HypervisorPsciMemProtectFtraceEventH\x00\x12X\n\x19hypervisor_host_mem_abort\x18\xcb\x04 \x01(\x0b\x32\x32.perfetto.protos.HypervisorHostMemAbortFtraceEventH\x00\x12O\n\x14hypervisor_hyp_enter\x18\xcc\x04 \x01(\x0b\x32..perfetto.protos.HypervisorHypEnterFtraceEventH\x00\x12\x64\n\x1fhypervisor_iommu_idmap_complete\x18\xcd\x04 \x01(\x0b\x32\x38.perfetto.protos.HypervisorIommuIdmapCompleteFtraceEventH\x00\x12^\n\x1chypervisor_vcpu_illegal_trap\x18\xce\x04 \x01(\x0b\x32\x35.perfetto.protos.HypervisorVcpuIllegalTrapFtraceEventH\x00\x12O\n\x15\x64rm_sched_job_add_dep\x18\xcf\x04 \x01(\x0b\x32-.perfetto.protos.DrmSchedJobAddDepFtraceEventH\x00\x12J\n\x12\x64rm_sched_job_done\x18\xd0\x04 \x01(\x0b\x32+.perfetto.protos.DrmSchedJobDoneFtraceEventH\x00\x12L\n\x13\x64rm_sched_job_queue\x18\xd1\x04 \x01(\x0b\x32,.perfetto.protos.DrmSchedJobQueueFtraceEventH\x00\x12H\n\x11\x64rm_sched_job_run\x18\xd2\x04 \x01(\x0b\x32*.perfetto.protos.DrmSchedJobRunFtraceEventH\x00\x12\\\n\x1b\x64rm_sched_job_unschedulable\x18\xd3\x04 \x01(\x0b\x32\x34.perfetto.protos.DrmSchedJobUnschedulableFtraceEventH\x00\x12Q\n\x15\x66wtp_perfetto_counter\x18\xd4\x04 \x01(\x0b\x32/.perfetto.protos.FwtpPerfettoCounterFtraceEventH\x00\x12T\n\x17scsi_dispatch_cmd_error\x18\xd5\x04 \x01(\x0b\x32\x30.perfetto.protos.ScsiDispatchCmdErrorFtraceEventH\x00\x12X\n\x19scsi_dispatch_cmd_timeout\x18\xd6\x04 \x01(\x0b\x32\x32.perfetto.protos.ScsiDispatchCmdTimeoutFtraceEventH\x00\x12\x43\n\x0escsi_eh_wakeup\x18\xd7\x04 \x01(\x0b\x32(.perfetto.protos.ScsiEhWakeupFtraceEventH\x00\x12M\n\x13\x66wtp_perfetto_slice\x18\xd8\x04 \x01(\x0b\x32-.perfetto.protos.FwtpPerfettoSliceFtraceEventH\x00\x12\x45\n\x0fgpu_power_state\x18\xd9\x04 \x01(\x0b\x32).perfetto.protos.GpuPowerStateFtraceEventH\x00\x12\x44\n\x0egram_collision\x18\xda\x04 \x01(\x0b\x32).perfetto.protos.GramCollisionFtraceEventH\x00\x12R\n\x16\x66\x32\x66s_lock_elapsed_time\x18\xdb\x04 \x01(\x0b\x32/.perfetto.protos.F2fsLockElapsedTimeFtraceEventH\x00\x12M\n\x13sched_group_tracker\x18\xdc\x04 \x01(\x0b\x32-.perfetto.protos.SchedGroupTrackerFtraceEventH\x00\x12[\n\x1b\x64pu_disp_frame_done_timeout\x18\xdd\x04 \x01(\x0b\x32\x33.perfetto.protos.DpuDispFrameDoneTimeoutFtraceEventH\x00\x12]\n\x1c\x64pu_disp_frame_start_timeout\x18\xde\x04 \x01(\x0b\x32\x34.perfetto.protos.DpuDispFrameStartTimeoutFtraceEventH\x00\x12_\n\x1dmm_vmscan_memcg_reclaim_begin\x18\xdf\x04 \x01(\x0b\x32\x35.perfetto.protos.MmVmscanMemcgReclaimBeginFtraceEventH\x00\x12[\n\x1bmm_vmscan_memcg_reclaim_end\x18\xe0\x04 \x01(\x0b\x32\x33.perfetto.protos.MmVmscanMemcgReclaimEndFtraceEventH\x00\x12[\n\x1b\x64pu_disp_frame_done_missing\x18\xe1\x04 \x01(\x0b\x32\x33.perfetto.protos.DpuDispFrameDoneMissingFtraceEventH\x00\x12]\n\x1c\x64pu_disp_frame_start_missing\x18\xe2\x04 \x01(\x0b\x32\x34.perfetto.protos.DpuDispFrameStartMissingFtraceEventH\x00\x12M\n\x13panel_settings_full\x18\xe3\x04 \x01(\x0b\x32-.perfetto.protos.PanelSettingsFullFtraceEventH\x00\x12M\n\x13panel_settings_lite\x18\xe4\x04 \x01(\x0b\x32-.perfetto.protos.PanelSettingsLiteFtraceEventH\x00\x12Y\n\x1a\x64pu_disp_dpu_line_underrun\x18\xe5\x04 \x01(\x0b\x32\x32.perfetto.protos.DpuDispDpuLineUnderrunFtraceEventH\x00\x12P\n\x15psci_domain_idle_exit\x18\xe6\x04 \x01(\x0b\x32..perfetto.protos.PsciDomainIdleExitFtraceEventH\x00\x12R\n\x16psci_domain_idle_enter\x18\xe7\x04 \x01(\x0b\x32/.perfetto.protos.PsciDomainIdleEnterFtraceEventH\x00\x42\x07\n\x05\x65ventJ\x08\x08\x80\x80\x04\x10\x81\x80\x08\"\xc1\x01\n\x0e\x46traceCpuStats\x12\x0b\n\x03\x63pu\x18\x01 \x01(\x04\x12\x0f\n\x07\x65ntries\x18\x02 \x01(\x04\x12\x0f\n\x07overrun\x18\x03 \x01(\x04\x12\x16\n\x0e\x63ommit_overrun\x18\x04 \x01(\x04\x12\x12\n\nbytes_read\x18\x05 \x01(\x04\x12\x17\n\x0foldest_event_ts\x18\x06 \x01(\x01\x12\x0e\n\x06now_ts\x18\x07 \x01(\x01\x12\x16\n\x0e\x64ropped_events\x18\x08 \x01(\x04\x12\x13\n\x0bread_events\x18\t \x01(\x04\"1\n\x11\x46traceKprobeStats\x12\x0c\n\x04hits\x18\x01 \x01(\x03\x12\x0e\n\x06misses\x18\x02 \x01(\x03\"\xc7\x04\n\x0b\x46traceStats\x12\x31\n\x05phase\x18\x01 \x01(\x0e\x32\".perfetto.protos.FtraceStats.Phase\x12\x32\n\tcpu_stats\x18\x02 \x03(\x0b\x32\x1f.perfetto.protos.FtraceCpuStats\x12\x1d\n\x15kernel_symbols_parsed\x18\x03 \x01(\r\x12\x1d\n\x15kernel_symbols_mem_kb\x18\x04 \x01(\r\x12\x15\n\ratrace_errors\x18\x05 \x01(\t\x12\x1f\n\x17\x65xclusive_feature_error\x18\r \x01(\t\x12\x1d\n\x15unknown_ftrace_events\x18\x06 \x03(\t\x12\x1c\n\x14\x66\x61iled_ftrace_events\x18\x07 \x03(\t\x12\x1e\n\x16preserve_ftrace_buffer\x18\x08 \x01(\x08\x12?\n\x13\x66trace_parse_errors\x18\t \x03(\x0e\x32\".perfetto.protos.FtraceParseStatus\x12\x38\n\x0ckprobe_stats\x18\n \x01(\x0b\x32\".perfetto.protos.FtraceKprobeStats\x12\x1d\n\x15\x63pu_buffer_size_pages\x18\x0b \x01(\r\x12$\n\x1c\x63\x61\x63hed_cpu_buffer_size_pages\x18\x0c \x01(\r\">\n\x05Phase\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x12\n\x0eSTART_OF_TRACE\x10\x01\x12\x10\n\x0c\x45ND_OF_TRACE\x10\x02\"\xb8\x08\n\x11\x46traceEventBundle\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12+\n\x05\x65vent\x18\x02 \x03(\x0b\x32\x1c.perfetto.protos.FtraceEvent\x12\x13\n\x0blost_events\x18\x03 \x01(\x08\x12\x46\n\rcompact_sched\x18\x04 \x01(\x0b\x32/.perfetto.protos.FtraceEventBundle.CompactSched\x12\x32\n\x0c\x66trace_clock\x18\x05 \x01(\x0e\x32\x1c.perfetto.protos.FtraceClock\x12\x18\n\x10\x66trace_timestamp\x18\x06 \x01(\x03\x12\x16\n\x0e\x62oot_timestamp\x18\x07 \x01(\x03\x12=\n\x05\x65rror\x18\x08 \x03(\x0b\x32..perfetto.protos.FtraceEventBundle.FtraceError\x12!\n\x19last_read_event_timestamp\x18\t \x01(\x04\x12%\n\x1dprevious_bundle_end_timestamp\x18\n \x01(\x04\x12\\\n\x19generic_event_descriptors\x18\x0b \x03(\x0b\x32\x39.perfetto.protos.FtraceEventBundle.GenericEventDescriptor\x12\x1e\n\x15\x62roken_abi_trace_page\x18\x80\x04 \x01(\x0c\x1a\xee\x02\n\x0c\x43ompactSched\x12\x14\n\x0cintern_table\x18\x05 \x03(\t\x12\x1c\n\x10switch_timestamp\x18\x01 \x03(\x04\x42\x02\x10\x01\x12\x1d\n\x11switch_prev_state\x18\x02 \x03(\x03\x42\x02\x10\x01\x12\x1b\n\x0fswitch_next_pid\x18\x03 \x03(\x05\x42\x02\x10\x01\x12\x1c\n\x10switch_next_prio\x18\x04 \x03(\x05\x42\x02\x10\x01\x12\"\n\x16switch_next_comm_index\x18\x06 \x03(\rB\x02\x10\x01\x12\x1c\n\x10waking_timestamp\x18\x07 \x03(\x04\x42\x02\x10\x01\x12\x16\n\nwaking_pid\x18\x08 \x03(\x05\x42\x02\x10\x01\x12\x1d\n\x11waking_target_cpu\x18\t \x03(\x05\x42\x02\x10\x01\x12\x17\n\x0bwaking_prio\x18\n \x03(\x05\x42\x02\x10\x01\x12\x1d\n\x11waking_comm_index\x18\x0b \x03(\rB\x02\x10\x01\x12\x1f\n\x13waking_common_flags\x18\x0c \x03(\rB\x02\x10\x01\x1aT\n\x0b\x46traceError\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x32\n\x06status\x18\x02 \x01(\x0e\x32\".perfetto.protos.FtraceParseStatus\x1aX\n\x16GenericEventDescriptor\x12\x10\n\x08\x66ield_id\x18\x01 \x01(\x05\x12\x12\n\ngroup_name\x18\x03 \x01(\t\x12\x18\n\x10\x65vent_descriptor\x18\x02 \x01(\x0c\"A\n\x18GenericGpuFrequencyEvent\x12\x0e\n\x06gpu_id\x18\x01 \x01(\r\x12\x15\n\rfrequency_khz\x18\x02 \x01(\r\">\n\x1eGenericKernelCpuFrequencyEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\x05\x12\x0f\n\x07\x66req_hz\x18\x02 \x01(\x03\"\xa2\x03\n\x1bGenericKernelTaskStateEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\x12\x0b\n\x03tid\x18\x03 \x01(\x03\x12I\n\x05state\x18\x04 \x01(\x0e\x32:.perfetto.protos.GenericKernelTaskStateEvent.TaskStateEnum\x12\x0c\n\x04prio\x18\x05 \x01(\x05\"\x81\x02\n\rTaskStateEnum\x12\x16\n\x12TASK_STATE_UNKNOWN\x10\x00\x12\x16\n\x12TASK_STATE_CREATED\x10\x01\x12\x17\n\x13TASK_STATE_RUNNABLE\x10\x02\x12\x16\n\x12TASK_STATE_RUNNING\x10\x03\x12\"\n\x1eTASK_STATE_INTERRUPTIBLE_SLEEP\x10\x04\x12$\n TASK_STATE_UNINTERRUPTIBLE_SLEEP\x10\x05\x12\x16\n\x12TASK_STATE_STOPPED\x10\x06\x12\x13\n\x0fTASK_STATE_DEAD\x10\x07\x12\x18\n\x14TASK_STATE_DESTROYED\x10\x08\"9\n\x1cGenericKernelTaskRenameEvent\x12\x0b\n\x03tid\x18\x01 \x01(\x03\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\"\xb5\x02\n\x18GenericKernelProcessTree\x12\x44\n\tprocesses\x18\x01 \x03(\x0b\x32\x31.perfetto.protos.GenericKernelProcessTree.Process\x12\x41\n\x07threads\x18\x02 \x03(\x0b\x32\x30.perfetto.protos.GenericKernelProcessTree.Thread\x1aY\n\x06Thread\x12\x0b\n\x03tid\x18\x01 \x01(\x03\x12\x0b\n\x03pid\x18\x02 \x01(\x03\x12\x0c\n\x04\x63omm\x18\x03 \x01(\t\x12\x16\n\x0eis_main_thread\x18\x04 \x01(\x08\x12\x0f\n\x07is_idle\x18\x05 \x01(\x08\x1a\x35\n\x07Process\x12\x0b\n\x03pid\x18\x01 \x01(\x03\x12\x0c\n\x04ppid\x18\x02 \x01(\x03\x12\x0f\n\x07\x63mdline\x18\x03 \x01(\t\"\xa7\x02\n\x0fGpuCounterEvent\x12\x43\n\x12\x63ounter_descriptor\x18\x01 \x01(\x0b\x32%.perfetto.protos.GpuCounterDescriptorH\x00\x12 \n\x16\x63ounter_descriptor_iid\x18\x04 \x01(\x04H\x00\x12=\n\x08\x63ounters\x18\x02 \x03(\x0b\x32+.perfetto.protos.GpuCounterEvent.GpuCounter\x12\x0e\n\x06gpu_id\x18\x03 \x01(\x05\x1aV\n\nGpuCounter\x12\x12\n\ncounter_id\x18\x01 \x01(\r\x12\x13\n\tint_value\x18\x02 \x01(\x03H\x00\x12\x16\n\x0c\x64ouble_value\x18\x03 \x01(\x01H\x00\x42\x07\n\x05valueB\x06\n\x04\x64\x65sc\"~\n\x1cInternedGpuCounterDescriptor\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x41\n\x12\x63ounter_descriptor\x18\x02 \x01(\x0b\x32%.perfetto.protos.GpuCounterDescriptor\x12\x0e\n\x06gpu_id\x18\x03 \x01(\x05\"\x84\x02\n\x06GpuLog\x12\x32\n\x08severity\x18\x01 \x01(\x0e\x32 .perfetto.protos.GpuLog.Severity\x12\x0b\n\x03tag\x18\x02 \x01(\t\x12\x13\n\x0blog_message\x18\x03 \x01(\t\"\xa3\x01\n\x08Severity\x12\x1c\n\x18LOG_SEVERITY_UNSPECIFIED\x10\x00\x12\x18\n\x14LOG_SEVERITY_VERBOSE\x10\x01\x12\x16\n\x12LOG_SEVERITY_DEBUG\x10\x02\x12\x15\n\x11LOG_SEVERITY_INFO\x10\x03\x12\x18\n\x14LOG_SEVERITY_WARNING\x10\x04\x12\x16\n\x12LOG_SEVERITY_ERROR\x10\x05\"=\n\x10GpuMemTotalEvent\x12\x0e\n\x06gpu_id\x18\x01 \x01(\r\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x0c\n\x04size\x18\x03 \x01(\x04\"\x8b\x0c\n\x13GpuRenderStageEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x04\x12\x10\n\x08\x64uration\x18\x02 \x01(\x04\x12\x14\n\x0chw_queue_iid\x18\r \x01(\x04\x12\x11\n\tstage_iid\x18\x0e \x01(\x04\x12\x0e\n\x06gpu_id\x18\x0b \x01(\x05\x12\x0f\n\x07\x63ontext\x18\x05 \x01(\x04\x12\x1c\n\x14render_target_handle\x18\x08 \x01(\x04\x12\x15\n\rsubmission_id\x18\n \x01(\r\x12\x42\n\nextra_data\x18\x06 \x03(\x0b\x32..perfetto.protos.GpuRenderStageEvent.ExtraData\x12\x1a\n\x12render_pass_handle\x18\t \x01(\x04\x12\x1f\n\x17render_pass_instance_id\x18\x10 \x01(\x04\x12!\n\x19render_subpass_index_mask\x18\x0f \x03(\x04\x12\x1d\n\x15\x63ommand_buffer_handle\x18\x0c \x01(\x04\x12\x0e\n\x04name\x18\x11 \x01(\tH\x00\x12\x12\n\x08name_iid\x18\x14 \x01(\x04H\x00\x12\x16\n\x0e\x65vent_wait_ids\x18\x12 \x03(\x04\x12\x12\n\nkernel_iid\x18\x13 \x01(\x04\x12H\n\x06launch\x18\x15 \x01(\x0b\x32\x38.perfetto.protos.GpuRenderStageEvent.ComputeKernelLaunch\x12O\n\x0especifications\x18\x07 \x01(\x0b\x32\x33.perfetto.protos.GpuRenderStageEvent.SpecificationsB\x02\x18\x01\x12\x17\n\x0bhw_queue_id\x18\x03 \x01(\x05\x42\x02\x18\x01\x12\x14\n\x08stage_id\x18\x04 \x01(\x05\x42\x02\x18\x01\x1a(\n\tExtraData\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x1a\'\n\x04\x44im3\x12\t\n\x01x\x18\x01 \x01(\r\x12\t\n\x01y\x18\x02 \x01(\r\x12\t\n\x01z\x18\x03 \x01(\r\x1a\xc3\x01\n\x0f\x45xtraComputeArg\x12\x12\n\x08name_iid\x18\x01 \x01(\x04H\x00\x12\x0e\n\x04name\x18\x02 \x01(\tH\x00\x12\x13\n\tint_value\x18\x03 \x01(\x03H\x01\x12\x14\n\nuint_value\x18\x04 \x01(\x04H\x01\x12\x16\n\x0c\x64ouble_value\x18\x05 \x01(\x01H\x01\x12\x16\n\x0cstring_value\x18\x06 \x01(\tH\x01\x12\x1a\n\x10string_value_iid\x18\x07 \x01(\x04H\x01\x42\x0c\n\nname_fieldB\x07\n\x05value\x1a\xda\x01\n\x13\x43omputeKernelLaunch\x12<\n\tgrid_size\x18\x01 \x01(\x0b\x32).perfetto.protos.GpuRenderStageEvent.Dim3\x12\x41\n\x0eworkgroup_size\x18\x02 \x01(\x0b\x32).perfetto.protos.GpuRenderStageEvent.Dim3\x12\x42\n\x04\x61rgs\x18\x03 \x03(\x0b\x32\x34.perfetto.protos.GpuRenderStageEvent.ExtraComputeArg\x1a\xe9\x02\n\x0eSpecifications\x12U\n\x0c\x63ontext_spec\x18\x01 \x01(\x0b\x32?.perfetto.protos.GpuRenderStageEvent.Specifications.ContextSpec\x12Q\n\x08hw_queue\x18\x02 \x03(\x0b\x32?.perfetto.protos.GpuRenderStageEvent.Specifications.Description\x12N\n\x05stage\x18\x03 \x03(\x0b\x32?.perfetto.protos.GpuRenderStageEvent.Specifications.Description\x1a+\n\x0b\x43ontextSpec\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x1a\x30\n\x0b\x44\x65scription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t*\x04\x08\x64\x10\x65\x42\x0c\n\nname_field\"\xbd\x01\n\x17InternedGraphicsContext\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x39\n\x03\x61pi\x18\x03 \x01(\x0e\x32,.perfetto.protos.InternedGraphicsContext.Api\"M\n\x03\x41pi\x12\r\n\tUNDEFINED\x10\x00\x12\x0b\n\x07OPEN_GL\x10\x01\x12\n\n\x06VULKAN\x10\x02\x12\x0b\n\x07OPEN_CL\x10\x03\x12\x08\n\x04\x43UDA\x10\x04\x12\x07\n\x03HIP\x10\x05\"\xee\x01\n#InternedGpuRenderStageSpecification\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12Z\n\x08\x63\x61tegory\x18\x04 \x01(\x0e\x32H.perfetto.protos.InternedGpuRenderStageSpecification.RenderStageCategory\";\n\x13RenderStageCategory\x12\t\n\x05OTHER\x10\x00\x12\x0c\n\x08GRAPHICS\x10\x01\x12\x0b\n\x07\x43OMPUTE\x10\x02\"\x9c\x01\n\x15InternedComputeKernel\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x16\n\x0e\x64\x65mangled_name\x18\x03 \x01(\t\x12\x0c\n\x04\x61rch\x18\x04 \x01(\t\x12\x42\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x34.perfetto.protos.GpuRenderStageEvent.ExtraComputeArg\"3\n\x16InternedComputeArgName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"\xbb\x03\n\x0eVulkanApiEvent\x12\\\n\x1avk_debug_utils_object_name\x18\x01 \x01(\x0b\x32\x36.perfetto.protos.VulkanApiEvent.VkDebugUtilsObjectNameH\x00\x12H\n\x0fvk_queue_submit\x18\x02 \x01(\x0b\x32-.perfetto.protos.VulkanApiEvent.VkQueueSubmitH\x00\x1ar\n\x16VkDebugUtilsObjectName\x12\x0b\n\x03pid\x18\x01 \x01(\r\x12\x11\n\tvk_device\x18\x02 \x01(\x04\x12\x13\n\x0bobject_type\x18\x03 \x01(\x05\x12\x0e\n\x06object\x18\x04 \x01(\x04\x12\x13\n\x0bobject_name\x18\x05 \x01(\t\x1a\x83\x01\n\rVkQueueSubmit\x12\x13\n\x0b\x64uration_ns\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x0b\n\x03tid\x18\x03 \x01(\r\x12\x10\n\x08vk_queue\x18\x04 \x01(\x04\x12\x1a\n\x12vk_command_buffers\x18\x05 \x03(\x04\x12\x15\n\rsubmission_id\x18\x06 \x01(\rB\x07\n\x05\x65vent\"z\n\x1bVulkanMemoryEventAnnotation\x12\x0f\n\x07key_iid\x18\x01 \x01(\x04\x12\x13\n\tint_value\x18\x02 \x01(\x03H\x00\x12\x16\n\x0c\x64ouble_value\x18\x03 \x01(\x01H\x00\x12\x14\n\nstring_iid\x18\x04 \x01(\x04H\x00\x42\x07\n\x05value\"\xe8\x06\n\x11VulkanMemoryEvent\x12\x39\n\x06source\x18\x01 \x01(\x0e\x32).perfetto.protos.VulkanMemoryEvent.Source\x12?\n\toperation\x18\x02 \x01(\x0e\x32,.perfetto.protos.VulkanMemoryEvent.Operation\x12\x11\n\ttimestamp\x18\x03 \x01(\x03\x12\x0b\n\x03pid\x18\x04 \x01(\r\x12\x16\n\x0ememory_address\x18\x05 \x01(\x06\x12\x13\n\x0bmemory_size\x18\x06 \x01(\x04\x12\x12\n\ncaller_iid\x18\x07 \x01(\x04\x12L\n\x10\x61llocation_scope\x18\x08 \x01(\x0e\x32\x32.perfetto.protos.VulkanMemoryEvent.AllocationScope\x12\x41\n\x0b\x61nnotations\x18\t \x03(\x0b\x32,.perfetto.protos.VulkanMemoryEventAnnotation\x12\x0e\n\x06\x64\x65vice\x18\x10 \x01(\x06\x12\x15\n\rdevice_memory\x18\x11 \x01(\x06\x12\x13\n\x0bmemory_type\x18\x12 \x01(\r\x12\x0c\n\x04heap\x18\x13 \x01(\r\x12\x15\n\robject_handle\x18\x14 \x01(\x06\"\x85\x01\n\x06Source\x12\x16\n\x12SOURCE_UNSPECIFIED\x10\x00\x12\x11\n\rSOURCE_DRIVER\x10\x01\x12\x11\n\rSOURCE_DEVICE\x10\x02\x12\x18\n\x14SOURCE_DEVICE_MEMORY\x10\x03\x12\x11\n\rSOURCE_BUFFER\x10\x04\x12\x10\n\x0cSOURCE_IMAGE\x10\x05\"u\n\tOperation\x12\x12\n\x0eOP_UNSPECIFIED\x10\x00\x12\r\n\tOP_CREATE\x10\x01\x12\x0e\n\nOP_DESTROY\x10\x02\x12\x0b\n\x07OP_BIND\x10\x03\x12\x14\n\x10OP_DESTROY_BOUND\x10\x04\x12\x12\n\x0eOP_ANNOTATIONS\x10\x05\"\x84\x01\n\x0f\x41llocationScope\x12\x15\n\x11SCOPE_UNSPECIFIED\x10\x00\x12\x11\n\rSCOPE_COMMAND\x10\x01\x12\x10\n\x0cSCOPE_OBJECT\x10\x02\x12\x0f\n\x0bSCOPE_CACHE\x10\x03\x12\x10\n\x0cSCOPE_DEVICE\x10\x04\x12\x12\n\x0eSCOPE_INSTANCE\x10\x05\"*\n\x0eInternedString\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03str\x18\x02 \x01(\x0c\"L\n\x04Line\x12\x15\n\rfunction_name\x18\x01 \x01(\t\x12\x18\n\x10source_file_name\x18\x02 \x01(\t\x12\x13\n\x0bline_number\x18\x03 \x01(\r\"G\n\x0e\x41\x64\x64ressSymbols\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x04\x12$\n\x05lines\x18\x02 \x03(\x0b\x32\x15.perfetto.protos.Line\"i\n\rModuleSymbols\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x10\n\x08\x62uild_id\x18\x02 \x01(\t\x12\x38\n\x0f\x61\x64\x64ress_symbols\x18\x03 \x03(\x0b\x32\x1f.perfetto.protos.AddressSymbols\"\x9c\x01\n\x07Mapping\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x10\n\x08\x62uild_id\x18\x02 \x01(\x04\x12\x14\n\x0c\x65xact_offset\x18\x08 \x01(\x04\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x04\x12\r\n\x05start\x18\x04 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x05 \x01(\x04\x12\x11\n\tload_bias\x18\x06 \x01(\x04\x12\x17\n\x0fpath_string_ids\x18\x07 \x03(\x04\"\xce\x02\n\x05\x46rame\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x18\n\x10\x66unction_name_id\x18\x02 \x01(\x04\x12\x12\n\nmapping_id\x18\x03 \x01(\x04\x12\x0e\n\x06rel_pc\x18\x04 \x01(\x04\x12\x17\n\x0fsource_path_iid\x18\x05 \x01(\x04\x12\x13\n\x0bline_number\x18\x06 \x01(\r\x12+\n\x04kind\x18\x07 \x01(\x0e\x32\x1b.perfetto.protos.Frame.KindH\x00\x12\x12\n\x08kind_str\x18\x08 \x01(\tH\x00\"}\n\x04Kind\x12\x10\n\x0cKIND_UNKNOWN\x10\x00\x12\x0f\n\x0bKIND_NATIVE\x10\x01\x12\x0f\n\x0bKIND_KERNEL\x10\x02\x12\x14\n\x10KIND_INTERPRETED\x10\x03\x12\x0c\n\x08KIND_JIT\x10\x04\x12\x0b\n\x07KIND_GC\x10\x05\x12\x10\n\x0cKIND_RUNTIME\x10\x06\x42\x0c\n\nkind_field\"+\n\tCallstack\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x11\n\tframe_ids\x18\x02 \x03(\x04\"\x93\x01\n\x0fInlineCallstack\x12\x36\n\x06\x66rames\x18\x01 \x03(\x0b\x32&.perfetto.protos.InlineCallstack.Frame\x1aH\n\x05\x46rame\x12\x15\n\rfunction_name\x18\x01 \x01(\t\x12\x13\n\x0bsource_file\x18\x02 \x01(\t\x12\x13\n\x0bline_number\x18\x03 \x01(\r\"\x80\r\n\x0bStackSample\x12@\n\x0ctask_context\x18\x01 \x01(\x0b\x32(.perfetto.protos.StackSample.TaskContextH\x00\x12\x1a\n\x10task_context_iid\x18\x02 \x01(\x04H\x00\x12J\n\x11\x65xecution_context\x18\x03 \x01(\x0b\x32-.perfetto.protos.StackSample.ExecutionContextH\x01\x12\x1f\n\x15\x65xecution_context_iid\x18\x04 \x01(\x04H\x01\x12\x35\n\tcallstack\x18\x05 \x01(\x0b\x32 .perfetto.protos.InlineCallstackH\x02\x12\x17\n\rcallstack_iid\x18\x06 \x01(\x04H\x02\x12\x16\n\x0cunwind_error\x18\x07 \x01(\tH\x03\x12\x1a\n\x10unwind_error_iid\x18\x08 \x01(\x04H\x03\x12L\n\x12primary_descriptor\x18\t \x01(\x0b\x32..perfetto.protos.StackSample.CounterDescriptorH\x04\x12 \n\x16primary_descriptor_iid\x18\n \x01(\x04H\x04\x12\x16\n\x0eprimary_weight\x18\x0b \x01(\x04\x12L\n\x14\x66ollower_descriptors\x18\x0c \x03(\x0b\x32..perfetto.protos.StackSample.CounterDescriptor\x12$\n\x18\x66ollower_descriptor_iids\x18\r \x03(\x04\x42\x02\x10\x01\x12\x1c\n\x10\x66ollower_weights\x18\x0e \x03(\x04\x42\x02\x10\x01\x1a\x46\n\x0bTaskContext\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x0b\n\x03tid\x18\x03 \x01(\r\x12\x10\n\x08\x61sync_id\x18\x04 \x01(\x04\x1aU\n\x16\x41syncContextDescriptor\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04kind\x18\x03 \x01(\t\x12\x12\n\nparent_iid\x18\x04 \x01(\x04\x1a]\n\x10\x45xecutionContext\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03\x63pu\x18\x02 \x01(\r\x12/\n\x04mode\x18\x03 \x01(\x0e\x32!.perfetto.protos.StackSample.Mode\x1a\xb7\x02\n\x11\x43ounterDescriptor\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x31\n\x04unit\x18\x03 \x01(\x0e\x32!.perfetto.protos.StackSample.UnitH\x00\x12\x12\n\x08unit_str\x18\x04 \x01(\tH\x00\x12\x17\n\x0funit_multiplier\x18\x05 \x01(\x04\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\x12\x43\n\x05scope\x18\x07 \x01(\x0e\x32\x34.perfetto.protos.StackSample.CounterDescriptor.Scope\"?\n\x05Scope\x12\x15\n\x11SCOPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cSCOPE_GLOBAL\x10\x01\x12\r\n\tSCOPE_CPU\x10\x02\x42\x0c\n\nunit_field\"y\n\x04Mode\x12\x10\n\x0cMODE_UNKNOWN\x10\x00\x12\r\n\tMODE_USER\x10\x01\x12\x0f\n\x0bMODE_KERNEL\x10\x02\x12\x13\n\x0fMODE_HYPERVISOR\x10\x03\x12\x13\n\x0fMODE_GUEST_USER\x10\x04\x12\x15\n\x11MODE_GUEST_KERNEL\x10\x05\"\xde\x01\n\x04Unit\x12\x14\n\x10UNIT_UNSPECIFIED\x10\x00\x12\x14\n\x10UNIT_NANOSECONDS\x10\x01\x12\x13\n\x0fUNIT_CPU_CYCLES\x10\x02\x12\x15\n\x11UNIT_INSTRUCTIONS\x10\x03\x12\x0e\n\nUNIT_BYTES\x10\x04\x12\x14\n\x10UNIT_PAGE_FAULTS\x10\x05\x12\x15\n\x11UNIT_CACHE_MISSES\x10\x06\x12\x19\n\x15UNIT_CACHE_REFERENCES\x10\x07\x12\x16\n\x12UNIT_BRANCH_MISSES\x10\x08\x12\x0e\n\nUNIT_COUNT\x10\tB\x14\n\x12task_context_fieldB\x19\n\x17\x65xecution_context_fieldB\x11\n\x0f\x63\x61llstack_fieldB\x14\n\x12unwind_error_fieldB\x1a\n\x18primary_descriptor_field\"\xbf\x01\n\x13StackSampleDefaults\x12\x0e\n\x06source\x18\x01 \x01(\t\x12J\n\x12primary_descriptor\x18\x02 \x01(\x0b\x32..perfetto.protos.StackSample.CounterDescriptor\x12L\n\x14\x66ollower_descriptors\x18\x03 \x03(\x0b\x32..perfetto.protos.StackSample.CounterDescriptor\"*\n\rHistogramName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"Z\n\x15\x43hromeHistogramSample\x12\x11\n\tname_hash\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06sample\x18\x03 \x01(\x03\x12\x10\n\x08name_iid\x18\x04 \x01(\x04\"\xac\x07\n\x0f\x44\x65\x62ugAnnotation\x12\x12\n\x08name_iid\x18\x01 \x01(\x04H\x00\x12\x0e\n\x04name\x18\n \x01(\tH\x00\x12\x14\n\nbool_value\x18\x02 \x01(\x08H\x01\x12\x14\n\nuint_value\x18\x03 \x01(\x04H\x01\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x01\x12\x16\n\x0c\x64ouble_value\x18\x05 \x01(\x01H\x01\x12\x17\n\rpointer_value\x18\x07 \x01(\x04H\x01\x12\x44\n\x0cnested_value\x18\x08 \x01(\x0b\x32,.perfetto.protos.DebugAnnotation.NestedValueH\x01\x12\x1b\n\x11legacy_json_value\x18\t \x01(\tH\x01\x12\x16\n\x0cstring_value\x18\x06 \x01(\tH\x01\x12\x1a\n\x10string_value_iid\x18\x11 \x01(\x04H\x01\x12\x19\n\x0fproto_type_name\x18\x10 \x01(\tH\x02\x12\x1d\n\x13proto_type_name_iid\x18\r \x01(\x04H\x02\x12\x13\n\x0bproto_value\x18\x0e \x01(\x0c\x12\x36\n\x0c\x64ict_entries\x18\x0b \x03(\x0b\x32 .perfetto.protos.DebugAnnotation\x12\x36\n\x0c\x61rray_values\x18\x0c \x03(\x0b\x32 .perfetto.protos.DebugAnnotation\x1a\xfc\x02\n\x0bNestedValue\x12L\n\x0bnested_type\x18\x01 \x01(\x0e\x32\x37.perfetto.protos.DebugAnnotation.NestedValue.NestedType\x12\x11\n\tdict_keys\x18\x02 \x03(\t\x12\x41\n\x0b\x64ict_values\x18\x03 \x03(\x0b\x32,.perfetto.protos.DebugAnnotation.NestedValue\x12\x42\n\x0c\x61rray_values\x18\x04 \x03(\x0b\x32,.perfetto.protos.DebugAnnotation.NestedValue\x12\x11\n\tint_value\x18\x05 \x01(\x03\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x12\n\nbool_value\x18\x07 \x01(\x08\x12\x14\n\x0cstring_value\x18\x08 \x01(\t\"2\n\nNestedType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x08\n\x04\x44ICT\x10\x01\x12\t\n\x05\x41RRAY\x10\x02\x42\x0c\n\nname_fieldB\x07\n\x05valueB\x17\n\x15proto_type_descriptor\"0\n\x13\x44\x65\x62ugAnnotationName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"9\n\x1c\x44\x65\x62ugAnnotationValueTypeName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x83\x02\n\nLogMessage\x12\x1b\n\x13source_location_iid\x18\x01 \x01(\x04\x12\x10\n\x08\x62ody_iid\x18\x02 \x01(\x04\x12\x32\n\x04prio\x18\x03 \x01(\x0e\x32$.perfetto.protos.LogMessage.Priority\"\x91\x01\n\x08Priority\x12\x14\n\x10PRIO_UNSPECIFIED\x10\x00\x12\x0f\n\x0bPRIO_UNUSED\x10\x01\x12\x10\n\x0cPRIO_VERBOSE\x10\x02\x12\x0e\n\nPRIO_DEBUG\x10\x03\x12\r\n\tPRIO_INFO\x10\x04\x12\r\n\tPRIO_WARN\x10\x05\x12\x0e\n\nPRIO_ERROR\x10\x06\x12\x0e\n\nPRIO_FATAL\x10\x07\"+\n\x0eLogMessageBody\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04\x62ody\x18\x02 \x01(\t\"M\n\x1aUnsymbolizedSourceLocation\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x12\n\nmapping_id\x18\x02 \x01(\x04\x12\x0e\n\x06rel_pc\x18\x03 \x01(\x04\"\\\n\x0eSourceLocation\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x11\n\tfile_name\x18\x02 \x01(\t\x12\x15\n\rfunction_name\x18\x03 \x01(\t\x12\x13\n\x0bline_number\x18\x04 \x01(\r\"$\n\x15\x43hromeActiveProcesses\x12\x0b\n\x03pid\x18\x01 \x03(\x05\"\xee\x02\n\x1a\x43hromeApplicationStateInfo\x12]\n\x11\x61pplication_state\x18\x01 \x01(\x0e\x32\x42.perfetto.protos.ChromeApplicationStateInfo.ChromeApplicationState\"\xf0\x01\n\x16\x43hromeApplicationState\x12\x1d\n\x19\x41PPLICATION_STATE_UNKNOWN\x10\x00\x12,\n(APPLICATION_STATE_HAS_RUNNING_ACTIVITIES\x10\x01\x12+\n\'APPLICATION_STATE_HAS_PAUSED_ACTIVITIES\x10\x02\x12,\n(APPLICATION_STATE_HAS_STOPPED_ACTIVITIES\x10\x03\x12.\n*APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES\x10\x04\"\xbf\x08\n\x1e\x43hromeCompositorSchedulerState\x12\x44\n\rstate_machine\x18\x01 \x01(\x0b\x32-.perfetto.protos.ChromeCompositorStateMachine\x12$\n\x1cobserving_begin_frame_source\x18\x02 \x01(\x08\x12&\n\x1e\x62\x65gin_impl_frame_deadline_task\x18\x03 \x01(\x08\x12 \n\x18pending_begin_frame_task\x18\x04 \x01(\x08\x12\x33\n+skipped_last_frame_missed_exceeded_deadline\x18\x05 \x01(\x08\x12G\n\rinside_action\x18\x07 \x01(\x0e\x32\x30.perfetto.protos.ChromeCompositorSchedulerAction\x12\x61\n\rdeadline_mode\x18\x08 \x01(\x0e\x32J.perfetto.protos.ChromeCompositorSchedulerState.BeginImplFrameDeadlineMode\x12\x13\n\x0b\x64\x65\x61\x64line_us\x18\t \x01(\x03\x12 \n\x18\x64\x65\x61\x64line_scheduled_at_us\x18\n \x01(\x03\x12\x0e\n\x06now_us\x18\x0b \x01(\x03\x12 \n\x18now_to_deadline_delta_us\x18\x0c \x01(\x03\x12-\n%now_to_deadline_scheduled_at_delta_us\x18\r \x01(\x03\x12\x42\n\x15\x62\x65gin_impl_frame_args\x18\x0e \x01(\x0b\x32#.perfetto.protos.BeginImplFrameArgs\x12L\n\x1a\x62\x65gin_frame_observer_state\x18\x0f \x01(\x0b\x32(.perfetto.protos.BeginFrameObserverState\x12H\n\x18\x62\x65gin_frame_source_state\x18\x10 \x01(\x0b\x32&.perfetto.protos.BeginFrameSourceState\x12K\n\x19\x63ompositor_timing_history\x18\x11 \x01(\x0b\x32(.perfetto.protos.CompositorTimingHistory\"\xbe\x01\n\x1a\x42\x65ginImplFrameDeadlineMode\x12\x1d\n\x19\x44\x45\x41\x44LINE_MODE_UNSPECIFIED\x10\x00\x12\x16\n\x12\x44\x45\x41\x44LINE_MODE_NONE\x10\x01\x12\x1b\n\x17\x44\x45\x41\x44LINE_MODE_IMMEDIATE\x10\x02\x12\x19\n\x15\x44\x45\x41\x44LINE_MODE_REGULAR\x10\x03\x12\x16\n\x12\x44\x45\x41\x44LINE_MODE_LATE\x10\x04\x12\x19\n\x15\x44\x45\x41\x44LINE_MODE_BLOCKED\x10\x05J\x04\x08\x06\x10\x07\"\xfe\x1c\n\x1c\x43hromeCompositorStateMachine\x12M\n\x0bmajor_state\x18\x01 \x01(\x0b\x32\x38.perfetto.protos.ChromeCompositorStateMachine.MajorState\x12M\n\x0bminor_state\x18\x02 \x01(\x0b\x32\x38.perfetto.protos.ChromeCompositorStateMachine.MinorState\x1a\x93\n\n\nMajorState\x12\x45\n\x0bnext_action\x18\x01 \x01(\x0e\x32\x30.perfetto.protos.ChromeCompositorSchedulerAction\x12l\n\x16\x62\x65gin_impl_frame_state\x18\x02 \x01(\x0e\x32L.perfetto.protos.ChromeCompositorStateMachine.MajorState.BeginImplFrameState\x12l\n\x16\x62\x65gin_main_frame_state\x18\x03 \x01(\x0e\x32L.perfetto.protos.ChromeCompositorStateMachine.MajorState.BeginMainFrameState\x12u\n\x1blayer_tree_frame_sink_state\x18\x04 \x01(\x0e\x32P.perfetto.protos.ChromeCompositorStateMachine.MajorState.LayerTreeFrameSinkState\x12p\n\x13\x66orced_redraw_state\x18\x05 \x01(\x0e\x32S.perfetto.protos.ChromeCompositorStateMachine.MajorState.ForcedRedrawOnTimeoutState\"\xa1\x01\n\x13\x42\x65ginImplFrameState\x12 \n\x1c\x42\x45GIN_IMPL_FRAME_UNSPECIFIED\x10\x00\x12\x19\n\x15\x42\x45GIN_IMPL_FRAME_IDLE\x10\x01\x12\'\n#BEGIN_IMPL_FRAME_INSIDE_BEGIN_FRAME\x10\x02\x12$\n BEGIN_IMPL_FRAME_INSIDE_DEADLINE\x10\x03\"\x93\x01\n\x13\x42\x65ginMainFrameState\x12 \n\x1c\x42\x45GIN_MAIN_FRAME_UNSPECIFIED\x10\x00\x12\x19\n\x15\x42\x45GIN_MAIN_FRAME_IDLE\x10\x01\x12\x19\n\x15\x42\x45GIN_MAIN_FRAME_SENT\x10\x02\x12$\n BEGIN_MAIN_FRAME_READY_TO_COMMIT\x10\x03\"\xf4\x01\n\x17LayerTreeFrameSinkState\x12 \n\x1cLAYER_TREE_FRAME_UNSPECIFIED\x10\x00\x12\x19\n\x15LAYER_TREE_FRAME_NONE\x10\x01\x12\x1b\n\x17LAYER_TREE_FRAME_ACTIVE\x10\x02\x12\x1d\n\x19LAYER_TREE_FRAME_CREATING\x10\x03\x12-\n)LAYER_TREE_FRAME_WAITING_FOR_FIRST_COMMIT\x10\x04\x12\x31\n-LAYER_TREE_FRAME_WAITING_FOR_FIRST_ACTIVATION\x10\x05\"\xc7\x01\n\x1a\x46orcedRedrawOnTimeoutState\x12\x1d\n\x19\x46ORCED_REDRAW_UNSPECIFIED\x10\x00\x12\x16\n\x12\x46ORCED_REDRAW_IDLE\x10\x01\x12$\n FORCED_REDRAW_WAITING_FOR_COMMIT\x10\x02\x12(\n$FORCED_REDRAW_WAITING_FOR_ACTIVATION\x10\x03\x12\"\n\x1e\x46ORCED_REDRAW_WAITING_FOR_DRAW\x10\x04\x1a\xa9\x11\n\nMinorState\x12\x14\n\x0c\x63ommit_count\x18\x01 \x01(\x05\x12\x1c\n\x14\x63urrent_frame_number\x18\x02 \x01(\x05\x12*\n\"last_frame_number_submit_performed\x18\x03 \x01(\x05\x12(\n last_frame_number_draw_performed\x18\x04 \x01(\x05\x12/\n\'last_frame_number_begin_main_frame_sent\x18\x05 \x01(\x05\x12\x10\n\x08\x64id_draw\x18\x06 \x01(\x08\x12\x33\n+did_send_begin_main_frame_for_current_frame\x18\x07 \x01(\x08\x12\x36\n.did_notify_begin_main_frame_not_expected_until\x18\x08 \x01(\x08\x12\x35\n-did_notify_begin_main_frame_not_expected_soon\x18\t \x01(\x08\x12+\n#wants_begin_main_frame_not_expected\x18\n \x01(\x08\x12\x1f\n\x17\x64id_commit_during_frame\x18\x0b \x01(\x08\x12,\n$did_invalidate_layer_tree_frame_sink\x18\x0c \x01(\x08\x12)\n!did_perform_impl_side_invalidaion\x18\r \x01(\x08\x12\x19\n\x11\x64id_prepare_tiles\x18\x0e \x01(\x08\x12+\n#consecutive_checkerboard_animations\x18\x0f \x01(\x05\x12\x1d\n\x15pending_submit_frames\x18\x10 \x01(\x05\x12\x38\n0submit_frames_with_current_layer_tree_frame_sink\x18\x11 \x01(\x05\x12\x14\n\x0cneeds_redraw\x18\x12 \x01(\x08\x12\x1b\n\x13needs_prepare_tiles\x18\x13 \x01(\x08\x12\x1e\n\x16needs_begin_main_frame\x18\x14 \x01(\x08\x12\"\n\x1aneeds_one_begin_impl_frame\x18\x15 \x01(\x08\x12\x0f\n\x07visible\x18\x16 \x01(\x08\x12!\n\x19\x62\x65gin_frame_source_paused\x18\x17 \x01(\x08\x12\x10\n\x08\x63\x61n_draw\x18\x18 \x01(\x08\x12\x19\n\x11resourceless_draw\x18\x19 \x01(\x08\x12\x18\n\x10has_pending_tree\x18\x1a \x01(\x08\x12,\n$pending_tree_is_ready_for_activation\x18\x1b \x01(\x08\x12$\n\x1c\x61\x63tive_tree_needs_first_draw\x18\x1c \x01(\x08\x12$\n\x1c\x61\x63tive_tree_is_ready_to_draw\x18\x1d \x01(\x08\x12=\n5did_create_and_initialize_first_layer_tree_frame_sink\x18\x1e \x01(\x08\x12\\\n\rtree_priority\x18\x1f \x01(\x0e\x32\x45.perfetto.protos.ChromeCompositorStateMachine.MinorState.TreePriority\x12i\n\x14scroll_handler_state\x18 \x01(\x0e\x32K.perfetto.protos.ChromeCompositorStateMachine.MinorState.ScrollHandlerState\x12\x35\n-critical_begin_main_frame_to_activate_is_fast\x18! \x01(\x08\x12(\n main_thread_missed_last_deadline\x18\" \x01(\x08\x12 \n\x18video_needs_begin_frames\x18$ \x01(\x08\x12\x1e\n\x16\x64\x65\x66\x65r_begin_main_frame\x18% \x01(\x08\x12\"\n\x1alast_commit_had_no_updates\x18& \x01(\x08\x12\x1e\n\x16\x64id_draw_in_last_frame\x18\' \x01(\x08\x12 \n\x18\x64id_submit_in_last_frame\x18( \x01(\x08\x12$\n\x1cneeds_impl_side_invalidation\x18) \x01(\x08\x12)\n!current_pending_tree_is_impl_side\x18* \x01(\x08\x12+\n#previous_pending_tree_was_impl_side\x18+ \x01(\x08\x12\x35\n-processing_animation_worklets_for_active_tree\x18, \x01(\x08\x12\x36\n.processing_animation_worklets_for_pending_tree\x18- \x01(\x08\x12\x32\n*processing_paint_worklets_for_pending_tree\x18. \x01(\x08\"\xb8\x01\n\x0cTreePriority\x12\x1d\n\x19TREE_PRIORITY_UNSPECIFIED\x10\x00\x12.\n*TREE_PRIORITY_SAME_PRIORITY_FOR_BOTH_TREES\x10\x01\x12+\n\'TREE_PRIORITY_SMOOTHNESS_TAKES_PRIORITY\x10\x02\x12,\n(TREE_PRIORITY_NEW_CONTENT_TAKES_PRIORITY\x10\x03\"\x82\x01\n\x12ScrollHandlerState\x12\x1e\n\x1aSCROLL_HANDLER_UNSPECIFIED\x10\x00\x12!\n\x1dSCROLL_AFFECTS_SCROLL_HANDLER\x10\x01\x12)\n%SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER\x10\x02J\x04\x08#\x10$\"\xaa\x04\n\x0e\x42\x65ginFrameArgs\x12@\n\x04type\x18\x01 \x01(\x0e\x32\x32.perfetto.protos.BeginFrameArgs.BeginFrameArgsType\x12\x11\n\tsource_id\x18\x02 \x01(\x04\x12\x17\n\x0fsequence_number\x18\x03 \x01(\x04\x12\x15\n\rframe_time_us\x18\x04 \x01(\x03\x12\x13\n\x0b\x64\x65\x61\x64line_us\x18\x05 \x01(\x03\x12\x19\n\x11interval_delta_us\x18\x06 \x01(\x03\x12\x18\n\x10on_critical_path\x18\x07 \x01(\x08\x12\x14\n\x0c\x61nimate_only\x18\x08 \x01(\x08\x12\x1d\n\x13source_location_iid\x18\t \x01(\x04H\x00\x12:\n\x0fsource_location\x18\n \x01(\x0b\x32\x1f.perfetto.protos.SourceLocationH\x00\x12#\n\x1b\x66rames_throttled_since_last\x18\x0c \x01(\x03\"\xa2\x01\n\x12\x42\x65ginFrameArgsType\x12%\n!BEGIN_FRAME_ARGS_TYPE_UNSPECIFIED\x10\x00\x12!\n\x1d\x42\x45GIN_FRAME_ARGS_TYPE_INVALID\x10\x01\x12 \n\x1c\x42\x45GIN_FRAME_ARGS_TYPE_NORMAL\x10\x02\x12 \n\x1c\x42\x45GIN_FRAME_ARGS_TYPE_MISSED\x10\x03\x42\x0e\n\x0c\x63reated_from\"\xc0\x04\n\x12\x42\x65ginImplFrameArgs\x12\x15\n\rupdated_at_us\x18\x01 \x01(\x03\x12\x16\n\x0e\x66inished_at_us\x18\x02 \x01(\x03\x12\x38\n\x05state\x18\x03 \x01(\x0e\x32).perfetto.protos.BeginImplFrameArgs.State\x12\x37\n\x0c\x63urrent_args\x18\x04 \x01(\x0b\x32\x1f.perfetto.protos.BeginFrameArgsH\x00\x12\x34\n\tlast_args\x18\x05 \x01(\x0b\x32\x1f.perfetto.protos.BeginFrameArgsH\x00\x12L\n\x10timestamps_in_us\x18\x06 \x01(\x0b\x32\x32.perfetto.protos.BeginImplFrameArgs.TimestampsInUs\x1a\xc1\x01\n\x0eTimestampsInUs\x12\x16\n\x0einterval_delta\x18\x01 \x01(\x03\x12\x1d\n\x15now_to_deadline_delta\x18\x02 \x01(\x03\x12\x1f\n\x17\x66rame_time_to_now_delta\x18\x03 \x01(\x03\x12$\n\x1c\x66rame_time_to_deadline_delta\x18\x04 \x01(\x03\x12\x0b\n\x03now\x18\x05 \x01(\x03\x12\x12\n\nframe_time\x18\x06 \x01(\x03\x12\x10\n\x08\x64\x65\x61\x64line\x18\x07 \x01(\x03\"8\n\x05State\x12\x18\n\x14\x42\x45GIN_FRAME_FINISHED\x10\x00\x12\x15\n\x11\x42\x45GIN_FRAME_USING\x10\x01\x42\x06\n\x04\x61rgs\"{\n\x17\x42\x65ginFrameObserverState\x12 \n\x18\x64ropped_begin_frame_args\x18\x01 \x01(\x03\x12>\n\x15last_begin_frame_args\x18\x02 \x01(\x0b\x32\x1f.perfetto.protos.BeginFrameArgs\"\x91\x01\n\x15\x42\x65ginFrameSourceState\x12\x11\n\tsource_id\x18\x01 \x01(\r\x12\x0e\n\x06paused\x18\x02 \x01(\x08\x12\x15\n\rnum_observers\x18\x03 \x01(\r\x12>\n\x15last_begin_frame_args\x18\x04 \x01(\x0b\x32\x1f.perfetto.protos.BeginFrameArgs\"\xfc\x02\n\x17\x43ompositorTimingHistory\x12\x39\n1begin_main_frame_queue_critical_estimate_delta_us\x18\x01 \x01(\x03\x12=\n5begin_main_frame_queue_not_critical_estimate_delta_us\x18\x02 \x01(\x03\x12\x43\n;begin_main_frame_start_to_ready_to_commit_estimate_delta_us\x18\x03 \x01(\x03\x12\x35\n-commit_to_ready_to_activate_estimate_delta_us\x18\x04 \x01(\x03\x12\'\n\x1fprepare_tiles_estimate_delta_us\x18\x05 \x01(\x03\x12\"\n\x1a\x61\x63tivate_estimate_delta_us\x18\x06 \x01(\x03\x12\x1e\n\x16\x64raw_estimate_delta_us\x18\x07 \x01(\x03\">\n\x1e\x43hromeContentSettingsEventInfo\x12\x1c\n\x14number_of_exceptions\x18\x01 \x01(\r\"\xe0\x08\n\x13\x43hromeFrameReporter\x12\x39\n\x05state\x18\x01 \x01(\x0e\x32*.perfetto.protos.ChromeFrameReporter.State\x12\x44\n\x06reason\x18\x02 \x01(\x0e\x32\x34.perfetto.protos.ChromeFrameReporter.FrameDropReason\x12\x14\n\x0c\x66rame_source\x18\x03 \x01(\x04\x12\x16\n\x0e\x66rame_sequence\x18\x04 \x01(\x04\x12\x1a\n\x12\x61\x66\x66\x65\x63ts_smoothness\x18\x05 \x01(\x08\x12\x46\n\x0cscroll_state\x18\x06 \x01(\x0e\x32\x30.perfetto.protos.ChromeFrameReporter.ScrollState\x12\x1a\n\x12has_main_animation\x18\x07 \x01(\x08\x12 \n\x18has_compositor_animation\x18\x08 \x01(\x08\x12\x1d\n\x15has_smooth_input_main\x18\t \x01(\x08\x12\x1b\n\x13has_missing_content\x18\n \x01(\x08\x12\x1a\n\x12layer_tree_host_id\x18\x0b \x01(\x04\x12\x18\n\x10has_high_latency\x18\x0c \x01(\x08\x12\x42\n\nframe_type\x18\r \x01(\x0e\x32..perfetto.protos.ChromeFrameReporter.FrameType\x12\'\n\x1fhigh_latency_contribution_stage\x18\x0e \x03(\t\x12#\n\x1b\x63heckerboarded_needs_raster\x18\x0f \x01(\x08\x12#\n\x1b\x63heckerboarded_needs_record\x18\x10 \x01(\x08\x12\x1e\n\x16surface_frame_trace_id\x18\x11 \x01(\x03\x12\x18\n\x10\x64isplay_trace_id\x18\x12 \x01(\x03\"m\n\x05State\x12\x1b\n\x17STATE_NO_UPDATE_DESIRED\x10\x00\x12\x17\n\x13STATE_PRESENTED_ALL\x10\x01\x12\x1b\n\x17STATE_PRESENTED_PARTIAL\x10\x02\x12\x11\n\rSTATE_DROPPED\x10\x03\"~\n\x0f\x46rameDropReason\x12\x16\n\x12REASON_UNSPECIFIED\x10\x00\x12\x1d\n\x19REASON_DISPLAY_COMPOSITOR\x10\x01\x12\x16\n\x12REASON_MAIN_THREAD\x10\x02\x12\x1c\n\x18REASON_CLIENT_COMPOSITOR\x10\x03\"{\n\x0bScrollState\x12\x0f\n\x0bSCROLL_NONE\x10\x00\x12\x16\n\x12SCROLL_MAIN_THREAD\x10\x01\x12\x1c\n\x18SCROLL_COMPOSITOR_THREAD\x10\x02\x12\x11\n\rSCROLL_RASTER\x10\x03\x12\x12\n\x0eSCROLL_UNKNOWN\x10\x04\"%\n\tFrameType\x12\n\n\x06\x46ORKED\x10\x00\x12\x0c\n\x08\x42\x41\x43KFILL\x10\x01:\x02\x18\x01\"\"\n\x12\x43hromeKeyedService\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xf6\r\n\x11\x43hromeLatencyInfo\x12\x10\n\x08trace_id\x18\x01 \x01(\x03\x12\x35\n\x04step\x18\x02 \x01(\x0e\x32\'.perfetto.protos.ChromeLatencyInfo.Step\x12\x1a\n\x12\x66rame_tree_node_id\x18\x03 \x01(\x05\x12H\n\x0e\x63omponent_info\x18\x04 \x03(\x0b\x32\x30.perfetto.protos.ChromeLatencyInfo.ComponentInfo\x12\x14\n\x0cis_coalesced\x18\x05 \x01(\x08\x12\x19\n\x11gesture_scroll_id\x18\x06 \x01(\x03\x12\x10\n\x08touch_id\x18\x07 \x01(\x03\x12@\n\ninput_type\x18\x08 \x01(\x0e\x32,.perfetto.protos.ChromeLatencyInfo.InputType\x1aq\n\rComponentInfo\x12O\n\x0e\x63omponent_type\x18\x01 \x01(\x0e\x32\x37.perfetto.protos.ChromeLatencyInfo.LatencyComponentType\x12\x0f\n\x07time_us\x18\x02 \x01(\x04\"\x92\x03\n\x04Step\x12\x14\n\x10STEP_UNSPECIFIED\x10\x00\x12\x1c\n\x18STEP_SEND_INPUT_EVENT_UI\x10\x03\x12 \n\x1cSTEP_HANDLE_INPUT_EVENT_IMPL\x10\x05\x12(\n$STEP_DID_HANDLE_INPUT_AND_OVERSCROLL\x10\x08\x12 \n\x1cSTEP_HANDLE_INPUT_EVENT_MAIN\x10\x04\x12\"\n\x1eSTEP_MAIN_THREAD_SCROLL_UPDATE\x10\x02\x12\'\n#STEP_HANDLE_INPUT_EVENT_MAIN_COMMIT\x10\x01\x12)\n%STEP_HANDLED_INPUT_EVENT_MAIN_OR_IMPL\x10\t\x12!\n\x1dSTEP_HANDLED_INPUT_EVENT_IMPL\x10\n\x12\x15\n\x11STEP_SWAP_BUFFERS\x10\x06\x12\x16\n\x12STEP_DRAW_AND_SWAP\x10\x07\x12\x1e\n\x1aSTEP_FINISHED_SWAP_BUFFERS\x10\x0b\"\xf5\x05\n\x14LatencyComponentType\x12\x19\n\x15\x43OMPONENT_UNSPECIFIED\x10\x00\x12+\n\'COMPONENT_INPUT_EVENT_LATENCY_BEGIN_RWH\x10\x01\x12\x38\n4COMPONENT_INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL\x10\x02\x12>\n:COMPONENT_INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL\x10\x03\x12*\n&COMPONENT_INPUT_EVENT_LATENCY_ORIGINAL\x10\x04\x12$\n COMPONENT_INPUT_EVENT_LATENCY_UI\x10\x05\x12/\n+COMPONENT_INPUT_EVENT_LATENCY_RENDERER_MAIN\x10\x06\x12:\n6COMPONENT_INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_MAIN\x10\x07\x12:\n6COMPONENT_INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_IMPL\x10\x08\x12:\n6COMPONENT_INPUT_EVENT_LATENCY_SCROLL_UPDATE_LAST_EVENT\x10\t\x12)\n%COMPONENT_INPUT_EVENT_LATENCY_ACK_RWH\x10\n\x12/\n+COMPONENT_INPUT_EVENT_LATENCY_RENDERER_SWAP\x10\x0b\x12/\n+COMPONENT_DISPLAY_COMPOSITOR_RECEIVED_FRAME\x10\x0c\x12)\n%COMPONENT_INPUT_EVENT_GPU_SWAP_BUFFER\x10\r\x12,\n(COMPONENT_INPUT_EVENT_LATENCY_FRAME_SWAP\x10\x0e\"\xac\x01\n\tInputType\x12\x18\n\x14UNSPECIFIED_OR_OTHER\x10\x00\x12\x0f\n\x0bTOUCH_MOVED\x10\x01\x12\x18\n\x14GESTURE_SCROLL_BEGIN\x10\x02\x12\x19\n\x15GESTURE_SCROLL_UPDATE\x10\x03\x12\x16\n\x12GESTURE_SCROLL_END\x10\x04\x12\x0f\n\x0bGESTURE_TAP\x10\x05\x12\x16\n\x12GESTURE_TAP_CANCEL\x10\x06\"\xce\x07\n\x0f\x43hromeLegacyIpc\x12\x44\n\rmessage_class\x18\x01 \x01(\x0e\x32-.perfetto.protos.ChromeLegacyIpc.MessageClass\x12\x14\n\x0cmessage_line\x18\x02 \x01(\r\"\xde\x06\n\x0cMessageClass\x12\x15\n\x11\x43LASS_UNSPECIFIED\x10\x00\x12\x14\n\x10\x43LASS_AUTOMATION\x10\x01\x12\x0f\n\x0b\x43LASS_FRAME\x10\x02\x12\x0e\n\nCLASS_PAGE\x10\x03\x12\x0e\n\nCLASS_VIEW\x10\x04\x12\x10\n\x0c\x43LASS_WIDGET\x10\x05\x12\x0f\n\x0b\x43LASS_INPUT\x10\x06\x12\x0e\n\nCLASS_TEST\x10\x07\x12\x10\n\x0c\x43LASS_WORKER\x10\x08\x12\x0e\n\nCLASS_NACL\x10\t\x12\x15\n\x11\x43LASS_GPU_CHANNEL\x10\n\x12\x0f\n\x0b\x43LASS_MEDIA\x10\x0b\x12\x0f\n\x0b\x43LASS_PPAPI\x10\x0c\x12\x10\n\x0c\x43LASS_CHROME\x10\r\x12\x0e\n\nCLASS_DRAG\x10\x0e\x12\x0f\n\x0b\x43LASS_PRINT\x10\x0f\x12\x13\n\x0f\x43LASS_EXTENSION\x10\x10\x12\x1b\n\x17\x43LASS_TEXT_INPUT_CLIENT\x10\x11\x12\x14\n\x10\x43LASS_BLINK_TEST\x10\x12\x12\x17\n\x13\x43LASS_ACCESSIBILITY\x10\x13\x12\x13\n\x0f\x43LASS_PRERENDER\x10\x14\x12\x14\n\x10\x43LASS_CHROMOTING\x10\x15\x12\x18\n\x14\x43LASS_BROWSER_PLUGIN\x10\x16\x12\x1a\n\x16\x43LASS_ANDROID_WEB_VIEW\x10\x17\x12\x13\n\x0f\x43LASS_NACL_HOST\x10\x18\x12\x19\n\x15\x43LASS_ENCRYPTED_MEDIA\x10\x19\x12\x0e\n\nCLASS_CAST\x10\x1a\x12\x19\n\x15\x43LASS_GIN_JAVA_BRIDGE\x10\x1b\x12!\n\x1d\x43LASS_CHROME_UTILITY_PRINTING\x10\x1c\x12\x13\n\x0f\x43LASS_OZONE_GPU\x10\x1d\x12\x12\n\x0e\x43LASS_WEB_TEST\x10\x1e\x12\x17\n\x13\x43LASS_NETWORK_HINTS\x10\x1f\x12\x1f\n\x1b\x43LASS_EXTENSIONS_GUEST_VIEW\x10 \x12\x14\n\x10\x43LASS_GUEST_VIEW\x10!\x12\x1f\n\x1b\x43LASS_MEDIA_PLAYER_DELEGATE\x10\"\x12\x1a\n\x16\x43LASS_EXTENSION_WORKER\x10#\x12\x1c\n\x18\x43LASS_SUBRESOURCE_FILTER\x10$\x12\x1b\n\x17\x43LASS_UNFREEZABLE_FRAME\x10%\"T\n\x11\x43hromeMessagePump\x12\x1e\n\x16sent_messages_in_queue\x18\x01 \x01(\x08\x12\x1f\n\x17io_handler_location_iid\x18\x02 \x01(\x04\"\xcc\x01\n\x13\x43hromeMojoEventInfo\x12$\n\x1cwatcher_notify_interface_tag\x18\x01 \x01(\t\x12\x10\n\x08ipc_hash\x18\x02 \x01(\r\x12\x1a\n\x12mojo_interface_tag\x18\x03 \x01(\t\x12!\n\x19mojo_interface_method_iid\x18\x04 \x01(\x04\x12\x10\n\x08is_reply\x18\x05 \x01(\x08\x12\x14\n\x0cpayload_size\x18\x06 \x01(\x04\x12\x16\n\x0e\x64\x61ta_num_bytes\x18\x07 \x01(\x04\"~\n\x1c\x43hromeRendererSchedulerState\x12\x32\n\trail_mode\x18\x01 \x01(\x0e\x32\x1f.perfetto.protos.ChromeRAILMode\x12\x17\n\x0fis_backgrounded\x18\x02 \x01(\x08\x12\x11\n\tis_hidden\x18\x03 \x01(\x08\"6\n\x0f\x43hromeUserEvent\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tion_hash\x18\x02 \x01(\x04\"P\n\x1b\x43hromeWindowHandleEventInfo\x12\x0b\n\x03\x64pi\x18\x01 \x01(\r\x12\x12\n\nmessage_id\x18\x02 \x01(\r\x12\x10\n\x08hwnd_ptr\x18\x03 \x01(\x06\"E\n\nScreenshot\x12\x11\n\tjpg_image\x18\x01 \x01(\x0c\x12\x11\n\tpam_image\x18\x02 \x01(\x0c\x12\x11\n\tppm_image\x18\x03 \x01(\x0c\"(\n\rTaskExecution\x12\x17\n\x0fposted_from_iid\x18\x01 \x01(\x04\"\xf8\x1a\n\nTrackEvent\x12\x15\n\rcategory_iids\x18\x03 \x03(\x04\x12\x12\n\ncategories\x18\x16 \x03(\t\x12\x12\n\x08name_iid\x18\n \x01(\x04H\x00\x12\x0e\n\x04name\x18\x17 \x01(\tH\x00\x12.\n\x04type\x18\t \x01(\x0e\x32 .perfetto.protos.TrackEvent.Type\x12\x12\n\ntrack_uuid\x18\x0b \x01(\x04\x12\x17\n\rcounter_value\x18\x1e \x01(\x03H\x01\x12\x1e\n\x14\x64ouble_counter_value\x18, \x01(\x01H\x01\x12!\n\x19\x65xtra_counter_track_uuids\x18\x1f \x03(\x04\x12\x1c\n\x14\x65xtra_counter_values\x18\x0c \x03(\x03\x12(\n extra_double_counter_track_uuids\x18- \x03(\x04\x12#\n\x1b\x65xtra_double_counter_values\x18. \x03(\x01\x12\x18\n\x0c\x66low_ids_old\x18$ \x03(\x04\x42\x02\x18\x01\x12\x10\n\x08\x66low_ids\x18/ \x03(\x06\x12$\n\x18terminating_flow_ids_old\x18* \x03(\x04\x42\x02\x18\x01\x12\x1c\n\x14terminating_flow_ids\x18\x30 \x03(\x06\x12\x18\n\x0e\x63orrelation_id\x18\x34 \x01(\x04H\x02\x12\x1c\n\x12\x63orrelation_id_str\x18\x35 \x01(\tH\x02\x12 \n\x16\x63orrelation_id_str_iid\x18\x36 \x01(\x04H\x02\x12@\n\tcallstack\x18\x37 \x01(\x0b\x32+.perfetto.protos.TrackEvent.InlineCallstackH\x03\x12\x17\n\rcallstack_iid\x18\x38 \x01(\x04H\x03\x12\x18\n\x10\x63\x61llstack_weight\x18\x39 \x01(\x01\x12;\n\x11\x64\x65\x62ug_annotations\x18\x04 \x03(\x0b\x32 .perfetto.protos.DebugAnnotation\x12\x36\n\x0etask_execution\x18\x05 \x01(\x0b\x32\x1e.perfetto.protos.TaskExecution\x12\x30\n\x0blog_message\x18\x15 \x01(\x0b\x32\x1b.perfetto.protos.LogMessage\x12K\n\x12\x63\x63_scheduler_state\x18\x18 \x01(\x0b\x32/.perfetto.protos.ChromeCompositorSchedulerState\x12;\n\x11\x63hrome_user_event\x18\x19 \x01(\x0b\x32 .perfetto.protos.ChromeUserEvent\x12\x41\n\x14\x63hrome_keyed_service\x18\x1a \x01(\x0b\x32#.perfetto.protos.ChromeKeyedService\x12;\n\x11\x63hrome_legacy_ipc\x18\x1b \x01(\x0b\x32 .perfetto.protos.ChromeLegacyIpc\x12G\n\x17\x63hrome_histogram_sample\x18\x1c \x01(\x0b\x32&.perfetto.protos.ChromeHistogramSample\x12?\n\x13\x63hrome_latency_info\x18\x1d \x01(\x0b\x32\".perfetto.protos.ChromeLatencyInfo\x12G\n\x15\x63hrome_frame_reporter\x18 \x01(\x0b\x32$.perfetto.protos.ChromeFrameReporterB\x02\x18\x01\x12R\n\x1d\x63hrome_application_state_info\x18\' \x01(\x0b\x32+.perfetto.protos.ChromeApplicationStateInfo\x12V\n\x1f\x63hrome_renderer_scheduler_state\x18( \x01(\x0b\x32-.perfetto.protos.ChromeRendererSchedulerState\x12U\n\x1f\x63hrome_window_handle_event_info\x18) \x01(\x0b\x32,.perfetto.protos.ChromeWindowHandleEventInfo\x12[\n\"chrome_content_settings_event_info\x18+ \x01(\x0b\x32/.perfetto.protos.ChromeContentSettingsEventInfo\x12G\n\x17\x63hrome_active_processes\x18\x31 \x01(\x0b\x32&.perfetto.protos.ChromeActiveProcesses\x12/\n\nscreenshot\x18\x32 \x01(\x0b\x32\x1b.perfetto.protos.Screenshot\x12:\n\x0fsource_location\x18! \x01(\x0b\x32\x1f.perfetto.protos.SourceLocationH\x04\x12\x1d\n\x13source_location_iid\x18\" \x01(\x04H\x04\x12?\n\x13\x63hrome_message_pump\x18# \x01(\x0b\x32\".perfetto.protos.ChromeMessagePump\x12\x44\n\x16\x63hrome_mojo_event_info\x18& \x01(\x0b\x32$.perfetto.protos.ChromeMojoEventInfo\x12\x1c\n\x12timestamp_delta_us\x18\x01 \x01(\x03H\x05\x12\x1f\n\x15timestamp_absolute_us\x18\x10 \x01(\x03H\x05\x12\x1e\n\x14thread_time_delta_us\x18\x02 \x01(\x03H\x06\x12!\n\x17thread_time_absolute_us\x18\x11 \x01(\x03H\x06\x12(\n\x1ethread_instruction_count_delta\x18\x08 \x01(\x03H\x07\x12+\n!thread_instruction_count_absolute\x18\x14 \x01(\x03H\x07\x12=\n\x0clegacy_event\x18\x06 \x01(\x0b\x32\'.perfetto.protos.TrackEvent.LegacyEvent\x1a\x9e\x01\n\x0fInlineCallstack\x12\x41\n\x06\x66rames\x18\x01 \x03(\x0b\x32\x31.perfetto.protos.TrackEvent.InlineCallstack.Frame\x1aH\n\x05\x46rame\x12\x15\n\rfunction_name\x18\x01 \x01(\t\x12\x13\n\x0bsource_file\x18\x02 \x01(\t\x12\x13\n\x0bline_number\x18\x03 \x01(\r\x1a\xaa\x05\n\x0bLegacyEvent\x12\x10\n\x08name_iid\x18\x01 \x01(\x04\x12\r\n\x05phase\x18\x02 \x01(\x05\x12\x13\n\x0b\x64uration_us\x18\x03 \x01(\x03\x12\x1a\n\x12thread_duration_us\x18\x04 \x01(\x03\x12 \n\x18thread_instruction_delta\x18\x0f \x01(\x03\x12\x15\n\x0bunscoped_id\x18\x06 \x01(\x04H\x00\x12\x12\n\x08local_id\x18\n \x01(\x04H\x00\x12\x13\n\tglobal_id\x18\x0b \x01(\x04H\x00\x12\x10\n\x08id_scope\x18\x07 \x01(\t\x12\x15\n\ruse_async_tts\x18\t \x01(\x08\x12\x0f\n\x07\x62ind_id\x18\x08 \x01(\x04\x12\x19\n\x11\x62ind_to_enclosing\x18\x0c \x01(\x08\x12M\n\x0e\x66low_direction\x18\r \x01(\x0e\x32\x35.perfetto.protos.TrackEvent.LegacyEvent.FlowDirection\x12V\n\x13instant_event_scope\x18\x0e \x01(\x0e\x32\x39.perfetto.protos.TrackEvent.LegacyEvent.InstantEventScope\x12\x14\n\x0cpid_override\x18\x12 \x01(\x05\x12\x14\n\x0ctid_override\x18\x13 \x01(\x05\"P\n\rFlowDirection\x12\x14\n\x10\x46LOW_UNSPECIFIED\x10\x00\x12\x0b\n\x07\x46LOW_IN\x10\x01\x12\x0c\n\x08\x46LOW_OUT\x10\x02\x12\x0e\n\nFLOW_INOUT\x10\x03\"a\n\x11InstantEventScope\x12\x15\n\x11SCOPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cSCOPE_GLOBAL\x10\x01\x12\x11\n\rSCOPE_PROCESS\x10\x02\x12\x10\n\x0cSCOPE_THREAD\x10\x03\x42\x04\n\x02idJ\x04\x08\x05\x10\x06\"z\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x14\n\x10TYPE_SLICE_BEGIN\x10\x01\x12\x12\n\x0eTYPE_SLICE_END\x10\x02\x12\x10\n\x0cTYPE_INSTANT\x10\x03\x12\x10\n\x0cTYPE_COUNTER\x10\x04\x12\x0e\n\nTYPE_STATE\x10\x05*\x06\x08\xe8\x07\x10\x90NB\x0c\n\nname_fieldB\x15\n\x13\x63ounter_value_fieldB\x16\n\x14\x63orrelation_id_fieldB\x11\n\x0f\x63\x61llstack_fieldB\x17\n\x15source_location_fieldB\x0b\n\ttimestampB\r\n\x0bthread_timeB\x1a\n\x18thread_instruction_countJ\x04\x08\x33\x10\x34\"u\n\x12TrackEventDefaults\x12\x12\n\ntrack_uuid\x18\x0b \x01(\x04\x12!\n\x19\x65xtra_counter_track_uuids\x18\x1f \x03(\x04\x12(\n extra_double_counter_track_uuids\x18- \x03(\x04\"*\n\rEventCategory\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"&\n\tEventName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"\xc5\x10\n\x0cInternedData\x12\x38\n\x10\x65vent_categories\x18\x01 \x03(\x0b\x32\x1e.perfetto.protos.EventCategory\x12/\n\x0b\x65vent_names\x18\x02 \x03(\x0b\x32\x1a.perfetto.protos.EventName\x12\x44\n\x16\x64\x65\x62ug_annotation_names\x18\x03 \x03(\x0b\x32$.perfetto.protos.DebugAnnotationName\x12X\n!debug_annotation_value_type_names\x18\x1b \x03(\x0b\x32-.perfetto.protos.DebugAnnotationValueTypeName\x12G\n\x1e\x64\x65\x62ug_annotation_string_values\x18\x1d \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12;\n\x12\x63orrelation_id_str\x18+ \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12\x32\n\tbuild_ids\x18\x10 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12\x36\n\rmapping_paths\x18\x11 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12\x35\n\x0csource_paths\x18\x12 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12\x37\n\x0e\x66unction_names\x18\x05 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12*\n\x08mappings\x18\x13 \x03(\x0b\x32\x18.perfetto.protos.Mapping\x12&\n\x06\x66rames\x18\x06 \x03(\x0b\x32\x16.perfetto.protos.Frame\x12.\n\ncallstacks\x18\x07 \x03(\x0b\x32\x1a.perfetto.protos.Callstack\x12L\n\x1astack_sample_task_contexts\x18\x30 \x03(\x0b\x32(.perfetto.protos.StackSample.TaskContext\x12V\n\x1fstack_sample_execution_contexts\x18\x31 \x03(\x0b\x32-.perfetto.protos.StackSample.ExecutionContext\x12X\n stack_sample_counter_descriptors\x18\x32 \x03(\x0b\x32..perfetto.protos.StackSample.CounterDescriptor\x12\x63\n&stack_sample_async_context_descriptors\x18\x33 \x03(\x0b\x32\x33.perfetto.protos.StackSample.AsyncContextDescriptor\x12\x39\n\x10source_locations\x18\x04 \x03(\x0b\x32\x1f.perfetto.protos.SourceLocation\x12R\n\x1dunsymbolized_source_locations\x18\x1c \x03(\x0b\x32+.perfetto.protos.UnsymbolizedSourceLocation\x12\x39\n\x10log_message_body\x18\x14 \x03(\x0b\x32\x1f.perfetto.protos.LogMessageBody\x12\x37\n\x0fhistogram_names\x18\x19 \x03(\x0b\x32\x1e.perfetto.protos.HistogramName\x12;\n\x12vulkan_memory_keys\x18\x16 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12\x43\n\x11graphics_contexts\x18\x17 \x03(\x0b\x32(.perfetto.protos.InternedGraphicsContext\x12P\n\x12gpu_specifications\x18\x18 \x03(\x0b\x32\x34.perfetto.protos.InternedGpuRenderStageSpecification\x12N\n\x17gpu_counter_descriptors\x18/ \x03(\x0b\x32-.perfetto.protos.InternedGpuCounterDescriptor\x12\x37\n\x0ekernel_symbols\x18\x1a \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12>\n\x13v8_js_function_name\x18\x1f \x03(\x0b\x32!.perfetto.protos.InternedV8String\x12=\n\x0ev8_js_function\x18 \x03(\x0b\x32%.perfetto.protos.InternedV8JsFunction\x12\x39\n\x0cv8_js_script\x18! \x03(\x0b\x32#.perfetto.protos.InternedV8JsScript\x12=\n\x0ev8_wasm_script\x18\" \x03(\x0b\x32%.perfetto.protos.InternedV8WasmScript\x12\x36\n\nv8_isolate\x18# \x03(\x0b\x32\".perfetto.protos.InternedV8Isolate*\x04\x08\x1e\x10\x1f*\x04\x08$\x10%*\x04\x08%\x10&*\x04\x08&\x10\'*\x04\x08\'\x10(*\x04\x08(\x10)*\x04\x08)\x10**\x04\x08*\x10+*\x04\x08,\x10-*\x04\x08-\x10.*\x04\x08.\x10/*\x06\x08\xe8\x07\x10\x90NJ\x04\x08\x15\x10\x16\"\xf3\x01\n\x14SystemdJournaldEvent\x12\x0b\n\x03pid\x18\x01 \x01(\r\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12\x0b\n\x03uid\x18\x03 \x01(\r\x12\x0b\n\x03gid\x18\x04 \x01(\r\x12\x0c\n\x04prio\x18\x05 \x01(\r\x12\x0b\n\x03tag\x18\x06 \x01(\t\x12\x0f\n\x07message\x18\x07 \x01(\t\x12\x0c\n\x04\x63omm\x18\x08 \x01(\t\x12\x0b\n\x03\x65xe\x18\t \x01(\t\x12\x14\n\x0csystemd_unit\x18\n \x01(\t\x12\x10\n\x08hostname\x18\x0b \x01(\t\x12\x11\n\ttransport\x18\x0c \x01(\t\x12\x11\n\tnum_total\x18\x14 \x01(\x04\x12\x12\n\nnum_failed\x18\x15 \x01(\x04\"\xf0\x07\n\x15MemoryTrackerSnapshot\x12\x16\n\x0eglobal_dump_id\x18\x01 \x01(\x04\x12M\n\x0flevel_of_detail\x18\x02 \x01(\x0e\x32\x34.perfetto.protos.MemoryTrackerSnapshot.LevelOfDetail\x12T\n\x14process_memory_dumps\x18\x03 \x03(\x0b\x32\x36.perfetto.protos.MemoryTrackerSnapshot.ProcessSnapshot\x1a\xce\x05\n\x0fProcessSnapshot\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12Z\n\x0f\x61llocator_dumps\x18\x02 \x03(\x0b\x32\x41.perfetto.protos.MemoryTrackerSnapshot.ProcessSnapshot.MemoryNode\x12W\n\x0cmemory_edges\x18\x03 \x03(\x0b\x32\x41.perfetto.protos.MemoryTrackerSnapshot.ProcessSnapshot.MemoryEdge\x1a\x9b\x03\n\nMemoryNode\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x15\n\rabsolute_name\x18\x02 \x01(\t\x12\x0c\n\x04weak\x18\x03 \x01(\x08\x12\x12\n\nsize_bytes\x18\x04 \x01(\x04\x12\x62\n\x07\x65ntries\x18\x05 \x03(\x0b\x32Q.perfetto.protos.MemoryTrackerSnapshot.ProcessSnapshot.MemoryNode.MemoryNodeEntry\x1a\xe3\x01\n\x0fMemoryNodeEntry\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x66\n\x05units\x18\x02 \x01(\x0e\x32W.perfetto.protos.MemoryTrackerSnapshot.ProcessSnapshot.MemoryNode.MemoryNodeEntry.Units\x12\x14\n\x0cvalue_uint64\x18\x03 \x01(\x04\x12\x14\n\x0cvalue_string\x18\x04 \x01(\t\".\n\x05Units\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\t\n\x05\x43OUNT\x10\x02\x1a[\n\nMemoryEdge\x12\x11\n\tsource_id\x18\x01 \x01(\x04\x12\x11\n\ttarget_id\x18\x02 \x01(\x04\x12\x12\n\nimportance\x18\x03 \x01(\r\x12\x13\n\x0boverridable\x18\x04 \x01(\x08\"I\n\rLevelOfDetail\x12\x0f\n\x0b\x44\x45TAIL_FULL\x10\x00\x12\x10\n\x0c\x44\x45TAIL_LIGHT\x10\x01\x12\x15\n\x11\x44\x45TAIL_BACKGROUND\x10\x02\"\xd1\x02\n\x16\x43oncurrentSessionEvent\x12<\n\x05state\x18\x01 \x01(\x0e\x32-.perfetto.protos.ConcurrentSessionEvent.State\x12\x14\n\x0csession_name\x18\x02 \x01(\t\x12\x12\n\nsession_id\x18\x03 \x01(\x04\x12\x14\n\x0c\x63onsumer_uid\x18\x04 \x01(\x05\x12\x18\n\x10num_data_sources\x18\x05 \x01(\r\"\x9e\x01\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x12\n\x0eSTATE_DISABLED\x10\x01\x12\x14\n\x10STATE_CONFIGURED\x10\x02\x12\x11\n\rSTATE_STARTED\x10\x03\x12%\n!STATE_DISABLING_WAITING_STOP_ACKS\x10\x04\x12\x1a\n\x16STATE_CLONED_READ_ONLY\x10\x05\"\xa1\x04\n\x11PerfettoMetatrace\x12\x12\n\x08\x65vent_id\x18\x01 \x01(\rH\x00\x12\x14\n\ncounter_id\x18\x02 \x01(\rH\x00\x12\x14\n\nevent_name\x18\x08 \x01(\tH\x00\x12\x18\n\x0e\x65vent_name_iid\x18\x0b \x01(\x04H\x00\x12\x16\n\x0c\x63ounter_name\x18\t \x01(\tH\x00\x12\x19\n\x11\x65vent_duration_ns\x18\x03 \x01(\x04\x12\x15\n\rcounter_value\x18\x04 \x01(\x05\x12\x11\n\tthread_id\x18\x05 \x01(\r\x12\x14\n\x0chas_overruns\x18\x06 \x01(\x08\x12\x34\n\x04\x61rgs\x18\x07 \x03(\x0b\x32&.perfetto.protos.PerfettoMetatrace.Arg\x12K\n\x10interned_strings\x18\n \x03(\x0b\x32\x31.perfetto.protos.PerfettoMetatrace.InternedString\x1a\x7f\n\x03\x41rg\x12\r\n\x03key\x18\x01 \x01(\tH\x00\x12\x11\n\x07key_iid\x18\x03 \x01(\x04H\x00\x12\x0f\n\x05value\x18\x02 \x01(\tH\x01\x12\x13\n\tvalue_iid\x18\x04 \x01(\x04H\x01\x42\x15\n\x13key_or_interned_keyB\x19\n\x17value_or_interned_value\x1a,\n\x0eInternedString\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\tB\r\n\x0brecord_type\"\xc0\x01\n\x0fTraceProvenance\x12\x38\n\x07\x62uffers\x18\x02 \x03(\x0b\x32\'.perfetto.protos.TraceProvenance.Buffer\x1a+\n\x08Sequence\x12\n\n\x02id\x18\x01 \x01(\r\x12\x13\n\x0bproducer_id\x18\x02 \x01(\x05\x1a\x46\n\x06\x42uffer\x12<\n\tsequences\x18\x01 \x03(\x0b\x32).perfetto.protos.TraceProvenance.Sequence\"\x8a\x05\n\x13TracingServiceEvent\x12\x19\n\x0ftracing_started\x18\x02 \x01(\x08H\x00\x12\"\n\x18\x61ll_data_sources_started\x18\x01 \x01(\x08H\x00\x12\x17\n\rflush_started\x18\t \x01(\x08H\x00\x12\"\n\x18\x61ll_data_sources_flushed\x18\x03 \x01(\x08H\x00\x12(\n\x1eread_tracing_buffers_completed\x18\x04 \x01(\x08H\x00\x12\x1a\n\x10tracing_disabled\x18\x05 \x01(\x08H\x00\x12\x1e\n\x14seized_for_bugreport\x18\x06 \x01(\x08H\x00\x12V\n\x1aslow_starting_data_sources\x18\x07 \x01(\x0b\x32\x30.perfetto.protos.TracingServiceEvent.DataSourcesH\x00\x12X\n\x1clast_flush_slow_data_sources\x18\x08 \x01(\x0b\x32\x30.perfetto.protos.TracingServiceEvent.DataSourcesH\x00\x12\x17\n\rclone_started\x18\n \x01(\x08H\x00\x12\x17\n\rbuffer_cloned\x18\x0b \x01(\rH\x00\x1a\x9e\x01\n\x0b\x44\x61taSources\x12P\n\x0b\x64\x61ta_source\x18\x01 \x03(\x0b\x32;.perfetto.protos.TracingServiceEvent.DataSources.DataSource\x1a=\n\nDataSource\x12\x15\n\rproducer_name\x18\x01 \x01(\t\x12\x18\n\x10\x64\x61ta_source_name\x18\x02 \x01(\tB\x0c\n\nevent_type\"`\n\x15\x41ndroidEnergyConsumer\x12\x1a\n\x12\x65nergy_consumer_id\x18\x01 \x01(\x05\x12\x0f\n\x07ordinal\x18\x02 \x01(\x05\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\"c\n\x1f\x41ndroidEnergyConsumerDescriptor\x12@\n\x10\x65nergy_consumers\x18\x01 \x03(\x0b\x32&.perfetto.protos.AndroidEnergyConsumer\"\xc0\x02\n AndroidEnergyEstimationBreakdown\x12T\n\x1a\x65nergy_consumer_descriptor\x18\x01 \x01(\x0b\x32\x30.perfetto.protos.AndroidEnergyConsumerDescriptor\x12\x1a\n\x12\x65nergy_consumer_id\x18\x02 \x01(\x05\x12\x12\n\nenergy_uws\x18\x03 \x01(\x03\x12_\n\x11per_uid_breakdown\x18\x04 \x03(\x0b\x32\x44.perfetto.protos.AndroidEnergyEstimationBreakdown.EnergyUidBreakdown\x1a\x35\n\x12\x45nergyUidBreakdown\x12\x0b\n\x03uid\x18\x01 \x01(\x05\x12\x12\n\nenergy_uws\x18\x02 \x01(\x03\"\xbb\x03\n\x14\x45ntityStateResidency\x12R\n\x12power_entity_state\x18\x01 \x03(\x0b\x32\x36.perfetto.protos.EntityStateResidency.PowerEntityState\x12G\n\tresidency\x18\x02 \x03(\x0b\x32\x34.perfetto.protos.EntityStateResidency.StateResidency\x1a\x66\n\x10PowerEntityState\x12\x14\n\x0c\x65ntity_index\x18\x01 \x01(\x05\x12\x13\n\x0bstate_index\x18\x02 \x01(\x05\x12\x13\n\x0b\x65ntity_name\x18\x03 \x01(\t\x12\x12\n\nstate_name\x18\x04 \x01(\t\x1a\x9d\x01\n\x0eStateResidency\x12\x14\n\x0c\x65ntity_index\x18\x01 \x01(\x05\x12\x13\n\x0bstate_index\x18\x02 \x01(\x05\x12\x1e\n\x16total_time_in_state_ms\x18\x03 \x01(\x04\x12\x1f\n\x17total_state_entry_count\x18\x04 \x01(\x04\x12\x1f\n\x17last_entry_timestamp_ms\x18\x05 \x01(\x04\"\xb1\x01\n\x0f\x42\x61tteryCounters\x12\x1a\n\x12\x63harge_counter_uah\x18\x01 \x01(\x03\x12\x18\n\x10\x63\x61pacity_percent\x18\x02 \x01(\x02\x12\x12\n\ncurrent_ua\x18\x03 \x01(\x03\x12\x16\n\x0e\x63urrent_avg_ua\x18\x04 \x01(\x03\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x1a\n\x12\x65nergy_counter_uwh\x18\x06 \x01(\x03\x12\x12\n\nvoltage_uv\x18\x07 \x01(\x03\"\xc7\x02\n\nPowerRails\x12\x43\n\x0frail_descriptor\x18\x01 \x03(\x0b\x32*.perfetto.protos.PowerRails.RailDescriptor\x12;\n\x0b\x65nergy_data\x18\x02 \x03(\x0b\x32&.perfetto.protos.PowerRails.EnergyData\x12\x14\n\x0csession_uuid\x18\x03 \x01(\x04\x1a^\n\x0eRailDescriptor\x12\r\n\x05index\x18\x01 \x01(\r\x12\x11\n\trail_name\x18\x02 \x01(\t\x12\x13\n\x0bsubsys_name\x18\x03 \x01(\t\x12\x15\n\rsampling_rate\x18\x04 \x01(\r\x1a\x41\n\nEnergyData\x12\r\n\x05index\x18\x01 \x01(\r\x12\x14\n\x0ctimestamp_ms\x18\x02 \x01(\x04\x12\x0e\n\x06\x65nergy\x18\x03 \x01(\x04\"J\n\tJavaFrame\x12\x13\n\x0bmethod_name\x18\x01 \x01(\t\x12\x13\n\x0bsource_file\x18\x02 \x01(\t\x12\x13\n\x0bline_number\x18\x03 \x01(\x05\"7\n\tJavaStack\x12*\n\x06\x66rames\x18\x01 \x03(\x0b\x32\x1a.perfetto.protos.JavaFrame\"\x89\x02\n\x12\x41rtProcessMetadata\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0b\n\x03uid\x18\x02 \x01(\x05\x12\x14\n\x0cprocess_name\x18\x03 \x01(\t\x12\x14\n\x0cpackage_name\x18\x04 \x01(\t\x12\x1b\n\x13oom_allocation_size\x18\x05 \x01(\x04\x12\x1c\n\x14oom_total_bytes_free\x18\x06 \x01(\x04\x12 \n\x18oom_free_bytes_until_oom\x18\x07 \x01(\x04\x12\x39\n\x15oom_thread_java_stack\x18\x08 \x01(\x0b\x32\x1a.perfetto.protos.JavaStack\x12\x15\n\room_error_msg\x18\t \x01(\t\"\xb6\x01\n\x10ObfuscatedMember\x12\x17\n\x0fobfuscated_name\x18\x01 \x01(\t\x12\x19\n\x11\x64\x65obfuscated_name\x18\x02 \x01(\t\x12\x1d\n\x15obfuscated_line_start\x18\x03 \x01(\r\x12\x1b\n\x13obfuscated_line_end\x18\x04 \x01(\r\x12\x19\n\x11source_line_start\x18\x05 \x01(\r\x12\x17\n\x0fsource_line_end\x18\x06 \x01(\r\"\xc3\x01\n\x0fObfuscatedClass\x12\x17\n\x0fobfuscated_name\x18\x01 \x01(\t\x12\x19\n\x11\x64\x65obfuscated_name\x18\x02 \x01(\t\x12=\n\x12obfuscated_members\x18\x03 \x03(\x0b\x32!.perfetto.protos.ObfuscatedMember\x12=\n\x12obfuscated_methods\x18\x04 \x03(\x0b\x32!.perfetto.protos.ObfuscatedMember\"\x80\x01\n\x14\x44\x65obfuscationMapping\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x14\n\x0cversion_code\x18\x02 \x01(\x03\x12<\n\x12obfuscated_classes\x18\x03 \x03(\x0b\x32 .perfetto.protos.ObfuscatedClass\"\xd5\x0b\n\rProfilePacket\x12\x30\n\x07strings\x18\x01 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12*\n\x08mappings\x18\x04 \x03(\x0b\x32\x18.perfetto.protos.Mapping\x12&\n\x06\x66rames\x18\x02 \x03(\x0b\x32\x16.perfetto.protos.Frame\x12.\n\ncallstacks\x18\x03 \x03(\x0b\x32\x1a.perfetto.protos.Callstack\x12H\n\rprocess_dumps\x18\x05 \x03(\x0b\x32\x31.perfetto.protos.ProfilePacket.ProcessHeapSamples\x12\x11\n\tcontinued\x18\x06 \x01(\x08\x12\r\n\x05index\x18\x07 \x01(\x04\x1a\xba\x01\n\nHeapSample\x12\x14\n\x0c\x63\x61llstack_id\x18\x01 \x01(\x04\x12\x16\n\x0eself_allocated\x18\x02 \x01(\x04\x12\x12\n\nself_freed\x18\x03 \x01(\x04\x12\x10\n\x08self_max\x18\x08 \x01(\x04\x12\x16\n\x0eself_max_count\x18\t \x01(\x04\x12\x11\n\ttimestamp\x18\x04 \x01(\x04\x12\x13\n\x0b\x61lloc_count\x18\x05 \x01(\x04\x12\x12\n\nfree_count\x18\x06 \x01(\x04J\x04\x08\x07\x10\x08\x1a\x8f\x01\n\tHistogram\x12@\n\x07\x62uckets\x18\x01 \x03(\x0b\x32/.perfetto.protos.ProfilePacket.Histogram.Bucket\x1a@\n\x06\x42ucket\x12\x13\n\x0bupper_limit\x18\x01 \x01(\x04\x12\x12\n\nmax_bucket\x18\x02 \x01(\x08\x12\r\n\x05\x63ount\x18\x03 \x01(\x04\x1a\xde\x01\n\x0cProcessStats\x12\x18\n\x10unwinding_errors\x18\x01 \x01(\x04\x12\x14\n\x0cheap_samples\x18\x02 \x01(\x04\x12\x14\n\x0cmap_reparses\x18\x03 \x01(\x04\x12\x43\n\x11unwinding_time_us\x18\x04 \x01(\x0b\x32(.perfetto.protos.ProfilePacket.Histogram\x12\x1f\n\x17total_unwinding_time_us\x18\x05 \x01(\x04\x12\"\n\x1a\x63lient_spinlock_blocked_us\x18\x06 \x01(\x04\x1a\xf1\x04\n\x12ProcessHeapSamples\x12\x0b\n\x03pid\x18\x01 \x01(\x04\x12\x14\n\x0c\x66rom_startup\x18\x03 \x01(\x08\x12\x1b\n\x13rejected_concurrent\x18\x04 \x01(\x08\x12\x14\n\x0c\x64isconnected\x18\x06 \x01(\x08\x12\x16\n\x0e\x62uffer_overran\x18\x07 \x01(\x08\x12S\n\x0c\x63lient_error\x18\x0e \x01(\x0e\x32=.perfetto.protos.ProfilePacket.ProcessHeapSamples.ClientError\x12\x18\n\x10\x62uffer_corrupted\x18\x08 \x01(\x08\x12\x15\n\rhit_guardrail\x18\n \x01(\x08\x12\x11\n\theap_name\x18\x0b \x01(\t\x12\x1f\n\x17sampling_interval_bytes\x18\x0c \x01(\x04\x12$\n\x1corig_sampling_interval_bytes\x18\r \x01(\x04\x12\x11\n\ttimestamp\x18\t \x01(\x04\x12\x17\n\x0fstart_timestamp\x18\x0f \x01(\x04\x12:\n\x05stats\x18\x05 \x01(\x0b\x32+.perfetto.protos.ProfilePacket.ProcessStats\x12:\n\x07samples\x18\x02 \x03(\x0b\x32).perfetto.protos.ProfilePacket.HeapSample\"i\n\x0b\x43lientError\x12\x15\n\x11\x43LIENT_ERROR_NONE\x10\x00\x12\x1c\n\x18\x43LIENT_ERROR_HIT_TIMEOUT\x10\x01\x12%\n!CLIENT_ERROR_INVALID_STACK_BOUNDS\x10\x02\"\x9d\x01\n\x13StreamingAllocation\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x03(\x04\x12\x0c\n\x04size\x18\x02 \x03(\x04\x12\x13\n\x0bsample_size\x18\x03 \x03(\x04\x12(\n clock_monotonic_coarse_timestamp\x18\x04 \x03(\x04\x12\x0f\n\x07heap_id\x18\x05 \x03(\r\x12\x17\n\x0fsequence_number\x18\x06 \x03(\x04\"J\n\rStreamingFree\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x03(\x04\x12\x0f\n\x07heap_id\x18\x02 \x03(\r\x12\x17\n\x0fsequence_number\x18\x03 \x03(\x04\"e\n\x16StreamingProfilePacket\x12\x15\n\rcallstack_iid\x18\x01 \x03(\x04\x12\x1a\n\x12timestamp_delta_us\x18\x02 \x03(\x03\x12\x18\n\x10process_priority\x18\x03 \x01(\x05\"\x90\x05\n\tProfiling\"|\n\x07\x43puMode\x12\x10\n\x0cMODE_UNKNOWN\x10\x00\x12\x0f\n\x0bMODE_KERNEL\x10\x01\x12\r\n\tMODE_USER\x10\x02\x12\x13\n\x0fMODE_HYPERVISOR\x10\x03\x12\x15\n\x11MODE_GUEST_KERNEL\x10\x04\x12\x13\n\x0fMODE_GUEST_USER\x10\x05\"\x84\x04\n\x10StackUnwindError\x12\x18\n\x14UNWIND_ERROR_UNKNOWN\x10\x00\x12\x15\n\x11UNWIND_ERROR_NONE\x10\x01\x12\x1f\n\x1bUNWIND_ERROR_MEMORY_INVALID\x10\x02\x12\x1c\n\x18UNWIND_ERROR_UNWIND_INFO\x10\x03\x12\x1c\n\x18UNWIND_ERROR_UNSUPPORTED\x10\x04\x12\x1c\n\x18UNWIND_ERROR_INVALID_MAP\x10\x05\x12$\n UNWIND_ERROR_MAX_FRAMES_EXCEEDED\x10\x06\x12\x1f\n\x1bUNWIND_ERROR_REPEATED_FRAME\x10\x07\x12\x1c\n\x18UNWIND_ERROR_INVALID_ELF\x10\x08\x12\x1c\n\x18UNWIND_ERROR_SYSTEM_CALL\x10\t\x12\x1f\n\x1bUNWIND_ERROR_THREAD_TIMEOUT\x10\n\x12&\n\"UNWIND_ERROR_THREAD_DOES_NOT_EXIST\x10\x0b\x12\x19\n\x15UNWIND_ERROR_BAD_ARCH\x10\x0c\x12\x1b\n\x17UNWIND_ERROR_MAPS_PARSE\x10\r\x12\"\n\x1eUNWIND_ERROR_INVALID_PARAMETER\x10\x0e\x12\x1c\n\x18UNWIND_ERROR_PTRACE_CALL\x10\x0f\"\xef\x06\n\nPerfSample\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x0b\n\x03tid\x18\x03 \x01(\r\x12\x34\n\x08\x63pu_mode\x18\x05 \x01(\x0e\x32\".perfetto.protos.Profiling.CpuMode\x12\x16\n\x0etimebase_count\x18\x06 \x01(\x04\x12\x17\n\x0f\x66ollower_counts\x18\x07 \x03(\x04\x12\x15\n\rcallstack_iid\x18\x04 \x01(\x04\x12\x43\n\x0cunwind_error\x18\x10 \x01(\x0e\x32+.perfetto.protos.Profiling.StackUnwindErrorH\x00\x12\x1b\n\x13kernel_records_lost\x18\x11 \x01(\x04\x12M\n\x15sample_skipped_reason\x18\x12 \x01(\x0e\x32,.perfetto.protos.PerfSample.SampleSkipReasonH\x01\x12\x41\n\x0eproducer_event\x18\x13 \x01(\x0b\x32).perfetto.protos.PerfSample.ProducerEvent\x1a\xdc\x01\n\rProducerEvent\x12\\\n\x12source_stop_reason\x18\x01 \x01(\x0e\x32>.perfetto.protos.PerfSample.ProducerEvent.DataSourceStopReasonH\x00\"N\n\x14\x44\x61taSourceStopReason\x12\x19\n\x15PROFILER_STOP_UNKNOWN\x10\x00\x12\x1b\n\x17PROFILER_STOP_GUARDRAIL\x10\x01\x42\x1d\n\x1boptional_source_stop_reason\"\xad\x01\n\x10SampleSkipReason\x12\x19\n\x15PROFILER_SKIP_UNKNOWN\x10\x00\x12\x1c\n\x18PROFILER_SKIP_READ_STAGE\x10\x01\x12\x1e\n\x1aPROFILER_SKIP_UNWIND_STAGE\x10\x02\x12 \n\x1cPROFILER_SKIP_UNWIND_ENQUEUE\x10\x03\x12\x1e\n\x1aPROFILER_SKIP_NOT_IN_SCOPE\x10\x04\x42\x17\n\x15optional_unwind_errorB \n\x1eoptional_sample_skipped_reason\"\xba\x01\n\x12PerfSampleDefaults\x12\x36\n\x08timebase\x18\x01 \x01(\x0b\x32$.perfetto.protos.PerfEvents.Timebase\x12\x31\n\tfollowers\x18\x04 \x03(\x0b\x32\x1e.perfetto.protos.FollowerEvent\x12\x1b\n\x13process_shard_count\x18\x02 \x01(\r\x12\x1c\n\x14\x63hosen_process_shard\x18\x03 \x01(\r\"\x83\x03\n\nSmapsEntry\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0f\n\x07size_kb\x18\x02 \x01(\x04\x12\x18\n\x10private_dirty_kb\x18\x03 \x01(\x04\x12\x0f\n\x07swap_kb\x18\x04 \x01(\x04\x12\x11\n\tfile_name\x18\x05 \x01(\t\x12\x15\n\rstart_address\x18\x06 \x01(\x04\x12\x18\n\x10module_timestamp\x18\x07 \x01(\x04\x12\x16\n\x0emodule_debugid\x18\x08 \x01(\t\x12\x19\n\x11module_debug_path\x18\t \x01(\t\x12\x18\n\x10protection_flags\x18\n \x01(\r\x12!\n\x19private_clean_resident_kb\x18\x0b \x01(\x04\x12 \n\x18shared_dirty_resident_kb\x18\x0c \x01(\x04\x12 \n\x18shared_clean_resident_kb\x18\r \x01(\x04\x12\x11\n\tlocked_kb\x18\x0e \x01(\x04\x12 \n\x18proportional_resident_kb\x18\x0f \x01(\x04\"\x81\x03\n\x0bPackedSmaps\x12\x14\n\x0cstring_table\x18\x01 \x03(\t\x12\x13\n\x07name_id\x18\x02 \x03(\rB\x02\x10\x01\x12\x1b\n\x0f\x61ggregate_count\x18\x03 \x03(\rB\x02\x10\x01\x12\x13\n\x07size_kb\x18\x04 \x03(\x04\x42\x02\x10\x01\x12\x12\n\x06rss_kb\x18\x05 \x03(\x04\x42\x02\x10\x01\x12\x18\n\x0c\x61nonymous_kb\x18\x06 \x03(\x04\x42\x02\x10\x01\x12\x13\n\x07swap_kb\x18\x07 \x03(\x04\x42\x02\x10\x01\x12\x1b\n\x0fshared_clean_kb\x18\x08 \x03(\x04\x42\x02\x10\x01\x12\x1b\n\x0fshared_dirty_kb\x18\t \x03(\x04\x42\x02\x10\x01\x12\x1c\n\x10private_clean_kb\x18\n \x03(\x04\x42\x02\x10\x01\x12\x1c\n\x10private_dirty_kb\x18\x0b \x03(\x04\x42\x02\x10\x01\x12\x15\n\tlocked_kb\x18\x0c \x03(\x04\x42\x02\x10\x01\x12\x12\n\x06pss_kb\x18\r \x03(\x04\x42\x02\x10\x01\x12\x18\n\x0cpss_dirty_kb\x18\x0e \x03(\x04\x42\x02\x10\x01\x12\x17\n\x0bswap_pss_kb\x18\x0f \x03(\x04\x42\x02\x10\x01\"\xdc\x02\n\x0bSmapsPacket\x12\x0b\n\x03pid\x18\x01 \x01(\r\x12,\n\x07\x65ntries\x18\x02 \x03(\x0b\x32\x1b.perfetto.protos.SmapsEntry\x12\x34\n\x0epacked_entries\x18\x03 \x01(\x0b\x32\x1c.perfetto.protos.PackedSmaps\x12\x42\n\x0erecording_type\x18\x04 \x01(\x0e\x32*.perfetto.protos.SmapsPacket.RecordingType\"\x97\x01\n\rRecordingType\x12\x1a\n\x16RECORDING_TYPE_UNKNOWN\x10\x00\x12\x1d\n\x19RECORDING_TYPE_STANDALONE\x10\x01\x12%\n!RECORDING_TYPE_ART_HPROF_POSTFORK\x10\x02\x12$\n RECORDING_TYPE_ART_HPROF_PREFORK\x10\x03\"\xbb\x06\n\x0cProcessStats\x12\x38\n\tprocesses\x18\x01 \x03(\x0b\x32%.perfetto.protos.ProcessStats.Process\x12 \n\x18\x63ollection_end_timestamp\x18\x02 \x01(\x04\x1a\'\n\x06Thread\x12\x0b\n\x03tid\x18\x01 \x01(\x05J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05\x1a\"\n\x06\x46\x44Info\x12\n\n\x02\x66\x64\x18\x01 \x01(\x04\x12\x0c\n\x04path\x18\x02 \x01(\t\x1a\x81\x05\n\x07Process\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x35\n\x07threads\x18\x0b \x03(\x0b\x32$.perfetto.protos.ProcessStats.Thread\x12\x12\n\nvm_size_kb\x18\x02 \x01(\x04\x12\x11\n\tvm_rss_kb\x18\x03 \x01(\x04\x12\x13\n\x0brss_anon_kb\x18\x04 \x01(\x04\x12\x13\n\x0brss_file_kb\x18\x05 \x01(\x04\x12\x14\n\x0crss_shmem_kb\x18\x06 \x01(\x04\x12\x12\n\nvm_swap_kb\x18\x07 \x01(\x04\x12\x14\n\x0cvm_locked_kb\x18\x08 \x01(\x04\x12\x11\n\tvm_hwm_kb\x18\t \x01(\x04\x12\x15\n\room_score_adj\x18\n \x01(\x03\x12\x1e\n\x16is_peak_rss_resettable\x18\x0c \x01(\x08\x12#\n\x1b\x63hrome_private_footprint_kb\x18\r \x01(\r\x12#\n\x1b\x63hrome_peak_resident_set_kb\x18\x0e \x01(\r\x12\x31\n\x03\x66\x64s\x18\x0f \x03(\x0b\x32$.perfetto.protos.ProcessStats.FDInfo\x12\x12\n\nsmr_rss_kb\x18\x10 \x01(\x04\x12\x12\n\nsmr_pss_kb\x18\x11 \x01(\x04\x12\x17\n\x0fsmr_pss_anon_kb\x18\x12 \x01(\x04\x12\x17\n\x0fsmr_pss_file_kb\x18\x13 \x01(\x04\x12\x18\n\x10smr_pss_shmem_kb\x18\x14 \x01(\x04\x12\x17\n\x0fsmr_swap_pss_kb\x18\x17 \x01(\x04\x12\x19\n\x11runtime_user_mode\x18\x15 \x01(\x04\x12\x1b\n\x13runtime_kernel_mode\x18\x16 \x01(\x04\x12\x15\n\rdmabuf_rss_kb\x18\x18 \x01(\x04\"\x88\x03\n\x0bProcessTree\x12\x37\n\tprocesses\x18\x01 \x03(\x0b\x32$.perfetto.protos.ProcessTree.Process\x12\x34\n\x07threads\x18\x02 \x03(\x0b\x32#.perfetto.protos.ProcessTree.Thread\x12 \n\x18\x63ollection_end_timestamp\x18\x03 \x01(\x04\x1a@\n\x06Thread\x12\x0b\n\x03tid\x18\x01 \x01(\x05\x12\x0c\n\x04tgid\x18\x03 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05nstid\x18\x04 \x03(\x05\x1a\xa5\x01\n\x07Process\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0c\n\x04ppid\x18\x02 \x01(\x05\x12\x0f\n\x07\x63mdline\x18\x03 \x03(\t\x12\x17\n\x0f\x63mdline_is_comm\x18\t \x01(\x08\x12\x0b\n\x03uid\x18\x05 \x01(\x05\x12\r\n\x05nspid\x18\x06 \x03(\x05\x12\x1f\n\x17process_start_from_boot\x18\x07 \x01(\x04\x12\x12\n\nis_kthread\x18\x08 \x01(\x08J\x04\x08\x04\x10\x05\"\xd3\x01\n\x0fRemoteClockSync\x12\x44\n\rsynced_clocks\x18\x01 \x03(\x0b\x32-.perfetto.protos.RemoteClockSync.SyncedClocks\x1az\n\x0cSyncedClocks\x12\x35\n\rclient_clocks\x18\x02 \x01(\x0b\x32\x1e.perfetto.protos.ClockSnapshot\x12\x33\n\x0bhost_clocks\x18\x03 \x01(\x0b\x32\x1e.perfetto.protos.ClockSnapshot\"\x06\n\x04\x41tom\"J\n\nStatsdAtom\x12#\n\x04\x61tom\x18\x01 \x03(\x0b\x32\x15.perfetto.protos.Atom\x12\x17\n\x0ftimestamp_nanos\x18\x02 \x03(\x03\"\xe4\x10\n\x08SysStats\x12\x37\n\x07meminfo\x18\x01 \x03(\x0b\x32&.perfetto.protos.SysStats.MeminfoValue\x12\x35\n\x06vmstat\x18\x02 \x03(\x0b\x32%.perfetto.protos.SysStats.VmstatValue\x12\x34\n\x08\x63pu_stat\x18\x03 \x03(\x0b\x32\".perfetto.protos.SysStats.CpuTimes\x12\x11\n\tnum_forks\x18\x04 \x01(\x04\x12\x15\n\rnum_irq_total\x18\x05 \x01(\x04\x12\x39\n\x07num_irq\x18\x06 \x03(\x0b\x32(.perfetto.protos.SysStats.InterruptCount\x12\x19\n\x11num_softirq_total\x18\x07 \x01(\x04\x12=\n\x0bnum_softirq\x18\x08 \x03(\x0b\x32(.perfetto.protos.SysStats.InterruptCount\x12 \n\x18\x63ollection_end_timestamp\x18\t \x01(\x04\x12\x37\n\x07\x64\x65vfreq\x18\n \x03(\x0b\x32&.perfetto.protos.SysStats.DevfreqValue\x12\x13\n\x0b\x63pufreq_khz\x18\x0b \x03(\r\x12\x37\n\nbuddy_info\x18\x0c \x03(\x0b\x32#.perfetto.protos.SysStats.BuddyInfo\x12\x35\n\tdisk_stat\x18\r \x03(\x0b\x32\".perfetto.protos.SysStats.DiskStat\x12\x30\n\x03psi\x18\x0e \x03(\x0b\x32#.perfetto.protos.SysStats.PsiSample\x12;\n\x0cthermal_zone\x18\x0f \x03(\x0b\x32%.perfetto.protos.SysStats.ThermalZone\x12=\n\rcpuidle_state\x18\x10 \x03(\x0b\x32&.perfetto.protos.SysStats.CpuIdleState\x12\x13\n\x0bgpufreq_mhz\x18\x11 \x03(\x04\x12\x35\n\tslab_info\x18\x12 \x03(\x0b\x32\".perfetto.protos.SysStats.SlabInfo\x1aL\n\x0cMeminfoValue\x12-\n\x03key\x18\x01 \x01(\x0e\x32 .perfetto.protos.MeminfoCounters\x12\r\n\x05value\x18\x02 \x01(\x04\x1aJ\n\x0bVmstatValue\x12,\n\x03key\x18\x01 \x01(\x0e\x32\x1f.perfetto.protos.VmstatCounters\x12\r\n\x05value\x18\x02 \x01(\x04\x1a\xb4\x01\n\x08\x43puTimes\x12\x0e\n\x06\x63pu_id\x18\x01 \x01(\r\x12\x0f\n\x07user_ns\x18\x02 \x01(\x04\x12\x14\n\x0cuser_nice_ns\x18\x03 \x01(\x04\x12\x16\n\x0esystem_mode_ns\x18\x04 \x01(\x04\x12\x0f\n\x07idle_ns\x18\x05 \x01(\x04\x12\x12\n\nio_wait_ns\x18\x06 \x01(\x04\x12\x0e\n\x06irq_ns\x18\x07 \x01(\x04\x12\x12\n\nsoftirq_ns\x18\x08 \x01(\x04\x12\x10\n\x08steal_ns\x18\t \x01(\x04\x1a,\n\x0eInterruptCount\x12\x0b\n\x03irq\x18\x01 \x01(\x05\x12\r\n\x05\x63ount\x18\x02 \x01(\x04\x1a*\n\x0c\x44\x65vfreqValue\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04\x1a<\n\tBuddyInfo\x12\x0c\n\x04node\x18\x01 \x01(\t\x12\x0c\n\x04zone\x18\x02 \x01(\t\x12\x13\n\x0border_pages\x18\x03 \x03(\r\x1a\xd7\x01\n\x08\x44iskStat\x12\x13\n\x0b\x64\x65vice_name\x18\x01 \x01(\t\x12\x14\n\x0cread_sectors\x18\x02 \x01(\x04\x12\x14\n\x0cread_time_ms\x18\x03 \x01(\x04\x12\x15\n\rwrite_sectors\x18\x04 \x01(\x04\x12\x15\n\rwrite_time_ms\x18\x05 \x01(\x04\x12\x17\n\x0f\x64iscard_sectors\x18\x06 \x01(\x04\x12\x17\n\x0f\x64iscard_time_ms\x18\x07 \x01(\x04\x12\x13\n\x0b\x66lush_count\x18\x08 \x01(\x04\x12\x15\n\rflush_time_ms\x18\t \x01(\x04\x1a\xb4\x02\n\tPsiSample\x12\x41\n\x08resource\x18\x01 \x01(\x0e\x32/.perfetto.protos.SysStats.PsiSample.PsiResource\x12\x10\n\x08total_ns\x18\x02 \x01(\x04\"\xd1\x01\n\x0bPsiResource\x12\x1c\n\x18PSI_RESOURCE_UNSPECIFIED\x10\x00\x12\x19\n\x15PSI_RESOURCE_CPU_SOME\x10\x01\x12\x19\n\x15PSI_RESOURCE_CPU_FULL\x10\x02\x12\x18\n\x14PSI_RESOURCE_IO_SOME\x10\x03\x12\x18\n\x14PSI_RESOURCE_IO_FULL\x10\x04\x12\x1c\n\x18PSI_RESOURCE_MEMORY_SOME\x10\x05\x12\x1c\n\x18PSI_RESOURCE_MEMORY_FULL\x10\x06\x1a\x37\n\x0bThermalZone\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04temp\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\t\x1a\x37\n\x11\x43puIdleStateEntry\x12\r\n\x05state\x18\x01 \x01(\t\x12\x13\n\x0b\x64uration_us\x18\x02 \x01(\x04\x1ah\n\x0c\x43puIdleState\x12\x0e\n\x06\x63pu_id\x18\x01 \x01(\r\x12H\n\x13\x63puidle_state_entry\x18\x02 \x03(\x0b\x32+.perfetto.protos.SysStats.CpuIdleStateEntry\x1a\x43\n\x08SlabInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0epages_per_slab\x18\x02 \x01(\r\x12\x11\n\tnum_slabs\x18\x03 \x01(\r\"\xcc\x02\n\x07\x43puInfo\x12*\n\x04\x63pus\x18\x01 \x03(\x0b\x32\x1c.perfetto.protos.CpuInfo.Cpu\x1an\n\x10\x41rmCpuIdentifier\x12\x13\n\x0bimplementer\x18\x01 \x01(\r\x12\x14\n\x0c\x61rchitecture\x18\x02 \x01(\r\x12\x0f\n\x07variant\x18\x03 \x01(\r\x12\x0c\n\x04part\x18\x04 \x01(\r\x12\x10\n\x08revision\x18\x05 \x01(\r\x1a\xa4\x01\n\x03\x43pu\x12\x11\n\tprocessor\x18\x01 \x01(\t\x12\x13\n\x0b\x66requencies\x18\x02 \x03(\r\x12\x10\n\x08\x63\x61pacity\x18\x03 \x01(\r\x12\x43\n\x0e\x61rm_identifier\x18\x04 \x01(\x0b\x32).perfetto.protos.CpuInfo.ArmCpuIdentifierH\x00\x12\x10\n\x08\x66\x65\x61tures\x18\x05 \x01(\x04\x42\x0c\n\nidentifier\"\x82\x02\n\x07GpuInfo\x12*\n\x04gpus\x18\x01 \x03(\x0b\x32\x1c.perfetto.protos.GpuInfo.Gpu\x1a\xca\x01\n\x03Gpu\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\r\n\x05model\x18\x03 \x01(\t\x12\x14\n\x0c\x61rchitecture\x18\x04 \x01(\t\x12\x0c\n\x04uuid\x18\x05 \x01(\x0c\x12\x0f\n\x07pci_bdf\x18\x07 \x01(\t\x12\x39\n\nextra_info\x18\x06 \x03(\x0b\x32%.perfetto.protos.GpuInfo.Gpu.KeyValue\x1a&\n\x08KeyValue\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x87\x01\n\rInterruptInfo\x12\x44\n\x0birq_mapping\x18\x01 \x03(\x0b\x32/.perfetto.protos.InterruptInfo.InterruptMapping\x1a\x30\n\x10InterruptMapping\x12\x0e\n\x06irq_id\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\"\xce\x08\n\tTestEvent\x12\x0b\n\x03str\x18\x01 \x01(\t\x12\x11\n\tseq_value\x18\x02 \x01(\r\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x04\x12\x0f\n\x07is_last\x18\x04 \x01(\x08\x12\x37\n\x07payload\x18\x05 \x01(\x0b\x32&.perfetto.protos.TestEvent.TestPayload\x12>\n\rprotovm_patch\x18\x06 \x01(\x0b\x32\'.perfetto.protos.TestEvent.ProtoVmPatch\x12U\n\x19protovm_incremental_state\x18\x07 \x01(\x0b\x32\x32.perfetto.protos.TestEvent.ProtoVmIncrementalState\x1a\xf2\x01\n\x0bTestPayload\x12\x0b\n\x03str\x18\x01 \x03(\t\x12\x36\n\x06nested\x18\x02 \x03(\x0b\x32&.perfetto.protos.TestEvent.TestPayload\x12\x15\n\rsingle_string\x18\x04 \x01(\t\x12\x12\n\nsingle_int\x18\x05 \x01(\x05\x12\x15\n\rrepeated_ints\x18\x06 \x03(\x05\x12\x1f\n\x17remaining_nesting_depth\x18\x03 \x01(\r\x12;\n\x11\x64\x65\x62ug_annotations\x18\x07 \x03(\x0b\x32 .perfetto.protos.DebugAnnotation\x1a\x96\x01\n\x0eProtoVmMessage\x12\n\n\x02id\x18\x01 \x01(\r\x12O\n\nsubmessage\x18\x02 \x01(\x0b\x32;.perfetto.protos.TestEvent.ProtoVmMessage.ProtoVmSubmessage\x1a\'\n\x11ProtoVmSubmessage\x12\x12\n\nsingle_int\x18\x01 \x01(\r\x1a\xd9\x01\n\x0cProtoVmPatch\x12\x17\n\x0fstring_to_merge\x18\x01 \x01(\t\x12\x14\n\x0cint_to_merge\x18\x02 \x01(\x05\x12\x41\n\x0esingle_message\x18\x03 \x01(\x0b\x32).perfetto.protos.TestEvent.ProtoVmMessage\x12;\n\x08messages\x18\x04 \x03(\x0b\x32).perfetto.protos.TestEvent.ProtoVmMessage\x12\x1a\n\x12\x64\x65lete_message_ids\x18\x05 \x03(\r\x1a\xc4\x01\n\x17ProtoVmIncrementalState\x12\x15\n\rstring_merged\x18\x01 \x01(\t\x12\x12\n\nint_merged\x18\x02 \x01(\x05\x12\x41\n\x0esingle_message\x18\x03 \x01(\x0b\x32).perfetto.protos.TestEvent.ProtoVmMessage\x12;\n\x08messages\x18\x04 \x03(\x0b\x32).perfetto.protos.TestEvent.ProtoVmMessage\"\xb7\x02\n\x13TracePacketDefaults\x12\x1a\n\x12timestamp_clock_id\x18: \x01(\r\x12\x41\n\x14track_event_defaults\x18\x0b \x01(\x0b\x32#.perfetto.protos.TrackEventDefaults\x12\x41\n\x14perf_sample_defaults\x18\x0c \x01(\x0b\x32#.perfetto.protos.PerfSampleDefaults\x12\x43\n\x15stack_sample_defaults\x18\x64 \x01(\x0b\x32$.perfetto.protos.StackSampleDefaults\x12\x39\n\x10v8_code_defaults\x18\x63 \x01(\x0b\x32\x1f.perfetto.protos.V8CodeDefaults\"%\n\tTraceUuid\x12\x0b\n\x03msb\x18\x01 \x01(\x03\x12\x0b\n\x03lsb\x18\x02 \x01(\x03\"\xe7\x03\n\x11ProcessDescriptor\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0f\n\x07\x63mdline\x18\x02 \x03(\t\x12\x14\n\x0cprocess_name\x18\x06 \x01(\t\x12\x18\n\x10process_priority\x18\x05 \x01(\x05\x12\x1a\n\x12start_timestamp_ns\x18\x07 \x01(\x03\x12Q\n\x13\x63hrome_process_type\x18\x04 \x01(\x0e\x32\x34.perfetto.protos.ProcessDescriptor.ChromeProcessType\x12\x19\n\x11legacy_sort_index\x18\x03 \x01(\x05\x12\x16\n\x0eprocess_labels\x18\x08 \x03(\t\"\xe1\x01\n\x11\x43hromeProcessType\x12\x17\n\x13PROCESS_UNSPECIFIED\x10\x00\x12\x13\n\x0fPROCESS_BROWSER\x10\x01\x12\x14\n\x10PROCESS_RENDERER\x10\x02\x12\x13\n\x0fPROCESS_UTILITY\x10\x03\x12\x12\n\x0ePROCESS_ZYGOTE\x10\x04\x12\x1a\n\x16PROCESS_SANDBOX_HELPER\x10\x05\x12\x0f\n\x0bPROCESS_GPU\x10\x06\x12\x18\n\x14PROCESS_PPAPI_PLUGIN\x10\x07\x12\x18\n\x14PROCESS_PPAPI_BROKER\x10\x08\"-\n\x19TrackEventRangeOfInterest\x12\x10\n\x08start_us\x18\x01 \x01(\x03\"\xf4\x05\n\x10ThreadDescriptor\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0b\n\x03tid\x18\x02 \x01(\x03\x12\x13\n\x0bthread_name\x18\x05 \x01(\t\x12N\n\x12\x63hrome_thread_type\x18\x04 \x01(\x0e\x32\x32.perfetto.protos.ThreadDescriptor.ChromeThreadType\x12\x1e\n\x16reference_timestamp_us\x18\x06 \x01(\x03\x12 \n\x18reference_thread_time_us\x18\x07 \x01(\x03\x12*\n\"reference_thread_instruction_count\x18\x08 \x01(\x03\x12\x19\n\x11legacy_sort_index\x18\x03 \x01(\x05\"\xd7\x03\n\x10\x43hromeThreadType\x12\x1d\n\x19\x43HROME_THREAD_UNSPECIFIED\x10\x00\x12\x16\n\x12\x43HROME_THREAD_MAIN\x10\x01\x12\x14\n\x10\x43HROME_THREAD_IO\x10\x02\x12 \n\x1c\x43HROME_THREAD_POOL_BG_WORKER\x10\x03\x12 \n\x1c\x43HROME_THREAD_POOL_FG_WORKER\x10\x04\x12\"\n\x1e\x43HROME_THREAD_POOL_FB_BLOCKING\x10\x05\x12\"\n\x1e\x43HROME_THREAD_POOL_BG_BLOCKING\x10\x06\x12\x1e\n\x1a\x43HROME_THREAD_POOL_SERVICE\x10\x07\x12\x1c\n\x18\x43HROME_THREAD_COMPOSITOR\x10\x08\x12 \n\x1c\x43HROME_THREAD_VIZ_COMPOSITOR\x10\t\x12#\n\x1f\x43HROME_THREAD_COMPOSITOR_WORKER\x10\n\x12 \n\x1c\x43HROME_THREAD_SERVICE_WORKER\x10\x0b\x12\x1e\n\x1a\x43HROME_THREAD_MEMORY_INFRA\x10\x32\x12#\n\x1f\x43HROME_THREAD_SAMPLING_PROFILER\x10\x33\"\x9b\x01\n\x17\x43hromeProcessDescriptor\x12\x14\n\x0cprocess_type\x18\x01 \x01(\x05\x12\x18\n\x10process_priority\x18\x02 \x01(\x05\x12\x19\n\x11legacy_sort_index\x18\x03 \x01(\x05\x12\x1d\n\x15host_app_package_name\x18\x04 \x01(\t\x12\x16\n\x0e\x63rash_trace_id\x18\x05 \x01(\x04\"b\n\x16\x43hromeThreadDescriptor\x12\x13\n\x0bthread_type\x18\x01 \x01(\x05\x12\x19\n\x11legacy_sort_index\x18\x02 \x01(\x05\x12\x18\n\x10is_sandboxed_tid\x18\x03 \x01(\x08\"\xc7\x03\n\x11\x43ounterDescriptor\x12\x43\n\x04type\x18\x01 \x01(\x0e\x32\x35.perfetto.protos.CounterDescriptor.BuiltinCounterType\x12\x12\n\ncategories\x18\x02 \x03(\t\x12\x35\n\x04unit\x18\x03 \x01(\x0e\x32\'.perfetto.protos.CounterDescriptor.Unit\x12\x11\n\tunit_name\x18\x06 \x01(\t\x12\x17\n\x0funit_multiplier\x18\x04 \x01(\x03\x12\x16\n\x0eis_incremental\x18\x05 \x01(\x08\x12\x18\n\x10y_axis_share_key\x18\x07 \x01(\t\"o\n\x12\x42uiltinCounterType\x12\x17\n\x13\x43OUNTER_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43OUNTER_THREAD_TIME_NS\x10\x01\x12$\n COUNTER_THREAD_INSTRUCTION_COUNT\x10\x02\"S\n\x04Unit\x12\x14\n\x10UNIT_UNSPECIFIED\x10\x00\x12\x10\n\x0cUNIT_TIME_NS\x10\x01\x12\x0e\n\nUNIT_COUNT\x10\x02\x12\x13\n\x0fUNIT_SIZE_BYTES\x10\x03\"\x11\n\x0fStateDescriptor\"\x88\x0b\n\x0fTrackDescriptor\x12\x0c\n\x04uuid\x18\x01 \x01(\x04\x12\x13\n\x0bparent_uuid\x18\x05 \x01(\x04\x12\x0e\n\x04name\x18\x02 \x01(\tH\x00\x12\x15\n\x0bstatic_name\x18\n \x01(\tH\x00\x12\x15\n\x0b\x61trace_name\x18\r \x01(\tH\x00\x12\x13\n\x0b\x64\x65scription\x18\x0e \x01(\t\x12\x33\n\x07process\x18\x03 \x01(\x0b\x32\".perfetto.protos.ProcessDescriptor\x12@\n\x0e\x63hrome_process\x18\x06 \x01(\x0b\x32(.perfetto.protos.ChromeProcessDescriptor\x12\x31\n\x06thread\x18\x04 \x01(\x0b\x32!.perfetto.protos.ThreadDescriptor\x12>\n\rchrome_thread\x18\x07 \x01(\x0b\x32\'.perfetto.protos.ChromeThreadDescriptor\x12\x33\n\x07\x63ounter\x18\x08 \x01(\x0b\x32\".perfetto.protos.CounterDescriptor\x12/\n\x05state\x18\x12 \x01(\x0b\x32 .perfetto.protos.StateDescriptor\x12+\n#disallow_merging_with_system_tracks\x18\t \x01(\x08\x12L\n\x0e\x63hild_ordering\x18\x0b \x01(\x0e\x32\x34.perfetto.protos.TrackDescriptor.ChildTracksOrdering\x12\x1a\n\x12sibling_order_rank\x18\x0c \x01(\x05\x12U\n\x16sibling_merge_behavior\x18\x0f \x01(\x0e\x32\x35.perfetto.protos.TrackDescriptor.SiblingMergeBehavior\x12\x1b\n\x11sibling_merge_key\x18\x10 \x01(\tH\x01\x12\x1f\n\x15sibling_merge_key_int\x18\x11 \x01(\x04H\x01\x12J\n\x10process_ordering\x18\x13 \x01(\x0e\x32\x30.perfetto.protos.TrackDescriptor.ProcessOrdering\x12H\n\x0fthread_ordering\x18\x14 \x01(\x0e\x32/.perfetto.protos.TrackDescriptor.ThreadOrdering\"V\n\x13\x43hildTracksOrdering\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x11\n\rLEXICOGRAPHIC\x10\x01\x12\x11\n\rCHRONOLOGICAL\x10\x02\x12\x0c\n\x08\x45XPLICIT\x10\x03\"\xba\x01\n\x14SiblingMergeBehavior\x12&\n\"SIBLING_MERGE_BEHAVIOR_UNSPECIFIED\x10\x00\x12(\n$SIBLING_MERGE_BEHAVIOR_BY_TRACK_NAME\x10\x01\x12\x1f\n\x1bSIBLING_MERGE_BEHAVIOR_NONE\x10\x02\x12/\n+SIBLING_MERGE_BEHAVIOR_BY_SIBLING_MERGE_KEY\x10\x03\"R\n\x0fProcessOrdering\x12 \n\x1cPROCESS_ORDERING_UNSPECIFIED\x10\x00\x12\x1d\n\x19PROCESS_ORDERING_EXPLICIT\x10\x01\"O\n\x0eThreadOrdering\x12\x1f\n\x1bTHREAD_ORDERING_UNSPECIFIED\x10\x00\x12\x1c\n\x18THREAD_ORDERING_EXPLICIT\x10\x01\x42\x18\n\x16static_or_dynamic_nameB\x19\n\x17sibling_merge_key_field\"\xed\x03\n\x10TranslationTable\x12M\n\x10\x63hrome_histogram\x18\x01 \x01(\x0b\x32\x31.perfetto.protos.ChromeHistorgramTranslationTableH\x00\x12M\n\x11\x63hrome_user_event\x18\x02 \x01(\x0b\x32\x30.perfetto.protos.ChromeUserEventTranslationTableH\x00\x12Y\n\x17\x63hrome_performance_mark\x18\x03 \x01(\x0b\x32\x36.perfetto.protos.ChromePerformanceMarkTranslationTableH\x00\x12@\n\nslice_name\x18\x04 \x01(\x0b\x32*.perfetto.protos.SliceNameTranslationTableH\x00\x12O\n\x12process_track_name\x18\x05 \x01(\x0b\x32\x31.perfetto.protos.ProcessTrackNameTranslationTableH\x00\x12\x44\n\x0c\x63hrome_study\x18\x06 \x01(\x0b\x32,.perfetto.protos.ChromeStudyTranslationTableH\x00\x42\x07\n\x05table\"\xae\x01\n ChromeHistorgramTranslationTable\x12W\n\x0chash_to_name\x18\x01 \x03(\x0b\x32\x41.perfetto.protos.ChromeHistorgramTranslationTable.HashToNameEntry\x1a\x31\n\x0fHashToNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbf\x01\n\x1f\x43hromeUserEventTranslationTable\x12\x63\n\x13\x61\x63tion_hash_to_name\x18\x01 \x03(\x0b\x32\x46.perfetto.protos.ChromeUserEventTranslationTable.ActionHashToNameEntry\x1a\x37\n\x15\x41\x63tionHashToNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xe3\x02\n%ChromePerformanceMarkTranslationTable\x12\x65\n\x11site_hash_to_name\x18\x01 \x03(\x0b\x32J.perfetto.protos.ChromePerformanceMarkTranslationTable.SiteHashToNameEntry\x12\x65\n\x11mark_hash_to_name\x18\x02 \x03(\x0b\x32J.perfetto.protos.ChromePerformanceMarkTranslationTable.MarkHashToNameEntry\x1a\x35\n\x13SiteHashToNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x35\n\x13MarkHashToNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xc2\x01\n\x19SliceNameTranslationTable\x12g\n\x18raw_to_deobfuscated_name\x18\x01 \x03(\x0b\x32\x45.perfetto.protos.SliceNameTranslationTable.RawToDeobfuscatedNameEntry\x1a<\n\x1aRawToDeobfuscatedNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xd0\x01\n ProcessTrackNameTranslationTable\x12n\n\x18raw_to_deobfuscated_name\x18\x01 \x03(\x0b\x32L.perfetto.protos.ProcessTrackNameTranslationTable.RawToDeobfuscatedNameEntry\x1a<\n\x1aRawToDeobfuscatedNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xa4\x01\n\x1b\x43hromeStudyTranslationTable\x12R\n\x0chash_to_name\x18\x01 \x03(\x0b\x32<.perfetto.protos.ChromeStudyTranslationTable.HashToNameEntry\x1a\x31\n\x0fHashToNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"k\n\x07Trigger\x12\x14\n\x0ctrigger_name\x18\x01 \x01(\t\x12\x15\n\rproducer_name\x18\x02 \x01(\t\x12\x1c\n\x14trusted_producer_uid\x18\x03 \x01(\x05\x12\x15\n\rstop_delay_ms\x18\x04 \x01(\x04\"\xc5\x01\n\x07UiState\x12\x19\n\x11timeline_start_ts\x18\x01 \x01(\x03\x12\x17\n\x0ftimeline_end_ts\x18\x02 \x01(\x03\x12\x44\n\x11highlight_process\x18\x03 \x01(\x0b\x32).perfetto.protos.UiState.HighlightProcess\x1a@\n\x10HighlightProcess\x12\r\n\x03pid\x18\x01 \x01(\rH\x00\x12\x11\n\x07\x63mdline\x18\x02 \x01(\tH\x00\x42\n\n\x08selector\"\xed\x32\n\x0bTracePacket\x12\x11\n\ttimestamp\x18\x08 \x01(\x04\x12\x1a\n\x12timestamp_clock_id\x18: \x01(\r\x12\x32\n\x0btrack_event\x18\x0b \x01(\x0b\x32\x1b.perfetto.protos.TrackEventH\x00\x12<\n\x10track_descriptor\x18< \x01(\x0b\x32 .perfetto.protos.TrackDescriptorH\x00\x12W\n\x1fgeneric_kernel_task_state_event\x18u \x01(\x0b\x32,.perfetto.protos.GenericKernelTaskStateEventH\x00\x12X\n\x1dgeneric_kernel_cpu_freq_event\x18v \x01(\x0b\x32/.perfetto.protos.GenericKernelCpuFrequencyEventH\x00\x12Y\n generic_kernel_task_rename_event\x18x \x01(\x0b\x32-.perfetto.protos.GenericKernelTaskRenameEventH\x00\x12P\n\x1bgeneric_kernel_process_tree\x18z \x01(\x0b\x32).perfetto.protos.GenericKernelProcessTreeH\x00\x12Q\n\x1bgeneric_gpu_frequency_event\x18\x81\x01 \x01(\x0b\x32).perfetto.protos.GenericGpuFrequencyEventH\x00\x12\x34\n\x0cprocess_tree\x18\x02 \x01(\x0b\x32\x1c.perfetto.protos.ProcessTreeH\x00\x12S\n\x1dtrack_event_range_of_interest\x18Z \x01(\x0b\x32*.perfetto.protos.TrackEventRangeOfInterestH\x00\x12\x36\n\rprocess_stats\x18\t \x01(\x0b\x32\x1d.perfetto.protos.ProcessStatsH\x00\x12\x37\n\x0einode_file_map\x18\x04 \x01(\x0b\x32\x1d.perfetto.protos.InodeFileMapH\x00\x12;\n\rchrome_events\x18\x05 \x01(\x0b\x32\".perfetto.protos.ChromeEventBundleH\x00\x12\x38\n\x0e\x63lock_snapshot\x18\x06 \x01(\x0b\x32\x1e.perfetto.protos.ClockSnapshotH\x00\x12.\n\tsys_stats\x18\x07 \x01(\x0b\x32\x19.perfetto.protos.SysStatsH\x00\x12\x30\n\ntrace_uuid\x18Y \x01(\x0b\x32\x1a.perfetto.protos.TraceUuidH\x00\x12\x34\n\x0ctrace_config\x18! \x01(\x0b\x32\x1c.perfetto.protos.TraceConfigH\x00\x12\x34\n\x0c\x66trace_stats\x18\" \x01(\x0b\x32\x1c.perfetto.protos.FtraceStatsH\x00\x12\x32\n\x0btrace_stats\x18# \x01(\x0b\x32\x1b.perfetto.protos.TraceStatsH\x00\x12\x38\n\x0eprofile_packet\x18% \x01(\x0b\x32\x1e.perfetto.protos.ProfilePacketH\x00\x12\x44\n\x14streaming_allocation\x18J \x01(\x0b\x32$.perfetto.protos.StreamingAllocationH\x00\x12\x38\n\x0estreaming_free\x18K \x01(\x0b\x32\x1e.perfetto.protos.StreamingFreeH\x00\x12\x33\n\x07\x62\x61ttery\x18& \x01(\x0b\x32 .perfetto.protos.BatteryCountersH\x00\x12\x32\n\x0bpower_rails\x18( \x01(\x0b\x32\x1b.perfetto.protos.PowerRailsH\x00\x12\x38\n\x0b\x61ndroid_log\x18\' \x01(\x0b\x32!.perfetto.protos.AndroidLogPacketH\x00\x12\x32\n\x0bsystem_info\x18- \x01(\x0b\x32\x1b.perfetto.protos.SystemInfoH\x00\x12+\n\x07trigger\x18. \x01(\x0b\x32\x18.perfetto.protos.TriggerH\x00\x12\x38\n\x0e\x63hrome_trigger\x18m \x01(\x0b\x32\x1e.perfetto.protos.ChromeTriggerH\x00\x12\x36\n\rpackages_list\x18/ \x01(\x0b\x32\x1d.perfetto.protos.PackagesListH\x00\x12M\n\x19\x63hrome_benchmark_metadata\x18\x30 \x01(\x0b\x32(.perfetto.protos.ChromeBenchmarkMetadataH\x00\x12@\n\x12perfetto_metatrace\x18\x31 \x01(\x0b\x32\".perfetto.protos.PerfettoMetatraceH\x00\x12@\n\x0f\x63hrome_metadata\x18\x33 \x01(\x0b\x32%.perfetto.protos.ChromeMetadataPacketH\x00\x12=\n\x11gpu_counter_event\x18\x34 \x01(\x0b\x32 .perfetto.protos.GpuCounterEventH\x00\x12\x46\n\x16gpu_render_stage_event\x18\x35 \x01(\x0b\x32$.perfetto.protos.GpuRenderStageEventH\x00\x12K\n\x18streaming_profile_packet\x18\x36 \x01(\x0b\x32\'.perfetto.protos.StreamingProfilePacketH\x00\x12\x44\n\x14\x61rt_process_metadata\x18\x83\x01 \x01(\x0b\x32#.perfetto.protos.ArtProcessMetadataH\x00\x12\x43\n\x14graphics_frame_event\x18\x39 \x01(\x0b\x32#.perfetto.protos.GraphicsFrameEventH\x00\x12\x41\n\x13vulkan_memory_event\x18> \x01(\x0b\x32\".perfetto.protos.VulkanMemoryEventH\x00\x12*\n\x07gpu_log\x18? \x01(\x0b\x32\x17.perfetto.protos.GpuLogH\x00\x12;\n\x10vulkan_api_event\x18\x41 \x01(\x0b\x32\x1f.perfetto.protos.VulkanApiEventH\x00\x12\x32\n\x0bperf_sample\x18\x42 \x01(\x0b\x32\x1b.perfetto.protos.PerfSampleH\x00\x12,\n\x08\x63pu_info\x18\x43 \x01(\x0b\x32\x18.perfetto.protos.CpuInfoH\x00\x12\x34\n\x0csmaps_packet\x18\x44 \x01(\x0b\x32\x1c.perfetto.protos.SmapsPacketH\x00\x12=\n\rservice_event\x18\x45 \x01(\x0b\x32$.perfetto.protos.TracingServiceEventH\x00\x12L\n\x18\x63oncurrent_session_event\x18\x86\x01 \x01(\x0b\x32\'.perfetto.protos.ConcurrentSessionEventH\x00\x12\x35\n\x0cstack_sample\x18\x87\x01 \x01(\x0b\x32\x1c.perfetto.protos.StackSampleH\x00\x12\x45\n\x15initial_display_state\x18\x46 \x01(\x0b\x32$.perfetto.protos.InitialDisplayStateH\x00\x12@\n\x13gpu_mem_total_event\x18G \x01(\x0b\x32!.perfetto.protos.GpuMemTotalEventH\x00\x12I\n\x17memory_tracker_snapshot\x18I \x01(\x0b\x32&.perfetto.protos.MemoryTrackerSnapshotH\x00\x12`\n#android_energy_estimation_breakdown\x18M \x01(\x0b\x32\x31.perfetto.protos.AndroidEnergyEstimationBreakdownH\x00\x12,\n\x08ui_state\x18N \x01(\x0b\x32\x18.perfetto.protos.UiStateH\x00\x12>\n\x11translation_table\x18R \x01(\x0b\x32!.perfetto.protos.TranslationTableH\x00\x12V\n\x1e\x61ndroid_game_intervention_list\x18S \x01(\x0b\x32,.perfetto.protos.AndroidGameInterventionListH\x00\x12\x32\n\x0bstatsd_atom\x18T \x01(\x0b\x32\x1b.perfetto.protos.StatsdAtomH\x00\x12I\n\x17\x61ndroid_system_property\x18V \x01(\x0b\x32&.perfetto.protos.AndroidSystemPropertyH\x00\x12G\n\x16\x65ntity_state_residency\x18[ \x01(\x0b\x32%.perfetto.protos.EntityStateResidencyH\x00\x12<\n\x10trace_provenance\x18| \x01(\x0b\x32 .perfetto.protos.TraceProvenanceH\x00\x12\x39\n\x08protovms\x18} \x01(\x0b\x32%.perfetto.protos.TracePacket.ProtoVmsH\x00\x12<\n\x10trace_attributes\x18~ \x01(\x0b\x32 .perfetto.protos.TraceAttributesH\x00\x12\x38\n\x0e\x61ndroid_aflags\x18\x7f \x01(\x0b\x32\x1e.perfetto.protos.AndroidAflagsH\x00\x12-\n\x08gpu_info\x18\x80\x01 \x01(\x0b\x32\x18.perfetto.protos.GpuInfoH\x00\x12\x39\n\x0einterrupt_info\x18\x82\x01 \x01(\x0b\x32\x1e.perfetto.protos.InterruptInfoH\x00\x12\x38\n\x0emodule_symbols\x18= \x01(\x0b\x32\x1e.perfetto.protos.ModuleSymbolsH\x00\x12\x46\n\x15\x64\x65obfuscation_mapping\x18@ \x01(\x0b\x32%.perfetto.protos.DeobfuscationMappingH\x00\x12@\n\x12process_descriptor\x18+ \x01(\x0b\x32\".perfetto.protos.ProcessDescriptorH\x00\x12>\n\x11thread_descriptor\x18, \x01(\x0b\x32!.perfetto.protos.ThreadDescriptorH\x00\x12;\n\rftrace_events\x18\x01 \x01(\x0b\x32\".perfetto.protos.FtraceEventBundleH\x00\x12 \n\x16synchronization_marker\x18$ \x01(\x0cH\x00\x12\x1c\n\x12\x63ompressed_packets\x18\x32 \x01(\x0cH\x00\x12\"\n\x17zstd_compressed_packets\x18\x85\x01 \x01(\x0cH\x00\x12\x44\n\x14\x65xtension_descriptor\x18H \x01(\x0b\x32$.perfetto.protos.ExtensionDescriptorH\x00\x12:\n\netw_events\x18_ \x01(\x0b\x32$.perfetto.protos.EtwTraceEventBundleH\x00\x12/\n\nv8_js_code\x18\x63 \x01(\x0b\x32\x19.perfetto.protos.V8JsCodeH\x00\x12;\n\x10v8_internal_code\x18\x64 \x01(\x0b\x32\x1f.perfetto.protos.V8InternalCodeH\x00\x12\x33\n\x0cv8_wasm_code\x18\x65 \x01(\x0b\x32\x1b.perfetto.protos.V8WasmCodeH\x00\x12\x38\n\x0fv8_reg_exp_code\x18\x66 \x01(\x0b\x32\x1d.perfetto.protos.V8RegExpCodeH\x00\x12\x33\n\x0cv8_code_move\x18g \x01(\x0b\x32\x1b.perfetto.protos.V8CodeMoveH\x00\x12=\n\x11remote_clock_sync\x18k \x01(\x0b\x32 .perfetto.protos.RemoteClockSyncH\x00\x12?\n\x12pixel_modem_events\x18n \x01(\x0b\x32!.perfetto.protos.PixelModemEventsH\x00\x12N\n\x1apixel_modem_token_database\x18o \x01(\x0b\x32(.perfetto.protos.PixelModemTokenDatabaseH\x00\x12:\n\x16\x63lone_snapshot_trigger\x18q \x01(\x0b\x32\x18.perfetto.protos.TriggerH\x00\x12\x43\n\x14kernel_wakelock_data\x18s \x01(\x0b\x32#.perfetto.protos.KernelWakelockDataH\x00\x12:\n\x10\x63pu_per_uid_data\x18w \x01(\x0b\x32\x1e.perfetto.protos.CpuPerUidDataH\x00\x12\x35\n\tuser_list\x18{ \x01(\x0b\x32 .perfetto.protos.AndroidUserListH\x00\x12@\n\x0ejournald_event\x18\x84\x01 \x01(\x0b\x32%.perfetto.protos.SystemdJournaldEventH\x00\x12\x32\n\x0b\x66or_testing\x18\x84\x07 \x01(\x0b\x32\x1a.perfetto.protos.TestEventH\x00\x12\x15\n\x0btrusted_uid\x18\x03 \x01(\x05H\x01\x12$\n\x1atrusted_packet_sequence_id\x18\n \x01(\rH\x02\x12\x13\n\x0btrusted_pid\x18O \x01(\x05\x12\x34\n\rinterned_data\x18\x0c \x01(\x0b\x32\x1d.perfetto.protos.InternedData\x12\x16\n\x0esequence_flags\x18\r \x01(\r\x12!\n\x19incremental_state_cleared\x18) \x01(\x08\x12\x43\n\x15trace_packet_defaults\x18; \x01(\x0b\x32$.perfetto.protos.TracePacketDefaults\x12\x1f\n\x17previous_packet_dropped\x18* \x01(\r\x12 \n\x18\x66irst_packet_on_sequence\x18W \x01(\x08\x12\x12\n\nmachine_id\x18\x62 \x01(\r\x1a\xe1\x01\n\x08ProtoVms\x12@\n\x08instance\x18\x01 \x03(\x0b\x32..perfetto.protos.TracePacket.ProtoVms.Instance\x1a\x92\x01\n\x08Instance\x12+\n\x07program\x18\x01 \x01(\x0b\x32\x1a.perfetto.protos.VmProgram\x12+\n\x05state\x18\x02 \x01(\x0b\x32\x1c.perfetto.protos.TracePacket\x12\x17\n\x0fmemory_limit_kb\x18\x03 \x01(\r\x12\x13\n\x0bproducer_id\x18\x04 \x03(\x05\"h\n\rSequenceFlags\x12\x13\n\x0fSEQ_UNSPECIFIED\x10\x00\x12!\n\x1dSEQ_INCREMENTAL_STATE_CLEARED\x10\x01\x12\x1f\n\x1bSEQ_NEEDS_INCREMENTAL_STATE\x10\x02\"\xb0\x02\n\x0e\x44\x61taLossReason\x12\x19\n\x15\x44\x41TA_LOSS_UNSPECIFIED\x10\x00\x12\x15\n\x11\x44\x41TA_LOSS_PRESENT\x10\x01\x12\x16\n\x12\x44\x41TA_LOSS_READ_GAP\x10\x02\x12\x1d\n\x19\x44\x41TA_LOSS_CHUNK_CORRUPTED\x10\x04\x12!\n\x1d\x44\x41TA_LOSS_ORPHAN_CONTINUATION\x10\x08\x12\x1c\n\x18\x44\x41TA_LOSS_REASSEMBLY_GAP\x10\x10\x12%\n!DATA_LOSS_REASSEMBLY_BROKEN_CHAIN\x10 \x12\x17\n\x13\x44\x41TA_LOSS_OVERWRITE\x10@\x12\x1b\n\x16\x44\x41TA_LOSS_WRITER_ABORT\x10\x80\x01\x12\x17\n\x12\x44\x41TA_LOSS_SMB_FULL\x10\x80\x02*\x04\x08\x38\x10\x39*\x04\x08L\x10M*\x04\x08X\x10Y*\x04\x08\\\x10]*\x04\x08]\x10^*\x04\x08^\x10_*\x04\x08`\x10\x61*\x04\x08\x61\x10\x62*\x04\x08h\x10i*\x04\x08i\x10j*\x04\x08p\x10q*\x04\x08r\x10s*\x04\x08t\x10u*\x04\x08y\x10z*\x06\x08\xe8\x07\x10\xd0\x0f\x42\x06\n\x04\x64\x61taB\x16\n\x14optional_trusted_uidB%\n#optional_trusted_packet_sequence_idJ\x04\x08j\x10kJ\x04\x08\x37\x10\x38J\x04\x08P\x10QJ\x04\x08Q\x10R\"5\n\x05Trace\x12,\n\x06packet\x18\x01 \x03(\x0b\x32\x1c.perfetto.protos.TracePacket*c\n\x0cVmCursorEnum\x12\x19\n\x15VM_CURSOR_UNSPECIFIED\x10\x00\x12\x11\n\rVM_CURSOR_SRC\x10\x01\x12\x11\n\rVM_CURSOR_DST\x10\x02\x12\x12\n\x0eVM_CURSOR_BOTH\x10\x03*\xd9\x02\n\x0c\x42uiltinClock\x12\x19\n\x15\x42UILTIN_CLOCK_UNKNOWN\x10\x00\x12\x1a\n\x16\x42UILTIN_CLOCK_REALTIME\x10\x01\x12!\n\x1d\x42UILTIN_CLOCK_REALTIME_COARSE\x10\x02\x12\x1b\n\x17\x42UILTIN_CLOCK_MONOTONIC\x10\x03\x12\"\n\x1e\x42UILTIN_CLOCK_MONOTONIC_COARSE\x10\x04\x12\x1f\n\x1b\x42UILTIN_CLOCK_MONOTONIC_RAW\x10\x05\x12\x1a\n\x16\x42UILTIN_CLOCK_BOOTTIME\x10\x06\x12\x15\n\x11\x42UILTIN_CLOCK_TSC\x10\t\x12\x16\n\x12\x42UILTIN_CLOCK_PERF\x10\n\x12\x1c\n\x18\x42UILTIN_CLOCK_TRACE_FILE\x10\x0b\x12\x18\n\x14\x42UILTIN_CLOCK_MAX_ID\x10?\"\x04\x08\x07\x10\x07\"\x04\x08\x08\x10\x08*z\n\x0cSemanticType\x12\x1d\n\x19SEMANTIC_TYPE_UNSPECIFIED\x10\x00\x12\x18\n\x14SEMANTIC_TYPE_ATRACE\x10\x01\x12\x15\n\x11SEMANTIC_TYPE_JOB\x10\x02\x12\x1a\n\x16SEMANTIC_TYPE_WAKELOCK\x10\x03*\x8e\x01\n\x0c\x41ndroidLogId\x12\x0f\n\x0bLID_DEFAULT\x10\x00\x12\r\n\tLID_RADIO\x10\x01\x12\x0e\n\nLID_EVENTS\x10\x02\x12\x0e\n\nLID_SYSTEM\x10\x03\x12\r\n\tLID_CRASH\x10\x04\x12\r\n\tLID_STATS\x10\x05\x12\x10\n\x0cLID_SECURITY\x10\x06\x12\x0e\n\nLID_KERNEL\x10\x07*\x9b\x01\n\x12\x41ndroidLogPriority\x12\x14\n\x10PRIO_UNSPECIFIED\x10\x00\x12\x0f\n\x0bPRIO_UNUSED\x10\x01\x12\x10\n\x0cPRIO_VERBOSE\x10\x02\x12\x0e\n\nPRIO_DEBUG\x10\x03\x12\r\n\tPRIO_INFO\x10\x04\x12\r\n\tPRIO_WARN\x10\x05\x12\x0e\n\nPRIO_ERROR\x10\x06\x12\x0e\n\nPRIO_FATAL\x10\x07*\xc7\x01\n\rProtoLogLevel\x12\x1c\n\x18PROTOLOG_LEVEL_UNDEFINED\x10\x00\x12\x18\n\x14PROTOLOG_LEVEL_DEBUG\x10\x01\x12\x1a\n\x16PROTOLOG_LEVEL_VERBOSE\x10\x02\x12\x17\n\x13PROTOLOG_LEVEL_INFO\x10\x03\x12\x17\n\x13PROTOLOG_LEVEL_WARN\x10\x04\x12\x18\n\x14PROTOLOG_LEVEL_ERROR\x10\x05\x12\x16\n\x12PROTOLOG_LEVEL_WTF\x10\x06*\xf3\xfb\x02\n\x06\x41tomId\x12\x14\n\x10\x41TOM_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x41TOM_BLE_SCAN_STATE_CHANGED\x10\x02\x12\x1e\n\x1a\x41TOM_PROCESS_STATE_CHANGED\x10\x03\x12!\n\x1d\x41TOM_BLE_SCAN_RESULT_RECEIVED\x10\x04\x12\x1d\n\x19\x41TOM_SENSOR_STATE_CHANGED\x10\x05\x12\x1f\n\x1b\x41TOM_GPS_SCAN_STATE_CHANGED\x10\x06\x12\x1b\n\x17\x41TOM_SYNC_STATE_CHANGED\x10\x07\x12$\n ATOM_SCHEDULED_JOB_STATE_CHANGED\x10\x08\x12\"\n\x1e\x41TOM_SCREEN_BRIGHTNESS_CHANGED\x10\t\x12\x1f\n\x1b\x41TOM_WAKELOCK_STATE_CHANGED\x10\n\x12,\n(ATOM_LONG_PARTIAL_WAKELOCK_STATE_CHANGED\x10\x0b\x12)\n%ATOM_MOBILE_RADIO_POWER_STATE_CHANGED\x10\x0c\x12\'\n#ATOM_WIFI_RADIO_POWER_STATE_CHANGED\x10\r\x12-\n)ATOM_ACTIVITY_MANAGER_SLEEP_STATE_CHANGED\x10\x0e\x12$\n ATOM_MEMORY_FACTOR_STATE_CHANGED\x10\x0f\x12%\n!ATOM_EXCESSIVE_CPU_USAGE_REPORTED\x10\x10\x12\x1d\n\x19\x41TOM_CACHED_KILL_REPORTED\x10\x11\x12%\n!ATOM_PROCESS_MEMORY_STAT_REPORTED\x10\x12\x12\x17\n\x13\x41TOM_LAUNCHER_EVENT\x10\x13\x12)\n%ATOM_BATTERY_SAVER_MODE_STATE_CHANGED\x10\x14\x12\'\n#ATOM_DEVICE_IDLE_MODE_STATE_CHANGED\x10\x15\x12)\n%ATOM_DEVICE_IDLING_MODE_STATE_CHANGED\x10\x16\x12\x1c\n\x18\x41TOM_AUDIO_STATE_CHANGED\x10\x17\x12\"\n\x1e\x41TOM_MEDIA_CODEC_STATE_CHANGED\x10\x18\x12\x1d\n\x19\x41TOM_CAMERA_STATE_CHANGED\x10\x19\x12!\n\x1d\x41TOM_FLASHLIGHT_STATE_CHANGED\x10\x1a\x12\"\n\x1e\x41TOM_UID_PROCESS_STATE_CHANGED\x10\x1b\x12)\n%ATOM_PROCESS_LIFE_CYCLE_STATE_CHANGED\x10\x1c\x12\x1d\n\x19\x41TOM_SCREEN_STATE_CHANGED\x10\x1d\x12\x1e\n\x1a\x41TOM_BATTERY_LEVEL_CHANGED\x10\x1e\x12\x1f\n\x1b\x41TOM_CHARGING_STATE_CHANGED\x10\x1f\x12\x1e\n\x1a\x41TOM_PLUGGED_STATE_CHANGED\x10 \x12\"\n\x1e\x41TOM_INTERACTIVE_STATE_CHANGED\x10!\x12\x1d\n\x19\x41TOM_TOUCH_EVENT_REPORTED\x10\"\x12\x1e\n\x1a\x41TOM_WAKEUP_ALARM_OCCURRED\x10#\x12\x1f\n\x1b\x41TOM_KERNEL_WAKEUP_REPORTED\x10$\x12 \n\x1c\x41TOM_WIFI_LOCK_STATE_CHANGED\x10%\x12%\n!ATOM_WIFI_SIGNAL_STRENGTH_CHANGED\x10&\x12 \n\x1c\x41TOM_WIFI_SCAN_STATE_CHANGED\x10\'\x12&\n\"ATOM_PHONE_SIGNAL_STRENGTH_CHANGED\x10(\x12\x18\n\x14\x41TOM_SETTING_CHANGED\x10)\x12*\n&ATOM_ACTIVITY_FOREGROUND_STATE_CHANGED\x10*\x12\x1d\n\x19\x41TOM_ISOLATED_UID_CHANGED\x10+\x12\x1f\n\x1b\x41TOM_PACKET_WAKEUP_OCCURRED\x10,\x12 \n\x1c\x41TOM_WALL_CLOCK_TIME_SHIFTED\x10-\x12\x19\n\x15\x41TOM_ANOMALY_DETECTED\x10.\x12 \n\x1c\x41TOM_APP_BREADCRUMB_REPORTED\x10/\x12\x1b\n\x17\x41TOM_APP_START_OCCURRED\x10\x30\x12\x1b\n\x17\x41TOM_APP_START_CANCELED\x10\x31\x12\x1e\n\x1a\x41TOM_APP_START_FULLY_DRAWN\x10\x32\x12\x1a\n\x16\x41TOM_LMK_KILL_OCCURRED\x10\x33\x12)\n%ATOM_PICTURE_IN_PICTURE_STATE_CHANGED\x10\x34\x12*\n&ATOM_WIFI_MULTICAST_LOCK_STATE_CHANGED\x10\x35\x12(\n$ATOM_APP_START_MEMORY_STATE_CAPTURED\x10\x37\x12#\n\x1f\x41TOM_SHUTDOWN_SEQUENCE_REPORTED\x10\x38\x12\x1f\n\x1b\x41TOM_BOOT_SEQUENCE_REPORTED\x10\x39\x12\x1e\n\x1a\x41TOM_OVERLAY_STATE_CHANGED\x10;\x12)\n%ATOM_FOREGROUND_SERVICE_STATE_CHANGED\x10<\x12\x1b\n\x17\x41TOM_CALL_STATE_CHANGED\x10=\x12\x1f\n\x1b\x41TOM_KEYGUARD_STATE_CHANGED\x10>\x12\'\n#ATOM_KEYGUARD_BOUNCER_STATE_CHANGED\x10?\x12*\n&ATOM_KEYGUARD_BOUNCER_PASSWORD_ENTERED\x10@\x12\x11\n\rATOM_APP_DIED\x10\x41\x12\'\n#ATOM_RESOURCE_CONFIGURATION_CHANGED\x10\x42\x12(\n$ATOM_BLUETOOTH_ENABLED_STATE_CHANGED\x10\x43\x12+\n\'ATOM_BLUETOOTH_CONNECTION_STATE_CHANGED\x10\x44\x12#\n\x1f\x41TOM_GPS_SIGNAL_QUALITY_CHANGED\x10\x45\x12$\n ATOM_USB_CONNECTOR_STATE_CHANGED\x10\x46\x12#\n\x1f\x41TOM_SPEAKER_IMPEDANCE_REPORTED\x10G\x12\x18\n\x14\x41TOM_HARDWARE_FAILED\x10H\x12\x1f\n\x1b\x41TOM_PHYSICAL_DROP_DETECTED\x10I\x12\x1f\n\x1b\x41TOM_CHARGE_CYCLES_REPORTED\x10J\x12(\n$ATOM_MOBILE_CONNECTION_STATE_CHANGED\x10K\x12(\n$ATOM_MOBILE_RADIO_TECHNOLOGY_CHANGED\x10L\x12\x1c\n\x18\x41TOM_USB_DEVICE_ATTACHED\x10M\x12\x1b\n\x17\x41TOM_APP_CRASH_OCCURRED\x10N\x12\x15\n\x11\x41TOM_ANR_OCCURRED\x10O\x12\x15\n\x11\x41TOM_WTF_OCCURRED\x10P\x12\x19\n\x15\x41TOM_LOW_MEM_REPORTED\x10Q\x12\x15\n\x11\x41TOM_GENERIC_ATOM\x10R\x12\x1f\n\x1b\x41TOM_VIBRATOR_STATE_CHANGED\x10T\x12$\n ATOM_DEFERRED_JOB_STATS_REPORTED\x10U\x12\x1b\n\x17\x41TOM_THERMAL_THROTTLING\x10V\x12\x1b\n\x17\x41TOM_BIOMETRIC_ACQUIRED\x10W\x12 \n\x1c\x41TOM_BIOMETRIC_AUTHENTICATED\x10X\x12!\n\x1d\x41TOM_BIOMETRIC_ERROR_OCCURRED\x10Y\x12\x1a\n\x16\x41TOM_UI_EVENT_REPORTED\x10Z\x12 \n\x1c\x41TOM_BATTERY_HEALTH_SNAPSHOT\x10[\x12\x10\n\x0c\x41TOM_SLOW_IO\x10\\\x12 \n\x1c\x41TOM_BATTERY_CAUSED_SHUTDOWN\x10]\x12$\n ATOM_PHONE_SERVICE_STATE_CHANGED\x10^\x12\x1c\n\x18\x41TOM_PHONE_STATE_CHANGED\x10_\x12!\n\x1d\x41TOM_USER_RESTRICTION_CHANGED\x10`\x12\x1c\n\x18\x41TOM_SETTINGS_UI_CHANGED\x10\x61\x12#\n\x1f\x41TOM_CONNECTIVITY_STATE_CHANGED\x10\x62\x12\x1e\n\x1a\x41TOM_SERVICE_STATE_CHANGED\x10\x63\x12 \n\x1c\x41TOM_SERVICE_LAUNCH_REPORTED\x10\x64\x12\"\n\x1e\x41TOM_FLAG_FLIP_UPDATE_OCCURRED\x10\x65\x12\"\n\x1e\x41TOM_BINARY_PUSH_STATE_CHANGED\x10\x66\x12\x1c\n\x18\x41TOM_DEVICE_POLICY_EVENT\x10g\x12!\n\x1d\x41TOM_DOCS_UI_FILE_OP_CANCELED\x10h\x12\x30\n,ATOM_DOCS_UI_FILE_OP_COPY_MOVE_MODE_REPORTED\x10i\x12 \n\x1c\x41TOM_DOCS_UI_FILE_OP_FAILURE\x10j\x12!\n\x1d\x41TOM_DOCS_UI_PROVIDER_FILE_OP\x10k\x12.\n*ATOM_DOCS_UI_INVALID_SCOPED_ACCESS_REQUEST\x10l\x12 \n\x1c\x41TOM_DOCS_UI_LAUNCH_REPORTED\x10m\x12\x1d\n\x19\x41TOM_DOCS_UI_ROOT_VISITED\x10n\x12\x1b\n\x17\x41TOM_DOCS_UI_STARTUP_MS\x10o\x12%\n!ATOM_DOCS_UI_USER_ACTION_REPORTED\x10p\x12#\n\x1f\x41TOM_WIFI_ENABLED_STATE_CHANGED\x10q\x12#\n\x1f\x41TOM_WIFI_RUNNING_STATE_CHANGED\x10r\x12\x16\n\x12\x41TOM_APP_COMPACTED\x10s\x12#\n\x1f\x41TOM_NETWORK_DNS_EVENT_REPORTED\x10t\x12.\n*ATOM_DOCS_UI_PICKER_LAUNCHED_FROM_REPORTED\x10u\x12%\n!ATOM_DOCS_UI_PICK_RESULT_REPORTED\x10v\x12%\n!ATOM_DOCS_UI_SEARCH_MODE_REPORTED\x10w\x12%\n!ATOM_DOCS_UI_SEARCH_TYPE_REPORTED\x10x\x12\x19\n\x15\x41TOM_DATA_STALL_EVENT\x10y\x12$\n ATOM_RESCUE_PARTY_RESET_REPORTED\x10z\x12\x1f\n\x1b\x41TOM_SIGNED_CONFIG_REPORTED\x10{\x12\x1f\n\x1b\x41TOM_GNSS_NI_EVENT_REPORTED\x10|\x12.\n*ATOM_BLUETOOTH_LINK_LAYER_CONNECTION_EVENT\x10}\x12/\n+ATOM_BLUETOOTH_ACL_CONNECTION_STATE_CHANGED\x10~\x12/\n+ATOM_BLUETOOTH_SCO_CONNECTION_STATE_CHANGED\x10\x7f\x12\x18\n\x13\x41TOM_APP_DOWNGRADED\x10\x80\x01\x12(\n#ATOM_APP_OPTIMIZED_AFTER_DOWNGRADED\x10\x81\x01\x12#\n\x1e\x41TOM_LOW_STORAGE_STATE_CHANGED\x10\x82\x01\x12(\n#ATOM_GNSS_NFW_NOTIFICATION_REPORTED\x10\x83\x01\x12%\n ATOM_GNSS_CONFIGURATION_REPORTED\x10\x84\x01\x12*\n%ATOM_USB_PORT_OVERHEAT_EVENT_REPORTED\x10\x85\x01\x12\x1c\n\x17\x41TOM_NFC_ERROR_OCCURRED\x10\x86\x01\x12\x1b\n\x16\x41TOM_NFC_STATE_CHANGED\x10\x87\x01\x12\x1b\n\x16\x41TOM_NFC_BEAM_OCCURRED\x10\x88\x01\x12$\n\x1f\x41TOM_NFC_CARDEMULATION_OCCURRED\x10\x89\x01\x12\x1a\n\x15\x41TOM_NFC_TAG_OCCURRED\x10\x8a\x01\x12&\n!ATOM_NFC_HCE_TRANSACTION_OCCURRED\x10\x8b\x01\x12\x1a\n\x15\x41TOM_SE_STATE_CHANGED\x10\x8c\x01\x12\x1b\n\x16\x41TOM_SE_OMAPI_REPORTED\x10\x8d\x01\x12-\n(ATOM_BROADCAST_DISPATCH_LATENCY_REPORTED\x10\x8e\x01\x12\x33\n.ATOM_ATTENTION_MANAGER_SERVICE_RESULT_REPORTED\x10\x8f\x01\x12 \n\x1b\x41TOM_ADB_CONNECTION_CHANGED\x10\x90\x01\x12\"\n\x1d\x41TOM_SPEECH_DSP_STAT_REPORTED\x10\x91\x01\x12\"\n\x1d\x41TOM_USB_CONTAMINANT_REPORTED\x10\x92\x01\x12$\n\x1f\x41TOM_WATCHDOG_ROLLBACK_OCCURRED\x10\x93\x01\x12\x30\n+ATOM_BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED\x10\x94\x01\x12\x1b\n\x16\x41TOM_BUBBLE_UI_CHANGED\x10\x95\x01\x12*\n%ATOM_SCHEDULED_JOB_CONSTRAINT_CHANGED\x10\x96\x01\x12)\n$ATOM_BLUETOOTH_ACTIVE_DEVICE_CHANGED\x10\x97\x01\x12/\n*ATOM_BLUETOOTH_A2DP_PLAYBACK_STATE_CHANGED\x10\x98\x01\x12-\n(ATOM_BLUETOOTH_A2DP_CODEC_CONFIG_CHANGED\x10\x99\x01\x12\x31\n,ATOM_BLUETOOTH_A2DP_CODEC_CAPABILITY_CHANGED\x10\x9a\x01\x12\x30\n+ATOM_BLUETOOTH_A2DP_AUDIO_UNDERRUN_REPORTED\x10\x9b\x01\x12/\n*ATOM_BLUETOOTH_A2DP_AUDIO_OVERRUN_REPORTED\x10\x9c\x01\x12(\n#ATOM_BLUETOOTH_DEVICE_RSSI_REPORTED\x10\x9d\x01\x12:\n5ATOM_BLUETOOTH_DEVICE_FAILED_CONTACT_COUNTER_REPORTED\x10\x9e\x01\x12\x32\n-ATOM_BLUETOOTH_DEVICE_TX_POWER_LEVEL_REPORTED\x10\x9f\x01\x12(\n#ATOM_BLUETOOTH_HCI_TIMEOUT_REPORTED\x10\xa0\x01\x12+\n&ATOM_BLUETOOTH_QUALITY_REPORT_REPORTED\x10\xa1\x01\x12(\n#ATOM_BLUETOOTH_DEVICE_INFO_REPORTED\x10\xa2\x01\x12\x30\n+ATOM_BLUETOOTH_REMOTE_VERSION_INFO_REPORTED\x10\xa3\x01\x12*\n%ATOM_BLUETOOTH_SDP_ATTRIBUTE_REPORTED\x10\xa4\x01\x12&\n!ATOM_BLUETOOTH_BOND_STATE_CHANGED\x10\xa5\x01\x12\x32\n-ATOM_BLUETOOTH_CLASSIC_PAIRING_EVENT_REPORTED\x10\xa6\x01\x12.\n)ATOM_BLUETOOTH_SMP_PAIRING_EVENT_REPORTED\x10\xa7\x01\x12+\n&ATOM_SCREEN_TIMEOUT_EXTENSION_REPORTED\x10\xa8\x01\x12\x1c\n\x17\x41TOM_PROCESS_START_TIME\x10\xa9\x01\x12\x32\n-ATOM_PERMISSION_GRANT_REQUEST_RESULT_REPORTED\x10\xaa\x01\x12\x33\n.ATOM_BLUETOOTH_SOCKET_CONNECTION_STATE_CHANGED\x10\xab\x01\x12)\n$ATOM_DEVICE_IDENTIFIER_ACCESS_DENIED\x10\xac\x01\x12)\n$ATOM_BUBBLE_DEVELOPER_ERROR_REPORTED\x10\xad\x01\x12\'\n\"ATOM_ASSIST_GESTURE_STAGE_REPORTED\x10\xae\x01\x12*\n%ATOM_ASSIST_GESTURE_FEEDBACK_REPORTED\x10\xaf\x01\x12*\n%ATOM_ASSIST_GESTURE_PROGRESS_REPORTED\x10\xb0\x01\x12\"\n\x1d\x41TOM_TOUCH_GESTURE_CLASSIFIED\x10\xb1\x01\x12\x19\n\x14\x41TOM_HIDDEN_API_USED\x10\xb2\x01\x12\x1a\n\x15\x41TOM_STYLE_UI_CHANGED\x10\xb3\x01\x12\'\n\"ATOM_PRIVACY_INDICATORS_INTERACTED\x10\xb4\x01\x12\x32\n-ATOM_APP_INSTALL_ON_EXTERNAL_STORAGE_REPORTED\x10\xb5\x01\x12 \n\x1b\x41TOM_NETWORK_STACK_REPORTED\x10\xb6\x01\x12$\n\x1f\x41TOM_APP_MOVED_STORAGE_REPORTED\x10\xb7\x01\x12\x1c\n\x17\x41TOM_BIOMETRIC_ENROLLED\x10\xb8\x01\x12)\n$ATOM_SYSTEM_SERVER_WATCHDOG_OCCURRED\x10\xb9\x01\x12\x1d\n\x18\x41TOM_TOMB_STONE_OCCURRED\x10\xba\x01\x12,\n\'ATOM_BLUETOOTH_CLASS_OF_DEVICE_REPORTED\x10\xbb\x01\x12%\n ATOM_INTELLIGENCE_EVENT_REPORTED\x10\xbc\x01\x12\x33\n.ATOM_THERMAL_THROTTLING_SEVERITY_STATE_CHANGED\x10\xbd\x01\x12&\n!ATOM_ROLE_REQUEST_RESULT_REPORTED\x10\xbe\x01\x12+\n&ATOM_MEDIAMETRICS_AUDIOPOLICY_REPORTED\x10\xbf\x01\x12+\n&ATOM_MEDIAMETRICS_AUDIORECORD_REPORTED\x10\xc0\x01\x12+\n&ATOM_MEDIAMETRICS_AUDIOTHREAD_REPORTED\x10\xc1\x01\x12*\n%ATOM_MEDIAMETRICS_AUDIOTRACK_REPORTED\x10\xc2\x01\x12%\n ATOM_MEDIAMETRICS_CODEC_REPORTED\x10\xc3\x01\x12,\n\'ATOM_MEDIAMETRICS_DRM_WIDEVINE_REPORTED\x10\xc4\x01\x12)\n$ATOM_MEDIAMETRICS_EXTRACTOR_REPORTED\x10\xc5\x01\x12(\n#ATOM_MEDIAMETRICS_MEDIADRM_REPORTED\x10\xc6\x01\x12(\n#ATOM_MEDIAMETRICS_NUPLAYER_REPORTED\x10\xc7\x01\x12(\n#ATOM_MEDIAMETRICS_RECORDER_REPORTED\x10\xc8\x01\x12*\n%ATOM_MEDIAMETRICS_DRMMANAGER_REPORTED\x10\xc9\x01\x12!\n\x1c\x41TOM_CAR_POWER_STATE_CHANGED\x10\xcb\x01\x12\x1a\n\x15\x41TOM_GARAGE_MODE_INFO\x10\xcc\x01\x12\x1c\n\x17\x41TOM_TEST_ATOM_REPORTED\x10\xcd\x01\x12\x32\n-ATOM_CONTENT_CAPTURE_CALLER_MISMATCH_REPORTED\x10\xce\x01\x12(\n#ATOM_CONTENT_CAPTURE_SERVICE_EVENTS\x10\xcf\x01\x12(\n#ATOM_CONTENT_CAPTURE_SESSION_EVENTS\x10\xd0\x01\x12!\n\x1c\x41TOM_CONTENT_CAPTURE_FLUSHED\x10\xd1\x01\x12-\n(ATOM_LOCATION_MANAGER_API_USAGE_REPORTED\x10\xd2\x01\x12\x35\n0ATOM_REVIEW_PERMISSIONS_FRAGMENT_RESULT_REPORTED\x10\xd3\x01\x12,\n\'ATOM_RUNTIME_PERMISSIONS_UPGRADE_RESULT\x10\xd4\x01\x12\x33\n.ATOM_GRANT_PERMISSIONS_ACTIVITY_BUTTON_ACTIONS\x10\xd5\x01\x12\x33\n.ATOM_LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION\x10\xd6\x01\x12\x31\n,ATOM_APP_PERMISSION_FRAGMENT_ACTION_REPORTED\x10\xd7\x01\x12(\n#ATOM_APP_PERMISSION_FRAGMENT_VIEWED\x10\xd8\x01\x12)\n$ATOM_APP_PERMISSIONS_FRAGMENT_VIEWED\x10\xd9\x01\x12)\n$ATOM_PERMISSION_APPS_FRAGMENT_VIEWED\x10\xda\x01\x12\x1e\n\x19\x41TOM_TEXT_SELECTION_EVENT\x10\xdb\x01\x12\x1c\n\x17\x41TOM_TEXT_LINKIFY_EVENT\x10\xdc\x01\x12$\n\x1f\x41TOM_CONVERSATION_ACTIONS_EVENT\x10\xdd\x01\x12\"\n\x1d\x41TOM_LANGUAGE_DETECTION_EVENT\x10\xde\x01\x12&\n!ATOM_EXCLUSION_RECT_STATE_CHANGED\x10\xdf\x01\x12(\n#ATOM_BACK_GESTURE_REPORTED_REPORTED\x10\xe0\x01\x12/\n*ATOM_UPDATE_ENGINE_UPDATE_ATTEMPT_REPORTED\x10\xe1\x01\x12\x32\n-ATOM_UPDATE_ENGINE_SUCCESSFUL_UPDATE_REPORTED\x10\xe2\x01\x12\x1d\n\x18\x41TOM_CAMERA_ACTION_EVENT\x10\xe3\x01\x12+\n&ATOM_APP_COMPATIBILITY_CHANGE_REPORTED\x10\xe4\x01\x12\x1b\n\x16\x41TOM_PERFETTO_UPLOADED\x10\xe5\x01\x12-\n(ATOM_VMS_CLIENT_CONNECTION_STATE_CHANGED\x10\xe6\x01\x12&\n!ATOM_MEDIA_PROVIDER_SCAN_OCCURRED\x10\xe9\x01\x12\x1f\n\x1a\x41TOM_MEDIA_CONTENT_DELETED\x10\xea\x01\x12-\n(ATOM_MEDIA_PROVIDER_PERMISSION_REQUESTED\x10\xeb\x01\x12\'\n\"ATOM_MEDIA_PROVIDER_SCHEMA_CHANGED\x10\xec\x01\x12\x32\n-ATOM_MEDIA_PROVIDER_IDLE_MAINTENANCE_FINISHED\x10\xed\x01\x12)\n$ATOM_REBOOT_ESCROW_RECOVERY_REPORTED\x10\xee\x01\x12+\n&ATOM_BOOT_TIME_EVENT_DURATION_REPORTED\x10\xef\x01\x12/\n*ATOM_BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED\x10\xf0\x01\x12+\n&ATOM_BOOT_TIME_EVENT_UTC_TIME_REPORTED\x10\xf1\x01\x12-\n(ATOM_BOOT_TIME_EVENT_ERROR_CODE_REPORTED\x10\xf2\x01\x12#\n\x1e\x41TOM_USERSPACE_REBOOT_REPORTED\x10\xf3\x01\x12\x1f\n\x1a\x41TOM_NOTIFICATION_REPORTED\x10\xf4\x01\x12%\n ATOM_NOTIFICATION_PANEL_REPORTED\x10\xf5\x01\x12\'\n\"ATOM_NOTIFICATION_CHANNEL_MODIFIED\x10\xf6\x01\x12)\n$ATOM_INTEGRITY_CHECK_RESULT_REPORTED\x10\xf7\x01\x12 \n\x1b\x41TOM_INTEGRITY_RULES_PUSHED\x10\xf8\x01\x12\x1d\n\x18\x41TOM_CB_MESSAGE_REPORTED\x10\xf9\x01\x12\x1a\n\x15\x41TOM_CB_MESSAGE_ERROR\x10\xfa\x01\x12#\n\x1e\x41TOM_WIFI_HEALTH_STAT_REPORTED\x10\xfb\x01\x12$\n\x1f\x41TOM_WIFI_FAILURE_STAT_REPORTED\x10\xfc\x01\x12)\n$ATOM_WIFI_CONNECTION_RESULT_REPORTED\x10\xfd\x01\x12\x1c\n\x17\x41TOM_APP_FREEZE_CHANGED\x10\xfe\x01\x12!\n\x1c\x41TOM_SNAPSHOT_MERGE_REPORTED\x10\xff\x01\x12\x31\n,ATOM_FOREGROUND_SERVICE_APP_OP_SESSION_ENDED\x10\x80\x02\x12\x1f\n\x1a\x41TOM_DISPLAY_JANK_REPORTED\x10\x81\x02\x12$\n\x1f\x41TOM_APP_STANDBY_BUCKET_CHANGED\x10\x82\x02\x12\x1c\n\x17\x41TOM_SHARESHEET_STARTED\x10\x83\x02\x12\x1a\n\x15\x41TOM_RANKING_SELECTED\x10\x84\x02\x12\"\n\x1d\x41TOM_TVSETTINGS_UI_INTERACTED\x10\x85\x02\x12\x1b\n\x16\x41TOM_LAUNCHER_SNAPSHOT\x10\x86\x02\x12\'\n\"ATOM_PACKAGE_INSTALLER_V2_REPORTED\x10\x87\x02\x12)\n$ATOM_USER_LIFECYCLE_JOURNEY_REPORTED\x10\x88\x02\x12\'\n\"ATOM_USER_LIFECYCLE_EVENT_OCCURRED\x10\x89\x02\x12)\n$ATOM_ACCESSIBILITY_SHORTCUT_REPORTED\x10\x8a\x02\x12(\n#ATOM_ACCESSIBILITY_SERVICE_REPORTED\x10\x8b\x02\x12(\n#ATOM_DOCS_UI_DRAG_AND_DROP_REPORTED\x10\x8c\x02\x12\"\n\x1d\x41TOM_APP_USAGE_EVENT_OCCURRED\x10\x8d\x02\x12*\n%ATOM_AUTO_REVOKE_NOTIFICATION_CLICKED\x10\x8e\x02\x12)\n$ATOM_AUTO_REVOKE_FRAGMENT_APP_VIEWED\x10\x8f\x02\x12&\n!ATOM_AUTO_REVOKED_APP_INTERACTION\x10\x90\x02\x12;\n6ATOM_APP_PERMISSION_GROUPS_FRAGMENT_AUTO_REVOKE_ACTION\x10\x91\x02\x12\"\n\x1d\x41TOM_EVS_USAGE_STATS_REPORTED\x10\x92\x02\x12)\n$ATOM_AUDIO_POWER_USAGE_DATA_REPORTED\x10\x93\x02\x12 \n\x1b\x41TOM_TV_TUNER_STATE_CHANGED\x10\x94\x02\x12(\n#ATOM_MEDIAOUTPUT_OP_SWITCH_REPORTED\x10\x95\x02\x12\x1d\n\x18\x41TOM_CB_MESSAGE_FILTERED\x10\x96\x02\x12\x1d\n\x18\x41TOM_TV_TUNER_DVR_STATUS\x10\x97\x02\x12$\n\x1f\x41TOM_TV_CAS_SESSION_OPEN_STATUS\x10\x98\x02\x12\'\n\"ATOM_ASSISTANT_INVOCATION_REPORTED\x10\x99\x02\x12\x1f\n\x1a\x41TOM_DISPLAY_WAKE_REPORTED\x10\x9a\x02\x12\x33\n.ATOM_CAR_USER_HAL_MODIFY_USER_REQUEST_REPORTED\x10\x9b\x02\x12\x34\n/ATOM_CAR_USER_HAL_MODIFY_USER_RESPONSE_REPORTED\x10\x9c\x02\x12\x34\n/ATOM_CAR_USER_HAL_POST_SWITCH_RESPONSE_REPORTED\x10\x9d\x02\x12\x39\n4ATOM_CAR_USER_HAL_INITIAL_USER_INFO_REQUEST_REPORTED\x10\x9e\x02\x12:\n5ATOM_CAR_USER_HAL_INITIAL_USER_INFO_RESPONSE_REPORTED\x10\x9f\x02\x12\x38\n3ATOM_CAR_USER_HAL_USER_ASSOCIATION_REQUEST_REPORTED\x10\xa0\x02\x12=\n8ATOM_CAR_USER_HAL_SET_USER_ASSOCIATION_RESPONSE_REPORTED\x10\xa1\x02\x12*\n%ATOM_NETWORK_IP_PROVISIONING_REPORTED\x10\xa2\x02\x12%\n ATOM_NETWORK_DHCP_RENEW_REPORTED\x10\xa3\x02\x12%\n ATOM_NETWORK_VALIDATION_REPORTED\x10\xa4\x02\x12&\n!ATOM_NETWORK_STACK_QUIRK_REPORTED\x10\xa5\x02\x12\x36\n1ATOM_MEDIAMETRICS_AUDIORECORDDEVICEUSAGE_REPORTED\x10\xa6\x02\x12\x36\n1ATOM_MEDIAMETRICS_AUDIOTHREADDEVICEUSAGE_REPORTED\x10\xa7\x02\x12\x35\n0ATOM_MEDIAMETRICS_AUDIOTRACKDEVICEUSAGE_REPORTED\x10\xa8\x02\x12\x35\n0ATOM_MEDIAMETRICS_AUDIODEVICECONNECTION_REPORTED\x10\xa9\x02\x12\x18\n\x13\x41TOM_BLOB_COMMITTED\x10\xaa\x02\x12\x15\n\x10\x41TOM_BLOB_LEASED\x10\xab\x02\x12\x15\n\x10\x41TOM_BLOB_OPENED\x10\xac\x02\x12+\n&ATOM_CONTACTS_PROVIDER_STATUS_REPORTED\x10\xad\x02\x12%\n ATOM_KEYSTORE_KEY_EVENT_REPORTED\x10\xae\x02\x12$\n\x1f\x41TOM_NETWORK_TETHERING_REPORTED\x10\xaf\x02\x12\x1c\n\x17\x41TOM_IME_TOUCH_REPORTED\x10\xb0\x02\x12,\n\'ATOM_UI_INTERACTION_FRAME_INFO_REPORTED\x10\xb1\x02\x12$\n\x1f\x41TOM_UI_ACTION_LATENCY_REPORTED\x10\xb2\x02\x12\"\n\x1d\x41TOM_WIFI_DISCONNECT_REPORTED\x10\xb3\x02\x12\'\n\"ATOM_WIFI_CONNECTION_STATE_CHANGED\x10\xb4\x02\x12(\n#ATOM_HDMI_CEC_ACTIVE_SOURCE_CHANGED\x10\xb5\x02\x12#\n\x1e\x41TOM_HDMI_CEC_MESSAGE_REPORTED\x10\xb6\x02\x12\x17\n\x12\x41TOM_AIRPLANE_MODE\x10\xb7\x02\x12\x17\n\x12\x41TOM_MODEM_RESTART\x10\xb8\x02\x12&\n!ATOM_CARRIER_ID_MISMATCH_REPORTED\x10\xb9\x02\x12\"\n\x1d\x41TOM_CARRIER_ID_TABLE_UPDATED\x10\xba\x02\x12&\n!ATOM_DATA_STALL_RECOVERY_REPORTED\x10\xbb\x02\x12+\n&ATOM_MEDIAMETRICS_MEDIAPARSER_REPORTED\x10\xbc\x02\x12 \n\x1b\x41TOM_TLS_HANDSHAKE_REPORTED\x10\xbd\x02\x12,\n\'ATOM_TEXT_CLASSIFIER_API_USAGE_REPORTED\x10\xbe\x02\x12*\n%ATOM_CAR_WATCHDOG_KILL_STATS_REPORTED\x10\xbf\x02\x12(\n#ATOM_MEDIAMETRICS_PLAYBACK_REPORTED\x10\xc0\x02\x12$\n\x1f\x41TOM_MEDIA_NETWORK_INFO_CHANGED\x10\xc1\x02\x12&\n!ATOM_MEDIA_PLAYBACK_STATE_CHANGED\x10\xc2\x02\x12\'\n\"ATOM_MEDIA_PLAYBACK_ERROR_REPORTED\x10\xc3\x02\x12&\n!ATOM_MEDIA_PLAYBACK_TRACK_CHANGED\x10\xc4\x02\x12\x1c\n\x17\x41TOM_WIFI_SCAN_REPORTED\x10\xc5\x02\x12 \n\x1b\x41TOM_WIFI_PNO_SCAN_REPORTED\x10\xc6\x02\x12\x1a\n\x15\x41TOM_TIF_TUNE_CHANGED\x10\xc7\x02\x12\x1e\n\x19\x41TOM_AUTO_ROTATE_REPORTED\x10\xc8\x02\x12\x1a\n\x15\x41TOM_PERFETTO_TRIGGER\x10\xc9\x02\x12\x1a\n\x15\x41TOM_TRANSCODING_DATA\x10\xca\x02\x12)\n$ATOM_IMS_SERVICE_ENTITLEMENT_UPDATED\x10\xcb\x02\x12\x18\n\x13\x41TOM_DEVICE_ROTATED\x10\xcd\x02\x12(\n#ATOM_SIM_SPECIFIC_SETTINGS_RESTORED\x10\xce\x02\x12+\n&ATOM_TEXT_CLASSIFIER_DOWNLOAD_REPORTED\x10\xcf\x02\x12\x1b\n\x16\x41TOM_PIN_STORAGE_EVENT\x10\xd0\x02\x12\x1c\n\x17\x41TOM_FACE_DOWN_REPORTED\x10\xd1\x02\x12-\n(ATOM_BLUETOOTH_HAL_CRASH_REASON_REPORTED\x10\xd2\x02\x12,\n\'ATOM_REBOOT_ESCROW_PREPARATION_REPORTED\x10\xd3\x02\x12-\n(ATOM_REBOOT_ESCROW_LSKF_CAPTURE_REPORTED\x10\xd4\x02\x12\'\n\"ATOM_REBOOT_ESCROW_REBOOT_REPORTED\x10\xd5\x02\x12!\n\x1c\x41TOM_BINDER_LATENCY_REPORTED\x10\xd6\x02\x12,\n\'ATOM_MEDIAMETRICS_AAUDIOSTREAM_REPORTED\x10\xd7\x02\x12)\n$ATOM_MEDIA_TRANSCODING_SESSION_ENDED\x10\xd8\x02\x12&\n!ATOM_MAGNIFICATION_USAGE_REPORTED\x10\xd9\x02\x12\x31\n,ATOM_MAGNIFICATION_MODE_WITH_IME_ON_REPORTED\x10\xda\x02\x12(\n#ATOM_APP_SEARCH_CALL_STATS_REPORTED\x10\xdb\x02\x12\x30\n+ATOM_APP_SEARCH_PUT_DOCUMENT_STATS_REPORTED\x10\xdc\x02\x12 \n\x1b\x41TOM_DEVICE_CONTROL_CHANGED\x10\xdd\x02\x12\x1e\n\x19\x41TOM_DEVICE_STATE_CHANGED\x10\xde\x02\x12 \n\x1b\x41TOM_INPUTDEVICE_REGISTERED\x10\xdf\x02\x12\"\n\x1d\x41TOM_SMARTSPACE_CARD_REPORTED\x10\xe0\x02\x12*\n%ATOM_AUTH_PROMPT_AUTHENTICATE_INVOKED\x10\xe1\x02\x12/\n*ATOM_AUTH_MANAGER_CAN_AUTHENTICATE_INVOKED\x10\xe2\x02\x12$\n\x1f\x41TOM_AUTH_ENROLL_ACTION_INVOKED\x10\xe3\x02\x12\"\n\x1d\x41TOM_AUTH_DEPRECATED_API_USED\x10\xe4\x02\x12$\n\x1f\x41TOM_UNATTENDED_REBOOT_OCCURRED\x10\xe5\x02\x12\'\n\"ATOM_LONG_REBOOT_BLOCKING_REPORTED\x10\xe6\x02\x12\x33\n.ATOM_LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED\x10\xe7\x02\x12 \n\x1b\x41TOM_FDTRACK_EVENT_OCCURRED\x10\xec\x02\x12(\n#ATOM_TIMEOUT_AUTO_EXTENDED_REPORTED\x10\xed\x02\x12\x1f\n\x1a\x41TOM_ALARM_BATCH_DELIVERED\x10\xef\x02\x12\x19\n\x14\x41TOM_ALARM_SCHEDULED\x10\xf0\x02\x12\x30\n+ATOM_CAR_WATCHDOG_IO_OVERUSE_STATS_REPORTED\x10\xf1\x02\x12.\n)ATOM_USER_LEVEL_HIBERNATION_STATE_CHANGED\x10\xf2\x02\x12.\n)ATOM_APP_SEARCH_INITIALIZE_STATS_REPORTED\x10\xf3\x02\x12)\n$ATOM_APP_SEARCH_QUERY_STATS_REPORTED\x10\xf4\x02\x12\x1a\n\x15\x41TOM_APP_PROCESS_DIED\x10\xf5\x02\x12\x32\n-ATOM_NETWORK_IP_REACHABILITY_MONITOR_REPORTED\x10\xf6\x02\x12#\n\x1e\x41TOM_SLOW_INPUT_EVENT_REPORTED\x10\xf7\x02\x12)\n$ATOM_ANR_OCCURRED_PROCESSING_STARTED\x10\xf8\x02\x12*\n%ATOM_APP_SEARCH_REMOVE_STATS_REPORTED\x10\xf9\x02\x12\x1e\n\x19\x41TOM_MEDIA_CODEC_REPORTED\x10\xfa\x02\x12/\n*ATOM_PERMISSION_USAGE_FRAGMENT_INTERACTION\x10\xfb\x02\x12(\n#ATOM_PERMISSION_DETAILS_INTERACTION\x10\xfc\x02\x12+\n&ATOM_PRIVACY_SENSOR_TOGGLE_INTERACTION\x10\xfd\x02\x12+\n&ATOM_PRIVACY_TOGGLE_DIALOG_INTERACTION\x10\xfe\x02\x12,\n\'ATOM_APP_SEARCH_OPTIMIZE_STATS_REPORTED\x10\xff\x02\x12.\n)ATOM_NON_A11Y_TOOL_SERVICE_WARNING_REPORT\x10\x80\x03\x12\"\n\x1d\x41TOM_APP_COMPAT_STATE_CHANGED\x10\x82\x03\x12\x33\n.ATOM_SIZE_COMPAT_RESTART_BUTTON_EVENT_REPORTED\x10\x83\x03\x12 \n\x1b\x41TOM_SPLITSCREEN_UI_CHANGED\x10\x84\x03\x12(\n#ATOM_NETWORK_DNS_HANDSHAKE_REPORTED\x10\x85\x03\x12%\n ATOM_BLUETOOTH_CODE_PATH_COUNTER\x10\x86\x03\x12.\n)ATOM_BLUETOOTH_LE_BATCH_SCAN_REPORT_DELAY\x10\x88\x03\x12\x30\n+ATOM_ACCESSIBILITY_FLOATING_MENU_UI_CHANGED\x10\x89\x03\x12.\n)ATOM_NEURALNETWORKS_COMPILATION_COMPLETED\x10\x8a\x03\x12,\n\'ATOM_NEURALNETWORKS_EXECUTION_COMPLETED\x10\x8b\x03\x12+\n&ATOM_NEURALNETWORKS_COMPILATION_FAILED\x10\x8c\x03\x12)\n$ATOM_NEURALNETWORKS_EXECUTION_FAILED\x10\x8d\x03\x12\x1c\n\x17\x41TOM_CONTEXT_HUB_BOOTED\x10\x8e\x03\x12\x1f\n\x1a\x41TOM_CONTEXT_HUB_RESTARTED\x10\x8f\x03\x12\x36\n1ATOM_CONTEXT_HUB_LOADED_NANOAPP_SNAPSHOT_REPORTED\x10\x90\x03\x12\'\n\"ATOM_CHRE_CODE_DOWNLOAD_TRANSACTED\x10\x91\x03\x12\x1c\n\x17\x41TOM_UWB_SESSION_INITED\x10\x92\x03\x12\x1c\n\x17\x41TOM_UWB_SESSION_CLOSED\x10\x93\x03\x12$\n\x1f\x41TOM_UWB_FIRST_RANGING_RECEIVED\x10\x94\x03\x12*\n%ATOM_UWB_RANGING_MEASUREMENT_RECEIVED\x10\x95\x03\x12\x31\n,ATOM_TEXT_CLASSIFIER_DOWNLOAD_WORK_SCHEDULED\x10\x96\x03\x12\x31\n,ATOM_TEXT_CLASSIFIER_DOWNLOAD_WORK_COMPLETED\x10\x97\x03\x12\x1b\n\x16\x41TOM_CLIPBOARD_CLEARED\x10\x98\x03\x12\x1f\n\x1a\x41TOM_VM_CREATION_REQUESTED\x10\x99\x03\x12*\n%ATOM_NEARBY_DEVICE_SCAN_STATE_CHANGED\x10\x9a\x03\x12%\n ATOM_APPLICATION_LOCALES_CHANGED\x10\x9c\x03\x12\x30\n+ATOM_MEDIAMETRICS_AUDIOTRACKSTATUS_REPORTED\x10\x9d\x03\x12&\n!ATOM_FOLD_STATE_DURATION_REPORTED\x10\x9e\x03\x12>\n9ATOM_LOCATION_TIME_ZONE_PROVIDER_CONTROLLER_STATE_CHANGED\x10\x9f\x03\x12#\n\x1e\x41TOM_DISPLAY_HBM_STATE_CHANGED\x10\xa0\x03\x12(\n#ATOM_DISPLAY_HBM_BRIGHTNESS_CHANGED\x10\xa1\x03\x12,\n\'ATOM_PERSISTENT_URI_PERMISSIONS_FLUSHED\x10\xa2\x03\x12\x35\n0ATOM_EARLY_BOOT_COMP_OS_ARTIFACTS_CHECK_REPORTED\x10\xa3\x03\x12 \n\x1b\x41TOM_VBMETA_DIGEST_REPORTED\x10\xa4\x03\x12\x1c\n\x17\x41TOM_APEX_INFO_GATHERED\x10\xa5\x03\x12\x1b\n\x16\x41TOM_PVM_INFO_GATHERED\x10\xa6\x03\x12%\n ATOM_WEAR_SETTINGS_UI_INTERACTED\x10\xa7\x03\x12&\n!ATOM_TRACING_SERVICE_REPORT_EVENT\x10\xa8\x03\x12\x31\n,ATOM_MEDIAMETRICS_AUDIORECORDSTATUS_REPORTED\x10\xa9\x03\x12\x1a\n\x15\x41TOM_LAUNCHER_LATENCY\x10\xaa\x03\x12\x1f\n\x1a\x41TOM_DROPBOX_ENTRY_DROPPED\x10\xab\x03\x12&\n!ATOM_WIFI_P2P_CONNECTION_REPORTED\x10\xac\x03\x12\x1c\n\x17\x41TOM_GAME_STATE_CHANGED\x10\xad\x03\x12+\n&ATOM_HOTWORD_DETECTOR_CREATE_REQUESTED\x10\xae\x03\x12\x38\n3ATOM_HOTWORD_DETECTION_SERVICE_INIT_RESULT_REPORTED\x10\xaf\x03\x12-\n(ATOM_HOTWORD_DETECTION_SERVICE_RESTARTED\x10\xb0\x03\x12.\n)ATOM_HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED\x10\xb1\x03\x12!\n\x1c\x41TOM_HOTWORD_DETECTOR_EVENTS\x10\xb2\x03\x12>\n9ATOM_BOOT_COMPLETED_BROADCAST_COMPLETION_LATENCY_REPORTED\x10\xb5\x03\x12\x30\n+ATOM_CONTACTS_INDEXER_UPDATE_STATS_REPORTED\x10\xb8\x03\x12*\n%ATOM_APP_BACKGROUND_RESTRICTIONS_INFO\x10\xb9\x03\x12/\n*ATOM_MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED\x10\xba\x03\x12\x33\n.ATOM_MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED\x10\xbb\x03\x12\x35\n0ATOM_PERMISSION_REMINDER_NOTIFICATION_INTERACTED\x10\xbc\x03\x12\x30\n+ATOM_RECENT_PERMISSION_DECISIONS_INTERACTED\x10\xbd\x03\x12%\n ATOM_GNSS_PSDS_DOWNLOAD_REPORTED\x10\xbe\x03\x12.\n)ATOM_LE_AUDIO_CONNECTION_SESSION_REPORTED\x10\xbf\x03\x12-\n(ATOM_LE_AUDIO_BROADCAST_SESSION_REPORTED\x10\xc0\x03\x12!\n\x1c\x41TOM_DREAM_UI_EVENT_REPORTED\x10\xc1\x03\x12%\n ATOM_TASK_MANAGER_EVENT_REPORTED\x10\xc2\x03\x12 \n\x1b\x41TOM_CDM_ASSOCIATION_ACTION\x10\xc3\x03\x12\x46\nAATOM_MAGNIFICATION_TRIPLE_TAP_AND_HOLD_ACTIVATED_SESSION_REPORTED\x10\xc4\x03\x12\x46\nAATOM_MAGNIFICATION_FOLLOW_TYPING_FOCUS_ACTIVATED_SESSION_REPORTED\x10\xc5\x03\x12\x34\n/ATOM_ACCESSIBILITY_TEXT_READING_OPTIONS_CHANGED\x10\xc6\x03\x12+\n&ATOM_WIFI_SETUP_FAILURE_CRASH_REPORTED\x10\xc7\x03\x12#\n\x1e\x41TOM_UWB_DEVICE_ERROR_REPORTED\x10\xc8\x03\x12(\n#ATOM_ISOLATED_COMPILATION_SCHEDULED\x10\xc9\x03\x12$\n\x1f\x41TOM_ISOLATED_COMPILATION_ENDED\x10\xca\x03\x12\x36\n1ATOM_ONS_OPPORTUNISTIC_ESIM_PROVISIONING_COMPLETE\x10\xcb\x03\x12-\n(ATOM_SYSTEM_SERVER_PRE_WATCHDOG_OCCURRED\x10\xcc\x03\x12$\n\x1f\x41TOM_TELEPHONY_ANOMALY_DETECTED\x10\xcd\x03\x12$\n\x1f\x41TOM_LETTERBOX_POSITION_CHANGED\x10\xce\x03\x12)\n$ATOM_REMOTE_KEY_PROVISIONING_ATTEMPT\x10\xcf\x03\x12.\n)ATOM_REMOTE_KEY_PROVISIONING_NETWORK_INFO\x10\xd0\x03\x12(\n#ATOM_REMOTE_KEY_PROVISIONING_TIMING\x10\xd1\x03\x12+\n&ATOM_MEDIAOUTPUT_OP_INTERACTION_REPORT\x10\xd2\x03\x12!\n\x1c\x41TOM_SYNC_EXEMPTION_OCCURRED\x10\xd4\x03\x12.\n)ATOM_AUTOFILL_PRESENTATION_EVENT_REPORTED\x10\xd5\x03\x12\x1c\n\x17\x41TOM_DOCK_STATE_CHANGED\x10\xd6\x03\x12\'\n\"ATOM_SAFETY_SOURCE_STATE_COLLECTED\x10\xd7\x03\x12-\n(ATOM_SAFETY_CENTER_SYSTEM_EVENT_REPORTED\x10\xd8\x03\x12,\n\'ATOM_SAFETY_CENTER_INTERACTION_REPORTED\x10\xd9\x03\x12+\n&ATOM_SETTINGS_PROVIDER_SETTING_CHANGED\x10\xda\x03\x12+\n&ATOM_BROADCAST_DELIVERY_EVENT_REPORTED\x10\xdb\x03\x12(\n#ATOM_SERVICE_REQUEST_EVENT_REPORTED\x10\xdc\x03\x12-\n(ATOM_PROVIDER_ACQUISITION_EVENT_REPORTED\x10\xdd\x03\x12(\n#ATOM_BLUETOOTH_DEVICE_NAME_REPORTED\x10\xde\x03\x12\x1b\n\x16\x41TOM_CB_CONFIG_UPDATED\x10\xdf\x03\x12\"\n\x1d\x41TOM_CB_MODULE_ERROR_REPORTED\x10\xe0\x03\x12$\n\x1f\x41TOM_CB_SERVICE_FEATURE_CHANGED\x10\xe1\x03\x12%\n ATOM_CB_RECEIVER_FEATURE_CHANGED\x10\xe2\x03\x12\x31\n,ATOM_PRIVACY_SIGNAL_NOTIFICATION_INTERACTION\x10\xe4\x03\x12/\n*ATOM_PRIVACY_SIGNAL_ISSUE_CARD_INTERACTION\x10\xe5\x03\x12%\n ATOM_PRIVACY_SIGNALS_JOB_FAILURE\x10\xe6\x03\x12\x1c\n\x17\x41TOM_VIBRATION_REPORTED\x10\xe7\x03\x12\x1b\n\x16\x41TOM_UWB_RANGING_START\x10\xe9\x03\x12\x1a\n\x15\x41TOM_APP_COMPACTED_V2\x10\xeb\x03\x12$\n\x1f\x41TOM_DISPLAY_BRIGHTNESS_CHANGED\x10\xee\x03\x12!\n\x1c\x41TOM_ACTIVITY_ACTION_BLOCKED\x10\xef\x03\x12-\n(ATOM_NETWORK_DNS_SERVER_SUPPORT_REPORTED\x10\xf8\x03\x12\x13\n\x0e\x41TOM_VM_BOOTED\x10\xf9\x03\x12\x13\n\x0e\x41TOM_VM_EXITED\x10\xfa\x03\x12+\n&ATOM_AMBIENT_BRIGHTNESS_STATS_REPORTED\x10\xfb\x03\x12\x37\n2ATOM_MEDIAMETRICS_SPATIALIZERCAPABILITIES_REPORTED\x10\xfc\x03\x12\x38\n3ATOM_MEDIAMETRICS_SPATIALIZERDEVICEENABLED_REPORTED\x10\xfd\x03\x12\x38\n3ATOM_MEDIAMETRICS_HEADTRACKERDEVICEENABLED_REPORTED\x10\xfe\x03\x12:\n5ATOM_MEDIAMETRICS_HEADTRACKERDEVICESUPPORTED_REPORTED\x10\xff\x03\x12#\n\x1e\x41TOM_HEARING_AID_INFO_REPORTED\x10\x81\x04\x12,\n\'ATOM_DEVICE_WIDE_JOB_CONSTRAINT_CHANGED\x10\x82\x04\x12\x1e\n\x19\x41TOM_AMBIENT_MODE_CHANGED\x10\x83\x04\x12\x1e\n\x19\x41TOM_ANR_LATENCY_REPORTED\x10\x84\x04\x12\x1b\n\x16\x41TOM_RESOURCE_API_INFO\x10\x85\x04\x12(\n#ATOM_SYSTEM_DEFAULT_NETWORK_CHANGED\x10\x86\x04\x12/\n*ATOM_IWLAN_SETUP_DATA_CALL_RESULT_REPORTED\x10\x87\x04\x12\x30\n+ATOM_IWLAN_PDN_DISCONNECTED_REASON_REPORTED\x10\x88\x04\x12(\n#ATOM_AIRPLANE_MODE_SESSION_REPORTED\x10\x89\x04\x12 \n\x1b\x41TOM_VM_CPU_STATUS_REPORTED\x10\x8a\x04\x12 \n\x1b\x41TOM_VM_MEM_STATUS_REPORTED\x10\x8b\x04\x12/\n*ATOM_PACKAGE_INSTALLATION_SESSION_REPORTED\x10\x8c\x04\x12&\n!ATOM_DEFAULT_NETWORK_REMATCH_INFO\x10\x8d\x04\x12\'\n\"ATOM_NETWORK_SELECTION_PERFORMANCE\x10\x8e\x04\x12\x1e\n\x19\x41TOM_NETWORK_NSD_REPORTED\x10\x8f\x04\x12\x31\n,ATOM_BLUETOOTH_DISCONNECTION_REASON_REPORTED\x10\x91\x04\x12+\n&ATOM_BLUETOOTH_LOCAL_VERSIONS_REPORTED\x10\x92\x04\x12\x36\n1ATOM_BLUETOOTH_REMOTE_SUPPORTED_FEATURES_REPORTED\x10\x93\x04\x12\x35\n0ATOM_BLUETOOTH_LOCAL_SUPPORTED_FEATURES_REPORTED\x10\x94\x04\x12!\n\x1c\x41TOM_BLUETOOTH_GATT_APP_INFO\x10\x95\x04\x12*\n%ATOM_BRIGHTNESS_CONFIGURATION_UPDATED\x10\x96\x04\x12-\n(ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_LAUNCHED\x10\x9a\x04\x12-\n(ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_FINISHED\x10\x9b\x04\x12\x38\n3ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_CONNECTION_REPORTED\x10\x9c\x04\x12:\n5ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_DEVICE_SCAN_TRIGGERED\x10\x9d\x04\x12>\n9ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_FIRST_DEVICE_SCAN_LATENCY\x10\x9e\x04\x12;\n6ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_CONNECT_DEVICE_LATENCY\x10\x9f\x04\x12+\n&ATOM_PACKAGE_MANAGER_SNAPSHOT_REPORTED\x10\xa0\x04\x12:\n5ATOM_PACKAGE_MANAGER_APPS_FILTER_CACHE_BUILD_REPORTED\x10\xa1\x04\x12;\n6ATOM_PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED\x10\xa2\x04\x12#\n\x1e\x41TOM_LAUNCHER_IMPRESSION_EVENT\x10\xa3\x04\x12=\n8ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_ALL_DEVICES_SCAN_LATENCY\x10\xa5\x04\x12\x1e\n\x19\x41TOM_WS_WATCH_FACE_EDITED\x10\xa7\x04\x12\x30\n+ATOM_WS_WATCH_FACE_FAVORITE_ACTION_REPORTED\x10\xa8\x04\x12+\n&ATOM_WS_WATCH_FACE_SET_ACTION_REPORTED\x10\xa9\x04\x12)\n$ATOM_PACKAGE_UNINSTALLATION_REPORTED\x10\xaa\x04\x12\x1b\n\x16\x41TOM_GAME_MODE_CHANGED\x10\xab\x04\x12)\n$ATOM_GAME_MODE_CONFIGURATION_CHANGED\x10\xac\x04\x12$\n\x1f\x41TOM_BEDTIME_MODE_STATE_CHANGED\x10\xad\x04\x12%\n ATOM_NETWORK_SLICE_SESSION_ENDED\x10\xae\x04\x12\x31\n,ATOM_NETWORK_SLICE_DAILY_DATA_USAGE_REPORTED\x10\xaf\x04\x12\x1f\n\x1a\x41TOM_NFC_TAG_TYPE_OCCURRED\x10\xb0\x04\x12#\n\x1e\x41TOM_NFC_AID_CONFLICT_OCCURRED\x10\xb1\x04\x12&\n!ATOM_NFC_READER_CONFLICT_OCCURRED\x10\xb2\x04\x12\x1e\n\x19\x41TOM_WS_TILE_LIST_CHANGED\x10\xb3\x04\x12.\n)ATOM_GET_TYPE_ACCESSED_WITHOUT_PERMISSION\x10\xb4\x04\x12*\n%ATOM_MOBILE_BUNDLED_APP_INFO_GATHERED\x10\xb6\x04\x12\x30\n+ATOM_WS_WATCH_FACE_COMPLICATION_SET_CHANGED\x10\xb7\x04\x12\x1b\n\x16\x41TOM_MEDIA_DRM_CREATED\x10\xb8\x04\x12\x1b\n\x16\x41TOM_MEDIA_DRM_ERRORED\x10\xb9\x04\x12\"\n\x1d\x41TOM_MEDIA_DRM_SESSION_OPENED\x10\xba\x04\x12\"\n\x1d\x41TOM_MEDIA_DRM_SESSION_CLOSED\x10\xbb\x04\x12\"\n\x1d\x41TOM_USER_SELECTED_RESOLUTION\x10\xbc\x04\x12&\n!ATOM_UNSAFE_INTENT_EVENT_REPORTED\x10\xbd\x04\x12+\n&ATOM_PERFORMANCE_HINT_SESSION_REPORTED\x10\xbe\x04\x12\x31\n,ATOM_MEDIAMETRICS_MIDI_DEVICE_CLOSE_REPORTED\x10\xc0\x04\x12\"\n\x1d\x41TOM_BIOMETRIC_TOUCH_REPORTED\x10\xc1\x04\x12-\n(ATOM_HOTWORD_AUDIO_EGRESS_EVENT_REPORTED\x10\xc2\x04\x12(\n#ATOM_LOCATION_ENABLED_STATE_CHANGED\x10\xc4\x04\x12\x1e\n\x19\x41TOM_IME_REQUEST_FINISHED\x10\xc5\x04\x12*\n%ATOM_USB_COMPLIANCE_WARNINGS_REPORTED\x10\xc6\x04\x12\'\n\"ATOM_APP_SUPPORTED_LOCALES_CHANGED\x10\xc7\x04\x12\x31\n,ATOM_MEDIA_PROVIDER_VOLUME_RECOVERY_REPORTED\x10\xca\x04\x12(\n#ATOM_BIOMETRIC_PROPERTIES_COLLECTED\x10\xcb\x04\x12\"\n\x1d\x41TOM_KERNEL_WAKEUP_ATTRIBUTED\x10\xcc\x04\x12!\n\x1c\x41TOM_SCREEN_STATE_CHANGED_V2\x10\xcd\x04\x12#\n\x1e\x41TOM_WS_BACKUP_ACTION_REPORTED\x10\xce\x04\x12$\n\x1f\x41TOM_WS_RESTORE_ACTION_REPORTED\x10\xcf\x04\x12*\n%ATOM_DEVICE_LOG_ACCESS_EVENT_REPORTED\x10\xd0\x04\x12\x1f\n\x1a\x41TOM_MEDIA_SESSION_UPDATED\x10\xd2\x04\x12!\n\x1c\x41TOM_WEAR_OOBE_STATE_CHANGED\x10\xd3\x04\x12!\n\x1c\x41TOM_WS_NOTIFICATION_UPDATED\x10\xd4\x04\x12\x39\n4ATOM_NETWORK_VALIDATION_FAILURE_STATS_DAILY_REPORTED\x10\xd9\x04\x12 \n\x1b\x41TOM_WS_COMPLICATION_TAPPED\x10\xda\x04\x12\"\n\x1d\x41TOM_WS_NOTIFICATION_BLOCKING\x10\x8c\x06\x12,\n\'ATOM_WS_NOTIFICATION_BRIDGEMODE_UPDATED\x10\xb6\x06\x12,\n\'ATOM_WS_NOTIFICATION_DISMISSAL_ACTIONED\x10\xb7\x06\x12\"\n\x1d\x41TOM_WS_NOTIFICATION_ACTIONED\x10\xb8\x06\x12!\n\x1c\x41TOM_WS_NOTIFICATION_LATENCY\x10\xf0\x06\x12\x1d\n\x18\x41TOM_WIFI_BYTES_TRANSFER\x10\x90N\x12&\n!ATOM_WIFI_BYTES_TRANSFER_BY_FG_BG\x10\x91N\x12\x1f\n\x1a\x41TOM_MOBILE_BYTES_TRANSFER\x10\x92N\x12(\n#ATOM_MOBILE_BYTES_TRANSFER_BY_FG_BG\x10\x93N\x12\"\n\x1d\x41TOM_BLUETOOTH_BYTES_TRANSFER\x10\x96N\x12\x19\n\x14\x41TOM_KERNEL_WAKELOCK\x10\x94N\x12\x1f\n\x1a\x41TOM_SUBSYSTEM_SLEEP_STATE\x10\x95N\x12\x1a\n\x15\x41TOM_CPU_TIME_PER_UID\x10\x99N\x12\x1f\n\x1a\x41TOM_CPU_TIME_PER_UID_FREQ\x10\x9aN\x12\x1c\n\x17\x41TOM_WIFI_ACTIVITY_INFO\x10\x9bN\x12\x1d\n\x18\x41TOM_MODEM_ACTIVITY_INFO\x10\x9cN\x12!\n\x1c\x41TOM_BLUETOOTH_ACTIVITY_INFO\x10\x97N\x12\x1e\n\x19\x41TOM_PROCESS_MEMORY_STATE\x10\x9dN\x12!\n\x1c\x41TOM_SYSTEM_ELAPSED_REALTIME\x10\x9eN\x12\x17\n\x12\x41TOM_SYSTEM_UPTIME\x10\x9fN\x12\x19\n\x14\x41TOM_CPU_ACTIVE_TIME\x10\xa0N\x12\x1a\n\x15\x41TOM_CPU_CLUSTER_TIME\x10\xa1N\x12\x14\n\x0f\x41TOM_DISK_SPACE\x10\xa2N\x12$\n\x1f\x41TOM_REMAINING_BATTERY_CAPACITY\x10\xa3N\x12\x1f\n\x1a\x41TOM_FULL_BATTERY_CAPACITY\x10\xa4N\x12\x15\n\x10\x41TOM_TEMPERATURE\x10\xa5N\x12\x16\n\x11\x41TOM_BINDER_CALLS\x10\xa6N\x12!\n\x1c\x41TOM_BINDER_CALLS_EXCEPTIONS\x10\xa7N\x12\x16\n\x11\x41TOM_LOOPER_STATS\x10\xa8N\x12\x14\n\x0f\x41TOM_DISK_STATS\x10\xa9N\x12\x19\n\x14\x41TOM_DIRECTORY_USAGE\x10\xaaN\x12\x12\n\rATOM_APP_SIZE\x10\xabN\x12\x17\n\x12\x41TOM_CATEGORY_SIZE\x10\xacN\x12\x14\n\x0f\x41TOM_PROC_STATS\x10\xadN\x12\x19\n\x14\x41TOM_BATTERY_VOLTAGE\x10\xaeN\x12#\n\x1e\x41TOM_NUM_FINGERPRINTS_ENROLLED\x10\xafN\x12\x11\n\x0c\x41TOM_DISK_IO\x10\xb0N\x12\x17\n\x12\x41TOM_POWER_PROFILE\x10\xb1N\x12\x1d\n\x18\x41TOM_PROC_STATS_PKG_PROC\x10\xb2N\x12\x1a\n\x15\x41TOM_PROCESS_CPU_TIME\x10\xb3N\x12\"\n\x1d\x41TOM_CPU_TIME_PER_THREAD_FREQ\x10\xb5N\x12%\n ATOM_ON_DEVICE_POWER_MEASUREMENT\x10\xb6N\x12%\n ATOM_DEVICE_CALCULATED_POWER_USE\x10\xb7N\x12(\n#ATOM_PROCESS_MEMORY_HIGH_WATER_MARK\x10\xbaN\x12\x17\n\x12\x41TOM_BATTERY_LEVEL\x10\xbbN\x12\x1b\n\x16\x41TOM_BUILD_INFORMATION\x10\xbcN\x12\x1d\n\x18\x41TOM_BATTERY_CYCLE_COUNT\x10\xbdN\x12\x1d\n\x18\x41TOM_DEBUG_ELAPSED_CLOCK\x10\xbeN\x12%\n ATOM_DEBUG_FAILING_ELAPSED_CLOCK\x10\xbfN\x12\x1c\n\x17\x41TOM_NUM_FACES_ENROLLED\x10\xc0N\x12\x15\n\x10\x41TOM_ROLE_HOLDER\x10\xc1N\x12$\n\x1f\x41TOM_DANGEROUS_PERMISSION_STATE\x10\xc2N\x12\x14\n\x0f\x41TOM_TRAIN_INFO\x10\xc3N\x12\x1d\n\x18\x41TOM_TIME_ZONE_DATA_INFO\x10\xc4N\x12\x1f\n\x1a\x41TOM_EXTERNAL_STORAGE_INFO\x10\xc5N\x12\x1f\n\x1a\x41TOM_GPU_STATS_GLOBAL_INFO\x10\xc6N\x12\x1c\n\x17\x41TOM_GPU_STATS_APP_INFO\x10\xc7N\x12\x1e\n\x19\x41TOM_SYSTEM_ION_HEAP_SIZE\x10\xc8N\x12\'\n\"ATOM_APPS_ON_EXTERNAL_STORAGE_INFO\x10\xc9N\x12\x17\n\x12\x41TOM_FACE_SETTINGS\x10\xcaN\x12\x18\n\x13\x41TOM_COOLING_DEVICE\x10\xcbN\x12\x11\n\x0c\x41TOM_APP_OPS\x10\xccN\x12&\n!ATOM_PROCESS_SYSTEM_ION_HEAP_SIZE\x10\xcdN\x12*\n%ATOM_SURFACEFLINGER_STATS_GLOBAL_INFO\x10\xceN\x12)\n$ATOM_SURFACEFLINGER_STATS_LAYER_INFO\x10\xcfN\x12!\n\x1c\x41TOM_PROCESS_MEMORY_SNAPSHOT\x10\xd0N\x12\x1a\n\x15\x41TOM_VMS_CLIENT_STATS\x10\xd1N\x12#\n\x1e\x41TOM_NOTIFICATION_REMOTE_VIEWS\x10\xd2N\x12,\n\'ATOM_DANGEROUS_PERMISSION_STATE_SAMPLED\x10\xd3N\x12\x18\n\x13\x41TOM_GRAPHICS_STATS\x10\xd4N\x12\x1f\n\x1a\x41TOM_RUNTIME_APP_OP_ACCESS\x10\xd5N\x12\x17\n\x12\x41TOM_ION_HEAP_SIZE\x10\xd6N\x12*\n%ATOM_PACKAGE_NOTIFICATION_PREFERENCES\x10\xd7N\x12\x32\n-ATOM_PACKAGE_NOTIFICATION_CHANNEL_PREFERENCES\x10\xd8N\x12\x38\n3ATOM_PACKAGE_NOTIFICATION_CHANNEL_GROUP_PREFERENCES\x10\xd9N\x12\x14\n\x0f\x41TOM_GNSS_STATS\x10\xdaN\x12\x1c\n\x17\x41TOM_ATTRIBUTED_APP_OPS\x10\xdbN\x12\x1c\n\x17\x41TOM_VOICE_CALL_SESSION\x10\xdcN\x12\x1e\n\x19\x41TOM_VOICE_CALL_RAT_USAGE\x10\xddN\x12\x18\n\x13\x41TOM_SIM_SLOT_STATE\x10\xdeN\x12\'\n\"ATOM_SUPPORTED_RADIO_ACCESS_FAMILY\x10\xdfN\x12\x1a\n\x15\x41TOM_SETTING_SNAPSHOT\x10\xe0N\x12\x13\n\x0e\x41TOM_BLOB_INFO\x10\xe1N\x12#\n\x1e\x41TOM_DATA_USAGE_BYTES_TRANSFER\x10\xe2N\x12+\n&ATOM_BYTES_TRANSFER_BY_TAG_AND_METERED\x10\xe3N\x12\x17\n\x12\x41TOM_DND_MODE_RULE\x10\xe4N\x12/\n*ATOM_GENERAL_EXTERNAL_STORAGE_ACCESS_STATS\x10\xe5N\x12\x16\n\x11\x41TOM_INCOMING_SMS\x10\xe6N\x12\x16\n\x11\x41TOM_OUTGOING_SMS\x10\xe7N\x12\"\n\x1d\x41TOM_CARRIER_ID_TABLE_VERSION\x10\xe8N\x12\x1b\n\x16\x41TOM_DATA_CALL_SESSION\x10\xe9N\x12 \n\x1b\x41TOM_CELLULAR_SERVICE_STATE\x10\xeaN\x12&\n!ATOM_CELLULAR_DATA_SERVICE_SWITCH\x10\xebN\x12\x17\n\x12\x41TOM_SYSTEM_MEMORY\x10\xecN\x12&\n!ATOM_IMS_REGISTRATION_TERMINATION\x10\xedN\x12 \n\x1b\x41TOM_IMS_REGISTRATION_STATS\x10\xeeN\x12#\n\x1e\x41TOM_CPU_TIME_PER_CLUSTER_FREQ\x10\xefN\x12$\n\x1f\x41TOM_CPU_CYCLES_PER_UID_CLUSTER\x10\xf0N\x12\x1d\n\x18\x41TOM_DEVICE_ROTATED_DATA\x10\xf1N\x12-\n(ATOM_CPU_CYCLES_PER_THREAD_GROUP_CLUSTER\x10\xf2N\x12!\n\x1c\x41TOM_MEDIA_DRM_ACTIVITY_INFO\x10\xf3N\x12$\n\x1f\x41TOM_OEM_MANAGED_BYTES_TRANSFER\x10\xf4N\x12\x1a\n\x15\x41TOM_GNSS_POWER_STATS\x10\xf5N\x12\"\n\x1d\x41TOM_TIME_ZONE_DETECTOR_STATE\x10\xf6N\x12!\n\x1c\x41TOM_KEYSTORE2_STORAGE_STATS\x10\xf7N\x12\x18\n\x13\x41TOM_RKP_POOL_STATS\x10\xf8N\x12\x1f\n\x1a\x41TOM_PROCESS_DMABUF_MEMORY\x10\xf9N\x12\x1c\n\x17\x41TOM_PENDING_ALARM_INFO\x10\xfaN\x12$\n\x1f\x41TOM_USER_LEVEL_HIBERNATED_APPS\x10\xfbN\x12\"\n\x1d\x41TOM_LAUNCHER_LAYOUT_SNAPSHOT\x10\xfcN\x12 \n\x1b\x41TOM_GLOBAL_HIBERNATED_APPS\x10\xfdN\x12$\n\x1f\x41TOM_INPUT_EVENT_LATENCY_SKETCH\x10\xfeN\x12*\n%ATOM_BATTERY_USAGE_STATS_BEFORE_RESET\x10\xffN\x12)\n$ATOM_BATTERY_USAGE_STATS_SINCE_RESET\x10\x80O\x12\x43\n>ATOM_BATTERY_USAGE_STATS_SINCE_RESET_USING_POWER_PROFILE_MODEL\x10\x81O\x12\'\n\"ATOM_INSTALLED_INCREMENTAL_PACKAGE\x10\x82O\x12$\n\x1f\x41TOM_TELEPHONY_NETWORK_REQUESTS\x10\x83O\x12!\n\x1c\x41TOM_APP_SEARCH_STORAGE_INFO\x10\x84O\x12\x10\n\x0b\x41TOM_VMSTAT\x10\x85O\x12\x32\n-ATOM_KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO\x10\x86O\x12/\n*ATOM_KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO\x10\x87O\x12<\n7ATOM_KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO\x10\x88O\x12&\n!ATOM_KEYSTORE2_ATOM_WITH_OVERFLOW\x10\x89O\x12=\n8ATOM_KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO\x10\x8aO\x12\x33\n.ATOM_KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO\x10\x8bO\x12\x19\n\x14\x41TOM_RKP_ERROR_STATS\x10\x8cO\x12\x1f\n\x1a\x41TOM_KEYSTORE2_CRASH_STATS\x10\x8dO\x12\x1a\n\x15\x41TOM_VENDOR_APEX_INFO\x10\x8eO\x12&\n!ATOM_ACCESSIBILITY_SHORTCUT_STATS\x10\x8fO\x12+\n&ATOM_ACCESSIBILITY_FLOATING_MENU_STATS\x10\x90O\x12&\n!ATOM_DATA_USAGE_BYTES_TRANSFER_V2\x10\x91O\x12\x1c\n\x17\x41TOM_MEDIA_CAPABILITIES\x10\x92O\x12.\n)ATOM_CAR_WATCHDOG_SYSTEM_IO_USAGE_SUMMARY\x10\x93O\x12+\n&ATOM_CAR_WATCHDOG_UID_IO_USAGE_SUMMARY\x10\x94O\x12,\n\'ATOM_IMS_REGISTRATION_FEATURE_TAG_STATS\x10\x95O\x12\'\n\"ATOM_RCS_CLIENT_PROVISIONING_STATS\x10\x96O\x12$\n\x1f\x41TOM_RCS_ACS_PROVISIONING_STATS\x10\x97O\x12\x1c\n\x17\x41TOM_SIP_DELEGATE_STATS\x10\x98O\x12)\n$ATOM_SIP_TRANSPORT_FEATURE_TAG_STATS\x10\x99O\x12\x1e\n\x19\x41TOM_SIP_MESSAGE_RESPONSE\x10\x9aO\x12\x1f\n\x1a\x41TOM_SIP_TRANSPORT_SESSION\x10\x9bO\x12-\n(ATOM_IMS_DEDICATED_BEARER_LISTENER_EVENT\x10\x9cO\x12$\n\x1f\x41TOM_IMS_DEDICATED_BEARER_EVENT\x10\x9dO\x12-\n(ATOM_IMS_REGISTRATION_SERVICE_DESC_STATS\x10\x9eO\x12\x19\n\x14\x41TOM_UCE_EVENT_STATS\x10\x9fO\x12\x1f\n\x1a\x41TOM_PRESENCE_NOTIFY_EVENT\x10\xa0O\x12\x13\n\x0e\x41TOM_GBA_EVENT\x10\xa1O\x12\x18\n\x13\x41TOM_PER_SIM_STATUS\x10\xa2O\x12\x1a\n\x15\x41TOM_GPU_WORK_PER_UID\x10\xa3O\x12\x37\n2ATOM_PERSISTENT_URI_PERMISSIONS_AMOUNT_PER_PACKAGE\x10\xa4O\x12\x1f\n\x1a\x41TOM_SIGNED_PARTITION_INFO\x10\xa5O\x12\'\n\"ATOM_PINNED_FILE_SIZES_PER_PACKAGE\x10\xa6O\x12%\n ATOM_PENDING_INTENTS_PER_PACKAGE\x10\xa7O\x12\x13\n\x0e\x41TOM_USER_INFO\x10\xa8O\x12\'\n\"ATOM_TELEPHONY_NETWORK_REQUESTS_V2\x10\xa9O\x12%\n ATOM_DEVICE_TELEPHONY_PROPERTIES\x10\xaaO\x12.\n)ATOM_REMOTE_KEY_PROVISIONING_ERROR_COUNTS\x10\xabO\x12\x16\n\x11\x41TOM_SAFETY_STATE\x10\xacO\x12\x16\n\x11\x41TOM_INCOMING_MMS\x10\xadO\x12\x16\n\x11\x41TOM_OUTGOING_MMS\x10\xaeO\x12\x19\n\x14\x41TOM_MULTI_USER_INFO\x10\xb0O\x12\x1e\n\x19\x41TOM_NETWORK_BPF_MAP_INFO\x10\xb1O\x12!\n\x1c\x41TOM_OUTGOING_SHORT_CODE_SMS\x10\xb2O\x12#\n\x1e\x41TOM_CONNECTIVITY_STATE_SAMPLE\x10\xb3O\x12\x30\n+ATOM_NETWORK_SELECTION_REMATCH_REASONS_INFO\x10\xb4O\x12\x18\n\x13\x41TOM_GAME_MODE_INFO\x10\xb5O\x12!\n\x1c\x41TOM_GAME_MODE_CONFIGURATION\x10\xb6O\x12\x1c\n\x17\x41TOM_GAME_MODE_LISTENER\x10\xb7O\x12%\n ATOM_NETWORK_SLICE_REQUEST_COUNT\x10\xb8O\x12\x1a\n\x15\x41TOM_WS_TILE_SNAPSHOT\x10\xb9O\x12\x38\n3ATOM_WS_ACTIVE_WATCH_FACE_COMPLICATION_SET_SNAPSHOT\x10\xbaO\x12\x17\n\x12\x41TOM_PROCESS_STATE\x10\xbbO\x12\x1d\n\x18\x41TOM_PROCESS_ASSOCIATION\x10\xbcO\x12$\n\x1f\x41TOM_ADPF_SYSTEM_COMPONENT_INFO\x10\xbdO\x12!\n\x1c\x41TOM_NOTIFICATION_MEMORY_USE\x10\xbeO\x12\x1a\n\x15\x41TOM_HDR_CAPABILITIES\x10\xbfO\x12/\n*ATOM_WS_FAVOURITE_WATCH_FACE_LIST_SNAPSHOT\x10\xc0O\x12!\n\x1c\x41TOM_WIFI_AWARE_NDP_REPORTED\x10\xfe\x04\x12$\n\x1f\x41TOM_WIFI_AWARE_ATTACH_REPORTED\x10\xff\x04\x12&\n!ATOM_WIFI_SELF_RECOVERY_TRIGGERED\x10\x95\x05\x12\x19\n\x14\x41TOM_SOFT_AP_STARTED\x10\xa8\x05\x12\x19\n\x14\x41TOM_SOFT_AP_STOPPED\x10\xa9\x05\x12\x1c\n\x17\x41TOM_WIFI_LOCK_RELEASED\x10\xaf\x05\x12\x1f\n\x1a\x41TOM_WIFI_LOCK_DEACTIVATED\x10\xb0\x05\x12\x1b\n\x16\x41TOM_WIFI_CONFIG_SAVED\x10\xb1\x05\x12+\n&ATOM_WIFI_AWARE_RESOURCE_USING_CHANGED\x10\xb2\x05\x12#\n\x1e\x41TOM_WIFI_AWARE_HAL_API_CALLED\x10\xb3\x05\x12*\n%ATOM_WIFI_LOCAL_ONLY_REQUEST_RECEIVED\x10\xb4\x05\x12\x30\n+ATOM_WIFI_LOCAL_ONLY_REQUEST_SCAN_TRIGGERED\x10\xb5\x05\x12#\n\x1e\x41TOM_WIFI_THREAD_TASK_EXECUTED\x10\xb6\x05\x12\x1c\n\x17\x41TOM_WIFI_STATE_CHANGED\x10\xbc\x05\x12\x1a\n\x15\x41TOM_PNO_SCAN_STARTED\x10\xcf\x05\x12\x1a\n\x15\x41TOM_PNO_SCAN_STOPPED\x10\xd0\x05\x12#\n\x1e\x41TOM_WIFI_IS_UNUSABLE_REPORTED\x10\xd2\x05\x12\'\n\"ATOM_WIFI_AP_CAPABILITIES_REPORTED\x10\xd3\x05\x12\x1f\n\x1a\x41TOM_SOFT_AP_STATE_CHANGED\x10\xa5\x06\x12+\n&ATOM_SCORER_PREDICTION_RESULT_REPORTED\x10\xf4\x06\x12!\n\x1c\x41TOM_WIFI_AWARE_CAPABILITIES\x10\xceO\x12\x1a\n\x15\x41TOM_WIFI_MODULE_INFO\x10\xd1O\x12\x1b\n\x16\x41TOM_WIFI_SETTING_INFO\x10\xd2O\x12#\n\x1e\x41TOM_WIFI_COMPLEX_SETTING_INFO\x10\xd3O\x12&\n!ATOM_WIFI_CONFIGURED_NETWORK_INFO\x10\xd6O\x12 \n\x1b\x41TOM_WEAR_POWER_MENU_OPENED\x10\xdb\x05\x12\x1f\n\x1a\x41TOM_WEAR_ASSISTANT_OPENED\x10\xf3\x05\x12%\n ATOM_FIRST_OVERLAY_STATE_CHANGED\x10\x95\x07\x12\x1e\n\x19\x41TOM_WS_WEAR_TIME_SESSION\x10\xe2\x04\x12*\n%ATOM_WS_INCOMING_CALL_ACTION_REPORTED\x10\xf2\x04\x12(\n#ATOM_WS_CALL_DISCONNECTION_REPORTED\x10\xf3\x04\x12#\n\x1e\x41TOM_WS_CALL_DURATION_REPORTED\x10\xf4\x04\x12\x32\n-ATOM_WS_CALL_USER_EXPERIENCE_LATENCY_REPORTED\x10\xf5\x04\x12&\n!ATOM_WS_CALL_INTERACTION_REPORTED\x10\xf6\x04\x12\"\n\x1d\x41TOM_WS_ON_BODY_STATE_CHANGED\x10\x93\x06\x12\x39\n4ATOM_WS_WATCH_FACE_RESTRICTED_COMPLICATIONS_IMPACTED\x10\xa2\x06\x12@\n;ATOM_WS_WATCH_FACE_DEFAULT_RESTRICTED_COMPLICATIONS_REMOVED\x10\xa3\x06\x12?\n:ATOM_WS_COMPLICATIONS_IMPACTED_NOTIFICATION_EVENT_REPORTED\x10\xa4\x06\x12(\n#ATOM_WS_REMOTE_EVENT_USAGE_REPORTED\x10\x98\x07\x12\x30\n+ATOM_WS_NOTIFICATION_MANAGED_DISMISSAL_SYNC\x10\xad\x07\x12%\n ATOM_WS_BUGREPORT_EVENT_REPORTED\x10\xc4\x07\x12%\n ATOM_WS_STANDALONE_MODE_SNAPSHOT\x10\xd5O\x12)\n$ATOM_WS_FAVORITE_WATCH_FACE_SNAPSHOT\x10\xdeO\x12/\n*ATOM_WS_PHOTOS_WATCH_FACE_FEATURE_SNAPSHOT\x10\xf1O\x12.\n)ATOM_WS_WATCH_FACE_CUSTOMIZATION_SNAPSHOT\x10\xf3O\x12.\n)ATOM_WEAR_ADAPTIVE_SUSPEND_STATS_REPORTED\x10\xeb\x04\x12?\n:ATOM_WEAR_POWER_ANOMALY_SERVICE_OPERATIONAL_STATS_REPORTED\x10\xec\x04\x12\x39\n4ATOM_WEAR_POWER_ANOMALY_SERVICE_EVENT_STATS_REPORTED\x10\xed\x04\x12\"\n\x1d\x41TOM_WEAR_TIME_SYNC_REQUESTED\x10\x8f\x07\x12\"\n\x1d\x41TOM_WEAR_TIME_UPDATE_STARTED\x10\x90\x07\x12*\n%ATOM_WEAR_TIME_SYNC_ATTEMPT_COMPLETED\x10\x91\x07\x12\x1b\n\x16\x41TOM_WEAR_TIME_CHANGED\x10\x92\x07\x12\x32\n-ATOM_WEAR_SETUP_WIZARD_DEVICE_STATUS_REPORTED\x10\xb9\x07\x12-\n(ATOM_WEAR_SETUP_WIZARD_PAIRING_COMPLETED\x10\xba\x07\x12\x32\n-ATOM_WEAR_SETUP_WIZARD_CONNECTION_ESTABLISHED\x10\xbb\x07\x12-\n(ATOM_WEAR_SETUP_WIZARD_CHECKIN_COMPLETED\x10\xbc\x07\x12\x33\n.ATOM_WEAR_SETUP_WIZARD_COMPANION_TIME_REPORTED\x10\xbd\x07\x12+\n&ATOM_WEAR_SETUP_WIZARD_STATUS_REPORTED\x10\xbe\x07\x12.\n)ATOM_WEAR_SETUP_WIZARD_HEARTBEAT_REPORTED\x10\xbf\x07\x12)\n$ATOM_WEAR_SETUP_WIZARD_FRP_TRIGGERED\x10\xc0\x07\x12\x33\n.ATOM_WEAR_SETUP_WIZARD_SYSTEM_UPDATE_TRIGGERED\x10\xc1\x07\x12\x32\n-ATOM_WEAR_SETUP_WIZARD_PHONE_SWITCH_TRIGGERED\x10\xc2\x07\x12\x1e\n\x19\x41TOM_RENDERER_INITIALIZED\x10\xe0\x05\x12!\n\x1c\x41TOM_SCHEMA_VERSION_RECEIVED\x10\xe1\x05\x12\x1a\n\x15\x41TOM_LAYOUT_INSPECTED\x10\xe5\x05\x12%\n ATOM_LAYOUT_EXPRESSION_INSPECTED\x10\xe6\x05\x12%\n ATOM_LAYOUT_ANIMATIONS_INSPECTED\x10\xe7\x05\x12\'\n\"ATOM_MATERIAL_COMPONENTS_INSPECTED\x10\xe8\x05\x12\x18\n\x13\x41TOM_TILE_REQUESTED\x10\xe9\x05\x12!\n\x1c\x41TOM_STATE_RESPONSE_RECEIVED\x10\xea\x05\x12 \n\x1b\x41TOM_TILE_RESPONSE_RECEIVED\x10\xeb\x05\x12\x1c\n\x17\x41TOM_INFLATION_FINISHED\x10\xec\x05\x12\x1a\n\x15\x41TOM_INFLATION_FAILED\x10\xed\x05\x12-\n(ATOM_IGNORED_INFLATION_FAILURES_REPORTED\x10\xee\x05\x12\x1b\n\x16\x41TOM_DRAWABLE_RENDERED\x10\xef\x05\x12!\n\x1c\x41TOM_WEAR_MODE_STATE_CHANGED\x10\xcb\x05\x12\x1f\n\x1a\x41TOM_MEDIA_ACTION_REPORTED\x10\xe0\x04\x12!\n\x1c\x41TOM_MEDIA_CONTROLS_LAUNCHED\x10\xe1\x04\x12%\n ATOM_MEDIA_SESSION_STATE_CHANGED\x10\xa5\x05\x12*\n%ATOM_MEDIA_CONTROL_API_USAGE_REPORTED\x10\xc6\x07\x12$\n\x1f\x41TOM_MEDIA_SUBSCRIPTION_CHANGED\x10\xde\x07\x12<\n7ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_DEVICE_SCAN_API_LATENCY\x10\xf5\x05\x12<\n7ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_SASS_DEVICE_UNAVAILABLE\x10\xf6\x05\x12\x39\n4ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_FASTPAIR_API_TIMEOUT\x10\xf7\x05\x12\x1a\n\x15\x41TOM_MEDIATOR_UPDATED\x10\xd1\x05\x12+\n&ATOM_SYSPROXY_BLUETOOTH_BYTES_TRANSFER\x10\xd4O\x12%\n ATOM_SYSPROXY_CONNECTION_UPDATED\x10\x92\x06\x12)\n$ATOM_WEAR_COMPANION_CONNECTION_STATE\x10\x99\x07\x12(\n#ATOM_SYSPROXY_SERVICE_STATE_UPDATED\x10\xb5\x07\x12\x1b\n\x16\x41TOM_UWB_ACTIVITY_INFO\x10\xccO\x12(\n#ATOM_TEST_UPROBESTATS_ATOM_REPORTED\x10\x93\x07\x12%\n ATOM_TV_LOW_POWER_STANDBY_POLICY\x10\xa7\x05\x12!\n\x1c\x41TOM_EXTERNAL_TV_INPUT_EVENT\x10\xcd\x05\x12&\n!ATOM_BOOT_INTEGRITY_INFO_REPORTED\x10\x87\x06\x12/\n*ATOM_THREADNETWORK_TELEMETRY_DATA_REPORTED\x10\xe2\x05\x12+\n&ATOM_THREADNETWORK_TOPO_ENTRY_REPEATED\x10\xe3\x05\x12,\n\'ATOM_THREADNETWORK_DEVICE_INFO_REPORTED\x10\xe4\x05\x12,\n\'ATOM_CELLULAR_RADIO_POWER_STATE_CHANGED\x10\xc9\x05\x12 \n\x1b\x41TOM_EMERGENCY_NUMBERS_INFO\x10\xc4O\x12!\n\x1c\x41TOM_DATA_NETWORK_VALIDATION\x10\xdfO\x12 \n\x1b\x41TOM_DATA_RAT_STATE_CHANGED\x10\xd6\x06\x12#\n\x1e\x41TOM_CONNECTED_CHANNEL_CHANGED\x10\xf2\x06\x12\'\n\"ATOM_CELLULAR_IDENTIFIER_DISCLOSED\x10\xa0\x06\x12\x1e\n\x19\x41TOM_SATELLITE_CONTROLLER\x10\xc6O\x12\x1b\n\x16\x41TOM_SATELLITE_SESSION\x10\xc7O\x12%\n ATOM_SATELLITE_INCOMING_DATAGRAM\x10\xc8O\x12%\n ATOM_SATELLITE_OUTGOING_DATAGRAM\x10\xc9O\x12\x1d\n\x18\x41TOM_SATELLITE_PROVISION\x10\xcaO\x12+\n&ATOM_SATELLITE_SOS_MESSAGE_RECOMMENDER\x10\xcbO\x12+\n&ATOM_CARRIER_ROAMING_SATELLITE_SESSION\x10\xe3O\x12\x34\n/ATOM_CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS\x10\xe4O\x12&\n!ATOM_CONTROLLER_STATS_PER_PACKAGE\x10\xe5O\x12\x1f\n\x1a\x41TOM_SATELLITE_ENTITLEMENT\x10\xe6O\x12\"\n\x1d\x41TOM_SATELLITE_CONFIG_UPDATER\x10\xe7O\x12%\n ATOM_SATELLITE_ACCESS_CONTROLLER\x10\xebO\x12$\n\x1f\x41TOM_QUALIFIED_RAT_LIST_CHANGED\x10\xfa\x04\x12!\n\x1c\x41TOM_QNS_IMS_CALL_DROP_STATS\x10\xfb\x04\x12*\n%ATOM_QNS_FALLBACK_RESTRICTION_CHANGED\x10\xfc\x04\x12*\n%ATOM_QNS_RAT_PREFERENCE_MISMATCH_INFO\x10\xc1O\x12\"\n\x1d\x41TOM_QNS_HANDOVER_TIME_MILLIS\x10\xc2O\x12\x1f\n\x1a\x41TOM_QNS_HANDOVER_PINGPONG\x10\xc3O\x12=\n8ATOM_IWLAN_UNDERLYING_NETWORK_VALIDATION_RESULT_REPORTED\x10\x9b\x07\x12!\n\x1c\x41TOM_EMERGENCY_NUMBER_DIALED\x10\xfd\x04\x12\x14\n\x0f\x41TOM_CALL_STATS\x10\xedO\x12 \n\x1b\x41TOM_CALL_AUDIO_ROUTE_STATS\x10\xeeO\x12\x1b\n\x16\x41TOM_TELECOM_API_STATS\x10\xefO\x12\x1d\n\x18\x41TOM_TELECOM_ERROR_STATS\x10\xf0O\x12&\n!ATOM_LOCKSCREEN_SHORTCUT_SELECTED\x10\xe3\x04\x12\'\n\"ATOM_LOCKSCREEN_SHORTCUT_TRIGGERED\x10\xe4\x04\x12&\n!ATOM_LAUNCHER_IMPRESSION_EVENT_V2\x10\xcc\x05\x12(\n#ATOM_DISPLAY_SWITCH_LATENCY_TRACKED\x10\xf1\x05\x12\'\n\"ATOM_NOTIFICATION_LISTENER_SERVICE\x10\xbd\x06\x12!\n\x1c\x41TOM_NAV_HANDLE_TOUCH_POINTS\x10\xe5\x06\x12,\n\'ATOM_COMMUNAL_HUB_WIDGET_EVENT_REPORTED\x10\x8c\x07\x12&\n!ATOM_PERIPHERAL_TUTORIAL_LAUNCHED\x10\xae\x07\x12(\n#ATOM_CONTEXTUAL_EDUCATION_TRIGGERED\x10\xcb\x07\x12\x1f\n\x1a\x41TOM_COMMUNAL_HUB_SNAPSHOT\x10\xf2O\x12&\n!ATOM_TEST_EXTENSION_ATOM_REPORTED\x10\x94\x05\x12\'\n\"ATOM_TEST_RESTRICTED_ATOM_REPORTED\x10\xa0\x05\x12$\n\x1f\x41TOM_STATS_SOCKET_LOSS_REPORTED\x10\xf0\x05\x12\x1f\n\x1a\x41TOM_SETTINGS_SPA_REPORTED\x10\xee\x04\x12\x1b\n\x16\x41TOM_SELINUX_AUDIT_LOG\x10\x9f\x06\x12\x1c\n\x17\x41TOM_SANDBOX_API_CALLED\x10\xe8\x03\x12)\n$ATOM_SANDBOX_ACTIVITY_EVENT_OCCURRED\x10\xdf\x05\x12\x32\n-ATOM_SDK_SANDBOX_RESTRICTED_ACCESS_IN_SESSION\x10\x9c\x06\x12\x1d\n\x18\x41TOM_SANDBOX_SDK_STORAGE\x10\xafO\x12\x19\n\x14\x41TOM_RKPD_POOL_STATS\x10\x98\x05\x12\x1f\n\x1a\x41TOM_RKPD_CLIENT_OPERATION\x10\x99\x05\x12$\n\x1f\x41TOM_RANGING_SESSION_CONFIGURED\x10\xe1\x07\x12!\n\x1c\x41TOM_RANGING_SESSION_STARTED\x10\xe2\x07\x12 \n\x1b\x41TOM_RANGING_SESSION_CLOSED\x10\xe3\x07\x12$\n\x1f\x41TOM_RANGING_TECHNOLOGY_STARTED\x10\xe4\x07\x12$\n\x1f\x41TOM_RANGING_TECHNOLOGY_STOPPED\x10\xe5\x07\x12\x33\n.ATOM_MEDIA_PROVIDER_DATABASE_ROLLBACK_REPORTED\x10\x90\x06\x12&\n!ATOM_BACKUP_SETUP_STATUS_REPORTED\x10\x91\x06\x12\x1d\n\x18\x41TOM_SCREEN_OFF_REPORTED\x10\x88\x06\x12*\n%ATOM_SCREEN_TIMEOUT_OVERRIDE_REPORTED\x10\xc4\x06\x12-\n(ATOM_SCREEN_INTERACTIVE_SESSION_REPORTED\x10\xc5\x06\x12\x1d\n\x18\x41TOM_SCREEN_DIM_REPORTED\x10\xe3\x06\x12\x13\n\x0e\x41TOM_ATOM_9999\x10\x8fN\x12\x15\n\x0f\x41TOM_ATOM_99999\x10\x9f\x8d\x06\x12+\n&ATOM_PHOTOPICKER_SESSION_INFO_REPORTED\x10\xf6\x06\x12\'\n\"ATOM_PHOTOPICKER_API_INFO_REPORTED\x10\xf7\x06\x12%\n ATOM_PHOTOPICKER_UI_EVENT_LOGGED\x10\xf8\x06\x12\x30\n+ATOM_PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED\x10\xf9\x06\x12)\n$ATOM_PHOTOPICKER_PREVIEW_INFO_LOGGED\x10\xfa\x06\x12-\n(ATOM_PHOTOPICKER_MENU_INTERACTION_LOGGED\x10\xfb\x06\x12/\n*ATOM_PHOTOPICKER_BANNER_INTERACTION_LOGGED\x10\xfc\x06\x12/\n*ATOM_PHOTOPICKER_MEDIA_LIBRARY_INFO_LOGGED\x10\xfd\x06\x12&\n!ATOM_PHOTOPICKER_PAGE_INFO_LOGGED\x10\xfe\x06\x12\x33\n.ATOM_PHOTOPICKER_MEDIA_GRID_SYNC_INFO_REPORTED\x10\xff\x06\x12.\n)ATOM_PHOTOPICKER_ALBUM_SYNC_INFO_REPORTED\x10\x80\x07\x12*\n%ATOM_PHOTOPICKER_SEARCH_INFO_REPORTED\x10\x81\x07\x12\x31\n,ATOM_SEARCH_DATA_EXTRACTION_DETAILS_REPORTED\x10\x82\x07\x12,\n\'ATOM_EMBEDDED_PHOTOPICKER_INFO_REPORTED\x10\x83\x07\x12,\n\'ATOM_PERMISSION_RATIONALE_DIALOG_VIEWED\x10\x85\x05\x12\x35\n0ATOM_PERMISSION_RATIONALE_DIALOG_ACTION_REPORTED\x10\x86\x05\x12;\n6ATOM_APP_DATA_SHARING_UPDATES_NOTIFICATION_INTERACTION\x10\x87\x05\x12\x32\n-ATOM_APP_DATA_SHARING_UPDATES_FRAGMENT_VIEWED\x10\x88\x05\x12;\n6ATOM_APP_DATA_SHARING_UPDATES_FRAGMENT_ACTION_REPORTED\x10\x89\x05\x12\x36\n1ATOM_ENHANCED_CONFIRMATION_DIALOG_RESULT_REPORTED\x10\xbb\x06\x12\x33\n.ATOM_ENHANCED_CONFIRMATION_RESTRICTION_CLEARED\x10\xbc\x06\x12$\n\x1f\x41TOM_PRESSURE_STALL_INFORMATION\x10\xf5O\x12\x1b\n\x16\x41TOM_PDF_LOAD_REPORTED\x10\xdb\x06\x12 \n\x1b\x41TOM_PDF_API_USAGE_REPORTED\x10\xdc\x06\x12\x1d\n\x18\x41TOM_PDF_SEARCH_REPORTED\x10\xdd\x06\x12*\n%ATOM_COMPONENT_STATE_CHANGED_REPORTED\x10\xdf\x06\x12,\n\'ATOM_ONDEVICEPERSONALIZATION_API_CALLED\x10\xc7\x05\x12-\n(ATOM_ONDEVICEPERSONALIZATION_TRACE_EVENT\x10\xb8\x07\x12(\n#ATOM_NFC_OBSERVE_MODE_STATE_CHANGED\x10\xd7\x06\x12\x1b\n\x16\x41TOM_NFC_FIELD_CHANGED\x10\xd8\x06\x12\x30\n+ATOM_NFC_POLLING_LOOP_NOTIFICATION_REPORTED\x10\xd9\x06\x12/\n*ATOM_NFC_PROPRIETARY_CAPABILITIES_REPORTED\x10\xda\x06\x12&\n!ATOM_NFC_EXIT_FRAME_TABLE_CHANGED\x10\x8c\x08\x12$\n\x1f\x41TOM_NFC_AUTO_TRANSACT_REPORTED\x10\x8e\x08\x12/\n*ATOM_MICROXR_DEVICE_BOOT_COMPLETE_REPORTED\x10\x85\x07\x12\x13\n\x0e\x41TOM_MTE_STATE\x10\xc5O\x12#\n\x1e\x41TOM_ZRAM_MAINTENANCE_EXECUTED\x10\xf7\x07\x12\x1d\n\x18\x41TOM_ZRAM_SETUP_EXECUTED\x10\x85\x08\x12\x1a\n\x15\x41TOM_ZRAM_MM_STAT_MMD\x10\xf8O\x12\x1a\n\x15\x41TOM_ZRAM_BD_STAT_MMD\x10\xf9O\x12&\n!ATOM_MEDIA_EDITING_ENDED_REPORTED\x10\x9e\x06\x12/\n*ATOM_MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED\x10\xd8\x04\x12\x1d\n\x18\x41TOM_MEDIA_CODEC_STARTED\x10\x81\x05\x12\x1d\n\x18\x41TOM_MEDIA_CODEC_STOPPED\x10\x82\x05\x12\x1e\n\x19\x41TOM_MEDIA_CODEC_RENDERED\x10\xac\x05\x12!\n\x1c\x41TOM_EMERGENCY_STATE_CHANGED\x10\xf9\x04\x12/\n*ATOM_CHRE_SIGNIFICANT_MOTION_STATE_CHANGED\x10\xe4\x06\x12\x36\n1ATOM_POPULATION_DENSITY_PROVIDER_LOADING_REPORTED\x10\xea\x07\x12\x37\n2ATOM_DENSITY_BASED_COARSE_LOCATIONS_USAGE_REPORTED\x10\xeb\x07\x12@\n;ATOM_DENSITY_BASED_COARSE_LOCATIONS_PROVIDER_QUERY_REPORTED\x10\xec\x07\x12\"\n\x1d\x41TOM_KERNEL_OOM_KILL_OCCURRED\x10\xf2\x05\x12\x1d\n\x18\x41TOM_KEYBOARD_CONFIGURED\x10\xaa\x05\x12)\n$ATOM_KEYBOARD_SYSTEMS_EVENT_REPORTED\x10\xab\x05\x12$\n\x1f\x41TOM_INPUTDEVICE_USAGE_REPORTED\x10\xae\x05\x12&\n!ATOM_INPUT_EVENT_LATENCY_REPORTED\x10\xa4\x07\x12\x18\n\x13\x41TOM_TOUCHPAD_USAGE\x10\xcfO\x12 \n\x1b\x41TOM_IKE_SESSION_TERMINATED\x10\xa6\x05\x12.\n)ATOM_IKE_LIVENESS_CHECK_SESSION_VALIDATED\x10\xf8\x05\x12)\n$ATOM_NEGOTIATED_SECURITY_ASSOCIATION\x10\xb5\x06\x12+\n&ATOM_HOTWORD_EGRESS_SIZE_ATOM_REPORTED\x10\xf9\x05\x12&\n!ATOM_HEALTH_CONNECT_UI_IMPRESSION\x10\xef\x04\x12\'\n\"ATOM_HEALTH_CONNECT_UI_INTERACTION\x10\xf0\x04\x12,\n\'ATOM_HEALTH_CONNECT_APP_OPENED_REPORTED\x10\xf1\x04\x12#\n\x1e\x41TOM_HEALTH_CONNECT_API_CALLED\x10\xe8\x04\x12$\n\x1f\x41TOM_HEALTH_CONNECT_USAGE_STATS\x10\xe9\x04\x12&\n!ATOM_HEALTH_CONNECT_STORAGE_STATS\x10\xea\x04\x12$\n\x1f\x41TOM_HEALTH_CONNECT_API_INVOKED\x10\x83\x05\x12#\n\x1e\x41TOM_EXERCISE_ROUTE_API_CALLED\x10\x8e\x05\x12\'\n\"ATOM_HEALTH_CONNECT_EXPORT_INVOKED\x10\x8b\x07\x12\'\n\"ATOM_HEALTH_CONNECT_IMPORT_INVOKED\x10\x96\x07\x12\x35\n0ATOM_HEALTH_CONNECT_EXPORT_IMPORT_STATS_REPORTED\x10\x97\x07\x12)\n$ATOM_HEALTH_CONNECT_PERMISSION_STATS\x10\xc3\x07\x12(\n#ATOM_HEALTH_CONNECT_PHR_API_INVOKED\x10\xd4\x07\x12(\n#ATOM_HEALTH_CONNECT_PHR_USAGE_STATS\x10\xd5\x07\x12*\n%ATOM_HEALTH_CONNECT_PHR_STORAGE_STATS\x10\xd8\x07\x12\x33\n.ATOM_HEALTH_CONNECT_RESTRICTED_ECOSYSTEM_STATS\x10\xd9\x07\x12(\n#ATOM_HEALTH_CONNECT_ECOSYSTEM_STATS\x10\xda\x07\x12#\n\x1e\x41TOM_HDMI_EARC_STATUS_REPORTED\x10\xbd\x05\x12,\n\'ATOM_HDMI_SOUNDBAR_MODE_STATUS_REPORTED\x10\xd4\x05\x12?\n:ATOM_HDMI_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_TOGGLED\x10\xdf\x07\x12\x18\n\x13\x41TOM_BATTERY_HEALTH\x10\xecO\x12\x1e\n\x19\x41TOM_BIOMETRIC_UNENROLLED\x10\xb0\x07\x12\x1e\n\x19\x41TOM_BIOMETRIC_ENUMERATED\x10\xb1\x07\x12\x34\n/ATOM_APPLICATION_GRAMMATICAL_INFLECTION_CHANGED\x10\xc8\x04\x12/\n*ATOM_SYSTEM_GRAMMATICAL_INFLECTION_CHANGED\x10\xb0\x06\x12%\n ATOM_FULL_SCREEN_INTENT_LAUNCHED\x10\xf7\x04\x12\x15\n\x10\x41TOM_BAL_ALLOWED\x10\xf8\x04\x12\"\n\x1d\x41TOM_IN_TASK_ACTIVITY_STARTED\x10\xad\x05\x12$\n\x1f\x41TOM_DEVICE_ORIENTATION_CHANGED\x10\x8a\x07\x12$\n\x1f\x41TOM_CACHED_APPS_HIGH_WATERMARK\x10\xcdO\x12,\n\'ATOM_STYLUS_PREDICTION_METRICS_REPORTED\x10\xce\x05\x12\"\n\x1d\x41TOM_USER_RISK_EVENT_REPORTED\x10\xd5\x05\x12(\n#ATOM_MEDIA_PROJECTION_STATE_CHANGED\x10\xd9\x05\x12)\n$ATOM_MEDIA_PROJECTION_TARGET_CHANGED\x10\xda\x05\x12/\n*ATOM_EXCESSIVE_BINDER_PROXY_COUNT_REPORTED\x10\xd5\x06\x12\'\n\"ATOM_PROXY_BYTES_TRANSFER_BY_FG_BG\x10\xd8O\x12-\n(ATOM_MOBILE_BYTES_TRANSFER_BY_PROC_STATE\x10\xdcO\x12$\n\x1f\x41TOM_BIOMETRIC_FRR_NOTIFICATION\x10\xb1\x06\x12\x34\n/ATOM_SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION\x10\xbe\x06\x12\x37\n2ATOM_SENSITIVE_NOTIFICATION_APP_PROTECTION_SESSION\x10\xbf\x06\x12\x37\n2ATOM_SENSITIVE_NOTIFICATION_APP_PROTECTION_APPLIED\x10\xc0\x06\x12*\n%ATOM_SENSITIVE_NOTIFICATION_REDACTION\x10\xc1\x06\x12*\n%ATOM_SENSITIVE_CONTENT_APP_PROTECTION\x10\xc3\x06\x12\'\n\"ATOM_APP_RESTRICTION_STATE_CHANGED\x10\xe2\x06\x12%\n ATOM_BATTERY_USAGE_STATS_PER_UID\x10\xe1O\x12 \n\x1b\x41TOM_POSTGC_MEMORY_SNAPSHOT\x10\x9c\x07\x12+\n&ATOM_POWER_SAVE_TEMP_ALLOWLIST_CHANGED\x10\x9e\x07\x12\x1f\n\x1a\x41TOM_APP_OP_ACCESS_TRACKED\x10\xa3\x07\x12,\n\'ATOM_CONTENT_OR_FILE_URI_EVENT_REPORTED\x10\xa5\x07\x12,\n\'ATOM_DEVICE_IDLE_TEMP_ALLOWLIST_UPDATED\x10\xac\x07\x12\x36\n1ATOM_APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED\x10\xaf\x07\x12!\n\x1c\x41TOM_FRAMEWORK_WAKELOCK_INFO\x10\xf6O\x12-\n(ATOM_JANK_FRAME_COUNT_BY_WIDGET_REPORTED\x10\xb6\x07\x12$\n\x1f\x41TOM_INTENT_CREATOR_TOKEN_ADDED\x10\xd2\x07\x12-\n(ATOM_NOTIFICATION_CHANNEL_CLASSIFICATION\x10\xd7\x07\x12\x31\n,ATOM_CAMERA_STATUS_FOR_COMPATIBILITY_CHANGED\x10\xe7\x07\x12&\n!ATOM_FEDERATED_COMPUTE_API_CALLED\x10\xc8\x05\x12\x33\n.ATOM_FEDERATED_COMPUTE_TRAINING_EVENT_REPORTED\x10\x83\x06\x12\x30\n+ATOM_EXAMPLE_ITERATOR_NEXT_LATENCY_REPORTED\x10\xc6\x06\x12\x30\n+ATOM_FEDERATED_COMPUTE_TRACE_EVENT_REPORTED\x10\xe0\x07\x12 \n\x1b\x41TOM_EXPRESS_EVENT_REPORTED\x10\x90\x04\x12+\n&ATOM_EXPRESS_HISTOGRAM_SAMPLE_REPORTED\x10\xd1\x04\x12$\n\x1f\x41TOM_EXPRESS_UID_EVENT_REPORTED\x10\x84\x05\x12/\n*ATOM_EXPRESS_UID_HISTOGRAM_SAMPLE_REPORTED\x10\x92\x05\x12\x1f\n\x1a\x41TOM_DREAM_SETTING_CHANGED\x10\xc1\x05\x12 \n\x1b\x41TOM_DREAM_SETTING_SNAPSHOT\x10\xd0O\x12\x1b\n\x16\x41TOM_DND_STATE_CHANGED\x10\x91\x05\x12(\n#ATOM_EXTERNAL_DISPLAY_STATE_CHANGED\x10\xa6\x06\x12,\n\'ATOM_DISPLAY_MODE_DIRECTOR_VOTE_CHANGED\x10\x98\x06\x12\'\n\"ATOM_DEVICE_POLICY_MANAGEMENT_MODE\x10\xe8O\x12\x1d\n\x18\x41TOM_DEVICE_POLICY_STATE\x10\xe9O\x12/\n*ATOM_DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED\x10\xd6\x05\x12\x34\n/ATOM_DEVICE_LOCK_PROVISIONING_COMPLETE_REPORTED\x10\xd7\x05\x12\x30\n+ATOM_DEVICE_LOCK_KIOSK_APP_REQUEST_REPORTED\x10\xd8\x05\x12-\n(ATOM_DEVICE_LOCK_CHECK_IN_RETRY_REPORTED\x10\x95\x06\x12\x30\n+ATOM_DEVICE_LOCK_PROVISION_FAILURE_REPORTED\x10\x96\x06\x12\x39\n4ATOM_DEVICE_LOCK_LOCK_UNLOCK_DEVICE_FAILURE_REPORTED\x10\x97\x06\x12!\n\x1c\x41TOM_DESKTOP_MODE_UI_CHANGED\x10\xb2\x06\x12*\n%ATOM_DESKTOP_MODE_SESSION_TASK_UPDATE\x10\xb3\x06\x12(\n#ATOM_DESKTOP_MODE_TASK_SIZE_UPDATED\x10\xa7\x07\x12\x1f\n\x1a\x41TOM_CRONET_ENGINE_CREATED\x10\xbf\x05\x12!\n\x1c\x41TOM_CRONET_TRAFFIC_REPORTED\x10\xc0\x05\x12+\n&ATOM_CRONET_ENGINE_BUILDER_INITIALIZED\x10\xfa\x05\x12\'\n\"ATOM_CRONET_HTTP_FLAGS_INITIALIZED\x10\xfb\x05\x12\x1c\n\x17\x41TOM_CRONET_INITIALIZED\x10\xfc\x05\x12\'\n\"ATOM_CREDENTIAL_MANAGER_API_CALLED\x10\xc9\x04\x12\x30\n+ATOM_CREDENTIAL_MANAGER_INIT_PHASE_REPORTED\x10\x8b\x05\x12\x35\n0ATOM_CREDENTIAL_MANAGER_CANDIDATE_PHASE_REPORTED\x10\x8c\x05\x12\x31\n,ATOM_CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED\x10\x8d\x05\x12+\n&ATOM_CREDENTIAL_MANAGER_TOTAL_REPORTED\x10\x9b\x05\x12\x30\n+ATOM_CREDENTIAL_MANAGER_FINALNOUID_REPORTED\x10\x9c\x05\x12)\n$ATOM_CREDENTIAL_MANAGER_GET_REPORTED\x10\x9d\x05\x12\x30\n+ATOM_CREDENTIAL_MANAGER_AUTH_CLICK_REPORTED\x10\x9e\x05\x12)\n$ATOM_CREDENTIAL_MANAGER_APIV2_CALLED\x10\x9f\x05\x12\x14\n\x0f\x41TOM_CPU_POLICY\x10\xd7O\x12&\n!ATOM_VPN_CONNECTION_STATE_CHANGED\x10\xd2\x06\x12!\n\x1c\x41TOM_VPN_CONNECTION_REPORTED\x10\xd3\x06\x12$\n\x1f\x41TOM_IP_CLIENT_RA_INFO_REPORTED\x10\x8a\x06\x12#\n\x1e\x41TOM_APF_SESSION_INFO_REPORTED\x10\x89\x06\x12\x31\n,ATOM_CORE_NETWORKING_TERRIBLE_ERROR_OCCURRED\x10\xd3\x07\x12.\n)ATOM_NETWORK_STATS_RECORDER_FILE_OPERATED\x10\x8f\x06\x12\'\n\"ATOM_DAILY_KEEPALIVE_INFO_REPORTED\x10\x8a\x05\x12\'\n\"ATOM_NETWORK_REQUEST_STATE_CHANGED\x10\x8b\x06\x12,\n\'ATOM_TETHERING_ACTIVE_SESSIONS_REPORTED\x10\x9d\x07\x12@\n;ATOM_CERTIFICATE_TRANSPARENCY_LOG_LIST_UPDATE_STATE_CHANGED\x10\xcc\x07\x12!\n\x1c\x41TOM_HARDWARE_RENDERER_EVENT\x10\xb2\x07\x12\x1c\n\x17\x41TOM_TEXTURE_VIEW_EVENT\x10\xb3\x07\x12\x1f\n\x1a\x41TOM_SURFACE_CONTROL_EVENT\x10\xb4\x07\x12\x17\n\x12\x41TOM_IMAGE_DECODED\x10\xd1\x07\x12\x39\n4ATOM_CERTIFICATE_TRANSPARENCY_LOG_LIST_STATE_CHANGED\x10\xa6\x07\x12 \n\x1b\x41TOM_CONSCRYPT_SERVICE_USED\x10\xc5\x07\x12\x38\n3ATOM_CERTIFICATE_TRANSPARENCY_VERIFICATION_REPORTED\x10\xdd\x07\x12\x30\n+ATOM_CAMERA_FEATURE_COMBINATION_QUERY_EVENT\x10\x84\x07\x12\x18\n\x13\x41TOM_BROADCAST_SENT\x10\x9a\x07\x12/\n*ATOM_BLUETOOTH_HASHED_DEVICE_NAME_REPORTED\x10\xe5\x04\x12/\n*ATOM_BLUETOOTH_L2CAP_COC_CLIENT_CONNECTION\x10\xe6\x04\x12/\n*ATOM_BLUETOOTH_L2CAP_COC_SERVER_CONNECTION\x10\xe7\x04\x12(\n#ATOM_BLUETOOTH_LE_SESSION_CONNECTED\x10\x90\x05\x12\x33\n.ATOM_RESTRICTED_BLUETOOTH_DEVICE_NAME_REPORTED\x10\x9a\x05\x12\x30\n+ATOM_BLUETOOTH_PROFILE_CONNECTION_ATTEMPTED\x10\xb8\x05\x12\x32\n-ATOM_BLUETOOTH_CONTENT_PROFILE_ERROR_REPORTED\x10\x8d\x06\x12/\n*ATOM_BLUETOOTH_RFCOMM_CONNECTION_ATTEMPTED\x10\x8e\x06\x12\x32\n-ATOM_REMOTE_DEVICE_INFORMATION_WITH_METRIC_ID\x10\xde\x06\x12#\n\x1e\x41TOM_LE_APP_SCAN_STATE_CHANGED\x10\xe6\x06\x12\x1f\n\x1a\x41TOM_LE_RADIO_SCAN_STOPPED\x10\xe7\x06\x12!\n\x1c\x41TOM_LE_SCAN_RESULT_RECEIVED\x10\xe8\x06\x12\x18\n\x13\x41TOM_LE_SCAN_ABUSED\x10\xe9\x06\x12\x1e\n\x19\x41TOM_LE_ADV_STATE_CHANGED\x10\xea\x06\x12\x1f\n\x1a\x41TOM_LE_ADV_ERROR_REPORTED\x10\xeb\x06\x12\x1f\n\x1a\x41TOM_A2DP_SESSION_REPORTED\x10\x88\x07\x12.\n)ATOM_BLUETOOTH_CROSS_LAYER_EVENT_REPORTED\x10\x94\x07\x12*\n%ATOM_BROADCAST_AUDIO_SESSION_REPORTED\x10\x9f\x07\x12\'\n\"ATOM_BROADCAST_AUDIO_SYNC_REPORTED\x10\xa0\x07\x12\x37\n2ATOM_BLUETOOTH_RFCOMM_CONNECTION_REPORTED_AT_CLOSE\x10\xd6\x07\x12!\n\x1c\x41TOM_BLUETOOTH_LE_CONNECTION\x10\xdc\x07\x12.\n)ATOM_HEARING_DEVICE_ACTIVE_EVENT_REPORTED\x10\xfd\x07\x12(\n#ATOM_BACKPORTED_FIX_STATUS_REPORTED\x10\xdb\x07\x12\x1c\n\x17\x41TOM_PLUGIN_INITIALIZED\x10\x8f\x05\x12\x38\n3ATOM_CAR_SYSTEM_UI_DATA_SUBSCRIPTION_EVENT_REPORTED\x10\xce\x07\x12\x37\n2ATOM_CAR_SETTINGS_DATA_SUBSCRIPTION_EVENT_REPORTED\x10\xcf\x07\x12#\n\x1e\x41TOM_CAR_QC_LIB_EVENT_REPORTED\x10\xd0\x07\x12*\n%ATOM_CAR_WAKEUP_FROM_SUSPEND_REPORTED\x10\xd4\x06\x12$\n\x1f\x41TOM_CAR_RECENTS_EVENT_REPORTED\x10\x82\x06\x12&\n!ATOM_CAR_CALM_MODE_EVENT_REPORTED\x10\x9d\x06\x12$\n\x1f\x41TOM_AUTOFILL_UI_EVENT_REPORTED\x10\xdb\x04\x12(\n#ATOM_AUTOFILL_FILL_REQUEST_REPORTED\x10\xdc\x04\x12)\n$ATOM_AUTOFILL_FILL_RESPONSE_REPORTED\x10\xdd\x04\x12&\n!ATOM_AUTOFILL_SAVE_EVENT_REPORTED\x10\xde\x04\x12$\n\x1f\x41TOM_AUTOFILL_SESSION_COMMITTED\x10\xdf\x04\x12\x36\n1ATOM_AUTOFILL_FIELD_CLASSIFICATION_EVENT_REPORTED\x10\x93\x05\x12\x1c\n\x17\x41TOM_ODREFRESH_REPORTED\x10\xee\x02\x12\x19\n\x14\x41TOM_ODSIGN_REPORTED\x10\xa4\x04\x12%\n ATOM_BACKGROUND_DEXOPT_JOB_ENDED\x10\xd3\x03\x12$\n\x1f\x41TOM_PREREBOOT_DEXOPT_JOB_ENDED\x10\xf3\x06\x12\x1c\n\x17\x41TOM_ART_DATUM_REPORTED\x10\xcc\x02\x12#\n\x1e\x41TOM_ART_DEVICE_DATUM_REPORTED\x10\xa6\x04\x12\"\n\x1d\x41TOM_ART_DATUM_DELTA_REPORTED\x10\xb5\x04\x12\x1e\n\x19\x41TOM_ART_DEX2OAT_REPORTED\x10\xa1\x07\x12\x1b\n\x16\x41TOM_ART_DEVICE_STATUS\x10\xddO\x12.\n)ATOM_APP_SEARCH_SET_SCHEMA_STATS_REPORTED\x10\x81\x03\x12\x34\n/ATOM_APP_SEARCH_SCHEMA_MIGRATION_STATS_REPORTED\x10\xc3\x04\x12\x37\n2ATOM_APP_SEARCH_USAGE_SEARCH_INTENT_STATS_REPORTED\x10\xb9\x06\x12\x41\n\x12\x1c\n\x18VMSTAT_PGSCAN_DIRECT_DMA\x10?\x12\x1f\n\x1bVMSTAT_PGSCAN_DIRECT_NORMAL\x10@\x12 \n\x1cVMSTAT_PGSCAN_DIRECT_MOVABLE\x10\x41\x12!\n\x1dVMSTAT_PGSCAN_DIRECT_THROTTLE\x10\x42\x12\x17\n\x13VMSTAT_PGINODESTEAL\x10\x43\x12\x18\n\x14VMSTAT_SLABS_SCANNED\x10\x44\x12\x1c\n\x18VMSTAT_KSWAPD_INODESTEAL\x10\x45\x12\'\n#VMSTAT_KSWAPD_LOW_WMARK_HIT_QUICKLY\x10\x46\x12(\n$VMSTAT_KSWAPD_HIGH_WMARK_HIT_QUICKLY\x10G\x12\x15\n\x11VMSTAT_PAGEOUTRUN\x10H\x12\x15\n\x11VMSTAT_ALLOCSTALL\x10I\x12\x14\n\x10VMSTAT_PGROTATED\x10J\x12\x19\n\x15VMSTAT_DROP_PAGECACHE\x10K\x12\x14\n\x10VMSTAT_DROP_SLAB\x10L\x12\x1c\n\x18VMSTAT_PGMIGRATE_SUCCESS\x10M\x12\x19\n\x15VMSTAT_PGMIGRATE_FAIL\x10N\x12\"\n\x1eVMSTAT_COMPACT_MIGRATE_SCANNED\x10O\x12\x1f\n\x1bVMSTAT_COMPACT_FREE_SCANNED\x10P\x12\x1b\n\x17VMSTAT_COMPACT_ISOLATED\x10Q\x12\x18\n\x14VMSTAT_COMPACT_STALL\x10R\x12\x17\n\x13VMSTAT_COMPACT_FAIL\x10S\x12\x1a\n\x16VMSTAT_COMPACT_SUCCESS\x10T\x12\x1e\n\x1aVMSTAT_COMPACT_DAEMON_WAKE\x10U\x12!\n\x1dVMSTAT_UNEVICTABLE_PGS_CULLED\x10V\x12\"\n\x1eVMSTAT_UNEVICTABLE_PGS_SCANNED\x10W\x12\"\n\x1eVMSTAT_UNEVICTABLE_PGS_RESCUED\x10X\x12\"\n\x1eVMSTAT_UNEVICTABLE_PGS_MLOCKED\x10Y\x12$\n VMSTAT_UNEVICTABLE_PGS_MUNLOCKED\x10Z\x12\"\n\x1eVMSTAT_UNEVICTABLE_PGS_CLEARED\x10[\x12#\n\x1fVMSTAT_UNEVICTABLE_PGS_STRANDED\x10\\\x12\x15\n\x11VMSTAT_NR_ZSPAGES\x10]\x12\x16\n\x12VMSTAT_NR_ION_HEAP\x10^\x12\x16\n\x12VMSTAT_NR_GPU_HEAP\x10_\x12\x19\n\x15VMSTAT_ALLOCSTALL_DMA\x10`\x12\x1d\n\x19VMSTAT_ALLOCSTALL_MOVABLE\x10\x61\x12\x1c\n\x18VMSTAT_ALLOCSTALL_NORMAL\x10\x62\x12&\n\"VMSTAT_COMPACT_DAEMON_FREE_SCANNED\x10\x63\x12)\n%VMSTAT_COMPACT_DAEMON_MIGRATE_SCANNED\x10\x64\x12\x15\n\x11VMSTAT_NR_FASTRPC\x10\x65\x12$\n VMSTAT_NR_INDIRECTLY_RECLAIMABLE\x10\x66\x12\x1b\n\x17VMSTAT_NR_ION_HEAP_POOL\x10g\x12%\n!VMSTAT_NR_KERNEL_MISC_RECLAIMABLE\x10h\x12%\n!VMSTAT_NR_SHADOW_CALL_STACK_BYTES\x10i\x12\x1d\n\x19VMSTAT_NR_SHMEM_HUGEPAGES\x10j\x12\x1d\n\x19VMSTAT_NR_SHMEM_PMDMAPPED\x10k\x12!\n\x1dVMSTAT_NR_UNRECLAIMABLE_PAGES\x10l\x12\x1e\n\x1aVMSTAT_NR_ZONE_ACTIVE_ANON\x10m\x12\x1e\n\x1aVMSTAT_NR_ZONE_ACTIVE_FILE\x10n\x12 \n\x1cVMSTAT_NR_ZONE_INACTIVE_ANON\x10o\x12 \n\x1cVMSTAT_NR_ZONE_INACTIVE_FILE\x10p\x12\x1e\n\x1aVMSTAT_NR_ZONE_UNEVICTABLE\x10q\x12 \n\x1cVMSTAT_NR_ZONE_WRITE_PENDING\x10r\x12\x13\n\x0fVMSTAT_OOM_KILL\x10s\x12\x15\n\x11VMSTAT_PGLAZYFREE\x10t\x12\x16\n\x12VMSTAT_PGLAZYFREED\x10u\x12\x13\n\x0fVMSTAT_PGREFILL\x10v\x12\x18\n\x14VMSTAT_PGSCAN_DIRECT\x10w\x12\x18\n\x14VMSTAT_PGSCAN_KSWAPD\x10x\x12\x15\n\x11VMSTAT_PGSKIP_DMA\x10y\x12\x19\n\x15VMSTAT_PGSKIP_MOVABLE\x10z\x12\x18\n\x14VMSTAT_PGSKIP_NORMAL\x10{\x12\x19\n\x15VMSTAT_PGSTEAL_DIRECT\x10|\x12\x19\n\x15VMSTAT_PGSTEAL_KSWAPD\x10}\x12\x12\n\x0eVMSTAT_SWAP_RA\x10~\x12\x16\n\x12VMSTAT_SWAP_RA_HIT\x10\x7f\x12\x1e\n\x19VMSTAT_WORKINGSET_RESTORE\x10\x80\x01\x12\x1d\n\x18VMSTAT_ALLOCSTALL_DEVICE\x10\x81\x01\x12\x1c\n\x17VMSTAT_ALLOCSTALL_DMA32\x10\x82\x01\x12\x1b\n\x16VMSTAT_BALLOON_DEFLATE\x10\x83\x01\x12\x1b\n\x16VMSTAT_BALLOON_INFLATE\x10\x84\x01\x12\x1b\n\x16VMSTAT_BALLOON_MIGRATE\x10\x85\x01\x12\x1a\n\x15VMSTAT_CMA_ALLOC_FAIL\x10\x86\x01\x12\x1d\n\x18VMSTAT_CMA_ALLOC_SUCCESS\x10\x87\x01\x12\x1d\n\x18VMSTAT_NR_FILE_HUGEPAGES\x10\x88\x01\x12\x1d\n\x18VMSTAT_NR_FILE_PMDMAPPED\x10\x89\x01\x12 \n\x1bVMSTAT_NR_FOLL_PIN_ACQUIRED\x10\x8a\x01\x12 \n\x1bVMSTAT_NR_FOLL_PIN_RELEASED\x10\x8b\x01\x12#\n\x1eVMSTAT_NR_SEC_PAGE_TABLE_PAGES\x10\x8c\x01\x12 \n\x1bVMSTAT_NR_SHADOW_CALL_STACK\x10\x8d\x01\x12\x19\n\x14VMSTAT_NR_SWAPCACHED\x10\x8e\x01\x12 \n\x1bVMSTAT_NR_THROTTLED_WRITTEN\x10\x8f\x01\x12\x1a\n\x15VMSTAT_PGALLOC_DEVICE\x10\x90\x01\x12\x19\n\x14VMSTAT_PGALLOC_DMA32\x10\x91\x01\x12\x1b\n\x16VMSTAT_PGDEMOTE_DIRECT\x10\x92\x01\x12\x1b\n\x16VMSTAT_PGDEMOTE_KSWAPD\x10\x93\x01\x12\x13\n\x0eVMSTAT_PGREUSE\x10\x94\x01\x12\x17\n\x12VMSTAT_PGSCAN_ANON\x10\x95\x01\x12\x17\n\x12VMSTAT_PGSCAN_FILE\x10\x96\x01\x12\x19\n\x14VMSTAT_PGSKIP_DEVICE\x10\x97\x01\x12\x18\n\x13VMSTAT_PGSKIP_DMA32\x10\x98\x01\x12\x18\n\x13VMSTAT_PGSTEAL_ANON\x10\x99\x01\x12\x18\n\x13VMSTAT_PGSTEAL_FILE\x10\x9a\x01\x12\x1e\n\x19VMSTAT_THP_COLLAPSE_ALLOC\x10\x9b\x01\x12%\n VMSTAT_THP_COLLAPSE_ALLOC_FAILED\x10\x9c\x01\x12#\n\x1eVMSTAT_THP_DEFERRED_SPLIT_PAGE\x10\x9d\x01\x12\x1b\n\x16VMSTAT_THP_FAULT_ALLOC\x10\x9e\x01\x12\x1e\n\x19VMSTAT_THP_FAULT_FALLBACK\x10\x9f\x01\x12%\n VMSTAT_THP_FAULT_FALLBACK_CHARGE\x10\xa0\x01\x12\x1a\n\x15VMSTAT_THP_FILE_ALLOC\x10\xa1\x01\x12\x1d\n\x18VMSTAT_THP_FILE_FALLBACK\x10\xa2\x01\x12$\n\x1fVMSTAT_THP_FILE_FALLBACK_CHARGE\x10\xa3\x01\x12\x1b\n\x16VMSTAT_THP_FILE_MAPPED\x10\xa4\x01\x12\x1e\n\x19VMSTAT_THP_MIGRATION_FAIL\x10\xa5\x01\x12\x1f\n\x1aVMSTAT_THP_MIGRATION_SPLIT\x10\xa6\x01\x12!\n\x1cVMSTAT_THP_MIGRATION_SUCCESS\x10\xa7\x01\x12$\n\x1fVMSTAT_THP_SCAN_EXCEED_NONE_PTE\x10\xa8\x01\x12%\n VMSTAT_THP_SCAN_EXCEED_SHARE_PTE\x10\xa9\x01\x12$\n\x1fVMSTAT_THP_SCAN_EXCEED_SWAP_PTE\x10\xaa\x01\x12\x1a\n\x15VMSTAT_THP_SPLIT_PAGE\x10\xab\x01\x12!\n\x1cVMSTAT_THP_SPLIT_PAGE_FAILED\x10\xac\x01\x12\x19\n\x14VMSTAT_THP_SPLIT_PMD\x10\xad\x01\x12\x16\n\x11VMSTAT_THP_SWPOUT\x10\xae\x01\x12\x1f\n\x1aVMSTAT_THP_SWPOUT_FALLBACK\x10\xaf\x01\x12\x1f\n\x1aVMSTAT_THP_ZERO_PAGE_ALLOC\x10\xb0\x01\x12&\n!VMSTAT_THP_ZERO_PAGE_ALLOC_FAILED\x10\xb1\x01\x12\x1a\n\x15VMSTAT_VMA_LOCK_ABORT\x10\xb2\x01\x12\x19\n\x14VMSTAT_VMA_LOCK_MISS\x10\xb3\x01\x12\x1a\n\x15VMSTAT_VMA_LOCK_RETRY\x10\xb4\x01\x12\x1c\n\x17VMSTAT_VMA_LOCK_SUCCESS\x10\xb5\x01\x12$\n\x1fVMSTAT_WORKINGSET_ACTIVATE_ANON\x10\xb6\x01\x12$\n\x1fVMSTAT_WORKINGSET_ACTIVATE_FILE\x10\xb7\x01\x12\x1c\n\x17VMSTAT_WORKINGSET_NODES\x10\xb8\x01\x12#\n\x1eVMSTAT_WORKINGSET_REFAULT_ANON\x10\xb9\x01\x12#\n\x1eVMSTAT_WORKINGSET_REFAULT_FILE\x10\xba\x01\x12#\n\x1eVMSTAT_WORKINGSET_RESTORE_ANON\x10\xbb\x01\x12#\n\x1eVMSTAT_WORKINGSET_RESTORE_FILE\x10\xbc\x01*\xc8\x05\n\x11\x46traceParseStatus\x12\x1d\n\x19\x46TRACE_STATUS_UNSPECIFIED\x10\x00\x12\x14\n\x10\x46TRACE_STATUS_OK\x10\x01\x12\'\n#FTRACE_STATUS_UNEXPECTED_READ_ERROR\x10\x02\x12#\n\x1f\x46TRACE_STATUS_PARTIAL_PAGE_READ\x10\x03\x12)\n%FTRACE_STATUS_ABI_INVALID_PAGE_HEADER\x10\x04\x12(\n$FTRACE_STATUS_ABI_SHORT_EVENT_HEADER\x10\x05\x12\"\n\x1e\x46TRACE_STATUS_ABI_NULL_PADDING\x10\x06\x12*\n&FTRACE_STATUS_ABI_SHORT_PADDING_LENGTH\x10\x07\x12,\n(FTRACE_STATUS_ABI_INVALID_PADDING_LENGTH\x10\x08\x12\'\n#FTRACE_STATUS_ABI_SHORT_TIME_EXTEND\x10\t\x12&\n\"FTRACE_STATUS_ABI_SHORT_TIME_STAMP\x10\n\x12\'\n#FTRACE_STATUS_ABI_SHORT_DATA_LENGTH\x10\x0b\x12&\n\"FTRACE_STATUS_ABI_ZERO_DATA_LENGTH\x10\x0c\x12)\n%FTRACE_STATUS_ABI_INVALID_DATA_LENGTH\x10\r\x12$\n FTRACE_STATUS_ABI_SHORT_EVENT_ID\x10\x0e\x12\"\n\x1e\x46TRACE_STATUS_ABI_END_OVERFLOW\x10\x0f\x12%\n!FTRACE_STATUS_SHORT_COMPACT_EVENT\x10\x10\x12\x1f\n\x1b\x46TRACE_STATUS_INVALID_EVENT\x10\x11*\x91\x01\n\x0b\x46traceClock\x12\x1c\n\x18\x46TRACE_CLOCK_UNSPECIFIED\x10\x00\x12\x18\n\x14\x46TRACE_CLOCK_UNKNOWN\x10\x01\x12\x17\n\x13\x46TRACE_CLOCK_GLOBAL\x10\x02\x12\x16\n\x12\x46TRACE_CLOCK_LOCAL\x10\x03\x12\x19\n\x15\x46TRACE_CLOCK_MONO_RAW\x10\x04*\xb0\x05\n\x1f\x43hromeCompositorSchedulerAction\x12#\n\x1f\x43\x43_SCHEDULER_ACTION_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43\x43_SCHEDULER_ACTION_NONE\x10\x01\x12-\n)CC_SCHEDULER_ACTION_SEND_BEGIN_MAIN_FRAME\x10\x02\x12\x1e\n\x1a\x43\x43_SCHEDULER_ACTION_COMMIT\x10\x03\x12*\n&CC_SCHEDULER_ACTION_ACTIVATE_SYNC_TREE\x10\x04\x12(\n$CC_SCHEDULER_ACTION_DRAW_IF_POSSIBLE\x10\x05\x12#\n\x1f\x43\x43_SCHEDULER_ACTION_DRAW_FORCED\x10\x06\x12\"\n\x1e\x43\x43_SCHEDULER_ACTION_DRAW_ABORT\x10\x07\x12<\n8CC_SCHEDULER_ACTION_BEGIN_LAYER_TREE_FRAME_SINK_CREATION\x10\x08\x12%\n!CC_SCHEDULER_ACTION_PREPARE_TILES\x10\t\x12\x38\n4CC_SCHEDULER_ACTION_INVALIDATE_LAYER_TREE_FRAME_SINK\x10\n\x12\x36\n2CC_SCHEDULER_ACTION_PERFORM_IMPL_SIDE_INVALIDATION\x10\x0b\x12\x42\n>CC_SCHEDULER_ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_EXPECTED_UNTIL\x10\x0c\x12\x41\n=CC_SCHEDULER_ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_EXPECTED_SOON\x10\r*}\n\x0e\x43hromeRAILMode\x12\x12\n\x0eRAIL_MODE_NONE\x10\x00\x12\x16\n\x12RAIL_MODE_RESPONSE\x10\x01\x12\x17\n\x13RAIL_MODE_ANIMATION\x10\x02\x12\x12\n\x0eRAIL_MODE_IDLE\x10\x03\x12\x12\n\x0eRAIL_MODE_LOAD\x10\x04\x42+Z)github.com/google/perfetto/perfetto_proto') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*protos/perfetto/trace/perfetto_trace.proto\x12\x0fperfetto.protos\"\x94\x01\n\x10\x46traceDescriptor\x12K\n\x11\x61trace_categories\x18\x01 \x03(\x0b\x32\x30.perfetto.protos.FtraceDescriptor.AtraceCategory\x1a\x33\n\x0e\x41traceCategory\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\"\x9f\x0f\n\x14GpuCounterDescriptor\x12\x43\n\x05specs\x18\x01 \x03(\x0b\x32\x34.perfetto.protos.GpuCounterDescriptor.GpuCounterSpec\x12\x45\n\x06\x62locks\x18\x02 \x03(\x0b\x32\x35.perfetto.protos.GpuCounterDescriptor.GpuCounterBlock\x12Q\n\x0e\x63ounter_groups\x18\x06 \x03(\x0b\x32\x39.perfetto.protos.GpuCounterDescriptor.GpuCounterGroupSpec\x12\x1e\n\x16min_sampling_period_ns\x18\x03 \x01(\x04\x12\x1e\n\x16max_sampling_period_ns\x18\x04 \x01(\x04\x12&\n\x1esupports_instrumented_sampling\x18\x05 \x01(\x08\x12\x1e\n\x16supports_counter_names\x18\x07 \x01(\x08\x12#\n\x1bsupports_counter_name_globs\x18\x08 \x01(\x08\x1a\xec\x04\n\x0eGpuCounterSpec\x12\x12\n\ncounter_id\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x18\n\x0eint_peak_value\x18\x05 \x01(\x03H\x00\x12\x1b\n\x11\x64ouble_peak_value\x18\x06 \x01(\x01H\x00\x12J\n\x0fnumerator_units\x18\x07 \x03(\x0e\x32\x31.perfetto.protos.GpuCounterDescriptor.MeasureUnit\x12L\n\x11\x64\x65nominator_units\x18\x08 \x03(\x0e\x32\x31.perfetto.protos.GpuCounterDescriptor.MeasureUnit\x12\x19\n\x11select_by_default\x18\t \x01(\x08\x12\x45\n\x06groups\x18\n \x03(\x0e\x32\x35.perfetto.protos.GpuCounterDescriptor.GpuCounterGroup\x12\\\n\x0fvalue_direction\x18\x0b \x01(\x0e\x32\x43.perfetto.protos.GpuCounterDescriptor.GpuCounterSpec.ValueDirection\"~\n\x0eValueDirection\x12\x1f\n\x1bVALUE_DIRECTION_UNSPECIFIED\x10\x00\x12%\n!VALUE_DIRECTION_BACKWARDS_LOOKING\x10\x01\x12$\n VALUE_DIRECTION_FORWARDS_LOOKING\x10\x02\x42\x0c\n\npeak_valueJ\x04\x08\x04\x10\x05\x1as\n\x0fGpuCounterBlock\x12\x10\n\x08\x62lock_id\x18\x01 \x01(\r\x12\x16\n\x0e\x62lock_capacity\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x13\n\x0b\x63ounter_ids\x18\x05 \x03(\r\x1a_\n\x13GpuCounterGroupSpec\x12\x10\n\x08group_id\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x13\n\x0b\x63ounter_ids\x18\x04 \x03(\r\"\x86\x01\n\x0fGpuCounterGroup\x12\x10\n\x0cUNCLASSIFIED\x10\x00\x12\n\n\x06SYSTEM\x10\x01\x12\x0c\n\x08VERTICES\x10\x02\x12\r\n\tFRAGMENTS\x10\x03\x12\x0e\n\nPRIMITIVES\x10\x04\x12\n\n\x06MEMORY\x10\x05\x12\x0b\n\x07\x43OMPUTE\x10\x06\x12\x0f\n\x0bRAY_TRACING\x10\x07\"\xac\x04\n\x0bMeasureUnit\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03\x42IT\x10\x01\x12\x0b\n\x07KILOBIT\x10\x02\x12\x0b\n\x07MEGABIT\x10\x03\x12\x0b\n\x07GIGABIT\x10\x04\x12\x0b\n\x07TERABIT\x10\x05\x12\x0b\n\x07PETABIT\x10\x06\x12\x08\n\x04\x42YTE\x10\x07\x12\x0c\n\x08KILOBYTE\x10\x08\x12\x0c\n\x08MEGABYTE\x10\t\x12\x0c\n\x08GIGABYTE\x10\n\x12\x0c\n\x08TERABYTE\x10\x0b\x12\x0c\n\x08PETABYTE\x10\x0c\x12\t\n\x05HERTZ\x10\r\x12\r\n\tKILOHERTZ\x10\x0e\x12\r\n\tMEGAHERTZ\x10\x0f\x12\r\n\tGIGAHERTZ\x10\x10\x12\r\n\tTERAHERTZ\x10\x11\x12\r\n\tPETAHERTZ\x10\x12\x12\x0e\n\nNANOSECOND\x10\x13\x12\x0f\n\x0bMICROSECOND\x10\x14\x12\x0f\n\x0bMILLISECOND\x10\x15\x12\n\n\x06SECOND\x10\x16\x12\n\n\x06MINUTE\x10\x17\x12\x08\n\x04HOUR\x10\x18\x12\n\n\x06VERTEX\x10\x19\x12\t\n\x05PIXEL\x10\x1a\x12\x0c\n\x08TRIANGLE\x10\x1b\x12\r\n\tPRIMITIVE\x10&\x12\x0c\n\x08\x46RAGMENT\x10\'\x12\r\n\tMILLIWATT\x10\x1c\x12\x08\n\x04WATT\x10\x1d\x12\x0c\n\x08KILOWATT\x10\x1e\x12\t\n\x05JOULE\x10\x1f\x12\x08\n\x04VOLT\x10 \x12\n\n\x06\x41MPERE\x10!\x12\x0b\n\x07\x43\x45LSIUS\x10\"\x12\x0e\n\nFAHRENHEIT\x10#\x12\n\n\x06KELVIN\x10$\x12\x0b\n\x07PERCENT\x10%\x12\x0f\n\x0bINSTRUCTION\x10(\"E\n\x12TrackEventCategory\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0c\n\x04tags\x18\x03 \x03(\t\"Y\n\x14TrackEventDescriptor\x12\x41\n\x14\x61vailable_categories\x18\x01 \x03(\x0b\x32#.perfetto.protos.TrackEventCategory\"R\n\tVmProgram\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x34\n\x0cinstructions\x18\x02 \x03(\x0b\x32\x1e.perfetto.protos.VmInstruction\"\xde\x03\n\rVmInstruction\x12-\n\x06select\x18\x01 \x01(\x0b\x32\x1b.perfetto.protos.VmOpSelectH\x00\x12\x30\n\x08reg_load\x18\x02 \x01(\x0b\x32\x1c.perfetto.protos.VmOpRegLoadH\x00\x12+\n\x05merge\x18\x03 \x01(\x0b\x32\x1a.perfetto.protos.VmOpMergeH\x00\x12\'\n\x03set\x18\x04 \x01(\x0b\x32\x18.perfetto.protos.VmOpSetH\x00\x12\'\n\x03\x64\x65l\x18\x05 \x01(\x0b\x32\x18.perfetto.protos.VmOpDelH\x00\x12>\n\x0b\x61\x62ort_level\x18\x06 \x01(\x0e\x32).perfetto.protos.VmInstruction.AbortLevel\x12;\n\x13nested_instructions\x18\x07 \x03(\x0b\x32\x1e.perfetto.protos.VmInstruction\"c\n\nAbortLevel\x12\x1c\n\x18SKIP_CURRENT_INSTRUCTION\x10\x01\x12,\n(SKIP_CURRENT_INSTRUCTION_AND_BREAK_OUTER\x10\x02\x12\t\n\x05\x41\x42ORT\x10\x03\x42\x0b\n\toperation\"\xd7\x02\n\nVmOpSelect\x12-\n\x06\x63ursor\x18\x01 \x01(\x0e\x32\x1d.perfetto.protos.VmCursorEnum\x12@\n\rrelative_path\x18\x02 \x03(\x0b\x32).perfetto.protos.VmOpSelect.PathComponent\x12\x1b\n\x13\x63reate_if_not_exist\x18\x03 \x01(\x08\x1a\xba\x01\n\rPathComponent\x12\x12\n\x08\x66ield_id\x18\x01 \x01(\rH\x00\x12\x15\n\x0b\x61rray_index\x18\x02 \x01(\rH\x00\x12\x1a\n\x10map_key_field_id\x18\x03 \x01(\rH\x00\x12\x13\n\x0bis_repeated\x18\x05 \x01(\x08\x12\x19\n\x11register_to_match\x18\x06 \x01(\r\x12)\n!store_foreach_index_into_register\x18\x07 \x01(\rB\x07\n\x05\x66ield\"R\n\x0bVmOpRegLoad\x12-\n\x06\x63ursor\x18\x01 \x01(\x0e\x32\x1d.perfetto.protos.VmCursorEnum\x12\x14\n\x0c\x64st_register\x18\x02 \x01(\r\"?\n\tVmOpMerge\x12\x18\n\x10skip_submessages\x18\x01 \x01(\x08\x12\x18\n\x10\x64\x65l_if_src_empty\x18\x02 \x01(\x08\"\t\n\x07VmOpSet\"\t\n\x07VmOpDel\"\xb3\x03\n\x14\x44\x61taSourceDescriptor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x07 \x01(\x04\x12\x1b\n\x13will_notify_on_stop\x18\x02 \x01(\x08\x12\x1c\n\x14will_notify_on_start\x18\x03 \x01(\x08\x12\'\n\x1fhandles_incremental_state_clear\x18\x04 \x01(\x08\x12\x10\n\x08no_flush\x18\t \x01(\x08\x12\x33\n\x0fprotovm_program\x18\n \x01(\x0b\x32\x1a.perfetto.protos.VmProgram\x12I\n\x16gpu_counter_descriptor\x18\x05 \x01(\x0b\x32%.perfetto.protos.GpuCounterDescriptorB\x02(\x01\x12I\n\x16track_event_descriptor\x18\x06 \x01(\x0b\x32%.perfetto.protos.TrackEventDescriptorB\x02(\x01\x12@\n\x11\x66trace_descriptor\x18\x08 \x01(\x0b\x32!.perfetto.protos.FtraceDescriptorB\x02(\x01\"\xe2\x06\n\x13TracingServiceState\x12@\n\tproducers\x18\x01 \x03(\x0b\x32-.perfetto.protos.TracingServiceState.Producer\x12\x45\n\x0c\x64\x61ta_sources\x18\x02 \x03(\x0b\x32/.perfetto.protos.TracingServiceState.DataSource\x12M\n\x10tracing_sessions\x18\x06 \x03(\x0b\x32\x33.perfetto.protos.TracingServiceState.TracingSession\x12!\n\x19supports_tracing_sessions\x18\x07 \x01(\x08\x12\x14\n\x0cnum_sessions\x18\x03 \x01(\x05\x12\x1c\n\x14num_sessions_started\x18\x04 \x01(\x05\x12\x1f\n\x17tracing_service_version\x18\x05 \x01(\t\x1a\x8d\x01\n\x08Producer\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0b\n\x03pid\x18\x05 \x01(\x05\x12\x0b\n\x03uid\x18\x03 \x01(\x05\x12\x13\n\x0bsdk_version\x18\x04 \x01(\t\x12\x0e\n\x06\x66rozen\x18\x06 \x01(\x08\x12\x12\n\nmachine_id\x18\x07 \x01(\r\x12\x14\n\x0cmachine_name\x18\x08 \x01(\t\x1a_\n\nDataSource\x12<\n\rds_descriptor\x18\x01 \x01(\x0b\x32%.perfetto.protos.DataSourceDescriptor\x12\x13\n\x0bproducer_id\x18\x02 \x01(\x05\x1a\x89\x02\n\x0eTracingSession\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x14\n\x0c\x63onsumer_uid\x18\x02 \x01(\x05\x12\r\n\x05state\x18\x03 \x01(\t\x12\x1b\n\x13unique_session_name\x18\x04 \x01(\t\x12\x16\n\x0e\x62uffer_size_kb\x18\x05 \x03(\r\x12\x13\n\x0b\x64uration_ms\x18\x06 \x01(\r\x12\x18\n\x10num_data_sources\x18\x07 \x01(\r\x12\x19\n\x11start_realtime_ns\x18\x08 \x01(\x03\x12\x17\n\x0f\x62ugreport_score\x18\t \x01(\x05\x12\x1a\n\x12\x62ugreport_filename\x18\n \x01(\t\x12\x12\n\nis_started\x18\x0b \x01(\x08\"\xa1\x01\n\x0fTraceAttributes\x12=\n\tattribute\x18\x01 \x03(\x0b\x32*.perfetto.protos.TraceAttributes.Attribute\x1aO\n\tAttribute\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x14\n\nlong_value\x18\x02 \x01(\x03H\x00\x12\x16\n\x0cstring_value\x18\x03 \x01(\tH\x00\x42\x07\n\x05value\"&\n\x13\x41ndroidAflagsConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\"@\n!AndroidGameInterventionListConfig\x12\x1b\n\x13package_name_filter\x18\x01 \x03(\t\"\xef\x04\n\x17\x41ndroidInputEventConfig\x12@\n\x04mode\x18\x01 \x01(\x0e\x32\x32.perfetto.protos.AndroidInputEventConfig.TraceMode\x12\x41\n\x05rules\x18\x02 \x03(\x0b\x32\x32.perfetto.protos.AndroidInputEventConfig.TraceRule\x12%\n\x1dtrace_dispatcher_input_events\x18\x03 \x01(\x08\x12(\n trace_dispatcher_window_dispatch\x18\x04 \x01(\x08\x12\x1a\n\x12trace_evdev_events\x18\x05 \x01(\x08\x1a\xc8\x01\n\tTraceRule\x12H\n\x0btrace_level\x18\x01 \x01(\x0e\x32\x33.perfetto.protos.AndroidInputEventConfig.TraceLevel\x12\x1a\n\x12match_all_packages\x18\x02 \x03(\t\x12\x1a\n\x12match_any_packages\x18\x03 \x03(\t\x12\x14\n\x0cmatch_secure\x18\x04 \x01(\x08\x12#\n\x1bmatch_ime_connection_active\x18\x05 \x01(\x08\"?\n\tTraceMode\x12\x18\n\x14TRACE_MODE_TRACE_ALL\x10\x00\x12\x18\n\x14TRACE_MODE_USE_RULES\x10\x01\"V\n\nTraceLevel\x12\x14\n\x10TRACE_LEVEL_NONE\x10\x00\x12\x18\n\x14TRACE_LEVEL_REDACTED\x10\x01\x12\x18\n\x14TRACE_LEVEL_COMPLETE\x10\x02\"\xb1\x01\n\x10\x41ndroidLogConfig\x12.\n\x07log_ids\x18\x01 \x03(\x0e\x32\x1d.perfetto.protos.AndroidLogId\x12\x35\n\x08min_prio\x18\x03 \x01(\x0e\x32#.perfetto.protos.AndroidLogPriority\x12\x13\n\x0b\x66ilter_tags\x18\x04 \x03(\t\x12\x1b\n\x13preserve_log_buffer\x18\x05 \x01(\x08J\x04\x08\x02\x10\x03\"+\n\x18\x41ndroidPolledStateConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\"\x8a\x01\n\x1c\x41ndroidSdkSyspropGuardConfig\x12(\n surfaceflinger_skia_track_events\x18\x01 \x01(\x08\x12\x1e\n\x16hwui_skia_track_events\x18\x02 \x01(\x08\x12 \n\x18hwui_package_name_filter\x18\x03 \x03(\t\"E\n\x1b\x41ndroidSystemPropertyConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\x12\x15\n\rproperty_name\x18\x02 \x03(\t\"f\n\x12\x41ppWakelocksConfig\x12\x16\n\x0ewrite_delay_ms\x18\x01 \x01(\x05\x12 \n\x18\x66ilter_duration_below_ms\x18\x02 \x01(\x05\x12\x16\n\x0e\x64rop_owner_pid\x18\x03 \x01(\x08\"\"\n\x0f\x43puPerUidConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\"\xf8\x01\n\x12\x44isplayVideoConfig\x12\r\n\x05scale\x18\x01 \x01(\x02\x12:\n\x06\x66ormat\x18\x02 \x01(\x0e\x32*.perfetto.protos.DisplayVideoConfig.Format\x12\x1f\n\x17key_frame_interval_secs\x18\x03 \x01(\r\x12\x1d\n\x15max_stream_size_bytes\x18\x04 \x01(\x04\x12\x13\n\x0b\x62itrate_bps\x18\x05 \x01(\r\"B\n\x06\x46ormat\x12\x16\n\x12\x46ORMAT_UNSPECIFIED\x10\x00\x12\x0f\n\x0b\x46ORMAT_H264\x10\x01\x12\x0f\n\x0b\x46ORMAT_HEVC\x10\x02\"M\n\x11InputMethodConfig\x12\x0e\n\x06\x63lient\x18\x01 \x01(\x08\x12\x0f\n\x07service\x18\x02 \x01(\x08\x12\x17\n\x0fmanager_service\x18\x03 \x01(\x08\"(\n\x15KernelWakelocksConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\"\xab\x01\n\x18NetworkPacketTraceConfig\x12\x0f\n\x07poll_ms\x18\x01 \x01(\r\x12\x1d\n\x15\x61ggregation_threshold\x18\x02 \x01(\r\x12\x14\n\x0cintern_limit\x18\x03 \x01(\r\x12\x17\n\x0f\x64rop_local_port\x18\x04 \x01(\x08\x12\x18\n\x10\x64rop_remote_port\x18\x05 \x01(\x08\x12\x16\n\x0e\x64rop_tcp_flags\x18\x06 \x01(\x08\"|\n\x12PackagesListConfig\x12\x1b\n\x13package_name_filter\x18\x01 \x03(\t\x12!\n\x19package_name_regex_filter\x18\x03 \x03(\t\x12&\n\x1eonly_write_on_cpu_use_every_ms\x18\x02 \x01(\r\"\x84\x02\n\x10PixelModemConfig\x12\x41\n\x0b\x65vent_group\x18\x01 \x01(\x0e\x32,.perfetto.protos.PixelModemConfig.EventGroup\x12\x1f\n\x17pigweed_hash_allow_list\x18\x02 \x03(\x03\x12\x1e\n\x16pigweed_hash_deny_list\x18\x03 \x03(\x03\"l\n\nEventGroup\x12\x17\n\x13\x45VENT_GROUP_UNKNOWN\x10\x00\x12\x1d\n\x19\x45VENT_GROUP_LOW_BANDWIDTH\x10\x01\x12&\n\"EVENT_GROUP_HIGH_AND_LOW_BANDWIDTH\x10\x02\"\xf8\x01\n\x0eProtoLogConfig\x12\x37\n\x0fgroup_overrides\x18\x01 \x03(\x0b\x32\x1e.perfetto.protos.ProtoLogGroup\x12\x41\n\x0ctracing_mode\x18\x02 \x01(\x0e\x32+.perfetto.protos.ProtoLogConfig.TracingMode\x12>\n\x16\x64\x65\x66\x61ult_log_from_level\x18\x03 \x01(\x0e\x32\x1e.perfetto.protos.ProtoLogLevel\"*\n\x0bTracingMode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0e\n\nENABLE_ALL\x10\x01\"q\n\rProtoLogGroup\x12\x12\n\ngroup_name\x18\x01 \x01(\t\x12\x30\n\x08log_from\x18\x02 \x01(\x0e\x32\x1e.perfetto.protos.ProtoLogLevel\x12\x1a\n\x12\x63ollect_stacktrace\x18\x03 \x01(\x08\"\x83\x04\n\x1aSurfaceFlingerLayersConfig\x12>\n\x04mode\x18\x01 \x01(\x0e\x32\x30.perfetto.protos.SurfaceFlingerLayersConfig.Mode\x12J\n\x0btrace_flags\x18\x02 \x03(\x0e\x32\x35.perfetto.protos.SurfaceFlingerLayersConfig.TraceFlag\"\x85\x01\n\x04Mode\x12\x14\n\x10MODE_UNSPECIFIED\x10\x00\x12\x0f\n\x0bMODE_ACTIVE\x10\x01\x12\x12\n\x0eMODE_GENERATED\x10\x02\x12\r\n\tMODE_DUMP\x10\x03\x12!\n\x1dMODE_GENERATED_BUGREPORT_ONLY\x10\x04\x12\x10\n\x0cMODE_PROTOVM\x10\x05\"\xd0\x01\n\tTraceFlag\x12\x1a\n\x16TRACE_FLAG_UNSPECIFIED\x10\x00\x12\x14\n\x10TRACE_FLAG_INPUT\x10\x02\x12\x1a\n\x16TRACE_FLAG_COMPOSITION\x10\x04\x12\x14\n\x10TRACE_FLAG_EXTRA\x10\x08\x12\x12\n\x0eTRACE_FLAG_HWC\x10\x10\x12\x16\n\x12TRACE_FLAG_BUFFERS\x10 \x12\x1f\n\x1bTRACE_FLAG_VIRTUAL_DISPLAYS\x10@\x12\x12\n\x0eTRACE_FLAG_ALL\x10\x0e\"\xac\x01\n SurfaceFlingerTransactionsConfig\x12\x44\n\x04mode\x18\x01 \x01(\x0e\x32\x36.perfetto.protos.SurfaceFlingerTransactionsConfig.Mode\"B\n\x04Mode\x12\x14\n\x10MODE_UNSPECIFIED\x10\x00\x12\x13\n\x0fMODE_CONTINUOUS\x10\x01\x12\x0f\n\x0bMODE_ACTIVE\x10\x02\"1\n\x15\x41ndroidUserListConfig\x12\x18\n\x10user_type_filter\x18\x01 \x03(\t\"\xab\x04\n\x13WindowManagerConfig\x12H\n\rlog_frequency\x18\x01 \x01(\x0e\x32\x31.perfetto.protos.WindowManagerConfig.LogFrequency\x12@\n\tlog_level\x18\x02 \x01(\x0e\x32-.perfetto.protos.WindowManagerConfig.LogLevel\x12>\n\x08log_mode\x18\x03 \x01(\x0e\x32,.perfetto.protos.WindowManagerConfig.LogMode\"\x84\x01\n\x0cLogFrequency\x12\x1d\n\x19LOG_FREQUENCY_UNSPECIFIED\x10\x00\x12\x17\n\x13LOG_FREQUENCY_FRAME\x10\x01\x12\x1d\n\x19LOG_FREQUENCY_TRANSACTION\x10\x02\x12\x1d\n\x19LOG_FREQUENCY_SINGLE_DUMP\x10\x03\"i\n\x08LogLevel\x12\x19\n\x15LOG_LEVEL_UNSPECIFIED\x10\x00\x12\x15\n\x11LOG_LEVEL_VERBOSE\x10\x01\x12\x13\n\x0fLOG_LEVEL_DEBUG\x10\x02\x12\x16\n\x12LOG_LEVEL_CRITICAL\x10\x03\"V\n\x07LogMode\x12\x18\n\x14LOG_MODE_UNSPECIFIED\x10\x00\x12\x17\n\x13LOG_MODE_FULL_STATE\x10\x01\x12\x18\n\x14LOG_MODE_INCREMENTAL\x10\x02\"\xbd\x02\n\x0c\x43hromeConfig\x12\x14\n\x0ctrace_config\x18\x01 \x01(\t\x12!\n\x19privacy_filtering_enabled\x18\x02 \x01(\x08\x12\x1e\n\x16\x63onvert_to_legacy_json\x18\x03 \x01(\x08\x12\x45\n\x0f\x63lient_priority\x18\x04 \x01(\x0e\x32,.perfetto.protos.ChromeConfig.ClientPriority\x12\x1f\n\x17json_agent_label_filter\x18\x05 \x01(\t\x12)\n!event_package_name_filter_enabled\x18\x06 \x01(\x08\"A\n\x0e\x43lientPriority\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nBACKGROUND\x10\x01\x12\x12\n\x0eUSER_INITIATED\x10\x02\"\xe6\x01\n\x1e\x43hromiumHistogramSamplesConfig\x12S\n\nhistograms\x18\x01 \x03(\x0b\x32?.perfetto.protos.ChromiumHistogramSamplesConfig.HistogramSample\x12\x1e\n\x16\x66ilter_histogram_names\x18\x02 \x01(\x08\x1aO\n\x0fHistogramSample\x12\x16\n\x0ehistogram_name\x18\x01 \x01(\t\x12\x11\n\tmin_value\x18\x02 \x01(\x03\x12\x11\n\tmax_value\x18\x03 \x01(\x03\"c\n\"ChromiumSamplingHeapProfilerConfig\x12\x1f\n\x17sampling_interval_bytes\x18\x01 \x01(\x04\x12\x1c\n\x14sampling_interval_ms\x18\x02 \x01(\r\"C\n#ChromiumStackSamplingProfilerConfig\x12\x1c\n\x14sampling_interval_ms\x18\x01 \x01(\r\";\n\x1b\x43hromiumSystemMetricsConfig\x12\x1c\n\x14sampling_interval_ms\x18\x01 \x01(\r\"@\n\x08V8Config\x12\x1a\n\x12log_script_sources\x18\x01 \x01(\x08\x12\x18\n\x10log_instructions\x18\x02 \x01(\x08\"\xc0\x02\n\tEtwConfig\x12?\n\x0ckernel_flags\x18\x01 \x03(\x0e\x32%.perfetto.protos.EtwConfig.KernelFlagB\x02\x18\x01\x12!\n\x19scheduler_provider_events\x18\x02 \x03(\t\x12\x1e\n\x16memory_provider_events\x18\x03 \x03(\t\x12 \n\x14\x66ile_provider_events\x18\x04 \x03(\tB\x02\x18\x01\x12\x1d\n\x15stack_sampling_events\x18\x05 \x03(\t\x12 \n\x14\x64isk_provider_events\x18\x06 \x03(\tB\x02\x18\x01\x12!\n\x19system_io_provider_events\x18\x07 \x03(\t\")\n\nKernelFlag\x12\x0b\n\x07\x43SWITCH\x10\x00\x12\x0e\n\nDISPATCHER\x10\x01\"+\n\x12\x46rozenFtraceConfig\x12\x15\n\rinstance_name\x18\x01 \x01(\t\"\xca\x0e\n\x0c\x46traceConfig\x12\x15\n\rftrace_events\x18\x01 \x03(\t\x12\x19\n\x11\x61trace_categories\x18\x02 \x03(\t\x12\x13\n\x0b\x61trace_apps\x18\x03 \x03(\t\x12$\n\x1c\x61trace_categories_prefer_sdk\x18\x1c \x03(\t\x12\x1d\n\x15\x61trace_userspace_only\x18\" \x01(\x08\x12\x16\n\x0e\x62uffer_size_kb\x18\n \x01(\r\x12\x1f\n\x17\x62uffer_size_lower_bound\x18\x1b \x01(\x08\x12\x17\n\x0f\x64rain_period_ms\x18\x0b \x01(\r\x12\x1c\n\x14\x64rain_buffer_percent\x18\x1d \x01(\r\x12G\n\rcompact_sched\x18\x0c \x01(\x0b\x32\x30.perfetto.protos.FtraceConfig.CompactSchedConfig\x12?\n\x0cprint_filter\x18\x16 \x01(\x0b\x32).perfetto.protos.FtraceConfig.PrintFilter\x12\x17\n\x0fsymbolize_ksyms\x18\r \x01(\x08\x12\x46\n\x10ksyms_mem_policy\x18\x11 \x01(\x0e\x32,.perfetto.protos.FtraceConfig.KsymsMemPolicy\x12\x19\n\x11throttle_rss_stat\x18\x0f \x01(\x08\x12%\n\x1d\x64\x65nser_generic_event_encoding\x18 \x01(\x08\x12\x1e\n\x16\x64isable_generic_events\x18\x10 \x01(\x08\x12\x16\n\x0esyscall_events\x18\x12 \x03(\t\x12\x1d\n\x15\x65nable_function_graph\x18\x13 \x01(\x08\x12\x18\n\x10\x66unction_filters\x18\x14 \x03(\t\x12\x1c\n\x14\x66unction_graph_roots\x18\x15 \x03(\t\x12 \n\x18\x66unction_graph_max_depth\x18! \x01(\r\x12@\n\rkprobe_events\x18\x1e \x03(\x0b\x32).perfetto.protos.FtraceConfig.KprobeEvent\x12\x1e\n\x16preserve_ftrace_buffer\x18\x17 \x01(\x08\x12\x1f\n\x17use_monotonic_raw_clock\x18\x18 \x01(\x08\x12\x15\n\rinstance_name\x18\x19 \x01(\t\x12\x18\n\x10\x64\x65\x62ug_ftrace_abi\x18\x1f \x01(\x08\x12\x15\n\rtids_to_trace\x18# \x03(\r\x12\x44\n\x0ftracefs_options\x18$ \x03(\x0b\x32+.perfetto.protos.FtraceConfig.TracefsOption\x12\x17\n\x0ftracing_cpumask\x18% \x01(\t\x12\x36\n*initialize_ksyms_synchronously_for_testing\x18\x0e \x01(\x08\x42\x02\x18\x01\x1a%\n\x12\x43ompactSchedConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a\x82\x02\n\x0bPrintFilter\x12=\n\x05rules\x18\x01 \x03(\x0b\x32..perfetto.protos.FtraceConfig.PrintFilter.Rule\x1a\xb3\x01\n\x04Rule\x12\x10\n\x06prefix\x18\x01 \x01(\tH\x00\x12R\n\natrace_msg\x18\x03 \x01(\x0b\x32<.perfetto.protos.FtraceConfig.PrintFilter.Rule.AtraceMessageH\x00\x12\r\n\x05\x61llow\x18\x02 \x01(\x08\x1a-\n\rAtraceMessage\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0e\n\x06prefix\x18\x02 \x01(\tB\x07\n\x05match\x1a\xd0\x01\n\x0bKprobeEvent\x12\r\n\x05probe\x18\x01 \x01(\t\x12\x42\n\x04type\x18\x02 \x01(\x0e\x32\x34.perfetto.protos.FtraceConfig.KprobeEvent.KprobeType\"n\n\nKprobeType\x12\x17\n\x13KPROBE_TYPE_UNKNOWN\x10\x00\x12\x16\n\x12KPROBE_TYPE_KPROBE\x10\x01\x12\x19\n\x15KPROBE_TYPE_KRETPROBE\x10\x02\x12\x14\n\x10KPROBE_TYPE_BOTH\x10\x03\x1a\xa2\x01\n\rTracefsOption\x12\x0c\n\x04name\x18\x01 \x01(\t\x12@\n\x05state\x18\x02 \x01(\x0e\x32\x31.perfetto.protos.FtraceConfig.TracefsOption.State\"A\n\x05State\x12\x11\n\rSTATE_UNKNOWN\x10\x00\x12\x11\n\rSTATE_ENABLED\x10\x01\x12\x12\n\x0eSTATE_DISABLED\x10\x02\"T\n\x0eKsymsMemPolicy\x12\x15\n\x11KSYMS_UNSPECIFIED\x10\x00\x12\x19\n\x15KSYMS_CLEANUP_ON_STOP\x10\x01\x12\x10\n\x0cKSYMS_RETAIN\x10\x02J\x04\x08\x1a\x10\x1b\"\xe7\x06\n\x10GpuCounterConfig\x12\x19\n\x11\x63ounter_period_ns\x18\x01 \x01(\x04\x12\x13\n\x0b\x63ounter_ids\x18\x02 \x03(\r\x12\x15\n\rcounter_names\x18\x06 \x03(\t\x12\x1f\n\x15instrumented_sampling\x18\x03 \x01(\x08H\x00\x12\x64\n\x1cinstrumented_sampling_config\x18\x05 \x01(\x0b\x32<.perfetto.protos.GpuCounterConfig.InstrumentedSamplingConfigH\x00\x12\x15\n\rfix_gpu_clock\x18\x04 \x01(\x08\x1a\xcf\x04\n\x1aInstrumentedSamplingConfig\x12n\n\x15\x61\x63tivity_name_filters\x18\x03 \x03(\x0b\x32O.perfetto.protos.GpuCounterConfig.InstrumentedSamplingConfig.ActivityNameFilter\x12!\n\x19\x61\x63tivity_tx_include_globs\x18\x06 \x03(\t\x12!\n\x19\x61\x63tivity_tx_exclude_globs\x18\x07 \x03(\t\x12\x63\n\x0f\x61\x63tivity_ranges\x18\x05 \x03(\x0b\x32J.perfetto.protos.GpuCounterConfig.InstrumentedSamplingConfig.ActivityRange\x1a\xe7\x01\n\x12\x41\x63tivityNameFilter\x12\x11\n\tname_glob\x18\x01 \x01(\t\x12k\n\tname_base\x18\x02 \x01(\x0e\x32X.perfetto.protos.GpuCounterConfig.InstrumentedSamplingConfig.ActivityNameFilter.NameBase\"Q\n\x08NameBase\x12\x17\n\x13MANGLED_KERNEL_NAME\x10\x00\x12\x19\n\x15\x44\x45MANGLED_KERNEL_NAME\x10\x01\x12\x11\n\rFUNCTION_NAME\x10\x02\x1a,\n\rActivityRange\x12\x0c\n\x04skip\x18\x01 \x01(\r\x12\r\n\x05\x63ount\x18\x02 \x01(\rB\x1c\n\x1ainstrumented_sampling_mode\"\\\n\x15GpuRenderStagesConfig\x12\x16\n\x0e\x66ull_loadstore\x18\x01 \x01(\x08\x12\x14\n\x0clow_overhead\x18\x02 \x01(\x08\x12\x15\n\rtrace_metrics\x18\x03 \x03(\t\"Z\n\x12VulkanMemoryConfig\x12!\n\x19track_driver_memory_usage\x18\x01 \x01(\x08\x12!\n\x19track_device_memory_usage\x18\x02 \x01(\x08\"\xa3\x02\n\x0fInodeFileConfig\x12\x18\n\x10scan_interval_ms\x18\x01 \x01(\r\x12\x15\n\rscan_delay_ms\x18\x02 \x01(\r\x12\x17\n\x0fscan_batch_size\x18\x03 \x01(\r\x12\x13\n\x0b\x64o_not_scan\x18\x04 \x01(\x08\x12\x19\n\x11scan_mount_points\x18\x05 \x03(\t\x12T\n\x13mount_point_mapping\x18\x06 \x03(\x0b\x32\x37.perfetto.protos.InodeFileConfig.MountPointMappingEntry\x1a@\n\x16MountPointMappingEntry\x12\x12\n\nmountpoint\x18\x01 \x01(\t\x12\x12\n\nscan_roots\x18\x02 \x03(\t\"\xa5\x01\n\rConsoleConfig\x12\x35\n\x06output\x18\x01 \x01(\x0e\x32%.perfetto.protos.ConsoleConfig.Output\x12\x15\n\renable_colors\x18\x02 \x01(\x08\"F\n\x06Output\x12\x16\n\x12OUTPUT_UNSPECIFIED\x10\x00\x12\x11\n\rOUTPUT_STDOUT\x10\x01\x12\x11\n\rOUTPUT_STDERR\x10\x02\"Y\n\x11InterceptorConfig\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x36\n\x0e\x63onsole_config\x18\x64 \x01(\x0b\x32\x1e.perfetto.protos.ConsoleConfig\"[\n\x15SystemdJournaldConfig\x12\x10\n\x08min_prio\x18\x01 \x01(\r\x12\x1a\n\x12\x66ilter_identifiers\x18\x02 \x03(\t\x12\x14\n\x0c\x66ilter_units\x18\x03 \x03(\t\"\xc0\x03\n\x12\x41ndroidPowerConfig\x12\x17\n\x0f\x62\x61ttery_poll_ms\x18\x01 \x01(\r\x12M\n\x10\x62\x61ttery_counters\x18\x02 \x03(\x0e\x32\x33.perfetto.protos.AndroidPowerConfig.BatteryCounters\x12\x1b\n\x13\x63ollect_power_rails\x18\x03 \x01(\x08\x12+\n#collect_energy_estimation_breakdown\x18\x04 \x01(\x08\x12&\n\x1e\x63ollect_entity_state_residency\x18\x05 \x01(\x08\"\xcf\x01\n\x0f\x42\x61tteryCounters\x12\x1f\n\x1b\x42\x41TTERY_COUNTER_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x42\x41TTERY_COUNTER_CHARGE\x10\x01\x12$\n BATTERY_COUNTER_CAPACITY_PERCENT\x10\x02\x12\x1b\n\x17\x42\x41TTERY_COUNTER_CURRENT\x10\x03\x12\x1f\n\x1b\x42\x41TTERY_COUNTER_CURRENT_AVG\x10\x04\x12\x1b\n\x17\x42\x41TTERY_COUNTER_VOLTAGE\x10\x05\"\xbf\x01\n\x13PriorityBoostConfig\x12@\n\x06policy\x18\x01 \x01(\x0e\x32\x30.perfetto.protos.PriorityBoostConfig.BoostPolicy\x12\x10\n\x08priority\x18\x02 \x01(\r\"T\n\x0b\x42oostPolicy\x12\x16\n\x12POLICY_UNSPECIFIED\x10\x00\x12\x16\n\x12POLICY_SCHED_OTHER\x10\x01\x12\x15\n\x11POLICY_SCHED_FIFO\x10\x02\"\xeb\x03\n\x12ProcessStatsConfig\x12:\n\x06quirks\x18\x01 \x03(\x0e\x32*.perfetto.protos.ProcessStatsConfig.Quirks\x12#\n\x1bscan_all_processes_on_start\x18\x02 \x01(\x08\x12\x1b\n\x13record_thread_names\x18\x03 \x01(\x08\x12\x1a\n\x12proc_stats_poll_ms\x18\x04 \x01(\r\x12\x1f\n\x17proc_stats_cache_ttl_ms\x18\x06 \x01(\r\x12\x19\n\x11scan_smaps_rollup\x18\n \x01(\x08\x12\x1a\n\x12record_process_age\x18\x0b \x01(\x08\x12\x1e\n\x16record_process_runtime\x18\x0c \x01(\x08\x12!\n\x19record_process_dmabuf_rss\x18\r \x01(\x08\x12\x1b\n\x13resolve_process_fds\x18\t \x01(\x08\x12 \n\x18skip_main_thread_message\x18\x0e \x01(\x08\"U\n\x06Quirks\x12\x16\n\x12QUIRKS_UNSPECIFIED\x10\x00\x12\x1c\n\x14\x44ISABLE_INITIAL_DUMP\x10\x01\x1a\x02\x08\x01\x12\x15\n\x11\x44ISABLE_ON_DEMAND\x10\x02J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"\xcc\x06\n\x0fHeapprofdConfig\x12\x1f\n\x17sampling_interval_bytes\x18\x01 \x01(\x04\x12)\n!adaptive_sampling_shmem_threshold\x18\x18 \x01(\x04\x12\x35\n-adaptive_sampling_max_sampling_interval_bytes\x18\x19 \x01(\x04\x12\x17\n\x0fprocess_cmdline\x18\x02 \x03(\t\x12\x0b\n\x03pid\x18\x04 \x03(\x04\x12\x1b\n\x13target_installed_by\x18\x1a \x03(\t\x12\r\n\x05heaps\x18\x14 \x03(\t\x12\x15\n\rexclude_heaps\x18\x1b \x03(\t\x12\x1a\n\x12stream_allocations\x18\x17 \x01(\x08\x12\x1f\n\x17heap_sampling_intervals\x18\x16 \x03(\x04\x12\x11\n\tall_heaps\x18\x15 \x01(\x08\x12\x0b\n\x03\x61ll\x18\x05 \x01(\x08\x12\x1f\n\x17min_anonymous_memory_kb\x18\x0f \x01(\r\x12\x1f\n\x17max_heapprofd_memory_kb\x18\x10 \x01(\r\x12\x1e\n\x16max_heapprofd_cpu_secs\x18\x11 \x01(\x04\x12\x1a\n\x12skip_symbol_prefix\x18\x07 \x03(\t\x12U\n\x16\x63ontinuous_dump_config\x18\x06 \x01(\x0b\x32\x35.perfetto.protos.HeapprofdConfig.ContinuousDumpConfig\x12\x18\n\x10shmem_size_bytes\x18\x08 \x01(\x04\x12\x14\n\x0c\x62lock_client\x18\t \x01(\x08\x12\x1f\n\x17\x62lock_client_timeout_us\x18\x0e \x01(\r\x12\x12\n\nno_startup\x18\n \x01(\x08\x12\x12\n\nno_running\x18\x0b \x01(\x08\x12\x13\n\x0b\x64ump_at_max\x18\r \x01(\x08\x12\x1d\n\x15\x64isable_fork_teardown\x18\x12 \x01(\x08\x12\x1f\n\x17\x64isable_vfork_detection\x18\x13 \x01(\x08\x1aG\n\x14\x43ontinuousDumpConfig\x12\x15\n\rdump_phase_ms\x18\x05 \x01(\r\x12\x18\n\x10\x64ump_interval_ms\x18\x06 \x01(\rJ\x04\x08\x0c\x10\r\"\xe0\x03\n\x0bSmapsConfig\x12\x39\n\nvma_fields\x18\x01 \x03(\x0e\x32%.perfetto.protos.SmapsConfig.VmaField\x12\x14\n\x0cunaggregated\x18\x02 \x01(\x08\x12<\n\x14name_redaction_rules\x18\x03 \x03(\x0b\x32\x1e.perfetto.protos.RedactionRule\"\xc1\x02\n\x08VmaField\x12\x15\n\x11VMA_FIELD_UNKNOWN\x10\x00\x12\x12\n\x0eVMA_FIELD_SIZE\x10\x01\x12\x11\n\rVMA_FIELD_RSS\x10\x02\x12\x17\n\x13VMA_FIELD_ANONYMOUS\x10\x03\x12\x12\n\x0eVMA_FIELD_SWAP\x10\x04\x12\x1a\n\x16VMA_FIELD_SHARED_CLEAN\x10\x05\x12\x1a\n\x16VMA_FIELD_SHARED_DIRTY\x10\x06\x12\x1b\n\x17VMA_FIELD_PRIVATE_CLEAN\x10\x07\x12\x1b\n\x17VMA_FIELD_PRIVATE_DIRTY\x10\x08\x12\x14\n\x10VMA_FIELD_LOCKED\x10\t\x12\x11\n\rVMA_FIELD_PSS\x10\n\x12\x17\n\x13VMA_FIELD_PSS_DIRTY\x10\x0b\x12\x16\n\x12VMA_FIELD_SWAP_PSS\x10\x0c\"\xb6\x02\n\rRedactionRule\x12\x0f\n\x07pattern\x18\x01 \x01(\t\x12<\n\nmatch_mode\x18\x02 \x01(\x0e\x32(.perfetto.protos.RedactionRule.MatchMode\x12\x11\n\tkeep_full\x18\x03 \x01(\x08\x12\x18\n\x10replacement_name\x18\x04 \x01(\t\x12\x1b\n\x13keep_file_extension\x18\x05 \x01(\x08\x12\x1a\n\x12keep_path_elements\x18\x06 \x01(\r\"p\n\tMatchMode\x12\x16\n\x12MATCH_MODE_UNKNOWN\x10\x00\x12\x15\n\x11MATCH_MODE_PREFIX\x10\x01\x12\x18\n\x14MATCH_MODE_GLOB_PATH\x10\x02\x12\x1a\n\x16MATCH_MODE_GLOB_STRING\x10\x03\"\xd1\x03\n\x0fJavaHprofConfig\x12\x17\n\x0fprocess_cmdline\x18\x01 \x03(\t\x12\x0b\n\x03pid\x18\x02 \x03(\x04\x12\x1b\n\x13target_installed_by\x18\x07 \x03(\t\x12U\n\x16\x63ontinuous_dump_config\x18\x03 \x01(\x0b\x32\x35.perfetto.protos.JavaHprofConfig.ContinuousDumpConfig\x12\x1f\n\x17min_anonymous_memory_kb\x18\x04 \x01(\r\x12\x1d\n\x15min_java_heap_size_kb\x18\t \x01(\r\x12\x12\n\ndump_smaps\x18\x05 \x01(\x08\x12\x32\n\x0csmaps_config\x18\x08 \x01(\x0b\x32\x1c.perfetto.protos.SmapsConfig\x12\x15\n\rignored_types\x18\x06 \x03(\t\x12\x1b\n\x13\x64ump_oome_callstack\x18\n \x01(\x08\x1ah\n\x14\x43ontinuousDumpConfig\x12\x15\n\rdump_phase_ms\x18\x01 \x01(\r\x12\x18\n\x10\x64ump_interval_ms\x18\x02 \x01(\r\x12\x1f\n\x17scan_pids_only_on_start\x18\x03 \x01(\x08\"\xc9\n\n\nPerfEvents\x1a\x9d\x03\n\x08Timebase\x12\x13\n\tfrequency\x18\x02 \x01(\x04H\x00\x12\x10\n\x06period\x18\x01 \x01(\x04H\x00\x12\x18\n\x0epoll_period_ms\x18\x06 \x01(\rH\x00\x12\x36\n\x07\x63ounter\x18\x04 \x01(\x0e\x32#.perfetto.protos.PerfEvents.CounterH\x01\x12<\n\ntracepoint\x18\x03 \x01(\x0b\x32&.perfetto.protos.PerfEvents.TracepointH\x01\x12\x39\n\traw_event\x18\x05 \x01(\x0b\x32$.perfetto.protos.PerfEvents.RawEventH\x01\x12<\n\tmodifiers\x18\x0c \x03(\x0e\x32).perfetto.protos.PerfEvents.EventModifier\x12>\n\x0ftimestamp_clock\x18\x0b \x01(\x0e\x32%.perfetto.protos.PerfEvents.PerfClock\x12\x0c\n\x04name\x18\n \x01(\tB\n\n\x08intervalB\x07\n\x05\x65vent\x1a*\n\nTracepoint\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x66ilter\x18\x02 \x01(\t\x1a\\\n\x08RawEvent\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0e\n\x06\x63onfig\x18\x02 \x01(\x04\x12\x0f\n\x07\x63onfig1\x18\x03 \x01(\x04\x12\x0f\n\x07\x63onfig2\x18\x04 \x01(\x04\x12\x10\n\x08pmu_name\x18\x05 \x01(\t\"\xe8\x03\n\x07\x43ounter\x12\x13\n\x0fUNKNOWN_COUNTER\x10\x00\x12\x10\n\x0cSW_CPU_CLOCK\x10\x01\x12\x12\n\x0eSW_PAGE_FAULTS\x10\x02\x12\x11\n\rSW_TASK_CLOCK\x10\x03\x12\x17\n\x13SW_CONTEXT_SWITCHES\x10\x04\x12\x15\n\x11SW_CPU_MIGRATIONS\x10\x05\x12\x16\n\x12SW_PAGE_FAULTS_MIN\x10\x06\x12\x16\n\x12SW_PAGE_FAULTS_MAJ\x10\x07\x12\x17\n\x13SW_ALIGNMENT_FAULTS\x10\x08\x12\x17\n\x13SW_EMULATION_FAULTS\x10\t\x12\x0c\n\x08SW_DUMMY\x10\x14\x12\x11\n\rHW_CPU_CYCLES\x10\n\x12\x13\n\x0fHW_INSTRUCTIONS\x10\x0b\x12\x17\n\x13HW_CACHE_REFERENCES\x10\x0c\x12\x13\n\x0fHW_CACHE_MISSES\x10\r\x12\x1a\n\x16HW_BRANCH_INSTRUCTIONS\x10\x0e\x12\x14\n\x10HW_BRANCH_MISSES\x10\x0f\x12\x11\n\rHW_BUS_CYCLES\x10\x10\x12\x1e\n\x1aHW_STALLED_CYCLES_FRONTEND\x10\x11\x12\x1d\n\x19HW_STALLED_CYCLES_BACKEND\x10\x12\x12\x15\n\x11HW_REF_CPU_CYCLES\x10\x13\"\x8d\x01\n\tPerfClock\x12\x16\n\x12UNKNOWN_PERF_CLOCK\x10\x00\x12\x17\n\x13PERF_CLOCK_REALTIME\x10\x01\x12\x18\n\x14PERF_CLOCK_MONOTONIC\x10\x02\x12\x1c\n\x18PERF_CLOCK_MONOTONIC_RAW\x10\x03\x12\x17\n\x13PERF_CLOCK_BOOTTIME\x10\x04\"\x95\x01\n\rEventModifier\x12\x1a\n\x16UNKNOWN_EVENT_MODIFIER\x10\x00\x12\"\n\x1e\x45VENT_MODIFIER_COUNT_USERSPACE\x10\x01\x12\x1f\n\x1b\x45VENT_MODIFIER_COUNT_KERNEL\x10\x02\x12#\n\x1f\x45VENT_MODIFIER_COUNT_HYPERVISOR\x10\x03\"\x95\x02\n\rFollowerEvent\x12\x36\n\x07\x63ounter\x18\x01 \x01(\x0e\x32#.perfetto.protos.PerfEvents.CounterH\x00\x12<\n\ntracepoint\x18\x02 \x01(\x0b\x32&.perfetto.protos.PerfEvents.TracepointH\x00\x12\x39\n\traw_event\x18\x03 \x01(\x0b\x32$.perfetto.protos.PerfEvents.RawEventH\x00\x12<\n\tmodifiers\x18\x05 \x03(\x0e\x32).perfetto.protos.PerfEvents.EventModifier\x12\x0c\n\x04name\x18\x04 \x01(\tB\x07\n\x05\x65vent\"\x85\t\n\x0fPerfEventConfig\x12\x36\n\x08timebase\x18\x0f \x01(\x0b\x32$.perfetto.protos.PerfEvents.Timebase\x12\x31\n\tfollowers\x18\x13 \x03(\x0b\x32\x1e.perfetto.protos.FollowerEvent\x12N\n\x12\x63\x61llstack_sampling\x18\x10 \x01(\x0b\x32\x32.perfetto.protos.PerfEventConfig.CallstackSampling\x12\x12\n\ntarget_cpu\x18\x14 \x03(\r\x12\x1b\n\x13ignore_open_failure\x18\x15 \x01(\x08\x12\r\n\x05\x63puid\x18\x16 \x03(\t\x12\"\n\x1aring_buffer_read_period_ms\x18\x08 \x01(\r\x12\x19\n\x11ring_buffer_pages\x18\x03 \x01(\r\x12!\n\x19max_enqueued_footprint_kb\x18\x11 \x01(\x04\x12\x1c\n\x14max_daemon_memory_kb\x18\r \x01(\r\x12$\n\x1cremote_descriptor_timeout_ms\x18\t \x01(\r\x12$\n\x1cunwind_state_clear_period_ms\x18\n \x01(\r\x12\x1b\n\x13target_installed_by\x18\x12 \x03(\t\x12\x10\n\x08\x61ll_cpus\x18\x01 \x01(\x08\x12\x1a\n\x12sampling_frequency\x18\x02 \x01(\r\x12\x15\n\rkernel_frames\x18\x0c \x01(\x08\x12\x12\n\ntarget_pid\x18\x04 \x03(\x05\x12\x16\n\x0etarget_cmdline\x18\x05 \x03(\t\x12\x13\n\x0b\x65xclude_pid\x18\x06 \x03(\x05\x12\x17\n\x0f\x65xclude_cmdline\x18\x07 \x03(\t\x12 \n\x18\x61\x64\x64itional_cmdline_count\x18\x0b \x01(\r\x1a\xa3\x01\n\x11\x43\x61llstackSampling\x12\x35\n\x05scope\x18\x01 \x01(\x0b\x32&.perfetto.protos.PerfEventConfig.Scope\x12\x15\n\rkernel_frames\x18\x02 \x01(\x08\x12@\n\x0buser_frames\x18\x03 \x01(\x0e\x32+.perfetto.protos.PerfEventConfig.UnwindMode\x1a\xa0\x01\n\x05Scope\x12\x12\n\ntarget_pid\x18\x01 \x03(\x05\x12\x16\n\x0etarget_cmdline\x18\x02 \x03(\t\x12\x13\n\x0b\x65xclude_pid\x18\x03 \x03(\x05\x12\x17\n\x0f\x65xclude_cmdline\x18\x04 \x03(\t\x12 \n\x18\x61\x64\x64itional_cmdline_count\x18\x05 \x01(\r\x12\x1b\n\x13process_shard_count\x18\x06 \x01(\r\"~\n\nUnwindMode\x12\x12\n\x0eUNWIND_UNKNOWN\x10\x00\x12\x0f\n\x0bUNWIND_SKIP\x10\x01\x12\x10\n\x0cUNWIND_DWARF\x10\x02\x12\x18\n\x14UNWIND_FRAME_POINTER\x10\x03\x12\x1f\n\x1bUNWIND_KERNEL_FRAME_POINTER\x10\x04J\x04\x08\x0e\x10\x0f\"(\n\rProtoVmConfig\x12\x17\n\x0fmemory_limit_kb\x18\x01 \x01(\r\"\xbf\x01\n\tQnxConfig\x12\x1a\n\x12qnx_kernel_buffers\x18\x01 \x01(\r\x12\x1b\n\x13qnx_kernel_kbuffers\x18\x02 \x01(\r\x12\x1e\n\x16qnx_kernel_wide_events\x18\x03 \x01(\x08\x12\x17\n\x0fqnx_cache_pages\x18\x04 \x01(\r\x12\x1b\n\x13qnx_cache_max_pages\x18\x05 \x01(\x05\x12#\n\x1bqnx_trace_buffer_init_bytes\x18\x06 \x01(\r\"\x9a\x01\n\x13StatsdTracingConfig\x12-\n\x0cpush_atom_id\x18\x01 \x03(\x0e\x32\x17.perfetto.protos.AtomId\x12\x18\n\x10raw_push_atom_id\x18\x02 \x03(\x05\x12:\n\x0bpull_config\x18\x03 \x03(\x0b\x32%.perfetto.protos.StatsdPullAtomConfig\"\x8c\x01\n\x14StatsdPullAtomConfig\x12-\n\x0cpull_atom_id\x18\x01 \x03(\x0e\x32\x17.perfetto.protos.AtomId\x12\x18\n\x10raw_pull_atom_id\x18\x02 \x03(\x05\x12\x19\n\x11pull_frequency_ms\x18\x03 \x01(\x05\x12\x10\n\x08packages\x18\x04 \x03(\t\"\x84\x05\n\x0eSysStatsConfig\x12\x19\n\x11meminfo_period_ms\x18\x01 \x01(\r\x12:\n\x10meminfo_counters\x18\x02 \x03(\x0e\x32 .perfetto.protos.MeminfoCounters\x12\x18\n\x10vmstat_period_ms\x18\x03 \x01(\r\x12\x38\n\x0fvmstat_counters\x18\x04 \x03(\x0e\x32\x1f.perfetto.protos.VmstatCounters\x12\x16\n\x0estat_period_ms\x18\x05 \x01(\r\x12\x43\n\rstat_counters\x18\x06 \x03(\x0e\x32,.perfetto.protos.SysStatsConfig.StatCounters\x12\x19\n\x11\x64\x65vfreq_period_ms\x18\x07 \x01(\r\x12\x19\n\x11\x63pufreq_period_ms\x18\x08 \x01(\r\x12\x1b\n\x13\x62uddyinfo_period_ms\x18\t \x01(\r\x12\x1a\n\x12\x64iskstat_period_ms\x18\n \x01(\r\x12\x15\n\rpsi_period_ms\x18\x0b \x01(\r\x12\x19\n\x11thermal_period_ms\x18\x0c \x01(\r\x12\x19\n\x11\x63puidle_period_ms\x18\r \x01(\r\x12\x19\n\x11gpufreq_period_ms\x18\x0e \x01(\r\x12\x16\n\x0eslab_period_ms\x18\x0f \x01(\r\"{\n\x0cStatCounters\x12\x14\n\x10STAT_UNSPECIFIED\x10\x00\x12\x12\n\x0eSTAT_CPU_TIMES\x10\x01\x12\x13\n\x0fSTAT_IRQ_COUNTS\x10\x02\x12\x17\n\x13STAT_SOFTIRQ_COUNTS\x10\x03\x12\x13\n\x0fSTAT_FORK_COUNT\x10\x04\"%\n\x10SystemInfoConfig\x12\x11\n\tirq_names\x18\x01 \x01(\x08\"\x8d\x04\n\nTestConfig\x12\x15\n\rmessage_count\x18\x01 \x01(\r\x12\x1f\n\x17max_messages_per_second\x18\x02 \x01(\r\x12\x0c\n\x04seed\x18\x03 \x01(\r\x12\x14\n\x0cmessage_size\x18\x04 \x01(\r\x12\x1e\n\x16send_batch_on_register\x18\x05 \x01(\x08\x12=\n\x0c\x64ummy_fields\x18\x06 \x01(\x0b\x32\'.perfetto.protos.TestConfig.DummyFields\x1a\xc3\x02\n\x0b\x44ummyFields\x12\x14\n\x0c\x66ield_uint32\x18\x01 \x01(\r\x12\x13\n\x0b\x66ield_int32\x18\x02 \x01(\x05\x12\x14\n\x0c\x66ield_uint64\x18\x03 \x01(\x04\x12\x13\n\x0b\x66ield_int64\x18\x04 \x01(\x03\x12\x15\n\rfield_fixed64\x18\x05 \x01(\x06\x12\x16\n\x0e\x66ield_sfixed64\x18\x06 \x01(\x10\x12\x15\n\rfield_fixed32\x18\x07 \x01(\x07\x12\x16\n\x0e\x66ield_sfixed32\x18\x08 \x01(\x0f\x12\x14\n\x0c\x66ield_double\x18\t \x01(\x01\x12\x13\n\x0b\x66ield_float\x18\n \x01(\x02\x12\x14\n\x0c\x66ield_sint64\x18\x0b \x01(\x12\x12\x14\n\x0c\x66ield_sint32\x18\x0c \x01(\x11\x12\x14\n\x0c\x66ield_string\x18\r \x01(\t\x12\x13\n\x0b\x66ield_bytes\x18\x0e \x01(\x0c\"\xd2\x02\n\x10TrackEventConfig\x12\x1b\n\x13\x64isabled_categories\x18\x01 \x03(\t\x12\x1a\n\x12\x65nabled_categories\x18\x02 \x03(\t\x12\x15\n\rdisabled_tags\x18\x03 \x03(\t\x12\x14\n\x0c\x65nabled_tags\x18\x04 \x03(\t\x12&\n\x1e\x64isable_incremental_timestamps\x18\x05 \x01(\x08\x12!\n\x19timestamp_unit_multiplier\x18\x06 \x01(\x04\x12 \n\x18\x66ilter_debug_annotations\x18\x07 \x01(\x08\x12#\n\x1b\x65nable_thread_time_sampling\x18\x08 \x01(\x08\x12\"\n\x1athread_time_subsampling_ns\x18\n \x01(\x04\x12\"\n\x1a\x66ilter_dynamic_event_names\x18\t \x01(\x08\"\xc8 \n\x10\x44\x61taSourceConfig\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rtarget_buffer\x18\x02 \x01(\r\x12\x1a\n\x12target_buffer_name\x18\x0b \x01(\t\x12\x19\n\x11trace_duration_ms\x18\x03 \x01(\r\x12)\n!prefer_suspend_clock_for_duration\x18z \x01(\x08\x12\x17\n\x0fstop_timeout_ms\x18\x07 \x01(\r\x12\x1f\n\x17\x65nable_extra_guardrails\x18\x06 \x01(\x08\x12M\n\x11session_initiator\x18\x08 \x01(\x0e\x32\x32.perfetto.protos.DataSourceConfig.SessionInitiator\x12\x1a\n\x12tracing_session_id\x18\x04 \x01(\x04\x12X\n\x17\x62uffer_exhausted_policy\x18\t \x01(\x0e\x32\x37.perfetto.protos.DataSourceConfig.BufferExhaustedPolicy\x12<\n\x0epriority_boost\x18\n \x01(\x0b\x32$.perfetto.protos.PriorityBoostConfig\x12\x36\n\x0eprotovm_config\x18\x0c \x01(\x0b\x32\x1e.perfetto.protos.ProtoVmConfig\x12\x38\n\rftrace_config\x18\x64 \x01(\x0b\x32\x1d.perfetto.protos.FtraceConfigB\x02(\x01\x12?\n\x11inode_file_config\x18\x66 \x01(\x0b\x32 .perfetto.protos.InodeFileConfigB\x02(\x01\x12\x45\n\x14process_stats_config\x18g \x01(\x0b\x32#.perfetto.protos.ProcessStatsConfigB\x02(\x01\x12=\n\x10sys_stats_config\x18h \x01(\x0b\x32\x1f.perfetto.protos.SysStatsConfigB\x02(\x01\x12>\n\x10heapprofd_config\x18i \x01(\x0b\x32 .perfetto.protos.HeapprofdConfigB\x02(\x01\x12?\n\x11java_hprof_config\x18n \x01(\x0b\x32 .perfetto.protos.JavaHprofConfigB\x02(\x01\x12\x45\n\x14\x61ndroid_power_config\x18j \x01(\x0b\x32#.perfetto.protos.AndroidPowerConfigB\x02(\x01\x12\x41\n\x12\x61ndroid_log_config\x18k \x01(\x0b\x32!.perfetto.protos.AndroidLogConfigB\x02(\x01\x12\x41\n\x12gpu_counter_config\x18l \x01(\x0b\x32!.perfetto.protos.GpuCounterConfigB\x02(\x01\x12\x65\n%android_game_intervention_list_config\x18t \x01(\x0b\x32\x32.perfetto.protos.AndroidGameInterventionListConfigB\x02(\x01\x12\x45\n\x14packages_list_config\x18m \x01(\x0b\x32#.perfetto.protos.PackagesListConfigB\x02(\x01\x12?\n\x11perf_event_config\x18o \x01(\x0b\x32 .perfetto.protos.PerfEventConfigB\x02(\x01\x12\x45\n\x14vulkan_memory_config\x18p \x01(\x0b\x32#.perfetto.protos.VulkanMemoryConfigB\x02(\x01\x12\x41\n\x12track_event_config\x18q \x01(\x0b\x32!.perfetto.protos.TrackEventConfigB\x02(\x01\x12R\n\x1b\x61ndroid_polled_state_config\x18r \x01(\x0b\x32).perfetto.protos.AndroidPolledStateConfigB\x02(\x01\x12X\n\x1e\x61ndroid_system_property_config\x18v \x01(\x0b\x32,.perfetto.protos.AndroidSystemPropertyConfigB\x02(\x01\x12G\n\x15statsd_tracing_config\x18u \x01(\x0b\x32$.perfetto.protos.StatsdTracingConfigB\x02(\x01\x12=\n\x12system_info_config\x18w \x01(\x0b\x32!.perfetto.protos.SystemInfoConfig\x12\x46\n\x14\x66rozen_ftrace_config\x18\x88\x01 \x01(\x0b\x32#.perfetto.protos.FrozenFtraceConfigB\x02(\x01\x12\x34\n\rchrome_config\x18\x65 \x01(\x0b\x32\x1d.perfetto.protos.ChromeConfig\x12\x30\n\tv8_config\x18\x7f \x01(\x0b\x32\x19.perfetto.protos.V8ConfigB\x02(\x01\x12>\n\x12interceptor_config\x18s \x01(\x0b\x32\".perfetto.protos.InterceptorConfig\x12R\n\x1bnetwork_packet_trace_config\x18x \x01(\x0b\x32).perfetto.protos.NetworkPacketTraceConfigB\x02(\x01\x12U\n\x1csurfaceflinger_layers_config\x18y \x01(\x0b\x32+.perfetto.protos.SurfaceFlingerLayersConfigB\x02(\x01\x12\x61\n\"surfaceflinger_transactions_config\x18{ \x01(\x0b\x32\x31.perfetto.protos.SurfaceFlingerTransactionsConfigB\x02(\x01\x12[\n android_sdk_sysprop_guard_config\x18| \x01(\x0b\x32-.perfetto.protos.AndroidSdkSyspropGuardConfigB\x02(\x01\x12\x32\n\netw_config\x18} \x01(\x0b\x32\x1a.perfetto.protos.EtwConfigB\x02(\x01\x12<\n\x0fprotolog_config\x18~ \x01(\x0b\x32\x1f.perfetto.protos.ProtoLogConfigB\x02(\x01\x12Q\n\x1a\x61ndroid_input_event_config\x18\x80\x01 \x01(\x0b\x32(.perfetto.protos.AndroidInputEventConfigB\x02(\x01\x12\x42\n\x12pixel_modem_config\x18\x81\x01 \x01(\x0b\x32!.perfetto.protos.PixelModemConfigB\x02(\x01\x12G\n\x14windowmanager_config\x18\x82\x01 \x01(\x0b\x32$.perfetto.protos.WindowManagerConfigB\x02(\x01\x12R\n\x17\x63hromium_system_metrics\x18\x83\x01 \x01(\x0b\x32,.perfetto.protos.ChromiumSystemMetricsConfigB\x02(\x01\x12L\n\x17kernel_wakelocks_config\x18\x84\x01 \x01(\x0b\x32&.perfetto.protos.KernelWakelocksConfigB\x02(\x01\x12L\n\x17gpu_renderstages_config\x18\x85\x01 \x01(\x0b\x32&.perfetto.protos.GpuRenderStagesConfigB\x02(\x01\x12X\n\x1a\x63hromium_histogram_samples\x18\x86\x01 \x01(\x0b\x32/.perfetto.protos.ChromiumHistogramSamplesConfigB\x02(\x01\x12\x46\n\x14\x61pp_wakelocks_config\x18\x87\x01 \x01(\x0b\x32#.perfetto.protos.AppWakelocksConfigB\x02(\x01\x12\x41\n\x12\x63pu_per_uid_config\x18\x89\x01 \x01(\x0b\x32 .perfetto.protos.CpuPerUidConfigB\x02(\x01\x12\x45\n\x10user_list_config\x18\x8a\x01 \x01(\x0b\x32&.perfetto.protos.AndroidUserListConfigB\x02(\x01\x12\x43\n\x12inputmethod_config\x18\x8b\x01 \x01(\x0b\x32\".perfetto.protos.InputMethodConfigB\x02(\x01\x12H\n\x15\x61ndroid_aflags_config\x18\x8c\x01 \x01(\x0b\x32$.perfetto.protos.AndroidAflagsConfigB\x02(\x01\x12\x44\n\x0fjournald_config\x18\x8d\x01 \x01(\x0b\x32&.perfetto.protos.SystemdJournaldConfigB\x02(\x01\x12\x46\n\x14\x64isplay_video_config\x18\x8e\x01 \x01(\x0b\x32#.perfetto.protos.DisplayVideoConfigB\x02(\x01\x12\x63\n chromium_stack_sampling_profiler\x18\x8f\x01 \x01(\x0b\x32\x34.perfetto.protos.ChromiumStackSamplingProfilerConfigB\x02(\x01\x12\x61\n\x1f\x63hromium_sampling_heap_profiler\x18\x90\x01 \x01(\x0b\x32\x33.perfetto.protos.ChromiumSamplingHeapProfilerConfigB\x02(\x01\x12\x33\n\nqnx_config\x18\x96\x01 \x01(\x0b\x32\x1a.perfetto.protos.QnxConfigB\x02(\x01\x12\x16\n\rlegacy_config\x18\xe8\x07 \x01(\t\x12\x31\n\x0b\x66or_testing\x18\xe9\x07 \x01(\x0b\x32\x1b.perfetto.protos.TestConfig\"[\n\x10SessionInitiator\x12!\n\x1dSESSION_INITIATOR_UNSPECIFIED\x10\x00\x12$\n SESSION_INITIATOR_TRUSTED_SYSTEM\x10\x01\"\xa1\x01\n\x15\x42ufferExhaustedPolicy\x12 \n\x1c\x42UFFER_EXHAUSTED_UNSPECIFIED\x10\x00\x12\x19\n\x15\x42UFFER_EXHAUSTED_DROP\x10\x01\x12%\n!BUFFER_EXHAUSTED_STALL_THEN_ABORT\x10\x02\x12$\n BUFFER_EXHAUSTED_STALL_THEN_DROP\x10\x03J\x0b\x08\xff\xff\xff\x7f\x10\x80\x80\x80\x80\x01\"\xe4-\n\x0bTraceConfig\x12:\n\x07\x62uffers\x18\x01 \x03(\x0b\x32).perfetto.protos.TraceConfig.BufferConfig\x12=\n\x0c\x64\x61ta_sources\x18\x02 \x03(\x0b\x32\'.perfetto.protos.TraceConfig.DataSource\x12L\n\x14\x62uiltin_data_sources\x18\x14 \x01(\x0b\x32..perfetto.protos.TraceConfig.BuiltinDataSource\x12\x13\n\x0b\x64uration_ms\x18\x03 \x01(\r\x12)\n!prefer_suspend_clock_for_duration\x18$ \x01(\x08\x12\x1f\n\x17\x65nable_extra_guardrails\x18\x04 \x01(\x08\x12I\n\rlockdown_mode\x18\x05 \x01(\x0e\x32\x32.perfetto.protos.TraceConfig.LockdownModeOperation\x12>\n\tproducers\x18\x06 \x03(\x0b\x32+.perfetto.protos.TraceConfig.ProducerConfig\x12\x44\n\x0fstatsd_metadata\x18\x07 \x01(\x0b\x32+.perfetto.protos.TraceConfig.StatsdMetadata\x12\x17\n\x0fwrite_into_file\x18\x08 \x01(\x08\x12\x13\n\x0boutput_path\x18\x1d \x01(\t\x12\x1c\n\x14\x66ile_write_period_ms\x18\t \x01(\r\x12\x1b\n\x13max_file_size_bytes\x18\n \x01(\x04\x12L\n\x13guardrail_overrides\x18\x0b \x01(\x0b\x32/.perfetto.protos.TraceConfig.GuardrailOverrides\x12\x16\n\x0e\x64\x65\x66\x65rred_start\x18\x0c \x01(\x08\x12\x17\n\x0f\x66lush_period_ms\x18\r \x01(\r\x12\x18\n\x10\x66lush_timeout_ms\x18\x0e \x01(\r\x12#\n\x1b\x64\x61ta_source_stop_timeout_ms\x18\x17 \x01(\r\x12\x16\n\x0enotify_traceur\x18\x10 \x01(\x08\x12\x17\n\x0f\x62ugreport_score\x18\x1e \x01(\x05\x12\x1a\n\x12\x62ugreport_filename\x18& \x01(\t\x12\x42\n\x0etrigger_config\x18\x11 \x01(\x0b\x32*.perfetto.protos.TraceConfig.TriggerConfig\x12\x19\n\x11\x61\x63tivate_triggers\x18\x12 \x03(\t\x12U\n\x18incremental_state_config\x18\x15 \x01(\x0b\x32\x33.perfetto.protos.TraceConfig.IncrementalStateConfig\x12$\n\x18\x61llow_user_build_tracing\x18\x13 \x01(\x08\x42\x02\x18\x01\x12\x1b\n\x13unique_session_name\x18\x16 \x01(\t\x12J\n\x10\x63ompression_type\x18\x18 \x01(\x0e\x32,.perfetto.protos.TraceConfig.CompressionTypeB\x02\x18\x01\x12\x43\n\x0b\x63ompression\x18/ \x01(\x0b\x32..perfetto.protos.TraceConfig.CompressionConfig\x12Q\n\x16incident_report_config\x18\x19 \x01(\x0b\x32\x31.perfetto.protos.TraceConfig.IncidentReportConfig\x12\x42\n\x0estatsd_logging\x18\x1f \x01(\x0e\x32*.perfetto.protos.TraceConfig.StatsdLogging\x12\x1a\n\x0etrace_uuid_msb\x18\x1b \x01(\x03\x42\x02\x18\x01\x12\x1a\n\x0etrace_uuid_lsb\x18\x1c \x01(\x03\x42\x02\x18\x01\x12>\n\x0ctrace_filter\x18! \x01(\x0b\x32(.perfetto.protos.TraceConfig.TraceFilter\x12O\n\x15\x61ndroid_report_config\x18\" \x01(\x0b\x32\x30.perfetto.protos.TraceConfig.AndroidReportConfig\x12N\n\x15\x63md_trace_start_delay\x18# \x01(\x0b\x32/.perfetto.protos.TraceConfig.CmdTraceStartDelay\x12I\n\x12session_semaphores\x18\' \x03(\x0b\x32-.perfetto.protos.TraceConfig.SessionSemaphore\x12<\n\x0epriority_boost\x18( \x01(\x0b\x32$.perfetto.protos.PriorityBoostConfig\x12\x16\n\x0e\x65xclusive_prio\x18) \x01(\r\x12\x45\n\x10write_flush_mode\x18, \x01(\x0e\x32+.perfetto.protos.TraceConfig.WriteFlushMode\x12\x42\n\x11\x66\x66lush_post_write\x18- \x01(\x0e\x32\'.perfetto.protos.TraceConfig.FFlushMode\x12\x1a\n\x12trace_all_machines\x18+ \x01(\x08\x12:\n\x10trace_attributes\x18\x30 \x01(\x0b\x32 .perfetto.protos.TraceAttributes\x1a\x94\x03\n\x0c\x42ufferConfig\x12\x0f\n\x07size_kb\x18\x01 \x01(\r\x12I\n\x0b\x66ill_policy\x18\x04 \x01(\x0e\x32\x34.perfetto.protos.TraceConfig.BufferConfig.FillPolicy\x12\x19\n\x11transfer_on_clone\x18\x05 \x01(\x08\x12\x1a\n\x12\x63lear_before_clone\x18\x06 \x01(\x08\x12\x0c\n\x04name\x18\x07 \x01(\t\x12U\n\x11\x65xperimental_mode\x18\x08 \x01(\x0e\x32:.perfetto.protos.TraceConfig.BufferConfig.ExperimentalMode\";\n\nFillPolicy\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0f\n\x0bRING_BUFFER\x10\x01\x12\x0b\n\x07\x44ISCARD\x10\x02\"C\n\x10\x45xperimentalMode\x12\x14\n\x10MODE_UNSPECIFIED\x10\x00\x12\x13\n\x0fTRACE_BUFFER_V2\x10\x01\"\x04\x08\x02\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04\x1a\x9e\x01\n\nDataSource\x12\x31\n\x06\x63onfig\x18\x01 \x01(\x0b\x32!.perfetto.protos.DataSourceConfig\x12\x1c\n\x14producer_name_filter\x18\x02 \x03(\t\x12\"\n\x1aproducer_name_regex_filter\x18\x03 \x03(\t\x12\x1b\n\x13machine_name_filter\x18\x04 \x03(\t\x1a\x90\x03\n\x11\x42uiltinDataSource\x12\"\n\x1a\x64isable_clock_snapshotting\x18\x01 \x01(\x08\x12\x1c\n\x14\x64isable_trace_config\x18\x02 \x01(\x08\x12\x1b\n\x13\x64isable_system_info\x18\x03 \x01(\x08\x12\x1e\n\x16\x64isable_service_events\x18\x04 \x01(\x08\x12:\n\x13primary_trace_clock\x18\x05 \x01(\x0e\x32\x1d.perfetto.protos.BuiltinClock\x12\x1c\n\x14snapshot_interval_ms\x18\x06 \x01(\r\x12)\n!prefer_suspend_clock_for_snapshot\x18\x07 \x01(\x08\x12&\n\x1e\x64isable_chunk_usage_histograms\x18\x08 \x01(\x08\x12%\n\x1d\x64isable_extension_descriptors\x18\t \x01(\x08\x12(\n enable_concurrent_session_events\x18\n \x01(\x08\x1aR\n\x0eProducerConfig\x12\x15\n\rproducer_name\x18\x01 \x01(\t\x12\x13\n\x0bshm_size_kb\x18\x02 \x01(\r\x12\x14\n\x0cpage_size_kb\x18\x03 \x01(\r\x1a\x8e\x01\n\x0eStatsdMetadata\x12\x1b\n\x13triggering_alert_id\x18\x01 \x01(\x03\x12\x1d\n\x15triggering_config_uid\x18\x02 \x01(\x05\x12\x1c\n\x14triggering_config_id\x18\x03 \x01(\x03\x12\"\n\x1atriggering_subscription_id\x18\x04 \x01(\x03\x1a^\n\x12GuardrailOverrides\x12$\n\x18max_upload_per_day_bytes\x18\x01 \x01(\x04\x42\x02\x18\x01\x12\"\n\x1amax_tracing_buffer_size_kb\x18\x02 \x01(\r\x1a\xca\x03\n\rTriggerConfig\x12L\n\x0ctrigger_mode\x18\x01 \x01(\x0e\x32\x36.perfetto.protos.TraceConfig.TriggerConfig.TriggerMode\x12\'\n\x1fuse_clone_snapshot_if_available\x18\x05 \x01(\x08\x12\x44\n\x08triggers\x18\x02 \x03(\x0b\x32\x32.perfetto.protos.TraceConfig.TriggerConfig.Trigger\x12\x1a\n\x12trigger_timeout_ms\x18\x03 \x01(\r\x1a{\n\x07Trigger\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x13producer_name_regex\x18\x02 \x01(\t\x12\x15\n\rstop_delay_ms\x18\x03 \x01(\r\x12\x14\n\x0cmax_per_24_h\x18\x04 \x01(\r\x12\x18\n\x10skip_probability\x18\x05 \x01(\x01\"]\n\x0bTriggerMode\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x11\n\rSTART_TRACING\x10\x01\x12\x10\n\x0cSTOP_TRACING\x10\x02\x12\x12\n\x0e\x43LONE_SNAPSHOT\x10\x04\"\x04\x08\x03\x10\x03J\x04\x08\x04\x10\x05\x1a\x31\n\x16IncrementalStateConfig\x12\x17\n\x0f\x63lear_period_ms\x18\x01 \x01(\r\x1a\xc1\x01\n\x11\x43ompressionConfig\x12G\n\x07\x64\x65\x66late\x18\x01 \x01(\x0b\x32\x36.perfetto.protos.TraceConfig.CompressionConfig.Deflate\x12\x41\n\x04zstd\x18\x02 \x01(\x0b\x32\x33.perfetto.protos.TraceConfig.CompressionConfig.Zstd\x1a\t\n\x07\x44\x65\x66late\x1a\x15\n\x04Zstd\x12\r\n\x05level\x18\x01 \x01(\x05\x1a\x97\x01\n\x14IncidentReportConfig\x12\x1b\n\x13\x64\x65stination_package\x18\x01 \x01(\t\x12\x19\n\x11\x64\x65stination_class\x18\x02 \x01(\t\x12\x15\n\rprivacy_level\x18\x03 \x01(\x05\x12\x16\n\x0eskip_incidentd\x18\x05 \x01(\x08\x12\x18\n\x0cskip_dropbox\x18\x04 \x01(\x08\x42\x02\x18\x01\x1a\x94\x06\n\x0bTraceFilter\x12\x10\n\x08\x62ytecode\x18\x01 \x01(\x0c\x12\x13\n\x0b\x62ytecode_v2\x18\x02 \x01(\x0c\x12W\n\x13string_filter_chain\x18\x03 \x01(\x0b\x32:.perfetto.protos.TraceConfig.TraceFilter.StringFilterChain\x12\x1c\n\x14\x62ytecode_overlay_v54\x18\x04 \x01(\x0c\x12[\n\x17string_filter_chain_v54\x18\x05 \x01(\x0b\x32:.perfetto.protos.TraceConfig.TraceFilter.StringFilterChain\x1a\xde\x01\n\x10StringFilterRule\x12K\n\x06policy\x18\x01 \x01(\x0e\x32;.perfetto.protos.TraceConfig.TraceFilter.StringFilterPolicy\x12\x15\n\rregex_pattern\x18\x02 \x01(\t\x12\"\n\x1a\x61trace_payload_starts_with\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x34\n\rsemantic_type\x18\x05 \x03(\x0e\x32\x1d.perfetto.protos.SemanticType\x1a]\n\x11StringFilterChain\x12H\n\x05rules\x18\x01 \x03(\x0b\x32\x39.perfetto.protos.TraceConfig.TraceFilter.StringFilterRule\"\xc9\x01\n\x12StringFilterPolicy\x12\x13\n\x0fSFP_UNSPECIFIED\x10\x00\x12\x1b\n\x17SFP_MATCH_REDACT_GROUPS\x10\x01\x12\"\n\x1eSFP_ATRACE_MATCH_REDACT_GROUPS\x10\x02\x12\x13\n\x0fSFP_MATCH_BREAK\x10\x03\x12\x1a\n\x16SFP_ATRACE_MATCH_BREAK\x10\x04\x12,\n(SFP_ATRACE_REPEATED_SEARCH_REDACT_GROUPS\x10\x05\x1a\x97\x01\n\x13\x41ndroidReportConfig\x12 \n\x18reporter_service_package\x18\x01 \x01(\t\x12\x1e\n\x16reporter_service_class\x18\x02 \x01(\t\x12\x13\n\x0bskip_report\x18\x03 \x01(\x08\x12)\n!use_pipe_in_framework_for_testing\x18\x04 \x01(\x08\x1a@\n\x12\x43mdTraceStartDelay\x12\x14\n\x0cmin_delay_ms\x18\x01 \x01(\r\x12\x14\n\x0cmax_delay_ms\x18\x02 \x01(\r\x1a\x41\n\x10SessionSemaphore\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1f\n\x17max_other_session_count\x18\x02 \x01(\x04\"U\n\x15LockdownModeOperation\x12\x16\n\x12LOCKDOWN_UNCHANGED\x10\x00\x12\x12\n\x0eLOCKDOWN_CLEAR\x10\x01\x12\x10\n\x0cLOCKDOWN_SET\x10\x02\"Q\n\x0f\x43ompressionType\x12 \n\x1c\x43OMPRESSION_TYPE_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43OMPRESSION_TYPE_DEFLATE\x10\x01\"h\n\rStatsdLogging\x12\x1e\n\x1aSTATSD_LOGGING_UNSPECIFIED\x10\x00\x12\x1a\n\x16STATSD_LOGGING_ENABLED\x10\x01\x12\x1b\n\x17STATSD_LOGGING_DISABLED\x10\x02\"v\n\x0eWriteFlushMode\x12\x1b\n\x17WRITE_FLUSH_UNSPECIFIED\x10\x00\x12\x14\n\x10WRITE_FLUSH_AUTO\x10\x01\x12\x18\n\x14WRITE_FLUSH_DISABLED\x10\x02\x12\x17\n\x13WRITE_FLUSH_ENABLED\x10\x03\"M\n\nFFlushMode\x12\x16\n\x12\x46\x46LUSH_UNSPECIFIED\x10\x00\x12\x13\n\x0f\x46\x46LUSH_DISABLED\x10\x01\x12\x12\n\x0e\x46\x46LUSH_ENABLED\x10\x02J\x04\x08\x0f\x10\x10J\x04\x08%\x10&J\x04\x08\x1a\x10\x1bJ\x04\x08 \x10!J\x04\x08*\x10+J\x04\x08.\x10/R\x05notes\"M\n\x07Utsname\x12\x0f\n\x07sysname\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x0f\n\x07release\x18\x03 \x01(\t\x12\x0f\n\x07machine\x18\x04 \x01(\t\"\xf2\x03\n\nSystemInfo\x12)\n\x07utsname\x18\x01 \x01(\x0b\x32\x18.perfetto.protos.Utsname\x12!\n\x19\x61ndroid_build_fingerprint\x18\x02 \x01(\t\x12#\n\x1b\x61ndroid_device_manufacturer\x18\x0e \x01(\t\x12\x19\n\x11\x61ndroid_soc_model\x18\t \x01(\t\x12\x1f\n\x17\x61ndroid_guest_soc_model\x18\r \x01(\t\x12!\n\x19\x61ndroid_hardware_revision\x18\n \x01(\t\x12\x1d\n\x15\x61ndroid_storage_model\x18\x0b \x01(\t\x12\x19\n\x11\x61ndroid_ram_model\x18\x0c \x01(\t\x12\x1e\n\x16\x61ndroid_serial_console\x18\x0f \x01(\t\x12\x1f\n\x17tracing_service_version\x18\x04 \x01(\t\x12\x1b\n\x13\x61ndroid_sdk_version\x18\x05 \x01(\x04\x12\x11\n\tpage_size\x18\x06 \x01(\r\x12\x10\n\x08num_cpus\x18\x08 \x01(\r\x12\x19\n\x11timezone_off_mins\x18\x07 \x01(\x05\x12\n\n\x02hz\x18\x03 \x01(\x03\x12\x18\n\x10system_ram_bytes\x18\x10 \x01(\x04\x12\x14\n\x0cmachine_name\x18\x11 \x01(\t\"\xb1\x0c\n\nTraceStats\x12=\n\x0c\x62uffer_stats\x18\x01 \x03(\x0b\x32\'.perfetto.protos.TraceStats.BufferStats\x12#\n\x1b\x63hunk_payload_histogram_def\x18\x11 \x03(\x03\x12=\n\x0cwriter_stats\x18\x12 \x03(\x0b\x32\'.perfetto.protos.TraceStats.WriterStats\x12\x1b\n\x13producers_connected\x18\x02 \x01(\r\x12\x16\n\x0eproducers_seen\x18\x03 \x01(\x04\x12\x1f\n\x17\x64\x61ta_sources_registered\x18\x04 \x01(\r\x12\x19\n\x11\x64\x61ta_sources_seen\x18\x05 \x01(\x04\x12\x18\n\x10tracing_sessions\x18\x06 \x01(\r\x12\x15\n\rtotal_buffers\x18\x07 \x01(\r\x12\x18\n\x10\x63hunks_discarded\x18\x08 \x01(\x04\x12\x19\n\x11patches_discarded\x18\t \x01(\x04\x12\x17\n\x0finvalid_packets\x18\n \x01(\x04\x12=\n\x0c\x66ilter_stats\x18\x0b \x01(\x0b\x32\'.perfetto.protos.TraceStats.FilterStats\x12\x19\n\x11\x66lushes_requested\x18\x0c \x01(\x04\x12\x19\n\x11\x66lushes_succeeded\x18\r \x01(\x04\x12\x16\n\x0e\x66lushes_failed\x18\x0e \x01(\x04\x12J\n\x13\x66inal_flush_outcome\x18\x0f \x01(\x0e\x32-.perfetto.protos.TraceStats.FinalFlushOutcome\x1a\xaa\x04\n\x0b\x42ufferStats\x12\x13\n\x0b\x62uffer_size\x18\x0c \x01(\x04\x12\x15\n\rbytes_written\x18\x01 \x01(\x04\x12\x19\n\x11\x62ytes_overwritten\x18\r \x01(\x04\x12\x12\n\nbytes_read\x18\x0e \x01(\x04\x12\x1d\n\x15padding_bytes_written\x18\x0f \x01(\x04\x12\x1d\n\x15padding_bytes_cleared\x18\x10 \x01(\x04\x12\x16\n\x0e\x63hunks_written\x18\x02 \x01(\x04\x12\x18\n\x10\x63hunks_rewritten\x18\n \x01(\x04\x12\x18\n\x10\x63hunks_relocated\x18\x14 \x01(\x04\x12\x1a\n\x12\x63hunks_overwritten\x18\x03 \x01(\x04\x12\x18\n\x10\x63hunks_discarded\x18\x12 \x01(\x04\x12\x13\n\x0b\x63hunks_read\x18\x11 \x01(\x04\x12%\n\x1d\x63hunks_committed_out_of_order\x18\x0b \x01(\x04\x12\x18\n\x10write_wrap_count\x18\x04 \x01(\x04\x12\x19\n\x11patches_succeeded\x18\x05 \x01(\x04\x12\x16\n\x0epatches_failed\x18\x06 \x01(\x04\x12\x1c\n\x14readaheads_succeeded\x18\x07 \x01(\x04\x12\x19\n\x11readaheads_failed\x18\x08 \x01(\x04\x12\x16\n\x0e\x61\x62i_violations\x18\t \x01(\x04\x12 \n\x18trace_writer_packet_loss\x18\x13 \x01(\x04J\x04\x08\x15\x10\x16\x1a\x87\x01\n\x0bWriterStats\x12\x13\n\x0bsequence_id\x18\x01 \x01(\x04\x12\x0e\n\x06\x62uffer\x18\x04 \x01(\r\x12*\n\x1e\x63hunk_payload_histogram_counts\x18\x02 \x03(\x04\x42\x02\x10\x01\x12\'\n\x1b\x63hunk_payload_histogram_sum\x18\x03 \x03(\x03\x42\x02\x10\x01\x1a\x9a\x01\n\x0b\x46ilterStats\x12\x15\n\rinput_packets\x18\x01 \x01(\x04\x12\x13\n\x0binput_bytes\x18\x02 \x01(\x04\x12\x14\n\x0coutput_bytes\x18\x03 \x01(\x04\x12\x0e\n\x06\x65rrors\x18\x04 \x01(\x04\x12\x15\n\rtime_taken_ns\x18\x05 \x01(\x04\x12\"\n\x1a\x62ytes_discarded_per_buffer\x18\x14 \x03(\x04\"c\n\x11\x46inalFlushOutcome\x12\x1b\n\x17\x46INAL_FLUSH_UNSPECIFIED\x10\x00\x12\x19\n\x15\x46INAL_FLUSH_SUCCEEDED\x10\x01\x12\x16\n\x12\x46INAL_FLUSH_FAILED\x10\x02\"\xd6\x07\n\rAndroidAflags\x12\x32\n\x05\x66lags\x18\x01 \x03(\x0b\x32#.perfetto.protos.AndroidAflags.Flag\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x1a\x82\x03\n\x04\x46lag\x12\x16\n\x0e\x66lag_namespace\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0b\n\x03pkg\x18\x03 \x01(\t\x12\x11\n\tcontainer\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\t\x12\x14\n\x0cstaged_value\x18\x06 \x01(\t\x12\x41\n\npermission\x18\x07 \x01(\x0e\x32-.perfetto.protos.AndroidAflags.FlagPermission\x12I\n\x11value_picked_from\x18\x08 \x01(\x0e\x32..perfetto.protos.AndroidAflags.ValuePickedFrom\x12J\n\x0fstorage_backend\x18\t \x01(\x0e\x32\x31.perfetto.protos.AndroidAflags.FlagStorageBackend\x12\x35\n\x04type\x18\n \x01(\x0e\x32\'.perfetto.protos.AndroidAflags.FlagType\"p\n\x0e\x46lagPermission\x12\x1f\n\x1b\x46LAG_PERMISSION_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x46LAG_PERMISSION_READ_ONLY\x10\x01\x12\x1e\n\x1a\x46LAG_PERMISSION_READ_WRITE\x10\x02\"\x8e\x01\n\x0fValuePickedFrom\x12!\n\x1dVALUE_PICKED_FROM_UNSPECIFIED\x10\x00\x12\x1d\n\x19VALUE_PICKED_FROM_DEFAULT\x10\x01\x12\x1c\n\x18VALUE_PICKED_FROM_SERVER\x10\x02\x12\x1b\n\x17VALUE_PICKED_FROM_LOCAL\x10\x03\"\xa4\x01\n\x12\x46lagStorageBackend\x12$\n FLAG_STORAGE_BACKEND_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x46LAG_STORAGE_BACKEND_NONE\x10\x01\x12!\n\x1d\x46LAG_STORAGE_BACKEND_ACONFIGD\x10\x02\x12&\n\"FLAG_STORAGE_BACKEND_DEVICE_CONFIG\x10\x03\"S\n\x08\x46lagType\x12\x19\n\x15\x46LAG_TYPE_UNSPECIFIED\x10\x00\x12\x15\n\x11\x46LAG_TYPE_BOOLEAN\x10\x01\x12\x15\n\x11\x46LAG_TYPE_INTEGER\x10\x02\"\x8f\x03\n\x1b\x41ndroidGameInterventionList\x12S\n\rgame_packages\x18\x01 \x03(\x0b\x32<.perfetto.protos.AndroidGameInterventionList.GamePackageInfo\x12\x13\n\x0bparse_error\x18\x02 \x01(\x08\x12\x12\n\nread_error\x18\x03 \x01(\x08\x1aZ\n\x0cGameModeInfo\x12\x0c\n\x04mode\x18\x01 \x01(\r\x12\x11\n\tuse_angle\x18\x02 \x01(\x08\x12\x1c\n\x14resolution_downscale\x18\x03 \x01(\x02\x12\x0b\n\x03\x66ps\x18\x04 \x01(\x02\x1a\x95\x01\n\x0fGamePackageInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03uid\x18\x02 \x01(\x04\x12\x14\n\x0c\x63urrent_mode\x18\x03 \x01(\r\x12Q\n\x0egame_mode_info\x18\x04 \x03(\x0b\x32\x39.perfetto.protos.AndroidGameInterventionList.GameModeInfo\"\xb2\x04\n\x10\x41ndroidLogPacket\x12:\n\x06\x65vents\x18\x01 \x03(\x0b\x32*.perfetto.protos.AndroidLogPacket.LogEvent\x12\x36\n\x05stats\x18\x02 \x01(\x0b\x32\'.perfetto.protos.AndroidLogPacket.Stats\x1a\xe4\x02\n\x08LogEvent\x12-\n\x06log_id\x18\x01 \x01(\x0e\x32\x1d.perfetto.protos.AndroidLogId\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0b\n\x03tid\x18\x03 \x01(\x05\x12\x0b\n\x03uid\x18\x04 \x01(\x05\x12\x11\n\ttimestamp\x18\x05 \x01(\x04\x12\x0b\n\x03tag\x18\x06 \x01(\t\x12\x31\n\x04prio\x18\x07 \x01(\x0e\x32#.perfetto.protos.AndroidLogPriority\x12\x0f\n\x07message\x18\x08 \x01(\t\x12<\n\x04\x61rgs\x18\t \x03(\x0b\x32..perfetto.protos.AndroidLogPacket.LogEvent.Arg\x1a`\n\x03\x41rg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\tint_value\x18\x02 \x01(\x03H\x00\x12\x15\n\x0b\x66loat_value\x18\x03 \x01(\x02H\x00\x12\x16\n\x0cstring_value\x18\x04 \x01(\tH\x00\x42\x07\n\x05value\x1a\x43\n\x05Stats\x12\x11\n\tnum_total\x18\x01 \x01(\x04\x12\x12\n\nnum_failed\x18\x02 \x01(\x04\x12\x13\n\x0bnum_skipped\x18\x03 \x01(\x04\"\x8b\x01\n\x15\x41ndroidSystemProperty\x12\x44\n\x06values\x18\x01 \x03(\x0b\x32\x34.perfetto.protos.AndroidSystemProperty.PropertyValue\x1a,\n\rPropertyValue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"R\n\rCpuPerUidData\x12\x15\n\rcluster_count\x18\x01 \x01(\r\x12\x0f\n\x03uid\x18\x02 \x03(\rB\x02\x10\x01\x12\x19\n\rtotal_time_ms\x18\x03 \x03(\x04\x42\x02\x10\x01\"\xf1\x03\n\x12GraphicsFrameEvent\x12\x45\n\x0c\x62uffer_event\x18\x01 \x01(\x0b\x32/.perfetto.protos.GraphicsFrameEvent.BufferEvent\x1a\xa2\x01\n\x0b\x42ufferEvent\x12\x14\n\x0c\x66rame_number\x18\x01 \x01(\r\x12\x41\n\x04type\x18\x02 \x01(\x0e\x32\x33.perfetto.protos.GraphicsFrameEvent.BufferEventType\x12\x12\n\nlayer_name\x18\x03 \x01(\t\x12\x13\n\x0b\x64uration_ns\x18\x04 \x01(\x04\x12\x11\n\tbuffer_id\x18\x05 \x01(\r\"\xee\x01\n\x0f\x42ufferEventType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0b\n\x07\x44\x45QUEUE\x10\x01\x12\t\n\x05QUEUE\x10\x02\x12\x08\n\x04POST\x10\x03\x12\x11\n\rACQUIRE_FENCE\x10\x04\x12\t\n\x05LATCH\x10\x05\x12\x1a\n\x16HWC_COMPOSITION_QUEUED\x10\x06\x12\x18\n\x14\x46\x41LLBACK_COMPOSITION\x10\x07\x12\x11\n\rPRESENT_FENCE\x10\x08\x12\x11\n\rRELEASE_FENCE\x10\t\x12\n\n\x06MODIFY\x10\n\x12\n\n\x06\x44\x45TACH\x10\x0b\x12\n\n\x06\x41TTACH\x10\x0c\x12\n\n\x06\x43\x41NCEL\x10\r\"@\n\x13InitialDisplayState\x12\x15\n\rdisplay_state\x18\x01 \x01(\x05\x12\x12\n\nbrightness\x18\x02 \x01(\x01\"\xfa\x02\n\x12KernelWakelockData\x12>\n\x08wakelock\x18\x01 \x03(\x0b\x32,.perfetto.protos.KernelWakelockData.Wakelock\x12\x17\n\x0bwakelock_id\x18\x02 \x03(\rB\x02\x10\x01\x12\x1c\n\x10time_held_millis\x18\x03 \x03(\x04\x42\x02\x10\x01\x12\x13\n\x0b\x65rror_flags\x18\x04 \x01(\x04\x1a\xd7\x01\n\x08Wakelock\x12\x13\n\x0bwakelock_id\x18\x01 \x01(\r\x12\x15\n\rwakelock_name\x18\x02 \x01(\t\x12H\n\rwakelock_type\x18\x03 \x01(\x0e\x32\x31.perfetto.protos.KernelWakelockData.Wakelock.Type\"U\n\x04Type\x12\x19\n\x15WAKELOCK_TYPE_UNKNOWN\x10\x00\x12\x18\n\x14WAKELOCK_TYPE_KERNEL\x10\x01\x12\x18\n\x14WAKELOCK_TYPE_NATIVE\x10\x02\"\xe8\x01\n\x0cPackagesList\x12;\n\x08packages\x18\x01 \x03(\x0b\x32).perfetto.protos.PackagesList.PackageInfo\x12\x13\n\x0bparse_error\x18\x02 \x01(\x08\x12\x12\n\nread_error\x18\x03 \x01(\x08\x1ar\n\x0bPackageInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03uid\x18\x02 \x01(\x04\x12\x12\n\ndebuggable\x18\x03 \x01(\x08\x12\x1e\n\x16profileable_from_shell\x18\x04 \x01(\x08\x12\x14\n\x0cversion_code\x18\x05 \x01(\x03\"<\n\x10PixelModemEvents\x12\x0e\n\x06\x65vents\x18\x01 \x03(\x0c\x12\x18\n\x10\x65vent_time_nanos\x18\x02 \x03(\x04\"+\n\x17PixelModemTokenDatabase\x12\x10\n\x08\x64\x61tabase\x18\x01 \x01(\x0c\"\x81\x01\n\x0f\x41ndroidUserList\x12\x38\n\x05users\x18\x01 \x03(\x0b\x32).perfetto.protos.AndroidUserList.UserInfo\x12\r\n\x05\x65rror\x18\x02 \x01(\x05\x1a%\n\x08UserInfo\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0b\n\x03uid\x18\x02 \x01(\x05\"\xf2\x01\n\x17\x43hromeBenchmarkMetadata\x12\x1f\n\x17\x62\x65nchmark_start_time_us\x18\x01 \x01(\x03\x12\x19\n\x11story_run_time_us\x18\x02 \x01(\x03\x12\x16\n\x0e\x62\x65nchmark_name\x18\x03 \x01(\t\x12\x1d\n\x15\x62\x65nchmark_description\x18\x04 \x01(\t\x12\r\n\x05label\x18\x05 \x01(\t\x12\x12\n\nstory_name\x18\x06 \x01(\t\x12\x12\n\nstory_tags\x18\x07 \x03(\t\x12\x17\n\x0fstory_run_index\x18\x08 \x01(\x05\x12\x14\n\x0chad_failures\x18\t \x01(\x08\"\xe8\x02\n\x14\x43hromeMetadataPacket\x12O\n\x1b\x62\x61\x63kground_tracing_metadata\x18\x01 \x01(\x0b\x32*.perfetto.protos.BackgroundTracingMetadata\x12\x1b\n\x13\x63hrome_version_code\x18\x02 \x01(\x05\x12\x1a\n\x12\x65nabled_categories\x18\x03 \x01(\t\x12K\n\x12\x66ield_trial_hashes\x18\x04 \x03(\x0b\x32/.perfetto.protos.ChromeMetadataPacket.FinchHash\x12\x18\n\x10\x61pp_package_name\x18\x05 \x01(\t\x12\x13\n\x0b\x61pp_version\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x0f\n\x07os_name\x18\x08 \x01(\t\x1a(\n\tFinchHash\x12\x0c\n\x04name\x18\x01 \x01(\r\x12\r\n\x05group\x18\x02 \x01(\r\"\x95\x08\n\x19\x42\x61\x63kgroundTracingMetadata\x12N\n\x0etriggered_rule\x18\x01 \x01(\x0b\x32\x36.perfetto.protos.BackgroundTracingMetadata.TriggerRule\x12L\n\x0c\x61\x63tive_rules\x18\x02 \x03(\x0b\x32\x36.perfetto.protos.BackgroundTracingMetadata.TriggerRule\x12\x1a\n\x12scenario_name_hash\x18\x03 \x01(\x07\x1a\xbd\x06\n\x0bTriggerRule\x12X\n\x0ctrigger_type\x18\x01 \x01(\x0e\x32\x42.perfetto.protos.BackgroundTracingMetadata.TriggerRule.TriggerType\x12\\\n\x0ehistogram_rule\x18\x02 \x01(\x0b\x32\x44.perfetto.protos.BackgroundTracingMetadata.TriggerRule.HistogramRule\x12T\n\nnamed_rule\x18\x03 \x01(\x0b\x32@.perfetto.protos.BackgroundTracingMetadata.TriggerRule.NamedRule\x12\x11\n\tname_hash\x18\x04 \x01(\x07\x1aj\n\rHistogramRule\x12\x1b\n\x13histogram_name_hash\x18\x01 \x01(\x06\x12\x1d\n\x15histogram_min_trigger\x18\x02 \x01(\x03\x12\x1d\n\x15histogram_max_trigger\x18\x03 \x01(\x03\x1a\x96\x02\n\tNamedRule\x12^\n\nevent_type\x18\x01 \x01(\x0e\x32J.perfetto.protos.BackgroundTracingMetadata.TriggerRule.NamedRule.EventType\x12!\n\x19\x63ontent_trigger_name_hash\x18\x02 \x01(\x06\"\x85\x01\n\tEventType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x13\n\x0fSESSION_RESTORE\x10\x01\x12\x0e\n\nNAVIGATION\x10\x02\x12\x0b\n\x07STARTUP\x10\x03\x12\x10\n\x0cREACHED_CODE\x10\x04\x12\x13\n\x0f\x43ONTENT_TRIGGER\x10\x05\x12\x0e\n\tTEST_RULE\x10\xe8\x07\"\x87\x01\n\x0bTriggerType\x12\x17\n\x13TRIGGER_UNSPECIFIED\x10\x00\x12\x36\n2MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE\x10\x01\x12\'\n#MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED\x10\x02\"\xd3\x02\n\x11\x43hromeTracedValue\x12\x42\n\x0bnested_type\x18\x01 \x01(\x0e\x32-.perfetto.protos.ChromeTracedValue.NestedType\x12\x11\n\tdict_keys\x18\x02 \x03(\t\x12\x37\n\x0b\x64ict_values\x18\x03 \x03(\x0b\x32\".perfetto.protos.ChromeTracedValue\x12\x38\n\x0c\x61rray_values\x18\x04 \x03(\x0b\x32\".perfetto.protos.ChromeTracedValue\x12\x11\n\tint_value\x18\x05 \x01(\x05\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x12\n\nbool_value\x18\x07 \x01(\x08\x12\x14\n\x0cstring_value\x18\x08 \x01(\t\"!\n\nNestedType\x12\x08\n\x04\x44ICT\x10\x00\x12\t\n\x05\x41RRAY\x10\x01\"6\n\x16\x43hromeStringTableEntry\x12\r\n\x05value\x18\x01 \x01(\t\x12\r\n\x05index\x18\x02 \x01(\x05\"\x81\x05\n\x10\x43hromeTraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x03\x12\r\n\x05phase\x18\x03 \x01(\x05\x12\x11\n\tthread_id\x18\x04 \x01(\x05\x12\x10\n\x08\x64uration\x18\x05 \x01(\x03\x12\x17\n\x0fthread_duration\x18\x06 \x01(\x03\x12\r\n\x05scope\x18\x07 \x01(\t\x12\n\n\x02id\x18\x08 \x01(\x04\x12\r\n\x05\x66lags\x18\t \x01(\r\x12\x1b\n\x13\x63\x61tegory_group_name\x18\n \x01(\t\x12\x12\n\nprocess_id\x18\x0b \x01(\x05\x12\x18\n\x10thread_timestamp\x18\x0c \x01(\x03\x12\x0f\n\x07\x62ind_id\x18\r \x01(\x04\x12\x33\n\x04\x61rgs\x18\x0e \x03(\x0b\x32%.perfetto.protos.ChromeTraceEvent.Arg\x12\x12\n\nname_index\x18\x0f \x01(\r\x12!\n\x19\x63\x61tegory_group_name_index\x18\x10 \x01(\r\x1a\x8c\x02\n\x03\x41rg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\nbool_value\x18\x02 \x01(\x08H\x00\x12\x14\n\nuint_value\x18\x03 \x01(\x04H\x00\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x00\x12\x16\n\x0c\x64ouble_value\x18\x05 \x01(\x01H\x00\x12\x16\n\x0cstring_value\x18\x06 \x01(\tH\x00\x12\x17\n\rpointer_value\x18\x07 \x01(\x04H\x00\x12\x14\n\njson_value\x18\x08 \x01(\tH\x00\x12:\n\x0ctraced_value\x18\n \x01(\x0b\x32\".perfetto.protos.ChromeTracedValueH\x00\x12\x12\n\nname_index\x18\t \x01(\rB\x07\n\x05value\"\x80\x01\n\x0e\x43hromeMetadata\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x14\n\nbool_value\x18\x03 \x01(\x08H\x00\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x00\x12\x14\n\njson_value\x18\x05 \x01(\tH\x00\x42\x07\n\x05value\"\x94\x01\n\x15\x43hromeLegacyJsonTrace\x12>\n\x04type\x18\x01 \x01(\x0e\x32\x30.perfetto.protos.ChromeLegacyJsonTrace.TraceType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"-\n\tTraceType\x12\x0e\n\nUSER_TRACE\x10\x00\x12\x10\n\x0cSYSTEM_TRACE\x10\x01\"\xa7\x02\n\x11\x43hromeEventBundle\x12;\n\x0ctrace_events\x18\x01 \x03(\x0b\x32!.perfetto.protos.ChromeTraceEventB\x02\x18\x01\x12\x31\n\x08metadata\x18\x02 \x03(\x0b\x32\x1f.perfetto.protos.ChromeMetadata\x12\x1c\n\x14legacy_ftrace_output\x18\x04 \x03(\t\x12\x41\n\x11legacy_json_trace\x18\x05 \x03(\x0b\x32&.perfetto.protos.ChromeLegacyJsonTrace\x12\x41\n\x0cstring_table\x18\x03 \x03(\x0b\x32\'.perfetto.protos.ChromeStringTableEntryB\x02\x18\x01\"Q\n\rChromeTrigger\x12\x14\n\x0ctrigger_name\x18\x01 \x01(\t\x12\x19\n\x11trigger_name_hash\x18\x02 \x01(\x07\x12\x0f\n\x07\x66low_id\x18\x03 \x01(\x06\"V\n\x08V8String\x12\x10\n\x06latin1\x18\x01 \x01(\x0cH\x00\x12\x12\n\x08utf16_le\x18\x02 \x01(\x0cH\x00\x12\x12\n\x08utf16_be\x18\x03 \x01(\x0cH\x00\x42\x10\n\x0e\x65ncoded_string\"k\n\x10InternedV8String\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x10\n\x06latin1\x18\x02 \x01(\x0cH\x00\x12\x12\n\x08utf16_le\x18\x03 \x01(\x0cH\x00\x12\x12\n\x08utf16_be\x18\x04 \x01(\x0cH\x00\x42\x10\n\x0e\x65ncoded_string\"\xc5\x02\n\x12InternedV8JsScript\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x11\n\tscript_id\x18\x02 \x01(\x05\x12\x36\n\x04type\x18\x03 \x01(\x0e\x32(.perfetto.protos.InternedV8JsScript.Type\x12\'\n\x04name\x18\x04 \x01(\x0b\x32\x19.perfetto.protos.V8String\x12)\n\x06source\x18\x05 \x01(\x0b\x32\x19.perfetto.protos.V8String\"\x82\x01\n\x04Type\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\x0f\n\x0bTYPE_NORMAL\x10\x01\x12\r\n\tTYPE_EVAL\x10\x02\x12\x0f\n\x0bTYPE_MODULE\x10\x03\x12\x0f\n\x0bTYPE_NATIVE\x10\x04\x12\x12\n\x0eTYPE_EXTENSION\x10\x05\x12\x12\n\x0eTYPE_INSPECTOR\x10\x06\"W\n\x14InternedV8WasmScript\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x11\n\tscript_id\x18\x02 \x01(\x05\x12\x0b\n\x03url\x18\x03 \x01(\t\x12\x12\n\nwire_bytes\x18\x04 \x01(\x0c\"\xd5\x08\n\x14InternedV8JsFunction\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x1f\n\x17v8_js_function_name_iid\x18\x02 \x01(\x04\x12\x18\n\x10v8_js_script_iid\x18\x03 \x01(\x04\x12\x13\n\x0bis_toplevel\x18\x04 \x01(\x08\x12\x38\n\x04kind\x18\x05 \x01(\x0e\x32*.perfetto.protos.InternedV8JsFunction.Kind\x12\x13\n\x0b\x62yte_offset\x18\x06 \x01(\r\x12\x0c\n\x04line\x18\x07 \x01(\r\x12\x0e\n\x06\x63olumn\x18\x08 \x01(\r\"\xf2\x06\n\x04Kind\x12\x10\n\x0cKIND_UNKNOWN\x10\x00\x12\x18\n\x14KIND_NORMAL_FUNCTION\x10\x01\x12\x0f\n\x0bKIND_MODULE\x10\x02\x12\x15\n\x11KIND_ASYNC_MODULE\x10\x03\x12\x19\n\x15KIND_BASE_CONSTRUCTOR\x10\x04\x12!\n\x1dKIND_DEFAULT_BASE_CONSTRUCTOR\x10\x05\x12$\n KIND_DEFAULT_DERIVED_CONSTRUCTOR\x10\x06\x12\x1c\n\x18KIND_DERIVED_CONSTRUCTOR\x10\x07\x12\x18\n\x14KIND_GETTER_FUNCTION\x10\x08\x12\x1f\n\x1bKIND_STATIC_GETTER_FUNCTION\x10\t\x12\x18\n\x14KIND_SETTER_FUNCTION\x10\n\x12\x1f\n\x1bKIND_STATIC_SETTER_FUNCTION\x10\x0b\x12\x17\n\x13KIND_ARROW_FUNCTION\x10\x0c\x12\x1d\n\x19KIND_ASYNC_ARROW_FUNCTION\x10\r\x12\x17\n\x13KIND_ASYNC_FUNCTION\x10\x0e\x12\x1d\n\x19KIND_ASYNC_CONCISE_METHOD\x10\x0f\x12$\n KIND_STATIC_ASYNC_CONCISE_METHOD\x10\x10\x12\'\n#KIND_ASYNC_CONCISE_GENERATOR_METHOD\x10\x11\x12.\n*KIND_STATIC_ASYNC_CONCISE_GENERATOR_METHOD\x10\x12\x12!\n\x1dKIND_ASYNC_GENERATOR_FUNCTION\x10\x13\x12\x1b\n\x17KIND_GENERATOR_FUNCTION\x10\x14\x12!\n\x1dKIND_CONCISE_GENERATOR_METHOD\x10\x15\x12(\n$KIND_STATIC_CONCISE_GENERATOR_METHOD\x10\x16\x12\x17\n\x13KIND_CONCISE_METHOD\x10\x17\x12\x1e\n\x1aKIND_STATIC_CONCISE_METHOD\x10\x18\x12+\n\'KIND_CLASS_MEMBERS_INITIALIZER_FUNCTION\x10\x19\x12*\n&KIND_CLASS_STATIC_INITIALIZER_FUNCTION\x10\x1a\x12\x10\n\x0cKIND_INVALID\x10\x1b\"\xc7\x02\n\x11InternedV8Isolate\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x12\n\nisolate_id\x18\x03 \x01(\x05\x12@\n\ncode_range\x18\x04 \x01(\x0b\x32,.perfetto.protos.InternedV8Isolate.CodeRange\x12(\n embedded_blob_code_start_address\x18\x05 \x01(\x04\x12\x1f\n\x17\x65mbedded_blob_code_size\x18\x06 \x01(\x04\x1aw\n\tCodeRange\x12\x14\n\x0c\x62\x61se_address\x18\x01 \x01(\x04\x12\x0c\n\x04size\x18\x02 \x01(\x04\x12-\n%embedded_blob_code_copy_start_address\x18\x03 \x01(\x04\x12\x17\n\x0fis_process_wide\x18\x04 \x01(\x08\"\xd8\x03\n\x08V8JsCode\x12\x16\n\x0ev8_isolate_iid\x18\x01 \x01(\x04\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12\x1a\n\x12v8_js_function_iid\x18\x03 \x01(\x04\x12,\n\x04tier\x18\x04 \x01(\x0e\x32\x1e.perfetto.protos.V8JsCode.Tier\x12\x19\n\x11instruction_start\x18\x05 \x01(\x04\x12\x1e\n\x16instruction_size_bytes\x18\x06 \x01(\x04\x12\x16\n\x0cmachine_code\x18\x07 \x01(\x0cH\x00\x12\x12\n\x08\x62ytecode\x18\x08 \x01(\x0cH\x00\x12\x1a\n\x10source_positions\x18\t \x01(\x0cH\x01\x12\x1c\n\x12\x62ytecode_positions\x18\n \x01(\x0cH\x01\x12$\n\x1ainlined_bytecode_positions\x18\x0b \x01(\x0cH\x01\"x\n\x04Tier\x12\x10\n\x0cTIER_UNKNOWN\x10\x00\x12\x11\n\rTIER_IGNITION\x10\x01\x12\x12\n\x0eTIER_SPARKPLUG\x10\x02\x12\x0f\n\x0bTIER_MAGLEV\x10\x03\x12\x13\n\x0fTIER_TURBOSHAFT\x10\x04\x12\x11\n\rTIER_TURBOFAN\x10\x05\x42\x0e\n\x0cinstructionsB\x0c\n\nsource_map\"\xe1\x03\n\x0eV8InternalCode\x12\x16\n\x0ev8_isolate_iid\x18\x01 \x01(\x04\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x32\n\x04type\x18\x04 \x01(\x0e\x32$.perfetto.protos.V8InternalCode.Type\x12\x12\n\nbuiltin_id\x18\x05 \x01(\x05\x12\x19\n\x11instruction_start\x18\x06 \x01(\x04\x12\x1e\n\x16instruction_size_bytes\x18\x07 \x01(\x04\x12\x14\n\x0cmachine_code\x18\x08 \x01(\x0c\"\x82\x02\n\x04Type\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\x19\n\x15TYPE_BYTECODE_HANDLER\x10\x01\x12\x14\n\x10TYPE_FOR_TESTING\x10\x02\x12\x10\n\x0cTYPE_BUILTIN\x10\x03\x12\x16\n\x12TYPE_WASM_FUNCTION\x10\x04\x12\x1e\n\x1aTYPE_WASM_TO_CAPI_FUNCTION\x10\x05\x12\x1c\n\x18TYPE_WASM_TO_JS_FUNCTION\x10\x06\x12\x1c\n\x18TYPE_JS_TO_WASM_FUNCTION\x10\x07\x12\x1a\n\x16TYPE_JS_TO_JS_FUNCTION\x10\x08\x12\x15\n\x11TYPE_C_WASM_ENTRY\x10\t\"\xc3\x02\n\nV8WasmCode\x12\x16\n\x0ev8_isolate_iid\x18\x01 \x01(\x04\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12\x1a\n\x12v8_wasm_script_iid\x18\x03 \x01(\x04\x12\x15\n\rfunction_name\x18\x04 \x01(\t\x12.\n\x04tier\x18\x05 \x01(\x0e\x32 .perfetto.protos.V8WasmCode.Tier\x12\x1d\n\x15\x63ode_offset_in_module\x18\x06 \x01(\x05\x12\x19\n\x11instruction_start\x18\x07 \x01(\x04\x12\x1e\n\x16instruction_size_bytes\x18\x08 \x01(\x04\x12\x14\n\x0cmachine_code\x18\t \x01(\x0c\"=\n\x04Tier\x12\x10\n\x0cTIER_UNKNOWN\x10\x00\x12\x10\n\x0cTIER_LIFTOFF\x10\x01\x12\x11\n\rTIER_TURBOFAN\x10\x02\"\xb0\x01\n\x0cV8RegExpCode\x12\x16\n\x0ev8_isolate_iid\x18\x01 \x01(\x04\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12*\n\x07pattern\x18\x03 \x01(\x0b\x32\x19.perfetto.protos.V8String\x12\x19\n\x11instruction_start\x18\x04 \x01(\x04\x12\x1e\n\x16instruction_size_bytes\x18\x05 \x01(\x04\x12\x14\n\x0cmachine_code\x18\x06 \x01(\x0c\"\xe1\x01\n\nV8CodeMove\x12\x13\n\x0bisolate_iid\x18\x01 \x01(\x04\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12&\n\x1e\x66rom_instruction_start_address\x18\x03 \x01(\x04\x12$\n\x1cto_instruction_start_address\x18\x04 \x01(\x04\x12\x1e\n\x16instruction_size_bytes\x18\x05 \x01(\x04\x12\x19\n\x0fto_machine_code\x18\x06 \x01(\x0cH\x00\x12\x15\n\x0bto_bytecode\x18\x07 \x01(\x0cH\x00\x42\x11\n\x0fto_instructions\"\x1d\n\x0eV8CodeDefaults\x12\x0b\n\x03tid\x18\x01 \x01(\r\"\x92\x03\n\rClockSnapshot\x12\x34\n\x06\x63locks\x18\x01 \x03(\x0b\x32$.perfetto.protos.ClockSnapshot.Clock\x12:\n\x13primary_trace_clock\x18\x02 \x01(\x0e\x32\x1d.perfetto.protos.BuiltinClock\x1a\x8e\x02\n\x05\x43lock\x12\x10\n\x08\x63lock_id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x16\n\x0eis_incremental\x18\x03 \x01(\x08\x12\x1a\n\x12unit_multiplier_ns\x18\x04 \x01(\x04\"\xab\x01\n\rBuiltinClocks\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0c\n\x08REALTIME\x10\x01\x12\x13\n\x0fREALTIME_COARSE\x10\x02\x12\r\n\tMONOTONIC\x10\x03\x12\x14\n\x10MONOTONIC_COARSE\x10\x04\x12\x11\n\rMONOTONIC_RAW\x10\x05\x12\x0c\n\x08\x42OOTTIME\x10\x06\x12\x18\n\x14\x42UILTIN_CLOCK_MAX_ID\x10?\"\x04\x08\x07\x10\x07\"\x04\x08\x08\x10\x08\"\xd2\x0c\n\x0f\x43SwitchEtwEvent\x12\x15\n\rnew_thread_id\x18\x01 \x01(\r\x12\x15\n\rold_thread_id\x18\x02 \x01(\r\x12\x1b\n\x13new_thread_priority\x18\x03 \x01(\x11\x12\x1b\n\x13old_thread_priority\x18\x04 \x01(\x11\x12\x18\n\x10previous_c_state\x18\x05 \x01(\r\x12V\n\x16old_thread_wait_reason\x18\x06 \x01(\x0e\x32\x34.perfetto.protos.CSwitchEtwEvent.OldThreadWaitReasonH\x00\x12$\n\x1aold_thread_wait_reason_int\x18\x0b \x01(\x05H\x00\x12R\n\x14old_thread_wait_mode\x18\x07 \x01(\x0e\x32\x32.perfetto.protos.CSwitchEtwEvent.OldThreadWaitModeH\x01\x12\"\n\x18old_thread_wait_mode_int\x18\x0c \x01(\x05H\x01\x12K\n\x10old_thread_state\x18\x08 \x01(\x0e\x32/.perfetto.protos.CSwitchEtwEvent.OldThreadStateH\x02\x12\x1e\n\x14old_thread_state_int\x18\r \x01(\x11H\x02\x12\'\n\x1fold_thread_wait_ideal_processor\x18\t \x01(\x11\x12\x1c\n\x14new_thread_wait_time\x18\n \x01(\r\"\xe9\x05\n\x13OldThreadWaitReason\x12\r\n\tEXECUTIVE\x10\x00\x12\r\n\tFREE_PAGE\x10\x01\x12\x0b\n\x07PAGE_IN\x10\x02\x12\x13\n\x0fPOOL_ALLOCATION\x10\x03\x12\x13\n\x0f\x44\x45LAY_EXECUTION\x10\x04\x12\x0b\n\x07SUSPEND\x10\x05\x12\x10\n\x0cUSER_REQUEST\x10\x06\x12\x10\n\x0cWR_EXECUTIVE\x10\x07\x12\x10\n\x0cWR_FREE_PAGE\x10\x08\x12\x0e\n\nWR_PAGE_IN\x10\t\x12\x16\n\x12WR_POOL_ALLOCATION\x10\n\x12\x16\n\x12WR_DELAY_EXECUTION\x10\x0b\x12\x10\n\x0cWR_SUSPENDED\x10\x0c\x12\x13\n\x0fWR_USER_REQUEST\x10\r\x12\x11\n\rWR_EVENT_PAIR\x10\x0e\x12\x0c\n\x08WR_QUEUE\x10\x0f\x12\x13\n\x0fWR_LPC_RECEIVER\x10\x10\x12\x10\n\x0cWR_LPC_REPLY\x10\x11\x12\x15\n\x11WR_VIRTUAL_MEMORY\x10\x12\x12\x0f\n\x0bWR_PAGE_OUT\x10\x13\x12\x12\n\x0eWR_RENDEZ_VOUS\x10\x14\x12\x12\n\x0eWR_KEYED_EVENT\x10\x15\x12\x11\n\rWR_TERMINATED\x10\x16\x12\x16\n\x12WR_PROCESS_IN_SWAP\x10\x17\x12\x17\n\x13WR_CPU_RATE_CONTROL\x10\x18\x12\x14\n\x10WR_CALLOUT_STACK\x10\x19\x12\r\n\tWR_KERNEL\x10\x1a\x12\x0f\n\x0bWR_RESOURCE\x10\x1b\x12\x10\n\x0cWR_PUSH_LOCK\x10\x1c\x12\x0c\n\x08WR_MUTEX\x10\x1d\x12\x12\n\x0eWR_QUANTUM_END\x10\x1e\x12\x13\n\x0fWR_DISPATCH_INT\x10\x1f\x12\x10\n\x0cWR_PREEMPTED\x10 \x12\x16\n\x12WR_YIELD_EXECUTION\x10!\x12\x11\n\rWR_FAST_MUTEX\x10\"\x12\x12\n\x0eWR_GUARD_MUTEX\x10#\x12\x0e\n\nWR_RUNDOWN\x10$\x12\x17\n\x13MAXIMUM_WAIT_REASON\x10%\"3\n\x11OldThreadWaitMode\x12\x0f\n\x0bKERNEL_MODE\x10\x00\x12\r\n\tUSER_MODE\x10\x01\"\x87\x01\n\x0eOldThreadState\x12\x0f\n\x0bINITIALIZED\x10\x00\x12\t\n\x05READY\x10\x01\x12\x0b\n\x07RUNNING\x10\x02\x12\x0b\n\x07STANDBY\x10\x03\x12\x0e\n\nTERMINATED\x10\x04\x12\x0b\n\x07WAITING\x10\x05\x12\x0e\n\nTRANSITION\x10\x06\x12\x12\n\x0e\x44\x45\x46\x45RRED_READY\x10\x07\x42$\n\"old_thread_wait_reason_enum_or_intB\"\n old_thread_wait_mode_enum_or_intB\x1e\n\x1cold_thread_state_enum_or_int\"\x88\x04\n\x13ReadyThreadEtwEvent\x12\x13\n\x0bt_thread_id\x18\x01 \x01(\r\x12J\n\radjust_reason\x18\x02 \x01(\x0e\x32\x31.perfetto.protos.ReadyThreadEtwEvent.AdjustReasonH\x00\x12\x1b\n\x11\x61\x64just_reason_int\x18\x05 \x01(\x05H\x00\x12\x18\n\x10\x61\x64just_increment\x18\x03 \x01(\x11\x12>\n\x04\x66lag\x18\x04 \x01(\x0e\x32..perfetto.protos.ReadyThreadEtwEvent.TraceFlagH\x01\x12\x12\n\x08\x66lag_int\x18\x06 \x01(\x05H\x01\"X\n\x0c\x41\x64justReason\x12\x18\n\x14IGNORE_THE_INCREMENT\x10\x00\x12\x13\n\x0f\x41PPLY_INCREMENT\x10\x01\x12\x19\n\x15\x41PPLY_INCREMENT_BOOST\x10\x02\"z\n\tTraceFlag\x12\x1a\n\x16TRACE_FLAG_UNSPECIFIED\x10\x00\x12\x12\n\x0eTHREAD_READIED\x10\x01\x12\x1c\n\x18KERNEL_STACK_SWAPPED_OUT\x10\x02\x12\x1f\n\x1bPROCESS_ADDRESS_SWAPPED_OUT\x10\x04\x42\x1b\n\x19\x61\x64just_reason_enum_or_intB\x12\n\x10\x66lag_enum_or_int\"\x90\x03\n\x0fMemInfoEtwEvent\x12\x17\n\x0fpriority_levels\x18\x01 \x01(\r\x12\x17\n\x0fzero_page_count\x18\x02 \x01(\x04\x12\x17\n\x0f\x66ree_page_count\x18\x03 \x01(\x04\x12\x1b\n\x13modified_page_count\x18\x04 \x01(\x04\x12$\n\x1cmodified_no_write_page_count\x18\x05 \x01(\x04\x12\x16\n\x0e\x62\x61\x64_page_count\x18\x06 \x01(\x04\x12\x1b\n\x13standby_page_counts\x18\x07 \x03(\x04\x12\x1e\n\x16repurposed_page_counts\x18\x08 \x03(\x04\x12%\n\x1dmodified_page_count_page_file\x18\t \x01(\x04\x12\x1d\n\x15paged_pool_page_count\x18\n \x01(\x04\x12!\n\x19non_paged_pool_page_count\x18\x0b \x01(\x04\x12\x16\n\x0emdl_page_count\x18\x0c \x01(\x04\x12\x19\n\x11\x63ommit_page_count\x18\r \x01(\x04\"\xa4\x01\n\x14\x46ileIoCreateEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x02 \x01(\x04\x12\x0c\n\x04ttid\x18\x03 \x01(\r\x12\x16\n\x0e\x63reate_options\x18\x04 \x01(\r\x12\x17\n\x0f\x66ile_attributes\x18\x05 \x01(\r\x12\x14\n\x0cshare_access\x18\x06 \x01(\r\x12\x11\n\topen_path\x18\x07 \x01(\t\"\xb8\x01\n\x15\x46ileIoDirEnumEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x02 \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x03 \x01(\x04\x12\x0c\n\x04ttid\x18\x04 \x01(\r\x12\x0e\n\x06length\x18\x05 \x01(\r\x12\x12\n\ninfo_class\x18\x06 \x01(\r\x12\x12\n\nfile_index\x18\x07 \x01(\r\x12\x11\n\tfile_name\x18\x08 \x01(\t\x12\x0e\n\x06opcode\x18\t \x01(\r\"\x92\x01\n\x12\x46ileIoInfoEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x02 \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x03 \x01(\x04\x12\x12\n\nextra_info\x18\x04 \x01(\x04\x12\x0c\n\x04ttid\x18\x05 \x01(\r\x12\x12\n\ninfo_class\x18\x06 \x01(\r\x12\x0e\n\x06opcode\x18\x07 \x01(\r\"\xa2\x01\n\x17\x46ileIoReadWriteEtwEvent\x12\x0e\n\x06offset\x18\x01 \x01(\x04\x12\x0f\n\x07irp_ptr\x18\x02 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x03 \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x04 \x01(\x04\x12\x0c\n\x04ttid\x18\x05 \x01(\r\x12\x0f\n\x07io_size\x18\x06 \x01(\r\x12\x10\n\x08io_flags\x18\x07 \x01(\r\x12\x0e\n\x06opcode\x18\x08 \x01(\r\"n\n\x16\x46ileIoSimpleOpEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x02 \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x03 \x01(\x04\x12\x0c\n\x04ttid\x18\x04 \x01(\r\x12\x0e\n\x06opcode\x18\x05 \x01(\r\"M\n\x13\x46ileIoOpEndEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x12\n\nextra_info\x18\x02 \x01(\x04\x12\x11\n\tnt_status\x18\x03 \x01(\r\"\xae\x01\n\x1b\x46ileIoPathOperationEtwEvent\x12\x0f\n\x07irp_ptr\x18\x01 \x01(\x04\x12\x13\n\x0b\x66ile_object\x18\x02 \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x03 \x01(\x04\x12\x12\n\nextra_info\x18\x04 \x01(\x04\x12\x0c\n\x04ttid\x18\x05 \x01(\r\x12\x12\n\ninfo_class\x18\x06 \x01(\r\x12\x11\n\tfile_name\x18\x07 \x01(\t\x12\x0e\n\x06opcode\x18\x08 \x01(\r\";\n\x11StackWalkEtwEvent\x12\x0f\n\x07trigger\x18\x01 \x01(\t\x12\x15\n\rcallstack_iid\x18\x02 \x01(\x04\"\xcc\x01\n\x0e\x44iskIoEtwEvent\x12\x13\n\x0b\x64isk_number\x18\x01 \x01(\r\x12\x11\n\tirp_flags\x18\x02 \x01(\r\x12\x15\n\rtransfer_size\x18\x03 \x01(\r\x12\x13\n\x0b\x62yte_offset\x18\x04 \x01(\x03\x12\x13\n\x0b\x66ile_object\x18\x05 \x01(\x04\x12\x0f\n\x07irp_ptr\x18\x06 \x01(\x04\x12\x15\n\rresponse_time\x18\x07 \x01(\x03\x12\x19\n\x11issuing_thread_id\x18\x08 \x01(\r\x12\x0e\n\x06opcode\x18\t \x01(\r\"\xc3\x06\n\rEtwTraceEvent\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x0b\n\x03\x63pu\x18\x04 \x01(\r\x12\x11\n\tthread_id\x18\x05 \x01(\r\x12\x34\n\x08\x63_switch\x18\x02 \x01(\x0b\x32 .perfetto.protos.CSwitchEtwEventH\x00\x12<\n\x0cready_thread\x18\x03 \x01(\x0b\x32$.perfetto.protos.ReadyThreadEtwEventH\x00\x12\x34\n\x08mem_info\x18\x06 \x01(\x0b\x32 .perfetto.protos.MemInfoEtwEventH\x00\x12?\n\x0e\x66ile_io_create\x18\x07 \x01(\x0b\x32%.perfetto.protos.FileIoCreateEtwEventH\x00\x12\x42\n\x10\x66ile_io_dir_enum\x18\x08 \x01(\x0b\x32&.perfetto.protos.FileIoDirEnumEtwEventH\x00\x12;\n\x0c\x66ile_io_info\x18\t \x01(\x0b\x32#.perfetto.protos.FileIoInfoEtwEventH\x00\x12\x46\n\x12\x66ile_io_read_write\x18\n \x01(\x0b\x32(.perfetto.protos.FileIoReadWriteEtwEventH\x00\x12\x44\n\x11\x66ile_io_simple_op\x18\x0b \x01(\x0b\x32\'.perfetto.protos.FileIoSimpleOpEtwEventH\x00\x12>\n\x0e\x66ile_io_op_end\x18\x0c \x01(\x0b\x32$.perfetto.protos.FileIoOpEndEtwEventH\x00\x12\x38\n\nstack_walk\x18\r \x01(\x0b\x32\".perfetto.protos.StackWalkEtwEventH\x00\x12N\n\x16\x66ile_io_path_operation\x18\x0e \x01(\x0b\x32,.perfetto.protos.FileIoPathOperationEtwEventH\x00\x12\x32\n\x07\x64isk_io\x18\x0f \x01(\x0b\x32\x1f.perfetto.protos.DiskIoEtwEventH\x00\x42\x07\n\x05\x65vent\"Q\n\x13\x45twTraceEventBundle\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12-\n\x05\x65vent\x18\x02 \x03(\x0b\x32\x1e.perfetto.protos.EtwTraceEvent\"G\n\x11\x46ileDescriptorSet\x12\x32\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.perfetto.protos.FileDescriptorProto\"\xbf\x02\n\x13\x46ileDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07package\x18\x02 \x01(\t\x12\x12\n\ndependency\x18\x03 \x03(\t\x12\x19\n\x11public_dependency\x18\n \x03(\x05\x12\x17\n\x0fweak_dependency\x18\x0b \x03(\x05\x12\x36\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .perfetto.protos.DescriptorProto\x12\x37\n\tenum_type\x18\x05 \x03(\x0b\x32$.perfetto.protos.EnumDescriptorProto\x12\x38\n\textension\x18\x07 \x03(\x0b\x32%.perfetto.protos.FieldDescriptorProtoJ\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\nJ\x04\x08\x0c\x10\r\"\xd2\x03\n\x0f\x44\x65scriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x34\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.perfetto.protos.FieldDescriptorProto\x12\x38\n\textension\x18\x06 \x03(\x0b\x32%.perfetto.protos.FieldDescriptorProto\x12\x35\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .perfetto.protos.DescriptorProto\x12\x37\n\tenum_type\x18\x04 \x03(\x0b\x32$.perfetto.protos.EnumDescriptorProto\x12\x39\n\noneof_decl\x18\x08 \x03(\x0b\x32%.perfetto.protos.OneofDescriptorProto\x12\x46\n\x0ereserved_range\x18\t \x03(\x0b\x32..perfetto.protos.DescriptorProto.ReservedRange\x12\x15\n\rreserved_name\x18\n \x03(\t\x1a+\n\rReservedRange\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x05J\x04\x08\x05\x10\x06J\x04\x08\x07\x10\x08\"\x9e\x02\n\x13UninterpretedOption\x12;\n\x04name\x18\x02 \x03(\x0b\x32-.perfetto.protos.UninterpretedOption.NamePart\x12\x18\n\x10identifier_value\x18\x03 \x01(\t\x12\x1a\n\x12positive_int_value\x18\x04 \x01(\x04\x12\x1a\n\x12negative_int_value\x18\x05 \x01(\x03\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x14\n\x0cstring_value\x18\x07 \x01(\x0c\x12\x17\n\x0f\x61ggregate_value\x18\x08 \x01(\t\x1a\x33\n\x08NamePart\x12\x11\n\tname_part\x18\x01 \x01(\t\x12\x14\n\x0cis_extension\x18\x02 \x01(\x08\"c\n\x0c\x46ieldOptions\x12\x0e\n\x06packed\x18\x02 \x01(\x08\x12\x43\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.perfetto.protos.UninterpretedOption\"\xaf\x05\n\x14\x46ieldDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x03 \x01(\x05\x12:\n\x05label\x18\x04 \x01(\x0e\x32+.perfetto.protos.FieldDescriptorProto.Label\x12\x38\n\x04type\x18\x05 \x01(\x0e\x32*.perfetto.protos.FieldDescriptorProto.Type\x12\x11\n\ttype_name\x18\x06 \x01(\t\x12\x10\n\x08\x65xtendee\x18\x02 \x01(\t\x12\x15\n\rdefault_value\x18\x07 \x01(\t\x12.\n\x07options\x18\x08 \x01(\x0b\x32\x1d.perfetto.protos.FieldOptions\x12\x13\n\x0boneof_index\x18\t \x01(\x05\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\x12\x12\n\x0eLABEL_REPEATED\x10\x03J\x04\x08\n\x10\x0b\"T\n\x14OneofDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12.\n\x07options\x18\x02 \x01(\x0b\x32\x1d.perfetto.protos.OneofOptions\"\x80\x01\n\x13\x45numDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\x05value\x18\x02 \x03(\x0b\x32).perfetto.protos.EnumValueDescriptorProto\x12\x15\n\rreserved_name\x18\x05 \x03(\tJ\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05\">\n\x18\x45numValueDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x02 \x01(\x05J\x04\x08\x03\x10\x04\"!\n\x0cOneofOptions*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x06\x08\xe7\x07\x10\xe8\x07\"\x91\x01\n\x13\x45xtensionDescriptor\x12;\n\rextension_set\x18\x01 \x01(\x0b\x32\".perfetto.protos.FileDescriptorSetH\x00\x12\x1c\n\x12\x65xtension_set_gzip\x18\x02 \x01(\x0cH\x00\x12\x11\n\tfile_name\x18\x03 \x01(\tB\x0c\n\ndescriptor\"\x88\x02\n\x0cInodeFileMap\x12\x17\n\x0f\x62lock_device_id\x18\x01 \x01(\x04\x12\x14\n\x0cmount_points\x18\x02 \x03(\t\x12\x34\n\x07\x65ntries\x18\x03 \x03(\x0b\x32#.perfetto.protos.InodeFileMap.Entry\x1a\x92\x01\n\x05\x45ntry\x12\x14\n\x0cinode_number\x18\x01 \x01(\x04\x12\r\n\x05paths\x18\x02 \x03(\t\x12\x36\n\x04type\x18\x03 \x01(\x0e\x32(.perfetto.protos.InodeFileMap.Entry.Type\",\n\x04Type\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04\x46ILE\x10\x01\x12\r\n\tDIRECTORY\x10\x02\"M\n\x1f\x41ndroidFsDatareadEndFtraceEvent\x12\r\n\x05\x62ytes\x18\x01 \x01(\x05\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\"\x8e\x01\n!AndroidFsDatareadStartFtraceEvent\x12\r\n\x05\x62ytes\x18\x01 \x01(\x05\x12\x0f\n\x07\x63mdline\x18\x02 \x01(\t\x12\x0e\n\x06i_size\x18\x03 \x01(\x03\x12\x0b\n\x03ino\x18\x04 \x01(\x04\x12\x0e\n\x06offset\x18\x05 \x01(\x03\x12\x0f\n\x07pathbuf\x18\x06 \x01(\t\x12\x0b\n\x03pid\x18\x07 \x01(\x05\"N\n AndroidFsDatawriteEndFtraceEvent\x12\r\n\x05\x62ytes\x18\x01 \x01(\x05\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\"\x8f\x01\n\"AndroidFsDatawriteStartFtraceEvent\x12\r\n\x05\x62ytes\x18\x01 \x01(\x05\x12\x0f\n\x07\x63mdline\x18\x02 \x01(\t\x12\x0e\n\x06i_size\x18\x03 \x01(\x03\x12\x0b\n\x03ino\x18\x04 \x01(\x04\x12\x0e\n\x06offset\x18\x05 \x01(\x03\x12\x0f\n\x07pathbuf\x18\x06 \x01(\t\x12\x0b\n\x03pid\x18\x07 \x01(\x05\"J\n\x1c\x41ndroidFsFsyncEndFtraceEvent\x12\r\n\x05\x62ytes\x18\x01 \x01(\x05\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\"l\n\x1e\x41ndroidFsFsyncStartFtraceEvent\x12\x0f\n\x07\x63mdline\x18\x01 \x01(\t\x12\x0e\n\x06i_size\x18\x02 \x01(\x03\x12\x0b\n\x03ino\x18\x03 \x01(\x04\x12\x0f\n\x07pathbuf\x18\x04 \x01(\t\x12\x0b\n\x03pid\x18\x05 \x01(\x05\"\xbd\x01\n\x18\x42\x63lIrqTriggerFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x10\n\x08throttle\x18\x02 \x01(\x05\x12\x12\n\ncpu0_limit\x18\x03 \x01(\x05\x12\x12\n\ncpu1_limit\x18\x04 \x01(\x05\x12\x12\n\ncpu2_limit\x18\x05 \x01(\x05\x12\x11\n\ttpu_limit\x18\x06 \x01(\x05\x12\x11\n\tgpu_limit\x18\x07 \x01(\x05\x12\x0f\n\x07voltage\x18\x08 \x01(\x05\x12\x10\n\x08\x63\x61pacity\x18\t \x01(\x05\"\x95\x01\n\x1c\x42inderTransactionFtraceEvent\x12\x10\n\x08\x64\x65\x62ug_id\x18\x01 \x01(\x05\x12\x13\n\x0btarget_node\x18\x02 \x01(\x05\x12\x0f\n\x07to_proc\x18\x03 \x01(\x05\x12\x11\n\tto_thread\x18\x04 \x01(\x05\x12\r\n\x05reply\x18\x05 \x01(\x05\x12\x0c\n\x04\x63ode\x18\x06 \x01(\r\x12\r\n\x05\x66lags\x18\x07 \x01(\r\"8\n$BinderTransactionReceivedFtraceEvent\x12\x10\n\x08\x64\x65\x62ug_id\x18\x01 \x01(\x05\"v\n\x1c\x42inderSetPriorityFtraceEvent\x12\x0c\n\x04proc\x18\x01 \x01(\x05\x12\x0e\n\x06thread\x18\x02 \x01(\x05\x12\x10\n\x08old_prio\x18\x03 \x01(\r\x12\x10\n\x08new_prio\x18\x04 \x01(\r\x12\x14\n\x0c\x64\x65sired_prio\x18\x05 \x01(\r\"$\n\x15\x42inderLockFtraceEvent\x12\x0b\n\x03tag\x18\x01 \x01(\t\"&\n\x17\x42inderLockedFtraceEvent\x12\x0b\n\x03tag\x18\x01 \x01(\t\"&\n\x17\x42inderUnlockFtraceEvent\x12\x0b\n\x03tag\x18\x01 \x01(\t\"}\n$BinderTransactionAllocBufFtraceEvent\x12\x11\n\tdata_size\x18\x01 \x01(\x04\x12\x10\n\x08\x64\x65\x62ug_id\x18\x02 \x01(\x05\x12\x14\n\x0coffsets_size\x18\x03 \x01(\x04\x12\x1a\n\x12\x65xtra_buffers_size\x18\x04 \x01(\x04\"\'\n\x18\x42inderCommandFtraceEvent\x12\x0b\n\x03\x63md\x18\x01 \x01(\r\"&\n\x17\x42inderReturnFtraceEvent\x12\x0b\n\x03\x63md\x18\x01 \x01(\r\"\x81\x01\n\x17\x42lockRqIssueFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\r\n\x05\x62ytes\x18\x04 \x01(\r\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\x12\x0c\n\x04\x63omm\x18\x06 \x01(\t\x12\x0b\n\x03\x63md\x18\x07 \x01(\t\"j\n\x1c\x42lockBioBackmergeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"g\n\x19\x42lockBioBounceFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"j\n\x1b\x42lockBioCompleteFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\r\n\x05\x65rror\x18\x04 \x01(\x05\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\"k\n\x1d\x42lockBioFrontmergeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"f\n\x18\x42lockBioQueueFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"}\n\x18\x42lockBioRemapFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0f\n\x07old_dev\x18\x04 \x01(\x04\x12\x12\n\nold_sector\x18\x05 \x01(\x04\x12\x0c\n\x04rwbs\x18\x06 \x01(\t\"H\n\x1b\x42lockDirtyBufferFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x04\"c\n\x15\x42lockGetrqFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"$\n\x14\x42lockPlugFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\"t\n\x17\x42lockRqAbortFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0e\n\x06\x65rrors\x18\x04 \x01(\x05\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\x12\x0b\n\x03\x63md\x18\x06 \x01(\t\"\x86\x01\n\x1a\x42lockRqCompleteFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0e\n\x06\x65rrors\x18\x04 \x01(\x05\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\x12\x0b\n\x03\x63md\x18\x06 \x01(\t\x12\r\n\x05\x65rror\x18\x07 \x01(\x05\"\x82\x01\n\x18\x42lockRqInsertFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\r\n\x05\x62ytes\x18\x04 \x01(\r\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\x12\x0c\n\x04\x63omm\x18\x06 \x01(\t\x12\x0b\n\x03\x63md\x18\x07 \x01(\t\"\x8d\x01\n\x17\x42lockRqRemapFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0f\n\x07old_dev\x18\x04 \x01(\x04\x12\x12\n\nold_sector\x18\x05 \x01(\x04\x12\x0f\n\x07nr_bios\x18\x06 \x01(\r\x12\x0c\n\x04rwbs\x18\x07 \x01(\t\"v\n\x19\x42lockRqRequeueFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0e\n\x06\x65rrors\x18\x04 \x01(\x05\x12\x0c\n\x04rwbs\x18\x05 \x01(\t\x12\x0b\n\x03\x63md\x18\x06 \x01(\t\"e\n\x17\x42lockSleeprqFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"d\n\x15\x42lockSplitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x12\n\nnew_sector\x18\x03 \x01(\x04\x12\x0c\n\x04rwbs\x18\x04 \x01(\t\x12\x0c\n\x04\x63omm\x18\x05 \x01(\t\"H\n\x1b\x42lockTouchBufferFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x04\"5\n\x16\x42lockUnplugFtraceEvent\x12\r\n\x05nr_rq\x18\x01 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\"\x91\x01\n\x17\x42lockIoStartFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\r\n\x05\x62ytes\x18\x04 \x01(\r\x12\x0e\n\x06ioprio\x18\x05 \x01(\r\x12\x0c\n\x04rwbs\x18\x06 \x01(\t\x12\x0c\n\x04\x63omm\x18\x07 \x01(\t\x12\x0b\n\x03\x63md\x18\x08 \x01(\t\"\x90\x01\n\x16\x42lockIoDoneFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06sector\x18\x02 \x01(\x04\x12\x11\n\tnr_sector\x18\x03 \x01(\r\x12\r\n\x05\x62ytes\x18\x04 \x01(\r\x12\x0e\n\x06ioprio\x18\x05 \x01(\r\x12\x0c\n\x04rwbs\x18\x06 \x01(\t\x12\x0c\n\x04\x63omm\x18\x07 \x01(\t\x12\x0b\n\x03\x63md\x18\x08 \x01(\t\"\x8e\x01\n\x1b\x43groupAttachTaskFtraceEvent\x12\x10\n\x08\x64st_root\x18\x01 \x01(\x05\x12\x0e\n\x06\x64st_id\x18\x02 \x01(\x05\x12\x0b\n\x03pid\x18\x03 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x04 \x01(\t\x12\r\n\x05\x63name\x18\x05 \x01(\t\x12\x11\n\tdst_level\x18\x06 \x01(\x05\x12\x10\n\x08\x64st_path\x18\x07 \x01(\t\"^\n\x16\x43groupMkdirFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x63name\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\t\"G\n\x18\x43groupRemountFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\x0f\n\x07ss_mask\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\"^\n\x16\x43groupRmdirFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x63name\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\t\"\x91\x01\n\x1e\x43groupTransferTasksFtraceEvent\x12\x10\n\x08\x64st_root\x18\x01 \x01(\x05\x12\x0e\n\x06\x64st_id\x18\x02 \x01(\x05\x12\x0b\n\x03pid\x18\x03 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x04 \x01(\t\x12\r\n\x05\x63name\x18\x05 \x01(\t\x12\x11\n\tdst_level\x18\x06 \x01(\x05\x12\x10\n\x08\x64st_path\x18\x07 \x01(\t\"K\n\x1c\x43groupDestroyRootFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\x0f\n\x07ss_mask\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\"`\n\x18\x43groupReleaseFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x63name\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\t\"_\n\x17\x43groupRenameFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x63name\x18\x03 \x01(\t\x12\r\n\x05level\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\t\"I\n\x1a\x43groupSetupRootFtraceEvent\x12\x0c\n\x04root\x18\x01 \x01(\x05\x12\x0f\n\x07ss_mask\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\"$\n\x14\x43lkEnableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"%\n\x15\x43lkDisableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"3\n\x15\x43lkSetRateFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04rate\x18\x02 \x01(\x04\"F\n\x18\x43maAllocStartFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\r\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\"\xc4\x01\n\x17\x43maAllocInfoFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\r\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x0f\n\x07\x65rr_iso\x18\x03 \x01(\r\x12\x0f\n\x07\x65rr_mig\x18\x04 \x01(\r\x12\x10\n\x08\x65rr_test\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x11\n\tnr_mapped\x18\x07 \x01(\x04\x12\x13\n\x0bnr_migrated\x18\x08 \x01(\x04\x12\x14\n\x0cnr_reclaimed\x18\t \x01(\x04\x12\x0b\n\x03pfn\x18\n \x01(\x04\"s\n\x19\x43maAllocFinishFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03pfn\x18\x02 \x01(\x04\x12\x0c\n\x04page\x18\x03 \x01(\x04\x12\r\n\x05\x63ount\x18\x04 \x01(\x04\x12\r\n\x05\x61lign\x18\x05 \x01(\r\x12\x0f\n\x07\x65rrorno\x18\x06 \x01(\x05\"y\n\x1cMmCompactionBeginFtraceEvent\x12\x12\n\nzone_start\x18\x01 \x01(\x04\x12\x13\n\x0bmigrate_pfn\x18\x02 \x01(\x04\x12\x10\n\x08\x66ree_pfn\x18\x03 \x01(\x04\x12\x10\n\x08zone_end\x18\x04 \x01(\x04\x12\x0c\n\x04sync\x18\x05 \x01(\r\"\x90\x01\n&MmCompactionDeferCompactionFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\x0b\n\x03idx\x18\x02 \x01(\r\x12\r\n\x05order\x18\x03 \x01(\x05\x12\x12\n\nconsidered\x18\x04 \x01(\r\x12\x13\n\x0b\x64\x65\x66\x65r_shift\x18\x05 \x01(\r\x12\x14\n\x0corder_failed\x18\x06 \x01(\x05\"\x89\x01\n\x1fMmCompactionDeferredFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\x0b\n\x03idx\x18\x02 \x01(\r\x12\r\n\x05order\x18\x03 \x01(\x05\x12\x12\n\nconsidered\x18\x04 \x01(\r\x12\x13\n\x0b\x64\x65\x66\x65r_shift\x18\x05 \x01(\r\x12\x14\n\x0corder_failed\x18\x06 \x01(\x05\"\x8b\x01\n!MmCompactionDeferResetFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\x0b\n\x03idx\x18\x02 \x01(\r\x12\r\n\x05order\x18\x03 \x01(\x05\x12\x12\n\nconsidered\x18\x04 \x01(\r\x12\x13\n\x0b\x64\x65\x66\x65r_shift\x18\x05 \x01(\r\x12\x14\n\x0corder_failed\x18\x06 \x01(\x05\"\x87\x01\n\x1aMmCompactionEndFtraceEvent\x12\x12\n\nzone_start\x18\x01 \x01(\x04\x12\x13\n\x0bmigrate_pfn\x18\x02 \x01(\x04\x12\x10\n\x08\x66ree_pfn\x18\x03 \x01(\x04\x12\x10\n\x08zone_end\x18\x04 \x01(\x04\x12\x0c\n\x04sync\x18\x05 \x01(\r\x12\x0e\n\x06status\x18\x06 \x01(\x05\"W\n\x1fMmCompactionFinishedFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\x0b\n\x03idx\x18\x02 \x01(\r\x12\r\n\x05order\x18\x03 \x01(\x05\x12\x0b\n\x03ret\x18\x04 \x01(\x05\"s\n\'MmCompactionIsolateFreepagesFtraceEvent\x12\x11\n\tstart_pfn\x18\x01 \x01(\x04\x12\x0f\n\x07\x65nd_pfn\x18\x02 \x01(\x04\x12\x12\n\nnr_scanned\x18\x03 \x01(\x04\x12\x10\n\x08nr_taken\x18\x04 \x01(\x04\"v\n*MmCompactionIsolateMigratepagesFtraceEvent\x12\x11\n\tstart_pfn\x18\x01 \x01(\x04\x12\x0f\n\x07\x65nd_pfn\x18\x02 \x01(\x04\x12\x12\n\nnr_scanned\x18\x03 \x01(\x04\x12\x10\n\x08nr_taken\x18\x04 \x01(\x04\"4\n%MmCompactionKcompactdSleepFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\"r\n$MmCompactionKcompactdWakeFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\r\n\x05order\x18\x02 \x01(\x05\x12\x15\n\rclasszone_idx\x18\x03 \x01(\r\x12\x17\n\x0fhighest_zoneidx\x18\x04 \x01(\r\"M\n#MmCompactionMigratepagesFtraceEvent\x12\x13\n\x0bnr_migrated\x18\x01 \x01(\x04\x12\x11\n\tnr_failed\x18\x02 \x01(\x04\"W\n\x1fMmCompactionSuitableFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\x0b\n\x03idx\x18\x02 \x01(\r\x12\r\n\x05order\x18\x03 \x01(\x05\x12\x0b\n\x03ret\x18\x04 \x01(\x05\"g\n(MmCompactionTryToCompactPagesFtraceEvent\x12\r\n\x05order\x18\x01 \x01(\x05\x12\x10\n\x08gfp_mask\x18\x02 \x01(\r\x12\x0c\n\x04mode\x18\x03 \x01(\r\x12\x0c\n\x04prio\x18\x04 \x01(\x05\"t\n&MmCompactionWakeupKcompactdFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\r\n\x05order\x18\x02 \x01(\x05\x12\x15\n\rclasszone_idx\x18\x03 \x01(\r\x12\x17\n\x0fhighest_zoneidx\x18\x04 \x01(\r\"M\n\x1bParamSetValueCpmFtraceEvent\x12\x0c\n\x04\x62ody\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r\x12\x11\n\ttimestamp\x18\x03 \x01(\x03\"L\n\x14\x43puhpExitFtraceEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12\x0b\n\x03idx\x18\x02 \x01(\x05\x12\x0b\n\x03ret\x18\x03 \x01(\x05\x12\r\n\x05state\x18\x04 \x01(\x05\"S\n\x1a\x43puhpMultiEnterFtraceEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12\x0b\n\x03\x66un\x18\x02 \x01(\x04\x12\x0b\n\x03idx\x18\x03 \x01(\x05\x12\x0e\n\x06target\x18\x04 \x01(\x05\"N\n\x15\x43puhpEnterFtraceEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12\x0b\n\x03\x66un\x18\x02 \x01(\x04\x12\x0b\n\x03idx\x18\x03 \x01(\x05\x12\x0e\n\x06target\x18\x04 \x01(\x05\"P\n\x17\x43puhpLatencyFtraceEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12\x0b\n\x03ret\x18\x02 \x01(\x05\x12\r\n\x05state\x18\x03 \x01(\r\x12\x0c\n\x04time\x18\x04 \x01(\x04\"W\n\x15\x43puhpPauseFtraceEvent\x12\x13\n\x0b\x61\x63tive_cpus\x18\x01 \x01(\r\x12\x0c\n\x04\x63pus\x18\x02 \x01(\r\x12\r\n\x05pause\x18\x03 \x01(\r\x12\x0c\n\x04time\x18\x04 \x01(\r\"\xaa\x01\n\x1e\x43rosEcSensorhubDataFtraceEvent\x12\x14\n\x0c\x63urrent_time\x18\x01 \x01(\x03\x12\x19\n\x11\x63urrent_timestamp\x18\x02 \x01(\x03\x12\r\n\x05\x64\x65lta\x18\x03 \x01(\x03\x12\x19\n\x11\x65\x63_fifo_timestamp\x18\x04 \x01(\r\x12\x15\n\rec_sensor_num\x18\x05 \x01(\r\x12\x16\n\x0e\x66ifo_timestamp\x18\x06 \x01(\x03\"1\n\x14\x44\x63vshFreqFtraceEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\x04\x12\x0c\n\x04\x66req\x18\x02 \x01(\x04\"w\n\x1b\x44\x65vfreqFrequencyFtraceEvent\x12\x10\n\x08\x64\x65v_name\x18\x01 \x01(\t\x12\x0c\n\x04\x66req\x18\x02 \x01(\x04\x12\x11\n\tprev_freq\x18\x03 \x01(\x04\x12\x11\n\tbusy_time\x18\x04 \x01(\x04\x12\x12\n\ntotal_time\x18\x05 \x01(\x04\"[\n\x17\x44maFenceInitFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"[\n\x17\x44maFenceEmitFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"_\n\x1b\x44maFenceSignaledFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"`\n\x1c\x44maFenceWaitStartFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"^\n\x1a\x44maFenceWaitEndFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"M\n\x16\x44maHeapStatFtraceEvent\x12\r\n\x05inode\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\x03\x12\x17\n\x0ftotal_allocated\x18\x03 \x01(\x04\"\x81\x01\n\x1e\x44puTracingMarkWriteFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x12\n\ntrace_name\x18\x02 \x01(\t\x12\x13\n\x0btrace_begin\x18\x03 \x01(\r\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0c\n\x04type\x18\x05 \x01(\r\x12\r\n\x05value\x18\x06 \x01(\x05\"A\n\x1e\x44puDsiCmdFifoStatusFtraceEvent\x12\x0e\n\x06header\x18\x01 \x01(\r\x12\x0f\n\x07payload\x18\x02 \x01(\r\"2\n\x13\x44puDsiRxFtraceEvent\x12\x0b\n\x03\x63md\x18\x01 \x01(\r\x12\x0e\n\x06rx_buf\x18\x03 \x01(\x0c\"S\n\x13\x44puDsiTxFtraceEvent\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0c\n\x04last\x18\x03 \x01(\r\x12\x10\n\x08\x64\x65lay_ms\x18\x04 \x01(\r\x12\x0e\n\x06tx_buf\x18\x05 \x01(\x0c\"X\n\x1d\x44puDispDpuUnderrunFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x16\n\x0e\x66rames_pending\x18\x02 \x01(\x05\x12\x13\n\x0bvsync_count\x18\x03 \x01(\x05\"R\n!DpuDispVblankIrqEnableFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x11\n\toutput_id\x18\x02 \x01(\x05\x12\x0e\n\x06\x65nable\x18\x03 \x01(\x05\"\x8d\x01\n\"DpuDispFrameDoneTimeoutFtraceEvent\x12\x12\n\ndisplay_id\x18\x01 \x01(\x05\x12\x11\n\toutput_id\x18\x02 \x01(\r\x12\x16\n\x0e\x66rames_pending\x18\x03 \x01(\x05\x12\x10\n\x08te_count\x18\x04 \x01(\x05\x12\x16\n\x0e\x64uring_disable\x18\x05 \x01(\r\"v\n#DpuDispFrameStartTimeoutFtraceEvent\x12\x12\n\ndisplay_id\x18\x01 \x01(\x05\x12\x11\n\toutput_id\x18\x02 \x01(\r\x12\x16\n\x0e\x66rames_pending\x18\x03 \x01(\x05\x12\x10\n\x08te_count\x18\x04 \x01(\x05\"u\n\"DpuDispFrameDoneMissingFtraceEvent\x12\x12\n\ndisplay_id\x18\x01 \x01(\x05\x12\x11\n\toutput_id\x18\x02 \x01(\r\x12\x16\n\x0e\x66rames_pending\x18\x03 \x01(\x05\x12\x10\n\x08te_count\x18\x04 \x01(\x05\"v\n#DpuDispFrameStartMissingFtraceEvent\x12\x12\n\ndisplay_id\x18\x01 \x01(\x05\x12\x11\n\toutput_id\x18\x02 \x01(\r\x12\x16\n\x0e\x66rames_pending\x18\x03 \x01(\x05\x12\x10\n\x08te_count\x18\x04 \x01(\x05\"\\\n!DpuDispDpuLineUnderrunFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x16\n\x0e\x66rames_pending\x18\x02 \x01(\x05\x12\x13\n\x0bvsync_count\x18\x03 \x01(\x05\"W\n\x19\x44rmVblankEventFtraceEvent\x12\x0c\n\x04\x63rtc\x18\x01 \x01(\x05\x12\x11\n\thigh_prec\x18\x02 \x01(\r\x12\x0b\n\x03seq\x18\x03 \x01(\r\x12\x0c\n\x04time\x18\x04 \x01(\x03\"M\n\"DrmVblankEventDeliveredFtraceEvent\x12\x0c\n\x04\x63rtc\x18\x01 \x01(\x05\x12\x0c\n\x04\x66ile\x18\x02 \x01(\x04\x12\x0b\n\x03seq\x18\x03 \x01(\r\"\xa2\x01\n\x1b\x44wc3AllocRequestFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03req\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tual\x18\x03 \x01(\r\x12\x0e\n\x06length\x18\x04 \x01(\r\x12\x0e\n\x06status\x18\x05 \x01(\x05\x12\x0c\n\x04zero\x18\x06 \x01(\x05\x12\x14\n\x0cshort_not_ok\x18\x07 \x01(\x05\x12\x14\n\x0cno_interrupt\x18\x08 \x01(\x05\"\xc0\x01\n\x1a\x44wc3CompleteTrbFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03trb\x18\x02 \x01(\x04\x12\x11\n\tallocated\x18\x03 \x01(\r\x12\x0e\n\x06queued\x18\x04 \x01(\r\x12\x0b\n\x03\x62pl\x18\x05 \x01(\r\x12\x0b\n\x03\x62ph\x18\x06 \x01(\r\x12\x0c\n\x04size\x18\x07 \x01(\r\x12\x0c\n\x04\x63trl\x18\x08 \x01(\r\x12\x0c\n\x04type\x18\t \x01(\r\x12\x0f\n\x07\x65nqueue\x18\n \x01(\r\x12\x0f\n\x07\x64\x65queue\x18\x0b \x01(\r\"~\n\x16\x44wc3CtrlReqFtraceEvent\x12\x14\n\x0c\x62RequestType\x18\x01 \x01(\r\x12\x10\n\x08\x62Request\x18\x02 \x01(\r\x12\x0e\n\x06wValue\x18\x03 \x01(\r\x12\x0e\n\x06wIndex\x18\x04 \x01(\r\x12\x0f\n\x07wLength\x18\x05 \x01(\r\x12\x0b\n\x03str\x18\x06 \x01(\t\"\x9f\x01\n\x18\x44wc3EpDequeueFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03req\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tual\x18\x03 \x01(\r\x12\x0e\n\x06length\x18\x04 \x01(\r\x12\x0e\n\x06status\x18\x05 \x01(\x05\x12\x0c\n\x04zero\x18\x06 \x01(\x05\x12\x14\n\x0cshort_not_ok\x18\x07 \x01(\x05\x12\x14\n\x0cno_interrupt\x18\x08 \x01(\x05\"\x9d\x01\n\x16\x44wc3EpQueueFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03req\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tual\x18\x03 \x01(\r\x12\x0e\n\x06length\x18\x04 \x01(\r\x12\x0e\n\x06status\x18\x05 \x01(\x05\x12\x0c\n\x04zero\x18\x06 \x01(\x05\x12\x14\n\x0cshort_not_ok\x18\x07 \x01(\x05\x12\x14\n\x0cno_interrupt\x18\x08 \x01(\x05\"D\n\x14\x44wc3EventFtraceEvent\x12\r\n\x05\x65vent\x18\x01 \x01(\r\x12\x10\n\x08\x65p0state\x18\x02 \x01(\r\x12\x0b\n\x03str\x18\x03 \x01(\t\"\xa1\x01\n\x1a\x44wc3FreeRequestFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03req\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tual\x18\x03 \x01(\r\x12\x0e\n\x06length\x18\x04 \x01(\r\x12\x0e\n\x06status\x18\x05 \x01(\x05\x12\x0c\n\x04zero\x18\x06 \x01(\x05\x12\x14\n\x0cshort_not_ok\x18\x07 \x01(\x05\x12\x14\n\x0cno_interrupt\x18\x08 \x01(\x05\"{\n\x1a\x44wc3GadgetEpCmdFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03\x63md\x18\x02 \x01(\r\x12\x0e\n\x06param0\x18\x03 \x01(\r\x12\x0e\n\x06param1\x18\x04 \x01(\r\x12\x0e\n\x06param2\x18\x05 \x01(\r\x12\x12\n\ncmd_status\x18\x06 \x01(\x05\"\xcd\x01\n\x1e\x44wc3GadgetEpDisableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tmaxpacket\x18\x02 \x01(\r\x12\x17\n\x0fmaxpacket_limit\x18\x03 \x01(\r\x12\x13\n\x0bmax_streams\x18\x04 \x01(\r\x12\x10\n\x08maxburst\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x06 \x01(\r\x12\x11\n\tdirection\x18\x07 \x01(\r\x12\x13\n\x0btrb_enqueue\x18\x08 \x01(\r\x12\x13\n\x0btrb_dequeue\x18\t \x01(\r\"\xcc\x01\n\x1d\x44wc3GadgetEpEnableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tmaxpacket\x18\x02 \x01(\r\x12\x17\n\x0fmaxpacket_limit\x18\x03 \x01(\r\x12\x13\n\x0bmax_streams\x18\x04 \x01(\r\x12\x10\n\x08maxburst\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x06 \x01(\r\x12\x11\n\tdirection\x18\x07 \x01(\r\x12\x13\n\x0btrb_enqueue\x18\x08 \x01(\r\x12\x13\n\x0btrb_dequeue\x18\t \x01(\r\"M\n\x1f\x44wc3GadgetGenericCmdFtraceEvent\x12\x0b\n\x03\x63md\x18\x01 \x01(\r\x12\r\n\x05param\x18\x02 \x01(\r\x12\x0e\n\x06status\x18\x03 \x01(\x05\"\xa4\x01\n\x1d\x44wc3GadgetGivebackFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03req\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tual\x18\x03 \x01(\r\x12\x0e\n\x06length\x18\x04 \x01(\r\x12\x0e\n\x06status\x18\x05 \x01(\x05\x12\x0c\n\x04zero\x18\x06 \x01(\x05\x12\x14\n\x0cshort_not_ok\x18\x07 \x01(\x05\x12\x14\n\x0cno_interrupt\x18\x08 \x01(\x05\"\xbf\x01\n\x19\x44wc3PrepareTrbFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03trb\x18\x02 \x01(\x04\x12\x11\n\tallocated\x18\x03 \x01(\r\x12\x0e\n\x06queued\x18\x04 \x01(\r\x12\x0b\n\x03\x62pl\x18\x05 \x01(\r\x12\x0b\n\x03\x62ph\x18\x06 \x01(\r\x12\x0c\n\x04size\x18\x07 \x01(\r\x12\x0c\n\x04\x63trl\x18\x08 \x01(\r\x12\x0c\n\x04type\x18\t \x01(\r\x12\x0f\n\x07\x65nqueue\x18\n \x01(\r\x12\x0f\n\x07\x64\x65queue\x18\x0b \x01(\r\"P\n\x14\x44wc3ReadlFtraceEvent\x12\x0c\n\x04\x62\x61se\x18\x01 \x01(\x04\x12\x0e\n\x06offset\x18\x02 \x01(\r\x12\r\n\x05value\x18\x03 \x01(\r\x12\x0b\n\x03msg\x18\x04 \x01(\t\"Q\n\x15\x44wc3WritelFtraceEvent\x12\x0c\n\x04\x62\x61se\x18\x01 \x01(\x04\x12\x0e\n\x06offset\x18\x02 \x01(\r\x12\r\n\x05value\x18\x03 \x01(\r\x12\x0b\n\x03msg\x18\x04 \x01(\t\"`\n\x1b\x45xt4DaWriteBeginFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"_\n\x19\x45xt4DaWriteEndFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0e\n\x06\x63opied\x18\x05 \x01(\r\"Z\n\x1c\x45xt4SyncFileEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06parent\x18\x03 \x01(\x04\x12\x10\n\x08\x64\x61tasync\x18\x04 \x01(\x05\"D\n\x1b\x45xt4SyncFileExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"b\n\x1c\x45xt4AllocDaBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x13\n\x0b\x64\x61ta_blocks\x18\x03 \x01(\r\x12\x13\n\x0bmeta_blocks\x18\x04 \x01(\r\"\xc1\x01\n\x1d\x45xt4AllocateBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x62lock\x18\x03 \x01(\x04\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0f\n\x07logical\x18\x05 \x01(\r\x12\r\n\x05lleft\x18\x06 \x01(\r\x12\x0e\n\x06lright\x18\x07 \x01(\r\x12\x0c\n\x04goal\x18\x08 \x01(\x04\x12\r\n\x05pleft\x18\t \x01(\x04\x12\x0e\n\x06pright\x18\n \x01(\x04\x12\r\n\x05\x66lags\x18\x0b \x01(\r\"S\n\x1c\x45xt4AllocateInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03\x64ir\x18\x03 \x01(\x04\x12\x0c\n\x04mode\x18\x04 \x01(\r\"Q\n#Ext4BeginOrderedTruncateFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x10\n\x08new_size\x18\x03 \x01(\x03\"U\n\x1c\x45xt4CollapseRangeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\"\xca\x01\n\x1d\x45xt4DaReleaseSpaceFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x10\n\x08i_blocks\x18\x03 \x01(\x04\x12\x14\n\x0c\x66reed_blocks\x18\x04 \x01(\x05\x12\x1c\n\x14reserved_data_blocks\x18\x05 \x01(\x05\x12\x1c\n\x14reserved_meta_blocks\x18\x06 \x01(\x05\x12\x1d\n\x15\x61llocated_meta_blocks\x18\x07 \x01(\x05\x12\x0c\n\x04mode\x18\x08 \x01(\r\"\xa8\x01\n\x1d\x45xt4DaReserveSpaceFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x10\n\x08i_blocks\x18\x03 \x01(\x04\x12\x1c\n\x14reserved_data_blocks\x18\x04 \x01(\x05\x12\x1c\n\x14reserved_meta_blocks\x18\x05 \x01(\x05\x12\x0c\n\x04mode\x18\x06 \x01(\r\x12\x11\n\tmd_needed\x18\x07 \x01(\x05\"\xe4\x01\n#Ext4DaUpdateReserveSpaceFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x10\n\x08i_blocks\x18\x03 \x01(\x04\x12\x13\n\x0bused_blocks\x18\x04 \x01(\x05\x12\x1c\n\x14reserved_data_blocks\x18\x05 \x01(\x05\x12\x1c\n\x14reserved_meta_blocks\x18\x06 \x01(\x05\x12\x1d\n\x15\x61llocated_meta_blocks\x18\x07 \x01(\x05\x12\x13\n\x0bquota_claim\x18\x08 \x01(\x05\x12\x0c\n\x04mode\x18\t \x01(\r\"\xcf\x01\n\x1b\x45xt4DaWritePagesFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x12\n\nfirst_page\x18\x03 \x01(\x04\x12\x13\n\x0bnr_to_write\x18\x04 \x01(\x03\x12\x11\n\tsync_mode\x18\x05 \x01(\x05\x12\x11\n\tb_blocknr\x18\x06 \x01(\x04\x12\x0e\n\x06\x62_size\x18\x07 \x01(\r\x12\x0f\n\x07\x62_state\x18\x08 \x01(\r\x12\x0f\n\x07io_done\x18\t \x01(\x05\x12\x15\n\rpages_written\x18\n \x01(\x05\"g\n!Ext4DaWritePagesExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\x04\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"^\n\x1c\x45xt4DirectIOEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x04\x12\n\n\x02rw\x18\x05 \x01(\x05\"j\n\x1b\x45xt4DirectIOExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x04\x12\n\n\x02rw\x18\x05 \x01(\x05\x12\x0b\n\x03ret\x18\x06 \x01(\x05\"G\n\x1c\x45xt4DiscardBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03\x62lk\x18\x02 \x01(\x04\x12\r\n\x05\x63ount\x18\x03 \x01(\x04\"]\n$Ext4DiscardPreallocationsFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03len\x18\x03 \x01(\r\x12\x0e\n\x06needed\x18\x04 \x01(\r\"B\n\x18\x45xt4DropInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04\x64rop\x18\x03 \x01(\x05\"q\n\x1c\x45xt4EsCacheExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0c\n\x04pblk\x18\x05 \x01(\x04\x12\x0e\n\x06status\x18\x06 \x01(\r\"V\n,Ext4EsFindDelayedExtentRangeEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\"\x80\x01\n+Ext4EsFindDelayedExtentRangeExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0c\n\x04pblk\x18\x05 \x01(\x04\x12\x0e\n\x06status\x18\x06 \x01(\x04\"r\n\x1d\x45xt4EsInsertExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0c\n\x04pblk\x18\x05 \x01(\x04\x12\x0e\n\x06status\x18\x06 \x01(\x04\"L\n\"Ext4EsLookupExtentEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\"\x85\x01\n!Ext4EsLookupExtentExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0c\n\x04pblk\x18\x05 \x01(\x04\x12\x0e\n\x06status\x18\x06 \x01(\x04\x12\r\n\x05\x66ound\x18\x07 \x01(\x05\"T\n\x1d\x45xt4EsRemoveExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\"q\n\x17\x45xt4EsShrinkFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x11\n\tnr_shrunk\x18\x02 \x01(\x05\x12\x11\n\tscan_time\x18\x03 \x01(\x04\x12\x12\n\nnr_skipped\x18\x04 \x01(\x05\x12\x0f\n\x07retried\x18\x05 \x01(\x05\"R\n\x1c\x45xt4EsShrinkCountFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x12\n\nnr_to_scan\x18\x02 \x01(\x05\x12\x11\n\tcache_cnt\x18\x03 \x01(\x05\"V\n Ext4EsShrinkScanEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x12\n\nnr_to_scan\x18\x02 \x01(\x05\x12\x11\n\tcache_cnt\x18\x03 \x01(\x05\"T\n\x1f\x45xt4EsShrinkScanExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x11\n\tnr_shrunk\x18\x02 \x01(\x05\x12\x11\n\tcache_cnt\x18\x03 \x01(\x05\"D\n\x19\x45xt4EvictInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05nlink\x18\x03 \x01(\x05\"\x95\x01\n+Ext4ExtConvertToInitializedEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06m_lblk\x18\x03 \x01(\r\x12\r\n\x05m_len\x18\x04 \x01(\r\x12\x0e\n\x06u_lblk\x18\x05 \x01(\r\x12\r\n\x05u_len\x18\x06 \x01(\r\x12\x0e\n\x06u_pblk\x18\x07 \x01(\x04\"\xc7\x01\n.Ext4ExtConvertToInitializedFastpathFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06m_lblk\x18\x03 \x01(\r\x12\r\n\x05m_len\x18\x04 \x01(\r\x12\x0e\n\x06u_lblk\x18\x05 \x01(\r\x12\r\n\x05u_len\x18\x06 \x01(\r\x12\x0e\n\x06u_pblk\x18\x07 \x01(\x04\x12\x0e\n\x06i_lblk\x18\x08 \x01(\r\x12\r\n\x05i_len\x18\t \x01(\r\x12\x0e\n\x06i_pblk\x18\n \x01(\x04\"\x9f\x01\n(Ext4ExtHandleUnwrittenExtentsFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x66lags\x18\x03 \x01(\x05\x12\x0c\n\x04lblk\x18\x04 \x01(\r\x12\x0c\n\x04pblk\x18\x05 \x01(\x04\x12\x0b\n\x03len\x18\x06 \x01(\r\x12\x11\n\tallocated\x18\x07 \x01(\r\x12\x0e\n\x06newblk\x18\x08 \x01(\x04\"P\n\x19\x45xt4ExtInCacheFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03ret\x18\x04 \x01(\x05\"T\n\x1c\x45xt4ExtLoadExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pblk\x18\x03 \x01(\x04\x12\x0c\n\x04lblk\x18\x04 \x01(\r\"f\n Ext4ExtMapBlocksEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"\x90\x01\n\x1f\x45xt4ExtMapBlocksExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x0c\n\x04pblk\x18\x04 \x01(\x04\x12\x0c\n\x04lblk\x18\x05 \x01(\r\x12\x0b\n\x03len\x18\x06 \x01(\r\x12\x0e\n\x06mflags\x18\x07 \x01(\r\x12\x0b\n\x03ret\x18\x08 \x01(\x05\"b\n\x1c\x45xt4ExtPutInCacheFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05start\x18\x05 \x01(\x04\"d\n\x1d\x45xt4ExtRemoveSpaceFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05start\x18\x03 \x01(\r\x12\x0b\n\x03\x65nd\x18\x04 \x01(\r\x12\r\n\x05\x64\x65pth\x18\x05 \x01(\x05\"\xc1\x01\n!Ext4ExtRemoveSpaceDoneFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05start\x18\x03 \x01(\r\x12\x0b\n\x03\x65nd\x18\x04 \x01(\r\x12\r\n\x05\x64\x65pth\x18\x05 \x01(\x05\x12\x0f\n\x07partial\x18\x06 \x01(\x03\x12\x12\n\neh_entries\x18\x07 \x01(\r\x12\x0f\n\x07pc_lblk\x18\x08 \x01(\r\x12\x0f\n\x07pc_pclu\x18\t \x01(\x04\x12\x10\n\x08pc_state\x18\n \x01(\x05\"A\n\x17\x45xt4ExtRmIdxFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pblk\x18\x03 \x01(\x04\"\xba\x01\n\x18\x45xt4ExtRmLeafFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0f\n\x07partial\x18\x03 \x01(\x03\x12\r\n\x05start\x18\x04 \x01(\r\x12\x0f\n\x07\x65\x65_lblk\x18\x05 \x01(\r\x12\x0f\n\x07\x65\x65_pblk\x18\x06 \x01(\x04\x12\x0e\n\x06\x65\x65_len\x18\x07 \x01(\x05\x12\x0f\n\x07pc_lblk\x18\x08 \x01(\r\x12\x0f\n\x07pc_pclu\x18\t \x01(\x04\x12\x10\n\x08pc_state\x18\n \x01(\x05\"a\n\x1c\x45xt4ExtShowExtentFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pblk\x18\x03 \x01(\x04\x12\x0c\n\x04lblk\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\"q\n\x1d\x45xt4FallocateEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\x12\x0c\n\x04mode\x18\x05 \x01(\x05\x12\x0b\n\x03pos\x18\x06 \x01(\x03\"b\n\x1c\x45xt4FallocateExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0e\n\x06\x62locks\x18\x04 \x01(\r\x12\x0b\n\x03ret\x18\x05 \x01(\x05\"\x89\x01\n Ext4FindDelallocRangeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04\x66rom\x18\x03 \x01(\r\x12\n\n\x02to\x18\x04 \x01(\r\x12\x0f\n\x07reverse\x18\x05 \x01(\x05\x12\r\n\x05\x66ound\x18\x06 \x01(\x05\x12\x11\n\tfound_blk\x18\x07 \x01(\r\"c\n\x15\x45xt4ForgetFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x62lock\x18\x03 \x01(\x04\x12\x13\n\x0bis_metadata\x18\x04 \x01(\x05\x12\x0c\n\x04mode\x18\x05 \x01(\r\"p\n\x19\x45xt4FreeBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x62lock\x18\x03 \x01(\x04\x12\r\n\x05\x63ount\x18\x04 \x01(\x04\x12\r\n\x05\x66lags\x18\x05 \x01(\x05\x12\x0c\n\x04mode\x18\x06 \x01(\r\"l\n\x18\x45xt4FreeInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03uid\x18\x03 \x01(\r\x12\x0b\n\x03gid\x18\x04 \x01(\r\x12\x0e\n\x06\x62locks\x18\x05 \x01(\x04\x12\x0c\n\x04mode\x18\x06 \x01(\r\"}\n)Ext4GetImpliedClusterAllocExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0c\n\x04pblk\x18\x04 \x01(\x04\x12\x0b\n\x03len\x18\x05 \x01(\r\x12\x0b\n\x03ret\x18\x06 \x01(\x05\"]\n&Ext4GetReservedClusterAllocFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\"f\n Ext4IndMapBlocksEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04lblk\x18\x03 \x01(\r\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"\x90\x01\n\x1f\x45xt4IndMapBlocksExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x0c\n\x04pblk\x18\x04 \x01(\x04\x12\x0c\n\x04lblk\x18\x05 \x01(\r\x12\x0b\n\x03len\x18\x06 \x01(\r\x12\x0e\n\x06mflags\x18\x07 \x01(\r\x12\x0b\n\x03ret\x18\x08 \x01(\x05\"S\n\x1a\x45xt4InsertRangeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\"h\n\x1d\x45xt4InvalidatepageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\x12\x0e\n\x06offset\x18\x04 \x01(\x04\x12\x0e\n\x06length\x18\x05 \x01(\r\"\x81\x01\n\x1b\x45xt4JournalStartFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\n\n\x02ip\x18\x02 \x01(\x04\x12\x0e\n\x06\x62locks\x18\x03 \x01(\x05\x12\x12\n\nrsv_blocks\x18\x04 \x01(\x05\x12\x0f\n\x07nblocks\x18\x05 \x01(\x05\x12\x14\n\x0crevoke_creds\x18\x06 \x01(\x05\"N\n#Ext4JournalStartReservedFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\n\n\x02ip\x18\x02 \x01(\x04\x12\x0e\n\x06\x62locks\x18\x03 \x01(\x05\"r\n\'Ext4JournalledInvalidatepageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\x12\x0e\n\x06offset\x18\x04 \x01(\x04\x12\x0e\n\x06length\x18\x05 \x01(\r\"g\n!Ext4JournalledWriteEndFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0e\n\x06\x63opied\x18\x05 \x01(\r\"4\n\x18\x45xt4LoadInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\"<\n\x1e\x45xt4LoadInodeBitmapFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05group\x18\x02 \x01(\r\"E\n\x1d\x45xt4MarkInodeDirtyFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\n\n\x02ip\x18\x03 \x01(\x04\"9\n\x1b\x45xt4MbBitmapLoadFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05group\x18\x02 \x01(\r\">\n Ext4MbBuddyBitmapLoadFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05group\x18\x02 \x01(\r\"E\n&Ext4MbDiscardPreallocationsFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0e\n\x06needed\x18\x02 \x01(\x05\"m\n\x1b\x45xt4MbNewGroupPaFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x11\n\tpa_pstart\x18\x03 \x01(\x04\x12\x11\n\tpa_lstart\x18\x04 \x01(\x04\x12\x0e\n\x06pa_len\x18\x05 \x01(\r\"m\n\x1b\x45xt4MbNewInodePaFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x11\n\tpa_pstart\x18\x03 \x01(\x04\x12\x11\n\tpa_lstart\x18\x04 \x01(\x04\x12\x0e\n\x06pa_len\x18\x05 \x01(\r\"Q\n\x1f\x45xt4MbReleaseGroupPaFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x11\n\tpa_pstart\x18\x02 \x01(\x04\x12\x0e\n\x06pa_len\x18\x03 \x01(\r\"Y\n\x1f\x45xt4MbReleaseInodePaFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05\x62lock\x18\x03 \x01(\x04\x12\r\n\x05\x63ount\x18\x04 \x01(\r\"\x86\x03\n\x1b\x45xt4MballocAllocFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x14\n\x0corig_logical\x18\x03 \x01(\r\x12\x12\n\norig_start\x18\x04 \x01(\x05\x12\x12\n\norig_group\x18\x05 \x01(\r\x12\x10\n\x08orig_len\x18\x06 \x01(\x05\x12\x14\n\x0cgoal_logical\x18\x07 \x01(\r\x12\x12\n\ngoal_start\x18\x08 \x01(\x05\x12\x12\n\ngoal_group\x18\t \x01(\r\x12\x10\n\x08goal_len\x18\n \x01(\x05\x12\x16\n\x0eresult_logical\x18\x0b \x01(\r\x12\x14\n\x0cresult_start\x18\x0c \x01(\x05\x12\x14\n\x0cresult_group\x18\r \x01(\r\x12\x12\n\nresult_len\x18\x0e \x01(\x05\x12\r\n\x05\x66ound\x18\x0f \x01(\r\x12\x0e\n\x06groups\x18\x10 \x01(\r\x12\r\n\x05\x62uddy\x18\x11 \x01(\r\x12\r\n\x05\x66lags\x18\x12 \x01(\r\x12\x0c\n\x04tail\x18\x13 \x01(\r\x12\n\n\x02\x63r\x18\x14 \x01(\r\"y\n\x1d\x45xt4MballocDiscardFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x14\n\x0cresult_start\x18\x03 \x01(\x05\x12\x14\n\x0cresult_group\x18\x04 \x01(\r\x12\x12\n\nresult_len\x18\x05 \x01(\x05\"v\n\x1a\x45xt4MballocFreeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x14\n\x0cresult_start\x18\x03 \x01(\x05\x12\x14\n\x0cresult_group\x18\x04 \x01(\r\x12\x12\n\nresult_len\x18\x05 \x01(\x05\"\xe2\x01\n\x1e\x45xt4MballocPreallocFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x14\n\x0corig_logical\x18\x03 \x01(\r\x12\x12\n\norig_start\x18\x04 \x01(\x05\x12\x12\n\norig_group\x18\x05 \x01(\r\x12\x10\n\x08orig_len\x18\x06 \x01(\x05\x12\x16\n\x0eresult_logical\x18\x07 \x01(\r\x12\x14\n\x0cresult_start\x18\x08 \x01(\x05\x12\x14\n\x0cresult_group\x18\t \x01(\r\x12\x12\n\nresult_len\x18\n \x01(\x05\"y\n#Ext4OtherInodeUpdateTimeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x10\n\x08orig_ino\x18\x03 \x01(\x04\x12\x0b\n\x03uid\x18\x04 \x01(\r\x12\x0b\n\x03gid\x18\x05 \x01(\r\x12\x0c\n\x04mode\x18\x06 \x01(\r\"_\n\x18\x45xt4PunchHoleFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\x12\x0c\n\x04mode\x18\x05 \x01(\x05\"R\n\"Ext4ReadBlockBitmapLoadFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05group\x18\x02 \x01(\r\x12\x10\n\x08prefetch\x18\x03 \x01(\r\"B\n\x17\x45xt4ReadpageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\"E\n\x1a\x45xt4ReleasepageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\"\xc8\x01\n\x1b\x45xt4RemoveBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04\x66rom\x18\x03 \x01(\r\x12\n\n\x02to\x18\x04 \x01(\r\x12\x0f\n\x07partial\x18\x05 \x01(\x03\x12\x0f\n\x07\x65\x65_pblk\x18\x06 \x01(\x04\x12\x0f\n\x07\x65\x65_lblk\x18\x07 \x01(\r\x12\x0e\n\x06\x65\x65_len\x18\x08 \x01(\r\x12\x0f\n\x07pc_lblk\x18\t \x01(\r\x12\x0f\n\x07pc_pclu\x18\n \x01(\x04\x12\x10\n\x08pc_state\x18\x0b \x01(\x05\"\xb1\x01\n\x1c\x45xt4RequestBlocksFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03len\x18\x03 \x01(\r\x12\x0f\n\x07logical\x18\x04 \x01(\r\x12\r\n\x05lleft\x18\x05 \x01(\r\x12\x0e\n\x06lright\x18\x06 \x01(\r\x12\x0c\n\x04goal\x18\x07 \x01(\x04\x12\r\n\x05pleft\x18\x08 \x01(\x04\x12\x0e\n\x06pright\x18\t \x01(\x04\x12\r\n\x05\x66lags\x18\n \x01(\r\"E\n\x1b\x45xt4RequestInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03\x64ir\x18\x02 \x01(\x04\x12\x0c\n\x04mode\x18\x03 \x01(\r\"2\n\x15\x45xt4SyncFsFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0c\n\x04wait\x18\x02 \x01(\x05\"m\n\x1a\x45xt4TrimAllFreeFtraceEvent\x12\x11\n\tdev_major\x18\x01 \x01(\x05\x12\x11\n\tdev_minor\x18\x02 \x01(\x05\x12\r\n\x05group\x18\x03 \x01(\r\x12\r\n\x05start\x18\x04 \x01(\x05\x12\x0b\n\x03len\x18\x05 \x01(\x05\"l\n\x19\x45xt4TrimExtentFtraceEvent\x12\x11\n\tdev_major\x18\x01 \x01(\x05\x12\x11\n\tdev_minor\x18\x02 \x01(\x05\x12\r\n\x05group\x18\x03 \x01(\r\x12\r\n\x05start\x18\x04 \x01(\x05\x12\x0b\n\x03len\x18\x05 \x01(\x05\"H\n\x1c\x45xt4TruncateEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06\x62locks\x18\x03 \x01(\x04\"G\n\x1b\x45xt4TruncateExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06\x62locks\x18\x03 \x01(\x04\"T\n\x1a\x45xt4UnlinkEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06parent\x18\x03 \x01(\x04\x12\x0c\n\x04size\x18\x04 \x01(\x03\"B\n\x19\x45xt4UnlinkExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"^\n\x19\x45xt4WriteBeginFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"]\n\x17\x45xt4WriteEndFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0e\n\x06\x63opied\x18\x05 \x01(\r\"C\n\x18\x45xt4WritepageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\"\xe0\x01\n\x19\x45xt4WritepagesFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x13\n\x0bnr_to_write\x18\x03 \x01(\x03\x12\x15\n\rpages_skipped\x18\x04 \x01(\x03\x12\x13\n\x0brange_start\x18\x05 \x01(\x03\x12\x11\n\trange_end\x18\x06 \x01(\x03\x12\x17\n\x0fwriteback_index\x18\x07 \x01(\x04\x12\x11\n\tsync_mode\x18\x08 \x01(\x05\x12\x13\n\x0b\x66or_kupdate\x18\t \x01(\r\x12\x14\n\x0crange_cyclic\x18\n \x01(\r\"\xa2\x01\n\x1f\x45xt4WritepagesResultFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\x12\x15\n\rpages_written\x18\x04 \x01(\x05\x12\x15\n\rpages_skipped\x18\x05 \x01(\x03\x12\x17\n\x0fwriteback_index\x18\x06 \x01(\x04\x12\x11\n\tsync_mode\x18\x07 \x01(\x05\"_\n\x18\x45xt4ZeroRangeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06offset\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\x03\x12\x0c\n\x04mode\x18\x05 \x01(\x05\"d\n\x1a\x46\x32\x66sDoSubmitBioFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05\x62type\x18\x02 \x01(\x05\x12\x0c\n\x04sync\x18\x03 \x01(\r\x12\x0e\n\x06sector\x18\x04 \x01(\x04\x12\x0c\n\x04size\x18\x05 \x01(\r\"\x8e\x01\n\x19\x46\x32\x66sEvictInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pino\x18\x03 \x01(\x04\x12\x0c\n\x04mode\x18\x04 \x01(\r\x12\x0c\n\x04size\x18\x05 \x01(\x03\x12\r\n\x05nlink\x18\x06 \x01(\r\x12\x0e\n\x06\x62locks\x18\x07 \x01(\x04\x12\x0e\n\x06\x61\x64vise\x18\x08 \x01(\r\"\x8a\x01\n\x18\x46\x32\x66sFallocateFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04mode\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x03\x12\x0b\n\x03len\x18\x05 \x01(\x03\x12\x0c\n\x04size\x18\x06 \x01(\x03\x12\x0e\n\x06\x62locks\x18\x07 \x01(\x04\x12\x0b\n\x03ret\x18\x08 \x01(\x05\"w\n\x1b\x46\x32\x66sGetDataBlockFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0e\n\x06iblock\x18\x03 \x01(\x04\x12\x10\n\x08\x62h_start\x18\x04 \x01(\x04\x12\x0f\n\x07\x62h_size\x18\x05 \x01(\x04\x12\x0b\n\x03ret\x18\x06 \x01(\x05\"\xce\x01\n\x18\x46\x32\x66sGetVictimFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0c\n\x04type\x18\x02 \x01(\x05\x12\x0f\n\x07gc_type\x18\x03 \x01(\x05\x12\x12\n\nalloc_mode\x18\x04 \x01(\x05\x12\x0f\n\x07gc_mode\x18\x05 \x01(\x05\x12\x0e\n\x06victim\x18\x06 \x01(\r\x12\x10\n\x08ofs_unit\x18\x07 \x01(\r\x12\x12\n\npre_victim\x18\x08 \x01(\r\x12\x0f\n\x07prefree\x18\t \x01(\r\x12\x0c\n\x04\x66ree\x18\n \x01(\r\x12\x0c\n\x04\x63ost\x18\x0b \x01(\r\"\x88\x01\n\x13\x46\x32\x66sIgetFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pino\x18\x03 \x01(\x04\x12\x0c\n\x04mode\x18\x04 \x01(\r\x12\x0c\n\x04size\x18\x05 \x01(\x03\x12\r\n\x05nlink\x18\x06 \x01(\r\x12\x0e\n\x06\x62locks\x18\x07 \x01(\x04\x12\x0e\n\x06\x61\x64vise\x18\x08 \x01(\r\"@\n\x17\x46\x32\x66sIgetExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"@\n\x17\x46\x32\x66sNewInodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"\x8f\x01\n\x17\x46\x32\x66sReadpageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\x12\x0f\n\x07\x62lkaddr\x18\x04 \x01(\x04\x12\x0c\n\x04type\x18\x05 \x01(\x05\x12\x0b\n\x03\x64ir\x18\x06 \x01(\x05\x12\r\n\x05\x64irty\x18\x07 \x01(\x05\x12\x10\n\x08uptodate\x18\x08 \x01(\x05\"O\n\x1e\x46\x32\x66sReserveNewBlockFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03nid\x18\x02 \x01(\r\x12\x13\n\x0bofs_in_node\x18\x03 \x01(\r\"\x82\x01\n\x1b\x46\x32\x66sSetPageDirtyFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x0b\n\x03\x64ir\x18\x04 \x01(\x05\x12\r\n\x05index\x18\x05 \x01(\x04\x12\r\n\x05\x64irty\x18\x06 \x01(\x05\x12\x10\n\x08uptodate\x18\x07 \x01(\x05\"f\n\x1e\x46\x32\x66sSubmitWritePageFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\r\n\x05index\x18\x04 \x01(\x04\x12\r\n\x05\x62lock\x18\x05 \x01(\r\"\x91\x01\n\x1c\x46\x32\x66sSyncFileEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pino\x18\x03 \x01(\x04\x12\x0c\n\x04mode\x18\x04 \x01(\r\x12\x0c\n\x04size\x18\x05 \x01(\x03\x12\r\n\x05nlink\x18\x06 \x01(\r\x12\x0e\n\x06\x62locks\x18\x07 \x01(\x04\x12\x0e\n\x06\x61\x64vise\x18\x08 \x01(\r\"z\n\x1b\x46\x32\x66sSyncFileExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0f\n\x07need_cp\x18\x03 \x01(\r\x12\x10\n\x08\x64\x61tasync\x18\x04 \x01(\x05\x12\x0b\n\x03ret\x18\x05 \x01(\x05\x12\x11\n\tcp_reason\x18\x06 \x01(\x05\"A\n\x15\x46\x32\x66sSyncFsFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\r\n\x05\x64irty\x18\x02 \x01(\x05\x12\x0c\n\x04wait\x18\x03 \x01(\x05\"\x8c\x01\n\x17\x46\x32\x66sTruncateFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04pino\x18\x03 \x01(\x04\x12\x0c\n\x04mode\x18\x04 \x01(\r\x12\x0c\n\x04size\x18\x05 \x01(\x03\x12\r\n\x05nlink\x18\x06 \x01(\r\x12\x0e\n\x06\x62locks\x18\x07 \x01(\x04\x12\x0e\n\x06\x61\x64vise\x18\x08 \x01(\r\"j\n\"F2fsTruncateBlocksEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x03\x12\x0e\n\x06\x62locks\x18\x04 \x01(\x04\x12\x0c\n\x04\x66rom\x18\x05 \x01(\x04\"J\n!F2fsTruncateBlocksExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"j\n&F2fsTruncateDataBlocksRangeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03nid\x18\x03 \x01(\r\x12\x0b\n\x03ofs\x18\x04 \x01(\r\x12\x0c\n\x04\x66ree\x18\x05 \x01(\x05\"o\n\'F2fsTruncateInodeBlocksEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x03\x12\x0e\n\x06\x62locks\x18\x04 \x01(\x04\x12\x0c\n\x04\x66rom\x18\x05 \x01(\x04\"O\n&F2fsTruncateInodeBlocksExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"V\n\x1b\x46\x32\x66sTruncateNodeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03nid\x18\x03 \x01(\r\x12\x10\n\x08\x62lk_addr\x18\x04 \x01(\r\"\\\n!F2fsTruncateNodesEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03nid\x18\x03 \x01(\r\x12\x10\n\x08\x62lk_addr\x18\x04 \x01(\r\"I\n F2fsTruncateNodesExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"h\n#F2fsTruncatePartialNodesFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03nid\x18\x03 \x01(\r\x12\r\n\x05\x64\x65pth\x18\x04 \x01(\x05\x12\x0b\n\x03\x65rr\x18\x05 \x01(\x05\"b\n\x1a\x46\x32\x66sUnlinkEnterFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x03\x12\x0e\n\x06\x62locks\x18\x04 \x01(\x04\x12\x0c\n\x04name\x18\x05 \x01(\t\"B\n\x19\x46\x32\x66sUnlinkExitFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"\x83\x01\n\x1c\x46\x32\x66sVmPageMkwriteFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x0b\n\x03\x64ir\x18\x04 \x01(\x05\x12\r\n\x05index\x18\x05 \x01(\x04\x12\r\n\x05\x64irty\x18\x06 \x01(\x05\x12\x10\n\x08uptodate\x18\x07 \x01(\x05\"^\n\x19\x46\x32\x66sWriteBeginFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\"l\n\x1e\x46\x32\x66sWriteCheckpointFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x11\n\tis_umount\x18\x02 \x01(\r\x12\x0b\n\x03msg\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\x05\x12\r\n\x05phase\x18\x05 \x01(\r\"]\n\x17\x46\x32\x66sWriteEndFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ino\x18\x02 \x01(\x04\x12\x0b\n\x03pos\x18\x03 \x01(\x03\x12\x0b\n\x03len\x18\x04 \x01(\r\x12\x0e\n\x06\x63opied\x18\x05 \x01(\r\"\xa9\x03\n\x15\x46\x32\x66sIostatFtraceEvent\x12\x0f\n\x07\x61pp_bio\x18\x01 \x01(\x04\x12\x10\n\x08\x61pp_brio\x18\x02 \x01(\x04\x12\x0f\n\x07\x61pp_dio\x18\x03 \x01(\x04\x12\x10\n\x08\x61pp_drio\x18\x04 \x01(\x04\x12\x0f\n\x07\x61pp_mio\x18\x05 \x01(\x04\x12\x10\n\x08\x61pp_mrio\x18\x06 \x01(\x04\x12\x0f\n\x07\x61pp_rio\x18\x07 \x01(\x04\x12\x0f\n\x07\x61pp_wio\x18\x08 \x01(\x04\x12\x0b\n\x03\x64\x65v\x18\t \x01(\x04\x12\x10\n\x08\x66s_cdrio\x18\n \x01(\x04\x12\x11\n\tfs_cp_dio\x18\x0b \x01(\x04\x12\x11\n\tfs_cp_mio\x18\x0c \x01(\x04\x12\x11\n\tfs_cp_nio\x18\r \x01(\x04\x12\x0e\n\x06\x66s_dio\x18\x0e \x01(\x04\x12\x12\n\nfs_discard\x18\x0f \x01(\x04\x12\x0f\n\x07\x66s_drio\x18\x10 \x01(\x04\x12\x11\n\tfs_gc_dio\x18\x11 \x01(\x04\x12\x11\n\tfs_gc_nio\x18\x12 \x01(\x04\x12\x10\n\x08\x66s_gdrio\x18\x13 \x01(\x04\x12\x0e\n\x06\x66s_mio\x18\x14 \x01(\x04\x12\x0f\n\x07\x66s_mrio\x18\x15 \x01(\x04\x12\x0e\n\x06\x66s_nio\x18\x16 \x01(\x04\x12\x0f\n\x07\x66s_nrio\x18\x17 \x01(\x04\"\xc7\x04\n\x1c\x46\x32\x66sIostatLatencyFtraceEvent\x12\x10\n\x08\x64_rd_avg\x18\x01 \x01(\r\x12\x10\n\x08\x64_rd_cnt\x18\x02 \x01(\r\x12\x11\n\td_rd_peak\x18\x03 \x01(\r\x12\x13\n\x0b\x64_wr_as_avg\x18\x04 \x01(\r\x12\x13\n\x0b\x64_wr_as_cnt\x18\x05 \x01(\r\x12\x14\n\x0c\x64_wr_as_peak\x18\x06 \x01(\r\x12\x12\n\nd_wr_s_avg\x18\x07 \x01(\r\x12\x12\n\nd_wr_s_cnt\x18\x08 \x01(\r\x12\x13\n\x0b\x64_wr_s_peak\x18\t \x01(\r\x12\x0b\n\x03\x64\x65v\x18\n \x01(\x04\x12\x10\n\x08m_rd_avg\x18\x0b \x01(\r\x12\x10\n\x08m_rd_cnt\x18\x0c \x01(\r\x12\x11\n\tm_rd_peak\x18\r \x01(\r\x12\x13\n\x0bm_wr_as_avg\x18\x0e \x01(\r\x12\x13\n\x0bm_wr_as_cnt\x18\x0f \x01(\r\x12\x14\n\x0cm_wr_as_peak\x18\x10 \x01(\r\x12\x12\n\nm_wr_s_avg\x18\x11 \x01(\r\x12\x12\n\nm_wr_s_cnt\x18\x12 \x01(\r\x12\x13\n\x0bm_wr_s_peak\x18\x13 \x01(\r\x12\x10\n\x08n_rd_avg\x18\x14 \x01(\r\x12\x10\n\x08n_rd_cnt\x18\x15 \x01(\r\x12\x11\n\tn_rd_peak\x18\x16 \x01(\r\x12\x13\n\x0bn_wr_as_avg\x18\x17 \x01(\r\x12\x13\n\x0bn_wr_as_cnt\x18\x18 \x01(\r\x12\x14\n\x0cn_wr_as_peak\x18\x19 \x01(\r\x12\x12\n\nn_wr_s_avg\x18\x1a \x01(\r\x12\x12\n\nn_wr_s_cnt\x18\x1b \x01(\r\x12\x13\n\x0bn_wr_s_peak\x18\x1c \x01(\r\"Z\n\x1b\x46\x32\x66sBackgroundGcFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0f\n\x07wait_ms\x18\x02 \x01(\r\x12\x0f\n\x07prefree\x18\x03 \x01(\r\x12\x0c\n\x04\x66ree\x18\x04 \x01(\r\"\x8e\x02\n\x16\x46\x32\x66sGcBeginFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0c\n\x04sync\x18\x02 \x01(\r\x12\x12\n\nbackground\x18\x03 \x01(\r\x12\x13\n\x0b\x64irty_nodes\x18\x04 \x01(\x03\x12\x13\n\x0b\x64irty_dents\x18\x05 \x01(\x03\x12\x13\n\x0b\x64irty_imeta\x18\x06 \x01(\x03\x12\x10\n\x08\x66ree_sec\x18\x07 \x01(\r\x12\x10\n\x08\x66ree_seg\x18\x08 \x01(\r\x12\x14\n\x0creserved_seg\x18\t \x01(\x05\x12\x13\n\x0bprefree_seg\x18\n \x01(\r\x12\x0f\n\x07gc_type\x18\x0b \x01(\x05\x12\x10\n\x08no_bg_gc\x18\x0c \x01(\r\x12\x14\n\x0cnr_free_secs\x18\r \x01(\r\"\xe4\x01\n\x14\x46\x32\x66sGcEndFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0b\n\x03ret\x18\x02 \x01(\x05\x12\x11\n\tseg_freed\x18\x03 \x01(\x05\x12\x11\n\tsec_freed\x18\x04 \x01(\x05\x12\x13\n\x0b\x64irty_nodes\x18\x05 \x01(\x03\x12\x13\n\x0b\x64irty_dents\x18\x06 \x01(\x03\x12\x13\n\x0b\x64irty_imeta\x18\x07 \x01(\x03\x12\x10\n\x08\x66ree_sec\x18\x08 \x01(\r\x12\x10\n\x08\x66ree_seg\x18\t \x01(\r\x12\x14\n\x0creserved_seg\x18\n \x01(\x05\x12\x13\n\x0bprefree_seg\x18\x0b \x01(\r\"\x92\x02\n\x1e\x46\x32\x66sLockElapsedTimeFtraceEvent\x12\x0b\n\x03\x64\x65v\x18\x01 \x01(\x04\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\x12\x0b\n\x03pid\x18\x03 \x01(\x05\x12\x0c\n\x04prio\x18\x04 \x01(\x05\x12\x14\n\x0cioprio_class\x18\x05 \x01(\x05\x12\x13\n\x0bioprio_data\x18\x06 \x01(\x05\x12\x11\n\tlock_name\x18\x07 \x01(\r\x12\x10\n\x08is_write\x18\x08 \x01(\r\x12\x12\n\ntotal_time\x18\t \x01(\x04\x12\x14\n\x0crunning_time\x18\n \x01(\x04\x12\x15\n\rrunnable_time\x18\x0b \x01(\x04\x12\x15\n\rio_sleep_time\x18\x0c \x01(\x04\x12\x12\n\nother_time\x18\r \x01(\x04\"N\n\x19\x46\x61strpcDmaStatFtraceEvent\x12\x0b\n\x03\x63id\x18\x01 \x01(\x05\x12\x0b\n\x03len\x18\x02 \x01(\x03\x12\x17\n\x0ftotal_allocated\x18\x03 \x01(\x04\"D\n\x19\x46\x61strpcDmaFreeFtraceEvent\x12\x0b\n\x03\x63id\x18\x01 \x01(\x05\x12\x0c\n\x04phys\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x04\"c\n\x1a\x46\x61strpcDmaAllocFtraceEvent\x12\x0b\n\x03\x63id\x18\x01 \x01(\x05\x12\x0c\n\x04phys\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x04\x12\x0c\n\x04\x61ttr\x18\x04 \x01(\x04\x12\x0e\n\x06mflags\x18\x05 \x01(\x05\"E\n\x1a\x46\x61strpcDmaUnmapFtraceEvent\x12\x0b\n\x03\x63id\x18\x01 \x01(\x05\x12\x0c\n\x04phys\x18\x02 \x01(\x04\x12\x0c\n\x04size\x18\x03 \x01(\x04\"z\n\x18\x46\x61strpcDmaMapFtraceEvent\x12\x0b\n\x03\x63id\x18\x01 \x01(\x05\x12\n\n\x02\x66\x64\x18\x02 \x01(\x05\x12\x0c\n\x04phys\x18\x03 \x01(\x04\x12\x0c\n\x04size\x18\x04 \x01(\x04\x12\x0b\n\x03len\x18\x05 \x01(\x04\x12\x0c\n\x04\x61ttr\x18\x06 \x01(\r\x12\x0e\n\x06mflags\x18\x07 \x01(\x05\"X\n\x14\x46\x65nceInitFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"[\n\x17\x46\x65nceDestroyFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"`\n\x1c\x46\x65nceEnableSignalFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"\\\n\x18\x46\x65nceSignaledFtraceEvent\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\r\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05seqno\x18\x03 \x01(\r\x12\x10\n\x08timeline\x18\x04 \x01(\t\"l\n\"MmFilemapAddToPageCacheFtraceEvent\x12\x0b\n\x03pfn\x18\x01 \x01(\x04\x12\r\n\x05i_ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\x12\r\n\x05s_dev\x18\x04 \x01(\x04\x12\x0c\n\x04page\x18\x05 \x01(\x04\"q\n\'MmFilemapDeleteFromPageCacheFtraceEvent\x12\x0b\n\x03pfn\x18\x01 \x01(\x04\x12\r\n\x05i_ino\x18\x02 \x01(\x04\x12\r\n\x05index\x18\x03 \x01(\x04\x12\r\n\x05s_dev\x18\x04 \x01(\x04\x12\x0c\n\x04page\x18\x05 \x01(\x04\"E\n\x14\x44oSysOpenFtraceEvent\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\r\n\x05\x66lags\x18\x02 \x01(\x05\x12\x0c\n\x04mode\x18\x03 \x01(\x05\"\'\n\x13OpenExecFtraceEvent\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\"+\n\x10PrintFtraceEvent\x12\n\n\x02ip\x18\x01 \x01(\x04\x12\x0b\n\x03\x62uf\x18\x02 \x01(\t\"8\n\x19\x46uncgraphEntryFtraceEvent\x12\r\n\x05\x64\x65pth\x18\x01 \x01(\x05\x12\x0c\n\x04\x66unc\x18\x02 \x01(\x04\"k\n\x18\x46uncgraphExitFtraceEvent\x12\x10\n\x08\x63\x61lltime\x18\x01 \x01(\x04\x12\r\n\x05\x64\x65pth\x18\x02 \x01(\x05\x12\x0c\n\x04\x66unc\x18\x03 \x01(\x04\x12\x0f\n\x07overrun\x18\x04 \x01(\x04\x12\x0f\n\x07rettime\x18\x05 \x01(\x04\"t\n\x1e\x46wtpPerfettoCounterFtraceEvent\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x10\n\x08track_id\x18\x02 \x01(\r\x12\x10\n\x08\x63\x61tegory\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\r\"r\n\x1c\x46wtpPerfettoSliceFtraceEvent\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x10\n\x08track_id\x18\x02 \x01(\r\x12\x10\n\x08\x63\x61tegory\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\r\n\x05\x62\x65gin\x18\x05 \x01(\r\"X\n\x1eG2dTracingMarkWriteFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0c\n\x04type\x18\x05 \x01(\r\x12\r\n\x05value\x18\x06 \x01(\x05\"\xc2\x01\n\x12GenericFtraceEvent\x12\x12\n\nevent_name\x18\x01 \x01(\t\x12\x38\n\x05\x66ield\x18\x02 \x03(\x0b\x32).perfetto.protos.GenericFtraceEvent.Field\x1a^\n\x05\x46ield\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\tstr_value\x18\x03 \x01(\tH\x00\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x00\x12\x14\n\nuint_value\x18\x05 \x01(\x04H\x00\x42\x07\n\x05value\"\xbe\x01\n\x0bKprobeEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x35\n\x04type\x18\x02 \x01(\x0e\x32\'.perfetto.protos.KprobeEvent.KprobeType\"j\n\nKprobeType\x12\x17\n\x13KPROBE_TYPE_UNKNOWN\x10\x00\x12\x15\n\x11KPROBE_TYPE_BEGIN\x10\x01\x12\x13\n\x0fKPROBE_TYPE_END\x10\x02\x12\x17\n\x13KPROBE_TYPE_INSTANT\x10\x03\"=\n\x19GoogleIccEventFtraceEvent\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\"=\n\x19GoogleIrmEventFtraceEvent\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\"C\n\x16GpuMemTotalFtraceEvent\x12\x0e\n\x06gpu_id\x18\x01 \x01(\r\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x0c\n\x04size\x18\x03 \x01(\x04\"z\n\x16\x44rmSchedJobFtraceEvent\x12\x0e\n\x06\x65ntity\x18\x01 \x01(\x04\x12\r\n\x05\x66\x65nce\x18\x02 \x01(\x04\x12\x14\n\x0chw_job_count\x18\x03 \x01(\x05\x12\n\n\x02id\x18\x04 \x01(\x04\x12\x11\n\tjob_count\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\"x\n\x14\x44rmRunJobFtraceEvent\x12\x0e\n\x06\x65ntity\x18\x01 \x01(\x04\x12\r\n\x05\x66\x65nce\x18\x02 \x01(\x04\x12\x14\n\x0chw_job_count\x18\x03 \x01(\x05\x12\n\n\x02id\x18\x04 \x01(\x04\x12\x11\n\tjob_count\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\".\n\x1d\x44rmSchedProcessJobFtraceEvent\x12\r\n\x05\x66\x65nce\x18\x01 \x01(\x04\"f\n\x1c\x44rmSchedJobAddDepFtraceEvent\x12\x15\n\rfence_context\x18\x01 \x01(\x04\x12\x13\n\x0b\x66\x65nce_seqno\x18\x02 \x01(\x04\x12\x0b\n\x03\x63tx\x18\x03 \x01(\x04\x12\r\n\x05seqno\x18\x04 \x01(\x04\"H\n\x1a\x44rmSchedJobDoneFtraceEvent\x12\x15\n\rfence_context\x18\x01 \x01(\x04\x12\x13\n\x0b\x66\x65nce_seqno\x18\x02 \x01(\x04\"\xa0\x01\n\x1b\x44rmSchedJobQueueFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tjob_count\x18\x02 \x01(\r\x12\x14\n\x0chw_job_count\x18\x03 \x01(\x05\x12\x0b\n\x03\x64\x65v\x18\x04 \x01(\t\x12\x15\n\rfence_context\x18\x05 \x01(\x04\x12\x13\n\x0b\x66\x65nce_seqno\x18\x06 \x01(\x04\x12\x11\n\tclient_id\x18\x07 \x01(\x04\"\x9e\x01\n\x19\x44rmSchedJobRunFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tjob_count\x18\x02 \x01(\r\x12\x14\n\x0chw_job_count\x18\x03 \x01(\x05\x12\x0b\n\x03\x64\x65v\x18\x04 \x01(\t\x12\x15\n\rfence_context\x18\x05 \x01(\x04\x12\x13\n\x0b\x66\x65nce_seqno\x18\x06 \x01(\x04\x12\x11\n\tclient_id\x18\x07 \x01(\x04\"m\n#DrmSchedJobUnschedulableFtraceEvent\x12\x15\n\rfence_context\x18\x01 \x01(\x04\x12\x13\n\x0b\x66\x65nce_seqno\x18\x02 \x01(\x04\x12\x0b\n\x03\x63tx\x18\x03 \x01(\x04\x12\r\n\x05seqno\x18\x04 \x01(\x04\"\x15\n\x13HypEnterFtraceEvent\"\x14\n\x12HypExitFtraceEvent\"3\n\x14HostHcallFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x0f\n\x07invalid\x18\x02 \x01(\r\"3\n\x12HostSmcFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x11\n\tforwarded\x18\x02 \x01(\r\"4\n\x17HostMemAbortFtraceEvent\x12\x0b\n\x03\x65sr\x18\x01 \x01(\x04\x12\x0c\n\x04\x61\x64\x64r\x18\x02 \x01(\x04\"\x87\x01\n\x16HostFfaCallFtraceEvent\x12\x0f\n\x07\x66unc_id\x18\x01 \x01(\x04\x12\x0e\n\x06res_a1\x18\x02 \x01(\x04\x12\x0e\n\x06res_a2\x18\x03 \x01(\x04\x12\x0e\n\x06res_a3\x18\x04 \x01(\x04\x12\x0e\n\x06res_a4\x18\x05 \x01(\x04\x12\x0f\n\x07handled\x18\x06 \x01(\x05\x12\x0b\n\x03\x65rr\x18\x07 \x01(\x05\"?\n\x15IommuIdmapFtraceEvent\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x04\x12\n\n\x02to\x18\x02 \x01(\x04\x12\x0c\n\x04prot\x18\x03 \x01(\x05\"7\n\x19PsciMemProtectFtraceEvent\x12\r\n\x05\x63ount\x18\x01 \x01(\x04\x12\x0b\n\x03was\x18\x02 \x01(\x04\"=\n\x1eHypervisorHostHcallFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x0f\n\x07invalid\x18\x02 \x01(\r\"=\n\x1cHypervisorHostSmcFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x11\n\tforwarded\x18\x02 \x01(\r\"\x1e\n\x1cHypervisorHypExitFtraceEvent\"I\n\x1fHypervisorIommuIdmapFtraceEvent\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x04\x12\n\n\x02to\x18\x02 \x01(\x04\x12\x0c\n\x04prot\x18\x03 \x01(\x05\"A\n#HypervisorPsciMemProtectFtraceEvent\x12\r\n\x05\x63ount\x18\x01 \x01(\x04\x12\x0b\n\x03was\x18\x02 \x01(\x04\">\n!HypervisorHostMemAbortFtraceEvent\x12\x0b\n\x03\x65sr\x18\x01 \x01(\x04\x12\x0c\n\x04\x61\x64\x64r\x18\x02 \x01(\x04\"\x1f\n\x1dHypervisorHypEnterFtraceEvent\"6\n\'HypervisorIommuIdmapCompleteFtraceEvent\x12\x0b\n\x03map\x18\x01 \x01(\r\"3\n$HypervisorVcpuIllegalTrapFtraceEvent\x12\x0b\n\x03\x65sr\x18\x01 \x01(\x04\"b\n\x12I2cReadFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0e\n\x06msg_nr\x18\x02 \x01(\r\x12\x0c\n\x04\x61\x64\x64r\x18\x03 \x01(\r\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\"p\n\x13I2cWriteFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0e\n\x06msg_nr\x18\x02 \x01(\r\x12\x0c\n\x04\x61\x64\x64r\x18\x03 \x01(\r\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\x12\x0b\n\x03\x62uf\x18\x07 \x01(\x0c\"H\n\x14I2cResultFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0f\n\x07nr_msgs\x18\x02 \x01(\r\x12\x0b\n\x03ret\x18\x03 \x01(\x05\"p\n\x13I2cReplyFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0e\n\x06msg_nr\x18\x02 \x01(\r\x12\x0c\n\x04\x61\x64\x64r\x18\x03 \x01(\r\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\x12\x0b\n\x03\x62uf\x18\x07 \x01(\x0c\"j\n\x14SmbusReadFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\x0c\n\x04\x61\x64\x64r\x18\x03 \x01(\r\x12\x0f\n\x07\x63ommand\x18\x04 \x01(\r\x12\x10\n\x08protocol\x18\x05 \x01(\r\"x\n\x15SmbusWriteFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0c\n\x04\x61\x64\x64r\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x0f\n\x07\x63ommand\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\x12\x10\n\x08protocol\x18\x06 \x01(\r\"\x8d\x01\n\x16SmbusResultFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0c\n\x04\x61\x64\x64r\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x12\n\nread_write\x18\x04 \x01(\r\x12\x0f\n\x07\x63ommand\x18\x05 \x01(\r\x12\x0b\n\x03res\x18\x06 \x01(\x05\x12\x10\n\x08protocol\x18\x07 \x01(\r\"x\n\x15SmbusReplyFtraceEvent\x12\x12\n\nadapter_nr\x18\x01 \x01(\x05\x12\x0c\n\x04\x61\x64\x64r\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x0f\n\x07\x63ommand\x18\x04 \x01(\r\x12\x0b\n\x03len\x18\x05 \x01(\r\x12\x10\n\x08protocol\x18\x06 \x01(\r\"M\n\x12IonStatFtraceEvent\x12\x11\n\tbuffer_id\x18\x01 \x01(\r\x12\x0b\n\x03len\x18\x02 \x01(\x03\x12\x17\n\x0ftotal_allocated\x18\x03 \x01(\x04\"%\n\x13IpiEntryFtraceEvent\x12\x0e\n\x06reason\x18\x01 \x01(\t\"$\n\x12IpiExitFtraceEvent\x12\x0e\n\x06reason\x18\x01 \x01(\t\":\n\x13IpiRaiseFtraceEvent\x12\x13\n\x0btarget_cpus\x18\x01 \x01(\r\x12\x0e\n\x06reason\x18\x02 \x01(\t\"&\n\x17SoftirqEntryFtraceEvent\x12\x0b\n\x03vec\x18\x01 \x01(\r\"%\n\x16SoftirqExitFtraceEvent\x12\x0b\n\x03vec\x18\x01 \x01(\r\"&\n\x17SoftirqRaiseFtraceEvent\x12\x0b\n\x03vec\x18\x01 \x01(\r\"H\n\x1aIrqHandlerEntryFtraceEvent\x12\x0b\n\x03irq\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07handler\x18\x03 \x01(\r\"5\n\x19IrqHandlerExitFtraceEvent\x12\x0b\n\x03irq\x18\x01 \x01(\x05\x12\x0b\n\x03ret\x18\x02 \x01(\x05\",\n\x1aLocalTimerEntryFtraceEvent\x12\x0e\n\x06vector\x18\x01 \x01(\x05\"+\n\x19LocalTimerExitFtraceEvent\x12\x0e\n\x06vector\x18\x01 \x01(\x05\"?\n\x1bKgslGpuFrequencyFtraceEvent\x12\x10\n\x08gpu_freq\x18\x01 \x01(\r\x12\x0e\n\x06gpu_id\x18\x02 \x01(\r\"q\n#KgslAdrenoCmdbatchQueuedFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\r\x12\x0e\n\x06queued\x18\x03 \x01(\r\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0c\n\x04prio\x18\x05 \x01(\r\"\xf9\x01\n&KgslAdrenoCmdbatchSubmittedFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\r\x12\x10\n\x08inflight\x18\x03 \x01(\x03\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\r\n\x05ticks\x18\x05 \x01(\x04\x12\x0c\n\x04secs\x18\x06 \x01(\x04\x12\r\n\x05usecs\x18\x07 \x01(\x04\x12\x0c\n\x04prio\x18\x08 \x01(\x05\x12\r\n\x05rb_id\x18\t \x01(\x05\x12\x0c\n\x04rptr\x18\n \x01(\r\x12\x0c\n\x04wptr\x18\x0b \x01(\r\x12\x12\n\nq_inflight\x18\x0c \x01(\x05\x12\x16\n\x0e\x64ispatch_queue\x18\r \x01(\x05\"_\n!KgslAdrenoCmdbatchSyncFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\r\x12\r\n\x05ticks\x18\x03 \x01(\x04\x12\x0c\n\x04prio\x18\x04 \x01(\x05\"\xd5\x02\n$KgslAdrenoCmdbatchRetiredFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\r\x12\x10\n\x08inflight\x18\x03 \x01(\x03\x12\x10\n\x08recovery\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\x12\r\n\x05start\x18\x06 \x01(\x04\x12\x0e\n\x06retire\x18\x07 \x01(\x04\x12\x0c\n\x04prio\x18\x08 \x01(\x05\x12\r\n\x05rb_id\x18\t \x01(\x05\x12\x0c\n\x04rptr\x18\n \x01(\r\x12\x0c\n\x04wptr\x18\x0b \x01(\r\x12\x12\n\nq_inflight\x18\x0c \x01(\x05\x12\x16\n\x0e\x66\x61ult_recovery\x18\r \x01(\x04\x12\x16\n\x0e\x64ispatch_queue\x18\x0e \x01(\r\x12\x17\n\x0fsubmitted_to_rb\x18\x0f \x01(\x04\x12\x16\n\x0eretired_on_gmu\x18\x10 \x01(\x04\x12\x0e\n\x06\x61\x63tive\x18\x11 \x01(\x04\"A\n\x1d\x41llocPagesIommuEndFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"B\n\x1e\x41llocPagesIommuFailFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"C\n\x1f\x41llocPagesIommuStartFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"?\n\x1b\x41llocPagesSysEndFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"@\n\x1c\x41llocPagesSysFailFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"A\n\x1d\x41llocPagesSysStartFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\r\n\x05order\x18\x02 \x01(\r\"3\n\"DmaAllocContiguousRetryFtraceEvent\x12\r\n\x05tries\x18\x01 \x01(\x05\"S\n\x18IommuMapRangeFtraceEvent\x12\x12\n\nchunk_size\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\n\n\x02pa\x18\x03 \x01(\x04\x12\n\n\x02va\x18\x04 \x01(\x04\"f\n\"IommuSecPtblMapRangeEndFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\x04\x12\x0b\n\x03num\x18\x02 \x01(\x05\x12\n\n\x02pa\x18\x03 \x01(\r\x12\x0e\n\x06sec_id\x18\x04 \x01(\x05\x12\n\n\x02va\x18\x05 \x01(\x04\"h\n$IommuSecPtblMapRangeStartFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\x04\x12\x0b\n\x03num\x18\x02 \x01(\x05\x12\n\n\x02pa\x18\x03 \x01(\r\x12\x0e\n\x06sec_id\x18\x04 \x01(\x05\x12\n\n\x02va\x18\x05 \x01(\x04\"p\n\x1cIonAllocBufferEndFtraceEvent\x12\x13\n\x0b\x63lient_name\x18\x01 \x01(\t\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\x12\x0c\n\x04mask\x18\x05 \x01(\r\"\x80\x01\n\x1dIonAllocBufferFailFtraceEvent\x12\x13\n\x0b\x63lient_name\x18\x01 \x01(\t\x12\r\n\x05\x65rror\x18\x02 \x01(\x03\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x11\n\theap_name\x18\x04 \x01(\t\x12\x0b\n\x03len\x18\x05 \x01(\x04\x12\x0c\n\x04mask\x18\x06 \x01(\r\"\x84\x01\n!IonAllocBufferFallbackFtraceEvent\x12\x13\n\x0b\x63lient_name\x18\x01 \x01(\t\x12\r\n\x05\x65rror\x18\x02 \x01(\x03\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\x11\n\theap_name\x18\x04 \x01(\t\x12\x0b\n\x03len\x18\x05 \x01(\x04\x12\x0c\n\x04mask\x18\x06 \x01(\r\"r\n\x1eIonAllocBufferStartFtraceEvent\x12\x13\n\x0b\x63lient_name\x18\x01 \x01(\t\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\x12\x0c\n\x04mask\x18\x05 \x01(\r\"+\n\x1aIonCpAllocRetryFtraceEvent\x12\r\n\x05tries\x18\x01 \x01(\x05\"_\n\x1fIonCpSecureBufferEndFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\x04\x12\r\n\x05\x66lags\x18\x02 \x01(\x04\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\"a\n!IonCpSecureBufferStartFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\x04\x12\r\n\x05\x66lags\x18\x02 \x01(\x04\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\"(\n\x19IonPrefetchingFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\x04\"[\n#IonSecureCmaAddToPoolEndFtraceEvent\x12\x13\n\x0bis_prefetch\x18\x01 \x01(\r\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\x12\n\npool_total\x18\x03 \x01(\x05\"]\n%IonSecureCmaAddToPoolStartFtraceEvent\x12\x13\n\x0bis_prefetch\x18\x01 \x01(\r\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\x12\n\npool_total\x18\x03 \x01(\x05\"b\n\"IonSecureCmaAllocateEndFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\x04\x12\r\n\x05\x66lags\x18\x02 \x01(\x04\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\"d\n$IonSecureCmaAllocateStartFtraceEvent\x12\r\n\x05\x61lign\x18\x01 \x01(\x04\x12\r\n\x05\x66lags\x18\x02 \x01(\x04\x12\x11\n\theap_name\x18\x03 \x01(\t\x12\x0b\n\x03len\x18\x04 \x01(\x04\"R\n$IonSecureCmaShrinkPoolEndFtraceEvent\x12\x14\n\x0c\x64rained_size\x18\x01 \x01(\x04\x12\x14\n\x0cskipped_size\x18\x02 \x01(\x04\"T\n&IonSecureCmaShrinkPoolStartFtraceEvent\x12\x14\n\x0c\x64rained_size\x18\x01 \x01(\x04\x12\x14\n\x0cskipped_size\x18\x02 \x01(\x04\"2\n\x10KfreeFtraceEvent\x12\x11\n\tcall_site\x18\x01 \x01(\x04\x12\x0b\n\x03ptr\x18\x02 \x01(\x04\"o\n\x12KmallocFtraceEvent\x12\x13\n\x0b\x62ytes_alloc\x18\x01 \x01(\x04\x12\x11\n\tbytes_req\x18\x02 \x01(\x04\x12\x11\n\tcall_site\x18\x03 \x01(\x04\x12\x11\n\tgfp_flags\x18\x04 \x01(\r\x12\x0b\n\x03ptr\x18\x05 \x01(\x04\"\x81\x01\n\x16KmallocNodeFtraceEvent\x12\x13\n\x0b\x62ytes_alloc\x18\x01 \x01(\x04\x12\x11\n\tbytes_req\x18\x02 \x01(\x04\x12\x11\n\tcall_site\x18\x03 \x01(\x04\x12\x11\n\tgfp_flags\x18\x04 \x01(\r\x12\x0c\n\x04node\x18\x05 \x01(\x05\x12\x0b\n\x03ptr\x18\x06 \x01(\x04\"v\n\x19KmemCacheAllocFtraceEvent\x12\x13\n\x0b\x62ytes_alloc\x18\x01 \x01(\x04\x12\x11\n\tbytes_req\x18\x02 \x01(\x04\x12\x11\n\tcall_site\x18\x03 \x01(\x04\x12\x11\n\tgfp_flags\x18\x04 \x01(\r\x12\x0b\n\x03ptr\x18\x05 \x01(\x04\"\x88\x01\n\x1dKmemCacheAllocNodeFtraceEvent\x12\x13\n\x0b\x62ytes_alloc\x18\x01 \x01(\x04\x12\x11\n\tbytes_req\x18\x02 \x01(\x04\x12\x11\n\tcall_site\x18\x03 \x01(\x04\x12\x11\n\tgfp_flags\x18\x04 \x01(\r\x12\x0c\n\x04node\x18\x05 \x01(\x05\x12\x0b\n\x03ptr\x18\x06 \x01(\x04\":\n\x18KmemCacheFreeFtraceEvent\x12\x11\n\tcall_site\x18\x01 \x01(\x04\x12\x0b\n\x03ptr\x18\x02 \x01(\x04\"*\n\x1aMigratePagesEndFtraceEvent\x12\x0c\n\x04mode\x18\x01 \x01(\x05\",\n\x1cMigratePagesStartFtraceEvent\x12\x0c\n\x04mode\x18\x01 \x01(\x05\"(\n\x17MigrateRetryFtraceEvent\x12\r\n\x05tries\x18\x01 \x01(\x05\"j\n\x16MmPageAllocFtraceEvent\x12\x11\n\tgfp_flags\x18\x01 \x01(\r\x12\x13\n\x0bmigratetype\x18\x02 \x01(\x05\x12\r\n\x05order\x18\x03 \x01(\r\x12\x0c\n\x04page\x18\x04 \x01(\x04\x12\x0b\n\x03pfn\x18\x05 \x01(\x04\"\xba\x01\n\x1dMmPageAllocExtfragFtraceEvent\x12\x19\n\x11\x61lloc_migratetype\x18\x01 \x01(\x05\x12\x13\n\x0b\x61lloc_order\x18\x02 \x01(\x05\x12\x1c\n\x14\x66\x61llback_migratetype\x18\x03 \x01(\x05\x12\x16\n\x0e\x66\x61llback_order\x18\x04 \x01(\x05\x12\x0c\n\x04page\x18\x05 \x01(\x04\x12\x18\n\x10\x63hange_ownership\x18\x06 \x01(\x05\x12\x0b\n\x03pfn\x18\x07 \x01(\x04\"a\n MmPageAllocZoneLockedFtraceEvent\x12\x13\n\x0bmigratetype\x18\x01 \x01(\x05\x12\r\n\x05order\x18\x02 \x01(\r\x12\x0c\n\x04page\x18\x03 \x01(\x04\x12\x0b\n\x03pfn\x18\x04 \x01(\x04\"A\n\x15MmPageFreeFtraceEvent\x12\r\n\x05order\x18\x01 \x01(\r\x12\x0c\n\x04page\x18\x02 \x01(\x04\x12\x0b\n\x03pfn\x18\x03 \x01(\x04\"G\n\x1cMmPageFreeBatchedFtraceEvent\x12\x0c\n\x04\x63old\x18\x01 \x01(\x05\x12\x0c\n\x04page\x18\x02 \x01(\x04\x12\x0b\n\x03pfn\x18\x03 \x01(\x04\"[\n\x1aMmPagePcpuDrainFtraceEvent\x12\x13\n\x0bmigratetype\x18\x01 \x01(\x05\x12\r\n\x05order\x18\x02 \x01(\r\x12\x0c\n\x04page\x18\x03 \x01(\x04\x12\x0b\n\x03pfn\x18\x04 \x01(\x04\"O\n\x12RssStatFtraceEvent\x12\x0e\n\x06member\x18\x01 \x01(\x05\x12\x0c\n\x04size\x18\x02 \x01(\x03\x12\x0c\n\x04\x63urr\x18\x03 \x01(\r\x12\r\n\x05mm_id\x18\x04 \x01(\r\"S\n\x18IonHeapShrinkFtraceEvent\x12\x11\n\theap_name\x18\x01 \x01(\t\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\x17\n\x0ftotal_allocated\x18\x03 \x01(\x03\"Q\n\x16IonHeapGrowFtraceEvent\x12\x11\n\theap_name\x18\x01 \x01(\t\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\x17\n\x0ftotal_allocated\x18\x03 \x01(\x03\"7\n\x1aIonBufferCreateFtraceEvent\x12\x0c\n\x04\x61\x64\x64r\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\x04\"8\n\x1bIonBufferDestroyFtraceEvent\x12\x0c\n\x04\x61\x64\x64r\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\x04\"\x99\x01\n(MmAllocContigMigrateRangeInfoFtraceEvent\x12\r\n\x05start\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\x12\x13\n\x0bnr_migrated\x18\x03 \x01(\x04\x12\x14\n\x0cnr_reclaimed\x18\x04 \x01(\x04\x12\x11\n\tnr_mapped\x18\x05 \x01(\x04\x12\x13\n\x0bmigratetype\x18\x06 \x01(\x05\"I\n\x18\x44mabufRssStatFtraceEvent\x12\x0b\n\x03rss\x18\x01 \x01(\x04\x12\x11\n\trss_delta\x18\x02 \x01(\x03\x12\r\n\x05i_ino\x18\x03 \x01(\x04\"(\n\x19KvmAccessFaultFtraceEvent\x12\x0b\n\x03ipa\x18\x01 \x01(\x04\"4\n\x14KvmAckIrqFtraceEvent\x12\x0f\n\x07irqchip\x18\x01 \x01(\r\x12\x0b\n\x03pin\x18\x02 \x01(\r\"2\n\x14KvmAgeHvaFtraceEvent\x12\x0b\n\x03\x65nd\x18\x01 \x01(\x04\x12\r\n\x05start\x18\x02 \x01(\x04\"T\n\x15KvmAgePageFtraceEvent\x12\x0b\n\x03gfn\x18\x01 \x01(\x04\x12\x0b\n\x03hva\x18\x02 \x01(\x04\x12\r\n\x05level\x18\x03 \x01(\r\x12\x12\n\nreferenced\x18\x04 \x01(\r\"2\n\x1bKvmArmClearDebugFtraceEvent\x12\x13\n\x0bguest_debug\x18\x01 \x01(\r\"9\n\x1aKvmArmSetDreg32FtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r\"7\n\x1aKvmArmSetRegsetFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\"@\n\x1bKvmArmSetupDebugFtraceEvent\x12\x13\n\x0bguest_debug\x18\x01 \x01(\r\x12\x0c\n\x04vcpu\x18\x02 \x01(\x04\"&\n\x13KvmEntryFtraceEvent\x12\x0f\n\x07vcpu_pc\x18\x01 \x01(\x04\"B\n\x12KvmExitFtraceEvent\x12\x0e\n\x06\x65sr_ec\x18\x01 \x01(\r\x12\x0b\n\x03ret\x18\x02 \x01(\x05\x12\x0f\n\x07vcpu_pc\x18\x03 \x01(\x04\"!\n\x11KvmFpuFtraceEvent\x12\x0c\n\x04load\x18\x01 \x01(\r\"o\n\x19KvmGetTimerMapFtraceEvent\x12\x15\n\rdirect_ptimer\x18\x01 \x01(\x05\x12\x15\n\rdirect_vtimer\x18\x02 \x01(\x05\x12\x13\n\x0b\x65mul_ptimer\x18\x03 \x01(\x05\x12\x0f\n\x07vcpu_id\x18\x04 \x01(\x04\"T\n\x18KvmGuestFaultFtraceEvent\x12\x0b\n\x03hsr\x18\x01 \x01(\x04\x12\r\n\x05hxfar\x18\x02 \x01(\x04\x12\x0b\n\x03ipa\x18\x03 \x01(\x04\x12\x0f\n\x07vcpu_pc\x18\x04 \x01(\x04\")\n\x1aKvmHandleSysRegFtraceEvent\x12\x0b\n\x03hsr\x18\x01 \x01(\x04\"B\n\x16KvmHvcArm64FtraceEvent\x12\x0b\n\x03imm\x18\x01 \x01(\x04\x12\n\n\x02r0\x18\x02 \x01(\x04\x12\x0f\n\x07vcpu_pc\x18\x03 \x01(\x04\"W\n\x15KvmIrqLineFtraceEvent\x12\x0f\n\x07irq_num\x18\x01 \x01(\x05\x12\r\n\x05level\x18\x02 \x01(\x05\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\x10\n\x08vcpu_idx\x18\x04 \x01(\x05\"I\n\x12KvmMmioFtraceEvent\x12\x0b\n\x03gpa\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\r\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\x0b\n\x03val\x18\x04 \x01(\x04\"I\n\x19KvmMmioEmulateFtraceEvent\x12\x0c\n\x04\x63psr\x18\x01 \x01(\x04\x12\r\n\x05instr\x18\x02 \x01(\x04\x12\x0f\n\x07vcpu_pc\x18\x03 \x01(\x04\"@\n\x1bKvmSetGuestDebugFtraceEvent\x12\x13\n\x0bguest_debug\x18\x01 \x01(\r\x12\x0c\n\x04vcpu\x18\x02 \x01(\x04\"I\n\x14KvmSetIrqFtraceEvent\x12\x0b\n\x03gsi\x18\x01 \x01(\r\x12\x15\n\rirq_source_id\x18\x02 \x01(\x05\x12\r\n\x05level\x18\x03 \x01(\x05\"\'\n\x18KvmSetSpteHvaFtraceEvent\x12\x0b\n\x03hva\x18\x01 \x01(\x04\";\n\x19KvmSetWayFlushFtraceEvent\x12\r\n\x05\x63\x61\x63he\x18\x01 \x01(\r\x12\x0f\n\x07vcpu_pc\x18\x02 \x01(\x04\"\x8b\x01\n\x17KvmSysAccessFtraceEvent\x12\x0b\n\x03\x43Rm\x18\x01 \x01(\r\x12\x0b\n\x03\x43Rn\x18\x02 \x01(\r\x12\x0b\n\x03Op0\x18\x03 \x01(\r\x12\x0b\n\x03Op1\x18\x04 \x01(\r\x12\x0b\n\x03Op2\x18\x05 \x01(\r\x12\x10\n\x08is_write\x18\x06 \x01(\r\x12\x0c\n\x04name\x18\x07 \x01(\t\x12\x0f\n\x07vcpu_pc\x18\x08 \x01(\x04\"\'\n\x18KvmTestAgeHvaFtraceEvent\x12\x0b\n\x03hva\x18\x01 \x01(\x04\"D\n\x1aKvmTimerEmulateFtraceEvent\x12\x13\n\x0bshould_fire\x18\x01 \x01(\r\x12\x11\n\ttimer_idx\x18\x02 \x01(\x05\"5\n KvmTimerHrtimerExpireFtraceEvent\x12\x11\n\ttimer_idx\x18\x01 \x01(\x05\"O\n\x1fKvmTimerRestoreStateFtraceEvent\x12\x0b\n\x03\x63tl\x18\x01 \x01(\x04\x12\x0c\n\x04\x63val\x18\x02 \x01(\x04\x12\x11\n\ttimer_idx\x18\x03 \x01(\x05\"L\n\x1cKvmTimerSaveStateFtraceEvent\x12\x0b\n\x03\x63tl\x18\x01 \x01(\x04\x12\x0c\n\x04\x63val\x18\x02 \x01(\x04\x12\x11\n\ttimer_idx\x18\x03 \x01(\x05\"K\n\x1cKvmTimerUpdateIrqFtraceEvent\x12\x0b\n\x03irq\x18\x01 \x01(\r\x12\r\n\x05level\x18\x02 \x01(\x05\x12\x0f\n\x07vcpu_id\x18\x03 \x01(\x04\"F\n\x19KvmToggleCacheFtraceEvent\x12\x0b\n\x03now\x18\x01 \x01(\r\x12\x0f\n\x07vcpu_pc\x18\x02 \x01(\x04\x12\x0b\n\x03was\x18\x03 \x01(\r\"9\n\x1bKvmUnmapHvaRangeFtraceEvent\x12\x0b\n\x03\x65nd\x18\x01 \x01(\x04\x12\r\n\x05start\x18\x02 \x01(\x04\"-\n\x1bKvmUserspaceExitFtraceEvent\x12\x0e\n\x06reason\x18\x01 \x01(\r\"E\n\x18KvmVcpuWakeupFtraceEvent\x12\n\n\x02ns\x18\x01 \x01(\x04\x12\r\n\x05valid\x18\x02 \x01(\r\x12\x0e\n\x06waited\x18\x03 \x01(\r\"9\n\x16KvmWfxArm64FtraceEvent\x12\x0e\n\x06is_wfe\x18\x01 \x01(\r\x12\x0f\n\x07vcpu_pc\x18\x02 \x01(\x04\"T\n\x12TrapRegFtraceEvent\x12\n\n\x02\x66n\x18\x01 \x01(\t\x12\x10\n\x08is_write\x18\x02 \x01(\r\x12\x0b\n\x03reg\x18\x03 \x01(\x05\x12\x13\n\x0bwrite_value\x18\x04 \x01(\x04\"N\n\x1fVgicUpdateIrqPendingFtraceEvent\x12\x0b\n\x03irq\x18\x01 \x01(\r\x12\r\n\x05level\x18\x02 \x01(\r\x12\x0f\n\x07vcpu_id\x18\x03 \x01(\x04\"t\n\x18LowmemoryKillFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x16\n\x0epagecache_size\x18\x03 \x01(\x03\x12\x17\n\x0fpagecache_limit\x18\x04 \x01(\x03\x12\x0c\n\x04\x66ree\x18\x05 \x01(\x03\"q\n\x1fLwisTracingMarkWriteFtraceEvent\x12\x11\n\tlwis_name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\r\x12\x0b\n\x03pid\x18\x03 \x01(\x05\x12\x11\n\tfunc_name\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\x03\"Y\n\x1fMaliTracingMarkWriteFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\r\n\x05value\x18\x04 \x01(\x05\"u\n\x1dMaliMaliKCPUCQSSETFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\tinfo_val1\x18\x02 \x01(\x04\x12\x11\n\tinfo_val2\x18\x03 \x01(\x04\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\x11\n\tkctx_tgid\x18\x05 \x01(\x05\"{\n#MaliMaliKCPUCQSWAITSTARTFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\tinfo_val1\x18\x02 \x01(\x04\x12\x11\n\tinfo_val2\x18\x03 \x01(\x04\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\x11\n\tkctx_tgid\x18\x05 \x01(\x05\"y\n!MaliMaliKCPUCQSWAITENDFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\r\x12\x11\n\tinfo_val1\x18\x02 \x01(\x04\x12\x11\n\tinfo_val2\x18\x03 \x01(\x04\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\x11\n\tkctx_tgid\x18\x05 \x01(\x05\"z\n\"MaliMaliKCPUFENCESIGNALFtraceEvent\x12\x11\n\tinfo_val1\x18\x01 \x01(\x04\x12\x11\n\tinfo_val2\x18\x02 \x01(\x04\x12\x11\n\tkctx_tgid\x18\x03 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\n\n\x02id\x18\x05 \x01(\r\"}\n%MaliMaliKCPUFENCEWAITSTARTFtraceEvent\x12\x11\n\tinfo_val1\x18\x01 \x01(\x04\x12\x11\n\tinfo_val2\x18\x02 \x01(\x04\x12\x11\n\tkctx_tgid\x18\x03 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\n\n\x02id\x18\x05 \x01(\r\"{\n#MaliMaliKCPUFENCEWAITENDFtraceEvent\x12\x11\n\tinfo_val1\x18\x01 \x01(\x04\x12\x11\n\tinfo_val2\x18\x02 \x01(\x04\x12\x11\n\tkctx_tgid\x18\x03 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x04 \x01(\r\x12\n\n\x02id\x18\x05 \x01(\r\"\\\n$MaliMaliCSFINTERRUPTSTARTFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"Z\n\"MaliMaliCSFINTERRUPTENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"l\n4MaliMaliPMMCUHCTLCORESDOWNSCALENOTIFYPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"c\n+MaliMaliPMMCUHCTLCORESNOTIFYPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"d\n,MaliMaliPMMCUHCTLCOREINACTIVEPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"`\n(MaliMaliPMMCUHCTLMCUONRECHECKFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"f\n.MaliMaliPMMCUHCTLSHADERSCOREOFFPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"b\n*MaliMaliPMMCUHCTLSHADERSPENDOFFFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"a\n)MaliMaliPMMCUHCTLSHADERSPENDONFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"c\n+MaliMaliPMMCUHCTLSHADERSREADYOFFFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"W\n\x1fMaliMaliPMMCUINSLEEPFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"S\n\x1bMaliMaliPMMCUOFFFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"R\n\x1aMaliMaliPMMCUONFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"d\n,MaliMaliPMMCUONCOREATTRUPDATEPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"_\n\'MaliMaliPMMCUONGLBREINITPENDFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"V\n\x1eMaliMaliPMMCUONHALTFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"^\n&MaliMaliPMMCUONHWCNTDISABLEFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"]\n%MaliMaliPMMCUONHWCNTENABLEFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"Z\n\"MaliMaliPMMCUONPENDHALTFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"[\n#MaliMaliPMMCUONPENDSLEEPFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"_\n\'MaliMaliPMMCUONSLEEPINITIATEFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"W\n\x1fMaliMaliPMMCUPENDOFFFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"\\\n$MaliMaliPMMCUPENDONRELOADFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"Y\n!MaliMaliPMMCUPOWERDOWNFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"Y\n!MaliMaliPMMCURESETWAITFtraceEvent\x12\x11\n\tkctx_tgid\x18\x01 \x01(\x05\x12\x0f\n\x07kctx_id\x18\x02 \x01(\r\x12\x10\n\x08info_val\x18\x03 \x01(\x04\"W\n\x1cMaliGpuPowerStateFtraceEvent\x12\x11\n\tchange_ns\x18\x01 \x01(\x04\x12\x12\n\nfrom_state\x18\x02 \x01(\x05\x12\x10\n\x08to_state\x18\x03 \x01(\x05\"@\n\x18MdpCmdKickoffFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\x12\x13\n\x0bkickoff_cnt\x18\x02 \x01(\x05\"Z\n\x14MdpCommitFtraceEvent\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x10\n\x08play_cnt\x18\x02 \x01(\r\x12\x10\n\x08\x63lk_rate\x18\x03 \x01(\r\x12\x11\n\tbandwidth\x18\x04 \x01(\x04\"[\n\x17MdpPerfSetOtFtraceEvent\x12\x0c\n\x04pnum\x18\x01 \x01(\r\x12\x0e\n\x06xin_id\x18\x02 \x01(\r\x12\x0e\n\x06rd_lim\x18\x03 \x01(\r\x12\x12\n\nis_vbif_rt\x18\x04 \x01(\r\"\x8c\x02\n\x18MdpSsppChangeFtraceEvent\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x10\n\x08play_cnt\x18\x02 \x01(\r\x12\r\n\x05mixer\x18\x03 \x01(\r\x12\r\n\x05stage\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\x12\x0e\n\x06\x66ormat\x18\x06 \x01(\r\x12\r\n\x05img_w\x18\x07 \x01(\r\x12\r\n\x05img_h\x18\x08 \x01(\r\x12\r\n\x05src_x\x18\t \x01(\r\x12\r\n\x05src_y\x18\n \x01(\r\x12\r\n\x05src_w\x18\x0b \x01(\r\x12\r\n\x05src_h\x18\x0c \x01(\r\x12\r\n\x05\x64st_x\x18\r \x01(\r\x12\r\n\x05\x64st_y\x18\x0e \x01(\r\x12\r\n\x05\x64st_w\x18\x0f \x01(\r\x12\r\n\x05\x64st_h\x18\x10 \x01(\r\"S\n\x1bTracingMarkWriteFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x12\n\ntrace_name\x18\x02 \x01(\t\x12\x13\n\x0btrace_begin\x18\x03 \x01(\r\"d\n\x1dMdpCmdPingpongDoneFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\x12\x10\n\x08intf_num\x18\x02 \x01(\r\x12\x0e\n\x06pp_num\x18\x03 \x01(\r\x12\x10\n\x08koff_cnt\x18\x04 \x01(\x05\"\xa4\x01\n\x17MdpCompareBwFtraceEvent\x12\x0e\n\x06new_ab\x18\x01 \x01(\x04\x12\x0e\n\x06new_ib\x18\x02 \x01(\x04\x12\x0e\n\x06new_wb\x18\x03 \x01(\x04\x12\x0e\n\x06old_ab\x18\x04 \x01(\x04\x12\x0e\n\x06old_ib\x18\x05 \x01(\x04\x12\x0e\n\x06old_wb\x18\x06 \x01(\x04\x12\x16\n\x0eparams_changed\x18\x07 \x01(\r\x12\x11\n\tupdate_bw\x18\x08 \x01(\r\"p\n\x1eMdpPerfSetPanicLutsFtraceEvent\x12\x0c\n\x04pnum\x18\x01 \x01(\r\x12\x0b\n\x03\x66mt\x18\x02 \x01(\r\x12\x0c\n\x04mode\x18\x03 \x01(\r\x12\x11\n\tpanic_lut\x18\x04 \x01(\r\x12\x12\n\nrobust_lut\x18\x05 \x01(\r\"\x89\x02\n\x15MdpSsppSetFtraceEvent\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x10\n\x08play_cnt\x18\x02 \x01(\r\x12\r\n\x05mixer\x18\x03 \x01(\r\x12\r\n\x05stage\x18\x04 \x01(\r\x12\r\n\x05\x66lags\x18\x05 \x01(\r\x12\x0e\n\x06\x66ormat\x18\x06 \x01(\r\x12\r\n\x05img_w\x18\x07 \x01(\r\x12\r\n\x05img_h\x18\x08 \x01(\r\x12\r\n\x05src_x\x18\t \x01(\r\x12\r\n\x05src_y\x18\n \x01(\r\x12\r\n\x05src_w\x18\x0b \x01(\r\x12\r\n\x05src_h\x18\x0c \x01(\r\x12\r\n\x05\x64st_x\x18\r \x01(\r\x12\r\n\x05\x64st_y\x18\x0e \x01(\r\x12\r\n\x05\x64st_w\x18\x0f \x01(\r\x12\r\n\x05\x64st_h\x18\x10 \x01(\r\"A\n\x1cMdpCmdReadptrDoneFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\x12\x10\n\x08koff_cnt\x18\x02 \x01(\x05\"I\n\x15MdpMisrCrcFtraceEvent\x12\x10\n\x08\x62lock_id\x18\x01 \x01(\r\x12\x11\n\tvsync_cnt\x18\x02 \x01(\r\x12\x0b\n\x03\x63rc\x18\x03 \x01(\r\"}\n\x1cMdpPerfSetQosLutsFtraceEvent\x12\x0c\n\x04pnum\x18\x01 \x01(\r\x12\x0b\n\x03\x66mt\x18\x02 \x01(\r\x12\x0c\n\x04intf\x18\x03 \x01(\r\x12\x0b\n\x03rot\x18\x04 \x01(\r\x12\n\n\x02\x66l\x18\x05 \x01(\r\x12\x0b\n\x03lut\x18\x06 \x01(\r\x12\x0e\n\x06linear\x18\x07 \x01(\r\"N\n\x1aMdpTraceCounterFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x14\n\x0c\x63ounter_name\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x05\"-\n\x1aMdpCmdReleaseBwFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\".\n\x19MdpMixerUpdateFtraceEvent\x12\x11\n\tmixer_num\x18\x01 \x01(\r\"\xa0\x01\n\x1dMdpPerfSetWmLevelsFtraceEvent\x12\x0c\n\x04pnum\x18\x01 \x01(\r\x12\x11\n\tuse_space\x18\x02 \x01(\r\x12\x16\n\x0epriority_bytes\x18\x03 \x01(\r\x12\x0b\n\x03wm0\x18\x04 \x01(\r\x12\x0b\n\x03wm1\x18\x05 \x01(\r\x12\x0b\n\x03wm2\x18\x06 \x01(\r\x12\x0e\n\x06mb_cnt\x18\x07 \x01(\r\x12\x0f\n\x07mb_size\x18\x08 \x01(\r\"H\n\x1fMdpVideoUnderrunDoneFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\x12\x14\n\x0cunderrun_cnt\x18\x02 \x01(\r\"E\n\x1dMdpCmdWaitPingpongFtraceEvent\x12\x0f\n\x07\x63tl_num\x18\x01 \x01(\r\x12\x13\n\x0bkickoff_cnt\x18\x02 \x01(\x05\"\xce\x01\n\x1dMdpPerfPrefillCalcFtraceEvent\x12\x0c\n\x04pnum\x18\x01 \x01(\r\x12\x13\n\x0blatency_buf\x18\x02 \x01(\r\x12\n\n\x02ot\x18\x03 \x01(\r\x12\r\n\x05y_buf\x18\x04 \x01(\r\x12\x10\n\x08y_scaler\x18\x05 \x01(\r\x12\x10\n\x08pp_lines\x18\x06 \x01(\r\x12\x10\n\x08pp_bytes\x18\x07 \x01(\r\x12\x0f\n\x07post_sc\x18\x08 \x01(\r\x12\x11\n\tfbc_bytes\x18\t \x01(\r\x12\x15\n\rprefill_bytes\x18\n \x01(\r\"Q\n\x1bMdpPerfUpdateBusFtraceEvent\x12\x0e\n\x06\x63lient\x18\x01 \x01(\x05\x12\x10\n\x08\x61\x62_quota\x18\x02 \x01(\x04\x12\x10\n\x08ib_quota\x18\x03 \x01(\x04\"0\n\x1fRotatorBwAoAsContextFtraceEvent\x12\r\n\x05state\x18\x01 \x01(\r\"Y\n\x18MmEventRecordFtraceEvent\x12\x0f\n\x07\x61vg_lat\x18\x01 \x01(\r\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x0f\n\x07max_lat\x18\x03 \x01(\r\x12\x0c\n\x04type\x18\x04 \x01(\r\"H\n\x1aNetifReceiveSkbFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07skbaddr\x18\x03 \x01(\x04\"O\n\x15NetDevXmitFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\n\n\x02rc\x18\x03 \x01(\x05\x12\x0f\n\x07skbaddr\x18\x04 \x01(\x04\"\xfb\x02\n\x1eNapiGroReceiveEntryFtraceEvent\x12\x10\n\x08\x64\x61ta_len\x18\x01 \x01(\r\x12\x10\n\x08gso_size\x18\x02 \x01(\r\x12\x10\n\x08gso_type\x18\x03 \x01(\r\x12\x0c\n\x04hash\x18\x04 \x01(\r\x12\x11\n\tip_summed\x18\x05 \x01(\r\x12\x0f\n\x07l4_hash\x18\x06 \x01(\r\x12\x0b\n\x03len\x18\x07 \x01(\r\x12\x12\n\nmac_header\x18\x08 \x01(\x05\x12\x18\n\x10mac_header_valid\x18\t \x01(\r\x12\x0c\n\x04name\x18\n \x01(\t\x12\x0f\n\x07napi_id\x18\x0b \x01(\r\x12\x10\n\x08nr_frags\x18\x0c \x01(\r\x12\x10\n\x08protocol\x18\r \x01(\r\x12\x15\n\rqueue_mapping\x18\x0e \x01(\r\x12\x0f\n\x07skbaddr\x18\x0f \x01(\x04\x12\x10\n\x08truesize\x18\x10 \x01(\r\x12\x12\n\nvlan_proto\x18\x11 \x01(\r\x12\x13\n\x0bvlan_tagged\x18\x12 \x01(\r\x12\x10\n\x08vlan_tci\x18\x13 \x01(\r\",\n\x1dNapiGroReceiveExitFtraceEvent\x12\x0b\n\x03ret\x18\x01 \x01(\x05\"P\n\x1cOomScoreAdjUpdateFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x15\n\room_score_adj\x18\x02 \x01(\x05\x12\x0b\n\x03pid\x18\x03 \x01(\x05\"$\n\x15MarkVictimFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\">\n\x1b\x44siCmdFifoStatusFtraceEvent\x12\x0e\n\x06header\x18\x01 \x01(\r\x12\x0f\n\x07payload\x18\x02 \x01(\r\"/\n\x10\x44siRxFtraceEvent\x12\x0b\n\x03\x63md\x18\x01 \x01(\r\x12\x0e\n\x06rx_buf\x18\x03 \x01(\x0c\">\n\x10\x44siTxFtraceEvent\x12\x0c\n\x04last\x18\x01 \x01(\r\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\x0e\n\x06tx_buf\x18\x04 \x01(\x0c\"\x7f\n\x1cPanelWriteGenericFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x12\n\ntrace_name\x18\x02 \x01(\t\x12\x13\n\x0btrace_begin\x18\x03 \x01(\r\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0c\n\x04type\x18\x05 \x01(\r\x12\r\n\x05value\x18\x06 \x01(\x05\"F\n\x18GramCollisionFtraceEvent\x12\x13\n\x0bpanel_index\x18\x01 \x01(\x05\x12\x15\n\rcollision_cnt\x18\x02 \x01(\r\"\xc5\x01\n\x1cPanelSettingsFullFtraceEvent\x12\x13\n\x0bpanel_index\x18\x01 \x01(\x05\x12\x0b\n\x03hbm\x18\x02 \x01(\r\x12\x0b\n\x03irc\x18\x03 \x01(\r\x12\r\n\x05h_pwm\x18\x04 \x01(\r\x12\x0f\n\x07\x66i_auto\x18\x05 \x01(\r\x12\x11\n\tfi_manual\x18\x06 \x01(\r\x12\x12\n\nearly_exit\x18\x07 \x01(\r\x12\x0e\n\x06min_rr\x18\x08 \x01(\r\x12\x0e\n\x06max_rr\x18\t \x01(\r\x12\x0f\n\x07te_freq\x18\n \x01(\r\"q\n\x1cPanelSettingsLiteFtraceEvent\x12\x13\n\x0bpanel_index\x18\x01 \x01(\x05\x12\x0b\n\x03vrr\x18\x02 \x01(\r\x12\x0e\n\x06min_rr\x18\x03 \x01(\r\x12\x0e\n\x06max_rr\x18\x04 \x01(\r\x12\x0f\n\x07te_freq\x18\x05 \x01(\r\"\x84\x03\n\x1eSchedSwitchWithCtrsFtraceEvent\x12\x0f\n\x07old_pid\x18\x01 \x01(\x05\x12\x0f\n\x07new_pid\x18\x02 \x01(\x05\x12\x0c\n\x04\x63\x63tr\x18\x03 \x01(\x04\x12\x0c\n\x04\x63tr0\x18\x04 \x01(\x04\x12\x0c\n\x04\x63tr1\x18\x05 \x01(\x04\x12\x0c\n\x04\x63tr2\x18\x06 \x01(\x04\x12\x0c\n\x04\x63tr3\x18\x07 \x01(\x04\x12\r\n\x05lctr0\x18\x08 \x01(\r\x12\r\n\x05lctr1\x18\t \x01(\r\x12\x0c\n\x04\x63tr4\x18\n \x01(\x04\x12\x0c\n\x04\x63tr5\x18\x0b \x01(\x04\x12\x11\n\tprev_comm\x18\x0c \x01(\t\x12\x10\n\x08prev_pid\x18\r \x01(\x05\x12\x0b\n\x03\x63yc\x18\x0e \x01(\r\x12\x0c\n\x04inst\x18\x0f \x01(\r\x12\x0f\n\x07stallbm\x18\x10 \x01(\r\x12\x0c\n\x04l3dm\x18\x11 \x01(\r\x12\x10\n\x08next_pid\x18\x12 \x01(\x05\x12\x11\n\tnext_comm\x18\x13 \x01(\t\x12\x12\n\nprev_state\x18\x14 \x01(\x03\x12\x0c\n\x04\x61mu0\x18\x15 \x01(\x04\x12\x0c\n\x04\x61mu1\x18\x16 \x01(\x04\x12\x0c\n\x04\x61mu2\x18\x17 \x01(\x04\"0\n\x1cPixelMmKswapdWakeFtraceEvent\x12\x10\n\x08whatever\x18\x01 \x01(\x05\"\x85\x01\n\x1cPixelMmKswapdDoneFtraceEvent\x12\x18\n\x10\x64\x65lta_nr_scanned\x18\x01 \x01(\x04\x12\x1a\n\x12\x64\x65lta_nr_reclaimed\x18\x02 \x01(\x04\x12\x1a\n\x12\x64\x65lta_nr_allocated\x18\x03 \x01(\x04\x12\x13\n\x0b\x64uration_ns\x18\x04 \x01(\x04\"8\n\x17\x43puFrequencyFtraceEvent\x12\r\n\x05state\x18\x01 \x01(\r\x12\x0e\n\x06\x63pu_id\x18\x02 \x01(\r\"S\n\x1d\x43puFrequencyLimitsFtraceEvent\x12\x10\n\x08min_freq\x18\x01 \x01(\r\x12\x10\n\x08max_freq\x18\x02 \x01(\r\x12\x0e\n\x06\x63pu_id\x18\x03 \x01(\r\"3\n\x12\x43puIdleFtraceEvent\x12\r\n\x05state\x18\x01 \x01(\r\x12\x0e\n\x06\x63pu_id\x18\x02 \x01(\r\"E\n\x16\x43lockEnableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x04\x12\x0e\n\x06\x63pu_id\x18\x03 \x01(\x04\"F\n\x17\x43lockDisableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x04\x12\x0e\n\x06\x63pu_id\x18\x03 \x01(\x04\"F\n\x17\x43lockSetRateFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x04\x12\x0e\n\x06\x63pu_id\x18\x03 \x01(\x04\"F\n\x18SuspendResumeFtraceEvent\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x0b\n\x03val\x18\x02 \x01(\x05\x12\r\n\x05start\x18\x03 \x01(\r\"8\n\x17GpuFrequencyFtraceEvent\x12\x0e\n\x06gpu_id\x18\x01 \x01(\r\x12\r\n\x05state\x18\x02 \x01(\r\">\n\x1fWakeupSourceActivateFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x04\"@\n!WakeupSourceDeactivateFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x04\"\x85\x01\n\x18GpuWorkPeriodFtraceEvent\x12\x0e\n\x06gpu_id\x18\x01 \x01(\r\x12\x0b\n\x03uid\x18\x02 \x01(\r\x12\x15\n\rstart_time_ns\x18\x03 \x01(\x04\x12\x13\n\x0b\x65nd_time_ns\x18\x04 \x01(\x04\x12 \n\x18total_active_duration_ns\x18\x05 \x01(\x04\"q\n DevicePmCallbackStartFtraceEvent\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\t\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\x0e\n\x06parent\x18\x03 \x01(\t\x12\x0e\n\x06pm_ops\x18\x04 \x01(\t\x12\r\n\x05\x65vent\x18\x05 \x01(\x05\"O\n\x1e\x44\x65vicePmCallbackEndFtraceEvent\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\t\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\x05\"@\n\x18GpuPowerStateFtraceEvent\x12\x11\n\told_state\x18\x01 \x01(\x05\x12\x11\n\tnew_state\x18\x02 \x01(\x05\"N\n\x1dPsciDomainIdleExitFtraceEvent\x12\x0e\n\x06\x63pu_id\x18\x01 \x01(\r\x12\r\n\x05state\x18\x02 \x01(\r\x12\x0e\n\x06s2idle\x18\x03 \x01(\r\"O\n\x1ePsciDomainIdleEnterFtraceEvent\x12\x0e\n\x06\x63pu_id\x18\x01 \x01(\r\x12\r\n\x05state\x18\x02 \x01(\r\x12\x0e\n\x06s2idle\x18\x03 \x01(\r\"!\n\x12\x43onsoleFtraceEvent\x12\x0b\n\x03msg\x18\x01 \x01(\t\"/\n\x13SysEnterFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0c\n\x04\x61rgs\x18\x02 \x03(\x04\"-\n\x12SysExitFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0b\n\x03ret\x18\x02 \x01(\x03\"+\n\x1bRegulatorDisableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"3\n#RegulatorDisableCompleteFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"*\n\x1aRegulatorEnableFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"2\n\"RegulatorEnableCompleteFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"/\n\x1fRegulatorEnableDelayFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\"H\n\x1eRegulatorSetVoltageFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03min\x18\x02 \x01(\x05\x12\x0b\n\x03max\x18\x03 \x01(\x05\"C\n&RegulatorSetVoltageCompleteFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03val\x18\x02 \x01(\r\"4\n\x14RpmStatusFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\x05\"}\n\"SamsungTracingMarkWriteFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x12\n\ntrace_name\x18\x02 \x01(\t\x12\x13\n\x0btrace_begin\x18\x03 \x01(\r\x12\x12\n\ntrace_type\x18\x04 \x01(\r\x12\r\n\x05value\x18\x05 \x01(\x05\"\x9c\x01\n\x16SchedSwitchFtraceEvent\x12\x11\n\tprev_comm\x18\x01 \x01(\t\x12\x10\n\x08prev_pid\x18\x02 \x01(\x05\x12\x11\n\tprev_prio\x18\x03 \x01(\x05\x12\x12\n\nprev_state\x18\x04 \x01(\x03\x12\x11\n\tnext_comm\x18\x05 \x01(\t\x12\x10\n\x08next_pid\x18\x06 \x01(\x05\x12\x11\n\tnext_prio\x18\x07 \x01(\x05\"f\n\x16SchedWakeupFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\x12\x0f\n\x07success\x18\x04 \x01(\x05\x12\x12\n\ntarget_cpu\x18\x05 \x01(\x05\"M\n\x1dSchedBlockedReasonFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0e\n\x06\x63\x61ller\x18\x02 \x01(\x04\x12\x0f\n\x07io_wait\x18\x03 \x01(\r\"Q\n\x1aSchedCpuHotplugFtraceEvent\x12\x14\n\x0c\x61\x66\x66\x65\x63ted_cpu\x18\x01 \x01(\x05\x12\r\n\x05\x65rror\x18\x02 \x01(\x05\x12\x0e\n\x06status\x18\x03 \x01(\x05\"f\n\x16SchedWakingFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\x12\x0f\n\x07success\x18\x04 \x01(\x05\x12\x12\n\ntarget_cpu\x18\x05 \x01(\x05\"i\n\x19SchedWakeupNewFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\x12\x0f\n\x07success\x18\x04 \x01(\x05\x12\x12\n\ntarget_cpu\x18\x05 \x01(\x05\"M\n\x1bSchedProcessExecFtraceEvent\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0f\n\x07old_pid\x18\x03 \x01(\x05\"T\n\x1bSchedProcessExitFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04tgid\x18\x03 \x01(\x05\x12\x0c\n\x04prio\x18\x04 \x01(\x05\"m\n\x1bSchedProcessForkFtraceEvent\x12\x13\n\x0bparent_comm\x18\x01 \x01(\t\x12\x12\n\nparent_pid\x18\x02 \x01(\x05\x12\x12\n\nchild_comm\x18\x03 \x01(\t\x12\x11\n\tchild_pid\x18\x04 \x01(\x05\"F\n\x1bSchedProcessFreeFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\"8\n\x1bSchedProcessHangFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\"F\n\x1bSchedProcessWaitFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\"X\n\x19SchedPiSetprioFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0f\n\x07newprio\x18\x02 \x01(\x05\x12\x0f\n\x07oldprio\x18\x03 \x01(\x05\x12\x0b\n\x03pid\x18\x04 \x01(\x05\"\xc8\x02\n\x1aSchedCpuUtilCfsFtraceEvent\x12\x0e\n\x06\x61\x63tive\x18\x01 \x01(\x05\x12\x10\n\x08\x63\x61pacity\x18\x02 \x01(\x04\x12\x15\n\rcapacity_orig\x18\x03 \x01(\x04\x12\x0b\n\x03\x63pu\x18\x04 \x01(\r\x12\x16\n\x0e\x63pu_importance\x18\x05 \x01(\x04\x12\x10\n\x08\x63pu_util\x18\x06 \x01(\x04\x12\x10\n\x08\x65xit_lat\x18\x07 \x01(\r\x12\x16\n\x0egroup_capacity\x18\x08 \x01(\x04\x12\x18\n\x10grp_overutilized\x18\t \x01(\r\x12\x10\n\x08idle_cpu\x18\n \x01(\r\x12\x12\n\nnr_running\x18\x0b \x01(\r\x12\x11\n\tspare_cap\x18\x0c \x01(\x03\x12\x11\n\ttask_fits\x18\r \x01(\r\x12\x17\n\x0fwake_group_util\x18\x0e \x01(\x04\x12\x11\n\twake_util\x18\x0f \x01(\x04\"\x89\x01\n\x1bSchedMigrateTaskFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0c\n\x04prio\x18\x03 \x01(\x05\x12\x10\n\x08orig_cpu\x18\x04 \x01(\x05\x12\x10\n\x08\x64\x65st_cpu\x18\x05 \x01(\x05\x12\x0f\n\x07running\x18\x06 \x01(\x05\x12\x0c\n\x04load\x18\x07 \x01(\r\"|\n\x1eSchedWakeupTaskAttrFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x14\n\x0c\x63pu_affinity\x18\x02 \x01(\x04\x12\x11\n\ttask_util\x18\x03 \x01(\x04\x12\x12\n\nuclamp_min\x18\x04 \x01(\x04\x12\x10\n\x08vruntime\x18\x05 \x01(\x04\"[\n\x1cSchedGroupTrackerFtraceEvent\x12\x0c\n\x04\x63omm\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\r\n\x05group\x18\x03 \x01(\t\x12\x11\n\tgroup_num\x18\x04 \x01(\x05\"B\n\x17ScmCallStartFtraceEvent\x12\x0f\n\x07\x61rginfo\x18\x01 \x01(\r\x12\n\n\x02x0\x18\x02 \x01(\x04\x12\n\n\x02x5\x18\x03 \x01(\x04\"\x17\n\x15ScmCallEndFtraceEvent\"\xfc\x01\n\x1fScsiDispatchCmdErrorFtraceEvent\x12\x0f\n\x07host_no\x18\x01 \x01(\r\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\r\x12\n\n\x02id\x18\x03 \x01(\r\x12\x0b\n\x03lun\x18\x04 \x01(\r\x12\x0b\n\x03rtn\x18\x05 \x01(\x05\x12\x0e\n\x06opcode\x18\x06 \x01(\r\x12\x0f\n\x07\x63md_len\x18\x07 \x01(\r\x12\x12\n\ndata_sglen\x18\x08 \x01(\r\x12\x12\n\nprot_sglen\x18\t \x01(\r\x12\x0f\n\x07prot_op\x18\n \x01(\r\x12\x12\n\ndriver_tag\x18\x0c \x01(\x05\x12\x15\n\rscheduler_tag\x18\r \x01(\x05\x12\x0c\n\x04\x63mnd\x18\x0e \x01(\x0c\"\xaf\x02\n!ScsiDispatchCmdTimeoutFtraceEvent\x12\x0f\n\x07host_no\x18\x01 \x01(\r\x12\x0f\n\x07\x63hannel\x18\x02 \x01(\r\x12\n\n\x02id\x18\x03 \x01(\r\x12\x0b\n\x03lun\x18\x04 \x01(\r\x12\x0e\n\x06result\x18\x05 \x01(\x05\x12\x0e\n\x06opcode\x18\x06 \x01(\r\x12\x0f\n\x07\x63md_len\x18\x07 \x01(\r\x12\x12\n\ndata_sglen\x18\x08 \x01(\r\x12\x12\n\nprot_sglen\x18\t \x01(\r\x12\x0f\n\x07prot_op\x18\n \x01(\r\x12\x12\n\ndriver_tag\x18\x0c \x01(\x05\x12\x15\n\rscheduler_tag\x18\r \x01(\x05\x12\x11\n\tsense_key\x18\x0e \x01(\r\x12\x0b\n\x03\x61sc\x18\x0f \x01(\r\x12\x0c\n\x04\x61scq\x18\x10 \x01(\r\x12\x0c\n\x04\x63mnd\x18\x11 \x01(\x0c\"*\n\x17ScsiEhWakeupFtraceEvent\x12\x0f\n\x07host_no\x18\x01 \x01(\r\"y\n\x1eSdeTracingMarkWriteFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x12\n\ntrace_name\x18\x02 \x01(\t\x12\x12\n\ntrace_type\x18\x03 \x01(\r\x12\r\n\x05value\x18\x04 \x01(\x05\x12\x13\n\x0btrace_begin\x18\x05 \x01(\r\"\x8d\x02\n\x17SdeSdeEvtlogFtraceEvent\x12\x12\n\nevtlog_tag\x18\x01 \x01(\t\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x0e\n\x06tag_id\x18\x03 \x01(\r\x12\x0b\n\x03\x64\x30\x30\x18\x04 \x01(\r\x12\x0b\n\x03\x64\x30\x31\x18\x05 \x01(\r\x12\x0b\n\x03\x64\x30\x32\x18\x06 \x01(\r\x12\x0b\n\x03\x64\x30\x33\x18\x07 \x01(\r\x12\x0b\n\x03\x64\x30\x34\x18\x08 \x01(\r\x12\x0b\n\x03\x64\x30\x35\x18\t \x01(\r\x12\x0b\n\x03\x64\x30\x36\x18\n \x01(\r\x12\x0b\n\x03\x64\x30\x37\x18\x0b \x01(\r\x12\x0b\n\x03\x64\x30\x38\x18\x0c \x01(\r\x12\x0b\n\x03\x64\x30\x39\x18\r \x01(\r\x12\x0b\n\x03\x64\x31\x30\x18\x0e \x01(\r\x12\x0b\n\x03\x64\x31\x31\x18\x0f \x01(\r\x12\x0b\n\x03\x64\x31\x32\x18\x10 \x01(\r\x12\x0b\n\x03\x64\x31\x33\x18\x11 \x01(\r\x12\x0b\n\x03\x64\x31\x34\x18\x12 \x01(\r\"\xb4\x01\n\x1dSdeSdePerfCalcCrtcFtraceEvent\x12\x12\n\nbw_ctl_ebi\x18\x01 \x01(\x04\x12\x13\n\x0b\x62w_ctl_llcc\x18\x02 \x01(\x04\x12\x13\n\x0b\x62w_ctl_mnoc\x18\x03 \x01(\x04\x12\x15\n\rcore_clk_rate\x18\x04 \x01(\r\x12\x0c\n\x04\x63rtc\x18\x05 \x01(\r\x12\x0e\n\x06ib_ebi\x18\x06 \x01(\x04\x12\x0f\n\x07ib_llcc\x18\x07 \x01(\x04\x12\x0f\n\x07ib_mnoc\x18\x08 \x01(\x04\"\x9b\x02\n\x1fSdeSdePerfCrtcUpdateFtraceEvent\x12\x12\n\nbw_ctl_ebi\x18\x01 \x01(\x04\x12\x13\n\x0b\x62w_ctl_llcc\x18\x02 \x01(\x04\x12\x13\n\x0b\x62w_ctl_mnoc\x18\x03 \x01(\x04\x12\x15\n\rcore_clk_rate\x18\x04 \x01(\r\x12\x0c\n\x04\x63rtc\x18\x05 \x01(\r\x12\x0e\n\x06params\x18\x06 \x01(\x05\x12\x17\n\x0fper_pipe_ib_ebi\x18\x07 \x01(\x04\x12\x18\n\x10per_pipe_ib_llcc\x18\x08 \x01(\x04\x12\x18\n\x10per_pipe_ib_mnoc\x18\t \x01(\x04\x12\x10\n\x08stop_req\x18\n \x01(\r\x12\x12\n\nupdate_bus\x18\x0b \x01(\r\x12\x12\n\nupdate_clk\x18\x0c \x01(\r\"t\n\x1fSdeSdePerfSetQosLutsFtraceEvent\x12\n\n\x02\x66l\x18\x01 \x01(\r\x12\x0b\n\x03\x66mt\x18\x02 \x01(\r\x12\x0b\n\x03lut\x18\x03 \x01(\x04\x12\x11\n\tlut_usage\x18\x04 \x01(\r\x12\x0c\n\x04pnum\x18\x05 \x01(\r\x12\n\n\x02rt\x18\x06 \x01(\r\"d\n\x1eSdeSdePerfUpdateBusFtraceEvent\x12\x10\n\x08\x61\x62_quota\x18\x01 \x01(\x04\x12\x0e\n\x06\x62us_id\x18\x02 \x01(\r\x12\x0e\n\x06\x63lient\x18\x03 \x01(\x05\x12\x10\n\x08ib_quota\x18\x04 \x01(\x04\"G\n\x18SignalDeliverFtraceEvent\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x10\n\x08sa_flags\x18\x02 \x01(\x04\x12\x0b\n\x03sig\x18\x03 \x01(\x05\"p\n\x19SignalGenerateFtraceEvent\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\x12\r\n\x05group\x18\x03 \x01(\x05\x12\x0b\n\x03pid\x18\x04 \x01(\x05\x12\x0e\n\x06result\x18\x05 \x01(\x05\x12\x0b\n\x03sig\x18\x06 \x01(\x05\"J\n\x13KfreeSkbFtraceEvent\x12\x10\n\x08location\x18\x01 \x01(\x04\x12\x10\n\x08protocol\x18\x02 \x01(\r\x12\x0f\n\x07skbaddr\x18\x03 \x01(\x04\"\xaf\x01\n\x1bInetSockSetStateFtraceEvent\x12\r\n\x05\x64\x61\x64\x64r\x18\x01 \x01(\r\x12\r\n\x05\x64port\x18\x02 \x01(\r\x12\x0e\n\x06\x66\x61mily\x18\x03 \x01(\r\x12\x10\n\x08newstate\x18\x04 \x01(\x05\x12\x10\n\x08oldstate\x18\x05 \x01(\x05\x12\x10\n\x08protocol\x18\x06 \x01(\r\x12\r\n\x05saddr\x18\x07 \x01(\r\x12\x0e\n\x06skaddr\x18\x08 \x01(\x04\x12\r\n\x05sport\x18\t \x01(\r\"4\n\x11SyncPtFtraceEvent\x12\x10\n\x08timeline\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"6\n\x17SyncTimelineFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"B\n\x13SyncWaitFtraceEvent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\x05\x12\r\n\x05\x62\x65gin\x18\x03 \x01(\r\"X\n\x1bRssStatThrottledFtraceEvent\x12\x0c\n\x04\x63urr\x18\x01 \x01(\r\x12\x0e\n\x06member\x18\x02 \x01(\x05\x12\r\n\x05mm_id\x18\x03 \x01(\r\x12\x0c\n\x04size\x18\x04 \x01(\x03\"0\n\x1fSuspendResumeMinimalFtraceEvent\x12\r\n\x05start\x18\x01 \x01(\r\"I\n\x0fZeroFtraceEvent\x12\x0c\n\x04\x66lag\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0b\n\x03pid\x18\x03 \x01(\x05\x12\r\n\x05value\x18\x04 \x01(\x03\"_\n\x16TaskNewtaskFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\x12\x13\n\x0b\x63lone_flags\x18\x03 \x01(\x04\x12\x15\n\room_score_adj\x18\x04 \x01(\x05\"]\n\x15TaskRenameFtraceEvent\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0f\n\x07oldcomm\x18\x02 \x01(\t\x12\x0f\n\x07newcomm\x18\x03 \x01(\t\x12\x15\n\room_score_adj\x18\x04 \x01(\x05\"\x89\x01\n\x1bTcpRetransmitSkbFtraceEvent\x12\r\n\x05\x64\x61\x64\x64r\x18\x01 \x01(\r\x12\r\n\x05\x64port\x18\x02 \x01(\r\x12\r\n\x05saddr\x18\x03 \x01(\r\x12\x0e\n\x06skaddr\x18\x04 \x01(\x04\x12\x0f\n\x07skbaddr\x18\x05 \x01(\x04\x12\r\n\x05sport\x18\x06 \x01(\r\x12\r\n\x05state\x18\x07 \x01(\x05\"b\n\x1dThermalTemperatureFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04temp\x18\x02 \x01(\x05\x12\x11\n\ttemp_prev\x18\x03 \x01(\x05\x12\x14\n\x0cthermal_zone\x18\x04 \x01(\t\"5\n\x15\x43\x64\x65vUpdateFtraceEvent\x12\x0e\n\x06target\x18\x01 \x01(\x04\x12\x0c\n\x04type\x18\x02 \x01(\t\"\xe4\x01\n ThermalExynosAcpmBulkFtraceEvent\x12\r\n\x05tz_id\x18\x01 \x01(\r\x12\x14\n\x0c\x63urrent_temp\x18\x02 \x01(\r\x12\x11\n\tctrl_temp\x18\x03 \x01(\r\x12\x12\n\ncdev_state\x18\x04 \x01(\r\x12\x10\n\x08pid_et_p\x18\x05 \x01(\x05\x12\x17\n\x0fpid_power_range\x18\x06 \x01(\x05\x12\r\n\x05pid_p\x18\x07 \x01(\x05\x12\r\n\x05pid_i\x18\x08 \x01(\x05\x12\x0b\n\x03k_p\x18\t \x01(\x05\x12\x0b\n\x03k_i\x18\n \x01(\x05\x12\x11\n\ttimestamp\x18\x0b \x01(\x04\"\xa2\x01\n(ThermalExynosAcpmHighOverheadFtraceEvent\x12\r\n\x05tz_id\x18\x01 \x01(\x05\x12\x14\n\x0c\x63urrent_temp\x18\x02 \x01(\r\x12\x11\n\tctrl_temp\x18\x03 \x01(\r\x12\x12\n\ncdev_state\x18\x04 \x01(\r\x12\x10\n\x08pid_et_p\x18\x05 \x01(\x05\x12\x0b\n\x03k_p\x18\x06 \x01(\x05\x12\x0b\n\x03k_i\x18\x07 \x01(\x05\"p\n\x17HrtimerStartFtraceEvent\x12\x0f\n\x07hrtimer\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\x12\x0f\n\x07\x65xpires\x18\x03 \x01(\x03\x12\x13\n\x0bsoftexpires\x18\x04 \x01(\x03\x12\x0c\n\x04mode\x18\x05 \x01(\r\"+\n\x18HrtimerCancelFtraceEvent\x12\x0f\n\x07hrtimer\x18\x01 \x01(\x04\"O\n\x1dHrtimerExpireEntryFtraceEvent\x12\x0f\n\x07hrtimer\x18\x01 \x01(\x04\x12\x0b\n\x03now\x18\x02 \x01(\x03\x12\x10\n\x08\x66unction\x18\x03 \x01(\x04\"/\n\x1cHrtimerExpireExitFtraceEvent\x12\x0f\n\x07hrtimer\x18\x01 \x01(\x04\"\x90\x01\n\x15TimerStartFtraceEvent\x12\r\n\x05timer\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\x12\x0f\n\x07\x65xpires\x18\x03 \x01(\x04\x12\x0b\n\x03now\x18\x04 \x01(\x04\x12\x12\n\ndeferrable\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x06 \x01(\r\x12\x15\n\rbucket_expiry\x18\x07 \x01(\x04\"\'\n\x16TimerCancelFtraceEvent\x12\r\n\x05timer\x18\x01 \x01(\x04\"\\\n\x1bTimerExpireEntryFtraceEvent\x12\r\n\x05timer\x18\x01 \x01(\x04\x12\x0b\n\x03now\x18\x02 \x01(\x04\x12\x10\n\x08\x66unction\x18\x03 \x01(\x04\x12\x0f\n\x07\x62\x61seclk\x18\x04 \x01(\x04\"+\n\x1aTimerExpireExitFtraceEvent\x12\r\n\x05timer\x18\x01 \x01(\x04\"F\n\x14TrustySmcFtraceEvent\x12\n\n\x02r0\x18\x01 \x01(\x04\x12\n\n\x02r1\x18\x02 \x01(\x04\x12\n\n\x02r2\x18\x03 \x01(\x04\x12\n\n\x02r3\x18\x04 \x01(\x04\"\'\n\x18TrustySmcDoneFtraceEvent\x12\x0b\n\x03ret\x18\x01 \x01(\x04\"L\n\x1aTrustyStdCall32FtraceEvent\x12\n\n\x02r0\x18\x01 \x01(\x04\x12\n\n\x02r1\x18\x02 \x01(\x04\x12\n\n\x02r2\x18\x03 \x01(\x04\x12\n\n\x02r3\x18\x04 \x01(\x04\"-\n\x1eTrustyStdCall32DoneFtraceEvent\x12\x0b\n\x03ret\x18\x01 \x01(\x03\"H\n\x1cTrustyShareMemoryFtraceEvent\x12\x0b\n\x03len\x18\x01 \x01(\x04\x12\x0c\n\x04lend\x18\x02 \x01(\r\x12\r\n\x05nents\x18\x03 \x01(\r\"i\n TrustyShareMemoryDoneFtraceEvent\x12\x0e\n\x06handle\x18\x01 \x01(\x04\x12\x0b\n\x03len\x18\x02 \x01(\x04\x12\x0c\n\x04lend\x18\x03 \x01(\r\x12\r\n\x05nents\x18\x04 \x01(\r\x12\x0b\n\x03ret\x18\x05 \x01(\x05\",\n\x1eTrustyReclaimMemoryFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x04\"=\n\"TrustyReclaimMemoryDoneFtraceEvent\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0b\n\x03ret\x18\x02 \x01(\x05\"#\n\x14TrustyIrqFtraceEvent\x12\x0b\n\x03irq\x18\x01 \x01(\x05\"S\n\x1fTrustyIpcHandleEventFtraceEvent\x12\x0c\n\x04\x63han\x18\x01 \x01(\r\x12\x10\n\x08\x65vent_id\x18\x02 \x01(\r\x12\x10\n\x08srv_name\x18\x03 \x01(\t\"H\n\x1bTrustyIpcConnectFtraceEvent\x12\x0c\n\x04\x63han\x18\x01 \x01(\r\x12\x0c\n\x04port\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x05\"J\n\x1eTrustyIpcConnectEndFtraceEvent\x12\x0c\n\x04\x63han\x18\x01 \x01(\r\x12\x0b\n\x03\x65rr\x18\x02 \x01(\x05\x12\r\n\x05state\x18\x03 \x01(\x05\"\x82\x01\n\x19TrustyIpcWriteFtraceEvent\x12\x0e\n\x06\x62uf_id\x18\x01 \x01(\x04\x12\x0c\n\x04\x63han\x18\x02 \x01(\r\x12\x10\n\x08kind_shm\x18\x03 \x01(\x05\x12\x12\n\nlen_or_err\x18\x04 \x01(\x05\x12\x0f\n\x07shm_cnt\x18\x05 \x01(\x04\x12\x10\n\x08srv_name\x18\x06 \x01(\t\"M\n\x18TrustyIpcPollFtraceEvent\x12\x0c\n\x04\x63han\x18\x01 \x01(\r\x12\x11\n\tpoll_mask\x18\x02 \x01(\r\x12\x10\n\x08srv_name\x18\x03 \x01(\t\":\n\x18TrustyIpcReadFtraceEvent\x12\x0c\n\x04\x63han\x18\x01 \x01(\r\x12\x10\n\x08srv_name\x18\x02 \x01(\t\"r\n\x1bTrustyIpcReadEndFtraceEvent\x12\x0e\n\x06\x62uf_id\x18\x01 \x01(\x04\x12\x0c\n\x04\x63han\x18\x02 \x01(\r\x12\x12\n\nlen_or_err\x18\x03 \x01(\x05\x12\x0f\n\x07shm_cnt\x18\x04 \x01(\x04\x12\x10\n\x08srv_name\x18\x05 \x01(\t\"H\n\x16TrustyIpcRxFtraceEvent\x12\x0e\n\x06\x62uf_id\x18\x01 \x01(\x04\x12\x0c\n\x04\x63han\x18\x02 \x01(\r\x12\x10\n\x08srv_name\x18\x03 \x01(\t\"G\n\x1bTrustyEnqueueNopFtraceEvent\x12\x0c\n\x04\x61rg1\x18\x01 \x01(\r\x12\x0c\n\x04\x61rg2\x18\x02 \x01(\r\x12\x0c\n\x04\x61rg3\x18\x03 \x01(\r\"\xba\x01\n\x18UfshcdCommandFtraceEvent\x12\x10\n\x08\x64\x65v_name\x18\x01 \x01(\t\x12\x10\n\x08\x64oorbell\x18\x02 \x01(\r\x12\x0c\n\x04intr\x18\x03 \x01(\r\x12\x0b\n\x03lba\x18\x04 \x01(\x04\x12\x0e\n\x06opcode\x18\x05 \x01(\r\x12\x0b\n\x03str\x18\x06 \x01(\t\x12\x0b\n\x03tag\x18\x07 \x01(\r\x12\x14\n\x0ctransfer_len\x18\x08 \x01(\x05\x12\x10\n\x08group_id\x18\t \x01(\r\x12\r\n\x05str_t\x18\n \x01(\r\"=\n\x1aUfshcdClkGatingFtraceEvent\x12\x10\n\x08\x64\x65v_name\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\x05\"\x9b\x03\n\x13V4l2QbufFtraceEvent\x12\x11\n\tbytesused\x18\x01 \x01(\r\x12\r\n\x05\x66ield\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\r\n\x05index\x18\x04 \x01(\r\x12\r\n\x05minor\x18\x05 \x01(\x05\x12\x10\n\x08sequence\x18\x06 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x07 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x08 \x01(\r\x12\x16\n\x0etimecode_hours\x18\t \x01(\r\x12\x18\n\x10timecode_minutes\x18\n \x01(\r\x12\x18\n\x10timecode_seconds\x18\x0b \x01(\r\x12\x15\n\rtimecode_type\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0e \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\x0f \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x10 \x01(\r\x12\x11\n\ttimestamp\x18\x11 \x01(\x03\x12\x0c\n\x04type\x18\x12 \x01(\r\"\x9c\x03\n\x14V4l2DqbufFtraceEvent\x12\x11\n\tbytesused\x18\x01 \x01(\r\x12\r\n\x05\x66ield\x18\x02 \x01(\r\x12\r\n\x05\x66lags\x18\x03 \x01(\r\x12\r\n\x05index\x18\x04 \x01(\r\x12\r\n\x05minor\x18\x05 \x01(\x05\x12\x10\n\x08sequence\x18\x06 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x07 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x08 \x01(\r\x12\x16\n\x0etimecode_hours\x18\t \x01(\r\x12\x18\n\x10timecode_minutes\x18\n \x01(\r\x12\x18\n\x10timecode_seconds\x18\x0b \x01(\r\x12\x15\n\rtimecode_type\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0e \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\x0f \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x10 \x01(\r\x12\x11\n\ttimestamp\x18\x11 \x01(\x03\x12\x0c\n\x04type\x18\x12 \x01(\r\"\xf2\x02\n\x1aVb2V4l2BufQueueFtraceEvent\x12\r\n\x05\x66ield\x18\x01 \x01(\r\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\r\n\x05minor\x18\x03 \x01(\x05\x12\x10\n\x08sequence\x18\x04 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x05 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x06 \x01(\r\x12\x16\n\x0etimecode_hours\x18\x07 \x01(\r\x12\x18\n\x10timecode_minutes\x18\x08 \x01(\r\x12\x18\n\x10timecode_seconds\x18\t \x01(\r\x12\x15\n\rtimecode_type\x18\n \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\x0b \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x0e \x01(\r\x12\x11\n\ttimestamp\x18\x0f \x01(\x03\"\xf1\x02\n\x19Vb2V4l2BufDoneFtraceEvent\x12\r\n\x05\x66ield\x18\x01 \x01(\r\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\r\n\x05minor\x18\x03 \x01(\x05\x12\x10\n\x08sequence\x18\x04 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x05 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x06 \x01(\r\x12\x16\n\x0etimecode_hours\x18\x07 \x01(\r\x12\x18\n\x10timecode_minutes\x18\x08 \x01(\r\x12\x18\n\x10timecode_seconds\x18\t \x01(\r\x12\x15\n\rtimecode_type\x18\n \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\x0b \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x0e \x01(\r\x12\x11\n\ttimestamp\x18\x0f \x01(\x03\"\xee\x02\n\x16Vb2V4l2QbufFtraceEvent\x12\r\n\x05\x66ield\x18\x01 \x01(\r\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\r\n\x05minor\x18\x03 \x01(\x05\x12\x10\n\x08sequence\x18\x04 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x05 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x06 \x01(\r\x12\x16\n\x0etimecode_hours\x18\x07 \x01(\r\x12\x18\n\x10timecode_minutes\x18\x08 \x01(\r\x12\x18\n\x10timecode_seconds\x18\t \x01(\r\x12\x15\n\rtimecode_type\x18\n \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\x0b \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x0e \x01(\r\x12\x11\n\ttimestamp\x18\x0f \x01(\x03\"\xef\x02\n\x17Vb2V4l2DqbufFtraceEvent\x12\r\n\x05\x66ield\x18\x01 \x01(\r\x12\r\n\x05\x66lags\x18\x02 \x01(\r\x12\r\n\x05minor\x18\x03 \x01(\x05\x12\x10\n\x08sequence\x18\x04 \x01(\r\x12\x16\n\x0etimecode_flags\x18\x05 \x01(\r\x12\x17\n\x0ftimecode_frames\x18\x06 \x01(\r\x12\x16\n\x0etimecode_hours\x18\x07 \x01(\r\x12\x18\n\x10timecode_minutes\x18\x08 \x01(\r\x12\x18\n\x10timecode_seconds\x18\t \x01(\r\x12\x15\n\rtimecode_type\x18\n \x01(\r\x12\x1a\n\x12timecode_userbits0\x18\x0b \x01(\r\x12\x1a\n\x12timecode_userbits1\x18\x0c \x01(\r\x12\x1a\n\x12timecode_userbits2\x18\r \x01(\r\x12\x1a\n\x12timecode_userbits3\x18\x0e \x01(\r\x12\x11\n\ttimestamp\x18\x0f \x01(\x03\"\xa5\x01\n\x1cVirtioGpuCmdQueueFtraceEvent\x12\x0e\n\x06\x63tx_id\x18\x01 \x01(\r\x12\x0b\n\x03\x64\x65v\x18\x02 \x01(\x05\x12\x10\n\x08\x66\x65nce_id\x18\x03 \x01(\x04\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x10\n\x08num_free\x18\x06 \x01(\r\x12\r\n\x05seqno\x18\x07 \x01(\r\x12\x0c\n\x04type\x18\x08 \x01(\r\x12\n\n\x02vq\x18\t \x01(\r\"\xa8\x01\n\x1fVirtioGpuCmdResponseFtraceEvent\x12\x0e\n\x06\x63tx_id\x18\x01 \x01(\r\x12\x0b\n\x03\x64\x65v\x18\x02 \x01(\x05\x12\x10\n\x08\x66\x65nce_id\x18\x03 \x01(\x04\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x10\n\x08num_free\x18\x06 \x01(\r\x12\r\n\x05seqno\x18\x07 \x01(\r\x12\x0c\n\x04type\x18\x08 \x01(\r\x12\n\n\x02vq\x18\t \x01(\r\"<\n\x19VirtioVideoCmdFtraceEvent\x12\x11\n\tstream_id\x18\x01 \x01(\r\x12\x0c\n\x04type\x18\x02 \x01(\r\"@\n\x1dVirtioVideoCmdDoneFtraceEvent\x12\x11\n\tstream_id\x18\x01 \x01(\r\x12\x0c\n\x04type\x18\x02 \x01(\r\"\xc4\x01\n#VirtioVideoResourceQueueFtraceEvent\x12\x12\n\ndata_size0\x18\x01 \x01(\r\x12\x12\n\ndata_size1\x18\x02 \x01(\r\x12\x12\n\ndata_size2\x18\x03 \x01(\r\x12\x12\n\ndata_size3\x18\x04 \x01(\r\x12\x12\n\nqueue_type\x18\x05 \x01(\r\x12\x13\n\x0bresource_id\x18\x06 \x01(\x05\x12\x11\n\tstream_id\x18\x07 \x01(\x05\x12\x11\n\ttimestamp\x18\x08 \x01(\x04\"\xc8\x01\n\'VirtioVideoResourceQueueDoneFtraceEvent\x12\x12\n\ndata_size0\x18\x01 \x01(\r\x12\x12\n\ndata_size1\x18\x02 \x01(\r\x12\x12\n\ndata_size2\x18\x03 \x01(\r\x12\x12\n\ndata_size3\x18\x04 \x01(\r\x12\x12\n\nqueue_type\x18\x05 \x01(\r\x12\x13\n\x0bresource_id\x18\x06 \x01(\x05\x12\x11\n\tstream_id\x18\x07 \x01(\x05\x12\x11\n\ttimestamp\x18\x08 \x01(\x04\"`\n%MmVmscanDirectReclaimBeginFtraceEvent\x12\r\n\x05order\x18\x01 \x01(\x05\x12\x15\n\rmay_writepage\x18\x02 \x01(\x05\x12\x11\n\tgfp_flags\x18\x03 \x01(\r\";\n#MmVmscanDirectReclaimEndFtraceEvent\x12\x14\n\x0cnr_reclaimed\x18\x01 \x01(\x04\"H\n\x1dMmVmscanKswapdWakeFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\x12\r\n\x05order\x18\x02 \x01(\x05\x12\x0b\n\x03zid\x18\x03 \x01(\x05\"-\n\x1eMmVmscanKswapdSleepFtraceEvent\x12\x0b\n\x03nid\x18\x01 \x01(\x05\"\xe9\x01\n\x1cMmShrinkSlabStartFtraceEvent\x12\x13\n\x0b\x63\x61\x63he_items\x18\x01 \x01(\x04\x12\r\n\x05\x64\x65lta\x18\x02 \x01(\x04\x12\x11\n\tgfp_flags\x18\x03 \x01(\r\x12\x0f\n\x07lru_pgs\x18\x04 \x01(\x04\x12\x1c\n\x14nr_objects_to_shrink\x18\x05 \x01(\x03\x12\x13\n\x0bpgs_scanned\x18\x06 \x01(\x04\x12\x0b\n\x03shr\x18\x07 \x01(\x04\x12\x0e\n\x06shrink\x18\x08 \x01(\x04\x12\x12\n\ntotal_scan\x18\t \x01(\x04\x12\x0b\n\x03nid\x18\n \x01(\x05\x12\x10\n\x08priority\x18\x0b \x01(\x05\"\x91\x01\n\x1aMmShrinkSlabEndFtraceEvent\x12\x10\n\x08new_scan\x18\x01 \x01(\x03\x12\x0e\n\x06retval\x18\x02 \x01(\x05\x12\x0b\n\x03shr\x18\x03 \x01(\x04\x12\x0e\n\x06shrink\x18\x04 \x01(\x04\x12\x12\n\ntotal_scan\x18\x05 \x01(\x03\x12\x13\n\x0bunused_scan\x18\x06 \x01(\x03\x12\x0b\n\x03nid\x18\x07 \x01(\x05\"_\n$MmVmscanMemcgReclaimBeginFtraceEvent\x12\r\n\x05order\x18\x01 \x01(\x05\x12\x15\n\rmay_writepage\x18\x02 \x01(\x05\x12\x11\n\tgfp_flags\x18\x03 \x01(\x04\":\n\"MmVmscanMemcgReclaimEndFtraceEvent\x12\x14\n\x0cnr_reclaimed\x18\x01 \x01(\x04\"B\n WorkqueueActivateWorkFtraceEvent\x12\x0c\n\x04work\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\"@\n\x1eWorkqueueExecuteEndFtraceEvent\x12\x0c\n\x04work\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\"B\n WorkqueueExecuteStartFtraceEvent\x12\x0c\n\x04work\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\"p\n\x1dWorkqueueQueueWorkFtraceEvent\x12\x0c\n\x04work\x18\x01 \x01(\x04\x12\x10\n\x08\x66unction\x18\x02 \x01(\x04\x12\x0f\n\x07req_cpu\x18\x04 \x01(\x05\x12\x0b\n\x03\x63pu\x18\x05 \x01(\x05\x12\x11\n\tworkqueue\x18\x06 \x01(\t\"\x83\xec\x02\n\x0b\x46traceEvent\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x14\n\x0c\x63ommon_flags\x18\x05 \x01(\r\x12\x32\n\x05print\x18\x03 \x01(\x0b\x32!.perfetto.protos.PrintFtraceEventH\x00\x12?\n\x0csched_switch\x18\x04 \x01(\x0b\x32\'.perfetto.protos.SchedSwitchFtraceEventH\x00\x12\x41\n\rcpu_frequency\x18\x0b \x01(\x0b\x32(.perfetto.protos.CpuFrequencyFtraceEventH\x00\x12N\n\x14\x63pu_frequency_limits\x18\x0c \x01(\x0b\x32..perfetto.protos.CpuFrequencyLimitsFtraceEventH\x00\x12\x37\n\x08\x63pu_idle\x18\r \x01(\x0b\x32#.perfetto.protos.CpuIdleFtraceEventH\x00\x12?\n\x0c\x63lock_enable\x18\x0e \x01(\x0b\x32\'.perfetto.protos.ClockEnableFtraceEventH\x00\x12\x41\n\rclock_disable\x18\x0f \x01(\x0b\x32(.perfetto.protos.ClockDisableFtraceEventH\x00\x12\x42\n\x0e\x63lock_set_rate\x18\x10 \x01(\x0b\x32(.perfetto.protos.ClockSetRateFtraceEventH\x00\x12?\n\x0csched_wakeup\x18\x11 \x01(\x0b\x32\'.perfetto.protos.SchedWakeupFtraceEventH\x00\x12N\n\x14sched_blocked_reason\x18\x12 \x01(\x0b\x32..perfetto.protos.SchedBlockedReasonFtraceEventH\x00\x12H\n\x11sched_cpu_hotplug\x18\x13 \x01(\x0b\x32+.perfetto.protos.SchedCpuHotplugFtraceEventH\x00\x12?\n\x0csched_waking\x18\x14 \x01(\x0b\x32\'.perfetto.protos.SchedWakingFtraceEventH\x00\x12\x39\n\tipi_entry\x18\x15 \x01(\x0b\x32$.perfetto.protos.IpiEntryFtraceEventH\x00\x12\x37\n\x08ipi_exit\x18\x16 \x01(\x0b\x32#.perfetto.protos.IpiExitFtraceEventH\x00\x12\x39\n\tipi_raise\x18\x17 \x01(\x0b\x32$.perfetto.protos.IpiRaiseFtraceEventH\x00\x12\x41\n\rsoftirq_entry\x18\x18 \x01(\x0b\x32(.perfetto.protos.SoftirqEntryFtraceEventH\x00\x12?\n\x0csoftirq_exit\x18\x19 \x01(\x0b\x32\'.perfetto.protos.SoftirqExitFtraceEventH\x00\x12\x41\n\rsoftirq_raise\x18\x1a \x01(\x0b\x32(.perfetto.protos.SoftirqRaiseFtraceEventH\x00\x12\x37\n\x08i2c_read\x18\x1b \x01(\x0b\x32#.perfetto.protos.I2cReadFtraceEventH\x00\x12\x39\n\ti2c_write\x18\x1c \x01(\x0b\x32$.perfetto.protos.I2cWriteFtraceEventH\x00\x12;\n\ni2c_result\x18\x1d \x01(\x0b\x32%.perfetto.protos.I2cResultFtraceEventH\x00\x12\x39\n\ti2c_reply\x18\x1e \x01(\x0b\x32$.perfetto.protos.I2cReplyFtraceEventH\x00\x12;\n\nsmbus_read\x18\x1f \x01(\x0b\x32%.perfetto.protos.SmbusReadFtraceEventH\x00\x12=\n\x0bsmbus_write\x18 \x01(\x0b\x32&.perfetto.protos.SmbusWriteFtraceEventH\x00\x12?\n\x0csmbus_result\x18! \x01(\x0b\x32\'.perfetto.protos.SmbusResultFtraceEventH\x00\x12=\n\x0bsmbus_reply\x18\" \x01(\x0b\x32&.perfetto.protos.SmbusReplyFtraceEventH\x00\x12\x43\n\x0elowmemory_kill\x18# \x01(\x0b\x32).perfetto.protos.LowmemoryKillFtraceEventH\x00\x12H\n\x11irq_handler_entry\x18$ \x01(\x0b\x32+.perfetto.protos.IrqHandlerEntryFtraceEventH\x00\x12\x46\n\x10irq_handler_exit\x18% \x01(\x0b\x32*.perfetto.protos.IrqHandlerExitFtraceEventH\x00\x12\x35\n\x07sync_pt\x18& \x01(\x0b\x32\".perfetto.protos.SyncPtFtraceEventH\x00\x12\x41\n\rsync_timeline\x18\' \x01(\x0b\x32(.perfetto.protos.SyncTimelineFtraceEventH\x00\x12\x39\n\tsync_wait\x18( \x01(\x0b\x32$.perfetto.protos.SyncWaitFtraceEventH\x00\x12K\n\x13\x65xt4_da_write_begin\x18) \x01(\x0b\x32,.perfetto.protos.Ext4DaWriteBeginFtraceEventH\x00\x12G\n\x11\x65xt4_da_write_end\x18* \x01(\x0b\x32*.perfetto.protos.Ext4DaWriteEndFtraceEventH\x00\x12M\n\x14\x65xt4_sync_file_enter\x18+ \x01(\x0b\x32-.perfetto.protos.Ext4SyncFileEnterFtraceEventH\x00\x12K\n\x13\x65xt4_sync_file_exit\x18, \x01(\x0b\x32,.perfetto.protos.Ext4SyncFileExitFtraceEventH\x00\x12\x42\n\x0e\x62lock_rq_issue\x18- \x01(\x0b\x32(.perfetto.protos.BlockRqIssueFtraceEventH\x00\x12`\n\x1emm_vmscan_direct_reclaim_begin\x18. \x01(\x0b\x32\x36.perfetto.protos.MmVmscanDirectReclaimBeginFtraceEventH\x00\x12\\\n\x1cmm_vmscan_direct_reclaim_end\x18/ \x01(\x0b\x32\x34.perfetto.protos.MmVmscanDirectReclaimEndFtraceEventH\x00\x12O\n\x15mm_vmscan_kswapd_wake\x18\x30 \x01(\x0b\x32..perfetto.protos.MmVmscanKswapdWakeFtraceEventH\x00\x12Q\n\x16mm_vmscan_kswapd_sleep\x18\x31 \x01(\x0b\x32/.perfetto.protos.MmVmscanKswapdSleepFtraceEventH\x00\x12K\n\x12\x62inder_transaction\x18\x32 \x01(\x0b\x32-.perfetto.protos.BinderTransactionFtraceEventH\x00\x12\\\n\x1b\x62inder_transaction_received\x18\x33 \x01(\x0b\x32\x35.perfetto.protos.BinderTransactionReceivedFtraceEventH\x00\x12L\n\x13\x62inder_set_priority\x18\x34 \x01(\x0b\x32-.perfetto.protos.BinderSetPriorityFtraceEventH\x00\x12=\n\x0b\x62inder_lock\x18\x35 \x01(\x0b\x32&.perfetto.protos.BinderLockFtraceEventH\x00\x12\x41\n\rbinder_locked\x18\x36 \x01(\x0b\x32(.perfetto.protos.BinderLockedFtraceEventH\x00\x12\x41\n\rbinder_unlock\x18\x37 \x01(\x0b\x32(.perfetto.protos.BinderUnlockFtraceEventH\x00\x12T\n\x17workqueue_activate_work\x18\x38 \x01(\x0b\x32\x31.perfetto.protos.WorkqueueActivateWorkFtraceEventH\x00\x12P\n\x15workqueue_execute_end\x18\x39 \x01(\x0b\x32/.perfetto.protos.WorkqueueExecuteEndFtraceEventH\x00\x12T\n\x17workqueue_execute_start\x18: \x01(\x0b\x32\x31.perfetto.protos.WorkqueueExecuteStartFtraceEventH\x00\x12N\n\x14workqueue_queue_work\x18; \x01(\x0b\x32..perfetto.protos.WorkqueueQueueWorkFtraceEventH\x00\x12I\n\x11regulator_disable\x18< \x01(\x0b\x32,.perfetto.protos.RegulatorDisableFtraceEventH\x00\x12Z\n\x1aregulator_disable_complete\x18= \x01(\x0b\x32\x34.perfetto.protos.RegulatorDisableCompleteFtraceEventH\x00\x12G\n\x10regulator_enable\x18> \x01(\x0b\x32+.perfetto.protos.RegulatorEnableFtraceEventH\x00\x12X\n\x19regulator_enable_complete\x18? \x01(\x0b\x32\x33.perfetto.protos.RegulatorEnableCompleteFtraceEventH\x00\x12R\n\x16regulator_enable_delay\x18@ \x01(\x0b\x32\x30.perfetto.protos.RegulatorEnableDelayFtraceEventH\x00\x12P\n\x15regulator_set_voltage\x18\x41 \x01(\x0b\x32/.perfetto.protos.RegulatorSetVoltageFtraceEventH\x00\x12\x61\n\x1eregulator_set_voltage_complete\x18\x42 \x01(\x0b\x32\x37.perfetto.protos.RegulatorSetVoltageCompleteFtraceEventH\x00\x12J\n\x12\x63group_attach_task\x18\x43 \x01(\x0b\x32,.perfetto.protos.CgroupAttachTaskFtraceEventH\x00\x12?\n\x0c\x63group_mkdir\x18\x44 \x01(\x0b\x32\'.perfetto.protos.CgroupMkdirFtraceEventH\x00\x12\x43\n\x0e\x63group_remount\x18\x45 \x01(\x0b\x32).perfetto.protos.CgroupRemountFtraceEventH\x00\x12?\n\x0c\x63group_rmdir\x18\x46 \x01(\x0b\x32\'.perfetto.protos.CgroupRmdirFtraceEventH\x00\x12P\n\x15\x63group_transfer_tasks\x18G \x01(\x0b\x32/.perfetto.protos.CgroupTransferTasksFtraceEventH\x00\x12L\n\x13\x63group_destroy_root\x18H \x01(\x0b\x32-.perfetto.protos.CgroupDestroyRootFtraceEventH\x00\x12\x43\n\x0e\x63group_release\x18I \x01(\x0b\x32).perfetto.protos.CgroupReleaseFtraceEventH\x00\x12\x41\n\rcgroup_rename\x18J \x01(\x0b\x32(.perfetto.protos.CgroupRenameFtraceEventH\x00\x12H\n\x11\x63group_setup_root\x18K \x01(\x0b\x32+.perfetto.protos.CgroupSetupRootFtraceEventH\x00\x12\x44\n\x0fmdp_cmd_kickoff\x18L \x01(\x0b\x32).perfetto.protos.MdpCmdKickoffFtraceEventH\x00\x12;\n\nmdp_commit\x18M \x01(\x0b\x32%.perfetto.protos.MdpCommitFtraceEventH\x00\x12\x43\n\x0fmdp_perf_set_ot\x18N \x01(\x0b\x32(.perfetto.protos.MdpPerfSetOtFtraceEventH\x00\x12\x44\n\x0fmdp_sspp_change\x18O \x01(\x0b\x32).perfetto.protos.MdpSsppChangeFtraceEventH\x00\x12J\n\x12tracing_mark_write\x18P \x01(\x0b\x32,.perfetto.protos.TracingMarkWriteFtraceEventH\x00\x12O\n\x15mdp_cmd_pingpong_done\x18Q \x01(\x0b\x32..perfetto.protos.MdpCmdPingpongDoneFtraceEventH\x00\x12\x42\n\x0emdp_compare_bw\x18R \x01(\x0b\x32(.perfetto.protos.MdpCompareBwFtraceEventH\x00\x12R\n\x17mdp_perf_set_panic_luts\x18S \x01(\x0b\x32/.perfetto.protos.MdpPerfSetPanicLutsFtraceEventH\x00\x12>\n\x0cmdp_sspp_set\x18T \x01(\x0b\x32&.perfetto.protos.MdpSsppSetFtraceEventH\x00\x12M\n\x14mdp_cmd_readptr_done\x18U \x01(\x0b\x32-.perfetto.protos.MdpCmdReadptrDoneFtraceEventH\x00\x12>\n\x0cmdp_misr_crc\x18V \x01(\x0b\x32&.perfetto.protos.MdpMisrCrcFtraceEventH\x00\x12N\n\x15mdp_perf_set_qos_luts\x18W \x01(\x0b\x32-.perfetto.protos.MdpPerfSetQosLutsFtraceEventH\x00\x12H\n\x11mdp_trace_counter\x18X \x01(\x0b\x32+.perfetto.protos.MdpTraceCounterFtraceEventH\x00\x12I\n\x12mdp_cmd_release_bw\x18Y \x01(\x0b\x32+.perfetto.protos.MdpCmdReleaseBwFtraceEventH\x00\x12\x46\n\x10mdp_mixer_update\x18Z \x01(\x0b\x32*.perfetto.protos.MdpMixerUpdateFtraceEventH\x00\x12P\n\x16mdp_perf_set_wm_levels\x18[ \x01(\x0b\x32..perfetto.protos.MdpPerfSetWmLevelsFtraceEventH\x00\x12S\n\x17mdp_video_underrun_done\x18\\ \x01(\x0b\x32\x30.perfetto.protos.MdpVideoUnderrunDoneFtraceEventH\x00\x12O\n\x15mdp_cmd_wait_pingpong\x18] \x01(\x0b\x32..perfetto.protos.MdpCmdWaitPingpongFtraceEventH\x00\x12O\n\x15mdp_perf_prefill_calc\x18^ \x01(\x0b\x32..perfetto.protos.MdpPerfPrefillCalcFtraceEventH\x00\x12K\n\x13mdp_perf_update_bus\x18_ \x01(\x0b\x32,.perfetto.protos.MdpPerfUpdateBusFtraceEventH\x00\x12T\n\x18rotator_bw_ao_as_context\x18` \x01(\x0b\x32\x30.perfetto.protos.RotatorBwAoAsContextFtraceEventH\x00\x12[\n\x1cmm_filemap_add_to_page_cache\x18\x61 \x01(\x0b\x32\x33.perfetto.protos.MmFilemapAddToPageCacheFtraceEventH\x00\x12\x65\n!mm_filemap_delete_from_page_cache\x18\x62 \x01(\x0b\x32\x38.perfetto.protos.MmFilemapDeleteFromPageCacheFtraceEventH\x00\x12L\n\x13mm_compaction_begin\x18\x63 \x01(\x0b\x32-.perfetto.protos.MmCompactionBeginFtraceEventH\x00\x12\x61\n\x1emm_compaction_defer_compaction\x18\x64 \x01(\x0b\x32\x37.perfetto.protos.MmCompactionDeferCompactionFtraceEventH\x00\x12R\n\x16mm_compaction_deferred\x18\x65 \x01(\x0b\x32\x30.perfetto.protos.MmCompactionDeferredFtraceEventH\x00\x12W\n\x19mm_compaction_defer_reset\x18\x66 \x01(\x0b\x32\x32.perfetto.protos.MmCompactionDeferResetFtraceEventH\x00\x12H\n\x11mm_compaction_end\x18g \x01(\x0b\x32+.perfetto.protos.MmCompactionEndFtraceEventH\x00\x12R\n\x16mm_compaction_finished\x18h \x01(\x0b\x32\x30.perfetto.protos.MmCompactionFinishedFtraceEventH\x00\x12\x63\n\x1fmm_compaction_isolate_freepages\x18i \x01(\x0b\x32\x38.perfetto.protos.MmCompactionIsolateFreepagesFtraceEventH\x00\x12i\n\"mm_compaction_isolate_migratepages\x18j \x01(\x0b\x32;.perfetto.protos.MmCompactionIsolateMigratepagesFtraceEventH\x00\x12_\n\x1dmm_compaction_kcompactd_sleep\x18k \x01(\x0b\x32\x36.perfetto.protos.MmCompactionKcompactdSleepFtraceEventH\x00\x12]\n\x1cmm_compaction_kcompactd_wake\x18l \x01(\x0b\x32\x35.perfetto.protos.MmCompactionKcompactdWakeFtraceEventH\x00\x12Z\n\x1amm_compaction_migratepages\x18m \x01(\x0b\x32\x34.perfetto.protos.MmCompactionMigratepagesFtraceEventH\x00\x12R\n\x16mm_compaction_suitable\x18n \x01(\x0b\x32\x30.perfetto.protos.MmCompactionSuitableFtraceEventH\x00\x12g\n\"mm_compaction_try_to_compact_pages\x18o \x01(\x0b\x32\x39.perfetto.protos.MmCompactionTryToCompactPagesFtraceEventH\x00\x12\x61\n\x1emm_compaction_wakeup_kcompactd\x18p \x01(\x0b\x32\x37.perfetto.protos.MmCompactionWakeupKcompactdFtraceEventH\x00\x12\x43\n\x0esuspend_resume\x18q \x01(\x0b\x32).perfetto.protos.SuspendResumeFtraceEventH\x00\x12\x46\n\x10sched_wakeup_new\x18r \x01(\x0b\x32*.perfetto.protos.SchedWakeupNewFtraceEventH\x00\x12L\n\x13\x62lock_bio_backmerge\x18s \x01(\x0b\x32-.perfetto.protos.BlockBioBackmergeFtraceEventH\x00\x12\x46\n\x10\x62lock_bio_bounce\x18t \x01(\x0b\x32*.perfetto.protos.BlockBioBounceFtraceEventH\x00\x12J\n\x12\x62lock_bio_complete\x18u \x01(\x0b\x32,.perfetto.protos.BlockBioCompleteFtraceEventH\x00\x12N\n\x14\x62lock_bio_frontmerge\x18v \x01(\x0b\x32..perfetto.protos.BlockBioFrontmergeFtraceEventH\x00\x12\x44\n\x0f\x62lock_bio_queue\x18w \x01(\x0b\x32).perfetto.protos.BlockBioQueueFtraceEventH\x00\x12\x44\n\x0f\x62lock_bio_remap\x18x \x01(\x0b\x32).perfetto.protos.BlockBioRemapFtraceEventH\x00\x12J\n\x12\x62lock_dirty_buffer\x18y \x01(\x0b\x32,.perfetto.protos.BlockDirtyBufferFtraceEventH\x00\x12=\n\x0b\x62lock_getrq\x18z \x01(\x0b\x32&.perfetto.protos.BlockGetrqFtraceEventH\x00\x12;\n\nblock_plug\x18{ \x01(\x0b\x32%.perfetto.protos.BlockPlugFtraceEventH\x00\x12\x42\n\x0e\x62lock_rq_abort\x18| \x01(\x0b\x32(.perfetto.protos.BlockRqAbortFtraceEventH\x00\x12H\n\x11\x62lock_rq_complete\x18} \x01(\x0b\x32+.perfetto.protos.BlockRqCompleteFtraceEventH\x00\x12\x44\n\x0f\x62lock_rq_insert\x18~ \x01(\x0b\x32).perfetto.protos.BlockRqInsertFtraceEventH\x00\x12\x43\n\x0e\x62lock_rq_remap\x18\x80\x01 \x01(\x0b\x32(.perfetto.protos.BlockRqRemapFtraceEventH\x00\x12G\n\x10\x62lock_rq_requeue\x18\x81\x01 \x01(\x0b\x32*.perfetto.protos.BlockRqRequeueFtraceEventH\x00\x12\x42\n\rblock_sleeprq\x18\x82\x01 \x01(\x0b\x32(.perfetto.protos.BlockSleeprqFtraceEventH\x00\x12>\n\x0b\x62lock_split\x18\x83\x01 \x01(\x0b\x32&.perfetto.protos.BlockSplitFtraceEventH\x00\x12K\n\x12\x62lock_touch_buffer\x18\x84\x01 \x01(\x0b\x32,.perfetto.protos.BlockTouchBufferFtraceEventH\x00\x12@\n\x0c\x62lock_unplug\x18\x85\x01 \x01(\x0b\x32\'.perfetto.protos.BlockUnplugFtraceEventH\x00\x12N\n\x14\x65xt4_alloc_da_blocks\x18\x86\x01 \x01(\x0b\x32-.perfetto.protos.Ext4AllocDaBlocksFtraceEventH\x00\x12O\n\x14\x65xt4_allocate_blocks\x18\x87\x01 \x01(\x0b\x32..perfetto.protos.Ext4AllocateBlocksFtraceEventH\x00\x12M\n\x13\x65xt4_allocate_inode\x18\x88\x01 \x01(\x0b\x32-.perfetto.protos.Ext4AllocateInodeFtraceEventH\x00\x12\\\n\x1b\x65xt4_begin_ordered_truncate\x18\x89\x01 \x01(\x0b\x32\x34.perfetto.protos.Ext4BeginOrderedTruncateFtraceEventH\x00\x12M\n\x13\x65xt4_collapse_range\x18\x8a\x01 \x01(\x0b\x32-.perfetto.protos.Ext4CollapseRangeFtraceEventH\x00\x12P\n\x15\x65xt4_da_release_space\x18\x8b\x01 \x01(\x0b\x32..perfetto.protos.Ext4DaReleaseSpaceFtraceEventH\x00\x12P\n\x15\x65xt4_da_reserve_space\x18\x8c\x01 \x01(\x0b\x32..perfetto.protos.Ext4DaReserveSpaceFtraceEventH\x00\x12]\n\x1c\x65xt4_da_update_reserve_space\x18\x8d\x01 \x01(\x0b\x32\x34.perfetto.protos.Ext4DaUpdateReserveSpaceFtraceEventH\x00\x12L\n\x13\x65xt4_da_write_pages\x18\x8e\x01 \x01(\x0b\x32,.perfetto.protos.Ext4DaWritePagesFtraceEventH\x00\x12Y\n\x1a\x65xt4_da_write_pages_extent\x18\x8f\x01 \x01(\x0b\x32\x32.perfetto.protos.Ext4DaWritePagesExtentFtraceEventH\x00\x12N\n\x14\x65xt4_direct_IO_enter\x18\x90\x01 \x01(\x0b\x32-.perfetto.protos.Ext4DirectIOEnterFtraceEventH\x00\x12L\n\x13\x65xt4_direct_IO_exit\x18\x91\x01 \x01(\x0b\x32,.perfetto.protos.Ext4DirectIOExitFtraceEventH\x00\x12M\n\x13\x65xt4_discard_blocks\x18\x92\x01 \x01(\x0b\x32-.perfetto.protos.Ext4DiscardBlocksFtraceEventH\x00\x12]\n\x1b\x65xt4_discard_preallocations\x18\x93\x01 \x01(\x0b\x32\x35.perfetto.protos.Ext4DiscardPreallocationsFtraceEventH\x00\x12\x45\n\x0f\x65xt4_drop_inode\x18\x94\x01 \x01(\x0b\x32).perfetto.protos.Ext4DropInodeFtraceEventH\x00\x12N\n\x14\x65xt4_es_cache_extent\x18\x95\x01 \x01(\x0b\x32-.perfetto.protos.Ext4EsCacheExtentFtraceEventH\x00\x12q\n\'ext4_es_find_delayed_extent_range_enter\x18\x96\x01 \x01(\x0b\x32=.perfetto.protos.Ext4EsFindDelayedExtentRangeEnterFtraceEventH\x00\x12o\n&ext4_es_find_delayed_extent_range_exit\x18\x97\x01 \x01(\x0b\x32<.perfetto.protos.Ext4EsFindDelayedExtentRangeExitFtraceEventH\x00\x12P\n\x15\x65xt4_es_insert_extent\x18\x98\x01 \x01(\x0b\x32..perfetto.protos.Ext4EsInsertExtentFtraceEventH\x00\x12[\n\x1b\x65xt4_es_lookup_extent_enter\x18\x99\x01 \x01(\x0b\x32\x33.perfetto.protos.Ext4EsLookupExtentEnterFtraceEventH\x00\x12Y\n\x1a\x65xt4_es_lookup_extent_exit\x18\x9a\x01 \x01(\x0b\x32\x32.perfetto.protos.Ext4EsLookupExtentExitFtraceEventH\x00\x12P\n\x15\x65xt4_es_remove_extent\x18\x9b\x01 \x01(\x0b\x32..perfetto.protos.Ext4EsRemoveExtentFtraceEventH\x00\x12\x43\n\x0e\x65xt4_es_shrink\x18\x9c\x01 \x01(\x0b\x32(.perfetto.protos.Ext4EsShrinkFtraceEventH\x00\x12N\n\x14\x65xt4_es_shrink_count\x18\x9d\x01 \x01(\x0b\x32-.perfetto.protos.Ext4EsShrinkCountFtraceEventH\x00\x12W\n\x19\x65xt4_es_shrink_scan_enter\x18\x9e\x01 \x01(\x0b\x32\x31.perfetto.protos.Ext4EsShrinkScanEnterFtraceEventH\x00\x12U\n\x18\x65xt4_es_shrink_scan_exit\x18\x9f\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4EsShrinkScanExitFtraceEventH\x00\x12G\n\x10\x65xt4_evict_inode\x18\xa0\x01 \x01(\x0b\x32*.perfetto.protos.Ext4EvictInodeFtraceEventH\x00\x12n\n%ext4_ext_convert_to_initialized_enter\x18\xa1\x01 \x01(\x0b\x32<.perfetto.protos.Ext4ExtConvertToInitializedEnterFtraceEventH\x00\x12t\n(ext4_ext_convert_to_initialized_fastpath\x18\xa2\x01 \x01(\x0b\x32?.perfetto.protos.Ext4ExtConvertToInitializedFastpathFtraceEventH\x00\x12g\n!ext4_ext_handle_unwritten_extents\x18\xa3\x01 \x01(\x0b\x32\x39.perfetto.protos.Ext4ExtHandleUnwrittenExtentsFtraceEventH\x00\x12H\n\x11\x65xt4_ext_in_cache\x18\xa4\x01 \x01(\x0b\x32*.perfetto.protos.Ext4ExtInCacheFtraceEventH\x00\x12N\n\x14\x65xt4_ext_load_extent\x18\xa5\x01 \x01(\x0b\x32-.perfetto.protos.Ext4ExtLoadExtentFtraceEventH\x00\x12W\n\x19\x65xt4_ext_map_blocks_enter\x18\xa6\x01 \x01(\x0b\x32\x31.perfetto.protos.Ext4ExtMapBlocksEnterFtraceEventH\x00\x12U\n\x18\x65xt4_ext_map_blocks_exit\x18\xa7\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4ExtMapBlocksExitFtraceEventH\x00\x12O\n\x15\x65xt4_ext_put_in_cache\x18\xa8\x01 \x01(\x0b\x32-.perfetto.protos.Ext4ExtPutInCacheFtraceEventH\x00\x12P\n\x15\x65xt4_ext_remove_space\x18\xa9\x01 \x01(\x0b\x32..perfetto.protos.Ext4ExtRemoveSpaceFtraceEventH\x00\x12Y\n\x1a\x65xt4_ext_remove_space_done\x18\xaa\x01 \x01(\x0b\x32\x32.perfetto.protos.Ext4ExtRemoveSpaceDoneFtraceEventH\x00\x12\x44\n\x0f\x65xt4_ext_rm_idx\x18\xab\x01 \x01(\x0b\x32(.perfetto.protos.Ext4ExtRmIdxFtraceEventH\x00\x12\x46\n\x10\x65xt4_ext_rm_leaf\x18\xac\x01 \x01(\x0b\x32).perfetto.protos.Ext4ExtRmLeafFtraceEventH\x00\x12N\n\x14\x65xt4_ext_show_extent\x18\xad\x01 \x01(\x0b\x32-.perfetto.protos.Ext4ExtShowExtentFtraceEventH\x00\x12O\n\x14\x65xt4_fallocate_enter\x18\xae\x01 \x01(\x0b\x32..perfetto.protos.Ext4FallocateEnterFtraceEventH\x00\x12M\n\x13\x65xt4_fallocate_exit\x18\xaf\x01 \x01(\x0b\x32-.perfetto.protos.Ext4FallocateExitFtraceEventH\x00\x12V\n\x18\x65xt4_find_delalloc_range\x18\xb0\x01 \x01(\x0b\x32\x31.perfetto.protos.Ext4FindDelallocRangeFtraceEventH\x00\x12>\n\x0b\x65xt4_forget\x18\xb1\x01 \x01(\x0b\x32&.perfetto.protos.Ext4ForgetFtraceEventH\x00\x12G\n\x10\x65xt4_free_blocks\x18\xb2\x01 \x01(\x0b\x32*.perfetto.protos.Ext4FreeBlocksFtraceEventH\x00\x12\x45\n\x0f\x65xt4_free_inode\x18\xb3\x01 \x01(\x0b\x32).perfetto.protos.Ext4FreeInodeFtraceEventH\x00\x12j\n#ext4_get_implied_cluster_alloc_exit\x18\xb4\x01 \x01(\x0b\x32:.perfetto.protos.Ext4GetImpliedClusterAllocExitFtraceEventH\x00\x12\x63\n\x1f\x65xt4_get_reserved_cluster_alloc\x18\xb5\x01 \x01(\x0b\x32\x37.perfetto.protos.Ext4GetReservedClusterAllocFtraceEventH\x00\x12W\n\x19\x65xt4_ind_map_blocks_enter\x18\xb6\x01 \x01(\x0b\x32\x31.perfetto.protos.Ext4IndMapBlocksEnterFtraceEventH\x00\x12U\n\x18\x65xt4_ind_map_blocks_exit\x18\xb7\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4IndMapBlocksExitFtraceEventH\x00\x12I\n\x11\x65xt4_insert_range\x18\xb8\x01 \x01(\x0b\x32+.perfetto.protos.Ext4InsertRangeFtraceEventH\x00\x12N\n\x13\x65xt4_invalidatepage\x18\xb9\x01 \x01(\x0b\x32..perfetto.protos.Ext4InvalidatepageFtraceEventH\x00\x12K\n\x12\x65xt4_journal_start\x18\xba\x01 \x01(\x0b\x32,.perfetto.protos.Ext4JournalStartFtraceEventH\x00\x12\\\n\x1b\x65xt4_journal_start_reserved\x18\xbb\x01 \x01(\x0b\x32\x34.perfetto.protos.Ext4JournalStartReservedFtraceEventH\x00\x12\x63\n\x1e\x65xt4_journalled_invalidatepage\x18\xbc\x01 \x01(\x0b\x32\x38.perfetto.protos.Ext4JournalledInvalidatepageFtraceEventH\x00\x12X\n\x19\x65xt4_journalled_write_end\x18\xbd\x01 \x01(\x0b\x32\x32.perfetto.protos.Ext4JournalledWriteEndFtraceEventH\x00\x12\x45\n\x0f\x65xt4_load_inode\x18\xbe\x01 \x01(\x0b\x32).perfetto.protos.Ext4LoadInodeFtraceEventH\x00\x12R\n\x16\x65xt4_load_inode_bitmap\x18\xbf\x01 \x01(\x0b\x32/.perfetto.protos.Ext4LoadInodeBitmapFtraceEventH\x00\x12P\n\x15\x65xt4_mark_inode_dirty\x18\xc0\x01 \x01(\x0b\x32..perfetto.protos.Ext4MarkInodeDirtyFtraceEventH\x00\x12L\n\x13\x65xt4_mb_bitmap_load\x18\xc1\x01 \x01(\x0b\x32,.perfetto.protos.Ext4MbBitmapLoadFtraceEventH\x00\x12W\n\x19\x65xt4_mb_buddy_bitmap_load\x18\xc2\x01 \x01(\x0b\x32\x31.perfetto.protos.Ext4MbBuddyBitmapLoadFtraceEventH\x00\x12\x62\n\x1e\x65xt4_mb_discard_preallocations\x18\xc3\x01 \x01(\x0b\x32\x37.perfetto.protos.Ext4MbDiscardPreallocationsFtraceEventH\x00\x12M\n\x14\x65xt4_mb_new_group_pa\x18\xc4\x01 \x01(\x0b\x32,.perfetto.protos.Ext4MbNewGroupPaFtraceEventH\x00\x12M\n\x14\x65xt4_mb_new_inode_pa\x18\xc5\x01 \x01(\x0b\x32,.perfetto.protos.Ext4MbNewInodePaFtraceEventH\x00\x12U\n\x18\x65xt4_mb_release_group_pa\x18\xc6\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4MbReleaseGroupPaFtraceEventH\x00\x12U\n\x18\x65xt4_mb_release_inode_pa\x18\xc7\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4MbReleaseInodePaFtraceEventH\x00\x12K\n\x12\x65xt4_mballoc_alloc\x18\xc8\x01 \x01(\x0b\x32,.perfetto.protos.Ext4MballocAllocFtraceEventH\x00\x12O\n\x14\x65xt4_mballoc_discard\x18\xc9\x01 \x01(\x0b\x32..perfetto.protos.Ext4MballocDiscardFtraceEventH\x00\x12I\n\x11\x65xt4_mballoc_free\x18\xca\x01 \x01(\x0b\x32+.perfetto.protos.Ext4MballocFreeFtraceEventH\x00\x12Q\n\x15\x65xt4_mballoc_prealloc\x18\xcb\x01 \x01(\x0b\x32/.perfetto.protos.Ext4MballocPreallocFtraceEventH\x00\x12]\n\x1c\x65xt4_other_inode_update_time\x18\xcc\x01 \x01(\x0b\x32\x34.perfetto.protos.Ext4OtherInodeUpdateTimeFtraceEventH\x00\x12\x45\n\x0f\x65xt4_punch_hole\x18\xcd\x01 \x01(\x0b\x32).perfetto.protos.Ext4PunchHoleFtraceEventH\x00\x12[\n\x1b\x65xt4_read_block_bitmap_load\x18\xce\x01 \x01(\x0b\x32\x33.perfetto.protos.Ext4ReadBlockBitmapLoadFtraceEventH\x00\x12\x42\n\rext4_readpage\x18\xcf\x01 \x01(\x0b\x32(.perfetto.protos.Ext4ReadpageFtraceEventH\x00\x12H\n\x10\x65xt4_releasepage\x18\xd0\x01 \x01(\x0b\x32+.perfetto.protos.Ext4ReleasepageFtraceEventH\x00\x12K\n\x12\x65xt4_remove_blocks\x18\xd1\x01 \x01(\x0b\x32,.perfetto.protos.Ext4RemoveBlocksFtraceEventH\x00\x12M\n\x13\x65xt4_request_blocks\x18\xd2\x01 \x01(\x0b\x32-.perfetto.protos.Ext4RequestBlocksFtraceEventH\x00\x12K\n\x12\x65xt4_request_inode\x18\xd3\x01 \x01(\x0b\x32,.perfetto.protos.Ext4RequestInodeFtraceEventH\x00\x12?\n\x0c\x65xt4_sync_fs\x18\xd4\x01 \x01(\x0b\x32&.perfetto.protos.Ext4SyncFsFtraceEventH\x00\x12J\n\x12\x65xt4_trim_all_free\x18\xd5\x01 \x01(\x0b\x32+.perfetto.protos.Ext4TrimAllFreeFtraceEventH\x00\x12G\n\x10\x65xt4_trim_extent\x18\xd6\x01 \x01(\x0b\x32*.perfetto.protos.Ext4TrimExtentFtraceEventH\x00\x12M\n\x13\x65xt4_truncate_enter\x18\xd7\x01 \x01(\x0b\x32-.perfetto.protos.Ext4TruncateEnterFtraceEventH\x00\x12K\n\x12\x65xt4_truncate_exit\x18\xd8\x01 \x01(\x0b\x32,.perfetto.protos.Ext4TruncateExitFtraceEventH\x00\x12I\n\x11\x65xt4_unlink_enter\x18\xd9\x01 \x01(\x0b\x32+.perfetto.protos.Ext4UnlinkEnterFtraceEventH\x00\x12G\n\x10\x65xt4_unlink_exit\x18\xda\x01 \x01(\x0b\x32*.perfetto.protos.Ext4UnlinkExitFtraceEventH\x00\x12G\n\x10\x65xt4_write_begin\x18\xdb\x01 \x01(\x0b\x32*.perfetto.protos.Ext4WriteBeginFtraceEventH\x00\x12\x43\n\x0e\x65xt4_write_end\x18\xe6\x01 \x01(\x0b\x32(.perfetto.protos.Ext4WriteEndFtraceEventH\x00\x12\x44\n\x0e\x65xt4_writepage\x18\xe7\x01 \x01(\x0b\x32).perfetto.protos.Ext4WritepageFtraceEventH\x00\x12\x46\n\x0f\x65xt4_writepages\x18\xe8\x01 \x01(\x0b\x32*.perfetto.protos.Ext4WritepagesFtraceEventH\x00\x12S\n\x16\x65xt4_writepages_result\x18\xe9\x01 \x01(\x0b\x32\x30.perfetto.protos.Ext4WritepagesResultFtraceEventH\x00\x12\x45\n\x0f\x65xt4_zero_range\x18\xea\x01 \x01(\x0b\x32).perfetto.protos.Ext4ZeroRangeFtraceEventH\x00\x12@\n\x0ctask_newtask\x18\xeb\x01 \x01(\x0b\x32\'.perfetto.protos.TaskNewtaskFtraceEventH\x00\x12>\n\x0btask_rename\x18\xec\x01 \x01(\x0b\x32&.perfetto.protos.TaskRenameFtraceEventH\x00\x12K\n\x12sched_process_exec\x18\xed\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessExecFtraceEventH\x00\x12K\n\x12sched_process_exit\x18\xee\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessExitFtraceEventH\x00\x12K\n\x12sched_process_fork\x18\xef\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessForkFtraceEventH\x00\x12K\n\x12sched_process_free\x18\xf0\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessFreeFtraceEventH\x00\x12K\n\x12sched_process_hang\x18\xf1\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessHangFtraceEventH\x00\x12K\n\x12sched_process_wait\x18\xf2\x01 \x01(\x0b\x32,.perfetto.protos.SchedProcessWaitFtraceEventH\x00\x12J\n\x12\x66\x32\x66s_do_submit_bio\x18\xf3\x01 \x01(\x0b\x32+.perfetto.protos.F2fsDoSubmitBioFtraceEventH\x00\x12G\n\x10\x66\x32\x66s_evict_inode\x18\xf4\x01 \x01(\x0b\x32*.perfetto.protos.F2fsEvictInodeFtraceEventH\x00\x12\x44\n\x0e\x66\x32\x66s_fallocate\x18\xf5\x01 \x01(\x0b\x32).perfetto.protos.F2fsFallocateFtraceEventH\x00\x12L\n\x13\x66\x32\x66s_get_data_block\x18\xf6\x01 \x01(\x0b\x32,.perfetto.protos.F2fsGetDataBlockFtraceEventH\x00\x12\x45\n\x0f\x66\x32\x66s_get_victim\x18\xf7\x01 \x01(\x0b\x32).perfetto.protos.F2fsGetVictimFtraceEventH\x00\x12:\n\tf2fs_iget\x18\xf8\x01 \x01(\x0b\x32$.perfetto.protos.F2fsIgetFtraceEventH\x00\x12\x43\n\x0e\x66\x32\x66s_iget_exit\x18\xf9\x01 \x01(\x0b\x32(.perfetto.protos.F2fsIgetExitFtraceEventH\x00\x12\x43\n\x0e\x66\x32\x66s_new_inode\x18\xfa\x01 \x01(\x0b\x32(.perfetto.protos.F2fsNewInodeFtraceEventH\x00\x12\x42\n\rf2fs_readpage\x18\xfb\x01 \x01(\x0b\x32(.perfetto.protos.F2fsReadpageFtraceEventH\x00\x12R\n\x16\x66\x32\x66s_reserve_new_block\x18\xfc\x01 \x01(\x0b\x32/.perfetto.protos.F2fsReserveNewBlockFtraceEventH\x00\x12L\n\x13\x66\x32\x66s_set_page_dirty\x18\xfd\x01 \x01(\x0b\x32,.perfetto.protos.F2fsSetPageDirtyFtraceEventH\x00\x12R\n\x16\x66\x32\x66s_submit_write_page\x18\xfe\x01 \x01(\x0b\x32/.perfetto.protos.F2fsSubmitWritePageFtraceEventH\x00\x12N\n\x14\x66\x32\x66s_sync_file_enter\x18\xff\x01 \x01(\x0b\x32-.perfetto.protos.F2fsSyncFileEnterFtraceEventH\x00\x12L\n\x13\x66\x32\x66s_sync_file_exit\x18\x80\x02 \x01(\x0b\x32,.perfetto.protos.F2fsSyncFileExitFtraceEventH\x00\x12?\n\x0c\x66\x32\x66s_sync_fs\x18\x81\x02 \x01(\x0b\x32&.perfetto.protos.F2fsSyncFsFtraceEventH\x00\x12\x42\n\rf2fs_truncate\x18\x82\x02 \x01(\x0b\x32(.perfetto.protos.F2fsTruncateFtraceEventH\x00\x12Z\n\x1a\x66\x32\x66s_truncate_blocks_enter\x18\x83\x02 \x01(\x0b\x32\x33.perfetto.protos.F2fsTruncateBlocksEnterFtraceEventH\x00\x12X\n\x19\x66\x32\x66s_truncate_blocks_exit\x18\x84\x02 \x01(\x0b\x32\x32.perfetto.protos.F2fsTruncateBlocksExitFtraceEventH\x00\x12\x63\n\x1f\x66\x32\x66s_truncate_data_blocks_range\x18\x85\x02 \x01(\x0b\x32\x37.perfetto.protos.F2fsTruncateDataBlocksRangeFtraceEventH\x00\x12\x65\n f2fs_truncate_inode_blocks_enter\x18\x86\x02 \x01(\x0b\x32\x38.perfetto.protos.F2fsTruncateInodeBlocksEnterFtraceEventH\x00\x12\x63\n\x1f\x66\x32\x66s_truncate_inode_blocks_exit\x18\x87\x02 \x01(\x0b\x32\x37.perfetto.protos.F2fsTruncateInodeBlocksExitFtraceEventH\x00\x12K\n\x12\x66\x32\x66s_truncate_node\x18\x88\x02 \x01(\x0b\x32,.perfetto.protos.F2fsTruncateNodeFtraceEventH\x00\x12X\n\x19\x66\x32\x66s_truncate_nodes_enter\x18\x89\x02 \x01(\x0b\x32\x32.perfetto.protos.F2fsTruncateNodesEnterFtraceEventH\x00\x12V\n\x18\x66\x32\x66s_truncate_nodes_exit\x18\x8a\x02 \x01(\x0b\x32\x31.perfetto.protos.F2fsTruncateNodesExitFtraceEventH\x00\x12\\\n\x1b\x66\x32\x66s_truncate_partial_nodes\x18\x8b\x02 \x01(\x0b\x32\x34.perfetto.protos.F2fsTruncatePartialNodesFtraceEventH\x00\x12I\n\x11\x66\x32\x66s_unlink_enter\x18\x8c\x02 \x01(\x0b\x32+.perfetto.protos.F2fsUnlinkEnterFtraceEventH\x00\x12G\n\x10\x66\x32\x66s_unlink_exit\x18\x8d\x02 \x01(\x0b\x32*.perfetto.protos.F2fsUnlinkExitFtraceEventH\x00\x12N\n\x14\x66\x32\x66s_vm_page_mkwrite\x18\x8e\x02 \x01(\x0b\x32-.perfetto.protos.F2fsVmPageMkwriteFtraceEventH\x00\x12G\n\x10\x66\x32\x66s_write_begin\x18\x8f\x02 \x01(\x0b\x32*.perfetto.protos.F2fsWriteBeginFtraceEventH\x00\x12Q\n\x15\x66\x32\x66s_write_checkpoint\x18\x90\x02 \x01(\x0b\x32/.perfetto.protos.F2fsWriteCheckpointFtraceEventH\x00\x12\x43\n\x0e\x66\x32\x66s_write_end\x18\x91\x02 \x01(\x0b\x32(.perfetto.protos.F2fsWriteEndFtraceEventH\x00\x12P\n\x15\x61lloc_pages_iommu_end\x18\x92\x02 \x01(\x0b\x32..perfetto.protos.AllocPagesIommuEndFtraceEventH\x00\x12R\n\x16\x61lloc_pages_iommu_fail\x18\x93\x02 \x01(\x0b\x32/.perfetto.protos.AllocPagesIommuFailFtraceEventH\x00\x12T\n\x17\x61lloc_pages_iommu_start\x18\x94\x02 \x01(\x0b\x32\x30.perfetto.protos.AllocPagesIommuStartFtraceEventH\x00\x12L\n\x13\x61lloc_pages_sys_end\x18\x95\x02 \x01(\x0b\x32,.perfetto.protos.AllocPagesSysEndFtraceEventH\x00\x12N\n\x14\x61lloc_pages_sys_fail\x18\x96\x02 \x01(\x0b\x32-.perfetto.protos.AllocPagesSysFailFtraceEventH\x00\x12P\n\x15\x61lloc_pages_sys_start\x18\x97\x02 \x01(\x0b\x32..perfetto.protos.AllocPagesSysStartFtraceEventH\x00\x12Z\n\x1a\x64ma_alloc_contiguous_retry\x18\x98\x02 \x01(\x0b\x32\x33.perfetto.protos.DmaAllocContiguousRetryFtraceEventH\x00\x12\x45\n\x0fiommu_map_range\x18\x99\x02 \x01(\x0b\x32).perfetto.protos.IommuMapRangeFtraceEventH\x00\x12\\\n\x1ciommu_sec_ptbl_map_range_end\x18\x9a\x02 \x01(\x0b\x32\x33.perfetto.protos.IommuSecPtblMapRangeEndFtraceEventH\x00\x12`\n\x1eiommu_sec_ptbl_map_range_start\x18\x9b\x02 \x01(\x0b\x32\x35.perfetto.protos.IommuSecPtblMapRangeStartFtraceEventH\x00\x12N\n\x14ion_alloc_buffer_end\x18\x9c\x02 \x01(\x0b\x32-.perfetto.protos.IonAllocBufferEndFtraceEventH\x00\x12P\n\x15ion_alloc_buffer_fail\x18\x9d\x02 \x01(\x0b\x32..perfetto.protos.IonAllocBufferFailFtraceEventH\x00\x12X\n\x19ion_alloc_buffer_fallback\x18\x9e\x02 \x01(\x0b\x32\x32.perfetto.protos.IonAllocBufferFallbackFtraceEventH\x00\x12R\n\x16ion_alloc_buffer_start\x18\x9f\x02 \x01(\x0b\x32/.perfetto.protos.IonAllocBufferStartFtraceEventH\x00\x12J\n\x12ion_cp_alloc_retry\x18\xa0\x02 \x01(\x0b\x32+.perfetto.protos.IonCpAllocRetryFtraceEventH\x00\x12U\n\x18ion_cp_secure_buffer_end\x18\xa1\x02 \x01(\x0b\x32\x30.perfetto.protos.IonCpSecureBufferEndFtraceEventH\x00\x12Y\n\x1aion_cp_secure_buffer_start\x18\xa2\x02 \x01(\x0b\x32\x32.perfetto.protos.IonCpSecureBufferStartFtraceEventH\x00\x12\x46\n\x0fion_prefetching\x18\xa3\x02 \x01(\x0b\x32*.perfetto.protos.IonPrefetchingFtraceEventH\x00\x12_\n\x1eion_secure_cma_add_to_pool_end\x18\xa4\x02 \x01(\x0b\x32\x34.perfetto.protos.IonSecureCmaAddToPoolEndFtraceEventH\x00\x12\x63\n ion_secure_cma_add_to_pool_start\x18\xa5\x02 \x01(\x0b\x32\x36.perfetto.protos.IonSecureCmaAddToPoolStartFtraceEventH\x00\x12[\n\x1bion_secure_cma_allocate_end\x18\xa6\x02 \x01(\x0b\x32\x33.perfetto.protos.IonSecureCmaAllocateEndFtraceEventH\x00\x12_\n\x1dion_secure_cma_allocate_start\x18\xa7\x02 \x01(\x0b\x32\x35.perfetto.protos.IonSecureCmaAllocateStartFtraceEventH\x00\x12`\n\x1eion_secure_cma_shrink_pool_end\x18\xa8\x02 \x01(\x0b\x32\x35.perfetto.protos.IonSecureCmaShrinkPoolEndFtraceEventH\x00\x12\x64\n ion_secure_cma_shrink_pool_start\x18\xa9\x02 \x01(\x0b\x32\x37.perfetto.protos.IonSecureCmaShrinkPoolStartFtraceEventH\x00\x12\x33\n\x05kfree\x18\xaa\x02 \x01(\x0b\x32!.perfetto.protos.KfreeFtraceEventH\x00\x12\x37\n\x07kmalloc\x18\xab\x02 \x01(\x0b\x32#.perfetto.protos.KmallocFtraceEventH\x00\x12@\n\x0ckmalloc_node\x18\xac\x02 \x01(\x0b\x32\'.perfetto.protos.KmallocNodeFtraceEventH\x00\x12G\n\x10kmem_cache_alloc\x18\xad\x02 \x01(\x0b\x32*.perfetto.protos.KmemCacheAllocFtraceEventH\x00\x12P\n\x15kmem_cache_alloc_node\x18\xae\x02 \x01(\x0b\x32..perfetto.protos.KmemCacheAllocNodeFtraceEventH\x00\x12\x45\n\x0fkmem_cache_free\x18\xaf\x02 \x01(\x0b\x32).perfetto.protos.KmemCacheFreeFtraceEventH\x00\x12I\n\x11migrate_pages_end\x18\xb0\x02 \x01(\x0b\x32+.perfetto.protos.MigratePagesEndFtraceEventH\x00\x12M\n\x13migrate_pages_start\x18\xb1\x02 \x01(\x0b\x32-.perfetto.protos.MigratePagesStartFtraceEventH\x00\x12\x42\n\rmigrate_retry\x18\xb2\x02 \x01(\x0b\x32(.perfetto.protos.MigrateRetryFtraceEventH\x00\x12\x41\n\rmm_page_alloc\x18\xb3\x02 \x01(\x0b\x32\'.perfetto.protos.MmPageAllocFtraceEventH\x00\x12P\n\x15mm_page_alloc_extfrag\x18\xb4\x02 \x01(\x0b\x32..perfetto.protos.MmPageAllocExtfragFtraceEventH\x00\x12W\n\x19mm_page_alloc_zone_locked\x18\xb5\x02 \x01(\x0b\x32\x31.perfetto.protos.MmPageAllocZoneLockedFtraceEventH\x00\x12?\n\x0cmm_page_free\x18\xb6\x02 \x01(\x0b\x32&.perfetto.protos.MmPageFreeFtraceEventH\x00\x12N\n\x14mm_page_free_batched\x18\xb7\x02 \x01(\x0b\x32-.perfetto.protos.MmPageFreeBatchedFtraceEventH\x00\x12J\n\x12mm_page_pcpu_drain\x18\xb8\x02 \x01(\x0b\x32+.perfetto.protos.MmPagePcpuDrainFtraceEventH\x00\x12\x38\n\x08rss_stat\x18\xb9\x02 \x01(\x0b\x32#.perfetto.protos.RssStatFtraceEventH\x00\x12\x45\n\x0fion_heap_shrink\x18\xba\x02 \x01(\x0b\x32).perfetto.protos.IonHeapShrinkFtraceEventH\x00\x12\x41\n\rion_heap_grow\x18\xbb\x02 \x01(\x0b\x32\'.perfetto.protos.IonHeapGrowFtraceEventH\x00\x12<\n\nfence_init\x18\xbc\x02 \x01(\x0b\x32%.perfetto.protos.FenceInitFtraceEventH\x00\x12\x42\n\rfence_destroy\x18\xbd\x02 \x01(\x0b\x32(.perfetto.protos.FenceDestroyFtraceEventH\x00\x12M\n\x13\x66\x65nce_enable_signal\x18\xbe\x02 \x01(\x0b\x32-.perfetto.protos.FenceEnableSignalFtraceEventH\x00\x12\x44\n\x0e\x66\x65nce_signaled\x18\xbf\x02 \x01(\x0b\x32).perfetto.protos.FenceSignaledFtraceEventH\x00\x12<\n\nclk_enable\x18\xc0\x02 \x01(\x0b\x32%.perfetto.protos.ClkEnableFtraceEventH\x00\x12>\n\x0b\x63lk_disable\x18\xc1\x02 \x01(\x0b\x32&.perfetto.protos.ClkDisableFtraceEventH\x00\x12?\n\x0c\x63lk_set_rate\x18\xc2\x02 \x01(\x0b\x32&.perfetto.protos.ClkSetRateFtraceEventH\x00\x12^\n\x1c\x62inder_transaction_alloc_buf\x18\xc3\x02 \x01(\x0b\x32\x35.perfetto.protos.BinderTransactionAllocBufFtraceEventH\x00\x12\x44\n\x0esignal_deliver\x18\xc4\x02 \x01(\x0b\x32).perfetto.protos.SignalDeliverFtraceEventH\x00\x12\x46\n\x0fsignal_generate\x18\xc5\x02 \x01(\x0b\x32*.perfetto.protos.SignalGenerateFtraceEventH\x00\x12N\n\x14oom_score_adj_update\x18\xc6\x02 \x01(\x0b\x32-.perfetto.protos.OomScoreAdjUpdateFtraceEventH\x00\x12\x37\n\x07generic\x18\xc7\x02 \x01(\x0b\x32#.perfetto.protos.GenericFtraceEventH\x00\x12\x45\n\x0fmm_event_record\x18\xc8\x02 \x01(\x0b\x32).perfetto.protos.MmEventRecordFtraceEventH\x00\x12:\n\tsys_enter\x18\xc9\x02 \x01(\x0b\x32$.perfetto.protos.SysEnterFtraceEventH\x00\x12\x38\n\x08sys_exit\x18\xca\x02 \x01(\x0b\x32#.perfetto.protos.SysExitFtraceEventH\x00\x12\x31\n\x04zero\x18\xcb\x02 \x01(\x0b\x32 .perfetto.protos.ZeroFtraceEventH\x00\x12\x42\n\rgpu_frequency\x18\xcc\x02 \x01(\x0b\x32(.perfetto.protos.GpuFrequencyFtraceEventH\x00\x12R\n\x16sde_tracing_mark_write\x18\xcd\x02 \x01(\x0b\x32/.perfetto.protos.SdeTracingMarkWriteFtraceEventH\x00\x12>\n\x0bmark_victim\x18\xce\x02 \x01(\x0b\x32&.perfetto.protos.MarkVictimFtraceEventH\x00\x12\x38\n\x08ion_stat\x18\xcf\x02 \x01(\x0b\x32#.perfetto.protos.IonStatFtraceEventH\x00\x12I\n\x11ion_buffer_create\x18\xd0\x02 \x01(\x0b\x32+.perfetto.protos.IonBufferCreateFtraceEventH\x00\x12K\n\x12ion_buffer_destroy\x18\xd1\x02 \x01(\x0b\x32,.perfetto.protos.IonBufferDestroyFtraceEventH\x00\x12\x43\n\x0escm_call_start\x18\xd2\x02 \x01(\x0b\x32(.perfetto.protos.ScmCallStartFtraceEventH\x00\x12?\n\x0cscm_call_end\x18\xd3\x02 \x01(\x0b\x32&.perfetto.protos.ScmCallEndFtraceEventH\x00\x12\x41\n\rgpu_mem_total\x18\xd4\x02 \x01(\x0b\x32\'.perfetto.protos.GpuMemTotalFtraceEventH\x00\x12N\n\x13thermal_temperature\x18\xd5\x02 \x01(\x0b\x32..perfetto.protos.ThermalTemperatureFtraceEventH\x00\x12>\n\x0b\x63\x64\x65v_update\x18\xd6\x02 \x01(\x0b\x32&.perfetto.protos.CdevUpdateFtraceEventH\x00\x12<\n\ncpuhp_exit\x18\xd7\x02 \x01(\x0b\x32%.perfetto.protos.CpuhpExitFtraceEventH\x00\x12I\n\x11\x63puhp_multi_enter\x18\xd8\x02 \x01(\x0b\x32+.perfetto.protos.CpuhpMultiEnterFtraceEventH\x00\x12>\n\x0b\x63puhp_enter\x18\xd9\x02 \x01(\x0b\x32&.perfetto.protos.CpuhpEnterFtraceEventH\x00\x12\x42\n\rcpuhp_latency\x18\xda\x02 \x01(\x0b\x32(.perfetto.protos.CpuhpLatencyFtraceEventH\x00\x12G\n\x10\x66\x61strpc_dma_stat\x18\xdb\x02 \x01(\x0b\x32*.perfetto.protos.FastrpcDmaStatFtraceEventH\x00\x12R\n\x16\x64pu_tracing_mark_write\x18\xdc\x02 \x01(\x0b\x32/.perfetto.protos.DpuTracingMarkWriteFtraceEventH\x00\x12R\n\x16g2d_tracing_mark_write\x18\xdd\x02 \x01(\x0b\x32/.perfetto.protos.G2dTracingMarkWriteFtraceEventH\x00\x12T\n\x17mali_tracing_mark_write\x18\xde\x02 \x01(\x0b\x32\x30.perfetto.protos.MaliTracingMarkWriteFtraceEventH\x00\x12\x41\n\rdma_heap_stat\x18\xdf\x02 \x01(\x0b\x32\'.perfetto.protos.DmaHeapStatFtraceEventH\x00\x12>\n\x0b\x63puhp_pause\x18\xe0\x02 \x01(\x0b\x32&.perfetto.protos.CpuhpPauseFtraceEventH\x00\x12G\n\x10sched_pi_setprio\x18\xe1\x02 \x01(\x0b\x32*.perfetto.protos.SchedPiSetprioFtraceEventH\x00\x12\x43\n\x0esde_sde_evtlog\x18\xe2\x02 \x01(\x0b\x32(.perfetto.protos.SdeSdeEvtlogFtraceEventH\x00\x12Q\n\x16sde_sde_perf_calc_crtc\x18\xe3\x02 \x01(\x0b\x32..perfetto.protos.SdeSdePerfCalcCrtcFtraceEventH\x00\x12U\n\x18sde_sde_perf_crtc_update\x18\xe4\x02 \x01(\x0b\x32\x30.perfetto.protos.SdeSdePerfCrtcUpdateFtraceEventH\x00\x12V\n\x19sde_sde_perf_set_qos_luts\x18\xe5\x02 \x01(\x0b\x32\x30.perfetto.protos.SdeSdePerfSetQosLutsFtraceEventH\x00\x12S\n\x17sde_sde_perf_update_bus\x18\xe6\x02 \x01(\x0b\x32/.perfetto.protos.SdeSdePerfUpdateBusFtraceEventH\x00\x12K\n\x12rss_stat_throttled\x18\xe7\x02 \x01(\x0b\x32,.perfetto.protos.RssStatThrottledFtraceEventH\x00\x12I\n\x11netif_receive_skb\x18\xe8\x02 \x01(\x0b\x32+.perfetto.protos.NetifReceiveSkbFtraceEventH\x00\x12?\n\x0cnet_dev_xmit\x18\xe9\x02 \x01(\x0b\x32&.perfetto.protos.NetDevXmitFtraceEventH\x00\x12L\n\x13inet_sock_set_state\x18\xea\x02 \x01(\x0b\x32,.perfetto.protos.InetSockSetStateFtraceEventH\x00\x12K\n\x12tcp_retransmit_skb\x18\xeb\x02 \x01(\x0b\x32,.perfetto.protos.TcpRetransmitSkbFtraceEventH\x00\x12R\n\x16\x63ros_ec_sensorhub_data\x18\xec\x02 \x01(\x0b\x32/.perfetto.protos.CrosEcSensorhubDataFtraceEventH\x00\x12R\n\x16napi_gro_receive_entry\x18\xed\x02 \x01(\x0b\x32/.perfetto.protos.NapiGroReceiveEntryFtraceEventH\x00\x12P\n\x15napi_gro_receive_exit\x18\xee\x02 \x01(\x0b\x32..perfetto.protos.NapiGroReceiveExitFtraceEventH\x00\x12:\n\tkfree_skb\x18\xef\x02 \x01(\x0b\x32$.perfetto.protos.KfreeSkbFtraceEventH\x00\x12G\n\x10kvm_access_fault\x18\xf0\x02 \x01(\x0b\x32*.perfetto.protos.KvmAccessFaultFtraceEventH\x00\x12=\n\x0bkvm_ack_irq\x18\xf1\x02 \x01(\x0b\x32%.perfetto.protos.KvmAckIrqFtraceEventH\x00\x12=\n\x0bkvm_age_hva\x18\xf2\x02 \x01(\x0b\x32%.perfetto.protos.KvmAgeHvaFtraceEventH\x00\x12?\n\x0ckvm_age_page\x18\xf3\x02 \x01(\x0b\x32&.perfetto.protos.KvmAgePageFtraceEventH\x00\x12L\n\x13kvm_arm_clear_debug\x18\xf4\x02 \x01(\x0b\x32,.perfetto.protos.KvmArmClearDebugFtraceEventH\x00\x12J\n\x12kvm_arm_set_dreg32\x18\xf5\x02 \x01(\x0b\x32+.perfetto.protos.KvmArmSetDreg32FtraceEventH\x00\x12J\n\x12kvm_arm_set_regset\x18\xf6\x02 \x01(\x0b\x32+.perfetto.protos.KvmArmSetRegsetFtraceEventH\x00\x12L\n\x13kvm_arm_setup_debug\x18\xf7\x02 \x01(\x0b\x32,.perfetto.protos.KvmArmSetupDebugFtraceEventH\x00\x12:\n\tkvm_entry\x18\xf8\x02 \x01(\x0b\x32$.perfetto.protos.KvmEntryFtraceEventH\x00\x12\x38\n\x08kvm_exit\x18\xf9\x02 \x01(\x0b\x32#.perfetto.protos.KvmExitFtraceEventH\x00\x12\x36\n\x07kvm_fpu\x18\xfa\x02 \x01(\x0b\x32\".perfetto.protos.KvmFpuFtraceEventH\x00\x12H\n\x11kvm_get_timer_map\x18\xfb\x02 \x01(\x0b\x32*.perfetto.protos.KvmGetTimerMapFtraceEventH\x00\x12\x45\n\x0fkvm_guest_fault\x18\xfc\x02 \x01(\x0b\x32).perfetto.protos.KvmGuestFaultFtraceEventH\x00\x12J\n\x12kvm_handle_sys_reg\x18\xfd\x02 \x01(\x0b\x32+.perfetto.protos.KvmHandleSysRegFtraceEventH\x00\x12\x41\n\rkvm_hvc_arm64\x18\xfe\x02 \x01(\x0b\x32\'.perfetto.protos.KvmHvcArm64FtraceEventH\x00\x12?\n\x0ckvm_irq_line\x18\xff\x02 \x01(\x0b\x32&.perfetto.protos.KvmIrqLineFtraceEventH\x00\x12\x38\n\x08kvm_mmio\x18\x80\x03 \x01(\x0b\x32#.perfetto.protos.KvmMmioFtraceEventH\x00\x12G\n\x10kvm_mmio_emulate\x18\x81\x03 \x01(\x0b\x32*.perfetto.protos.KvmMmioEmulateFtraceEventH\x00\x12L\n\x13kvm_set_guest_debug\x18\x82\x03 \x01(\x0b\x32,.perfetto.protos.KvmSetGuestDebugFtraceEventH\x00\x12=\n\x0bkvm_set_irq\x18\x83\x03 \x01(\x0b\x32%.perfetto.protos.KvmSetIrqFtraceEventH\x00\x12\x46\n\x10kvm_set_spte_hva\x18\x84\x03 \x01(\x0b\x32).perfetto.protos.KvmSetSpteHvaFtraceEventH\x00\x12H\n\x11kvm_set_way_flush\x18\x85\x03 \x01(\x0b\x32*.perfetto.protos.KvmSetWayFlushFtraceEventH\x00\x12\x43\n\x0ekvm_sys_access\x18\x86\x03 \x01(\x0b\x32(.perfetto.protos.KvmSysAccessFtraceEventH\x00\x12\x46\n\x10kvm_test_age_hva\x18\x87\x03 \x01(\x0b\x32).perfetto.protos.KvmTestAgeHvaFtraceEventH\x00\x12I\n\x11kvm_timer_emulate\x18\x88\x03 \x01(\x0b\x32+.perfetto.protos.KvmTimerEmulateFtraceEventH\x00\x12V\n\x18kvm_timer_hrtimer_expire\x18\x89\x03 \x01(\x0b\x32\x31.perfetto.protos.KvmTimerHrtimerExpireFtraceEventH\x00\x12T\n\x17kvm_timer_restore_state\x18\x8a\x03 \x01(\x0b\x32\x30.perfetto.protos.KvmTimerRestoreStateFtraceEventH\x00\x12N\n\x14kvm_timer_save_state\x18\x8b\x03 \x01(\x0b\x32-.perfetto.protos.KvmTimerSaveStateFtraceEventH\x00\x12N\n\x14kvm_timer_update_irq\x18\x8c\x03 \x01(\x0b\x32-.perfetto.protos.KvmTimerUpdateIrqFtraceEventH\x00\x12G\n\x10kvm_toggle_cache\x18\x8d\x03 \x01(\x0b\x32*.perfetto.protos.KvmToggleCacheFtraceEventH\x00\x12L\n\x13kvm_unmap_hva_range\x18\x8e\x03 \x01(\x0b\x32,.perfetto.protos.KvmUnmapHvaRangeFtraceEventH\x00\x12K\n\x12kvm_userspace_exit\x18\x8f\x03 \x01(\x0b\x32,.perfetto.protos.KvmUserspaceExitFtraceEventH\x00\x12\x45\n\x0fkvm_vcpu_wakeup\x18\x90\x03 \x01(\x0b\x32).perfetto.protos.KvmVcpuWakeupFtraceEventH\x00\x12\x41\n\rkvm_wfx_arm64\x18\x91\x03 \x01(\x0b\x32\'.perfetto.protos.KvmWfxArm64FtraceEventH\x00\x12\x38\n\x08trap_reg\x18\x92\x03 \x01(\x0b\x32#.perfetto.protos.TrapRegFtraceEventH\x00\x12T\n\x17vgic_update_irq_pending\x18\x93\x03 \x01(\x0b\x32\x30.perfetto.protos.VgicUpdateIrqPendingFtraceEventH\x00\x12S\n\x16wakeup_source_activate\x18\x94\x03 \x01(\x0b\x32\x30.perfetto.protos.WakeupSourceActivateFtraceEventH\x00\x12W\n\x18wakeup_source_deactivate\x18\x95\x03 \x01(\x0b\x32\x32.perfetto.protos.WakeupSourceDeactivateFtraceEventH\x00\x12\x44\n\x0eufshcd_command\x18\x96\x03 \x01(\x0b\x32).perfetto.protos.UfshcdCommandFtraceEventH\x00\x12I\n\x11ufshcd_clk_gating\x18\x97\x03 \x01(\x0b\x32+.perfetto.protos.UfshcdClkGatingFtraceEventH\x00\x12\x37\n\x07\x63onsole\x18\x98\x03 \x01(\x0b\x32#.perfetto.protos.ConsoleFtraceEventH\x00\x12G\n\x10\x64rm_vblank_event\x18\x99\x03 \x01(\x0b\x32*.perfetto.protos.DrmVblankEventFtraceEventH\x00\x12Z\n\x1a\x64rm_vblank_event_delivered\x18\x9a\x03 \x01(\x0b\x32\x33.perfetto.protos.DrmVblankEventDeliveredFtraceEventH\x00\x12\x41\n\rdrm_sched_job\x18\x9b\x03 \x01(\x0b\x32\'.perfetto.protos.DrmSchedJobFtraceEventH\x00\x12=\n\x0b\x64rm_run_job\x18\x9c\x03 \x01(\x0b\x32%.perfetto.protos.DrmRunJobFtraceEventH\x00\x12P\n\x15\x64rm_sched_process_job\x18\x9d\x03 \x01(\x0b\x32..perfetto.protos.DrmSchedProcessJobFtraceEventH\x00\x12\x43\n\x0e\x64ma_fence_init\x18\x9e\x03 \x01(\x0b\x32(.perfetto.protos.DmaFenceInitFtraceEventH\x00\x12\x43\n\x0e\x64ma_fence_emit\x18\x9f\x03 \x01(\x0b\x32(.perfetto.protos.DmaFenceEmitFtraceEventH\x00\x12K\n\x12\x64ma_fence_signaled\x18\xa0\x03 \x01(\x0b\x32,.perfetto.protos.DmaFenceSignaledFtraceEventH\x00\x12N\n\x14\x64ma_fence_wait_start\x18\xa1\x03 \x01(\x0b\x32-.perfetto.protos.DmaFenceWaitStartFtraceEventH\x00\x12J\n\x12\x64ma_fence_wait_end\x18\xa2\x03 \x01(\x0b\x32+.perfetto.protos.DmaFenceWaitEndFtraceEventH\x00\x12>\n\x0b\x66\x32\x66s_iostat\x18\xa3\x03 \x01(\x0b\x32&.perfetto.protos.F2fsIostatFtraceEventH\x00\x12M\n\x13\x66\x32\x66s_iostat_latency\x18\xa4\x03 \x01(\x0b\x32-.perfetto.protos.F2fsIostatLatencyFtraceEventH\x00\x12J\n\x12sched_cpu_util_cfs\x18\xa5\x03 \x01(\x0b\x32+.perfetto.protos.SchedCpuUtilCfsFtraceEventH\x00\x12:\n\tv4l2_qbuf\x18\xa6\x03 \x01(\x0b\x32$.perfetto.protos.V4l2QbufFtraceEventH\x00\x12<\n\nv4l2_dqbuf\x18\xa7\x03 \x01(\x0b\x32%.perfetto.protos.V4l2DqbufFtraceEventH\x00\x12J\n\x12vb2_v4l2_buf_queue\x18\xa8\x03 \x01(\x0b\x32+.perfetto.protos.Vb2V4l2BufQueueFtraceEventH\x00\x12H\n\x11vb2_v4l2_buf_done\x18\xa9\x03 \x01(\x0b\x32*.perfetto.protos.Vb2V4l2BufDoneFtraceEventH\x00\x12\x41\n\rvb2_v4l2_qbuf\x18\xaa\x03 \x01(\x0b\x32\'.perfetto.protos.Vb2V4l2QbufFtraceEventH\x00\x12\x43\n\x0evb2_v4l2_dqbuf\x18\xab\x03 \x01(\x0b\x32(.perfetto.protos.Vb2V4l2DqbufFtraceEventH\x00\x12L\n\x13\x64si_cmd_fifo_status\x18\xac\x03 \x01(\x0b\x32,.perfetto.protos.DsiCmdFifoStatusFtraceEventH\x00\x12\x34\n\x06\x64si_rx\x18\xad\x03 \x01(\x0b\x32!.perfetto.protos.DsiRxFtraceEventH\x00\x12\x34\n\x06\x64si_tx\x18\xae\x03 \x01(\x0b\x32!.perfetto.protos.DsiTxFtraceEventH\x00\x12T\n\x17\x61ndroid_fs_dataread_end\x18\xaf\x03 \x01(\x0b\x32\x30.perfetto.protos.AndroidFsDatareadEndFtraceEventH\x00\x12X\n\x19\x61ndroid_fs_dataread_start\x18\xb0\x03 \x01(\x0b\x32\x32.perfetto.protos.AndroidFsDatareadStartFtraceEventH\x00\x12V\n\x18\x61ndroid_fs_datawrite_end\x18\xb1\x03 \x01(\x0b\x32\x31.perfetto.protos.AndroidFsDatawriteEndFtraceEventH\x00\x12Z\n\x1a\x61ndroid_fs_datawrite_start\x18\xb2\x03 \x01(\x0b\x32\x33.perfetto.protos.AndroidFsDatawriteStartFtraceEventH\x00\x12N\n\x14\x61ndroid_fs_fsync_end\x18\xb3\x03 \x01(\x0b\x32-.perfetto.protos.AndroidFsFsyncEndFtraceEventH\x00\x12R\n\x16\x61ndroid_fs_fsync_start\x18\xb4\x03 \x01(\x0b\x32/.perfetto.protos.AndroidFsFsyncStartFtraceEventH\x00\x12\x46\n\x0f\x66uncgraph_entry\x18\xb5\x03 \x01(\x0b\x32*.perfetto.protos.FuncgraphEntryFtraceEventH\x00\x12\x44\n\x0e\x66uncgraph_exit\x18\xb6\x03 \x01(\x0b\x32).perfetto.protos.FuncgraphExitFtraceEventH\x00\x12G\n\x10virtio_video_cmd\x18\xb7\x03 \x01(\x0b\x32*.perfetto.protos.VirtioVideoCmdFtraceEventH\x00\x12P\n\x15virtio_video_cmd_done\x18\xb8\x03 \x01(\x0b\x32..perfetto.protos.VirtioVideoCmdDoneFtraceEventH\x00\x12\\\n\x1bvirtio_video_resource_queue\x18\xb9\x03 \x01(\x0b\x32\x34.perfetto.protos.VirtioVideoResourceQueueFtraceEventH\x00\x12\x65\n virtio_video_resource_queue_done\x18\xba\x03 \x01(\x0b\x32\x38.perfetto.protos.VirtioVideoResourceQueueDoneFtraceEventH\x00\x12N\n\x14mm_shrink_slab_start\x18\xbb\x03 \x01(\x0b\x32-.perfetto.protos.MmShrinkSlabStartFtraceEventH\x00\x12J\n\x12mm_shrink_slab_end\x18\xbc\x03 \x01(\x0b\x32+.perfetto.protos.MmShrinkSlabEndFtraceEventH\x00\x12<\n\ntrusty_smc\x18\xbd\x03 \x01(\x0b\x32%.perfetto.protos.TrustySmcFtraceEventH\x00\x12\x45\n\x0ftrusty_smc_done\x18\xbe\x03 \x01(\x0b\x32).perfetto.protos.TrustySmcDoneFtraceEventH\x00\x12I\n\x11trusty_std_call32\x18\xbf\x03 \x01(\x0b\x32+.perfetto.protos.TrustyStdCall32FtraceEventH\x00\x12R\n\x16trusty_std_call32_done\x18\xc0\x03 \x01(\x0b\x32/.perfetto.protos.TrustyStdCall32DoneFtraceEventH\x00\x12M\n\x13trusty_share_memory\x18\xc1\x03 \x01(\x0b\x32-.perfetto.protos.TrustyShareMemoryFtraceEventH\x00\x12V\n\x18trusty_share_memory_done\x18\xc2\x03 \x01(\x0b\x32\x31.perfetto.protos.TrustyShareMemoryDoneFtraceEventH\x00\x12Q\n\x15trusty_reclaim_memory\x18\xc3\x03 \x01(\x0b\x32/.perfetto.protos.TrustyReclaimMemoryFtraceEventH\x00\x12Z\n\x1atrusty_reclaim_memory_done\x18\xc4\x03 \x01(\x0b\x32\x33.perfetto.protos.TrustyReclaimMemoryDoneFtraceEventH\x00\x12<\n\ntrusty_irq\x18\xc5\x03 \x01(\x0b\x32%.perfetto.protos.TrustyIrqFtraceEventH\x00\x12T\n\x17trusty_ipc_handle_event\x18\xc6\x03 \x01(\x0b\x32\x30.perfetto.protos.TrustyIpcHandleEventFtraceEventH\x00\x12K\n\x12trusty_ipc_connect\x18\xc7\x03 \x01(\x0b\x32,.perfetto.protos.TrustyIpcConnectFtraceEventH\x00\x12R\n\x16trusty_ipc_connect_end\x18\xc8\x03 \x01(\x0b\x32/.perfetto.protos.TrustyIpcConnectEndFtraceEventH\x00\x12G\n\x10trusty_ipc_write\x18\xc9\x03 \x01(\x0b\x32*.perfetto.protos.TrustyIpcWriteFtraceEventH\x00\x12\x45\n\x0ftrusty_ipc_poll\x18\xca\x03 \x01(\x0b\x32).perfetto.protos.TrustyIpcPollFtraceEventH\x00\x12\x45\n\x0ftrusty_ipc_read\x18\xcc\x03 \x01(\x0b\x32).perfetto.protos.TrustyIpcReadFtraceEventH\x00\x12L\n\x13trusty_ipc_read_end\x18\xcd\x03 \x01(\x0b\x32,.perfetto.protos.TrustyIpcReadEndFtraceEventH\x00\x12\x41\n\rtrusty_ipc_rx\x18\xce\x03 \x01(\x0b\x32\'.perfetto.protos.TrustyIpcRxFtraceEventH\x00\x12K\n\x12trusty_enqueue_nop\x18\xd0\x03 \x01(\x0b\x32,.perfetto.protos.TrustyEnqueueNopFtraceEventH\x00\x12\x45\n\x0f\x63ma_alloc_start\x18\xd1\x03 \x01(\x0b\x32).perfetto.protos.CmaAllocStartFtraceEventH\x00\x12\x43\n\x0e\x63ma_alloc_info\x18\xd2\x03 \x01(\x0b\x32(.perfetto.protos.CmaAllocInfoFtraceEventH\x00\x12T\n\x17lwis_tracing_mark_write\x18\xd3\x03 \x01(\x0b\x32\x30.perfetto.protos.LwisTracingMarkWriteFtraceEventH\x00\x12N\n\x14virtio_gpu_cmd_queue\x18\xd4\x03 \x01(\x0b\x32-.perfetto.protos.VirtioGpuCmdQueueFtraceEventH\x00\x12T\n\x17virtio_gpu_cmd_response\x18\xd5\x03 \x01(\x0b\x32\x30.perfetto.protos.VirtioGpuCmdResponseFtraceEventH\x00\x12Q\n\x16mali_mali_KCPU_CQS_SET\x18\xd6\x03 \x01(\x0b\x32..perfetto.protos.MaliMaliKCPUCQSSETFtraceEventH\x00\x12^\n\x1dmali_mali_KCPU_CQS_WAIT_START\x18\xd7\x03 \x01(\x0b\x32\x34.perfetto.protos.MaliMaliKCPUCQSWAITSTARTFtraceEventH\x00\x12Z\n\x1bmali_mali_KCPU_CQS_WAIT_END\x18\xd8\x03 \x01(\x0b\x32\x32.perfetto.protos.MaliMaliKCPUCQSWAITENDFtraceEventH\x00\x12[\n\x1bmali_mali_KCPU_FENCE_SIGNAL\x18\xd9\x03 \x01(\x0b\x32\x33.perfetto.protos.MaliMaliKCPUFENCESIGNALFtraceEventH\x00\x12\x62\n\x1fmali_mali_KCPU_FENCE_WAIT_START\x18\xda\x03 \x01(\x0b\x32\x36.perfetto.protos.MaliMaliKCPUFENCEWAITSTARTFtraceEventH\x00\x12^\n\x1dmali_mali_KCPU_FENCE_WAIT_END\x18\xdb\x03 \x01(\x0b\x32\x34.perfetto.protos.MaliMaliKCPUFENCEWAITENDFtraceEventH\x00\x12:\n\thyp_enter\x18\xdc\x03 \x01(\x0b\x32$.perfetto.protos.HypEnterFtraceEventH\x00\x12\x38\n\x08hyp_exit\x18\xdd\x03 \x01(\x0b\x32#.perfetto.protos.HypExitFtraceEventH\x00\x12<\n\nhost_hcall\x18\xde\x03 \x01(\x0b\x32%.perfetto.protos.HostHcallFtraceEventH\x00\x12\x38\n\x08host_smc\x18\xdf\x03 \x01(\x0b\x32#.perfetto.protos.HostSmcFtraceEventH\x00\x12\x43\n\x0ehost_mem_abort\x18\xe0\x03 \x01(\x0b\x32(.perfetto.protos.HostMemAbortFtraceEventH\x00\x12S\n\x16suspend_resume_minimal\x18\xe1\x03 \x01(\x0b\x32\x30.perfetto.protos.SuspendResumeMinimalFtraceEventH\x00\x12_\n\x1dmali_mali_CSF_INTERRUPT_START\x18\xe2\x03 \x01(\x0b\x32\x35.perfetto.protos.MaliMaliCSFINTERRUPTSTARTFtraceEventH\x00\x12[\n\x1bmali_mali_CSF_INTERRUPT_END\x18\xe3\x03 \x01(\x0b\x32\x33.perfetto.protos.MaliMaliCSFINTERRUPTENDFtraceEventH\x00\x12Z\n\x1asamsung_tracing_mark_write\x18\xe4\x03 \x01(\x0b\x32\x33.perfetto.protos.SamsungTracingMarkWriteFtraceEventH\x00\x12\x44\n\x0e\x62inder_command\x18\xe5\x03 \x01(\x0b\x32).perfetto.protos.BinderCommandFtraceEventH\x00\x12\x42\n\rbinder_return\x18\xe6\x03 \x01(\x0b\x32(.perfetto.protos.BinderReturnFtraceEventH\x00\x12R\n\x16sched_switch_with_ctrs\x18\xe7\x03 \x01(\x0b\x32/.perfetto.protos.SchedSwitchWithCtrsFtraceEventH\x00\x12\x45\n\x0fgpu_work_period\x18\xe8\x03 \x01(\x0b\x32).perfetto.protos.GpuWorkPeriodFtraceEventH\x00\x12<\n\nrpm_status\x18\xe9\x03 \x01(\x0b\x32%.perfetto.protos.RpmStatusFtraceEventH\x00\x12M\n\x13panel_write_generic\x18\xea\x03 \x01(\x0b\x32-.perfetto.protos.PanelWriteGenericFtraceEventH\x00\x12K\n\x12sched_migrate_task\x18\xeb\x03 \x01(\x0b\x32,.perfetto.protos.SchedMigrateTaskFtraceEventH\x00\x12S\n\x17\x64pu_dsi_cmd_fifo_status\x18\xec\x03 \x01(\x0b\x32/.perfetto.protos.DpuDsiCmdFifoStatusFtraceEventH\x00\x12;\n\ndpu_dsi_rx\x18\xed\x03 \x01(\x0b\x32$.perfetto.protos.DpuDsiRxFtraceEventH\x00\x12;\n\ndpu_dsi_tx\x18\xee\x03 \x01(\x0b\x32$.perfetto.protos.DpuDsiTxFtraceEventH\x00\x12K\n\x12\x66\x32\x66s_background_gc\x18\xef\x03 \x01(\x0b\x32,.perfetto.protos.F2fsBackgroundGcFtraceEventH\x00\x12\x41\n\rf2fs_gc_begin\x18\xf0\x03 \x01(\x0b\x32\'.perfetto.protos.F2fsGcBeginFtraceEventH\x00\x12=\n\x0b\x66\x32\x66s_gc_end\x18\xf1\x03 \x01(\x0b\x32%.perfetto.protos.F2fsGcEndFtraceEventH\x00\x12G\n\x10\x66\x61strpc_dma_free\x18\xf2\x03 \x01(\x0b\x32*.perfetto.protos.FastrpcDmaFreeFtraceEventH\x00\x12I\n\x11\x66\x61strpc_dma_alloc\x18\xf3\x03 \x01(\x0b\x32+.perfetto.protos.FastrpcDmaAllocFtraceEventH\x00\x12I\n\x11\x66\x61strpc_dma_unmap\x18\xf4\x03 \x01(\x0b\x32+.perfetto.protos.FastrpcDmaUnmapFtraceEventH\x00\x12\x45\n\x0f\x66\x61strpc_dma_map\x18\xf5\x03 \x01(\x0b\x32).perfetto.protos.FastrpcDmaMapFtraceEventH\x00\x12G\n\x10google_icc_event\x18\xf6\x03 \x01(\x0b\x32*.perfetto.protos.GoogleIccEventFtraceEventH\x00\x12G\n\x10google_irm_event\x18\xf7\x03 \x01(\x0b\x32*.perfetto.protos.GoogleIrmEventFtraceEventH\x00\x12V\n\x18\x64\x65vice_pm_callback_start\x18\xf8\x03 \x01(\x0b\x32\x31.perfetto.protos.DevicePmCallbackStartFtraceEventH\x00\x12R\n\x16\x64\x65vice_pm_callback_end\x18\xf9\x03 \x01(\x0b\x32/.perfetto.protos.DevicePmCallbackEndFtraceEventH\x00\x12V\n\x18thermal_exynos_acpm_bulk\x18\xfa\x03 \x01(\x0b\x32\x31.perfetto.protos.ThermalExynosAcpmBulkFtraceEventH\x00\x12g\n!thermal_exynos_acpm_high_overhead\x18\xfb\x03 \x01(\x0b\x32\x39.perfetto.protos.ThermalExynosAcpmHighOverheadFtraceEventH\x00\x12<\n\ndcvsh_freq\x18\xfc\x03 \x01(\x0b\x32%.perfetto.protos.DcvshFreqFtraceEventH\x00\x12K\n\x12kgsl_gpu_frequency\x18\xfd\x03 \x01(\x0b\x32,.perfetto.protos.KgslGpuFrequencyFtraceEventH\x00\x12\x84\x01\n2mali_mali_PM_MCU_HCTL_CORES_DOWN_SCALE_NOTIFY_PEND\x18\xfe\x03 \x01(\x0b\x32\x45.perfetto.protos.MaliMaliPMMCUHCTLCORESDOWNSCALENOTIFYPENDFtraceEventH\x00\x12p\n\'mali_mali_PM_MCU_HCTL_CORES_NOTIFY_PEND\x18\xff\x03 \x01(\x0b\x32<.perfetto.protos.MaliMaliPMMCUHCTLCORESNOTIFYPENDFtraceEventH\x00\x12r\n(mali_mali_PM_MCU_HCTL_CORE_INACTIVE_PEND\x18\x80\x04 \x01(\x0b\x32=.perfetto.protos.MaliMaliPMMCUHCTLCOREINACTIVEPENDFtraceEventH\x00\x12j\n$mali_mali_PM_MCU_HCTL_MCU_ON_RECHECK\x18\x81\x04 \x01(\x0b\x32\x39.perfetto.protos.MaliMaliPMMCUHCTLMCUONRECHECKFtraceEventH\x00\x12w\n+mali_mali_PM_MCU_HCTL_SHADERS_CORE_OFF_PEND\x18\x82\x04 \x01(\x0b\x32?.perfetto.protos.MaliMaliPMMCUHCTLSHADERSCOREOFFPENDFtraceEventH\x00\x12n\n&mali_mali_PM_MCU_HCTL_SHADERS_PEND_OFF\x18\x83\x04 \x01(\x0b\x32;.perfetto.protos.MaliMaliPMMCUHCTLSHADERSPENDOFFFtraceEventH\x00\x12l\n%mali_mali_PM_MCU_HCTL_SHADERS_PEND_ON\x18\x84\x04 \x01(\x0b\x32:.perfetto.protos.MaliMaliPMMCUHCTLSHADERSPENDONFtraceEventH\x00\x12p\n\'mali_mali_PM_MCU_HCTL_SHADERS_READY_OFF\x18\x85\x04 \x01(\x0b\x32<.perfetto.protos.MaliMaliPMMCUHCTLSHADERSREADYOFFFtraceEventH\x00\x12V\n\x19mali_mali_PM_MCU_IN_SLEEP\x18\x86\x04 \x01(\x0b\x32\x30.perfetto.protos.MaliMaliPMMCUINSLEEPFtraceEventH\x00\x12M\n\x14mali_mali_PM_MCU_OFF\x18\x87\x04 \x01(\x0b\x32,.perfetto.protos.MaliMaliPMMCUOFFFtraceEventH\x00\x12K\n\x13mali_mali_PM_MCU_ON\x18\x88\x04 \x01(\x0b\x32+.perfetto.protos.MaliMaliPMMCUONFtraceEventH\x00\x12s\n)mali_mali_PM_MCU_ON_CORE_ATTR_UPDATE_PEND\x18\x89\x04 \x01(\x0b\x32=.perfetto.protos.MaliMaliPMMCUONCOREATTRUPDATEPENDFtraceEventH\x00\x12h\n#mali_mali_PM_MCU_ON_GLB_REINIT_PEND\x18\x8a\x04 \x01(\x0b\x32\x38.perfetto.protos.MaliMaliPMMCUONGLBREINITPENDFtraceEventH\x00\x12T\n\x18mali_mali_PM_MCU_ON_HALT\x18\x8b\x04 \x01(\x0b\x32/.perfetto.protos.MaliMaliPMMCUONHALTFtraceEventH\x00\x12\x65\n!mali_mali_PM_MCU_ON_HWCNT_DISABLE\x18\x8c\x04 \x01(\x0b\x32\x37.perfetto.protos.MaliMaliPMMCUONHWCNTDISABLEFtraceEventH\x00\x12\x63\n mali_mali_PM_MCU_ON_HWCNT_ENABLE\x18\x8d\x04 \x01(\x0b\x32\x36.perfetto.protos.MaliMaliPMMCUONHWCNTENABLEFtraceEventH\x00\x12]\n\x1dmali_mali_PM_MCU_ON_PEND_HALT\x18\x8e\x04 \x01(\x0b\x32\x33.perfetto.protos.MaliMaliPMMCUONPENDHALTFtraceEventH\x00\x12_\n\x1emali_mali_PM_MCU_ON_PEND_SLEEP\x18\x8f\x04 \x01(\x0b\x32\x34.perfetto.protos.MaliMaliPMMCUONPENDSLEEPFtraceEventH\x00\x12g\n\"mali_mali_PM_MCU_ON_SLEEP_INITIATE\x18\x90\x04 \x01(\x0b\x32\x38.perfetto.protos.MaliMaliPMMCUONSLEEPINITIATEFtraceEventH\x00\x12V\n\x19mali_mali_PM_MCU_PEND_OFF\x18\x91\x04 \x01(\x0b\x32\x30.perfetto.protos.MaliMaliPMMCUPENDOFFFtraceEventH\x00\x12\x61\n\x1fmali_mali_PM_MCU_PEND_ON_RELOAD\x18\x92\x04 \x01(\x0b\x32\x35.perfetto.protos.MaliMaliPMMCUPENDONRELOADFtraceEventH\x00\x12Z\n\x1bmali_mali_PM_MCU_POWER_DOWN\x18\x93\x04 \x01(\x0b\x32\x32.perfetto.protos.MaliMaliPMMCUPOWERDOWNFtraceEventH\x00\x12Z\n\x1bmali_mali_PM_MCU_RESET_WAIT\x18\x94\x04 \x01(\x0b\x32\x32.perfetto.protos.MaliMaliPMMCURESETWAITFtraceEventH\x00\x12\x45\n\x0f\x62\x63l_irq_trigger\x18\x95\x04 \x01(\x0b\x32).perfetto.protos.BclIrqTriggerFtraceEventH\x00\x12\\\n\x1bkgsl_adreno_cmdbatch_queued\x18\x96\x04 \x01(\x0b\x32\x34.perfetto.protos.KgslAdrenoCmdbatchQueuedFtraceEventH\x00\x12\x62\n\x1ekgsl_adreno_cmdbatch_submitted\x18\x97\x04 \x01(\x0b\x32\x37.perfetto.protos.KgslAdrenoCmdbatchSubmittedFtraceEventH\x00\x12X\n\x19kgsl_adreno_cmdbatch_sync\x18\x98\x04 \x01(\x0b\x32\x32.perfetto.protos.KgslAdrenoCmdbatchSyncFtraceEventH\x00\x12^\n\x1ckgsl_adreno_cmdbatch_retired\x18\x99\x04 \x01(\x0b\x32\x35.perfetto.protos.KgslAdrenoCmdbatchRetiredFtraceEventH\x00\x12N\n\x14pixel_mm_kswapd_wake\x18\x9a\x04 \x01(\x0b\x32-.perfetto.protos.PixelMmKswapdWakeFtraceEventH\x00\x12N\n\x14pixel_mm_kswapd_done\x18\x9b\x04 \x01(\x0b\x32-.perfetto.protos.PixelMmKswapdDoneFtraceEventH\x00\x12R\n\x16sched_wakeup_task_attr\x18\x9c\x04 \x01(\x0b\x32/.perfetto.protos.SchedWakeupTaskAttrFtraceEventH\x00\x12J\n\x11\x64\x65vfreq_frequency\x18\x9d\x04 \x01(\x0b\x32,.perfetto.protos.DevfreqFrequencyFtraceEventH\x00\x12\x35\n\x0ckprobe_event\x18\x9e\x04 \x01(\x0b\x32\x1c.perfetto.protos.KprobeEventH\x00\x12L\n\x13param_set_value_cpm\x18\x9f\x04 \x01(\x0b\x32,.perfetto.protos.ParamSetValueCpmFtraceEventH\x00\x12=\n\x0b\x64o_sys_open\x18\xa0\x04 \x01(\x0b\x32%.perfetto.protos.DoSysOpenFtraceEventH\x00\x12:\n\topen_exec\x18\xa1\x04 \x01(\x0b\x32$.perfetto.protos.OpenExecFtraceEventH\x00\x12\x43\n\x0e\x62lock_io_start\x18\xa2\x04 \x01(\x0b\x32(.perfetto.protos.BlockIoStartFtraceEventH\x00\x12\x41\n\rblock_io_done\x18\xa3\x04 \x01(\x0b\x32\'.perfetto.protos.BlockIoDoneFtraceEventH\x00\x12N\n\x14mali_gpu_power_state\x18\xa4\x04 \x01(\x0b\x32-.perfetto.protos.MaliGpuPowerStateFtraceEventH\x00\x12P\n\x15\x64pu_disp_dpu_underrun\x18\xa5\x04 \x01(\x0b\x32..perfetto.protos.DpuDispDpuUnderrunFtraceEventH\x00\x12Y\n\x1a\x64pu_disp_vblank_irq_enable\x18\xa6\x04 \x01(\x0b\x32\x32.perfetto.protos.DpuDispVblankIrqEnableFtraceEventH\x00\x12\x42\n\rhrtimer_start\x18\xa7\x04 \x01(\x0b\x32(.perfetto.protos.HrtimerStartFtraceEventH\x00\x12\x44\n\x0ehrtimer_cancel\x18\xa8\x04 \x01(\x0b\x32).perfetto.protos.HrtimerCancelFtraceEventH\x00\x12O\n\x14hrtimer_expire_entry\x18\xa9\x04 \x01(\x0b\x32..perfetto.protos.HrtimerExpireEntryFtraceEventH\x00\x12M\n\x13hrtimer_expire_exit\x18\xaa\x04 \x01(\x0b\x32-.perfetto.protos.HrtimerExpireExitFtraceEventH\x00\x12>\n\x0btimer_start\x18\xab\x04 \x01(\x0b\x32&.perfetto.protos.TimerStartFtraceEventH\x00\x12@\n\x0ctimer_cancel\x18\xac\x04 \x01(\x0b\x32\'.perfetto.protos.TimerCancelFtraceEventH\x00\x12K\n\x12timer_expire_entry\x18\xad\x04 \x01(\x0b\x32,.perfetto.protos.TimerExpireEntryFtraceEventH\x00\x12I\n\x11timer_expire_exit\x18\xae\x04 \x01(\x0b\x32+.perfetto.protos.TimerExpireExitFtraceEventH\x00\x12I\n\x11local_timer_entry\x18\xaf\x04 \x01(\x0b\x32+.perfetto.protos.LocalTimerEntryFtraceEventH\x00\x12G\n\x10local_timer_exit\x18\xb0\x04 \x01(\x0b\x32*.perfetto.protos.LocalTimerExitFtraceEventH\x00\x12K\n\x12\x64wc3_alloc_request\x18\xb1\x04 \x01(\x0b\x32,.perfetto.protos.Dwc3AllocRequestFtraceEventH\x00\x12I\n\x11\x64wc3_complete_trb\x18\xb2\x04 \x01(\x0b\x32+.perfetto.protos.Dwc3CompleteTrbFtraceEventH\x00\x12\x41\n\rdwc3_ctrl_req\x18\xb3\x04 \x01(\x0b\x32\'.perfetto.protos.Dwc3CtrlReqFtraceEventH\x00\x12\x45\n\x0f\x64wc3_ep_dequeue\x18\xb4\x04 \x01(\x0b\x32).perfetto.protos.Dwc3EpDequeueFtraceEventH\x00\x12\x41\n\rdwc3_ep_queue\x18\xb5\x04 \x01(\x0b\x32\'.perfetto.protos.Dwc3EpQueueFtraceEventH\x00\x12<\n\ndwc3_event\x18\xb6\x04 \x01(\x0b\x32%.perfetto.protos.Dwc3EventFtraceEventH\x00\x12I\n\x11\x64wc3_free_request\x18\xb7\x04 \x01(\x0b\x32+.perfetto.protos.Dwc3FreeRequestFtraceEventH\x00\x12J\n\x12\x64wc3_gadget_ep_cmd\x18\xb8\x04 \x01(\x0b\x32+.perfetto.protos.Dwc3GadgetEpCmdFtraceEventH\x00\x12R\n\x16\x64wc3_gadget_ep_disable\x18\xb9\x04 \x01(\x0b\x32/.perfetto.protos.Dwc3GadgetEpDisableFtraceEventH\x00\x12P\n\x15\x64wc3_gadget_ep_enable\x18\xba\x04 \x01(\x0b\x32..perfetto.protos.Dwc3GadgetEpEnableFtraceEventH\x00\x12T\n\x17\x64wc3_gadget_generic_cmd\x18\xbb\x04 \x01(\x0b\x32\x30.perfetto.protos.Dwc3GadgetGenericCmdFtraceEventH\x00\x12O\n\x14\x64wc3_gadget_giveback\x18\xbc\x04 \x01(\x0b\x32..perfetto.protos.Dwc3GadgetGivebackFtraceEventH\x00\x12G\n\x10\x64wc3_prepare_trb\x18\xbd\x04 \x01(\x0b\x32*.perfetto.protos.Dwc3PrepareTrbFtraceEventH\x00\x12<\n\ndwc3_readl\x18\xbe\x04 \x01(\x0b\x32%.perfetto.protos.Dwc3ReadlFtraceEventH\x00\x12>\n\x0b\x64wc3_writel\x18\xbf\x04 \x01(\x0b\x32&.perfetto.protos.Dwc3WritelFtraceEventH\x00\x12G\n\x10\x63ma_alloc_finish\x18\xc0\x04 \x01(\x0b\x32*.perfetto.protos.CmaAllocFinishFtraceEventH\x00\x12h\n\"mm_alloc_contig_migrate_range_info\x18\xc1\x04 \x01(\x0b\x32\x39.perfetto.protos.MmAllocContigMigrateRangeInfoFtraceEventH\x00\x12\x41\n\rhost_ffa_call\x18\xc2\x04 \x01(\x0b\x32\'.perfetto.protos.HostFfaCallFtraceEventH\x00\x12\x45\n\x0f\x64mabuf_rss_stat\x18\xc3\x04 \x01(\x0b\x32).perfetto.protos.DmabufRssStatFtraceEventH\x00\x12>\n\x0biommu_idmap\x18\xc4\x04 \x01(\x0b\x32&.perfetto.protos.IommuIdmapFtraceEventH\x00\x12G\n\x10psci_mem_protect\x18\xc5\x04 \x01(\x0b\x32*.perfetto.protos.PsciMemProtectFtraceEventH\x00\x12Q\n\x15hypervisor_host_hcall\x18\xc6\x04 \x01(\x0b\x32/.perfetto.protos.HypervisorHostHcallFtraceEventH\x00\x12M\n\x13hypervisor_host_smc\x18\xc7\x04 \x01(\x0b\x32-.perfetto.protos.HypervisorHostSmcFtraceEventH\x00\x12M\n\x13hypervisor_hyp_exit\x18\xc8\x04 \x01(\x0b\x32-.perfetto.protos.HypervisorHypExitFtraceEventH\x00\x12S\n\x16hypervisor_iommu_idmap\x18\xc9\x04 \x01(\x0b\x32\x30.perfetto.protos.HypervisorIommuIdmapFtraceEventH\x00\x12\\\n\x1bhypervisor_psci_mem_protect\x18\xca\x04 \x01(\x0b\x32\x34.perfetto.protos.HypervisorPsciMemProtectFtraceEventH\x00\x12X\n\x19hypervisor_host_mem_abort\x18\xcb\x04 \x01(\x0b\x32\x32.perfetto.protos.HypervisorHostMemAbortFtraceEventH\x00\x12O\n\x14hypervisor_hyp_enter\x18\xcc\x04 \x01(\x0b\x32..perfetto.protos.HypervisorHypEnterFtraceEventH\x00\x12\x64\n\x1fhypervisor_iommu_idmap_complete\x18\xcd\x04 \x01(\x0b\x32\x38.perfetto.protos.HypervisorIommuIdmapCompleteFtraceEventH\x00\x12^\n\x1chypervisor_vcpu_illegal_trap\x18\xce\x04 \x01(\x0b\x32\x35.perfetto.protos.HypervisorVcpuIllegalTrapFtraceEventH\x00\x12O\n\x15\x64rm_sched_job_add_dep\x18\xcf\x04 \x01(\x0b\x32-.perfetto.protos.DrmSchedJobAddDepFtraceEventH\x00\x12J\n\x12\x64rm_sched_job_done\x18\xd0\x04 \x01(\x0b\x32+.perfetto.protos.DrmSchedJobDoneFtraceEventH\x00\x12L\n\x13\x64rm_sched_job_queue\x18\xd1\x04 \x01(\x0b\x32,.perfetto.protos.DrmSchedJobQueueFtraceEventH\x00\x12H\n\x11\x64rm_sched_job_run\x18\xd2\x04 \x01(\x0b\x32*.perfetto.protos.DrmSchedJobRunFtraceEventH\x00\x12\\\n\x1b\x64rm_sched_job_unschedulable\x18\xd3\x04 \x01(\x0b\x32\x34.perfetto.protos.DrmSchedJobUnschedulableFtraceEventH\x00\x12Q\n\x15\x66wtp_perfetto_counter\x18\xd4\x04 \x01(\x0b\x32/.perfetto.protos.FwtpPerfettoCounterFtraceEventH\x00\x12T\n\x17scsi_dispatch_cmd_error\x18\xd5\x04 \x01(\x0b\x32\x30.perfetto.protos.ScsiDispatchCmdErrorFtraceEventH\x00\x12X\n\x19scsi_dispatch_cmd_timeout\x18\xd6\x04 \x01(\x0b\x32\x32.perfetto.protos.ScsiDispatchCmdTimeoutFtraceEventH\x00\x12\x43\n\x0escsi_eh_wakeup\x18\xd7\x04 \x01(\x0b\x32(.perfetto.protos.ScsiEhWakeupFtraceEventH\x00\x12M\n\x13\x66wtp_perfetto_slice\x18\xd8\x04 \x01(\x0b\x32-.perfetto.protos.FwtpPerfettoSliceFtraceEventH\x00\x12\x45\n\x0fgpu_power_state\x18\xd9\x04 \x01(\x0b\x32).perfetto.protos.GpuPowerStateFtraceEventH\x00\x12\x44\n\x0egram_collision\x18\xda\x04 \x01(\x0b\x32).perfetto.protos.GramCollisionFtraceEventH\x00\x12R\n\x16\x66\x32\x66s_lock_elapsed_time\x18\xdb\x04 \x01(\x0b\x32/.perfetto.protos.F2fsLockElapsedTimeFtraceEventH\x00\x12M\n\x13sched_group_tracker\x18\xdc\x04 \x01(\x0b\x32-.perfetto.protos.SchedGroupTrackerFtraceEventH\x00\x12[\n\x1b\x64pu_disp_frame_done_timeout\x18\xdd\x04 \x01(\x0b\x32\x33.perfetto.protos.DpuDispFrameDoneTimeoutFtraceEventH\x00\x12]\n\x1c\x64pu_disp_frame_start_timeout\x18\xde\x04 \x01(\x0b\x32\x34.perfetto.protos.DpuDispFrameStartTimeoutFtraceEventH\x00\x12_\n\x1dmm_vmscan_memcg_reclaim_begin\x18\xdf\x04 \x01(\x0b\x32\x35.perfetto.protos.MmVmscanMemcgReclaimBeginFtraceEventH\x00\x12[\n\x1bmm_vmscan_memcg_reclaim_end\x18\xe0\x04 \x01(\x0b\x32\x33.perfetto.protos.MmVmscanMemcgReclaimEndFtraceEventH\x00\x12[\n\x1b\x64pu_disp_frame_done_missing\x18\xe1\x04 \x01(\x0b\x32\x33.perfetto.protos.DpuDispFrameDoneMissingFtraceEventH\x00\x12]\n\x1c\x64pu_disp_frame_start_missing\x18\xe2\x04 \x01(\x0b\x32\x34.perfetto.protos.DpuDispFrameStartMissingFtraceEventH\x00\x12M\n\x13panel_settings_full\x18\xe3\x04 \x01(\x0b\x32-.perfetto.protos.PanelSettingsFullFtraceEventH\x00\x12M\n\x13panel_settings_lite\x18\xe4\x04 \x01(\x0b\x32-.perfetto.protos.PanelSettingsLiteFtraceEventH\x00\x12Y\n\x1a\x64pu_disp_dpu_line_underrun\x18\xe5\x04 \x01(\x0b\x32\x32.perfetto.protos.DpuDispDpuLineUnderrunFtraceEventH\x00\x12P\n\x15psci_domain_idle_exit\x18\xe6\x04 \x01(\x0b\x32..perfetto.protos.PsciDomainIdleExitFtraceEventH\x00\x12R\n\x16psci_domain_idle_enter\x18\xe7\x04 \x01(\x0b\x32/.perfetto.protos.PsciDomainIdleEnterFtraceEventH\x00\x42\x07\n\x05\x65ventJ\x08\x08\x80\x80\x04\x10\x81\x80\x08\"\xc1\x01\n\x0e\x46traceCpuStats\x12\x0b\n\x03\x63pu\x18\x01 \x01(\x04\x12\x0f\n\x07\x65ntries\x18\x02 \x01(\x04\x12\x0f\n\x07overrun\x18\x03 \x01(\x04\x12\x16\n\x0e\x63ommit_overrun\x18\x04 \x01(\x04\x12\x12\n\nbytes_read\x18\x05 \x01(\x04\x12\x17\n\x0foldest_event_ts\x18\x06 \x01(\x01\x12\x0e\n\x06now_ts\x18\x07 \x01(\x01\x12\x16\n\x0e\x64ropped_events\x18\x08 \x01(\x04\x12\x13\n\x0bread_events\x18\t \x01(\x04\"1\n\x11\x46traceKprobeStats\x12\x0c\n\x04hits\x18\x01 \x01(\x03\x12\x0e\n\x06misses\x18\x02 \x01(\x03\"\xc7\x04\n\x0b\x46traceStats\x12\x31\n\x05phase\x18\x01 \x01(\x0e\x32\".perfetto.protos.FtraceStats.Phase\x12\x32\n\tcpu_stats\x18\x02 \x03(\x0b\x32\x1f.perfetto.protos.FtraceCpuStats\x12\x1d\n\x15kernel_symbols_parsed\x18\x03 \x01(\r\x12\x1d\n\x15kernel_symbols_mem_kb\x18\x04 \x01(\r\x12\x15\n\ratrace_errors\x18\x05 \x01(\t\x12\x1f\n\x17\x65xclusive_feature_error\x18\r \x01(\t\x12\x1d\n\x15unknown_ftrace_events\x18\x06 \x03(\t\x12\x1c\n\x14\x66\x61iled_ftrace_events\x18\x07 \x03(\t\x12\x1e\n\x16preserve_ftrace_buffer\x18\x08 \x01(\x08\x12?\n\x13\x66trace_parse_errors\x18\t \x03(\x0e\x32\".perfetto.protos.FtraceParseStatus\x12\x38\n\x0ckprobe_stats\x18\n \x01(\x0b\x32\".perfetto.protos.FtraceKprobeStats\x12\x1d\n\x15\x63pu_buffer_size_pages\x18\x0b \x01(\r\x12$\n\x1c\x63\x61\x63hed_cpu_buffer_size_pages\x18\x0c \x01(\r\">\n\x05Phase\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x12\n\x0eSTART_OF_TRACE\x10\x01\x12\x10\n\x0c\x45ND_OF_TRACE\x10\x02\"\xb8\x08\n\x11\x46traceEventBundle\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12+\n\x05\x65vent\x18\x02 \x03(\x0b\x32\x1c.perfetto.protos.FtraceEvent\x12\x13\n\x0blost_events\x18\x03 \x01(\x08\x12\x46\n\rcompact_sched\x18\x04 \x01(\x0b\x32/.perfetto.protos.FtraceEventBundle.CompactSched\x12\x32\n\x0c\x66trace_clock\x18\x05 \x01(\x0e\x32\x1c.perfetto.protos.FtraceClock\x12\x18\n\x10\x66trace_timestamp\x18\x06 \x01(\x03\x12\x16\n\x0e\x62oot_timestamp\x18\x07 \x01(\x03\x12=\n\x05\x65rror\x18\x08 \x03(\x0b\x32..perfetto.protos.FtraceEventBundle.FtraceError\x12!\n\x19last_read_event_timestamp\x18\t \x01(\x04\x12%\n\x1dprevious_bundle_end_timestamp\x18\n \x01(\x04\x12\\\n\x19generic_event_descriptors\x18\x0b \x03(\x0b\x32\x39.perfetto.protos.FtraceEventBundle.GenericEventDescriptor\x12\x1e\n\x15\x62roken_abi_trace_page\x18\x80\x04 \x01(\x0c\x1a\xee\x02\n\x0c\x43ompactSched\x12\x14\n\x0cintern_table\x18\x05 \x03(\t\x12\x1c\n\x10switch_timestamp\x18\x01 \x03(\x04\x42\x02\x10\x01\x12\x1d\n\x11switch_prev_state\x18\x02 \x03(\x03\x42\x02\x10\x01\x12\x1b\n\x0fswitch_next_pid\x18\x03 \x03(\x05\x42\x02\x10\x01\x12\x1c\n\x10switch_next_prio\x18\x04 \x03(\x05\x42\x02\x10\x01\x12\"\n\x16switch_next_comm_index\x18\x06 \x03(\rB\x02\x10\x01\x12\x1c\n\x10waking_timestamp\x18\x07 \x03(\x04\x42\x02\x10\x01\x12\x16\n\nwaking_pid\x18\x08 \x03(\x05\x42\x02\x10\x01\x12\x1d\n\x11waking_target_cpu\x18\t \x03(\x05\x42\x02\x10\x01\x12\x17\n\x0bwaking_prio\x18\n \x03(\x05\x42\x02\x10\x01\x12\x1d\n\x11waking_comm_index\x18\x0b \x03(\rB\x02\x10\x01\x12\x1f\n\x13waking_common_flags\x18\x0c \x03(\rB\x02\x10\x01\x1aT\n\x0b\x46traceError\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x32\n\x06status\x18\x02 \x01(\x0e\x32\".perfetto.protos.FtraceParseStatus\x1aX\n\x16GenericEventDescriptor\x12\x10\n\x08\x66ield_id\x18\x01 \x01(\x05\x12\x12\n\ngroup_name\x18\x03 \x01(\t\x12\x18\n\x10\x65vent_descriptor\x18\x02 \x01(\x0c\"A\n\x18GenericGpuFrequencyEvent\x12\x0e\n\x06gpu_id\x18\x01 \x01(\r\x12\x15\n\rfrequency_khz\x18\x02 \x01(\r\">\n\x1eGenericKernelCpuFrequencyEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\x05\x12\x0f\n\x07\x66req_hz\x18\x02 \x01(\x03\"\xa2\x03\n\x1bGenericKernelTaskStateEvent\x12\x0b\n\x03\x63pu\x18\x01 \x01(\x05\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\x12\x0b\n\x03tid\x18\x03 \x01(\x03\x12I\n\x05state\x18\x04 \x01(\x0e\x32:.perfetto.protos.GenericKernelTaskStateEvent.TaskStateEnum\x12\x0c\n\x04prio\x18\x05 \x01(\x05\"\x81\x02\n\rTaskStateEnum\x12\x16\n\x12TASK_STATE_UNKNOWN\x10\x00\x12\x16\n\x12TASK_STATE_CREATED\x10\x01\x12\x17\n\x13TASK_STATE_RUNNABLE\x10\x02\x12\x16\n\x12TASK_STATE_RUNNING\x10\x03\x12\"\n\x1eTASK_STATE_INTERRUPTIBLE_SLEEP\x10\x04\x12$\n TASK_STATE_UNINTERRUPTIBLE_SLEEP\x10\x05\x12\x16\n\x12TASK_STATE_STOPPED\x10\x06\x12\x13\n\x0fTASK_STATE_DEAD\x10\x07\x12\x18\n\x14TASK_STATE_DESTROYED\x10\x08\"9\n\x1cGenericKernelTaskRenameEvent\x12\x0b\n\x03tid\x18\x01 \x01(\x03\x12\x0c\n\x04\x63omm\x18\x02 \x01(\t\"\xb5\x02\n\x18GenericKernelProcessTree\x12\x44\n\tprocesses\x18\x01 \x03(\x0b\x32\x31.perfetto.protos.GenericKernelProcessTree.Process\x12\x41\n\x07threads\x18\x02 \x03(\x0b\x32\x30.perfetto.protos.GenericKernelProcessTree.Thread\x1aY\n\x06Thread\x12\x0b\n\x03tid\x18\x01 \x01(\x03\x12\x0b\n\x03pid\x18\x02 \x01(\x03\x12\x0c\n\x04\x63omm\x18\x03 \x01(\t\x12\x16\n\x0eis_main_thread\x18\x04 \x01(\x08\x12\x0f\n\x07is_idle\x18\x05 \x01(\x08\x1a\x35\n\x07Process\x12\x0b\n\x03pid\x18\x01 \x01(\x03\x12\x0c\n\x04ppid\x18\x02 \x01(\x03\x12\x0f\n\x07\x63mdline\x18\x03 \x01(\t\"\xa7\x02\n\x0fGpuCounterEvent\x12\x43\n\x12\x63ounter_descriptor\x18\x01 \x01(\x0b\x32%.perfetto.protos.GpuCounterDescriptorH\x00\x12 \n\x16\x63ounter_descriptor_iid\x18\x04 \x01(\x04H\x00\x12=\n\x08\x63ounters\x18\x02 \x03(\x0b\x32+.perfetto.protos.GpuCounterEvent.GpuCounter\x12\x0e\n\x06gpu_id\x18\x03 \x01(\x05\x1aV\n\nGpuCounter\x12\x12\n\ncounter_id\x18\x01 \x01(\r\x12\x13\n\tint_value\x18\x02 \x01(\x03H\x00\x12\x16\n\x0c\x64ouble_value\x18\x03 \x01(\x01H\x00\x42\x07\n\x05valueB\x06\n\x04\x64\x65sc\"~\n\x1cInternedGpuCounterDescriptor\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x41\n\x12\x63ounter_descriptor\x18\x02 \x01(\x0b\x32%.perfetto.protos.GpuCounterDescriptor\x12\x0e\n\x06gpu_id\x18\x03 \x01(\x05\"\x84\x02\n\x06GpuLog\x12\x32\n\x08severity\x18\x01 \x01(\x0e\x32 .perfetto.protos.GpuLog.Severity\x12\x0b\n\x03tag\x18\x02 \x01(\t\x12\x13\n\x0blog_message\x18\x03 \x01(\t\"\xa3\x01\n\x08Severity\x12\x1c\n\x18LOG_SEVERITY_UNSPECIFIED\x10\x00\x12\x18\n\x14LOG_SEVERITY_VERBOSE\x10\x01\x12\x16\n\x12LOG_SEVERITY_DEBUG\x10\x02\x12\x15\n\x11LOG_SEVERITY_INFO\x10\x03\x12\x18\n\x14LOG_SEVERITY_WARNING\x10\x04\x12\x16\n\x12LOG_SEVERITY_ERROR\x10\x05\"=\n\x10GpuMemTotalEvent\x12\x0e\n\x06gpu_id\x18\x01 \x01(\r\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x0c\n\x04size\x18\x03 \x01(\x04\"\x8b\x0c\n\x13GpuRenderStageEvent\x12\x10\n\x08\x65vent_id\x18\x01 \x01(\x04\x12\x10\n\x08\x64uration\x18\x02 \x01(\x04\x12\x14\n\x0chw_queue_iid\x18\r \x01(\x04\x12\x11\n\tstage_iid\x18\x0e \x01(\x04\x12\x0e\n\x06gpu_id\x18\x0b \x01(\x05\x12\x0f\n\x07\x63ontext\x18\x05 \x01(\x04\x12\x1c\n\x14render_target_handle\x18\x08 \x01(\x04\x12\x15\n\rsubmission_id\x18\n \x01(\r\x12\x42\n\nextra_data\x18\x06 \x03(\x0b\x32..perfetto.protos.GpuRenderStageEvent.ExtraData\x12\x1a\n\x12render_pass_handle\x18\t \x01(\x04\x12\x1f\n\x17render_pass_instance_id\x18\x10 \x01(\x04\x12!\n\x19render_subpass_index_mask\x18\x0f \x03(\x04\x12\x1d\n\x15\x63ommand_buffer_handle\x18\x0c \x01(\x04\x12\x0e\n\x04name\x18\x11 \x01(\tH\x00\x12\x12\n\x08name_iid\x18\x14 \x01(\x04H\x00\x12\x16\n\x0e\x65vent_wait_ids\x18\x12 \x03(\x04\x12\x12\n\nkernel_iid\x18\x13 \x01(\x04\x12H\n\x06launch\x18\x15 \x01(\x0b\x32\x38.perfetto.protos.GpuRenderStageEvent.ComputeKernelLaunch\x12O\n\x0especifications\x18\x07 \x01(\x0b\x32\x33.perfetto.protos.GpuRenderStageEvent.SpecificationsB\x02\x18\x01\x12\x17\n\x0bhw_queue_id\x18\x03 \x01(\x05\x42\x02\x18\x01\x12\x14\n\x08stage_id\x18\x04 \x01(\x05\x42\x02\x18\x01\x1a(\n\tExtraData\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x1a\'\n\x04\x44im3\x12\t\n\x01x\x18\x01 \x01(\r\x12\t\n\x01y\x18\x02 \x01(\r\x12\t\n\x01z\x18\x03 \x01(\r\x1a\xc3\x01\n\x0f\x45xtraComputeArg\x12\x12\n\x08name_iid\x18\x01 \x01(\x04H\x00\x12\x0e\n\x04name\x18\x02 \x01(\tH\x00\x12\x13\n\tint_value\x18\x03 \x01(\x03H\x01\x12\x14\n\nuint_value\x18\x04 \x01(\x04H\x01\x12\x16\n\x0c\x64ouble_value\x18\x05 \x01(\x01H\x01\x12\x16\n\x0cstring_value\x18\x06 \x01(\tH\x01\x12\x1a\n\x10string_value_iid\x18\x07 \x01(\x04H\x01\x42\x0c\n\nname_fieldB\x07\n\x05value\x1a\xda\x01\n\x13\x43omputeKernelLaunch\x12<\n\tgrid_size\x18\x01 \x01(\x0b\x32).perfetto.protos.GpuRenderStageEvent.Dim3\x12\x41\n\x0eworkgroup_size\x18\x02 \x01(\x0b\x32).perfetto.protos.GpuRenderStageEvent.Dim3\x12\x42\n\x04\x61rgs\x18\x03 \x03(\x0b\x32\x34.perfetto.protos.GpuRenderStageEvent.ExtraComputeArg\x1a\xe9\x02\n\x0eSpecifications\x12U\n\x0c\x63ontext_spec\x18\x01 \x01(\x0b\x32?.perfetto.protos.GpuRenderStageEvent.Specifications.ContextSpec\x12Q\n\x08hw_queue\x18\x02 \x03(\x0b\x32?.perfetto.protos.GpuRenderStageEvent.Specifications.Description\x12N\n\x05stage\x18\x03 \x03(\x0b\x32?.perfetto.protos.GpuRenderStageEvent.Specifications.Description\x1a+\n\x0b\x43ontextSpec\x12\x0f\n\x07\x63ontext\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x1a\x30\n\x0b\x44\x65scription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t*\x04\x08\x64\x10\x65\x42\x0c\n\nname_field\"\xbd\x01\n\x17InternedGraphicsContext\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\x05\x12\x39\n\x03\x61pi\x18\x03 \x01(\x0e\x32,.perfetto.protos.InternedGraphicsContext.Api\"M\n\x03\x41pi\x12\r\n\tUNDEFINED\x10\x00\x12\x0b\n\x07OPEN_GL\x10\x01\x12\n\n\x06VULKAN\x10\x02\x12\x0b\n\x07OPEN_CL\x10\x03\x12\x08\n\x04\x43UDA\x10\x04\x12\x07\n\x03HIP\x10\x05\"\xee\x01\n#InternedGpuRenderStageSpecification\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12Z\n\x08\x63\x61tegory\x18\x04 \x01(\x0e\x32H.perfetto.protos.InternedGpuRenderStageSpecification.RenderStageCategory\";\n\x13RenderStageCategory\x12\t\n\x05OTHER\x10\x00\x12\x0c\n\x08GRAPHICS\x10\x01\x12\x0b\n\x07\x43OMPUTE\x10\x02\"\x9c\x01\n\x15InternedComputeKernel\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x16\n\x0e\x64\x65mangled_name\x18\x03 \x01(\t\x12\x0c\n\x04\x61rch\x18\x04 \x01(\t\x12\x42\n\x04\x61rgs\x18\x05 \x03(\x0b\x32\x34.perfetto.protos.GpuRenderStageEvent.ExtraComputeArg\"3\n\x16InternedComputeArgName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"\xbb\x03\n\x0eVulkanApiEvent\x12\\\n\x1avk_debug_utils_object_name\x18\x01 \x01(\x0b\x32\x36.perfetto.protos.VulkanApiEvent.VkDebugUtilsObjectNameH\x00\x12H\n\x0fvk_queue_submit\x18\x02 \x01(\x0b\x32-.perfetto.protos.VulkanApiEvent.VkQueueSubmitH\x00\x1ar\n\x16VkDebugUtilsObjectName\x12\x0b\n\x03pid\x18\x01 \x01(\r\x12\x11\n\tvk_device\x18\x02 \x01(\x04\x12\x13\n\x0bobject_type\x18\x03 \x01(\x05\x12\x0e\n\x06object\x18\x04 \x01(\x04\x12\x13\n\x0bobject_name\x18\x05 \x01(\t\x1a\x83\x01\n\rVkQueueSubmit\x12\x13\n\x0b\x64uration_ns\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x0b\n\x03tid\x18\x03 \x01(\r\x12\x10\n\x08vk_queue\x18\x04 \x01(\x04\x12\x1a\n\x12vk_command_buffers\x18\x05 \x03(\x04\x12\x15\n\rsubmission_id\x18\x06 \x01(\rB\x07\n\x05\x65vent\"z\n\x1bVulkanMemoryEventAnnotation\x12\x0f\n\x07key_iid\x18\x01 \x01(\x04\x12\x13\n\tint_value\x18\x02 \x01(\x03H\x00\x12\x16\n\x0c\x64ouble_value\x18\x03 \x01(\x01H\x00\x12\x14\n\nstring_iid\x18\x04 \x01(\x04H\x00\x42\x07\n\x05value\"\xe8\x06\n\x11VulkanMemoryEvent\x12\x39\n\x06source\x18\x01 \x01(\x0e\x32).perfetto.protos.VulkanMemoryEvent.Source\x12?\n\toperation\x18\x02 \x01(\x0e\x32,.perfetto.protos.VulkanMemoryEvent.Operation\x12\x11\n\ttimestamp\x18\x03 \x01(\x03\x12\x0b\n\x03pid\x18\x04 \x01(\r\x12\x16\n\x0ememory_address\x18\x05 \x01(\x06\x12\x13\n\x0bmemory_size\x18\x06 \x01(\x04\x12\x12\n\ncaller_iid\x18\x07 \x01(\x04\x12L\n\x10\x61llocation_scope\x18\x08 \x01(\x0e\x32\x32.perfetto.protos.VulkanMemoryEvent.AllocationScope\x12\x41\n\x0b\x61nnotations\x18\t \x03(\x0b\x32,.perfetto.protos.VulkanMemoryEventAnnotation\x12\x0e\n\x06\x64\x65vice\x18\x10 \x01(\x06\x12\x15\n\rdevice_memory\x18\x11 \x01(\x06\x12\x13\n\x0bmemory_type\x18\x12 \x01(\r\x12\x0c\n\x04heap\x18\x13 \x01(\r\x12\x15\n\robject_handle\x18\x14 \x01(\x06\"\x85\x01\n\x06Source\x12\x16\n\x12SOURCE_UNSPECIFIED\x10\x00\x12\x11\n\rSOURCE_DRIVER\x10\x01\x12\x11\n\rSOURCE_DEVICE\x10\x02\x12\x18\n\x14SOURCE_DEVICE_MEMORY\x10\x03\x12\x11\n\rSOURCE_BUFFER\x10\x04\x12\x10\n\x0cSOURCE_IMAGE\x10\x05\"u\n\tOperation\x12\x12\n\x0eOP_UNSPECIFIED\x10\x00\x12\r\n\tOP_CREATE\x10\x01\x12\x0e\n\nOP_DESTROY\x10\x02\x12\x0b\n\x07OP_BIND\x10\x03\x12\x14\n\x10OP_DESTROY_BOUND\x10\x04\x12\x12\n\x0eOP_ANNOTATIONS\x10\x05\"\x84\x01\n\x0f\x41llocationScope\x12\x15\n\x11SCOPE_UNSPECIFIED\x10\x00\x12\x11\n\rSCOPE_COMMAND\x10\x01\x12\x10\n\x0cSCOPE_OBJECT\x10\x02\x12\x0f\n\x0bSCOPE_CACHE\x10\x03\x12\x10\n\x0cSCOPE_DEVICE\x10\x04\x12\x12\n\x0eSCOPE_INSTANCE\x10\x05\"*\n\x0eInternedString\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03str\x18\x02 \x01(\x0c\"L\n\x04Line\x12\x15\n\rfunction_name\x18\x01 \x01(\t\x12\x18\n\x10source_file_name\x18\x02 \x01(\t\x12\x13\n\x0bline_number\x18\x03 \x01(\r\"G\n\x0e\x41\x64\x64ressSymbols\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x04\x12$\n\x05lines\x18\x02 \x03(\x0b\x32\x15.perfetto.protos.Line\"i\n\rModuleSymbols\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x10\n\x08\x62uild_id\x18\x02 \x01(\t\x12\x38\n\x0f\x61\x64\x64ress_symbols\x18\x03 \x03(\x0b\x32\x1f.perfetto.protos.AddressSymbols\"\x9c\x01\n\x07Mapping\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x10\n\x08\x62uild_id\x18\x02 \x01(\x04\x12\x14\n\x0c\x65xact_offset\x18\x08 \x01(\x04\x12\x14\n\x0cstart_offset\x18\x03 \x01(\x04\x12\r\n\x05start\x18\x04 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x05 \x01(\x04\x12\x11\n\tload_bias\x18\x06 \x01(\x04\x12\x17\n\x0fpath_string_ids\x18\x07 \x03(\x04\"\xce\x02\n\x05\x46rame\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x18\n\x10\x66unction_name_id\x18\x02 \x01(\x04\x12\x12\n\nmapping_id\x18\x03 \x01(\x04\x12\x0e\n\x06rel_pc\x18\x04 \x01(\x04\x12\x17\n\x0fsource_path_iid\x18\x05 \x01(\x04\x12\x13\n\x0bline_number\x18\x06 \x01(\r\x12+\n\x04kind\x18\x07 \x01(\x0e\x32\x1b.perfetto.protos.Frame.KindH\x00\x12\x12\n\x08kind_str\x18\x08 \x01(\tH\x00\"}\n\x04Kind\x12\x10\n\x0cKIND_UNKNOWN\x10\x00\x12\x0f\n\x0bKIND_NATIVE\x10\x01\x12\x0f\n\x0bKIND_KERNEL\x10\x02\x12\x14\n\x10KIND_INTERPRETED\x10\x03\x12\x0c\n\x08KIND_JIT\x10\x04\x12\x0b\n\x07KIND_GC\x10\x05\x12\x10\n\x0cKIND_RUNTIME\x10\x06\x42\x0c\n\nkind_field\"+\n\tCallstack\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x11\n\tframe_ids\x18\x02 \x03(\x04\"\x93\x01\n\x0fInlineCallstack\x12\x36\n\x06\x66rames\x18\x01 \x03(\x0b\x32&.perfetto.protos.InlineCallstack.Frame\x1aH\n\x05\x46rame\x12\x15\n\rfunction_name\x18\x01 \x01(\t\x12\x13\n\x0bsource_file\x18\x02 \x01(\t\x12\x13\n\x0bline_number\x18\x03 \x01(\r\"\x80\r\n\x0bStackSample\x12@\n\x0ctask_context\x18\x01 \x01(\x0b\x32(.perfetto.protos.StackSample.TaskContextH\x00\x12\x1a\n\x10task_context_iid\x18\x02 \x01(\x04H\x00\x12J\n\x11\x65xecution_context\x18\x03 \x01(\x0b\x32-.perfetto.protos.StackSample.ExecutionContextH\x01\x12\x1f\n\x15\x65xecution_context_iid\x18\x04 \x01(\x04H\x01\x12\x35\n\tcallstack\x18\x05 \x01(\x0b\x32 .perfetto.protos.InlineCallstackH\x02\x12\x17\n\rcallstack_iid\x18\x06 \x01(\x04H\x02\x12\x16\n\x0cunwind_error\x18\x07 \x01(\tH\x03\x12\x1a\n\x10unwind_error_iid\x18\x08 \x01(\x04H\x03\x12L\n\x12primary_descriptor\x18\t \x01(\x0b\x32..perfetto.protos.StackSample.CounterDescriptorH\x04\x12 \n\x16primary_descriptor_iid\x18\n \x01(\x04H\x04\x12\x16\n\x0eprimary_weight\x18\x0b \x01(\x04\x12L\n\x14\x66ollower_descriptors\x18\x0c \x03(\x0b\x32..perfetto.protos.StackSample.CounterDescriptor\x12$\n\x18\x66ollower_descriptor_iids\x18\r \x03(\x04\x42\x02\x10\x01\x12\x1c\n\x10\x66ollower_weights\x18\x0e \x03(\x04\x42\x02\x10\x01\x1a\x46\n\x0bTaskContext\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x0b\n\x03tid\x18\x03 \x01(\r\x12\x10\n\x08\x61sync_id\x18\x04 \x01(\x04\x1aU\n\x16\x41syncContextDescriptor\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04kind\x18\x03 \x01(\t\x12\x12\n\nparent_iid\x18\x04 \x01(\x04\x1a]\n\x10\x45xecutionContext\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03\x63pu\x18\x02 \x01(\r\x12/\n\x04mode\x18\x03 \x01(\x0e\x32!.perfetto.protos.StackSample.Mode\x1a\xb7\x02\n\x11\x43ounterDescriptor\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x31\n\x04unit\x18\x03 \x01(\x0e\x32!.perfetto.protos.StackSample.UnitH\x00\x12\x12\n\x08unit_str\x18\x04 \x01(\tH\x00\x12\x17\n\x0funit_multiplier\x18\x05 \x01(\x04\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\x12\x43\n\x05scope\x18\x07 \x01(\x0e\x32\x34.perfetto.protos.StackSample.CounterDescriptor.Scope\"?\n\x05Scope\x12\x15\n\x11SCOPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cSCOPE_GLOBAL\x10\x01\x12\r\n\tSCOPE_CPU\x10\x02\x42\x0c\n\nunit_field\"y\n\x04Mode\x12\x10\n\x0cMODE_UNKNOWN\x10\x00\x12\r\n\tMODE_USER\x10\x01\x12\x0f\n\x0bMODE_KERNEL\x10\x02\x12\x13\n\x0fMODE_HYPERVISOR\x10\x03\x12\x13\n\x0fMODE_GUEST_USER\x10\x04\x12\x15\n\x11MODE_GUEST_KERNEL\x10\x05\"\xde\x01\n\x04Unit\x12\x14\n\x10UNIT_UNSPECIFIED\x10\x00\x12\x14\n\x10UNIT_NANOSECONDS\x10\x01\x12\x13\n\x0fUNIT_CPU_CYCLES\x10\x02\x12\x15\n\x11UNIT_INSTRUCTIONS\x10\x03\x12\x0e\n\nUNIT_BYTES\x10\x04\x12\x14\n\x10UNIT_PAGE_FAULTS\x10\x05\x12\x15\n\x11UNIT_CACHE_MISSES\x10\x06\x12\x19\n\x15UNIT_CACHE_REFERENCES\x10\x07\x12\x16\n\x12UNIT_BRANCH_MISSES\x10\x08\x12\x0e\n\nUNIT_COUNT\x10\tB\x14\n\x12task_context_fieldB\x19\n\x17\x65xecution_context_fieldB\x11\n\x0f\x63\x61llstack_fieldB\x14\n\x12unwind_error_fieldB\x1a\n\x18primary_descriptor_field\"\xbf\x01\n\x13StackSampleDefaults\x12\x0e\n\x06source\x18\x01 \x01(\t\x12J\n\x12primary_descriptor\x18\x02 \x01(\x0b\x32..perfetto.protos.StackSample.CounterDescriptor\x12L\n\x14\x66ollower_descriptors\x18\x03 \x03(\x0b\x32..perfetto.protos.StackSample.CounterDescriptor\"*\n\rHistogramName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"Z\n\x15\x43hromeHistogramSample\x12\x11\n\tname_hash\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06sample\x18\x03 \x01(\x03\x12\x10\n\x08name_iid\x18\x04 \x01(\x04\"\xac\x07\n\x0f\x44\x65\x62ugAnnotation\x12\x12\n\x08name_iid\x18\x01 \x01(\x04H\x00\x12\x0e\n\x04name\x18\n \x01(\tH\x00\x12\x14\n\nbool_value\x18\x02 \x01(\x08H\x01\x12\x14\n\nuint_value\x18\x03 \x01(\x04H\x01\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x01\x12\x16\n\x0c\x64ouble_value\x18\x05 \x01(\x01H\x01\x12\x17\n\rpointer_value\x18\x07 \x01(\x04H\x01\x12\x44\n\x0cnested_value\x18\x08 \x01(\x0b\x32,.perfetto.protos.DebugAnnotation.NestedValueH\x01\x12\x1b\n\x11legacy_json_value\x18\t \x01(\tH\x01\x12\x16\n\x0cstring_value\x18\x06 \x01(\tH\x01\x12\x1a\n\x10string_value_iid\x18\x11 \x01(\x04H\x01\x12\x19\n\x0fproto_type_name\x18\x10 \x01(\tH\x02\x12\x1d\n\x13proto_type_name_iid\x18\r \x01(\x04H\x02\x12\x13\n\x0bproto_value\x18\x0e \x01(\x0c\x12\x36\n\x0c\x64ict_entries\x18\x0b \x03(\x0b\x32 .perfetto.protos.DebugAnnotation\x12\x36\n\x0c\x61rray_values\x18\x0c \x03(\x0b\x32 .perfetto.protos.DebugAnnotation\x1a\xfc\x02\n\x0bNestedValue\x12L\n\x0bnested_type\x18\x01 \x01(\x0e\x32\x37.perfetto.protos.DebugAnnotation.NestedValue.NestedType\x12\x11\n\tdict_keys\x18\x02 \x03(\t\x12\x41\n\x0b\x64ict_values\x18\x03 \x03(\x0b\x32,.perfetto.protos.DebugAnnotation.NestedValue\x12\x42\n\x0c\x61rray_values\x18\x04 \x03(\x0b\x32,.perfetto.protos.DebugAnnotation.NestedValue\x12\x11\n\tint_value\x18\x05 \x01(\x03\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x12\n\nbool_value\x18\x07 \x01(\x08\x12\x14\n\x0cstring_value\x18\x08 \x01(\t\"2\n\nNestedType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x08\n\x04\x44ICT\x10\x01\x12\t\n\x05\x41RRAY\x10\x02\x42\x0c\n\nname_fieldB\x07\n\x05valueB\x17\n\x15proto_type_descriptor\"0\n\x13\x44\x65\x62ugAnnotationName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"9\n\x1c\x44\x65\x62ugAnnotationValueTypeName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x83\x02\n\nLogMessage\x12\x1b\n\x13source_location_iid\x18\x01 \x01(\x04\x12\x10\n\x08\x62ody_iid\x18\x02 \x01(\x04\x12\x32\n\x04prio\x18\x03 \x01(\x0e\x32$.perfetto.protos.LogMessage.Priority\"\x91\x01\n\x08Priority\x12\x14\n\x10PRIO_UNSPECIFIED\x10\x00\x12\x0f\n\x0bPRIO_UNUSED\x10\x01\x12\x10\n\x0cPRIO_VERBOSE\x10\x02\x12\x0e\n\nPRIO_DEBUG\x10\x03\x12\r\n\tPRIO_INFO\x10\x04\x12\r\n\tPRIO_WARN\x10\x05\x12\x0e\n\nPRIO_ERROR\x10\x06\x12\x0e\n\nPRIO_FATAL\x10\x07\"+\n\x0eLogMessageBody\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04\x62ody\x18\x02 \x01(\t\"M\n\x1aUnsymbolizedSourceLocation\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x12\n\nmapping_id\x18\x02 \x01(\x04\x12\x0e\n\x06rel_pc\x18\x03 \x01(\x04\"\\\n\x0eSourceLocation\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x11\n\tfile_name\x18\x02 \x01(\t\x12\x15\n\rfunction_name\x18\x03 \x01(\t\x12\x13\n\x0bline_number\x18\x04 \x01(\r\"$\n\x15\x43hromeActiveProcesses\x12\x0b\n\x03pid\x18\x01 \x03(\x05\"\xee\x02\n\x1a\x43hromeApplicationStateInfo\x12]\n\x11\x61pplication_state\x18\x01 \x01(\x0e\x32\x42.perfetto.protos.ChromeApplicationStateInfo.ChromeApplicationState\"\xf0\x01\n\x16\x43hromeApplicationState\x12\x1d\n\x19\x41PPLICATION_STATE_UNKNOWN\x10\x00\x12,\n(APPLICATION_STATE_HAS_RUNNING_ACTIVITIES\x10\x01\x12+\n\'APPLICATION_STATE_HAS_PAUSED_ACTIVITIES\x10\x02\x12,\n(APPLICATION_STATE_HAS_STOPPED_ACTIVITIES\x10\x03\x12.\n*APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES\x10\x04\"\xbf\x08\n\x1e\x43hromeCompositorSchedulerState\x12\x44\n\rstate_machine\x18\x01 \x01(\x0b\x32-.perfetto.protos.ChromeCompositorStateMachine\x12$\n\x1cobserving_begin_frame_source\x18\x02 \x01(\x08\x12&\n\x1e\x62\x65gin_impl_frame_deadline_task\x18\x03 \x01(\x08\x12 \n\x18pending_begin_frame_task\x18\x04 \x01(\x08\x12\x33\n+skipped_last_frame_missed_exceeded_deadline\x18\x05 \x01(\x08\x12G\n\rinside_action\x18\x07 \x01(\x0e\x32\x30.perfetto.protos.ChromeCompositorSchedulerAction\x12\x61\n\rdeadline_mode\x18\x08 \x01(\x0e\x32J.perfetto.protos.ChromeCompositorSchedulerState.BeginImplFrameDeadlineMode\x12\x13\n\x0b\x64\x65\x61\x64line_us\x18\t \x01(\x03\x12 \n\x18\x64\x65\x61\x64line_scheduled_at_us\x18\n \x01(\x03\x12\x0e\n\x06now_us\x18\x0b \x01(\x03\x12 \n\x18now_to_deadline_delta_us\x18\x0c \x01(\x03\x12-\n%now_to_deadline_scheduled_at_delta_us\x18\r \x01(\x03\x12\x42\n\x15\x62\x65gin_impl_frame_args\x18\x0e \x01(\x0b\x32#.perfetto.protos.BeginImplFrameArgs\x12L\n\x1a\x62\x65gin_frame_observer_state\x18\x0f \x01(\x0b\x32(.perfetto.protos.BeginFrameObserverState\x12H\n\x18\x62\x65gin_frame_source_state\x18\x10 \x01(\x0b\x32&.perfetto.protos.BeginFrameSourceState\x12K\n\x19\x63ompositor_timing_history\x18\x11 \x01(\x0b\x32(.perfetto.protos.CompositorTimingHistory\"\xbe\x01\n\x1a\x42\x65ginImplFrameDeadlineMode\x12\x1d\n\x19\x44\x45\x41\x44LINE_MODE_UNSPECIFIED\x10\x00\x12\x16\n\x12\x44\x45\x41\x44LINE_MODE_NONE\x10\x01\x12\x1b\n\x17\x44\x45\x41\x44LINE_MODE_IMMEDIATE\x10\x02\x12\x19\n\x15\x44\x45\x41\x44LINE_MODE_REGULAR\x10\x03\x12\x16\n\x12\x44\x45\x41\x44LINE_MODE_LATE\x10\x04\x12\x19\n\x15\x44\x45\x41\x44LINE_MODE_BLOCKED\x10\x05J\x04\x08\x06\x10\x07\"\xfe\x1c\n\x1c\x43hromeCompositorStateMachine\x12M\n\x0bmajor_state\x18\x01 \x01(\x0b\x32\x38.perfetto.protos.ChromeCompositorStateMachine.MajorState\x12M\n\x0bminor_state\x18\x02 \x01(\x0b\x32\x38.perfetto.protos.ChromeCompositorStateMachine.MinorState\x1a\x93\n\n\nMajorState\x12\x45\n\x0bnext_action\x18\x01 \x01(\x0e\x32\x30.perfetto.protos.ChromeCompositorSchedulerAction\x12l\n\x16\x62\x65gin_impl_frame_state\x18\x02 \x01(\x0e\x32L.perfetto.protos.ChromeCompositorStateMachine.MajorState.BeginImplFrameState\x12l\n\x16\x62\x65gin_main_frame_state\x18\x03 \x01(\x0e\x32L.perfetto.protos.ChromeCompositorStateMachine.MajorState.BeginMainFrameState\x12u\n\x1blayer_tree_frame_sink_state\x18\x04 \x01(\x0e\x32P.perfetto.protos.ChromeCompositorStateMachine.MajorState.LayerTreeFrameSinkState\x12p\n\x13\x66orced_redraw_state\x18\x05 \x01(\x0e\x32S.perfetto.protos.ChromeCompositorStateMachine.MajorState.ForcedRedrawOnTimeoutState\"\xa1\x01\n\x13\x42\x65ginImplFrameState\x12 \n\x1c\x42\x45GIN_IMPL_FRAME_UNSPECIFIED\x10\x00\x12\x19\n\x15\x42\x45GIN_IMPL_FRAME_IDLE\x10\x01\x12\'\n#BEGIN_IMPL_FRAME_INSIDE_BEGIN_FRAME\x10\x02\x12$\n BEGIN_IMPL_FRAME_INSIDE_DEADLINE\x10\x03\"\x93\x01\n\x13\x42\x65ginMainFrameState\x12 \n\x1c\x42\x45GIN_MAIN_FRAME_UNSPECIFIED\x10\x00\x12\x19\n\x15\x42\x45GIN_MAIN_FRAME_IDLE\x10\x01\x12\x19\n\x15\x42\x45GIN_MAIN_FRAME_SENT\x10\x02\x12$\n BEGIN_MAIN_FRAME_READY_TO_COMMIT\x10\x03\"\xf4\x01\n\x17LayerTreeFrameSinkState\x12 \n\x1cLAYER_TREE_FRAME_UNSPECIFIED\x10\x00\x12\x19\n\x15LAYER_TREE_FRAME_NONE\x10\x01\x12\x1b\n\x17LAYER_TREE_FRAME_ACTIVE\x10\x02\x12\x1d\n\x19LAYER_TREE_FRAME_CREATING\x10\x03\x12-\n)LAYER_TREE_FRAME_WAITING_FOR_FIRST_COMMIT\x10\x04\x12\x31\n-LAYER_TREE_FRAME_WAITING_FOR_FIRST_ACTIVATION\x10\x05\"\xc7\x01\n\x1a\x46orcedRedrawOnTimeoutState\x12\x1d\n\x19\x46ORCED_REDRAW_UNSPECIFIED\x10\x00\x12\x16\n\x12\x46ORCED_REDRAW_IDLE\x10\x01\x12$\n FORCED_REDRAW_WAITING_FOR_COMMIT\x10\x02\x12(\n$FORCED_REDRAW_WAITING_FOR_ACTIVATION\x10\x03\x12\"\n\x1e\x46ORCED_REDRAW_WAITING_FOR_DRAW\x10\x04\x1a\xa9\x11\n\nMinorState\x12\x14\n\x0c\x63ommit_count\x18\x01 \x01(\x05\x12\x1c\n\x14\x63urrent_frame_number\x18\x02 \x01(\x05\x12*\n\"last_frame_number_submit_performed\x18\x03 \x01(\x05\x12(\n last_frame_number_draw_performed\x18\x04 \x01(\x05\x12/\n\'last_frame_number_begin_main_frame_sent\x18\x05 \x01(\x05\x12\x10\n\x08\x64id_draw\x18\x06 \x01(\x08\x12\x33\n+did_send_begin_main_frame_for_current_frame\x18\x07 \x01(\x08\x12\x36\n.did_notify_begin_main_frame_not_expected_until\x18\x08 \x01(\x08\x12\x35\n-did_notify_begin_main_frame_not_expected_soon\x18\t \x01(\x08\x12+\n#wants_begin_main_frame_not_expected\x18\n \x01(\x08\x12\x1f\n\x17\x64id_commit_during_frame\x18\x0b \x01(\x08\x12,\n$did_invalidate_layer_tree_frame_sink\x18\x0c \x01(\x08\x12)\n!did_perform_impl_side_invalidaion\x18\r \x01(\x08\x12\x19\n\x11\x64id_prepare_tiles\x18\x0e \x01(\x08\x12+\n#consecutive_checkerboard_animations\x18\x0f \x01(\x05\x12\x1d\n\x15pending_submit_frames\x18\x10 \x01(\x05\x12\x38\n0submit_frames_with_current_layer_tree_frame_sink\x18\x11 \x01(\x05\x12\x14\n\x0cneeds_redraw\x18\x12 \x01(\x08\x12\x1b\n\x13needs_prepare_tiles\x18\x13 \x01(\x08\x12\x1e\n\x16needs_begin_main_frame\x18\x14 \x01(\x08\x12\"\n\x1aneeds_one_begin_impl_frame\x18\x15 \x01(\x08\x12\x0f\n\x07visible\x18\x16 \x01(\x08\x12!\n\x19\x62\x65gin_frame_source_paused\x18\x17 \x01(\x08\x12\x10\n\x08\x63\x61n_draw\x18\x18 \x01(\x08\x12\x19\n\x11resourceless_draw\x18\x19 \x01(\x08\x12\x18\n\x10has_pending_tree\x18\x1a \x01(\x08\x12,\n$pending_tree_is_ready_for_activation\x18\x1b \x01(\x08\x12$\n\x1c\x61\x63tive_tree_needs_first_draw\x18\x1c \x01(\x08\x12$\n\x1c\x61\x63tive_tree_is_ready_to_draw\x18\x1d \x01(\x08\x12=\n5did_create_and_initialize_first_layer_tree_frame_sink\x18\x1e \x01(\x08\x12\\\n\rtree_priority\x18\x1f \x01(\x0e\x32\x45.perfetto.protos.ChromeCompositorStateMachine.MinorState.TreePriority\x12i\n\x14scroll_handler_state\x18 \x01(\x0e\x32K.perfetto.protos.ChromeCompositorStateMachine.MinorState.ScrollHandlerState\x12\x35\n-critical_begin_main_frame_to_activate_is_fast\x18! \x01(\x08\x12(\n main_thread_missed_last_deadline\x18\" \x01(\x08\x12 \n\x18video_needs_begin_frames\x18$ \x01(\x08\x12\x1e\n\x16\x64\x65\x66\x65r_begin_main_frame\x18% \x01(\x08\x12\"\n\x1alast_commit_had_no_updates\x18& \x01(\x08\x12\x1e\n\x16\x64id_draw_in_last_frame\x18\' \x01(\x08\x12 \n\x18\x64id_submit_in_last_frame\x18( \x01(\x08\x12$\n\x1cneeds_impl_side_invalidation\x18) \x01(\x08\x12)\n!current_pending_tree_is_impl_side\x18* \x01(\x08\x12+\n#previous_pending_tree_was_impl_side\x18+ \x01(\x08\x12\x35\n-processing_animation_worklets_for_active_tree\x18, \x01(\x08\x12\x36\n.processing_animation_worklets_for_pending_tree\x18- \x01(\x08\x12\x32\n*processing_paint_worklets_for_pending_tree\x18. \x01(\x08\"\xb8\x01\n\x0cTreePriority\x12\x1d\n\x19TREE_PRIORITY_UNSPECIFIED\x10\x00\x12.\n*TREE_PRIORITY_SAME_PRIORITY_FOR_BOTH_TREES\x10\x01\x12+\n\'TREE_PRIORITY_SMOOTHNESS_TAKES_PRIORITY\x10\x02\x12,\n(TREE_PRIORITY_NEW_CONTENT_TAKES_PRIORITY\x10\x03\"\x82\x01\n\x12ScrollHandlerState\x12\x1e\n\x1aSCROLL_HANDLER_UNSPECIFIED\x10\x00\x12!\n\x1dSCROLL_AFFECTS_SCROLL_HANDLER\x10\x01\x12)\n%SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER\x10\x02J\x04\x08#\x10$\"\xaa\x04\n\x0e\x42\x65ginFrameArgs\x12@\n\x04type\x18\x01 \x01(\x0e\x32\x32.perfetto.protos.BeginFrameArgs.BeginFrameArgsType\x12\x11\n\tsource_id\x18\x02 \x01(\x04\x12\x17\n\x0fsequence_number\x18\x03 \x01(\x04\x12\x15\n\rframe_time_us\x18\x04 \x01(\x03\x12\x13\n\x0b\x64\x65\x61\x64line_us\x18\x05 \x01(\x03\x12\x19\n\x11interval_delta_us\x18\x06 \x01(\x03\x12\x18\n\x10on_critical_path\x18\x07 \x01(\x08\x12\x14\n\x0c\x61nimate_only\x18\x08 \x01(\x08\x12\x1d\n\x13source_location_iid\x18\t \x01(\x04H\x00\x12:\n\x0fsource_location\x18\n \x01(\x0b\x32\x1f.perfetto.protos.SourceLocationH\x00\x12#\n\x1b\x66rames_throttled_since_last\x18\x0c \x01(\x03\"\xa2\x01\n\x12\x42\x65ginFrameArgsType\x12%\n!BEGIN_FRAME_ARGS_TYPE_UNSPECIFIED\x10\x00\x12!\n\x1d\x42\x45GIN_FRAME_ARGS_TYPE_INVALID\x10\x01\x12 \n\x1c\x42\x45GIN_FRAME_ARGS_TYPE_NORMAL\x10\x02\x12 \n\x1c\x42\x45GIN_FRAME_ARGS_TYPE_MISSED\x10\x03\x42\x0e\n\x0c\x63reated_from\"\xc0\x04\n\x12\x42\x65ginImplFrameArgs\x12\x15\n\rupdated_at_us\x18\x01 \x01(\x03\x12\x16\n\x0e\x66inished_at_us\x18\x02 \x01(\x03\x12\x38\n\x05state\x18\x03 \x01(\x0e\x32).perfetto.protos.BeginImplFrameArgs.State\x12\x37\n\x0c\x63urrent_args\x18\x04 \x01(\x0b\x32\x1f.perfetto.protos.BeginFrameArgsH\x00\x12\x34\n\tlast_args\x18\x05 \x01(\x0b\x32\x1f.perfetto.protos.BeginFrameArgsH\x00\x12L\n\x10timestamps_in_us\x18\x06 \x01(\x0b\x32\x32.perfetto.protos.BeginImplFrameArgs.TimestampsInUs\x1a\xc1\x01\n\x0eTimestampsInUs\x12\x16\n\x0einterval_delta\x18\x01 \x01(\x03\x12\x1d\n\x15now_to_deadline_delta\x18\x02 \x01(\x03\x12\x1f\n\x17\x66rame_time_to_now_delta\x18\x03 \x01(\x03\x12$\n\x1c\x66rame_time_to_deadline_delta\x18\x04 \x01(\x03\x12\x0b\n\x03now\x18\x05 \x01(\x03\x12\x12\n\nframe_time\x18\x06 \x01(\x03\x12\x10\n\x08\x64\x65\x61\x64line\x18\x07 \x01(\x03\"8\n\x05State\x12\x18\n\x14\x42\x45GIN_FRAME_FINISHED\x10\x00\x12\x15\n\x11\x42\x45GIN_FRAME_USING\x10\x01\x42\x06\n\x04\x61rgs\"{\n\x17\x42\x65ginFrameObserverState\x12 \n\x18\x64ropped_begin_frame_args\x18\x01 \x01(\x03\x12>\n\x15last_begin_frame_args\x18\x02 \x01(\x0b\x32\x1f.perfetto.protos.BeginFrameArgs\"\x91\x01\n\x15\x42\x65ginFrameSourceState\x12\x11\n\tsource_id\x18\x01 \x01(\r\x12\x0e\n\x06paused\x18\x02 \x01(\x08\x12\x15\n\rnum_observers\x18\x03 \x01(\r\x12>\n\x15last_begin_frame_args\x18\x04 \x01(\x0b\x32\x1f.perfetto.protos.BeginFrameArgs\"\xfc\x02\n\x17\x43ompositorTimingHistory\x12\x39\n1begin_main_frame_queue_critical_estimate_delta_us\x18\x01 \x01(\x03\x12=\n5begin_main_frame_queue_not_critical_estimate_delta_us\x18\x02 \x01(\x03\x12\x43\n;begin_main_frame_start_to_ready_to_commit_estimate_delta_us\x18\x03 \x01(\x03\x12\x35\n-commit_to_ready_to_activate_estimate_delta_us\x18\x04 \x01(\x03\x12\'\n\x1fprepare_tiles_estimate_delta_us\x18\x05 \x01(\x03\x12\"\n\x1a\x61\x63tivate_estimate_delta_us\x18\x06 \x01(\x03\x12\x1e\n\x16\x64raw_estimate_delta_us\x18\x07 \x01(\x03\">\n\x1e\x43hromeContentSettingsEventInfo\x12\x1c\n\x14number_of_exceptions\x18\x01 \x01(\r\"\xe0\x08\n\x13\x43hromeFrameReporter\x12\x39\n\x05state\x18\x01 \x01(\x0e\x32*.perfetto.protos.ChromeFrameReporter.State\x12\x44\n\x06reason\x18\x02 \x01(\x0e\x32\x34.perfetto.protos.ChromeFrameReporter.FrameDropReason\x12\x14\n\x0c\x66rame_source\x18\x03 \x01(\x04\x12\x16\n\x0e\x66rame_sequence\x18\x04 \x01(\x04\x12\x1a\n\x12\x61\x66\x66\x65\x63ts_smoothness\x18\x05 \x01(\x08\x12\x46\n\x0cscroll_state\x18\x06 \x01(\x0e\x32\x30.perfetto.protos.ChromeFrameReporter.ScrollState\x12\x1a\n\x12has_main_animation\x18\x07 \x01(\x08\x12 \n\x18has_compositor_animation\x18\x08 \x01(\x08\x12\x1d\n\x15has_smooth_input_main\x18\t \x01(\x08\x12\x1b\n\x13has_missing_content\x18\n \x01(\x08\x12\x1a\n\x12layer_tree_host_id\x18\x0b \x01(\x04\x12\x18\n\x10has_high_latency\x18\x0c \x01(\x08\x12\x42\n\nframe_type\x18\r \x01(\x0e\x32..perfetto.protos.ChromeFrameReporter.FrameType\x12\'\n\x1fhigh_latency_contribution_stage\x18\x0e \x03(\t\x12#\n\x1b\x63heckerboarded_needs_raster\x18\x0f \x01(\x08\x12#\n\x1b\x63heckerboarded_needs_record\x18\x10 \x01(\x08\x12\x1e\n\x16surface_frame_trace_id\x18\x11 \x01(\x03\x12\x18\n\x10\x64isplay_trace_id\x18\x12 \x01(\x03\"m\n\x05State\x12\x1b\n\x17STATE_NO_UPDATE_DESIRED\x10\x00\x12\x17\n\x13STATE_PRESENTED_ALL\x10\x01\x12\x1b\n\x17STATE_PRESENTED_PARTIAL\x10\x02\x12\x11\n\rSTATE_DROPPED\x10\x03\"~\n\x0f\x46rameDropReason\x12\x16\n\x12REASON_UNSPECIFIED\x10\x00\x12\x1d\n\x19REASON_DISPLAY_COMPOSITOR\x10\x01\x12\x16\n\x12REASON_MAIN_THREAD\x10\x02\x12\x1c\n\x18REASON_CLIENT_COMPOSITOR\x10\x03\"{\n\x0bScrollState\x12\x0f\n\x0bSCROLL_NONE\x10\x00\x12\x16\n\x12SCROLL_MAIN_THREAD\x10\x01\x12\x1c\n\x18SCROLL_COMPOSITOR_THREAD\x10\x02\x12\x11\n\rSCROLL_RASTER\x10\x03\x12\x12\n\x0eSCROLL_UNKNOWN\x10\x04\"%\n\tFrameType\x12\n\n\x06\x46ORKED\x10\x00\x12\x0c\n\x08\x42\x41\x43KFILL\x10\x01:\x02\x18\x01\"\"\n\x12\x43hromeKeyedService\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xf6\r\n\x11\x43hromeLatencyInfo\x12\x10\n\x08trace_id\x18\x01 \x01(\x03\x12\x35\n\x04step\x18\x02 \x01(\x0e\x32\'.perfetto.protos.ChromeLatencyInfo.Step\x12\x1a\n\x12\x66rame_tree_node_id\x18\x03 \x01(\x05\x12H\n\x0e\x63omponent_info\x18\x04 \x03(\x0b\x32\x30.perfetto.protos.ChromeLatencyInfo.ComponentInfo\x12\x14\n\x0cis_coalesced\x18\x05 \x01(\x08\x12\x19\n\x11gesture_scroll_id\x18\x06 \x01(\x03\x12\x10\n\x08touch_id\x18\x07 \x01(\x03\x12@\n\ninput_type\x18\x08 \x01(\x0e\x32,.perfetto.protos.ChromeLatencyInfo.InputType\x1aq\n\rComponentInfo\x12O\n\x0e\x63omponent_type\x18\x01 \x01(\x0e\x32\x37.perfetto.protos.ChromeLatencyInfo.LatencyComponentType\x12\x0f\n\x07time_us\x18\x02 \x01(\x04\"\x92\x03\n\x04Step\x12\x14\n\x10STEP_UNSPECIFIED\x10\x00\x12\x1c\n\x18STEP_SEND_INPUT_EVENT_UI\x10\x03\x12 \n\x1cSTEP_HANDLE_INPUT_EVENT_IMPL\x10\x05\x12(\n$STEP_DID_HANDLE_INPUT_AND_OVERSCROLL\x10\x08\x12 \n\x1cSTEP_HANDLE_INPUT_EVENT_MAIN\x10\x04\x12\"\n\x1eSTEP_MAIN_THREAD_SCROLL_UPDATE\x10\x02\x12\'\n#STEP_HANDLE_INPUT_EVENT_MAIN_COMMIT\x10\x01\x12)\n%STEP_HANDLED_INPUT_EVENT_MAIN_OR_IMPL\x10\t\x12!\n\x1dSTEP_HANDLED_INPUT_EVENT_IMPL\x10\n\x12\x15\n\x11STEP_SWAP_BUFFERS\x10\x06\x12\x16\n\x12STEP_DRAW_AND_SWAP\x10\x07\x12\x1e\n\x1aSTEP_FINISHED_SWAP_BUFFERS\x10\x0b\"\xf5\x05\n\x14LatencyComponentType\x12\x19\n\x15\x43OMPONENT_UNSPECIFIED\x10\x00\x12+\n\'COMPONENT_INPUT_EVENT_LATENCY_BEGIN_RWH\x10\x01\x12\x38\n4COMPONENT_INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL\x10\x02\x12>\n:COMPONENT_INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL\x10\x03\x12*\n&COMPONENT_INPUT_EVENT_LATENCY_ORIGINAL\x10\x04\x12$\n COMPONENT_INPUT_EVENT_LATENCY_UI\x10\x05\x12/\n+COMPONENT_INPUT_EVENT_LATENCY_RENDERER_MAIN\x10\x06\x12:\n6COMPONENT_INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_MAIN\x10\x07\x12:\n6COMPONENT_INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_IMPL\x10\x08\x12:\n6COMPONENT_INPUT_EVENT_LATENCY_SCROLL_UPDATE_LAST_EVENT\x10\t\x12)\n%COMPONENT_INPUT_EVENT_LATENCY_ACK_RWH\x10\n\x12/\n+COMPONENT_INPUT_EVENT_LATENCY_RENDERER_SWAP\x10\x0b\x12/\n+COMPONENT_DISPLAY_COMPOSITOR_RECEIVED_FRAME\x10\x0c\x12)\n%COMPONENT_INPUT_EVENT_GPU_SWAP_BUFFER\x10\r\x12,\n(COMPONENT_INPUT_EVENT_LATENCY_FRAME_SWAP\x10\x0e\"\xac\x01\n\tInputType\x12\x18\n\x14UNSPECIFIED_OR_OTHER\x10\x00\x12\x0f\n\x0bTOUCH_MOVED\x10\x01\x12\x18\n\x14GESTURE_SCROLL_BEGIN\x10\x02\x12\x19\n\x15GESTURE_SCROLL_UPDATE\x10\x03\x12\x16\n\x12GESTURE_SCROLL_END\x10\x04\x12\x0f\n\x0bGESTURE_TAP\x10\x05\x12\x16\n\x12GESTURE_TAP_CANCEL\x10\x06\"\xce\x07\n\x0f\x43hromeLegacyIpc\x12\x44\n\rmessage_class\x18\x01 \x01(\x0e\x32-.perfetto.protos.ChromeLegacyIpc.MessageClass\x12\x14\n\x0cmessage_line\x18\x02 \x01(\r\"\xde\x06\n\x0cMessageClass\x12\x15\n\x11\x43LASS_UNSPECIFIED\x10\x00\x12\x14\n\x10\x43LASS_AUTOMATION\x10\x01\x12\x0f\n\x0b\x43LASS_FRAME\x10\x02\x12\x0e\n\nCLASS_PAGE\x10\x03\x12\x0e\n\nCLASS_VIEW\x10\x04\x12\x10\n\x0c\x43LASS_WIDGET\x10\x05\x12\x0f\n\x0b\x43LASS_INPUT\x10\x06\x12\x0e\n\nCLASS_TEST\x10\x07\x12\x10\n\x0c\x43LASS_WORKER\x10\x08\x12\x0e\n\nCLASS_NACL\x10\t\x12\x15\n\x11\x43LASS_GPU_CHANNEL\x10\n\x12\x0f\n\x0b\x43LASS_MEDIA\x10\x0b\x12\x0f\n\x0b\x43LASS_PPAPI\x10\x0c\x12\x10\n\x0c\x43LASS_CHROME\x10\r\x12\x0e\n\nCLASS_DRAG\x10\x0e\x12\x0f\n\x0b\x43LASS_PRINT\x10\x0f\x12\x13\n\x0f\x43LASS_EXTENSION\x10\x10\x12\x1b\n\x17\x43LASS_TEXT_INPUT_CLIENT\x10\x11\x12\x14\n\x10\x43LASS_BLINK_TEST\x10\x12\x12\x17\n\x13\x43LASS_ACCESSIBILITY\x10\x13\x12\x13\n\x0f\x43LASS_PRERENDER\x10\x14\x12\x14\n\x10\x43LASS_CHROMOTING\x10\x15\x12\x18\n\x14\x43LASS_BROWSER_PLUGIN\x10\x16\x12\x1a\n\x16\x43LASS_ANDROID_WEB_VIEW\x10\x17\x12\x13\n\x0f\x43LASS_NACL_HOST\x10\x18\x12\x19\n\x15\x43LASS_ENCRYPTED_MEDIA\x10\x19\x12\x0e\n\nCLASS_CAST\x10\x1a\x12\x19\n\x15\x43LASS_GIN_JAVA_BRIDGE\x10\x1b\x12!\n\x1d\x43LASS_CHROME_UTILITY_PRINTING\x10\x1c\x12\x13\n\x0f\x43LASS_OZONE_GPU\x10\x1d\x12\x12\n\x0e\x43LASS_WEB_TEST\x10\x1e\x12\x17\n\x13\x43LASS_NETWORK_HINTS\x10\x1f\x12\x1f\n\x1b\x43LASS_EXTENSIONS_GUEST_VIEW\x10 \x12\x14\n\x10\x43LASS_GUEST_VIEW\x10!\x12\x1f\n\x1b\x43LASS_MEDIA_PLAYER_DELEGATE\x10\"\x12\x1a\n\x16\x43LASS_EXTENSION_WORKER\x10#\x12\x1c\n\x18\x43LASS_SUBRESOURCE_FILTER\x10$\x12\x1b\n\x17\x43LASS_UNFREEZABLE_FRAME\x10%\"T\n\x11\x43hromeMessagePump\x12\x1e\n\x16sent_messages_in_queue\x18\x01 \x01(\x08\x12\x1f\n\x17io_handler_location_iid\x18\x02 \x01(\x04\"\xcc\x01\n\x13\x43hromeMojoEventInfo\x12$\n\x1cwatcher_notify_interface_tag\x18\x01 \x01(\t\x12\x10\n\x08ipc_hash\x18\x02 \x01(\r\x12\x1a\n\x12mojo_interface_tag\x18\x03 \x01(\t\x12!\n\x19mojo_interface_method_iid\x18\x04 \x01(\x04\x12\x10\n\x08is_reply\x18\x05 \x01(\x08\x12\x14\n\x0cpayload_size\x18\x06 \x01(\x04\x12\x16\n\x0e\x64\x61ta_num_bytes\x18\x07 \x01(\x04\"~\n\x1c\x43hromeRendererSchedulerState\x12\x32\n\trail_mode\x18\x01 \x01(\x0e\x32\x1f.perfetto.protos.ChromeRAILMode\x12\x17\n\x0fis_backgrounded\x18\x02 \x01(\x08\x12\x11\n\tis_hidden\x18\x03 \x01(\x08\"6\n\x0f\x43hromeUserEvent\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tion_hash\x18\x02 \x01(\x04\"P\n\x1b\x43hromeWindowHandleEventInfo\x12\x0b\n\x03\x64pi\x18\x01 \x01(\r\x12\x12\n\nmessage_id\x18\x02 \x01(\r\x12\x10\n\x08hwnd_ptr\x18\x03 \x01(\x06\"E\n\nScreenshot\x12\x11\n\tjpg_image\x18\x01 \x01(\x0c\x12\x11\n\tpam_image\x18\x02 \x01(\x0c\x12\x11\n\tppm_image\x18\x03 \x01(\x0c\"(\n\rTaskExecution\x12\x17\n\x0fposted_from_iid\x18\x01 \x01(\x04\"\xf8\x1a\n\nTrackEvent\x12\x15\n\rcategory_iids\x18\x03 \x03(\x04\x12\x12\n\ncategories\x18\x16 \x03(\t\x12\x12\n\x08name_iid\x18\n \x01(\x04H\x00\x12\x0e\n\x04name\x18\x17 \x01(\tH\x00\x12.\n\x04type\x18\t \x01(\x0e\x32 .perfetto.protos.TrackEvent.Type\x12\x12\n\ntrack_uuid\x18\x0b \x01(\x04\x12\x17\n\rcounter_value\x18\x1e \x01(\x03H\x01\x12\x1e\n\x14\x64ouble_counter_value\x18, \x01(\x01H\x01\x12!\n\x19\x65xtra_counter_track_uuids\x18\x1f \x03(\x04\x12\x1c\n\x14\x65xtra_counter_values\x18\x0c \x03(\x03\x12(\n extra_double_counter_track_uuids\x18- \x03(\x04\x12#\n\x1b\x65xtra_double_counter_values\x18. \x03(\x01\x12\x18\n\x0c\x66low_ids_old\x18$ \x03(\x04\x42\x02\x18\x01\x12\x10\n\x08\x66low_ids\x18/ \x03(\x06\x12$\n\x18terminating_flow_ids_old\x18* \x03(\x04\x42\x02\x18\x01\x12\x1c\n\x14terminating_flow_ids\x18\x30 \x03(\x06\x12\x18\n\x0e\x63orrelation_id\x18\x34 \x01(\x04H\x02\x12\x1c\n\x12\x63orrelation_id_str\x18\x35 \x01(\tH\x02\x12 \n\x16\x63orrelation_id_str_iid\x18\x36 \x01(\x04H\x02\x12@\n\tcallstack\x18\x37 \x01(\x0b\x32+.perfetto.protos.TrackEvent.InlineCallstackH\x03\x12\x17\n\rcallstack_iid\x18\x38 \x01(\x04H\x03\x12\x18\n\x10\x63\x61llstack_weight\x18\x39 \x01(\x01\x12;\n\x11\x64\x65\x62ug_annotations\x18\x04 \x03(\x0b\x32 .perfetto.protos.DebugAnnotation\x12\x36\n\x0etask_execution\x18\x05 \x01(\x0b\x32\x1e.perfetto.protos.TaskExecution\x12\x30\n\x0blog_message\x18\x15 \x01(\x0b\x32\x1b.perfetto.protos.LogMessage\x12K\n\x12\x63\x63_scheduler_state\x18\x18 \x01(\x0b\x32/.perfetto.protos.ChromeCompositorSchedulerState\x12;\n\x11\x63hrome_user_event\x18\x19 \x01(\x0b\x32 .perfetto.protos.ChromeUserEvent\x12\x41\n\x14\x63hrome_keyed_service\x18\x1a \x01(\x0b\x32#.perfetto.protos.ChromeKeyedService\x12;\n\x11\x63hrome_legacy_ipc\x18\x1b \x01(\x0b\x32 .perfetto.protos.ChromeLegacyIpc\x12G\n\x17\x63hrome_histogram_sample\x18\x1c \x01(\x0b\x32&.perfetto.protos.ChromeHistogramSample\x12?\n\x13\x63hrome_latency_info\x18\x1d \x01(\x0b\x32\".perfetto.protos.ChromeLatencyInfo\x12G\n\x15\x63hrome_frame_reporter\x18 \x01(\x0b\x32$.perfetto.protos.ChromeFrameReporterB\x02\x18\x01\x12R\n\x1d\x63hrome_application_state_info\x18\' \x01(\x0b\x32+.perfetto.protos.ChromeApplicationStateInfo\x12V\n\x1f\x63hrome_renderer_scheduler_state\x18( \x01(\x0b\x32-.perfetto.protos.ChromeRendererSchedulerState\x12U\n\x1f\x63hrome_window_handle_event_info\x18) \x01(\x0b\x32,.perfetto.protos.ChromeWindowHandleEventInfo\x12[\n\"chrome_content_settings_event_info\x18+ \x01(\x0b\x32/.perfetto.protos.ChromeContentSettingsEventInfo\x12G\n\x17\x63hrome_active_processes\x18\x31 \x01(\x0b\x32&.perfetto.protos.ChromeActiveProcesses\x12/\n\nscreenshot\x18\x32 \x01(\x0b\x32\x1b.perfetto.protos.Screenshot\x12:\n\x0fsource_location\x18! \x01(\x0b\x32\x1f.perfetto.protos.SourceLocationH\x04\x12\x1d\n\x13source_location_iid\x18\" \x01(\x04H\x04\x12?\n\x13\x63hrome_message_pump\x18# \x01(\x0b\x32\".perfetto.protos.ChromeMessagePump\x12\x44\n\x16\x63hrome_mojo_event_info\x18& \x01(\x0b\x32$.perfetto.protos.ChromeMojoEventInfo\x12\x1c\n\x12timestamp_delta_us\x18\x01 \x01(\x03H\x05\x12\x1f\n\x15timestamp_absolute_us\x18\x10 \x01(\x03H\x05\x12\x1e\n\x14thread_time_delta_us\x18\x02 \x01(\x03H\x06\x12!\n\x17thread_time_absolute_us\x18\x11 \x01(\x03H\x06\x12(\n\x1ethread_instruction_count_delta\x18\x08 \x01(\x03H\x07\x12+\n!thread_instruction_count_absolute\x18\x14 \x01(\x03H\x07\x12=\n\x0clegacy_event\x18\x06 \x01(\x0b\x32\'.perfetto.protos.TrackEvent.LegacyEvent\x1a\x9e\x01\n\x0fInlineCallstack\x12\x41\n\x06\x66rames\x18\x01 \x03(\x0b\x32\x31.perfetto.protos.TrackEvent.InlineCallstack.Frame\x1aH\n\x05\x46rame\x12\x15\n\rfunction_name\x18\x01 \x01(\t\x12\x13\n\x0bsource_file\x18\x02 \x01(\t\x12\x13\n\x0bline_number\x18\x03 \x01(\r\x1a\xaa\x05\n\x0bLegacyEvent\x12\x10\n\x08name_iid\x18\x01 \x01(\x04\x12\r\n\x05phase\x18\x02 \x01(\x05\x12\x13\n\x0b\x64uration_us\x18\x03 \x01(\x03\x12\x1a\n\x12thread_duration_us\x18\x04 \x01(\x03\x12 \n\x18thread_instruction_delta\x18\x0f \x01(\x03\x12\x15\n\x0bunscoped_id\x18\x06 \x01(\x04H\x00\x12\x12\n\x08local_id\x18\n \x01(\x04H\x00\x12\x13\n\tglobal_id\x18\x0b \x01(\x04H\x00\x12\x10\n\x08id_scope\x18\x07 \x01(\t\x12\x15\n\ruse_async_tts\x18\t \x01(\x08\x12\x0f\n\x07\x62ind_id\x18\x08 \x01(\x04\x12\x19\n\x11\x62ind_to_enclosing\x18\x0c \x01(\x08\x12M\n\x0e\x66low_direction\x18\r \x01(\x0e\x32\x35.perfetto.protos.TrackEvent.LegacyEvent.FlowDirection\x12V\n\x13instant_event_scope\x18\x0e \x01(\x0e\x32\x39.perfetto.protos.TrackEvent.LegacyEvent.InstantEventScope\x12\x14\n\x0cpid_override\x18\x12 \x01(\x05\x12\x14\n\x0ctid_override\x18\x13 \x01(\x05\"P\n\rFlowDirection\x12\x14\n\x10\x46LOW_UNSPECIFIED\x10\x00\x12\x0b\n\x07\x46LOW_IN\x10\x01\x12\x0c\n\x08\x46LOW_OUT\x10\x02\x12\x0e\n\nFLOW_INOUT\x10\x03\"a\n\x11InstantEventScope\x12\x15\n\x11SCOPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cSCOPE_GLOBAL\x10\x01\x12\x11\n\rSCOPE_PROCESS\x10\x02\x12\x10\n\x0cSCOPE_THREAD\x10\x03\x42\x04\n\x02idJ\x04\x08\x05\x10\x06\"z\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x14\n\x10TYPE_SLICE_BEGIN\x10\x01\x12\x12\n\x0eTYPE_SLICE_END\x10\x02\x12\x10\n\x0cTYPE_INSTANT\x10\x03\x12\x10\n\x0cTYPE_COUNTER\x10\x04\x12\x0e\n\nTYPE_STATE\x10\x05*\x06\x08\xe8\x07\x10\x90NB\x0c\n\nname_fieldB\x15\n\x13\x63ounter_value_fieldB\x16\n\x14\x63orrelation_id_fieldB\x11\n\x0f\x63\x61llstack_fieldB\x17\n\x15source_location_fieldB\x0b\n\ttimestampB\r\n\x0bthread_timeB\x1a\n\x18thread_instruction_countJ\x04\x08\x33\x10\x34\"u\n\x12TrackEventDefaults\x12\x12\n\ntrack_uuid\x18\x0b \x01(\x04\x12!\n\x19\x65xtra_counter_track_uuids\x18\x1f \x03(\x04\x12(\n extra_double_counter_track_uuids\x18- \x03(\x04\"*\n\rEventCategory\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"&\n\tEventName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"\xc5\x10\n\x0cInternedData\x12\x38\n\x10\x65vent_categories\x18\x01 \x03(\x0b\x32\x1e.perfetto.protos.EventCategory\x12/\n\x0b\x65vent_names\x18\x02 \x03(\x0b\x32\x1a.perfetto.protos.EventName\x12\x44\n\x16\x64\x65\x62ug_annotation_names\x18\x03 \x03(\x0b\x32$.perfetto.protos.DebugAnnotationName\x12X\n!debug_annotation_value_type_names\x18\x1b \x03(\x0b\x32-.perfetto.protos.DebugAnnotationValueTypeName\x12G\n\x1e\x64\x65\x62ug_annotation_string_values\x18\x1d \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12;\n\x12\x63orrelation_id_str\x18+ \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12\x32\n\tbuild_ids\x18\x10 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12\x36\n\rmapping_paths\x18\x11 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12\x35\n\x0csource_paths\x18\x12 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12\x37\n\x0e\x66unction_names\x18\x05 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12*\n\x08mappings\x18\x13 \x03(\x0b\x32\x18.perfetto.protos.Mapping\x12&\n\x06\x66rames\x18\x06 \x03(\x0b\x32\x16.perfetto.protos.Frame\x12.\n\ncallstacks\x18\x07 \x03(\x0b\x32\x1a.perfetto.protos.Callstack\x12L\n\x1astack_sample_task_contexts\x18\x30 \x03(\x0b\x32(.perfetto.protos.StackSample.TaskContext\x12V\n\x1fstack_sample_execution_contexts\x18\x31 \x03(\x0b\x32-.perfetto.protos.StackSample.ExecutionContext\x12X\n stack_sample_counter_descriptors\x18\x32 \x03(\x0b\x32..perfetto.protos.StackSample.CounterDescriptor\x12\x63\n&stack_sample_async_context_descriptors\x18\x33 \x03(\x0b\x32\x33.perfetto.protos.StackSample.AsyncContextDescriptor\x12\x39\n\x10source_locations\x18\x04 \x03(\x0b\x32\x1f.perfetto.protos.SourceLocation\x12R\n\x1dunsymbolized_source_locations\x18\x1c \x03(\x0b\x32+.perfetto.protos.UnsymbolizedSourceLocation\x12\x39\n\x10log_message_body\x18\x14 \x03(\x0b\x32\x1f.perfetto.protos.LogMessageBody\x12\x37\n\x0fhistogram_names\x18\x19 \x03(\x0b\x32\x1e.perfetto.protos.HistogramName\x12;\n\x12vulkan_memory_keys\x18\x16 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12\x43\n\x11graphics_contexts\x18\x17 \x03(\x0b\x32(.perfetto.protos.InternedGraphicsContext\x12P\n\x12gpu_specifications\x18\x18 \x03(\x0b\x32\x34.perfetto.protos.InternedGpuRenderStageSpecification\x12N\n\x17gpu_counter_descriptors\x18/ \x03(\x0b\x32-.perfetto.protos.InternedGpuCounterDescriptor\x12\x37\n\x0ekernel_symbols\x18\x1a \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12>\n\x13v8_js_function_name\x18\x1f \x03(\x0b\x32!.perfetto.protos.InternedV8String\x12=\n\x0ev8_js_function\x18 \x03(\x0b\x32%.perfetto.protos.InternedV8JsFunction\x12\x39\n\x0cv8_js_script\x18! \x03(\x0b\x32#.perfetto.protos.InternedV8JsScript\x12=\n\x0ev8_wasm_script\x18\" \x03(\x0b\x32%.perfetto.protos.InternedV8WasmScript\x12\x36\n\nv8_isolate\x18# \x03(\x0b\x32\".perfetto.protos.InternedV8Isolate*\x04\x08\x1e\x10\x1f*\x04\x08$\x10%*\x04\x08%\x10&*\x04\x08&\x10\'*\x04\x08\'\x10(*\x04\x08(\x10)*\x04\x08)\x10**\x04\x08*\x10+*\x04\x08,\x10-*\x04\x08-\x10.*\x04\x08.\x10/*\x06\x08\xe8\x07\x10\x90NJ\x04\x08\x15\x10\x16\"\xf3\x01\n\x14SystemdJournaldEvent\x12\x0b\n\x03pid\x18\x01 \x01(\r\x12\x0b\n\x03tid\x18\x02 \x01(\r\x12\x0b\n\x03uid\x18\x03 \x01(\r\x12\x0b\n\x03gid\x18\x04 \x01(\r\x12\x0c\n\x04prio\x18\x05 \x01(\r\x12\x0b\n\x03tag\x18\x06 \x01(\t\x12\x0f\n\x07message\x18\x07 \x01(\t\x12\x0c\n\x04\x63omm\x18\x08 \x01(\t\x12\x0b\n\x03\x65xe\x18\t \x01(\t\x12\x14\n\x0csystemd_unit\x18\n \x01(\t\x12\x10\n\x08hostname\x18\x0b \x01(\t\x12\x11\n\ttransport\x18\x0c \x01(\t\x12\x11\n\tnum_total\x18\x14 \x01(\x04\x12\x12\n\nnum_failed\x18\x15 \x01(\x04\"\xf0\x07\n\x15MemoryTrackerSnapshot\x12\x16\n\x0eglobal_dump_id\x18\x01 \x01(\x04\x12M\n\x0flevel_of_detail\x18\x02 \x01(\x0e\x32\x34.perfetto.protos.MemoryTrackerSnapshot.LevelOfDetail\x12T\n\x14process_memory_dumps\x18\x03 \x03(\x0b\x32\x36.perfetto.protos.MemoryTrackerSnapshot.ProcessSnapshot\x1a\xce\x05\n\x0fProcessSnapshot\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12Z\n\x0f\x61llocator_dumps\x18\x02 \x03(\x0b\x32\x41.perfetto.protos.MemoryTrackerSnapshot.ProcessSnapshot.MemoryNode\x12W\n\x0cmemory_edges\x18\x03 \x03(\x0b\x32\x41.perfetto.protos.MemoryTrackerSnapshot.ProcessSnapshot.MemoryEdge\x1a\x9b\x03\n\nMemoryNode\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x15\n\rabsolute_name\x18\x02 \x01(\t\x12\x0c\n\x04weak\x18\x03 \x01(\x08\x12\x12\n\nsize_bytes\x18\x04 \x01(\x04\x12\x62\n\x07\x65ntries\x18\x05 \x03(\x0b\x32Q.perfetto.protos.MemoryTrackerSnapshot.ProcessSnapshot.MemoryNode.MemoryNodeEntry\x1a\xe3\x01\n\x0fMemoryNodeEntry\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x66\n\x05units\x18\x02 \x01(\x0e\x32W.perfetto.protos.MemoryTrackerSnapshot.ProcessSnapshot.MemoryNode.MemoryNodeEntry.Units\x12\x14\n\x0cvalue_uint64\x18\x03 \x01(\x04\x12\x14\n\x0cvalue_string\x18\x04 \x01(\t\".\n\x05Units\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\t\n\x05\x43OUNT\x10\x02\x1a[\n\nMemoryEdge\x12\x11\n\tsource_id\x18\x01 \x01(\x04\x12\x11\n\ttarget_id\x18\x02 \x01(\x04\x12\x12\n\nimportance\x18\x03 \x01(\r\x12\x13\n\x0boverridable\x18\x04 \x01(\x08\"I\n\rLevelOfDetail\x12\x0f\n\x0b\x44\x45TAIL_FULL\x10\x00\x12\x10\n\x0c\x44\x45TAIL_LIGHT\x10\x01\x12\x15\n\x11\x44\x45TAIL_BACKGROUND\x10\x02\"\xd1\x02\n\x16\x43oncurrentSessionEvent\x12<\n\x05state\x18\x01 \x01(\x0e\x32-.perfetto.protos.ConcurrentSessionEvent.State\x12\x14\n\x0csession_name\x18\x02 \x01(\t\x12\x12\n\nsession_id\x18\x03 \x01(\x04\x12\x14\n\x0c\x63onsumer_uid\x18\x04 \x01(\x05\x12\x18\n\x10num_data_sources\x18\x05 \x01(\r\"\x9e\x01\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x12\n\x0eSTATE_DISABLED\x10\x01\x12\x14\n\x10STATE_CONFIGURED\x10\x02\x12\x11\n\rSTATE_STARTED\x10\x03\x12%\n!STATE_DISABLING_WAITING_STOP_ACKS\x10\x04\x12\x1a\n\x16STATE_CLONED_READ_ONLY\x10\x05\"\xa1\x04\n\x11PerfettoMetatrace\x12\x12\n\x08\x65vent_id\x18\x01 \x01(\rH\x00\x12\x14\n\ncounter_id\x18\x02 \x01(\rH\x00\x12\x14\n\nevent_name\x18\x08 \x01(\tH\x00\x12\x18\n\x0e\x65vent_name_iid\x18\x0b \x01(\x04H\x00\x12\x16\n\x0c\x63ounter_name\x18\t \x01(\tH\x00\x12\x19\n\x11\x65vent_duration_ns\x18\x03 \x01(\x04\x12\x15\n\rcounter_value\x18\x04 \x01(\x05\x12\x11\n\tthread_id\x18\x05 \x01(\r\x12\x14\n\x0chas_overruns\x18\x06 \x01(\x08\x12\x34\n\x04\x61rgs\x18\x07 \x03(\x0b\x32&.perfetto.protos.PerfettoMetatrace.Arg\x12K\n\x10interned_strings\x18\n \x03(\x0b\x32\x31.perfetto.protos.PerfettoMetatrace.InternedString\x1a\x7f\n\x03\x41rg\x12\r\n\x03key\x18\x01 \x01(\tH\x00\x12\x11\n\x07key_iid\x18\x03 \x01(\x04H\x00\x12\x0f\n\x05value\x18\x02 \x01(\tH\x01\x12\x13\n\tvalue_iid\x18\x04 \x01(\x04H\x01\x42\x15\n\x13key_or_interned_keyB\x19\n\x17value_or_interned_value\x1a,\n\x0eInternedString\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\tB\r\n\x0brecord_type\"\xc0\x01\n\x0fTraceProvenance\x12\x38\n\x07\x62uffers\x18\x02 \x03(\x0b\x32\'.perfetto.protos.TraceProvenance.Buffer\x1a+\n\x08Sequence\x12\n\n\x02id\x18\x01 \x01(\r\x12\x13\n\x0bproducer_id\x18\x02 \x01(\x05\x1a\x46\n\x06\x42uffer\x12<\n\tsequences\x18\x01 \x03(\x0b\x32).perfetto.protos.TraceProvenance.Sequence\"\x8a\x05\n\x13TracingServiceEvent\x12\x19\n\x0ftracing_started\x18\x02 \x01(\x08H\x00\x12\"\n\x18\x61ll_data_sources_started\x18\x01 \x01(\x08H\x00\x12\x17\n\rflush_started\x18\t \x01(\x08H\x00\x12\"\n\x18\x61ll_data_sources_flushed\x18\x03 \x01(\x08H\x00\x12(\n\x1eread_tracing_buffers_completed\x18\x04 \x01(\x08H\x00\x12\x1a\n\x10tracing_disabled\x18\x05 \x01(\x08H\x00\x12\x1e\n\x14seized_for_bugreport\x18\x06 \x01(\x08H\x00\x12V\n\x1aslow_starting_data_sources\x18\x07 \x01(\x0b\x32\x30.perfetto.protos.TracingServiceEvent.DataSourcesH\x00\x12X\n\x1clast_flush_slow_data_sources\x18\x08 \x01(\x0b\x32\x30.perfetto.protos.TracingServiceEvent.DataSourcesH\x00\x12\x17\n\rclone_started\x18\n \x01(\x08H\x00\x12\x17\n\rbuffer_cloned\x18\x0b \x01(\rH\x00\x1a\x9e\x01\n\x0b\x44\x61taSources\x12P\n\x0b\x64\x61ta_source\x18\x01 \x03(\x0b\x32;.perfetto.protos.TracingServiceEvent.DataSources.DataSource\x1a=\n\nDataSource\x12\x15\n\rproducer_name\x18\x01 \x01(\t\x12\x18\n\x10\x64\x61ta_source_name\x18\x02 \x01(\tB\x0c\n\nevent_type\"`\n\x15\x41ndroidEnergyConsumer\x12\x1a\n\x12\x65nergy_consumer_id\x18\x01 \x01(\x05\x12\x0f\n\x07ordinal\x18\x02 \x01(\x05\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\"c\n\x1f\x41ndroidEnergyConsumerDescriptor\x12@\n\x10\x65nergy_consumers\x18\x01 \x03(\x0b\x32&.perfetto.protos.AndroidEnergyConsumer\"\xc0\x02\n AndroidEnergyEstimationBreakdown\x12T\n\x1a\x65nergy_consumer_descriptor\x18\x01 \x01(\x0b\x32\x30.perfetto.protos.AndroidEnergyConsumerDescriptor\x12\x1a\n\x12\x65nergy_consumer_id\x18\x02 \x01(\x05\x12\x12\n\nenergy_uws\x18\x03 \x01(\x03\x12_\n\x11per_uid_breakdown\x18\x04 \x03(\x0b\x32\x44.perfetto.protos.AndroidEnergyEstimationBreakdown.EnergyUidBreakdown\x1a\x35\n\x12\x45nergyUidBreakdown\x12\x0b\n\x03uid\x18\x01 \x01(\x05\x12\x12\n\nenergy_uws\x18\x02 \x01(\x03\"\xbb\x03\n\x14\x45ntityStateResidency\x12R\n\x12power_entity_state\x18\x01 \x03(\x0b\x32\x36.perfetto.protos.EntityStateResidency.PowerEntityState\x12G\n\tresidency\x18\x02 \x03(\x0b\x32\x34.perfetto.protos.EntityStateResidency.StateResidency\x1a\x66\n\x10PowerEntityState\x12\x14\n\x0c\x65ntity_index\x18\x01 \x01(\x05\x12\x13\n\x0bstate_index\x18\x02 \x01(\x05\x12\x13\n\x0b\x65ntity_name\x18\x03 \x01(\t\x12\x12\n\nstate_name\x18\x04 \x01(\t\x1a\x9d\x01\n\x0eStateResidency\x12\x14\n\x0c\x65ntity_index\x18\x01 \x01(\x05\x12\x13\n\x0bstate_index\x18\x02 \x01(\x05\x12\x1e\n\x16total_time_in_state_ms\x18\x03 \x01(\x04\x12\x1f\n\x17total_state_entry_count\x18\x04 \x01(\x04\x12\x1f\n\x17last_entry_timestamp_ms\x18\x05 \x01(\x04\"\xb1\x01\n\x0f\x42\x61tteryCounters\x12\x1a\n\x12\x63harge_counter_uah\x18\x01 \x01(\x03\x12\x18\n\x10\x63\x61pacity_percent\x18\x02 \x01(\x02\x12\x12\n\ncurrent_ua\x18\x03 \x01(\x03\x12\x16\n\x0e\x63urrent_avg_ua\x18\x04 \x01(\x03\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x1a\n\x12\x65nergy_counter_uwh\x18\x06 \x01(\x03\x12\x12\n\nvoltage_uv\x18\x07 \x01(\x03\"\xc7\x02\n\nPowerRails\x12\x43\n\x0frail_descriptor\x18\x01 \x03(\x0b\x32*.perfetto.protos.PowerRails.RailDescriptor\x12;\n\x0b\x65nergy_data\x18\x02 \x03(\x0b\x32&.perfetto.protos.PowerRails.EnergyData\x12\x14\n\x0csession_uuid\x18\x03 \x01(\x04\x1a^\n\x0eRailDescriptor\x12\r\n\x05index\x18\x01 \x01(\r\x12\x11\n\trail_name\x18\x02 \x01(\t\x12\x13\n\x0bsubsys_name\x18\x03 \x01(\t\x12\x15\n\rsampling_rate\x18\x04 \x01(\r\x1a\x41\n\nEnergyData\x12\r\n\x05index\x18\x01 \x01(\r\x12\x14\n\x0ctimestamp_ms\x18\x02 \x01(\x04\x12\x0e\n\x06\x65nergy\x18\x03 \x01(\x04\"J\n\tJavaFrame\x12\x13\n\x0bmethod_name\x18\x01 \x01(\t\x12\x13\n\x0bsource_file\x18\x02 \x01(\t\x12\x13\n\x0bline_number\x18\x03 \x01(\x05\"7\n\tJavaStack\x12*\n\x06\x66rames\x18\x01 \x03(\x0b\x32\x1a.perfetto.protos.JavaFrame\"\x89\x02\n\x12\x41rtProcessMetadata\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0b\n\x03uid\x18\x02 \x01(\x05\x12\x14\n\x0cprocess_name\x18\x03 \x01(\t\x12\x14\n\x0cpackage_name\x18\x04 \x01(\t\x12\x1b\n\x13oom_allocation_size\x18\x05 \x01(\x04\x12\x1c\n\x14oom_total_bytes_free\x18\x06 \x01(\x04\x12 \n\x18oom_free_bytes_until_oom\x18\x07 \x01(\x04\x12\x39\n\x15oom_thread_java_stack\x18\x08 \x01(\x0b\x32\x1a.perfetto.protos.JavaStack\x12\x15\n\room_error_msg\x18\t \x01(\t\"\xb6\x01\n\x10ObfuscatedMember\x12\x17\n\x0fobfuscated_name\x18\x01 \x01(\t\x12\x19\n\x11\x64\x65obfuscated_name\x18\x02 \x01(\t\x12\x1d\n\x15obfuscated_line_start\x18\x03 \x01(\r\x12\x1b\n\x13obfuscated_line_end\x18\x04 \x01(\r\x12\x19\n\x11source_line_start\x18\x05 \x01(\r\x12\x17\n\x0fsource_line_end\x18\x06 \x01(\r\"\xc3\x01\n\x0fObfuscatedClass\x12\x17\n\x0fobfuscated_name\x18\x01 \x01(\t\x12\x19\n\x11\x64\x65obfuscated_name\x18\x02 \x01(\t\x12=\n\x12obfuscated_members\x18\x03 \x03(\x0b\x32!.perfetto.protos.ObfuscatedMember\x12=\n\x12obfuscated_methods\x18\x04 \x03(\x0b\x32!.perfetto.protos.ObfuscatedMember\"\x80\x01\n\x14\x44\x65obfuscationMapping\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x14\n\x0cversion_code\x18\x02 \x01(\x03\x12<\n\x12obfuscated_classes\x18\x03 \x03(\x0b\x32 .perfetto.protos.ObfuscatedClass\"\xd5\x0b\n\rProfilePacket\x12\x30\n\x07strings\x18\x01 \x03(\x0b\x32\x1f.perfetto.protos.InternedString\x12*\n\x08mappings\x18\x04 \x03(\x0b\x32\x18.perfetto.protos.Mapping\x12&\n\x06\x66rames\x18\x02 \x03(\x0b\x32\x16.perfetto.protos.Frame\x12.\n\ncallstacks\x18\x03 \x03(\x0b\x32\x1a.perfetto.protos.Callstack\x12H\n\rprocess_dumps\x18\x05 \x03(\x0b\x32\x31.perfetto.protos.ProfilePacket.ProcessHeapSamples\x12\x11\n\tcontinued\x18\x06 \x01(\x08\x12\r\n\x05index\x18\x07 \x01(\x04\x1a\xba\x01\n\nHeapSample\x12\x14\n\x0c\x63\x61llstack_id\x18\x01 \x01(\x04\x12\x16\n\x0eself_allocated\x18\x02 \x01(\x04\x12\x12\n\nself_freed\x18\x03 \x01(\x04\x12\x10\n\x08self_max\x18\x08 \x01(\x04\x12\x16\n\x0eself_max_count\x18\t \x01(\x04\x12\x11\n\ttimestamp\x18\x04 \x01(\x04\x12\x13\n\x0b\x61lloc_count\x18\x05 \x01(\x04\x12\x12\n\nfree_count\x18\x06 \x01(\x04J\x04\x08\x07\x10\x08\x1a\x8f\x01\n\tHistogram\x12@\n\x07\x62uckets\x18\x01 \x03(\x0b\x32/.perfetto.protos.ProfilePacket.Histogram.Bucket\x1a@\n\x06\x42ucket\x12\x13\n\x0bupper_limit\x18\x01 \x01(\x04\x12\x12\n\nmax_bucket\x18\x02 \x01(\x08\x12\r\n\x05\x63ount\x18\x03 \x01(\x04\x1a\xde\x01\n\x0cProcessStats\x12\x18\n\x10unwinding_errors\x18\x01 \x01(\x04\x12\x14\n\x0cheap_samples\x18\x02 \x01(\x04\x12\x14\n\x0cmap_reparses\x18\x03 \x01(\x04\x12\x43\n\x11unwinding_time_us\x18\x04 \x01(\x0b\x32(.perfetto.protos.ProfilePacket.Histogram\x12\x1f\n\x17total_unwinding_time_us\x18\x05 \x01(\x04\x12\"\n\x1a\x63lient_spinlock_blocked_us\x18\x06 \x01(\x04\x1a\xf1\x04\n\x12ProcessHeapSamples\x12\x0b\n\x03pid\x18\x01 \x01(\x04\x12\x14\n\x0c\x66rom_startup\x18\x03 \x01(\x08\x12\x1b\n\x13rejected_concurrent\x18\x04 \x01(\x08\x12\x14\n\x0c\x64isconnected\x18\x06 \x01(\x08\x12\x16\n\x0e\x62uffer_overran\x18\x07 \x01(\x08\x12S\n\x0c\x63lient_error\x18\x0e \x01(\x0e\x32=.perfetto.protos.ProfilePacket.ProcessHeapSamples.ClientError\x12\x18\n\x10\x62uffer_corrupted\x18\x08 \x01(\x08\x12\x15\n\rhit_guardrail\x18\n \x01(\x08\x12\x11\n\theap_name\x18\x0b \x01(\t\x12\x1f\n\x17sampling_interval_bytes\x18\x0c \x01(\x04\x12$\n\x1corig_sampling_interval_bytes\x18\r \x01(\x04\x12\x11\n\ttimestamp\x18\t \x01(\x04\x12\x17\n\x0fstart_timestamp\x18\x0f \x01(\x04\x12:\n\x05stats\x18\x05 \x01(\x0b\x32+.perfetto.protos.ProfilePacket.ProcessStats\x12:\n\x07samples\x18\x02 \x03(\x0b\x32).perfetto.protos.ProfilePacket.HeapSample\"i\n\x0b\x43lientError\x12\x15\n\x11\x43LIENT_ERROR_NONE\x10\x00\x12\x1c\n\x18\x43LIENT_ERROR_HIT_TIMEOUT\x10\x01\x12%\n!CLIENT_ERROR_INVALID_STACK_BOUNDS\x10\x02\"\x9d\x01\n\x13StreamingAllocation\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x03(\x04\x12\x0c\n\x04size\x18\x02 \x03(\x04\x12\x13\n\x0bsample_size\x18\x03 \x03(\x04\x12(\n clock_monotonic_coarse_timestamp\x18\x04 \x03(\x04\x12\x0f\n\x07heap_id\x18\x05 \x03(\r\x12\x17\n\x0fsequence_number\x18\x06 \x03(\x04\"J\n\rStreamingFree\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x03(\x04\x12\x0f\n\x07heap_id\x18\x02 \x03(\r\x12\x17\n\x0fsequence_number\x18\x03 \x03(\x04\"e\n\x16StreamingProfilePacket\x12\x15\n\rcallstack_iid\x18\x01 \x03(\x04\x12\x1a\n\x12timestamp_delta_us\x18\x02 \x03(\x03\x12\x18\n\x10process_priority\x18\x03 \x01(\x05\"\x90\x05\n\tProfiling\"|\n\x07\x43puMode\x12\x10\n\x0cMODE_UNKNOWN\x10\x00\x12\x0f\n\x0bMODE_KERNEL\x10\x01\x12\r\n\tMODE_USER\x10\x02\x12\x13\n\x0fMODE_HYPERVISOR\x10\x03\x12\x15\n\x11MODE_GUEST_KERNEL\x10\x04\x12\x13\n\x0fMODE_GUEST_USER\x10\x05\"\x84\x04\n\x10StackUnwindError\x12\x18\n\x14UNWIND_ERROR_UNKNOWN\x10\x00\x12\x15\n\x11UNWIND_ERROR_NONE\x10\x01\x12\x1f\n\x1bUNWIND_ERROR_MEMORY_INVALID\x10\x02\x12\x1c\n\x18UNWIND_ERROR_UNWIND_INFO\x10\x03\x12\x1c\n\x18UNWIND_ERROR_UNSUPPORTED\x10\x04\x12\x1c\n\x18UNWIND_ERROR_INVALID_MAP\x10\x05\x12$\n UNWIND_ERROR_MAX_FRAMES_EXCEEDED\x10\x06\x12\x1f\n\x1bUNWIND_ERROR_REPEATED_FRAME\x10\x07\x12\x1c\n\x18UNWIND_ERROR_INVALID_ELF\x10\x08\x12\x1c\n\x18UNWIND_ERROR_SYSTEM_CALL\x10\t\x12\x1f\n\x1bUNWIND_ERROR_THREAD_TIMEOUT\x10\n\x12&\n\"UNWIND_ERROR_THREAD_DOES_NOT_EXIST\x10\x0b\x12\x19\n\x15UNWIND_ERROR_BAD_ARCH\x10\x0c\x12\x1b\n\x17UNWIND_ERROR_MAPS_PARSE\x10\r\x12\"\n\x1eUNWIND_ERROR_INVALID_PARAMETER\x10\x0e\x12\x1c\n\x18UNWIND_ERROR_PTRACE_CALL\x10\x0f\"\xef\x06\n\nPerfSample\x12\x0b\n\x03\x63pu\x18\x01 \x01(\r\x12\x0b\n\x03pid\x18\x02 \x01(\r\x12\x0b\n\x03tid\x18\x03 \x01(\r\x12\x34\n\x08\x63pu_mode\x18\x05 \x01(\x0e\x32\".perfetto.protos.Profiling.CpuMode\x12\x16\n\x0etimebase_count\x18\x06 \x01(\x04\x12\x17\n\x0f\x66ollower_counts\x18\x07 \x03(\x04\x12\x15\n\rcallstack_iid\x18\x04 \x01(\x04\x12\x43\n\x0cunwind_error\x18\x10 \x01(\x0e\x32+.perfetto.protos.Profiling.StackUnwindErrorH\x00\x12\x1b\n\x13kernel_records_lost\x18\x11 \x01(\x04\x12M\n\x15sample_skipped_reason\x18\x12 \x01(\x0e\x32,.perfetto.protos.PerfSample.SampleSkipReasonH\x01\x12\x41\n\x0eproducer_event\x18\x13 \x01(\x0b\x32).perfetto.protos.PerfSample.ProducerEvent\x1a\xdc\x01\n\rProducerEvent\x12\\\n\x12source_stop_reason\x18\x01 \x01(\x0e\x32>.perfetto.protos.PerfSample.ProducerEvent.DataSourceStopReasonH\x00\"N\n\x14\x44\x61taSourceStopReason\x12\x19\n\x15PROFILER_STOP_UNKNOWN\x10\x00\x12\x1b\n\x17PROFILER_STOP_GUARDRAIL\x10\x01\x42\x1d\n\x1boptional_source_stop_reason\"\xad\x01\n\x10SampleSkipReason\x12\x19\n\x15PROFILER_SKIP_UNKNOWN\x10\x00\x12\x1c\n\x18PROFILER_SKIP_READ_STAGE\x10\x01\x12\x1e\n\x1aPROFILER_SKIP_UNWIND_STAGE\x10\x02\x12 \n\x1cPROFILER_SKIP_UNWIND_ENQUEUE\x10\x03\x12\x1e\n\x1aPROFILER_SKIP_NOT_IN_SCOPE\x10\x04\x42\x17\n\x15optional_unwind_errorB \n\x1eoptional_sample_skipped_reason\"\xba\x01\n\x12PerfSampleDefaults\x12\x36\n\x08timebase\x18\x01 \x01(\x0b\x32$.perfetto.protos.PerfEvents.Timebase\x12\x31\n\tfollowers\x18\x04 \x03(\x0b\x32\x1e.perfetto.protos.FollowerEvent\x12\x1b\n\x13process_shard_count\x18\x02 \x01(\r\x12\x1c\n\x14\x63hosen_process_shard\x18\x03 \x01(\r\"\x83\x03\n\nSmapsEntry\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0f\n\x07size_kb\x18\x02 \x01(\x04\x12\x18\n\x10private_dirty_kb\x18\x03 \x01(\x04\x12\x0f\n\x07swap_kb\x18\x04 \x01(\x04\x12\x11\n\tfile_name\x18\x05 \x01(\t\x12\x15\n\rstart_address\x18\x06 \x01(\x04\x12\x18\n\x10module_timestamp\x18\x07 \x01(\x04\x12\x16\n\x0emodule_debugid\x18\x08 \x01(\t\x12\x19\n\x11module_debug_path\x18\t \x01(\t\x12\x18\n\x10protection_flags\x18\n \x01(\r\x12!\n\x19private_clean_resident_kb\x18\x0b \x01(\x04\x12 \n\x18shared_dirty_resident_kb\x18\x0c \x01(\x04\x12 \n\x18shared_clean_resident_kb\x18\r \x01(\x04\x12\x11\n\tlocked_kb\x18\x0e \x01(\x04\x12 \n\x18proportional_resident_kb\x18\x0f \x01(\x04\"\x81\x03\n\x0bPackedSmaps\x12\x14\n\x0cstring_table\x18\x01 \x03(\t\x12\x13\n\x07name_id\x18\x02 \x03(\rB\x02\x10\x01\x12\x1b\n\x0f\x61ggregate_count\x18\x03 \x03(\rB\x02\x10\x01\x12\x13\n\x07size_kb\x18\x04 \x03(\x04\x42\x02\x10\x01\x12\x12\n\x06rss_kb\x18\x05 \x03(\x04\x42\x02\x10\x01\x12\x18\n\x0c\x61nonymous_kb\x18\x06 \x03(\x04\x42\x02\x10\x01\x12\x13\n\x07swap_kb\x18\x07 \x03(\x04\x42\x02\x10\x01\x12\x1b\n\x0fshared_clean_kb\x18\x08 \x03(\x04\x42\x02\x10\x01\x12\x1b\n\x0fshared_dirty_kb\x18\t \x03(\x04\x42\x02\x10\x01\x12\x1c\n\x10private_clean_kb\x18\n \x03(\x04\x42\x02\x10\x01\x12\x1c\n\x10private_dirty_kb\x18\x0b \x03(\x04\x42\x02\x10\x01\x12\x15\n\tlocked_kb\x18\x0c \x03(\x04\x42\x02\x10\x01\x12\x12\n\x06pss_kb\x18\r \x03(\x04\x42\x02\x10\x01\x12\x18\n\x0cpss_dirty_kb\x18\x0e \x03(\x04\x42\x02\x10\x01\x12\x17\n\x0bswap_pss_kb\x18\x0f \x03(\x04\x42\x02\x10\x01\"\xdc\x02\n\x0bSmapsPacket\x12\x0b\n\x03pid\x18\x01 \x01(\r\x12,\n\x07\x65ntries\x18\x02 \x03(\x0b\x32\x1b.perfetto.protos.SmapsEntry\x12\x34\n\x0epacked_entries\x18\x03 \x01(\x0b\x32\x1c.perfetto.protos.PackedSmaps\x12\x42\n\x0erecording_type\x18\x04 \x01(\x0e\x32*.perfetto.protos.SmapsPacket.RecordingType\"\x97\x01\n\rRecordingType\x12\x1a\n\x16RECORDING_TYPE_UNKNOWN\x10\x00\x12\x1d\n\x19RECORDING_TYPE_STANDALONE\x10\x01\x12%\n!RECORDING_TYPE_ART_HPROF_POSTFORK\x10\x02\x12$\n RECORDING_TYPE_ART_HPROF_PREFORK\x10\x03\"\xbb\x06\n\x0cProcessStats\x12\x38\n\tprocesses\x18\x01 \x03(\x0b\x32%.perfetto.protos.ProcessStats.Process\x12 \n\x18\x63ollection_end_timestamp\x18\x02 \x01(\x04\x1a\'\n\x06Thread\x12\x0b\n\x03tid\x18\x01 \x01(\x05J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05\x1a\"\n\x06\x46\x44Info\x12\n\n\x02\x66\x64\x18\x01 \x01(\x04\x12\x0c\n\x04path\x18\x02 \x01(\t\x1a\x81\x05\n\x07Process\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x35\n\x07threads\x18\x0b \x03(\x0b\x32$.perfetto.protos.ProcessStats.Thread\x12\x12\n\nvm_size_kb\x18\x02 \x01(\x04\x12\x11\n\tvm_rss_kb\x18\x03 \x01(\x04\x12\x13\n\x0brss_anon_kb\x18\x04 \x01(\x04\x12\x13\n\x0brss_file_kb\x18\x05 \x01(\x04\x12\x14\n\x0crss_shmem_kb\x18\x06 \x01(\x04\x12\x12\n\nvm_swap_kb\x18\x07 \x01(\x04\x12\x14\n\x0cvm_locked_kb\x18\x08 \x01(\x04\x12\x11\n\tvm_hwm_kb\x18\t \x01(\x04\x12\x15\n\room_score_adj\x18\n \x01(\x03\x12\x1e\n\x16is_peak_rss_resettable\x18\x0c \x01(\x08\x12#\n\x1b\x63hrome_private_footprint_kb\x18\r \x01(\r\x12#\n\x1b\x63hrome_peak_resident_set_kb\x18\x0e \x01(\r\x12\x31\n\x03\x66\x64s\x18\x0f \x03(\x0b\x32$.perfetto.protos.ProcessStats.FDInfo\x12\x12\n\nsmr_rss_kb\x18\x10 \x01(\x04\x12\x12\n\nsmr_pss_kb\x18\x11 \x01(\x04\x12\x17\n\x0fsmr_pss_anon_kb\x18\x12 \x01(\x04\x12\x17\n\x0fsmr_pss_file_kb\x18\x13 \x01(\x04\x12\x18\n\x10smr_pss_shmem_kb\x18\x14 \x01(\x04\x12\x17\n\x0fsmr_swap_pss_kb\x18\x17 \x01(\x04\x12\x19\n\x11runtime_user_mode\x18\x15 \x01(\x04\x12\x1b\n\x13runtime_kernel_mode\x18\x16 \x01(\x04\x12\x15\n\rdmabuf_rss_kb\x18\x18 \x01(\x04\"\x88\x03\n\x0bProcessTree\x12\x37\n\tprocesses\x18\x01 \x03(\x0b\x32$.perfetto.protos.ProcessTree.Process\x12\x34\n\x07threads\x18\x02 \x03(\x0b\x32#.perfetto.protos.ProcessTree.Thread\x12 \n\x18\x63ollection_end_timestamp\x18\x03 \x01(\x04\x1a@\n\x06Thread\x12\x0b\n\x03tid\x18\x01 \x01(\x05\x12\x0c\n\x04tgid\x18\x03 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05nstid\x18\x04 \x03(\x05\x1a\xa5\x01\n\x07Process\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0c\n\x04ppid\x18\x02 \x01(\x05\x12\x0f\n\x07\x63mdline\x18\x03 \x03(\t\x12\x17\n\x0f\x63mdline_is_comm\x18\t \x01(\x08\x12\x0b\n\x03uid\x18\x05 \x01(\x05\x12\r\n\x05nspid\x18\x06 \x03(\x05\x12\x1f\n\x17process_start_from_boot\x18\x07 \x01(\x04\x12\x12\n\nis_kthread\x18\x08 \x01(\x08J\x04\x08\x04\x10\x05\"\xd3\x01\n\x0fRemoteClockSync\x12\x44\n\rsynced_clocks\x18\x01 \x03(\x0b\x32-.perfetto.protos.RemoteClockSync.SyncedClocks\x1az\n\x0cSyncedClocks\x12\x35\n\rclient_clocks\x18\x02 \x01(\x0b\x32\x1e.perfetto.protos.ClockSnapshot\x12\x33\n\x0bhost_clocks\x18\x03 \x01(\x0b\x32\x1e.perfetto.protos.ClockSnapshot\"\x06\n\x04\x41tom\"J\n\nStatsdAtom\x12#\n\x04\x61tom\x18\x01 \x03(\x0b\x32\x15.perfetto.protos.Atom\x12\x17\n\x0ftimestamp_nanos\x18\x02 \x03(\x03\"\xe4\x10\n\x08SysStats\x12\x37\n\x07meminfo\x18\x01 \x03(\x0b\x32&.perfetto.protos.SysStats.MeminfoValue\x12\x35\n\x06vmstat\x18\x02 \x03(\x0b\x32%.perfetto.protos.SysStats.VmstatValue\x12\x34\n\x08\x63pu_stat\x18\x03 \x03(\x0b\x32\".perfetto.protos.SysStats.CpuTimes\x12\x11\n\tnum_forks\x18\x04 \x01(\x04\x12\x15\n\rnum_irq_total\x18\x05 \x01(\x04\x12\x39\n\x07num_irq\x18\x06 \x03(\x0b\x32(.perfetto.protos.SysStats.InterruptCount\x12\x19\n\x11num_softirq_total\x18\x07 \x01(\x04\x12=\n\x0bnum_softirq\x18\x08 \x03(\x0b\x32(.perfetto.protos.SysStats.InterruptCount\x12 \n\x18\x63ollection_end_timestamp\x18\t \x01(\x04\x12\x37\n\x07\x64\x65vfreq\x18\n \x03(\x0b\x32&.perfetto.protos.SysStats.DevfreqValue\x12\x13\n\x0b\x63pufreq_khz\x18\x0b \x03(\r\x12\x37\n\nbuddy_info\x18\x0c \x03(\x0b\x32#.perfetto.protos.SysStats.BuddyInfo\x12\x35\n\tdisk_stat\x18\r \x03(\x0b\x32\".perfetto.protos.SysStats.DiskStat\x12\x30\n\x03psi\x18\x0e \x03(\x0b\x32#.perfetto.protos.SysStats.PsiSample\x12;\n\x0cthermal_zone\x18\x0f \x03(\x0b\x32%.perfetto.protos.SysStats.ThermalZone\x12=\n\rcpuidle_state\x18\x10 \x03(\x0b\x32&.perfetto.protos.SysStats.CpuIdleState\x12\x13\n\x0bgpufreq_mhz\x18\x11 \x03(\x04\x12\x35\n\tslab_info\x18\x12 \x03(\x0b\x32\".perfetto.protos.SysStats.SlabInfo\x1aL\n\x0cMeminfoValue\x12-\n\x03key\x18\x01 \x01(\x0e\x32 .perfetto.protos.MeminfoCounters\x12\r\n\x05value\x18\x02 \x01(\x04\x1aJ\n\x0bVmstatValue\x12,\n\x03key\x18\x01 \x01(\x0e\x32\x1f.perfetto.protos.VmstatCounters\x12\r\n\x05value\x18\x02 \x01(\x04\x1a\xb4\x01\n\x08\x43puTimes\x12\x0e\n\x06\x63pu_id\x18\x01 \x01(\r\x12\x0f\n\x07user_ns\x18\x02 \x01(\x04\x12\x14\n\x0cuser_nice_ns\x18\x03 \x01(\x04\x12\x16\n\x0esystem_mode_ns\x18\x04 \x01(\x04\x12\x0f\n\x07idle_ns\x18\x05 \x01(\x04\x12\x12\n\nio_wait_ns\x18\x06 \x01(\x04\x12\x0e\n\x06irq_ns\x18\x07 \x01(\x04\x12\x12\n\nsoftirq_ns\x18\x08 \x01(\x04\x12\x10\n\x08steal_ns\x18\t \x01(\x04\x1a,\n\x0eInterruptCount\x12\x0b\n\x03irq\x18\x01 \x01(\x05\x12\r\n\x05\x63ount\x18\x02 \x01(\x04\x1a*\n\x0c\x44\x65vfreqValue\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04\x1a<\n\tBuddyInfo\x12\x0c\n\x04node\x18\x01 \x01(\t\x12\x0c\n\x04zone\x18\x02 \x01(\t\x12\x13\n\x0border_pages\x18\x03 \x03(\r\x1a\xd7\x01\n\x08\x44iskStat\x12\x13\n\x0b\x64\x65vice_name\x18\x01 \x01(\t\x12\x14\n\x0cread_sectors\x18\x02 \x01(\x04\x12\x14\n\x0cread_time_ms\x18\x03 \x01(\x04\x12\x15\n\rwrite_sectors\x18\x04 \x01(\x04\x12\x15\n\rwrite_time_ms\x18\x05 \x01(\x04\x12\x17\n\x0f\x64iscard_sectors\x18\x06 \x01(\x04\x12\x17\n\x0f\x64iscard_time_ms\x18\x07 \x01(\x04\x12\x13\n\x0b\x66lush_count\x18\x08 \x01(\x04\x12\x15\n\rflush_time_ms\x18\t \x01(\x04\x1a\xb4\x02\n\tPsiSample\x12\x41\n\x08resource\x18\x01 \x01(\x0e\x32/.perfetto.protos.SysStats.PsiSample.PsiResource\x12\x10\n\x08total_ns\x18\x02 \x01(\x04\"\xd1\x01\n\x0bPsiResource\x12\x1c\n\x18PSI_RESOURCE_UNSPECIFIED\x10\x00\x12\x19\n\x15PSI_RESOURCE_CPU_SOME\x10\x01\x12\x19\n\x15PSI_RESOURCE_CPU_FULL\x10\x02\x12\x18\n\x14PSI_RESOURCE_IO_SOME\x10\x03\x12\x18\n\x14PSI_RESOURCE_IO_FULL\x10\x04\x12\x1c\n\x18PSI_RESOURCE_MEMORY_SOME\x10\x05\x12\x1c\n\x18PSI_RESOURCE_MEMORY_FULL\x10\x06\x1a\x37\n\x0bThermalZone\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04temp\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\t\x1a\x37\n\x11\x43puIdleStateEntry\x12\r\n\x05state\x18\x01 \x01(\t\x12\x13\n\x0b\x64uration_us\x18\x02 \x01(\x04\x1ah\n\x0c\x43puIdleState\x12\x0e\n\x06\x63pu_id\x18\x01 \x01(\r\x12H\n\x13\x63puidle_state_entry\x18\x02 \x03(\x0b\x32+.perfetto.protos.SysStats.CpuIdleStateEntry\x1a\x43\n\x08SlabInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0epages_per_slab\x18\x02 \x01(\r\x12\x11\n\tnum_slabs\x18\x03 \x01(\r\"\xcc\x02\n\x07\x43puInfo\x12*\n\x04\x63pus\x18\x01 \x03(\x0b\x32\x1c.perfetto.protos.CpuInfo.Cpu\x1an\n\x10\x41rmCpuIdentifier\x12\x13\n\x0bimplementer\x18\x01 \x01(\r\x12\x14\n\x0c\x61rchitecture\x18\x02 \x01(\r\x12\x0f\n\x07variant\x18\x03 \x01(\r\x12\x0c\n\x04part\x18\x04 \x01(\r\x12\x10\n\x08revision\x18\x05 \x01(\r\x1a\xa4\x01\n\x03\x43pu\x12\x11\n\tprocessor\x18\x01 \x01(\t\x12\x13\n\x0b\x66requencies\x18\x02 \x03(\r\x12\x10\n\x08\x63\x61pacity\x18\x03 \x01(\r\x12\x43\n\x0e\x61rm_identifier\x18\x04 \x01(\x0b\x32).perfetto.protos.CpuInfo.ArmCpuIdentifierH\x00\x12\x10\n\x08\x66\x65\x61tures\x18\x05 \x01(\x04\x42\x0c\n\nidentifier\"\x82\x02\n\x07GpuInfo\x12*\n\x04gpus\x18\x01 \x03(\x0b\x32\x1c.perfetto.protos.GpuInfo.Gpu\x1a\xca\x01\n\x03Gpu\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\r\n\x05model\x18\x03 \x01(\t\x12\x14\n\x0c\x61rchitecture\x18\x04 \x01(\t\x12\x0c\n\x04uuid\x18\x05 \x01(\x0c\x12\x0f\n\x07pci_bdf\x18\x07 \x01(\t\x12\x39\n\nextra_info\x18\x06 \x03(\x0b\x32%.perfetto.protos.GpuInfo.Gpu.KeyValue\x1a&\n\x08KeyValue\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x87\x01\n\rInterruptInfo\x12\x44\n\x0birq_mapping\x18\x01 \x03(\x0b\x32/.perfetto.protos.InterruptInfo.InterruptMapping\x1a\x30\n\x10InterruptMapping\x12\x0e\n\x06irq_id\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\"\xce\x08\n\tTestEvent\x12\x0b\n\x03str\x18\x01 \x01(\t\x12\x11\n\tseq_value\x18\x02 \x01(\r\x12\x0f\n\x07\x63ounter\x18\x03 \x01(\x04\x12\x0f\n\x07is_last\x18\x04 \x01(\x08\x12\x37\n\x07payload\x18\x05 \x01(\x0b\x32&.perfetto.protos.TestEvent.TestPayload\x12>\n\rprotovm_patch\x18\x06 \x01(\x0b\x32\'.perfetto.protos.TestEvent.ProtoVmPatch\x12U\n\x19protovm_incremental_state\x18\x07 \x01(\x0b\x32\x32.perfetto.protos.TestEvent.ProtoVmIncrementalState\x1a\xf2\x01\n\x0bTestPayload\x12\x0b\n\x03str\x18\x01 \x03(\t\x12\x36\n\x06nested\x18\x02 \x03(\x0b\x32&.perfetto.protos.TestEvent.TestPayload\x12\x15\n\rsingle_string\x18\x04 \x01(\t\x12\x12\n\nsingle_int\x18\x05 \x01(\x05\x12\x15\n\rrepeated_ints\x18\x06 \x03(\x05\x12\x1f\n\x17remaining_nesting_depth\x18\x03 \x01(\r\x12;\n\x11\x64\x65\x62ug_annotations\x18\x07 \x03(\x0b\x32 .perfetto.protos.DebugAnnotation\x1a\x96\x01\n\x0eProtoVmMessage\x12\n\n\x02id\x18\x01 \x01(\r\x12O\n\nsubmessage\x18\x02 \x01(\x0b\x32;.perfetto.protos.TestEvent.ProtoVmMessage.ProtoVmSubmessage\x1a\'\n\x11ProtoVmSubmessage\x12\x12\n\nsingle_int\x18\x01 \x01(\r\x1a\xd9\x01\n\x0cProtoVmPatch\x12\x17\n\x0fstring_to_merge\x18\x01 \x01(\t\x12\x14\n\x0cint_to_merge\x18\x02 \x01(\x05\x12\x41\n\x0esingle_message\x18\x03 \x01(\x0b\x32).perfetto.protos.TestEvent.ProtoVmMessage\x12;\n\x08messages\x18\x04 \x03(\x0b\x32).perfetto.protos.TestEvent.ProtoVmMessage\x12\x1a\n\x12\x64\x65lete_message_ids\x18\x05 \x03(\r\x1a\xc4\x01\n\x17ProtoVmIncrementalState\x12\x15\n\rstring_merged\x18\x01 \x01(\t\x12\x12\n\nint_merged\x18\x02 \x01(\x05\x12\x41\n\x0esingle_message\x18\x03 \x01(\x0b\x32).perfetto.protos.TestEvent.ProtoVmMessage\x12;\n\x08messages\x18\x04 \x03(\x0b\x32).perfetto.protos.TestEvent.ProtoVmMessage\"\xb7\x02\n\x13TracePacketDefaults\x12\x1a\n\x12timestamp_clock_id\x18: \x01(\r\x12\x41\n\x14track_event_defaults\x18\x0b \x01(\x0b\x32#.perfetto.protos.TrackEventDefaults\x12\x41\n\x14perf_sample_defaults\x18\x0c \x01(\x0b\x32#.perfetto.protos.PerfSampleDefaults\x12\x43\n\x15stack_sample_defaults\x18\x64 \x01(\x0b\x32$.perfetto.protos.StackSampleDefaults\x12\x39\n\x10v8_code_defaults\x18\x63 \x01(\x0b\x32\x1f.perfetto.protos.V8CodeDefaults\"%\n\tTraceUuid\x12\x0b\n\x03msb\x18\x01 \x01(\x03\x12\x0b\n\x03lsb\x18\x02 \x01(\x03\"\xe7\x03\n\x11ProcessDescriptor\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0f\n\x07\x63mdline\x18\x02 \x03(\t\x12\x14\n\x0cprocess_name\x18\x06 \x01(\t\x12\x18\n\x10process_priority\x18\x05 \x01(\x05\x12\x1a\n\x12start_timestamp_ns\x18\x07 \x01(\x03\x12Q\n\x13\x63hrome_process_type\x18\x04 \x01(\x0e\x32\x34.perfetto.protos.ProcessDescriptor.ChromeProcessType\x12\x19\n\x11legacy_sort_index\x18\x03 \x01(\x05\x12\x16\n\x0eprocess_labels\x18\x08 \x03(\t\"\xe1\x01\n\x11\x43hromeProcessType\x12\x17\n\x13PROCESS_UNSPECIFIED\x10\x00\x12\x13\n\x0fPROCESS_BROWSER\x10\x01\x12\x14\n\x10PROCESS_RENDERER\x10\x02\x12\x13\n\x0fPROCESS_UTILITY\x10\x03\x12\x12\n\x0ePROCESS_ZYGOTE\x10\x04\x12\x1a\n\x16PROCESS_SANDBOX_HELPER\x10\x05\x12\x0f\n\x0bPROCESS_GPU\x10\x06\x12\x18\n\x14PROCESS_PPAPI_PLUGIN\x10\x07\x12\x18\n\x14PROCESS_PPAPI_BROKER\x10\x08\"-\n\x19TrackEventRangeOfInterest\x12\x10\n\x08start_us\x18\x01 \x01(\x03\"\xf4\x05\n\x10ThreadDescriptor\x12\x0b\n\x03pid\x18\x01 \x01(\x05\x12\x0b\n\x03tid\x18\x02 \x01(\x03\x12\x13\n\x0bthread_name\x18\x05 \x01(\t\x12N\n\x12\x63hrome_thread_type\x18\x04 \x01(\x0e\x32\x32.perfetto.protos.ThreadDescriptor.ChromeThreadType\x12\x1e\n\x16reference_timestamp_us\x18\x06 \x01(\x03\x12 \n\x18reference_thread_time_us\x18\x07 \x01(\x03\x12*\n\"reference_thread_instruction_count\x18\x08 \x01(\x03\x12\x19\n\x11legacy_sort_index\x18\x03 \x01(\x05\"\xd7\x03\n\x10\x43hromeThreadType\x12\x1d\n\x19\x43HROME_THREAD_UNSPECIFIED\x10\x00\x12\x16\n\x12\x43HROME_THREAD_MAIN\x10\x01\x12\x14\n\x10\x43HROME_THREAD_IO\x10\x02\x12 \n\x1c\x43HROME_THREAD_POOL_BG_WORKER\x10\x03\x12 \n\x1c\x43HROME_THREAD_POOL_FG_WORKER\x10\x04\x12\"\n\x1e\x43HROME_THREAD_POOL_FB_BLOCKING\x10\x05\x12\"\n\x1e\x43HROME_THREAD_POOL_BG_BLOCKING\x10\x06\x12\x1e\n\x1a\x43HROME_THREAD_POOL_SERVICE\x10\x07\x12\x1c\n\x18\x43HROME_THREAD_COMPOSITOR\x10\x08\x12 \n\x1c\x43HROME_THREAD_VIZ_COMPOSITOR\x10\t\x12#\n\x1f\x43HROME_THREAD_COMPOSITOR_WORKER\x10\n\x12 \n\x1c\x43HROME_THREAD_SERVICE_WORKER\x10\x0b\x12\x1e\n\x1a\x43HROME_THREAD_MEMORY_INFRA\x10\x32\x12#\n\x1f\x43HROME_THREAD_SAMPLING_PROFILER\x10\x33\"\x9b\x01\n\x17\x43hromeProcessDescriptor\x12\x14\n\x0cprocess_type\x18\x01 \x01(\x05\x12\x18\n\x10process_priority\x18\x02 \x01(\x05\x12\x19\n\x11legacy_sort_index\x18\x03 \x01(\x05\x12\x1d\n\x15host_app_package_name\x18\x04 \x01(\t\x12\x16\n\x0e\x63rash_trace_id\x18\x05 \x01(\x04\"b\n\x16\x43hromeThreadDescriptor\x12\x13\n\x0bthread_type\x18\x01 \x01(\x05\x12\x19\n\x11legacy_sort_index\x18\x02 \x01(\x05\x12\x18\n\x10is_sandboxed_tid\x18\x03 \x01(\x08\"\xc7\x03\n\x11\x43ounterDescriptor\x12\x43\n\x04type\x18\x01 \x01(\x0e\x32\x35.perfetto.protos.CounterDescriptor.BuiltinCounterType\x12\x12\n\ncategories\x18\x02 \x03(\t\x12\x35\n\x04unit\x18\x03 \x01(\x0e\x32\'.perfetto.protos.CounterDescriptor.Unit\x12\x11\n\tunit_name\x18\x06 \x01(\t\x12\x17\n\x0funit_multiplier\x18\x04 \x01(\x03\x12\x16\n\x0eis_incremental\x18\x05 \x01(\x08\x12\x18\n\x10y_axis_share_key\x18\x07 \x01(\t\"o\n\x12\x42uiltinCounterType\x12\x17\n\x13\x43OUNTER_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43OUNTER_THREAD_TIME_NS\x10\x01\x12$\n COUNTER_THREAD_INSTRUCTION_COUNT\x10\x02\"S\n\x04Unit\x12\x14\n\x10UNIT_UNSPECIFIED\x10\x00\x12\x10\n\x0cUNIT_TIME_NS\x10\x01\x12\x0e\n\nUNIT_COUNT\x10\x02\x12\x13\n\x0fUNIT_SIZE_BYTES\x10\x03\"\x11\n\x0fStateDescriptor\"\x88\x0b\n\x0fTrackDescriptor\x12\x0c\n\x04uuid\x18\x01 \x01(\x04\x12\x13\n\x0bparent_uuid\x18\x05 \x01(\x04\x12\x0e\n\x04name\x18\x02 \x01(\tH\x00\x12\x15\n\x0bstatic_name\x18\n \x01(\tH\x00\x12\x15\n\x0b\x61trace_name\x18\r \x01(\tH\x00\x12\x13\n\x0b\x64\x65scription\x18\x0e \x01(\t\x12\x33\n\x07process\x18\x03 \x01(\x0b\x32\".perfetto.protos.ProcessDescriptor\x12@\n\x0e\x63hrome_process\x18\x06 \x01(\x0b\x32(.perfetto.protos.ChromeProcessDescriptor\x12\x31\n\x06thread\x18\x04 \x01(\x0b\x32!.perfetto.protos.ThreadDescriptor\x12>\n\rchrome_thread\x18\x07 \x01(\x0b\x32\'.perfetto.protos.ChromeThreadDescriptor\x12\x33\n\x07\x63ounter\x18\x08 \x01(\x0b\x32\".perfetto.protos.CounterDescriptor\x12/\n\x05state\x18\x12 \x01(\x0b\x32 .perfetto.protos.StateDescriptor\x12+\n#disallow_merging_with_system_tracks\x18\t \x01(\x08\x12L\n\x0e\x63hild_ordering\x18\x0b \x01(\x0e\x32\x34.perfetto.protos.TrackDescriptor.ChildTracksOrdering\x12\x1a\n\x12sibling_order_rank\x18\x0c \x01(\x05\x12U\n\x16sibling_merge_behavior\x18\x0f \x01(\x0e\x32\x35.perfetto.protos.TrackDescriptor.SiblingMergeBehavior\x12\x1b\n\x11sibling_merge_key\x18\x10 \x01(\tH\x01\x12\x1f\n\x15sibling_merge_key_int\x18\x11 \x01(\x04H\x01\x12J\n\x10process_ordering\x18\x13 \x01(\x0e\x32\x30.perfetto.protos.TrackDescriptor.ProcessOrdering\x12H\n\x0fthread_ordering\x18\x14 \x01(\x0e\x32/.perfetto.protos.TrackDescriptor.ThreadOrdering\"V\n\x13\x43hildTracksOrdering\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x11\n\rLEXICOGRAPHIC\x10\x01\x12\x11\n\rCHRONOLOGICAL\x10\x02\x12\x0c\n\x08\x45XPLICIT\x10\x03\"\xba\x01\n\x14SiblingMergeBehavior\x12&\n\"SIBLING_MERGE_BEHAVIOR_UNSPECIFIED\x10\x00\x12(\n$SIBLING_MERGE_BEHAVIOR_BY_TRACK_NAME\x10\x01\x12\x1f\n\x1bSIBLING_MERGE_BEHAVIOR_NONE\x10\x02\x12/\n+SIBLING_MERGE_BEHAVIOR_BY_SIBLING_MERGE_KEY\x10\x03\"R\n\x0fProcessOrdering\x12 \n\x1cPROCESS_ORDERING_UNSPECIFIED\x10\x00\x12\x1d\n\x19PROCESS_ORDERING_EXPLICIT\x10\x01\"O\n\x0eThreadOrdering\x12\x1f\n\x1bTHREAD_ORDERING_UNSPECIFIED\x10\x00\x12\x1c\n\x18THREAD_ORDERING_EXPLICIT\x10\x01\x42\x18\n\x16static_or_dynamic_nameB\x19\n\x17sibling_merge_key_field\"\xed\x03\n\x10TranslationTable\x12M\n\x10\x63hrome_histogram\x18\x01 \x01(\x0b\x32\x31.perfetto.protos.ChromeHistorgramTranslationTableH\x00\x12M\n\x11\x63hrome_user_event\x18\x02 \x01(\x0b\x32\x30.perfetto.protos.ChromeUserEventTranslationTableH\x00\x12Y\n\x17\x63hrome_performance_mark\x18\x03 \x01(\x0b\x32\x36.perfetto.protos.ChromePerformanceMarkTranslationTableH\x00\x12@\n\nslice_name\x18\x04 \x01(\x0b\x32*.perfetto.protos.SliceNameTranslationTableH\x00\x12O\n\x12process_track_name\x18\x05 \x01(\x0b\x32\x31.perfetto.protos.ProcessTrackNameTranslationTableH\x00\x12\x44\n\x0c\x63hrome_study\x18\x06 \x01(\x0b\x32,.perfetto.protos.ChromeStudyTranslationTableH\x00\x42\x07\n\x05table\"\xae\x01\n ChromeHistorgramTranslationTable\x12W\n\x0chash_to_name\x18\x01 \x03(\x0b\x32\x41.perfetto.protos.ChromeHistorgramTranslationTable.HashToNameEntry\x1a\x31\n\x0fHashToNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbf\x01\n\x1f\x43hromeUserEventTranslationTable\x12\x63\n\x13\x61\x63tion_hash_to_name\x18\x01 \x03(\x0b\x32\x46.perfetto.protos.ChromeUserEventTranslationTable.ActionHashToNameEntry\x1a\x37\n\x15\x41\x63tionHashToNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xe3\x02\n%ChromePerformanceMarkTranslationTable\x12\x65\n\x11site_hash_to_name\x18\x01 \x03(\x0b\x32J.perfetto.protos.ChromePerformanceMarkTranslationTable.SiteHashToNameEntry\x12\x65\n\x11mark_hash_to_name\x18\x02 \x03(\x0b\x32J.perfetto.protos.ChromePerformanceMarkTranslationTable.MarkHashToNameEntry\x1a\x35\n\x13SiteHashToNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x35\n\x13MarkHashToNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xc2\x01\n\x19SliceNameTranslationTable\x12g\n\x18raw_to_deobfuscated_name\x18\x01 \x03(\x0b\x32\x45.perfetto.protos.SliceNameTranslationTable.RawToDeobfuscatedNameEntry\x1a<\n\x1aRawToDeobfuscatedNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xd0\x01\n ProcessTrackNameTranslationTable\x12n\n\x18raw_to_deobfuscated_name\x18\x01 \x03(\x0b\x32L.perfetto.protos.ProcessTrackNameTranslationTable.RawToDeobfuscatedNameEntry\x1a<\n\x1aRawToDeobfuscatedNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xa4\x01\n\x1b\x43hromeStudyTranslationTable\x12R\n\x0chash_to_name\x18\x01 \x03(\x0b\x32<.perfetto.protos.ChromeStudyTranslationTable.HashToNameEntry\x1a\x31\n\x0fHashToNameEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"k\n\x07Trigger\x12\x14\n\x0ctrigger_name\x18\x01 \x01(\t\x12\x15\n\rproducer_name\x18\x02 \x01(\t\x12\x1c\n\x14trusted_producer_uid\x18\x03 \x01(\x05\x12\x15\n\rstop_delay_ms\x18\x04 \x01(\x04\"\xc5\x01\n\x07UiState\x12\x19\n\x11timeline_start_ts\x18\x01 \x01(\x03\x12\x17\n\x0ftimeline_end_ts\x18\x02 \x01(\x03\x12\x44\n\x11highlight_process\x18\x03 \x01(\x0b\x32).perfetto.protos.UiState.HighlightProcess\x1a@\n\x10HighlightProcess\x12\r\n\x03pid\x18\x01 \x01(\rH\x00\x12\x11\n\x07\x63mdline\x18\x02 \x01(\tH\x00\x42\n\n\x08selector\"\xed\x32\n\x0bTracePacket\x12\x11\n\ttimestamp\x18\x08 \x01(\x04\x12\x1a\n\x12timestamp_clock_id\x18: \x01(\r\x12\x32\n\x0btrack_event\x18\x0b \x01(\x0b\x32\x1b.perfetto.protos.TrackEventH\x00\x12<\n\x10track_descriptor\x18< \x01(\x0b\x32 .perfetto.protos.TrackDescriptorH\x00\x12W\n\x1fgeneric_kernel_task_state_event\x18u \x01(\x0b\x32,.perfetto.protos.GenericKernelTaskStateEventH\x00\x12X\n\x1dgeneric_kernel_cpu_freq_event\x18v \x01(\x0b\x32/.perfetto.protos.GenericKernelCpuFrequencyEventH\x00\x12Y\n generic_kernel_task_rename_event\x18x \x01(\x0b\x32-.perfetto.protos.GenericKernelTaskRenameEventH\x00\x12P\n\x1bgeneric_kernel_process_tree\x18z \x01(\x0b\x32).perfetto.protos.GenericKernelProcessTreeH\x00\x12Q\n\x1bgeneric_gpu_frequency_event\x18\x81\x01 \x01(\x0b\x32).perfetto.protos.GenericGpuFrequencyEventH\x00\x12\x34\n\x0cprocess_tree\x18\x02 \x01(\x0b\x32\x1c.perfetto.protos.ProcessTreeH\x00\x12S\n\x1dtrack_event_range_of_interest\x18Z \x01(\x0b\x32*.perfetto.protos.TrackEventRangeOfInterestH\x00\x12\x36\n\rprocess_stats\x18\t \x01(\x0b\x32\x1d.perfetto.protos.ProcessStatsH\x00\x12\x37\n\x0einode_file_map\x18\x04 \x01(\x0b\x32\x1d.perfetto.protos.InodeFileMapH\x00\x12;\n\rchrome_events\x18\x05 \x01(\x0b\x32\".perfetto.protos.ChromeEventBundleH\x00\x12\x38\n\x0e\x63lock_snapshot\x18\x06 \x01(\x0b\x32\x1e.perfetto.protos.ClockSnapshotH\x00\x12.\n\tsys_stats\x18\x07 \x01(\x0b\x32\x19.perfetto.protos.SysStatsH\x00\x12\x30\n\ntrace_uuid\x18Y \x01(\x0b\x32\x1a.perfetto.protos.TraceUuidH\x00\x12\x34\n\x0ctrace_config\x18! \x01(\x0b\x32\x1c.perfetto.protos.TraceConfigH\x00\x12\x34\n\x0c\x66trace_stats\x18\" \x01(\x0b\x32\x1c.perfetto.protos.FtraceStatsH\x00\x12\x32\n\x0btrace_stats\x18# \x01(\x0b\x32\x1b.perfetto.protos.TraceStatsH\x00\x12\x38\n\x0eprofile_packet\x18% \x01(\x0b\x32\x1e.perfetto.protos.ProfilePacketH\x00\x12\x44\n\x14streaming_allocation\x18J \x01(\x0b\x32$.perfetto.protos.StreamingAllocationH\x00\x12\x38\n\x0estreaming_free\x18K \x01(\x0b\x32\x1e.perfetto.protos.StreamingFreeH\x00\x12\x33\n\x07\x62\x61ttery\x18& \x01(\x0b\x32 .perfetto.protos.BatteryCountersH\x00\x12\x32\n\x0bpower_rails\x18( \x01(\x0b\x32\x1b.perfetto.protos.PowerRailsH\x00\x12\x38\n\x0b\x61ndroid_log\x18\' \x01(\x0b\x32!.perfetto.protos.AndroidLogPacketH\x00\x12\x32\n\x0bsystem_info\x18- \x01(\x0b\x32\x1b.perfetto.protos.SystemInfoH\x00\x12+\n\x07trigger\x18. \x01(\x0b\x32\x18.perfetto.protos.TriggerH\x00\x12\x38\n\x0e\x63hrome_trigger\x18m \x01(\x0b\x32\x1e.perfetto.protos.ChromeTriggerH\x00\x12\x36\n\rpackages_list\x18/ \x01(\x0b\x32\x1d.perfetto.protos.PackagesListH\x00\x12M\n\x19\x63hrome_benchmark_metadata\x18\x30 \x01(\x0b\x32(.perfetto.protos.ChromeBenchmarkMetadataH\x00\x12@\n\x12perfetto_metatrace\x18\x31 \x01(\x0b\x32\".perfetto.protos.PerfettoMetatraceH\x00\x12@\n\x0f\x63hrome_metadata\x18\x33 \x01(\x0b\x32%.perfetto.protos.ChromeMetadataPacketH\x00\x12=\n\x11gpu_counter_event\x18\x34 \x01(\x0b\x32 .perfetto.protos.GpuCounterEventH\x00\x12\x46\n\x16gpu_render_stage_event\x18\x35 \x01(\x0b\x32$.perfetto.protos.GpuRenderStageEventH\x00\x12K\n\x18streaming_profile_packet\x18\x36 \x01(\x0b\x32\'.perfetto.protos.StreamingProfilePacketH\x00\x12\x44\n\x14\x61rt_process_metadata\x18\x83\x01 \x01(\x0b\x32#.perfetto.protos.ArtProcessMetadataH\x00\x12\x43\n\x14graphics_frame_event\x18\x39 \x01(\x0b\x32#.perfetto.protos.GraphicsFrameEventH\x00\x12\x41\n\x13vulkan_memory_event\x18> \x01(\x0b\x32\".perfetto.protos.VulkanMemoryEventH\x00\x12*\n\x07gpu_log\x18? \x01(\x0b\x32\x17.perfetto.protos.GpuLogH\x00\x12;\n\x10vulkan_api_event\x18\x41 \x01(\x0b\x32\x1f.perfetto.protos.VulkanApiEventH\x00\x12\x32\n\x0bperf_sample\x18\x42 \x01(\x0b\x32\x1b.perfetto.protos.PerfSampleH\x00\x12,\n\x08\x63pu_info\x18\x43 \x01(\x0b\x32\x18.perfetto.protos.CpuInfoH\x00\x12\x34\n\x0csmaps_packet\x18\x44 \x01(\x0b\x32\x1c.perfetto.protos.SmapsPacketH\x00\x12=\n\rservice_event\x18\x45 \x01(\x0b\x32$.perfetto.protos.TracingServiceEventH\x00\x12L\n\x18\x63oncurrent_session_event\x18\x86\x01 \x01(\x0b\x32\'.perfetto.protos.ConcurrentSessionEventH\x00\x12\x35\n\x0cstack_sample\x18\x87\x01 \x01(\x0b\x32\x1c.perfetto.protos.StackSampleH\x00\x12\x45\n\x15initial_display_state\x18\x46 \x01(\x0b\x32$.perfetto.protos.InitialDisplayStateH\x00\x12@\n\x13gpu_mem_total_event\x18G \x01(\x0b\x32!.perfetto.protos.GpuMemTotalEventH\x00\x12I\n\x17memory_tracker_snapshot\x18I \x01(\x0b\x32&.perfetto.protos.MemoryTrackerSnapshotH\x00\x12`\n#android_energy_estimation_breakdown\x18M \x01(\x0b\x32\x31.perfetto.protos.AndroidEnergyEstimationBreakdownH\x00\x12,\n\x08ui_state\x18N \x01(\x0b\x32\x18.perfetto.protos.UiStateH\x00\x12>\n\x11translation_table\x18R \x01(\x0b\x32!.perfetto.protos.TranslationTableH\x00\x12V\n\x1e\x61ndroid_game_intervention_list\x18S \x01(\x0b\x32,.perfetto.protos.AndroidGameInterventionListH\x00\x12\x32\n\x0bstatsd_atom\x18T \x01(\x0b\x32\x1b.perfetto.protos.StatsdAtomH\x00\x12I\n\x17\x61ndroid_system_property\x18V \x01(\x0b\x32&.perfetto.protos.AndroidSystemPropertyH\x00\x12G\n\x16\x65ntity_state_residency\x18[ \x01(\x0b\x32%.perfetto.protos.EntityStateResidencyH\x00\x12<\n\x10trace_provenance\x18| \x01(\x0b\x32 .perfetto.protos.TraceProvenanceH\x00\x12\x39\n\x08protovms\x18} \x01(\x0b\x32%.perfetto.protos.TracePacket.ProtoVmsH\x00\x12<\n\x10trace_attributes\x18~ \x01(\x0b\x32 .perfetto.protos.TraceAttributesH\x00\x12\x38\n\x0e\x61ndroid_aflags\x18\x7f \x01(\x0b\x32\x1e.perfetto.protos.AndroidAflagsH\x00\x12-\n\x08gpu_info\x18\x80\x01 \x01(\x0b\x32\x18.perfetto.protos.GpuInfoH\x00\x12\x39\n\x0einterrupt_info\x18\x82\x01 \x01(\x0b\x32\x1e.perfetto.protos.InterruptInfoH\x00\x12\x38\n\x0emodule_symbols\x18= \x01(\x0b\x32\x1e.perfetto.protos.ModuleSymbolsH\x00\x12\x46\n\x15\x64\x65obfuscation_mapping\x18@ \x01(\x0b\x32%.perfetto.protos.DeobfuscationMappingH\x00\x12@\n\x12process_descriptor\x18+ \x01(\x0b\x32\".perfetto.protos.ProcessDescriptorH\x00\x12>\n\x11thread_descriptor\x18, \x01(\x0b\x32!.perfetto.protos.ThreadDescriptorH\x00\x12;\n\rftrace_events\x18\x01 \x01(\x0b\x32\".perfetto.protos.FtraceEventBundleH\x00\x12 \n\x16synchronization_marker\x18$ \x01(\x0cH\x00\x12\x1c\n\x12\x63ompressed_packets\x18\x32 \x01(\x0cH\x00\x12\"\n\x17zstd_compressed_packets\x18\x85\x01 \x01(\x0cH\x00\x12\x44\n\x14\x65xtension_descriptor\x18H \x01(\x0b\x32$.perfetto.protos.ExtensionDescriptorH\x00\x12:\n\netw_events\x18_ \x01(\x0b\x32$.perfetto.protos.EtwTraceEventBundleH\x00\x12/\n\nv8_js_code\x18\x63 \x01(\x0b\x32\x19.perfetto.protos.V8JsCodeH\x00\x12;\n\x10v8_internal_code\x18\x64 \x01(\x0b\x32\x1f.perfetto.protos.V8InternalCodeH\x00\x12\x33\n\x0cv8_wasm_code\x18\x65 \x01(\x0b\x32\x1b.perfetto.protos.V8WasmCodeH\x00\x12\x38\n\x0fv8_reg_exp_code\x18\x66 \x01(\x0b\x32\x1d.perfetto.protos.V8RegExpCodeH\x00\x12\x33\n\x0cv8_code_move\x18g \x01(\x0b\x32\x1b.perfetto.protos.V8CodeMoveH\x00\x12=\n\x11remote_clock_sync\x18k \x01(\x0b\x32 .perfetto.protos.RemoteClockSyncH\x00\x12?\n\x12pixel_modem_events\x18n \x01(\x0b\x32!.perfetto.protos.PixelModemEventsH\x00\x12N\n\x1apixel_modem_token_database\x18o \x01(\x0b\x32(.perfetto.protos.PixelModemTokenDatabaseH\x00\x12:\n\x16\x63lone_snapshot_trigger\x18q \x01(\x0b\x32\x18.perfetto.protos.TriggerH\x00\x12\x43\n\x14kernel_wakelock_data\x18s \x01(\x0b\x32#.perfetto.protos.KernelWakelockDataH\x00\x12:\n\x10\x63pu_per_uid_data\x18w \x01(\x0b\x32\x1e.perfetto.protos.CpuPerUidDataH\x00\x12\x35\n\tuser_list\x18{ \x01(\x0b\x32 .perfetto.protos.AndroidUserListH\x00\x12@\n\x0ejournald_event\x18\x84\x01 \x01(\x0b\x32%.perfetto.protos.SystemdJournaldEventH\x00\x12\x32\n\x0b\x66or_testing\x18\x84\x07 \x01(\x0b\x32\x1a.perfetto.protos.TestEventH\x00\x12\x15\n\x0btrusted_uid\x18\x03 \x01(\x05H\x01\x12$\n\x1atrusted_packet_sequence_id\x18\n \x01(\rH\x02\x12\x13\n\x0btrusted_pid\x18O \x01(\x05\x12\x34\n\rinterned_data\x18\x0c \x01(\x0b\x32\x1d.perfetto.protos.InternedData\x12\x16\n\x0esequence_flags\x18\r \x01(\r\x12!\n\x19incremental_state_cleared\x18) \x01(\x08\x12\x43\n\x15trace_packet_defaults\x18; \x01(\x0b\x32$.perfetto.protos.TracePacketDefaults\x12\x1f\n\x17previous_packet_dropped\x18* \x01(\r\x12 \n\x18\x66irst_packet_on_sequence\x18W \x01(\x08\x12\x12\n\nmachine_id\x18\x62 \x01(\r\x1a\xe1\x01\n\x08ProtoVms\x12@\n\x08instance\x18\x01 \x03(\x0b\x32..perfetto.protos.TracePacket.ProtoVms.Instance\x1a\x92\x01\n\x08Instance\x12+\n\x07program\x18\x01 \x01(\x0b\x32\x1a.perfetto.protos.VmProgram\x12+\n\x05state\x18\x02 \x01(\x0b\x32\x1c.perfetto.protos.TracePacket\x12\x17\n\x0fmemory_limit_kb\x18\x03 \x01(\r\x12\x13\n\x0bproducer_id\x18\x04 \x03(\x05\"h\n\rSequenceFlags\x12\x13\n\x0fSEQ_UNSPECIFIED\x10\x00\x12!\n\x1dSEQ_INCREMENTAL_STATE_CLEARED\x10\x01\x12\x1f\n\x1bSEQ_NEEDS_INCREMENTAL_STATE\x10\x02\"\xb0\x02\n\x0e\x44\x61taLossReason\x12\x19\n\x15\x44\x41TA_LOSS_UNSPECIFIED\x10\x00\x12\x15\n\x11\x44\x41TA_LOSS_PRESENT\x10\x01\x12\x16\n\x12\x44\x41TA_LOSS_READ_GAP\x10\x02\x12\x1d\n\x19\x44\x41TA_LOSS_CHUNK_CORRUPTED\x10\x04\x12!\n\x1d\x44\x41TA_LOSS_ORPHAN_CONTINUATION\x10\x08\x12\x1c\n\x18\x44\x41TA_LOSS_REASSEMBLY_GAP\x10\x10\x12%\n!DATA_LOSS_REASSEMBLY_BROKEN_CHAIN\x10 \x12\x17\n\x13\x44\x41TA_LOSS_OVERWRITE\x10@\x12\x1b\n\x16\x44\x41TA_LOSS_WRITER_ABORT\x10\x80\x01\x12\x17\n\x12\x44\x41TA_LOSS_SMB_FULL\x10\x80\x02*\x04\x08\x38\x10\x39*\x04\x08L\x10M*\x04\x08X\x10Y*\x04\x08\\\x10]*\x04\x08]\x10^*\x04\x08^\x10_*\x04\x08`\x10\x61*\x04\x08\x61\x10\x62*\x04\x08h\x10i*\x04\x08i\x10j*\x04\x08p\x10q*\x04\x08r\x10s*\x04\x08t\x10u*\x04\x08y\x10z*\x06\x08\xe8\x07\x10\xd0\x0f\x42\x06\n\x04\x64\x61taB\x16\n\x14optional_trusted_uidB%\n#optional_trusted_packet_sequence_idJ\x04\x08j\x10kJ\x04\x08\x37\x10\x38J\x04\x08P\x10QJ\x04\x08Q\x10R\"5\n\x05Trace\x12,\n\x06packet\x18\x01 \x03(\x0b\x32\x1c.perfetto.protos.TracePacket*c\n\x0cVmCursorEnum\x12\x19\n\x15VM_CURSOR_UNSPECIFIED\x10\x00\x12\x11\n\rVM_CURSOR_SRC\x10\x01\x12\x11\n\rVM_CURSOR_DST\x10\x02\x12\x12\n\x0eVM_CURSOR_BOTH\x10\x03*\xd9\x02\n\x0c\x42uiltinClock\x12\x19\n\x15\x42UILTIN_CLOCK_UNKNOWN\x10\x00\x12\x1a\n\x16\x42UILTIN_CLOCK_REALTIME\x10\x01\x12!\n\x1d\x42UILTIN_CLOCK_REALTIME_COARSE\x10\x02\x12\x1b\n\x17\x42UILTIN_CLOCK_MONOTONIC\x10\x03\x12\"\n\x1e\x42UILTIN_CLOCK_MONOTONIC_COARSE\x10\x04\x12\x1f\n\x1b\x42UILTIN_CLOCK_MONOTONIC_RAW\x10\x05\x12\x1a\n\x16\x42UILTIN_CLOCK_BOOTTIME\x10\x06\x12\x15\n\x11\x42UILTIN_CLOCK_TSC\x10\t\x12\x16\n\x12\x42UILTIN_CLOCK_PERF\x10\n\x12\x1c\n\x18\x42UILTIN_CLOCK_TRACE_FILE\x10\x0b\x12\x18\n\x14\x42UILTIN_CLOCK_MAX_ID\x10?\"\x04\x08\x07\x10\x07\"\x04\x08\x08\x10\x08*z\n\x0cSemanticType\x12\x1d\n\x19SEMANTIC_TYPE_UNSPECIFIED\x10\x00\x12\x18\n\x14SEMANTIC_TYPE_ATRACE\x10\x01\x12\x15\n\x11SEMANTIC_TYPE_JOB\x10\x02\x12\x1a\n\x16SEMANTIC_TYPE_WAKELOCK\x10\x03*\x8e\x01\n\x0c\x41ndroidLogId\x12\x0f\n\x0bLID_DEFAULT\x10\x00\x12\r\n\tLID_RADIO\x10\x01\x12\x0e\n\nLID_EVENTS\x10\x02\x12\x0e\n\nLID_SYSTEM\x10\x03\x12\r\n\tLID_CRASH\x10\x04\x12\r\n\tLID_STATS\x10\x05\x12\x10\n\x0cLID_SECURITY\x10\x06\x12\x0e\n\nLID_KERNEL\x10\x07*\x9b\x01\n\x12\x41ndroidLogPriority\x12\x14\n\x10PRIO_UNSPECIFIED\x10\x00\x12\x0f\n\x0bPRIO_UNUSED\x10\x01\x12\x10\n\x0cPRIO_VERBOSE\x10\x02\x12\x0e\n\nPRIO_DEBUG\x10\x03\x12\r\n\tPRIO_INFO\x10\x04\x12\r\n\tPRIO_WARN\x10\x05\x12\x0e\n\nPRIO_ERROR\x10\x06\x12\x0e\n\nPRIO_FATAL\x10\x07*\xc7\x01\n\rProtoLogLevel\x12\x1c\n\x18PROTOLOG_LEVEL_UNDEFINED\x10\x00\x12\x18\n\x14PROTOLOG_LEVEL_DEBUG\x10\x01\x12\x1a\n\x16PROTOLOG_LEVEL_VERBOSE\x10\x02\x12\x17\n\x13PROTOLOG_LEVEL_INFO\x10\x03\x12\x17\n\x13PROTOLOG_LEVEL_WARN\x10\x04\x12\x18\n\x14PROTOLOG_LEVEL_ERROR\x10\x05\x12\x16\n\x12PROTOLOG_LEVEL_WTF\x10\x06*\xf3\xfb\x02\n\x06\x41tomId\x12\x14\n\x10\x41TOM_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x41TOM_BLE_SCAN_STATE_CHANGED\x10\x02\x12\x1e\n\x1a\x41TOM_PROCESS_STATE_CHANGED\x10\x03\x12!\n\x1d\x41TOM_BLE_SCAN_RESULT_RECEIVED\x10\x04\x12\x1d\n\x19\x41TOM_SENSOR_STATE_CHANGED\x10\x05\x12\x1f\n\x1b\x41TOM_GPS_SCAN_STATE_CHANGED\x10\x06\x12\x1b\n\x17\x41TOM_SYNC_STATE_CHANGED\x10\x07\x12$\n ATOM_SCHEDULED_JOB_STATE_CHANGED\x10\x08\x12\"\n\x1e\x41TOM_SCREEN_BRIGHTNESS_CHANGED\x10\t\x12\x1f\n\x1b\x41TOM_WAKELOCK_STATE_CHANGED\x10\n\x12,\n(ATOM_LONG_PARTIAL_WAKELOCK_STATE_CHANGED\x10\x0b\x12)\n%ATOM_MOBILE_RADIO_POWER_STATE_CHANGED\x10\x0c\x12\'\n#ATOM_WIFI_RADIO_POWER_STATE_CHANGED\x10\r\x12-\n)ATOM_ACTIVITY_MANAGER_SLEEP_STATE_CHANGED\x10\x0e\x12$\n ATOM_MEMORY_FACTOR_STATE_CHANGED\x10\x0f\x12%\n!ATOM_EXCESSIVE_CPU_USAGE_REPORTED\x10\x10\x12\x1d\n\x19\x41TOM_CACHED_KILL_REPORTED\x10\x11\x12%\n!ATOM_PROCESS_MEMORY_STAT_REPORTED\x10\x12\x12\x17\n\x13\x41TOM_LAUNCHER_EVENT\x10\x13\x12)\n%ATOM_BATTERY_SAVER_MODE_STATE_CHANGED\x10\x14\x12\'\n#ATOM_DEVICE_IDLE_MODE_STATE_CHANGED\x10\x15\x12)\n%ATOM_DEVICE_IDLING_MODE_STATE_CHANGED\x10\x16\x12\x1c\n\x18\x41TOM_AUDIO_STATE_CHANGED\x10\x17\x12\"\n\x1e\x41TOM_MEDIA_CODEC_STATE_CHANGED\x10\x18\x12\x1d\n\x19\x41TOM_CAMERA_STATE_CHANGED\x10\x19\x12!\n\x1d\x41TOM_FLASHLIGHT_STATE_CHANGED\x10\x1a\x12\"\n\x1e\x41TOM_UID_PROCESS_STATE_CHANGED\x10\x1b\x12)\n%ATOM_PROCESS_LIFE_CYCLE_STATE_CHANGED\x10\x1c\x12\x1d\n\x19\x41TOM_SCREEN_STATE_CHANGED\x10\x1d\x12\x1e\n\x1a\x41TOM_BATTERY_LEVEL_CHANGED\x10\x1e\x12\x1f\n\x1b\x41TOM_CHARGING_STATE_CHANGED\x10\x1f\x12\x1e\n\x1a\x41TOM_PLUGGED_STATE_CHANGED\x10 \x12\"\n\x1e\x41TOM_INTERACTIVE_STATE_CHANGED\x10!\x12\x1d\n\x19\x41TOM_TOUCH_EVENT_REPORTED\x10\"\x12\x1e\n\x1a\x41TOM_WAKEUP_ALARM_OCCURRED\x10#\x12\x1f\n\x1b\x41TOM_KERNEL_WAKEUP_REPORTED\x10$\x12 \n\x1c\x41TOM_WIFI_LOCK_STATE_CHANGED\x10%\x12%\n!ATOM_WIFI_SIGNAL_STRENGTH_CHANGED\x10&\x12 \n\x1c\x41TOM_WIFI_SCAN_STATE_CHANGED\x10\'\x12&\n\"ATOM_PHONE_SIGNAL_STRENGTH_CHANGED\x10(\x12\x18\n\x14\x41TOM_SETTING_CHANGED\x10)\x12*\n&ATOM_ACTIVITY_FOREGROUND_STATE_CHANGED\x10*\x12\x1d\n\x19\x41TOM_ISOLATED_UID_CHANGED\x10+\x12\x1f\n\x1b\x41TOM_PACKET_WAKEUP_OCCURRED\x10,\x12 \n\x1c\x41TOM_WALL_CLOCK_TIME_SHIFTED\x10-\x12\x19\n\x15\x41TOM_ANOMALY_DETECTED\x10.\x12 \n\x1c\x41TOM_APP_BREADCRUMB_REPORTED\x10/\x12\x1b\n\x17\x41TOM_APP_START_OCCURRED\x10\x30\x12\x1b\n\x17\x41TOM_APP_START_CANCELED\x10\x31\x12\x1e\n\x1a\x41TOM_APP_START_FULLY_DRAWN\x10\x32\x12\x1a\n\x16\x41TOM_LMK_KILL_OCCURRED\x10\x33\x12)\n%ATOM_PICTURE_IN_PICTURE_STATE_CHANGED\x10\x34\x12*\n&ATOM_WIFI_MULTICAST_LOCK_STATE_CHANGED\x10\x35\x12(\n$ATOM_APP_START_MEMORY_STATE_CAPTURED\x10\x37\x12#\n\x1f\x41TOM_SHUTDOWN_SEQUENCE_REPORTED\x10\x38\x12\x1f\n\x1b\x41TOM_BOOT_SEQUENCE_REPORTED\x10\x39\x12\x1e\n\x1a\x41TOM_OVERLAY_STATE_CHANGED\x10;\x12)\n%ATOM_FOREGROUND_SERVICE_STATE_CHANGED\x10<\x12\x1b\n\x17\x41TOM_CALL_STATE_CHANGED\x10=\x12\x1f\n\x1b\x41TOM_KEYGUARD_STATE_CHANGED\x10>\x12\'\n#ATOM_KEYGUARD_BOUNCER_STATE_CHANGED\x10?\x12*\n&ATOM_KEYGUARD_BOUNCER_PASSWORD_ENTERED\x10@\x12\x11\n\rATOM_APP_DIED\x10\x41\x12\'\n#ATOM_RESOURCE_CONFIGURATION_CHANGED\x10\x42\x12(\n$ATOM_BLUETOOTH_ENABLED_STATE_CHANGED\x10\x43\x12+\n\'ATOM_BLUETOOTH_CONNECTION_STATE_CHANGED\x10\x44\x12#\n\x1f\x41TOM_GPS_SIGNAL_QUALITY_CHANGED\x10\x45\x12$\n ATOM_USB_CONNECTOR_STATE_CHANGED\x10\x46\x12#\n\x1f\x41TOM_SPEAKER_IMPEDANCE_REPORTED\x10G\x12\x18\n\x14\x41TOM_HARDWARE_FAILED\x10H\x12\x1f\n\x1b\x41TOM_PHYSICAL_DROP_DETECTED\x10I\x12\x1f\n\x1b\x41TOM_CHARGE_CYCLES_REPORTED\x10J\x12(\n$ATOM_MOBILE_CONNECTION_STATE_CHANGED\x10K\x12(\n$ATOM_MOBILE_RADIO_TECHNOLOGY_CHANGED\x10L\x12\x1c\n\x18\x41TOM_USB_DEVICE_ATTACHED\x10M\x12\x1b\n\x17\x41TOM_APP_CRASH_OCCURRED\x10N\x12\x15\n\x11\x41TOM_ANR_OCCURRED\x10O\x12\x15\n\x11\x41TOM_WTF_OCCURRED\x10P\x12\x19\n\x15\x41TOM_LOW_MEM_REPORTED\x10Q\x12\x15\n\x11\x41TOM_GENERIC_ATOM\x10R\x12\x1f\n\x1b\x41TOM_VIBRATOR_STATE_CHANGED\x10T\x12$\n ATOM_DEFERRED_JOB_STATS_REPORTED\x10U\x12\x1b\n\x17\x41TOM_THERMAL_THROTTLING\x10V\x12\x1b\n\x17\x41TOM_BIOMETRIC_ACQUIRED\x10W\x12 \n\x1c\x41TOM_BIOMETRIC_AUTHENTICATED\x10X\x12!\n\x1d\x41TOM_BIOMETRIC_ERROR_OCCURRED\x10Y\x12\x1a\n\x16\x41TOM_UI_EVENT_REPORTED\x10Z\x12 \n\x1c\x41TOM_BATTERY_HEALTH_SNAPSHOT\x10[\x12\x10\n\x0c\x41TOM_SLOW_IO\x10\\\x12 \n\x1c\x41TOM_BATTERY_CAUSED_SHUTDOWN\x10]\x12$\n ATOM_PHONE_SERVICE_STATE_CHANGED\x10^\x12\x1c\n\x18\x41TOM_PHONE_STATE_CHANGED\x10_\x12!\n\x1d\x41TOM_USER_RESTRICTION_CHANGED\x10`\x12\x1c\n\x18\x41TOM_SETTINGS_UI_CHANGED\x10\x61\x12#\n\x1f\x41TOM_CONNECTIVITY_STATE_CHANGED\x10\x62\x12\x1e\n\x1a\x41TOM_SERVICE_STATE_CHANGED\x10\x63\x12 \n\x1c\x41TOM_SERVICE_LAUNCH_REPORTED\x10\x64\x12\"\n\x1e\x41TOM_FLAG_FLIP_UPDATE_OCCURRED\x10\x65\x12\"\n\x1e\x41TOM_BINARY_PUSH_STATE_CHANGED\x10\x66\x12\x1c\n\x18\x41TOM_DEVICE_POLICY_EVENT\x10g\x12!\n\x1d\x41TOM_DOCS_UI_FILE_OP_CANCELED\x10h\x12\x30\n,ATOM_DOCS_UI_FILE_OP_COPY_MOVE_MODE_REPORTED\x10i\x12 \n\x1c\x41TOM_DOCS_UI_FILE_OP_FAILURE\x10j\x12!\n\x1d\x41TOM_DOCS_UI_PROVIDER_FILE_OP\x10k\x12.\n*ATOM_DOCS_UI_INVALID_SCOPED_ACCESS_REQUEST\x10l\x12 \n\x1c\x41TOM_DOCS_UI_LAUNCH_REPORTED\x10m\x12\x1d\n\x19\x41TOM_DOCS_UI_ROOT_VISITED\x10n\x12\x1b\n\x17\x41TOM_DOCS_UI_STARTUP_MS\x10o\x12%\n!ATOM_DOCS_UI_USER_ACTION_REPORTED\x10p\x12#\n\x1f\x41TOM_WIFI_ENABLED_STATE_CHANGED\x10q\x12#\n\x1f\x41TOM_WIFI_RUNNING_STATE_CHANGED\x10r\x12\x16\n\x12\x41TOM_APP_COMPACTED\x10s\x12#\n\x1f\x41TOM_NETWORK_DNS_EVENT_REPORTED\x10t\x12.\n*ATOM_DOCS_UI_PICKER_LAUNCHED_FROM_REPORTED\x10u\x12%\n!ATOM_DOCS_UI_PICK_RESULT_REPORTED\x10v\x12%\n!ATOM_DOCS_UI_SEARCH_MODE_REPORTED\x10w\x12%\n!ATOM_DOCS_UI_SEARCH_TYPE_REPORTED\x10x\x12\x19\n\x15\x41TOM_DATA_STALL_EVENT\x10y\x12$\n ATOM_RESCUE_PARTY_RESET_REPORTED\x10z\x12\x1f\n\x1b\x41TOM_SIGNED_CONFIG_REPORTED\x10{\x12\x1f\n\x1b\x41TOM_GNSS_NI_EVENT_REPORTED\x10|\x12.\n*ATOM_BLUETOOTH_LINK_LAYER_CONNECTION_EVENT\x10}\x12/\n+ATOM_BLUETOOTH_ACL_CONNECTION_STATE_CHANGED\x10~\x12/\n+ATOM_BLUETOOTH_SCO_CONNECTION_STATE_CHANGED\x10\x7f\x12\x18\n\x13\x41TOM_APP_DOWNGRADED\x10\x80\x01\x12(\n#ATOM_APP_OPTIMIZED_AFTER_DOWNGRADED\x10\x81\x01\x12#\n\x1e\x41TOM_LOW_STORAGE_STATE_CHANGED\x10\x82\x01\x12(\n#ATOM_GNSS_NFW_NOTIFICATION_REPORTED\x10\x83\x01\x12%\n ATOM_GNSS_CONFIGURATION_REPORTED\x10\x84\x01\x12*\n%ATOM_USB_PORT_OVERHEAT_EVENT_REPORTED\x10\x85\x01\x12\x1c\n\x17\x41TOM_NFC_ERROR_OCCURRED\x10\x86\x01\x12\x1b\n\x16\x41TOM_NFC_STATE_CHANGED\x10\x87\x01\x12\x1b\n\x16\x41TOM_NFC_BEAM_OCCURRED\x10\x88\x01\x12$\n\x1f\x41TOM_NFC_CARDEMULATION_OCCURRED\x10\x89\x01\x12\x1a\n\x15\x41TOM_NFC_TAG_OCCURRED\x10\x8a\x01\x12&\n!ATOM_NFC_HCE_TRANSACTION_OCCURRED\x10\x8b\x01\x12\x1a\n\x15\x41TOM_SE_STATE_CHANGED\x10\x8c\x01\x12\x1b\n\x16\x41TOM_SE_OMAPI_REPORTED\x10\x8d\x01\x12-\n(ATOM_BROADCAST_DISPATCH_LATENCY_REPORTED\x10\x8e\x01\x12\x33\n.ATOM_ATTENTION_MANAGER_SERVICE_RESULT_REPORTED\x10\x8f\x01\x12 \n\x1b\x41TOM_ADB_CONNECTION_CHANGED\x10\x90\x01\x12\"\n\x1d\x41TOM_SPEECH_DSP_STAT_REPORTED\x10\x91\x01\x12\"\n\x1d\x41TOM_USB_CONTAMINANT_REPORTED\x10\x92\x01\x12$\n\x1f\x41TOM_WATCHDOG_ROLLBACK_OCCURRED\x10\x93\x01\x12\x30\n+ATOM_BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED\x10\x94\x01\x12\x1b\n\x16\x41TOM_BUBBLE_UI_CHANGED\x10\x95\x01\x12*\n%ATOM_SCHEDULED_JOB_CONSTRAINT_CHANGED\x10\x96\x01\x12)\n$ATOM_BLUETOOTH_ACTIVE_DEVICE_CHANGED\x10\x97\x01\x12/\n*ATOM_BLUETOOTH_A2DP_PLAYBACK_STATE_CHANGED\x10\x98\x01\x12-\n(ATOM_BLUETOOTH_A2DP_CODEC_CONFIG_CHANGED\x10\x99\x01\x12\x31\n,ATOM_BLUETOOTH_A2DP_CODEC_CAPABILITY_CHANGED\x10\x9a\x01\x12\x30\n+ATOM_BLUETOOTH_A2DP_AUDIO_UNDERRUN_REPORTED\x10\x9b\x01\x12/\n*ATOM_BLUETOOTH_A2DP_AUDIO_OVERRUN_REPORTED\x10\x9c\x01\x12(\n#ATOM_BLUETOOTH_DEVICE_RSSI_REPORTED\x10\x9d\x01\x12:\n5ATOM_BLUETOOTH_DEVICE_FAILED_CONTACT_COUNTER_REPORTED\x10\x9e\x01\x12\x32\n-ATOM_BLUETOOTH_DEVICE_TX_POWER_LEVEL_REPORTED\x10\x9f\x01\x12(\n#ATOM_BLUETOOTH_HCI_TIMEOUT_REPORTED\x10\xa0\x01\x12+\n&ATOM_BLUETOOTH_QUALITY_REPORT_REPORTED\x10\xa1\x01\x12(\n#ATOM_BLUETOOTH_DEVICE_INFO_REPORTED\x10\xa2\x01\x12\x30\n+ATOM_BLUETOOTH_REMOTE_VERSION_INFO_REPORTED\x10\xa3\x01\x12*\n%ATOM_BLUETOOTH_SDP_ATTRIBUTE_REPORTED\x10\xa4\x01\x12&\n!ATOM_BLUETOOTH_BOND_STATE_CHANGED\x10\xa5\x01\x12\x32\n-ATOM_BLUETOOTH_CLASSIC_PAIRING_EVENT_REPORTED\x10\xa6\x01\x12.\n)ATOM_BLUETOOTH_SMP_PAIRING_EVENT_REPORTED\x10\xa7\x01\x12+\n&ATOM_SCREEN_TIMEOUT_EXTENSION_REPORTED\x10\xa8\x01\x12\x1c\n\x17\x41TOM_PROCESS_START_TIME\x10\xa9\x01\x12\x32\n-ATOM_PERMISSION_GRANT_REQUEST_RESULT_REPORTED\x10\xaa\x01\x12\x33\n.ATOM_BLUETOOTH_SOCKET_CONNECTION_STATE_CHANGED\x10\xab\x01\x12)\n$ATOM_DEVICE_IDENTIFIER_ACCESS_DENIED\x10\xac\x01\x12)\n$ATOM_BUBBLE_DEVELOPER_ERROR_REPORTED\x10\xad\x01\x12\'\n\"ATOM_ASSIST_GESTURE_STAGE_REPORTED\x10\xae\x01\x12*\n%ATOM_ASSIST_GESTURE_FEEDBACK_REPORTED\x10\xaf\x01\x12*\n%ATOM_ASSIST_GESTURE_PROGRESS_REPORTED\x10\xb0\x01\x12\"\n\x1d\x41TOM_TOUCH_GESTURE_CLASSIFIED\x10\xb1\x01\x12\x19\n\x14\x41TOM_HIDDEN_API_USED\x10\xb2\x01\x12\x1a\n\x15\x41TOM_STYLE_UI_CHANGED\x10\xb3\x01\x12\'\n\"ATOM_PRIVACY_INDICATORS_INTERACTED\x10\xb4\x01\x12\x32\n-ATOM_APP_INSTALL_ON_EXTERNAL_STORAGE_REPORTED\x10\xb5\x01\x12 \n\x1b\x41TOM_NETWORK_STACK_REPORTED\x10\xb6\x01\x12$\n\x1f\x41TOM_APP_MOVED_STORAGE_REPORTED\x10\xb7\x01\x12\x1c\n\x17\x41TOM_BIOMETRIC_ENROLLED\x10\xb8\x01\x12)\n$ATOM_SYSTEM_SERVER_WATCHDOG_OCCURRED\x10\xb9\x01\x12\x1d\n\x18\x41TOM_TOMB_STONE_OCCURRED\x10\xba\x01\x12,\n\'ATOM_BLUETOOTH_CLASS_OF_DEVICE_REPORTED\x10\xbb\x01\x12%\n ATOM_INTELLIGENCE_EVENT_REPORTED\x10\xbc\x01\x12\x33\n.ATOM_THERMAL_THROTTLING_SEVERITY_STATE_CHANGED\x10\xbd\x01\x12&\n!ATOM_ROLE_REQUEST_RESULT_REPORTED\x10\xbe\x01\x12+\n&ATOM_MEDIAMETRICS_AUDIOPOLICY_REPORTED\x10\xbf\x01\x12+\n&ATOM_MEDIAMETRICS_AUDIORECORD_REPORTED\x10\xc0\x01\x12+\n&ATOM_MEDIAMETRICS_AUDIOTHREAD_REPORTED\x10\xc1\x01\x12*\n%ATOM_MEDIAMETRICS_AUDIOTRACK_REPORTED\x10\xc2\x01\x12%\n ATOM_MEDIAMETRICS_CODEC_REPORTED\x10\xc3\x01\x12,\n\'ATOM_MEDIAMETRICS_DRM_WIDEVINE_REPORTED\x10\xc4\x01\x12)\n$ATOM_MEDIAMETRICS_EXTRACTOR_REPORTED\x10\xc5\x01\x12(\n#ATOM_MEDIAMETRICS_MEDIADRM_REPORTED\x10\xc6\x01\x12(\n#ATOM_MEDIAMETRICS_NUPLAYER_REPORTED\x10\xc7\x01\x12(\n#ATOM_MEDIAMETRICS_RECORDER_REPORTED\x10\xc8\x01\x12*\n%ATOM_MEDIAMETRICS_DRMMANAGER_REPORTED\x10\xc9\x01\x12!\n\x1c\x41TOM_CAR_POWER_STATE_CHANGED\x10\xcb\x01\x12\x1a\n\x15\x41TOM_GARAGE_MODE_INFO\x10\xcc\x01\x12\x1c\n\x17\x41TOM_TEST_ATOM_REPORTED\x10\xcd\x01\x12\x32\n-ATOM_CONTENT_CAPTURE_CALLER_MISMATCH_REPORTED\x10\xce\x01\x12(\n#ATOM_CONTENT_CAPTURE_SERVICE_EVENTS\x10\xcf\x01\x12(\n#ATOM_CONTENT_CAPTURE_SESSION_EVENTS\x10\xd0\x01\x12!\n\x1c\x41TOM_CONTENT_CAPTURE_FLUSHED\x10\xd1\x01\x12-\n(ATOM_LOCATION_MANAGER_API_USAGE_REPORTED\x10\xd2\x01\x12\x35\n0ATOM_REVIEW_PERMISSIONS_FRAGMENT_RESULT_REPORTED\x10\xd3\x01\x12,\n\'ATOM_RUNTIME_PERMISSIONS_UPGRADE_RESULT\x10\xd4\x01\x12\x33\n.ATOM_GRANT_PERMISSIONS_ACTIVITY_BUTTON_ACTIONS\x10\xd5\x01\x12\x33\n.ATOM_LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION\x10\xd6\x01\x12\x31\n,ATOM_APP_PERMISSION_FRAGMENT_ACTION_REPORTED\x10\xd7\x01\x12(\n#ATOM_APP_PERMISSION_FRAGMENT_VIEWED\x10\xd8\x01\x12)\n$ATOM_APP_PERMISSIONS_FRAGMENT_VIEWED\x10\xd9\x01\x12)\n$ATOM_PERMISSION_APPS_FRAGMENT_VIEWED\x10\xda\x01\x12\x1e\n\x19\x41TOM_TEXT_SELECTION_EVENT\x10\xdb\x01\x12\x1c\n\x17\x41TOM_TEXT_LINKIFY_EVENT\x10\xdc\x01\x12$\n\x1f\x41TOM_CONVERSATION_ACTIONS_EVENT\x10\xdd\x01\x12\"\n\x1d\x41TOM_LANGUAGE_DETECTION_EVENT\x10\xde\x01\x12&\n!ATOM_EXCLUSION_RECT_STATE_CHANGED\x10\xdf\x01\x12(\n#ATOM_BACK_GESTURE_REPORTED_REPORTED\x10\xe0\x01\x12/\n*ATOM_UPDATE_ENGINE_UPDATE_ATTEMPT_REPORTED\x10\xe1\x01\x12\x32\n-ATOM_UPDATE_ENGINE_SUCCESSFUL_UPDATE_REPORTED\x10\xe2\x01\x12\x1d\n\x18\x41TOM_CAMERA_ACTION_EVENT\x10\xe3\x01\x12+\n&ATOM_APP_COMPATIBILITY_CHANGE_REPORTED\x10\xe4\x01\x12\x1b\n\x16\x41TOM_PERFETTO_UPLOADED\x10\xe5\x01\x12-\n(ATOM_VMS_CLIENT_CONNECTION_STATE_CHANGED\x10\xe6\x01\x12&\n!ATOM_MEDIA_PROVIDER_SCAN_OCCURRED\x10\xe9\x01\x12\x1f\n\x1a\x41TOM_MEDIA_CONTENT_DELETED\x10\xea\x01\x12-\n(ATOM_MEDIA_PROVIDER_PERMISSION_REQUESTED\x10\xeb\x01\x12\'\n\"ATOM_MEDIA_PROVIDER_SCHEMA_CHANGED\x10\xec\x01\x12\x32\n-ATOM_MEDIA_PROVIDER_IDLE_MAINTENANCE_FINISHED\x10\xed\x01\x12)\n$ATOM_REBOOT_ESCROW_RECOVERY_REPORTED\x10\xee\x01\x12+\n&ATOM_BOOT_TIME_EVENT_DURATION_REPORTED\x10\xef\x01\x12/\n*ATOM_BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED\x10\xf0\x01\x12+\n&ATOM_BOOT_TIME_EVENT_UTC_TIME_REPORTED\x10\xf1\x01\x12-\n(ATOM_BOOT_TIME_EVENT_ERROR_CODE_REPORTED\x10\xf2\x01\x12#\n\x1e\x41TOM_USERSPACE_REBOOT_REPORTED\x10\xf3\x01\x12\x1f\n\x1a\x41TOM_NOTIFICATION_REPORTED\x10\xf4\x01\x12%\n ATOM_NOTIFICATION_PANEL_REPORTED\x10\xf5\x01\x12\'\n\"ATOM_NOTIFICATION_CHANNEL_MODIFIED\x10\xf6\x01\x12)\n$ATOM_INTEGRITY_CHECK_RESULT_REPORTED\x10\xf7\x01\x12 \n\x1b\x41TOM_INTEGRITY_RULES_PUSHED\x10\xf8\x01\x12\x1d\n\x18\x41TOM_CB_MESSAGE_REPORTED\x10\xf9\x01\x12\x1a\n\x15\x41TOM_CB_MESSAGE_ERROR\x10\xfa\x01\x12#\n\x1e\x41TOM_WIFI_HEALTH_STAT_REPORTED\x10\xfb\x01\x12$\n\x1f\x41TOM_WIFI_FAILURE_STAT_REPORTED\x10\xfc\x01\x12)\n$ATOM_WIFI_CONNECTION_RESULT_REPORTED\x10\xfd\x01\x12\x1c\n\x17\x41TOM_APP_FREEZE_CHANGED\x10\xfe\x01\x12!\n\x1c\x41TOM_SNAPSHOT_MERGE_REPORTED\x10\xff\x01\x12\x31\n,ATOM_FOREGROUND_SERVICE_APP_OP_SESSION_ENDED\x10\x80\x02\x12\x1f\n\x1a\x41TOM_DISPLAY_JANK_REPORTED\x10\x81\x02\x12$\n\x1f\x41TOM_APP_STANDBY_BUCKET_CHANGED\x10\x82\x02\x12\x1c\n\x17\x41TOM_SHARESHEET_STARTED\x10\x83\x02\x12\x1a\n\x15\x41TOM_RANKING_SELECTED\x10\x84\x02\x12\"\n\x1d\x41TOM_TVSETTINGS_UI_INTERACTED\x10\x85\x02\x12\x1b\n\x16\x41TOM_LAUNCHER_SNAPSHOT\x10\x86\x02\x12\'\n\"ATOM_PACKAGE_INSTALLER_V2_REPORTED\x10\x87\x02\x12)\n$ATOM_USER_LIFECYCLE_JOURNEY_REPORTED\x10\x88\x02\x12\'\n\"ATOM_USER_LIFECYCLE_EVENT_OCCURRED\x10\x89\x02\x12)\n$ATOM_ACCESSIBILITY_SHORTCUT_REPORTED\x10\x8a\x02\x12(\n#ATOM_ACCESSIBILITY_SERVICE_REPORTED\x10\x8b\x02\x12(\n#ATOM_DOCS_UI_DRAG_AND_DROP_REPORTED\x10\x8c\x02\x12\"\n\x1d\x41TOM_APP_USAGE_EVENT_OCCURRED\x10\x8d\x02\x12*\n%ATOM_AUTO_REVOKE_NOTIFICATION_CLICKED\x10\x8e\x02\x12)\n$ATOM_AUTO_REVOKE_FRAGMENT_APP_VIEWED\x10\x8f\x02\x12&\n!ATOM_AUTO_REVOKED_APP_INTERACTION\x10\x90\x02\x12;\n6ATOM_APP_PERMISSION_GROUPS_FRAGMENT_AUTO_REVOKE_ACTION\x10\x91\x02\x12\"\n\x1d\x41TOM_EVS_USAGE_STATS_REPORTED\x10\x92\x02\x12)\n$ATOM_AUDIO_POWER_USAGE_DATA_REPORTED\x10\x93\x02\x12 \n\x1b\x41TOM_TV_TUNER_STATE_CHANGED\x10\x94\x02\x12(\n#ATOM_MEDIAOUTPUT_OP_SWITCH_REPORTED\x10\x95\x02\x12\x1d\n\x18\x41TOM_CB_MESSAGE_FILTERED\x10\x96\x02\x12\x1d\n\x18\x41TOM_TV_TUNER_DVR_STATUS\x10\x97\x02\x12$\n\x1f\x41TOM_TV_CAS_SESSION_OPEN_STATUS\x10\x98\x02\x12\'\n\"ATOM_ASSISTANT_INVOCATION_REPORTED\x10\x99\x02\x12\x1f\n\x1a\x41TOM_DISPLAY_WAKE_REPORTED\x10\x9a\x02\x12\x33\n.ATOM_CAR_USER_HAL_MODIFY_USER_REQUEST_REPORTED\x10\x9b\x02\x12\x34\n/ATOM_CAR_USER_HAL_MODIFY_USER_RESPONSE_REPORTED\x10\x9c\x02\x12\x34\n/ATOM_CAR_USER_HAL_POST_SWITCH_RESPONSE_REPORTED\x10\x9d\x02\x12\x39\n4ATOM_CAR_USER_HAL_INITIAL_USER_INFO_REQUEST_REPORTED\x10\x9e\x02\x12:\n5ATOM_CAR_USER_HAL_INITIAL_USER_INFO_RESPONSE_REPORTED\x10\x9f\x02\x12\x38\n3ATOM_CAR_USER_HAL_USER_ASSOCIATION_REQUEST_REPORTED\x10\xa0\x02\x12=\n8ATOM_CAR_USER_HAL_SET_USER_ASSOCIATION_RESPONSE_REPORTED\x10\xa1\x02\x12*\n%ATOM_NETWORK_IP_PROVISIONING_REPORTED\x10\xa2\x02\x12%\n ATOM_NETWORK_DHCP_RENEW_REPORTED\x10\xa3\x02\x12%\n ATOM_NETWORK_VALIDATION_REPORTED\x10\xa4\x02\x12&\n!ATOM_NETWORK_STACK_QUIRK_REPORTED\x10\xa5\x02\x12\x36\n1ATOM_MEDIAMETRICS_AUDIORECORDDEVICEUSAGE_REPORTED\x10\xa6\x02\x12\x36\n1ATOM_MEDIAMETRICS_AUDIOTHREADDEVICEUSAGE_REPORTED\x10\xa7\x02\x12\x35\n0ATOM_MEDIAMETRICS_AUDIOTRACKDEVICEUSAGE_REPORTED\x10\xa8\x02\x12\x35\n0ATOM_MEDIAMETRICS_AUDIODEVICECONNECTION_REPORTED\x10\xa9\x02\x12\x18\n\x13\x41TOM_BLOB_COMMITTED\x10\xaa\x02\x12\x15\n\x10\x41TOM_BLOB_LEASED\x10\xab\x02\x12\x15\n\x10\x41TOM_BLOB_OPENED\x10\xac\x02\x12+\n&ATOM_CONTACTS_PROVIDER_STATUS_REPORTED\x10\xad\x02\x12%\n ATOM_KEYSTORE_KEY_EVENT_REPORTED\x10\xae\x02\x12$\n\x1f\x41TOM_NETWORK_TETHERING_REPORTED\x10\xaf\x02\x12\x1c\n\x17\x41TOM_IME_TOUCH_REPORTED\x10\xb0\x02\x12,\n\'ATOM_UI_INTERACTION_FRAME_INFO_REPORTED\x10\xb1\x02\x12$\n\x1f\x41TOM_UI_ACTION_LATENCY_REPORTED\x10\xb2\x02\x12\"\n\x1d\x41TOM_WIFI_DISCONNECT_REPORTED\x10\xb3\x02\x12\'\n\"ATOM_WIFI_CONNECTION_STATE_CHANGED\x10\xb4\x02\x12(\n#ATOM_HDMI_CEC_ACTIVE_SOURCE_CHANGED\x10\xb5\x02\x12#\n\x1e\x41TOM_HDMI_CEC_MESSAGE_REPORTED\x10\xb6\x02\x12\x17\n\x12\x41TOM_AIRPLANE_MODE\x10\xb7\x02\x12\x17\n\x12\x41TOM_MODEM_RESTART\x10\xb8\x02\x12&\n!ATOM_CARRIER_ID_MISMATCH_REPORTED\x10\xb9\x02\x12\"\n\x1d\x41TOM_CARRIER_ID_TABLE_UPDATED\x10\xba\x02\x12&\n!ATOM_DATA_STALL_RECOVERY_REPORTED\x10\xbb\x02\x12+\n&ATOM_MEDIAMETRICS_MEDIAPARSER_REPORTED\x10\xbc\x02\x12 \n\x1b\x41TOM_TLS_HANDSHAKE_REPORTED\x10\xbd\x02\x12,\n\'ATOM_TEXT_CLASSIFIER_API_USAGE_REPORTED\x10\xbe\x02\x12*\n%ATOM_CAR_WATCHDOG_KILL_STATS_REPORTED\x10\xbf\x02\x12(\n#ATOM_MEDIAMETRICS_PLAYBACK_REPORTED\x10\xc0\x02\x12$\n\x1f\x41TOM_MEDIA_NETWORK_INFO_CHANGED\x10\xc1\x02\x12&\n!ATOM_MEDIA_PLAYBACK_STATE_CHANGED\x10\xc2\x02\x12\'\n\"ATOM_MEDIA_PLAYBACK_ERROR_REPORTED\x10\xc3\x02\x12&\n!ATOM_MEDIA_PLAYBACK_TRACK_CHANGED\x10\xc4\x02\x12\x1c\n\x17\x41TOM_WIFI_SCAN_REPORTED\x10\xc5\x02\x12 \n\x1b\x41TOM_WIFI_PNO_SCAN_REPORTED\x10\xc6\x02\x12\x1a\n\x15\x41TOM_TIF_TUNE_CHANGED\x10\xc7\x02\x12\x1e\n\x19\x41TOM_AUTO_ROTATE_REPORTED\x10\xc8\x02\x12\x1a\n\x15\x41TOM_PERFETTO_TRIGGER\x10\xc9\x02\x12\x1a\n\x15\x41TOM_TRANSCODING_DATA\x10\xca\x02\x12)\n$ATOM_IMS_SERVICE_ENTITLEMENT_UPDATED\x10\xcb\x02\x12\x18\n\x13\x41TOM_DEVICE_ROTATED\x10\xcd\x02\x12(\n#ATOM_SIM_SPECIFIC_SETTINGS_RESTORED\x10\xce\x02\x12+\n&ATOM_TEXT_CLASSIFIER_DOWNLOAD_REPORTED\x10\xcf\x02\x12\x1b\n\x16\x41TOM_PIN_STORAGE_EVENT\x10\xd0\x02\x12\x1c\n\x17\x41TOM_FACE_DOWN_REPORTED\x10\xd1\x02\x12-\n(ATOM_BLUETOOTH_HAL_CRASH_REASON_REPORTED\x10\xd2\x02\x12,\n\'ATOM_REBOOT_ESCROW_PREPARATION_REPORTED\x10\xd3\x02\x12-\n(ATOM_REBOOT_ESCROW_LSKF_CAPTURE_REPORTED\x10\xd4\x02\x12\'\n\"ATOM_REBOOT_ESCROW_REBOOT_REPORTED\x10\xd5\x02\x12!\n\x1c\x41TOM_BINDER_LATENCY_REPORTED\x10\xd6\x02\x12,\n\'ATOM_MEDIAMETRICS_AAUDIOSTREAM_REPORTED\x10\xd7\x02\x12)\n$ATOM_MEDIA_TRANSCODING_SESSION_ENDED\x10\xd8\x02\x12&\n!ATOM_MAGNIFICATION_USAGE_REPORTED\x10\xd9\x02\x12\x31\n,ATOM_MAGNIFICATION_MODE_WITH_IME_ON_REPORTED\x10\xda\x02\x12(\n#ATOM_APP_SEARCH_CALL_STATS_REPORTED\x10\xdb\x02\x12\x30\n+ATOM_APP_SEARCH_PUT_DOCUMENT_STATS_REPORTED\x10\xdc\x02\x12 \n\x1b\x41TOM_DEVICE_CONTROL_CHANGED\x10\xdd\x02\x12\x1e\n\x19\x41TOM_DEVICE_STATE_CHANGED\x10\xde\x02\x12 \n\x1b\x41TOM_INPUTDEVICE_REGISTERED\x10\xdf\x02\x12\"\n\x1d\x41TOM_SMARTSPACE_CARD_REPORTED\x10\xe0\x02\x12*\n%ATOM_AUTH_PROMPT_AUTHENTICATE_INVOKED\x10\xe1\x02\x12/\n*ATOM_AUTH_MANAGER_CAN_AUTHENTICATE_INVOKED\x10\xe2\x02\x12$\n\x1f\x41TOM_AUTH_ENROLL_ACTION_INVOKED\x10\xe3\x02\x12\"\n\x1d\x41TOM_AUTH_DEPRECATED_API_USED\x10\xe4\x02\x12$\n\x1f\x41TOM_UNATTENDED_REBOOT_OCCURRED\x10\xe5\x02\x12\'\n\"ATOM_LONG_REBOOT_BLOCKING_REPORTED\x10\xe6\x02\x12\x33\n.ATOM_LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED\x10\xe7\x02\x12 \n\x1b\x41TOM_FDTRACK_EVENT_OCCURRED\x10\xec\x02\x12(\n#ATOM_TIMEOUT_AUTO_EXTENDED_REPORTED\x10\xed\x02\x12\x1f\n\x1a\x41TOM_ALARM_BATCH_DELIVERED\x10\xef\x02\x12\x19\n\x14\x41TOM_ALARM_SCHEDULED\x10\xf0\x02\x12\x30\n+ATOM_CAR_WATCHDOG_IO_OVERUSE_STATS_REPORTED\x10\xf1\x02\x12.\n)ATOM_USER_LEVEL_HIBERNATION_STATE_CHANGED\x10\xf2\x02\x12.\n)ATOM_APP_SEARCH_INITIALIZE_STATS_REPORTED\x10\xf3\x02\x12)\n$ATOM_APP_SEARCH_QUERY_STATS_REPORTED\x10\xf4\x02\x12\x1a\n\x15\x41TOM_APP_PROCESS_DIED\x10\xf5\x02\x12\x32\n-ATOM_NETWORK_IP_REACHABILITY_MONITOR_REPORTED\x10\xf6\x02\x12#\n\x1e\x41TOM_SLOW_INPUT_EVENT_REPORTED\x10\xf7\x02\x12)\n$ATOM_ANR_OCCURRED_PROCESSING_STARTED\x10\xf8\x02\x12*\n%ATOM_APP_SEARCH_REMOVE_STATS_REPORTED\x10\xf9\x02\x12\x1e\n\x19\x41TOM_MEDIA_CODEC_REPORTED\x10\xfa\x02\x12/\n*ATOM_PERMISSION_USAGE_FRAGMENT_INTERACTION\x10\xfb\x02\x12(\n#ATOM_PERMISSION_DETAILS_INTERACTION\x10\xfc\x02\x12+\n&ATOM_PRIVACY_SENSOR_TOGGLE_INTERACTION\x10\xfd\x02\x12+\n&ATOM_PRIVACY_TOGGLE_DIALOG_INTERACTION\x10\xfe\x02\x12,\n\'ATOM_APP_SEARCH_OPTIMIZE_STATS_REPORTED\x10\xff\x02\x12.\n)ATOM_NON_A11Y_TOOL_SERVICE_WARNING_REPORT\x10\x80\x03\x12\"\n\x1d\x41TOM_APP_COMPAT_STATE_CHANGED\x10\x82\x03\x12\x33\n.ATOM_SIZE_COMPAT_RESTART_BUTTON_EVENT_REPORTED\x10\x83\x03\x12 \n\x1b\x41TOM_SPLITSCREEN_UI_CHANGED\x10\x84\x03\x12(\n#ATOM_NETWORK_DNS_HANDSHAKE_REPORTED\x10\x85\x03\x12%\n ATOM_BLUETOOTH_CODE_PATH_COUNTER\x10\x86\x03\x12.\n)ATOM_BLUETOOTH_LE_BATCH_SCAN_REPORT_DELAY\x10\x88\x03\x12\x30\n+ATOM_ACCESSIBILITY_FLOATING_MENU_UI_CHANGED\x10\x89\x03\x12.\n)ATOM_NEURALNETWORKS_COMPILATION_COMPLETED\x10\x8a\x03\x12,\n\'ATOM_NEURALNETWORKS_EXECUTION_COMPLETED\x10\x8b\x03\x12+\n&ATOM_NEURALNETWORKS_COMPILATION_FAILED\x10\x8c\x03\x12)\n$ATOM_NEURALNETWORKS_EXECUTION_FAILED\x10\x8d\x03\x12\x1c\n\x17\x41TOM_CONTEXT_HUB_BOOTED\x10\x8e\x03\x12\x1f\n\x1a\x41TOM_CONTEXT_HUB_RESTARTED\x10\x8f\x03\x12\x36\n1ATOM_CONTEXT_HUB_LOADED_NANOAPP_SNAPSHOT_REPORTED\x10\x90\x03\x12\'\n\"ATOM_CHRE_CODE_DOWNLOAD_TRANSACTED\x10\x91\x03\x12\x1c\n\x17\x41TOM_UWB_SESSION_INITED\x10\x92\x03\x12\x1c\n\x17\x41TOM_UWB_SESSION_CLOSED\x10\x93\x03\x12$\n\x1f\x41TOM_UWB_FIRST_RANGING_RECEIVED\x10\x94\x03\x12*\n%ATOM_UWB_RANGING_MEASUREMENT_RECEIVED\x10\x95\x03\x12\x31\n,ATOM_TEXT_CLASSIFIER_DOWNLOAD_WORK_SCHEDULED\x10\x96\x03\x12\x31\n,ATOM_TEXT_CLASSIFIER_DOWNLOAD_WORK_COMPLETED\x10\x97\x03\x12\x1b\n\x16\x41TOM_CLIPBOARD_CLEARED\x10\x98\x03\x12\x1f\n\x1a\x41TOM_VM_CREATION_REQUESTED\x10\x99\x03\x12*\n%ATOM_NEARBY_DEVICE_SCAN_STATE_CHANGED\x10\x9a\x03\x12%\n ATOM_APPLICATION_LOCALES_CHANGED\x10\x9c\x03\x12\x30\n+ATOM_MEDIAMETRICS_AUDIOTRACKSTATUS_REPORTED\x10\x9d\x03\x12&\n!ATOM_FOLD_STATE_DURATION_REPORTED\x10\x9e\x03\x12>\n9ATOM_LOCATION_TIME_ZONE_PROVIDER_CONTROLLER_STATE_CHANGED\x10\x9f\x03\x12#\n\x1e\x41TOM_DISPLAY_HBM_STATE_CHANGED\x10\xa0\x03\x12(\n#ATOM_DISPLAY_HBM_BRIGHTNESS_CHANGED\x10\xa1\x03\x12,\n\'ATOM_PERSISTENT_URI_PERMISSIONS_FLUSHED\x10\xa2\x03\x12\x35\n0ATOM_EARLY_BOOT_COMP_OS_ARTIFACTS_CHECK_REPORTED\x10\xa3\x03\x12 \n\x1b\x41TOM_VBMETA_DIGEST_REPORTED\x10\xa4\x03\x12\x1c\n\x17\x41TOM_APEX_INFO_GATHERED\x10\xa5\x03\x12\x1b\n\x16\x41TOM_PVM_INFO_GATHERED\x10\xa6\x03\x12%\n ATOM_WEAR_SETTINGS_UI_INTERACTED\x10\xa7\x03\x12&\n!ATOM_TRACING_SERVICE_REPORT_EVENT\x10\xa8\x03\x12\x31\n,ATOM_MEDIAMETRICS_AUDIORECORDSTATUS_REPORTED\x10\xa9\x03\x12\x1a\n\x15\x41TOM_LAUNCHER_LATENCY\x10\xaa\x03\x12\x1f\n\x1a\x41TOM_DROPBOX_ENTRY_DROPPED\x10\xab\x03\x12&\n!ATOM_WIFI_P2P_CONNECTION_REPORTED\x10\xac\x03\x12\x1c\n\x17\x41TOM_GAME_STATE_CHANGED\x10\xad\x03\x12+\n&ATOM_HOTWORD_DETECTOR_CREATE_REQUESTED\x10\xae\x03\x12\x38\n3ATOM_HOTWORD_DETECTION_SERVICE_INIT_RESULT_REPORTED\x10\xaf\x03\x12-\n(ATOM_HOTWORD_DETECTION_SERVICE_RESTARTED\x10\xb0\x03\x12.\n)ATOM_HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED\x10\xb1\x03\x12!\n\x1c\x41TOM_HOTWORD_DETECTOR_EVENTS\x10\xb2\x03\x12>\n9ATOM_BOOT_COMPLETED_BROADCAST_COMPLETION_LATENCY_REPORTED\x10\xb5\x03\x12\x30\n+ATOM_CONTACTS_INDEXER_UPDATE_STATS_REPORTED\x10\xb8\x03\x12*\n%ATOM_APP_BACKGROUND_RESTRICTIONS_INFO\x10\xb9\x03\x12/\n*ATOM_MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED\x10\xba\x03\x12\x33\n.ATOM_MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED\x10\xbb\x03\x12\x35\n0ATOM_PERMISSION_REMINDER_NOTIFICATION_INTERACTED\x10\xbc\x03\x12\x30\n+ATOM_RECENT_PERMISSION_DECISIONS_INTERACTED\x10\xbd\x03\x12%\n ATOM_GNSS_PSDS_DOWNLOAD_REPORTED\x10\xbe\x03\x12.\n)ATOM_LE_AUDIO_CONNECTION_SESSION_REPORTED\x10\xbf\x03\x12-\n(ATOM_LE_AUDIO_BROADCAST_SESSION_REPORTED\x10\xc0\x03\x12!\n\x1c\x41TOM_DREAM_UI_EVENT_REPORTED\x10\xc1\x03\x12%\n ATOM_TASK_MANAGER_EVENT_REPORTED\x10\xc2\x03\x12 \n\x1b\x41TOM_CDM_ASSOCIATION_ACTION\x10\xc3\x03\x12\x46\nAATOM_MAGNIFICATION_TRIPLE_TAP_AND_HOLD_ACTIVATED_SESSION_REPORTED\x10\xc4\x03\x12\x46\nAATOM_MAGNIFICATION_FOLLOW_TYPING_FOCUS_ACTIVATED_SESSION_REPORTED\x10\xc5\x03\x12\x34\n/ATOM_ACCESSIBILITY_TEXT_READING_OPTIONS_CHANGED\x10\xc6\x03\x12+\n&ATOM_WIFI_SETUP_FAILURE_CRASH_REPORTED\x10\xc7\x03\x12#\n\x1e\x41TOM_UWB_DEVICE_ERROR_REPORTED\x10\xc8\x03\x12(\n#ATOM_ISOLATED_COMPILATION_SCHEDULED\x10\xc9\x03\x12$\n\x1f\x41TOM_ISOLATED_COMPILATION_ENDED\x10\xca\x03\x12\x36\n1ATOM_ONS_OPPORTUNISTIC_ESIM_PROVISIONING_COMPLETE\x10\xcb\x03\x12-\n(ATOM_SYSTEM_SERVER_PRE_WATCHDOG_OCCURRED\x10\xcc\x03\x12$\n\x1f\x41TOM_TELEPHONY_ANOMALY_DETECTED\x10\xcd\x03\x12$\n\x1f\x41TOM_LETTERBOX_POSITION_CHANGED\x10\xce\x03\x12)\n$ATOM_REMOTE_KEY_PROVISIONING_ATTEMPT\x10\xcf\x03\x12.\n)ATOM_REMOTE_KEY_PROVISIONING_NETWORK_INFO\x10\xd0\x03\x12(\n#ATOM_REMOTE_KEY_PROVISIONING_TIMING\x10\xd1\x03\x12+\n&ATOM_MEDIAOUTPUT_OP_INTERACTION_REPORT\x10\xd2\x03\x12!\n\x1c\x41TOM_SYNC_EXEMPTION_OCCURRED\x10\xd4\x03\x12.\n)ATOM_AUTOFILL_PRESENTATION_EVENT_REPORTED\x10\xd5\x03\x12\x1c\n\x17\x41TOM_DOCK_STATE_CHANGED\x10\xd6\x03\x12\'\n\"ATOM_SAFETY_SOURCE_STATE_COLLECTED\x10\xd7\x03\x12-\n(ATOM_SAFETY_CENTER_SYSTEM_EVENT_REPORTED\x10\xd8\x03\x12,\n\'ATOM_SAFETY_CENTER_INTERACTION_REPORTED\x10\xd9\x03\x12+\n&ATOM_SETTINGS_PROVIDER_SETTING_CHANGED\x10\xda\x03\x12+\n&ATOM_BROADCAST_DELIVERY_EVENT_REPORTED\x10\xdb\x03\x12(\n#ATOM_SERVICE_REQUEST_EVENT_REPORTED\x10\xdc\x03\x12-\n(ATOM_PROVIDER_ACQUISITION_EVENT_REPORTED\x10\xdd\x03\x12(\n#ATOM_BLUETOOTH_DEVICE_NAME_REPORTED\x10\xde\x03\x12\x1b\n\x16\x41TOM_CB_CONFIG_UPDATED\x10\xdf\x03\x12\"\n\x1d\x41TOM_CB_MODULE_ERROR_REPORTED\x10\xe0\x03\x12$\n\x1f\x41TOM_CB_SERVICE_FEATURE_CHANGED\x10\xe1\x03\x12%\n ATOM_CB_RECEIVER_FEATURE_CHANGED\x10\xe2\x03\x12\x31\n,ATOM_PRIVACY_SIGNAL_NOTIFICATION_INTERACTION\x10\xe4\x03\x12/\n*ATOM_PRIVACY_SIGNAL_ISSUE_CARD_INTERACTION\x10\xe5\x03\x12%\n ATOM_PRIVACY_SIGNALS_JOB_FAILURE\x10\xe6\x03\x12\x1c\n\x17\x41TOM_VIBRATION_REPORTED\x10\xe7\x03\x12\x1b\n\x16\x41TOM_UWB_RANGING_START\x10\xe9\x03\x12\x1a\n\x15\x41TOM_APP_COMPACTED_V2\x10\xeb\x03\x12$\n\x1f\x41TOM_DISPLAY_BRIGHTNESS_CHANGED\x10\xee\x03\x12!\n\x1c\x41TOM_ACTIVITY_ACTION_BLOCKED\x10\xef\x03\x12-\n(ATOM_NETWORK_DNS_SERVER_SUPPORT_REPORTED\x10\xf8\x03\x12\x13\n\x0e\x41TOM_VM_BOOTED\x10\xf9\x03\x12\x13\n\x0e\x41TOM_VM_EXITED\x10\xfa\x03\x12+\n&ATOM_AMBIENT_BRIGHTNESS_STATS_REPORTED\x10\xfb\x03\x12\x37\n2ATOM_MEDIAMETRICS_SPATIALIZERCAPABILITIES_REPORTED\x10\xfc\x03\x12\x38\n3ATOM_MEDIAMETRICS_SPATIALIZERDEVICEENABLED_REPORTED\x10\xfd\x03\x12\x38\n3ATOM_MEDIAMETRICS_HEADTRACKERDEVICEENABLED_REPORTED\x10\xfe\x03\x12:\n5ATOM_MEDIAMETRICS_HEADTRACKERDEVICESUPPORTED_REPORTED\x10\xff\x03\x12#\n\x1e\x41TOM_HEARING_AID_INFO_REPORTED\x10\x81\x04\x12,\n\'ATOM_DEVICE_WIDE_JOB_CONSTRAINT_CHANGED\x10\x82\x04\x12\x1e\n\x19\x41TOM_AMBIENT_MODE_CHANGED\x10\x83\x04\x12\x1e\n\x19\x41TOM_ANR_LATENCY_REPORTED\x10\x84\x04\x12\x1b\n\x16\x41TOM_RESOURCE_API_INFO\x10\x85\x04\x12(\n#ATOM_SYSTEM_DEFAULT_NETWORK_CHANGED\x10\x86\x04\x12/\n*ATOM_IWLAN_SETUP_DATA_CALL_RESULT_REPORTED\x10\x87\x04\x12\x30\n+ATOM_IWLAN_PDN_DISCONNECTED_REASON_REPORTED\x10\x88\x04\x12(\n#ATOM_AIRPLANE_MODE_SESSION_REPORTED\x10\x89\x04\x12 \n\x1b\x41TOM_VM_CPU_STATUS_REPORTED\x10\x8a\x04\x12 \n\x1b\x41TOM_VM_MEM_STATUS_REPORTED\x10\x8b\x04\x12/\n*ATOM_PACKAGE_INSTALLATION_SESSION_REPORTED\x10\x8c\x04\x12&\n!ATOM_DEFAULT_NETWORK_REMATCH_INFO\x10\x8d\x04\x12\'\n\"ATOM_NETWORK_SELECTION_PERFORMANCE\x10\x8e\x04\x12\x1e\n\x19\x41TOM_NETWORK_NSD_REPORTED\x10\x8f\x04\x12\x31\n,ATOM_BLUETOOTH_DISCONNECTION_REASON_REPORTED\x10\x91\x04\x12+\n&ATOM_BLUETOOTH_LOCAL_VERSIONS_REPORTED\x10\x92\x04\x12\x36\n1ATOM_BLUETOOTH_REMOTE_SUPPORTED_FEATURES_REPORTED\x10\x93\x04\x12\x35\n0ATOM_BLUETOOTH_LOCAL_SUPPORTED_FEATURES_REPORTED\x10\x94\x04\x12!\n\x1c\x41TOM_BLUETOOTH_GATT_APP_INFO\x10\x95\x04\x12*\n%ATOM_BRIGHTNESS_CONFIGURATION_UPDATED\x10\x96\x04\x12-\n(ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_LAUNCHED\x10\x9a\x04\x12-\n(ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_FINISHED\x10\x9b\x04\x12\x38\n3ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_CONNECTION_REPORTED\x10\x9c\x04\x12:\n5ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_DEVICE_SCAN_TRIGGERED\x10\x9d\x04\x12>\n9ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_FIRST_DEVICE_SCAN_LATENCY\x10\x9e\x04\x12;\n6ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_CONNECT_DEVICE_LATENCY\x10\x9f\x04\x12+\n&ATOM_PACKAGE_MANAGER_SNAPSHOT_REPORTED\x10\xa0\x04\x12:\n5ATOM_PACKAGE_MANAGER_APPS_FILTER_CACHE_BUILD_REPORTED\x10\xa1\x04\x12;\n6ATOM_PACKAGE_MANAGER_APPS_FILTER_CACHE_UPDATE_REPORTED\x10\xa2\x04\x12#\n\x1e\x41TOM_LAUNCHER_IMPRESSION_EVENT\x10\xa3\x04\x12=\n8ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_ALL_DEVICES_SCAN_LATENCY\x10\xa5\x04\x12\x1e\n\x19\x41TOM_WS_WATCH_FACE_EDITED\x10\xa7\x04\x12\x30\n+ATOM_WS_WATCH_FACE_FAVORITE_ACTION_REPORTED\x10\xa8\x04\x12+\n&ATOM_WS_WATCH_FACE_SET_ACTION_REPORTED\x10\xa9\x04\x12)\n$ATOM_PACKAGE_UNINSTALLATION_REPORTED\x10\xaa\x04\x12\x1b\n\x16\x41TOM_GAME_MODE_CHANGED\x10\xab\x04\x12)\n$ATOM_GAME_MODE_CONFIGURATION_CHANGED\x10\xac\x04\x12$\n\x1f\x41TOM_BEDTIME_MODE_STATE_CHANGED\x10\xad\x04\x12%\n ATOM_NETWORK_SLICE_SESSION_ENDED\x10\xae\x04\x12\x31\n,ATOM_NETWORK_SLICE_DAILY_DATA_USAGE_REPORTED\x10\xaf\x04\x12\x1f\n\x1a\x41TOM_NFC_TAG_TYPE_OCCURRED\x10\xb0\x04\x12#\n\x1e\x41TOM_NFC_AID_CONFLICT_OCCURRED\x10\xb1\x04\x12&\n!ATOM_NFC_READER_CONFLICT_OCCURRED\x10\xb2\x04\x12\x1e\n\x19\x41TOM_WS_TILE_LIST_CHANGED\x10\xb3\x04\x12.\n)ATOM_GET_TYPE_ACCESSED_WITHOUT_PERMISSION\x10\xb4\x04\x12*\n%ATOM_MOBILE_BUNDLED_APP_INFO_GATHERED\x10\xb6\x04\x12\x30\n+ATOM_WS_WATCH_FACE_COMPLICATION_SET_CHANGED\x10\xb7\x04\x12\x1b\n\x16\x41TOM_MEDIA_DRM_CREATED\x10\xb8\x04\x12\x1b\n\x16\x41TOM_MEDIA_DRM_ERRORED\x10\xb9\x04\x12\"\n\x1d\x41TOM_MEDIA_DRM_SESSION_OPENED\x10\xba\x04\x12\"\n\x1d\x41TOM_MEDIA_DRM_SESSION_CLOSED\x10\xbb\x04\x12\"\n\x1d\x41TOM_USER_SELECTED_RESOLUTION\x10\xbc\x04\x12&\n!ATOM_UNSAFE_INTENT_EVENT_REPORTED\x10\xbd\x04\x12+\n&ATOM_PERFORMANCE_HINT_SESSION_REPORTED\x10\xbe\x04\x12\x31\n,ATOM_MEDIAMETRICS_MIDI_DEVICE_CLOSE_REPORTED\x10\xc0\x04\x12\"\n\x1d\x41TOM_BIOMETRIC_TOUCH_REPORTED\x10\xc1\x04\x12-\n(ATOM_HOTWORD_AUDIO_EGRESS_EVENT_REPORTED\x10\xc2\x04\x12(\n#ATOM_LOCATION_ENABLED_STATE_CHANGED\x10\xc4\x04\x12\x1e\n\x19\x41TOM_IME_REQUEST_FINISHED\x10\xc5\x04\x12*\n%ATOM_USB_COMPLIANCE_WARNINGS_REPORTED\x10\xc6\x04\x12\'\n\"ATOM_APP_SUPPORTED_LOCALES_CHANGED\x10\xc7\x04\x12\x31\n,ATOM_MEDIA_PROVIDER_VOLUME_RECOVERY_REPORTED\x10\xca\x04\x12(\n#ATOM_BIOMETRIC_PROPERTIES_COLLECTED\x10\xcb\x04\x12\"\n\x1d\x41TOM_KERNEL_WAKEUP_ATTRIBUTED\x10\xcc\x04\x12!\n\x1c\x41TOM_SCREEN_STATE_CHANGED_V2\x10\xcd\x04\x12#\n\x1e\x41TOM_WS_BACKUP_ACTION_REPORTED\x10\xce\x04\x12$\n\x1f\x41TOM_WS_RESTORE_ACTION_REPORTED\x10\xcf\x04\x12*\n%ATOM_DEVICE_LOG_ACCESS_EVENT_REPORTED\x10\xd0\x04\x12\x1f\n\x1a\x41TOM_MEDIA_SESSION_UPDATED\x10\xd2\x04\x12!\n\x1c\x41TOM_WEAR_OOBE_STATE_CHANGED\x10\xd3\x04\x12!\n\x1c\x41TOM_WS_NOTIFICATION_UPDATED\x10\xd4\x04\x12\x39\n4ATOM_NETWORK_VALIDATION_FAILURE_STATS_DAILY_REPORTED\x10\xd9\x04\x12 \n\x1b\x41TOM_WS_COMPLICATION_TAPPED\x10\xda\x04\x12\"\n\x1d\x41TOM_WS_NOTIFICATION_BLOCKING\x10\x8c\x06\x12,\n\'ATOM_WS_NOTIFICATION_BRIDGEMODE_UPDATED\x10\xb6\x06\x12,\n\'ATOM_WS_NOTIFICATION_DISMISSAL_ACTIONED\x10\xb7\x06\x12\"\n\x1d\x41TOM_WS_NOTIFICATION_ACTIONED\x10\xb8\x06\x12!\n\x1c\x41TOM_WS_NOTIFICATION_LATENCY\x10\xf0\x06\x12\x1d\n\x18\x41TOM_WIFI_BYTES_TRANSFER\x10\x90N\x12&\n!ATOM_WIFI_BYTES_TRANSFER_BY_FG_BG\x10\x91N\x12\x1f\n\x1a\x41TOM_MOBILE_BYTES_TRANSFER\x10\x92N\x12(\n#ATOM_MOBILE_BYTES_TRANSFER_BY_FG_BG\x10\x93N\x12\"\n\x1d\x41TOM_BLUETOOTH_BYTES_TRANSFER\x10\x96N\x12\x19\n\x14\x41TOM_KERNEL_WAKELOCK\x10\x94N\x12\x1f\n\x1a\x41TOM_SUBSYSTEM_SLEEP_STATE\x10\x95N\x12\x1a\n\x15\x41TOM_CPU_TIME_PER_UID\x10\x99N\x12\x1f\n\x1a\x41TOM_CPU_TIME_PER_UID_FREQ\x10\x9aN\x12\x1c\n\x17\x41TOM_WIFI_ACTIVITY_INFO\x10\x9bN\x12\x1d\n\x18\x41TOM_MODEM_ACTIVITY_INFO\x10\x9cN\x12!\n\x1c\x41TOM_BLUETOOTH_ACTIVITY_INFO\x10\x97N\x12\x1e\n\x19\x41TOM_PROCESS_MEMORY_STATE\x10\x9dN\x12!\n\x1c\x41TOM_SYSTEM_ELAPSED_REALTIME\x10\x9eN\x12\x17\n\x12\x41TOM_SYSTEM_UPTIME\x10\x9fN\x12\x19\n\x14\x41TOM_CPU_ACTIVE_TIME\x10\xa0N\x12\x1a\n\x15\x41TOM_CPU_CLUSTER_TIME\x10\xa1N\x12\x14\n\x0f\x41TOM_DISK_SPACE\x10\xa2N\x12$\n\x1f\x41TOM_REMAINING_BATTERY_CAPACITY\x10\xa3N\x12\x1f\n\x1a\x41TOM_FULL_BATTERY_CAPACITY\x10\xa4N\x12\x15\n\x10\x41TOM_TEMPERATURE\x10\xa5N\x12\x16\n\x11\x41TOM_BINDER_CALLS\x10\xa6N\x12!\n\x1c\x41TOM_BINDER_CALLS_EXCEPTIONS\x10\xa7N\x12\x16\n\x11\x41TOM_LOOPER_STATS\x10\xa8N\x12\x14\n\x0f\x41TOM_DISK_STATS\x10\xa9N\x12\x19\n\x14\x41TOM_DIRECTORY_USAGE\x10\xaaN\x12\x12\n\rATOM_APP_SIZE\x10\xabN\x12\x17\n\x12\x41TOM_CATEGORY_SIZE\x10\xacN\x12\x14\n\x0f\x41TOM_PROC_STATS\x10\xadN\x12\x19\n\x14\x41TOM_BATTERY_VOLTAGE\x10\xaeN\x12#\n\x1e\x41TOM_NUM_FINGERPRINTS_ENROLLED\x10\xafN\x12\x11\n\x0c\x41TOM_DISK_IO\x10\xb0N\x12\x17\n\x12\x41TOM_POWER_PROFILE\x10\xb1N\x12\x1d\n\x18\x41TOM_PROC_STATS_PKG_PROC\x10\xb2N\x12\x1a\n\x15\x41TOM_PROCESS_CPU_TIME\x10\xb3N\x12\"\n\x1d\x41TOM_CPU_TIME_PER_THREAD_FREQ\x10\xb5N\x12%\n ATOM_ON_DEVICE_POWER_MEASUREMENT\x10\xb6N\x12%\n ATOM_DEVICE_CALCULATED_POWER_USE\x10\xb7N\x12(\n#ATOM_PROCESS_MEMORY_HIGH_WATER_MARK\x10\xbaN\x12\x17\n\x12\x41TOM_BATTERY_LEVEL\x10\xbbN\x12\x1b\n\x16\x41TOM_BUILD_INFORMATION\x10\xbcN\x12\x1d\n\x18\x41TOM_BATTERY_CYCLE_COUNT\x10\xbdN\x12\x1d\n\x18\x41TOM_DEBUG_ELAPSED_CLOCK\x10\xbeN\x12%\n ATOM_DEBUG_FAILING_ELAPSED_CLOCK\x10\xbfN\x12\x1c\n\x17\x41TOM_NUM_FACES_ENROLLED\x10\xc0N\x12\x15\n\x10\x41TOM_ROLE_HOLDER\x10\xc1N\x12$\n\x1f\x41TOM_DANGEROUS_PERMISSION_STATE\x10\xc2N\x12\x14\n\x0f\x41TOM_TRAIN_INFO\x10\xc3N\x12\x1d\n\x18\x41TOM_TIME_ZONE_DATA_INFO\x10\xc4N\x12\x1f\n\x1a\x41TOM_EXTERNAL_STORAGE_INFO\x10\xc5N\x12\x1f\n\x1a\x41TOM_GPU_STATS_GLOBAL_INFO\x10\xc6N\x12\x1c\n\x17\x41TOM_GPU_STATS_APP_INFO\x10\xc7N\x12\x1e\n\x19\x41TOM_SYSTEM_ION_HEAP_SIZE\x10\xc8N\x12\'\n\"ATOM_APPS_ON_EXTERNAL_STORAGE_INFO\x10\xc9N\x12\x17\n\x12\x41TOM_FACE_SETTINGS\x10\xcaN\x12\x18\n\x13\x41TOM_COOLING_DEVICE\x10\xcbN\x12\x11\n\x0c\x41TOM_APP_OPS\x10\xccN\x12&\n!ATOM_PROCESS_SYSTEM_ION_HEAP_SIZE\x10\xcdN\x12*\n%ATOM_SURFACEFLINGER_STATS_GLOBAL_INFO\x10\xceN\x12)\n$ATOM_SURFACEFLINGER_STATS_LAYER_INFO\x10\xcfN\x12!\n\x1c\x41TOM_PROCESS_MEMORY_SNAPSHOT\x10\xd0N\x12\x1a\n\x15\x41TOM_VMS_CLIENT_STATS\x10\xd1N\x12#\n\x1e\x41TOM_NOTIFICATION_REMOTE_VIEWS\x10\xd2N\x12,\n\'ATOM_DANGEROUS_PERMISSION_STATE_SAMPLED\x10\xd3N\x12\x18\n\x13\x41TOM_GRAPHICS_STATS\x10\xd4N\x12\x1f\n\x1a\x41TOM_RUNTIME_APP_OP_ACCESS\x10\xd5N\x12\x17\n\x12\x41TOM_ION_HEAP_SIZE\x10\xd6N\x12*\n%ATOM_PACKAGE_NOTIFICATION_PREFERENCES\x10\xd7N\x12\x32\n-ATOM_PACKAGE_NOTIFICATION_CHANNEL_PREFERENCES\x10\xd8N\x12\x38\n3ATOM_PACKAGE_NOTIFICATION_CHANNEL_GROUP_PREFERENCES\x10\xd9N\x12\x14\n\x0f\x41TOM_GNSS_STATS\x10\xdaN\x12\x1c\n\x17\x41TOM_ATTRIBUTED_APP_OPS\x10\xdbN\x12\x1c\n\x17\x41TOM_VOICE_CALL_SESSION\x10\xdcN\x12\x1e\n\x19\x41TOM_VOICE_CALL_RAT_USAGE\x10\xddN\x12\x18\n\x13\x41TOM_SIM_SLOT_STATE\x10\xdeN\x12\'\n\"ATOM_SUPPORTED_RADIO_ACCESS_FAMILY\x10\xdfN\x12\x1a\n\x15\x41TOM_SETTING_SNAPSHOT\x10\xe0N\x12\x13\n\x0e\x41TOM_BLOB_INFO\x10\xe1N\x12#\n\x1e\x41TOM_DATA_USAGE_BYTES_TRANSFER\x10\xe2N\x12+\n&ATOM_BYTES_TRANSFER_BY_TAG_AND_METERED\x10\xe3N\x12\x17\n\x12\x41TOM_DND_MODE_RULE\x10\xe4N\x12/\n*ATOM_GENERAL_EXTERNAL_STORAGE_ACCESS_STATS\x10\xe5N\x12\x16\n\x11\x41TOM_INCOMING_SMS\x10\xe6N\x12\x16\n\x11\x41TOM_OUTGOING_SMS\x10\xe7N\x12\"\n\x1d\x41TOM_CARRIER_ID_TABLE_VERSION\x10\xe8N\x12\x1b\n\x16\x41TOM_DATA_CALL_SESSION\x10\xe9N\x12 \n\x1b\x41TOM_CELLULAR_SERVICE_STATE\x10\xeaN\x12&\n!ATOM_CELLULAR_DATA_SERVICE_SWITCH\x10\xebN\x12\x17\n\x12\x41TOM_SYSTEM_MEMORY\x10\xecN\x12&\n!ATOM_IMS_REGISTRATION_TERMINATION\x10\xedN\x12 \n\x1b\x41TOM_IMS_REGISTRATION_STATS\x10\xeeN\x12#\n\x1e\x41TOM_CPU_TIME_PER_CLUSTER_FREQ\x10\xefN\x12$\n\x1f\x41TOM_CPU_CYCLES_PER_UID_CLUSTER\x10\xf0N\x12\x1d\n\x18\x41TOM_DEVICE_ROTATED_DATA\x10\xf1N\x12-\n(ATOM_CPU_CYCLES_PER_THREAD_GROUP_CLUSTER\x10\xf2N\x12!\n\x1c\x41TOM_MEDIA_DRM_ACTIVITY_INFO\x10\xf3N\x12$\n\x1f\x41TOM_OEM_MANAGED_BYTES_TRANSFER\x10\xf4N\x12\x1a\n\x15\x41TOM_GNSS_POWER_STATS\x10\xf5N\x12\"\n\x1d\x41TOM_TIME_ZONE_DETECTOR_STATE\x10\xf6N\x12!\n\x1c\x41TOM_KEYSTORE2_STORAGE_STATS\x10\xf7N\x12\x18\n\x13\x41TOM_RKP_POOL_STATS\x10\xf8N\x12\x1f\n\x1a\x41TOM_PROCESS_DMABUF_MEMORY\x10\xf9N\x12\x1c\n\x17\x41TOM_PENDING_ALARM_INFO\x10\xfaN\x12$\n\x1f\x41TOM_USER_LEVEL_HIBERNATED_APPS\x10\xfbN\x12\"\n\x1d\x41TOM_LAUNCHER_LAYOUT_SNAPSHOT\x10\xfcN\x12 \n\x1b\x41TOM_GLOBAL_HIBERNATED_APPS\x10\xfdN\x12$\n\x1f\x41TOM_INPUT_EVENT_LATENCY_SKETCH\x10\xfeN\x12*\n%ATOM_BATTERY_USAGE_STATS_BEFORE_RESET\x10\xffN\x12)\n$ATOM_BATTERY_USAGE_STATS_SINCE_RESET\x10\x80O\x12\x43\n>ATOM_BATTERY_USAGE_STATS_SINCE_RESET_USING_POWER_PROFILE_MODEL\x10\x81O\x12\'\n\"ATOM_INSTALLED_INCREMENTAL_PACKAGE\x10\x82O\x12$\n\x1f\x41TOM_TELEPHONY_NETWORK_REQUESTS\x10\x83O\x12!\n\x1c\x41TOM_APP_SEARCH_STORAGE_INFO\x10\x84O\x12\x10\n\x0b\x41TOM_VMSTAT\x10\x85O\x12\x32\n-ATOM_KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO\x10\x86O\x12/\n*ATOM_KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO\x10\x87O\x12<\n7ATOM_KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO\x10\x88O\x12&\n!ATOM_KEYSTORE2_ATOM_WITH_OVERFLOW\x10\x89O\x12=\n8ATOM_KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO\x10\x8aO\x12\x33\n.ATOM_KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO\x10\x8bO\x12\x19\n\x14\x41TOM_RKP_ERROR_STATS\x10\x8cO\x12\x1f\n\x1a\x41TOM_KEYSTORE2_CRASH_STATS\x10\x8dO\x12\x1a\n\x15\x41TOM_VENDOR_APEX_INFO\x10\x8eO\x12&\n!ATOM_ACCESSIBILITY_SHORTCUT_STATS\x10\x8fO\x12+\n&ATOM_ACCESSIBILITY_FLOATING_MENU_STATS\x10\x90O\x12&\n!ATOM_DATA_USAGE_BYTES_TRANSFER_V2\x10\x91O\x12\x1c\n\x17\x41TOM_MEDIA_CAPABILITIES\x10\x92O\x12.\n)ATOM_CAR_WATCHDOG_SYSTEM_IO_USAGE_SUMMARY\x10\x93O\x12+\n&ATOM_CAR_WATCHDOG_UID_IO_USAGE_SUMMARY\x10\x94O\x12,\n\'ATOM_IMS_REGISTRATION_FEATURE_TAG_STATS\x10\x95O\x12\'\n\"ATOM_RCS_CLIENT_PROVISIONING_STATS\x10\x96O\x12$\n\x1f\x41TOM_RCS_ACS_PROVISIONING_STATS\x10\x97O\x12\x1c\n\x17\x41TOM_SIP_DELEGATE_STATS\x10\x98O\x12)\n$ATOM_SIP_TRANSPORT_FEATURE_TAG_STATS\x10\x99O\x12\x1e\n\x19\x41TOM_SIP_MESSAGE_RESPONSE\x10\x9aO\x12\x1f\n\x1a\x41TOM_SIP_TRANSPORT_SESSION\x10\x9bO\x12-\n(ATOM_IMS_DEDICATED_BEARER_LISTENER_EVENT\x10\x9cO\x12$\n\x1f\x41TOM_IMS_DEDICATED_BEARER_EVENT\x10\x9dO\x12-\n(ATOM_IMS_REGISTRATION_SERVICE_DESC_STATS\x10\x9eO\x12\x19\n\x14\x41TOM_UCE_EVENT_STATS\x10\x9fO\x12\x1f\n\x1a\x41TOM_PRESENCE_NOTIFY_EVENT\x10\xa0O\x12\x13\n\x0e\x41TOM_GBA_EVENT\x10\xa1O\x12\x18\n\x13\x41TOM_PER_SIM_STATUS\x10\xa2O\x12\x1a\n\x15\x41TOM_GPU_WORK_PER_UID\x10\xa3O\x12\x37\n2ATOM_PERSISTENT_URI_PERMISSIONS_AMOUNT_PER_PACKAGE\x10\xa4O\x12\x1f\n\x1a\x41TOM_SIGNED_PARTITION_INFO\x10\xa5O\x12\'\n\"ATOM_PINNED_FILE_SIZES_PER_PACKAGE\x10\xa6O\x12%\n ATOM_PENDING_INTENTS_PER_PACKAGE\x10\xa7O\x12\x13\n\x0e\x41TOM_USER_INFO\x10\xa8O\x12\'\n\"ATOM_TELEPHONY_NETWORK_REQUESTS_V2\x10\xa9O\x12%\n ATOM_DEVICE_TELEPHONY_PROPERTIES\x10\xaaO\x12.\n)ATOM_REMOTE_KEY_PROVISIONING_ERROR_COUNTS\x10\xabO\x12\x16\n\x11\x41TOM_SAFETY_STATE\x10\xacO\x12\x16\n\x11\x41TOM_INCOMING_MMS\x10\xadO\x12\x16\n\x11\x41TOM_OUTGOING_MMS\x10\xaeO\x12\x19\n\x14\x41TOM_MULTI_USER_INFO\x10\xb0O\x12\x1e\n\x19\x41TOM_NETWORK_BPF_MAP_INFO\x10\xb1O\x12!\n\x1c\x41TOM_OUTGOING_SHORT_CODE_SMS\x10\xb2O\x12#\n\x1e\x41TOM_CONNECTIVITY_STATE_SAMPLE\x10\xb3O\x12\x30\n+ATOM_NETWORK_SELECTION_REMATCH_REASONS_INFO\x10\xb4O\x12\x18\n\x13\x41TOM_GAME_MODE_INFO\x10\xb5O\x12!\n\x1c\x41TOM_GAME_MODE_CONFIGURATION\x10\xb6O\x12\x1c\n\x17\x41TOM_GAME_MODE_LISTENER\x10\xb7O\x12%\n ATOM_NETWORK_SLICE_REQUEST_COUNT\x10\xb8O\x12\x1a\n\x15\x41TOM_WS_TILE_SNAPSHOT\x10\xb9O\x12\x38\n3ATOM_WS_ACTIVE_WATCH_FACE_COMPLICATION_SET_SNAPSHOT\x10\xbaO\x12\x17\n\x12\x41TOM_PROCESS_STATE\x10\xbbO\x12\x1d\n\x18\x41TOM_PROCESS_ASSOCIATION\x10\xbcO\x12$\n\x1f\x41TOM_ADPF_SYSTEM_COMPONENT_INFO\x10\xbdO\x12!\n\x1c\x41TOM_NOTIFICATION_MEMORY_USE\x10\xbeO\x12\x1a\n\x15\x41TOM_HDR_CAPABILITIES\x10\xbfO\x12/\n*ATOM_WS_FAVOURITE_WATCH_FACE_LIST_SNAPSHOT\x10\xc0O\x12!\n\x1c\x41TOM_WIFI_AWARE_NDP_REPORTED\x10\xfe\x04\x12$\n\x1f\x41TOM_WIFI_AWARE_ATTACH_REPORTED\x10\xff\x04\x12&\n!ATOM_WIFI_SELF_RECOVERY_TRIGGERED\x10\x95\x05\x12\x19\n\x14\x41TOM_SOFT_AP_STARTED\x10\xa8\x05\x12\x19\n\x14\x41TOM_SOFT_AP_STOPPED\x10\xa9\x05\x12\x1c\n\x17\x41TOM_WIFI_LOCK_RELEASED\x10\xaf\x05\x12\x1f\n\x1a\x41TOM_WIFI_LOCK_DEACTIVATED\x10\xb0\x05\x12\x1b\n\x16\x41TOM_WIFI_CONFIG_SAVED\x10\xb1\x05\x12+\n&ATOM_WIFI_AWARE_RESOURCE_USING_CHANGED\x10\xb2\x05\x12#\n\x1e\x41TOM_WIFI_AWARE_HAL_API_CALLED\x10\xb3\x05\x12*\n%ATOM_WIFI_LOCAL_ONLY_REQUEST_RECEIVED\x10\xb4\x05\x12\x30\n+ATOM_WIFI_LOCAL_ONLY_REQUEST_SCAN_TRIGGERED\x10\xb5\x05\x12#\n\x1e\x41TOM_WIFI_THREAD_TASK_EXECUTED\x10\xb6\x05\x12\x1c\n\x17\x41TOM_WIFI_STATE_CHANGED\x10\xbc\x05\x12\x1a\n\x15\x41TOM_PNO_SCAN_STARTED\x10\xcf\x05\x12\x1a\n\x15\x41TOM_PNO_SCAN_STOPPED\x10\xd0\x05\x12#\n\x1e\x41TOM_WIFI_IS_UNUSABLE_REPORTED\x10\xd2\x05\x12\'\n\"ATOM_WIFI_AP_CAPABILITIES_REPORTED\x10\xd3\x05\x12\x1f\n\x1a\x41TOM_SOFT_AP_STATE_CHANGED\x10\xa5\x06\x12+\n&ATOM_SCORER_PREDICTION_RESULT_REPORTED\x10\xf4\x06\x12!\n\x1c\x41TOM_WIFI_AWARE_CAPABILITIES\x10\xceO\x12\x1a\n\x15\x41TOM_WIFI_MODULE_INFO\x10\xd1O\x12\x1b\n\x16\x41TOM_WIFI_SETTING_INFO\x10\xd2O\x12#\n\x1e\x41TOM_WIFI_COMPLEX_SETTING_INFO\x10\xd3O\x12&\n!ATOM_WIFI_CONFIGURED_NETWORK_INFO\x10\xd6O\x12 \n\x1b\x41TOM_WEAR_POWER_MENU_OPENED\x10\xdb\x05\x12\x1f\n\x1a\x41TOM_WEAR_ASSISTANT_OPENED\x10\xf3\x05\x12%\n ATOM_FIRST_OVERLAY_STATE_CHANGED\x10\x95\x07\x12\x1e\n\x19\x41TOM_WS_WEAR_TIME_SESSION\x10\xe2\x04\x12*\n%ATOM_WS_INCOMING_CALL_ACTION_REPORTED\x10\xf2\x04\x12(\n#ATOM_WS_CALL_DISCONNECTION_REPORTED\x10\xf3\x04\x12#\n\x1e\x41TOM_WS_CALL_DURATION_REPORTED\x10\xf4\x04\x12\x32\n-ATOM_WS_CALL_USER_EXPERIENCE_LATENCY_REPORTED\x10\xf5\x04\x12&\n!ATOM_WS_CALL_INTERACTION_REPORTED\x10\xf6\x04\x12\"\n\x1d\x41TOM_WS_ON_BODY_STATE_CHANGED\x10\x93\x06\x12\x39\n4ATOM_WS_WATCH_FACE_RESTRICTED_COMPLICATIONS_IMPACTED\x10\xa2\x06\x12@\n;ATOM_WS_WATCH_FACE_DEFAULT_RESTRICTED_COMPLICATIONS_REMOVED\x10\xa3\x06\x12?\n:ATOM_WS_COMPLICATIONS_IMPACTED_NOTIFICATION_EVENT_REPORTED\x10\xa4\x06\x12(\n#ATOM_WS_REMOTE_EVENT_USAGE_REPORTED\x10\x98\x07\x12\x30\n+ATOM_WS_NOTIFICATION_MANAGED_DISMISSAL_SYNC\x10\xad\x07\x12%\n ATOM_WS_BUGREPORT_EVENT_REPORTED\x10\xc4\x07\x12%\n ATOM_WS_STANDALONE_MODE_SNAPSHOT\x10\xd5O\x12)\n$ATOM_WS_FAVORITE_WATCH_FACE_SNAPSHOT\x10\xdeO\x12/\n*ATOM_WS_PHOTOS_WATCH_FACE_FEATURE_SNAPSHOT\x10\xf1O\x12.\n)ATOM_WS_WATCH_FACE_CUSTOMIZATION_SNAPSHOT\x10\xf3O\x12.\n)ATOM_WEAR_ADAPTIVE_SUSPEND_STATS_REPORTED\x10\xeb\x04\x12?\n:ATOM_WEAR_POWER_ANOMALY_SERVICE_OPERATIONAL_STATS_REPORTED\x10\xec\x04\x12\x39\n4ATOM_WEAR_POWER_ANOMALY_SERVICE_EVENT_STATS_REPORTED\x10\xed\x04\x12\"\n\x1d\x41TOM_WEAR_TIME_SYNC_REQUESTED\x10\x8f\x07\x12\"\n\x1d\x41TOM_WEAR_TIME_UPDATE_STARTED\x10\x90\x07\x12*\n%ATOM_WEAR_TIME_SYNC_ATTEMPT_COMPLETED\x10\x91\x07\x12\x1b\n\x16\x41TOM_WEAR_TIME_CHANGED\x10\x92\x07\x12\x32\n-ATOM_WEAR_SETUP_WIZARD_DEVICE_STATUS_REPORTED\x10\xb9\x07\x12-\n(ATOM_WEAR_SETUP_WIZARD_PAIRING_COMPLETED\x10\xba\x07\x12\x32\n-ATOM_WEAR_SETUP_WIZARD_CONNECTION_ESTABLISHED\x10\xbb\x07\x12-\n(ATOM_WEAR_SETUP_WIZARD_CHECKIN_COMPLETED\x10\xbc\x07\x12\x33\n.ATOM_WEAR_SETUP_WIZARD_COMPANION_TIME_REPORTED\x10\xbd\x07\x12+\n&ATOM_WEAR_SETUP_WIZARD_STATUS_REPORTED\x10\xbe\x07\x12.\n)ATOM_WEAR_SETUP_WIZARD_HEARTBEAT_REPORTED\x10\xbf\x07\x12)\n$ATOM_WEAR_SETUP_WIZARD_FRP_TRIGGERED\x10\xc0\x07\x12\x33\n.ATOM_WEAR_SETUP_WIZARD_SYSTEM_UPDATE_TRIGGERED\x10\xc1\x07\x12\x32\n-ATOM_WEAR_SETUP_WIZARD_PHONE_SWITCH_TRIGGERED\x10\xc2\x07\x12\x1e\n\x19\x41TOM_RENDERER_INITIALIZED\x10\xe0\x05\x12!\n\x1c\x41TOM_SCHEMA_VERSION_RECEIVED\x10\xe1\x05\x12\x1a\n\x15\x41TOM_LAYOUT_INSPECTED\x10\xe5\x05\x12%\n ATOM_LAYOUT_EXPRESSION_INSPECTED\x10\xe6\x05\x12%\n ATOM_LAYOUT_ANIMATIONS_INSPECTED\x10\xe7\x05\x12\'\n\"ATOM_MATERIAL_COMPONENTS_INSPECTED\x10\xe8\x05\x12\x18\n\x13\x41TOM_TILE_REQUESTED\x10\xe9\x05\x12!\n\x1c\x41TOM_STATE_RESPONSE_RECEIVED\x10\xea\x05\x12 \n\x1b\x41TOM_TILE_RESPONSE_RECEIVED\x10\xeb\x05\x12\x1c\n\x17\x41TOM_INFLATION_FINISHED\x10\xec\x05\x12\x1a\n\x15\x41TOM_INFLATION_FAILED\x10\xed\x05\x12-\n(ATOM_IGNORED_INFLATION_FAILURES_REPORTED\x10\xee\x05\x12\x1b\n\x16\x41TOM_DRAWABLE_RENDERED\x10\xef\x05\x12!\n\x1c\x41TOM_WEAR_MODE_STATE_CHANGED\x10\xcb\x05\x12\x1f\n\x1a\x41TOM_MEDIA_ACTION_REPORTED\x10\xe0\x04\x12!\n\x1c\x41TOM_MEDIA_CONTROLS_LAUNCHED\x10\xe1\x04\x12%\n ATOM_MEDIA_SESSION_STATE_CHANGED\x10\xa5\x05\x12*\n%ATOM_MEDIA_CONTROL_API_USAGE_REPORTED\x10\xc6\x07\x12$\n\x1f\x41TOM_MEDIA_SUBSCRIPTION_CHANGED\x10\xde\x07\x12<\n7ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_DEVICE_SCAN_API_LATENCY\x10\xf5\x05\x12<\n7ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_SASS_DEVICE_UNAVAILABLE\x10\xf6\x05\x12\x39\n4ATOM_WEAR_MEDIA_OUTPUT_SWITCHER_FASTPAIR_API_TIMEOUT\x10\xf7\x05\x12\x1a\n\x15\x41TOM_MEDIATOR_UPDATED\x10\xd1\x05\x12+\n&ATOM_SYSPROXY_BLUETOOTH_BYTES_TRANSFER\x10\xd4O\x12%\n ATOM_SYSPROXY_CONNECTION_UPDATED\x10\x92\x06\x12)\n$ATOM_WEAR_COMPANION_CONNECTION_STATE\x10\x99\x07\x12(\n#ATOM_SYSPROXY_SERVICE_STATE_UPDATED\x10\xb5\x07\x12\x1b\n\x16\x41TOM_UWB_ACTIVITY_INFO\x10\xccO\x12(\n#ATOM_TEST_UPROBESTATS_ATOM_REPORTED\x10\x93\x07\x12%\n ATOM_TV_LOW_POWER_STANDBY_POLICY\x10\xa7\x05\x12!\n\x1c\x41TOM_EXTERNAL_TV_INPUT_EVENT\x10\xcd\x05\x12&\n!ATOM_BOOT_INTEGRITY_INFO_REPORTED\x10\x87\x06\x12/\n*ATOM_THREADNETWORK_TELEMETRY_DATA_REPORTED\x10\xe2\x05\x12+\n&ATOM_THREADNETWORK_TOPO_ENTRY_REPEATED\x10\xe3\x05\x12,\n\'ATOM_THREADNETWORK_DEVICE_INFO_REPORTED\x10\xe4\x05\x12,\n\'ATOM_CELLULAR_RADIO_POWER_STATE_CHANGED\x10\xc9\x05\x12 \n\x1b\x41TOM_EMERGENCY_NUMBERS_INFO\x10\xc4O\x12!\n\x1c\x41TOM_DATA_NETWORK_VALIDATION\x10\xdfO\x12 \n\x1b\x41TOM_DATA_RAT_STATE_CHANGED\x10\xd6\x06\x12#\n\x1e\x41TOM_CONNECTED_CHANNEL_CHANGED\x10\xf2\x06\x12\'\n\"ATOM_CELLULAR_IDENTIFIER_DISCLOSED\x10\xa0\x06\x12\x1e\n\x19\x41TOM_SATELLITE_CONTROLLER\x10\xc6O\x12\x1b\n\x16\x41TOM_SATELLITE_SESSION\x10\xc7O\x12%\n ATOM_SATELLITE_INCOMING_DATAGRAM\x10\xc8O\x12%\n ATOM_SATELLITE_OUTGOING_DATAGRAM\x10\xc9O\x12\x1d\n\x18\x41TOM_SATELLITE_PROVISION\x10\xcaO\x12+\n&ATOM_SATELLITE_SOS_MESSAGE_RECOMMENDER\x10\xcbO\x12+\n&ATOM_CARRIER_ROAMING_SATELLITE_SESSION\x10\xe3O\x12\x34\n/ATOM_CARRIER_ROAMING_SATELLITE_CONTROLLER_STATS\x10\xe4O\x12&\n!ATOM_CONTROLLER_STATS_PER_PACKAGE\x10\xe5O\x12\x1f\n\x1a\x41TOM_SATELLITE_ENTITLEMENT\x10\xe6O\x12\"\n\x1d\x41TOM_SATELLITE_CONFIG_UPDATER\x10\xe7O\x12%\n ATOM_SATELLITE_ACCESS_CONTROLLER\x10\xebO\x12$\n\x1f\x41TOM_QUALIFIED_RAT_LIST_CHANGED\x10\xfa\x04\x12!\n\x1c\x41TOM_QNS_IMS_CALL_DROP_STATS\x10\xfb\x04\x12*\n%ATOM_QNS_FALLBACK_RESTRICTION_CHANGED\x10\xfc\x04\x12*\n%ATOM_QNS_RAT_PREFERENCE_MISMATCH_INFO\x10\xc1O\x12\"\n\x1d\x41TOM_QNS_HANDOVER_TIME_MILLIS\x10\xc2O\x12\x1f\n\x1a\x41TOM_QNS_HANDOVER_PINGPONG\x10\xc3O\x12=\n8ATOM_IWLAN_UNDERLYING_NETWORK_VALIDATION_RESULT_REPORTED\x10\x9b\x07\x12!\n\x1c\x41TOM_EMERGENCY_NUMBER_DIALED\x10\xfd\x04\x12\x14\n\x0f\x41TOM_CALL_STATS\x10\xedO\x12 \n\x1b\x41TOM_CALL_AUDIO_ROUTE_STATS\x10\xeeO\x12\x1b\n\x16\x41TOM_TELECOM_API_STATS\x10\xefO\x12\x1d\n\x18\x41TOM_TELECOM_ERROR_STATS\x10\xf0O\x12&\n!ATOM_LOCKSCREEN_SHORTCUT_SELECTED\x10\xe3\x04\x12\'\n\"ATOM_LOCKSCREEN_SHORTCUT_TRIGGERED\x10\xe4\x04\x12&\n!ATOM_LAUNCHER_IMPRESSION_EVENT_V2\x10\xcc\x05\x12(\n#ATOM_DISPLAY_SWITCH_LATENCY_TRACKED\x10\xf1\x05\x12\'\n\"ATOM_NOTIFICATION_LISTENER_SERVICE\x10\xbd\x06\x12!\n\x1c\x41TOM_NAV_HANDLE_TOUCH_POINTS\x10\xe5\x06\x12,\n\'ATOM_COMMUNAL_HUB_WIDGET_EVENT_REPORTED\x10\x8c\x07\x12&\n!ATOM_PERIPHERAL_TUTORIAL_LAUNCHED\x10\xae\x07\x12(\n#ATOM_CONTEXTUAL_EDUCATION_TRIGGERED\x10\xcb\x07\x12\x1f\n\x1a\x41TOM_COMMUNAL_HUB_SNAPSHOT\x10\xf2O\x12&\n!ATOM_TEST_EXTENSION_ATOM_REPORTED\x10\x94\x05\x12\'\n\"ATOM_TEST_RESTRICTED_ATOM_REPORTED\x10\xa0\x05\x12$\n\x1f\x41TOM_STATS_SOCKET_LOSS_REPORTED\x10\xf0\x05\x12\x1f\n\x1a\x41TOM_SETTINGS_SPA_REPORTED\x10\xee\x04\x12\x1b\n\x16\x41TOM_SELINUX_AUDIT_LOG\x10\x9f\x06\x12\x1c\n\x17\x41TOM_SANDBOX_API_CALLED\x10\xe8\x03\x12)\n$ATOM_SANDBOX_ACTIVITY_EVENT_OCCURRED\x10\xdf\x05\x12\x32\n-ATOM_SDK_SANDBOX_RESTRICTED_ACCESS_IN_SESSION\x10\x9c\x06\x12\x1d\n\x18\x41TOM_SANDBOX_SDK_STORAGE\x10\xafO\x12\x19\n\x14\x41TOM_RKPD_POOL_STATS\x10\x98\x05\x12\x1f\n\x1a\x41TOM_RKPD_CLIENT_OPERATION\x10\x99\x05\x12$\n\x1f\x41TOM_RANGING_SESSION_CONFIGURED\x10\xe1\x07\x12!\n\x1c\x41TOM_RANGING_SESSION_STARTED\x10\xe2\x07\x12 \n\x1b\x41TOM_RANGING_SESSION_CLOSED\x10\xe3\x07\x12$\n\x1f\x41TOM_RANGING_TECHNOLOGY_STARTED\x10\xe4\x07\x12$\n\x1f\x41TOM_RANGING_TECHNOLOGY_STOPPED\x10\xe5\x07\x12\x33\n.ATOM_MEDIA_PROVIDER_DATABASE_ROLLBACK_REPORTED\x10\x90\x06\x12&\n!ATOM_BACKUP_SETUP_STATUS_REPORTED\x10\x91\x06\x12\x1d\n\x18\x41TOM_SCREEN_OFF_REPORTED\x10\x88\x06\x12*\n%ATOM_SCREEN_TIMEOUT_OVERRIDE_REPORTED\x10\xc4\x06\x12-\n(ATOM_SCREEN_INTERACTIVE_SESSION_REPORTED\x10\xc5\x06\x12\x1d\n\x18\x41TOM_SCREEN_DIM_REPORTED\x10\xe3\x06\x12\x13\n\x0e\x41TOM_ATOM_9999\x10\x8fN\x12\x15\n\x0f\x41TOM_ATOM_99999\x10\x9f\x8d\x06\x12+\n&ATOM_PHOTOPICKER_SESSION_INFO_REPORTED\x10\xf6\x06\x12\'\n\"ATOM_PHOTOPICKER_API_INFO_REPORTED\x10\xf7\x06\x12%\n ATOM_PHOTOPICKER_UI_EVENT_LOGGED\x10\xf8\x06\x12\x30\n+ATOM_PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED\x10\xf9\x06\x12)\n$ATOM_PHOTOPICKER_PREVIEW_INFO_LOGGED\x10\xfa\x06\x12-\n(ATOM_PHOTOPICKER_MENU_INTERACTION_LOGGED\x10\xfb\x06\x12/\n*ATOM_PHOTOPICKER_BANNER_INTERACTION_LOGGED\x10\xfc\x06\x12/\n*ATOM_PHOTOPICKER_MEDIA_LIBRARY_INFO_LOGGED\x10\xfd\x06\x12&\n!ATOM_PHOTOPICKER_PAGE_INFO_LOGGED\x10\xfe\x06\x12\x33\n.ATOM_PHOTOPICKER_MEDIA_GRID_SYNC_INFO_REPORTED\x10\xff\x06\x12.\n)ATOM_PHOTOPICKER_ALBUM_SYNC_INFO_REPORTED\x10\x80\x07\x12*\n%ATOM_PHOTOPICKER_SEARCH_INFO_REPORTED\x10\x81\x07\x12\x31\n,ATOM_SEARCH_DATA_EXTRACTION_DETAILS_REPORTED\x10\x82\x07\x12,\n\'ATOM_EMBEDDED_PHOTOPICKER_INFO_REPORTED\x10\x83\x07\x12,\n\'ATOM_PERMISSION_RATIONALE_DIALOG_VIEWED\x10\x85\x05\x12\x35\n0ATOM_PERMISSION_RATIONALE_DIALOG_ACTION_REPORTED\x10\x86\x05\x12;\n6ATOM_APP_DATA_SHARING_UPDATES_NOTIFICATION_INTERACTION\x10\x87\x05\x12\x32\n-ATOM_APP_DATA_SHARING_UPDATES_FRAGMENT_VIEWED\x10\x88\x05\x12;\n6ATOM_APP_DATA_SHARING_UPDATES_FRAGMENT_ACTION_REPORTED\x10\x89\x05\x12\x36\n1ATOM_ENHANCED_CONFIRMATION_DIALOG_RESULT_REPORTED\x10\xbb\x06\x12\x33\n.ATOM_ENHANCED_CONFIRMATION_RESTRICTION_CLEARED\x10\xbc\x06\x12$\n\x1f\x41TOM_PRESSURE_STALL_INFORMATION\x10\xf5O\x12\x1b\n\x16\x41TOM_PDF_LOAD_REPORTED\x10\xdb\x06\x12 \n\x1b\x41TOM_PDF_API_USAGE_REPORTED\x10\xdc\x06\x12\x1d\n\x18\x41TOM_PDF_SEARCH_REPORTED\x10\xdd\x06\x12*\n%ATOM_COMPONENT_STATE_CHANGED_REPORTED\x10\xdf\x06\x12,\n\'ATOM_ONDEVICEPERSONALIZATION_API_CALLED\x10\xc7\x05\x12-\n(ATOM_ONDEVICEPERSONALIZATION_TRACE_EVENT\x10\xb8\x07\x12(\n#ATOM_NFC_OBSERVE_MODE_STATE_CHANGED\x10\xd7\x06\x12\x1b\n\x16\x41TOM_NFC_FIELD_CHANGED\x10\xd8\x06\x12\x30\n+ATOM_NFC_POLLING_LOOP_NOTIFICATION_REPORTED\x10\xd9\x06\x12/\n*ATOM_NFC_PROPRIETARY_CAPABILITIES_REPORTED\x10\xda\x06\x12&\n!ATOM_NFC_EXIT_FRAME_TABLE_CHANGED\x10\x8c\x08\x12$\n\x1f\x41TOM_NFC_AUTO_TRANSACT_REPORTED\x10\x8e\x08\x12/\n*ATOM_MICROXR_DEVICE_BOOT_COMPLETE_REPORTED\x10\x85\x07\x12\x13\n\x0e\x41TOM_MTE_STATE\x10\xc5O\x12#\n\x1e\x41TOM_ZRAM_MAINTENANCE_EXECUTED\x10\xf7\x07\x12\x1d\n\x18\x41TOM_ZRAM_SETUP_EXECUTED\x10\x85\x08\x12\x1a\n\x15\x41TOM_ZRAM_MM_STAT_MMD\x10\xf8O\x12\x1a\n\x15\x41TOM_ZRAM_BD_STAT_MMD\x10\xf9O\x12&\n!ATOM_MEDIA_EDITING_ENDED_REPORTED\x10\x9e\x06\x12/\n*ATOM_MEDIA_CODEC_RECLAIM_REQUEST_COMPLETED\x10\xd8\x04\x12\x1d\n\x18\x41TOM_MEDIA_CODEC_STARTED\x10\x81\x05\x12\x1d\n\x18\x41TOM_MEDIA_CODEC_STOPPED\x10\x82\x05\x12\x1e\n\x19\x41TOM_MEDIA_CODEC_RENDERED\x10\xac\x05\x12!\n\x1c\x41TOM_EMERGENCY_STATE_CHANGED\x10\xf9\x04\x12/\n*ATOM_CHRE_SIGNIFICANT_MOTION_STATE_CHANGED\x10\xe4\x06\x12\x36\n1ATOM_POPULATION_DENSITY_PROVIDER_LOADING_REPORTED\x10\xea\x07\x12\x37\n2ATOM_DENSITY_BASED_COARSE_LOCATIONS_USAGE_REPORTED\x10\xeb\x07\x12@\n;ATOM_DENSITY_BASED_COARSE_LOCATIONS_PROVIDER_QUERY_REPORTED\x10\xec\x07\x12\"\n\x1d\x41TOM_KERNEL_OOM_KILL_OCCURRED\x10\xf2\x05\x12\x1d\n\x18\x41TOM_KEYBOARD_CONFIGURED\x10\xaa\x05\x12)\n$ATOM_KEYBOARD_SYSTEMS_EVENT_REPORTED\x10\xab\x05\x12$\n\x1f\x41TOM_INPUTDEVICE_USAGE_REPORTED\x10\xae\x05\x12&\n!ATOM_INPUT_EVENT_LATENCY_REPORTED\x10\xa4\x07\x12\x18\n\x13\x41TOM_TOUCHPAD_USAGE\x10\xcfO\x12 \n\x1b\x41TOM_IKE_SESSION_TERMINATED\x10\xa6\x05\x12.\n)ATOM_IKE_LIVENESS_CHECK_SESSION_VALIDATED\x10\xf8\x05\x12)\n$ATOM_NEGOTIATED_SECURITY_ASSOCIATION\x10\xb5\x06\x12+\n&ATOM_HOTWORD_EGRESS_SIZE_ATOM_REPORTED\x10\xf9\x05\x12&\n!ATOM_HEALTH_CONNECT_UI_IMPRESSION\x10\xef\x04\x12\'\n\"ATOM_HEALTH_CONNECT_UI_INTERACTION\x10\xf0\x04\x12,\n\'ATOM_HEALTH_CONNECT_APP_OPENED_REPORTED\x10\xf1\x04\x12#\n\x1e\x41TOM_HEALTH_CONNECT_API_CALLED\x10\xe8\x04\x12$\n\x1f\x41TOM_HEALTH_CONNECT_USAGE_STATS\x10\xe9\x04\x12&\n!ATOM_HEALTH_CONNECT_STORAGE_STATS\x10\xea\x04\x12$\n\x1f\x41TOM_HEALTH_CONNECT_API_INVOKED\x10\x83\x05\x12#\n\x1e\x41TOM_EXERCISE_ROUTE_API_CALLED\x10\x8e\x05\x12\'\n\"ATOM_HEALTH_CONNECT_EXPORT_INVOKED\x10\x8b\x07\x12\'\n\"ATOM_HEALTH_CONNECT_IMPORT_INVOKED\x10\x96\x07\x12\x35\n0ATOM_HEALTH_CONNECT_EXPORT_IMPORT_STATS_REPORTED\x10\x97\x07\x12)\n$ATOM_HEALTH_CONNECT_PERMISSION_STATS\x10\xc3\x07\x12(\n#ATOM_HEALTH_CONNECT_PHR_API_INVOKED\x10\xd4\x07\x12(\n#ATOM_HEALTH_CONNECT_PHR_USAGE_STATS\x10\xd5\x07\x12*\n%ATOM_HEALTH_CONNECT_PHR_STORAGE_STATS\x10\xd8\x07\x12\x33\n.ATOM_HEALTH_CONNECT_RESTRICTED_ECOSYSTEM_STATS\x10\xd9\x07\x12(\n#ATOM_HEALTH_CONNECT_ECOSYSTEM_STATS\x10\xda\x07\x12#\n\x1e\x41TOM_HDMI_EARC_STATUS_REPORTED\x10\xbd\x05\x12,\n\'ATOM_HDMI_SOUNDBAR_MODE_STATUS_REPORTED\x10\xd4\x05\x12?\n:ATOM_HDMI_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_TOGGLED\x10\xdf\x07\x12\x18\n\x13\x41TOM_BATTERY_HEALTH\x10\xecO\x12\x1e\n\x19\x41TOM_BIOMETRIC_UNENROLLED\x10\xb0\x07\x12\x1e\n\x19\x41TOM_BIOMETRIC_ENUMERATED\x10\xb1\x07\x12\x34\n/ATOM_APPLICATION_GRAMMATICAL_INFLECTION_CHANGED\x10\xc8\x04\x12/\n*ATOM_SYSTEM_GRAMMATICAL_INFLECTION_CHANGED\x10\xb0\x06\x12%\n ATOM_FULL_SCREEN_INTENT_LAUNCHED\x10\xf7\x04\x12\x15\n\x10\x41TOM_BAL_ALLOWED\x10\xf8\x04\x12\"\n\x1d\x41TOM_IN_TASK_ACTIVITY_STARTED\x10\xad\x05\x12$\n\x1f\x41TOM_DEVICE_ORIENTATION_CHANGED\x10\x8a\x07\x12$\n\x1f\x41TOM_CACHED_APPS_HIGH_WATERMARK\x10\xcdO\x12,\n\'ATOM_STYLUS_PREDICTION_METRICS_REPORTED\x10\xce\x05\x12\"\n\x1d\x41TOM_USER_RISK_EVENT_REPORTED\x10\xd5\x05\x12(\n#ATOM_MEDIA_PROJECTION_STATE_CHANGED\x10\xd9\x05\x12)\n$ATOM_MEDIA_PROJECTION_TARGET_CHANGED\x10\xda\x05\x12/\n*ATOM_EXCESSIVE_BINDER_PROXY_COUNT_REPORTED\x10\xd5\x06\x12\'\n\"ATOM_PROXY_BYTES_TRANSFER_BY_FG_BG\x10\xd8O\x12-\n(ATOM_MOBILE_BYTES_TRANSFER_BY_PROC_STATE\x10\xdcO\x12$\n\x1f\x41TOM_BIOMETRIC_FRR_NOTIFICATION\x10\xb1\x06\x12\x34\n/ATOM_SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION\x10\xbe\x06\x12\x37\n2ATOM_SENSITIVE_NOTIFICATION_APP_PROTECTION_SESSION\x10\xbf\x06\x12\x37\n2ATOM_SENSITIVE_NOTIFICATION_APP_PROTECTION_APPLIED\x10\xc0\x06\x12*\n%ATOM_SENSITIVE_NOTIFICATION_REDACTION\x10\xc1\x06\x12*\n%ATOM_SENSITIVE_CONTENT_APP_PROTECTION\x10\xc3\x06\x12\'\n\"ATOM_APP_RESTRICTION_STATE_CHANGED\x10\xe2\x06\x12%\n ATOM_BATTERY_USAGE_STATS_PER_UID\x10\xe1O\x12 \n\x1b\x41TOM_POSTGC_MEMORY_SNAPSHOT\x10\x9c\x07\x12+\n&ATOM_POWER_SAVE_TEMP_ALLOWLIST_CHANGED\x10\x9e\x07\x12\x1f\n\x1a\x41TOM_APP_OP_ACCESS_TRACKED\x10\xa3\x07\x12,\n\'ATOM_CONTENT_OR_FILE_URI_EVENT_REPORTED\x10\xa5\x07\x12,\n\'ATOM_DEVICE_IDLE_TEMP_ALLOWLIST_UPDATED\x10\xac\x07\x12\x36\n1ATOM_APP_OP_NOTE_OP_OR_CHECK_OP_BINDER_API_CALLED\x10\xaf\x07\x12!\n\x1c\x41TOM_FRAMEWORK_WAKELOCK_INFO\x10\xf6O\x12-\n(ATOM_JANK_FRAME_COUNT_BY_WIDGET_REPORTED\x10\xb6\x07\x12$\n\x1f\x41TOM_INTENT_CREATOR_TOKEN_ADDED\x10\xd2\x07\x12-\n(ATOM_NOTIFICATION_CHANNEL_CLASSIFICATION\x10\xd7\x07\x12\x31\n,ATOM_CAMERA_STATUS_FOR_COMPATIBILITY_CHANGED\x10\xe7\x07\x12&\n!ATOM_FEDERATED_COMPUTE_API_CALLED\x10\xc8\x05\x12\x33\n.ATOM_FEDERATED_COMPUTE_TRAINING_EVENT_REPORTED\x10\x83\x06\x12\x30\n+ATOM_EXAMPLE_ITERATOR_NEXT_LATENCY_REPORTED\x10\xc6\x06\x12\x30\n+ATOM_FEDERATED_COMPUTE_TRACE_EVENT_REPORTED\x10\xe0\x07\x12 \n\x1b\x41TOM_EXPRESS_EVENT_REPORTED\x10\x90\x04\x12+\n&ATOM_EXPRESS_HISTOGRAM_SAMPLE_REPORTED\x10\xd1\x04\x12$\n\x1f\x41TOM_EXPRESS_UID_EVENT_REPORTED\x10\x84\x05\x12/\n*ATOM_EXPRESS_UID_HISTOGRAM_SAMPLE_REPORTED\x10\x92\x05\x12\x1f\n\x1a\x41TOM_DREAM_SETTING_CHANGED\x10\xc1\x05\x12 \n\x1b\x41TOM_DREAM_SETTING_SNAPSHOT\x10\xd0O\x12\x1b\n\x16\x41TOM_DND_STATE_CHANGED\x10\x91\x05\x12(\n#ATOM_EXTERNAL_DISPLAY_STATE_CHANGED\x10\xa6\x06\x12,\n\'ATOM_DISPLAY_MODE_DIRECTOR_VOTE_CHANGED\x10\x98\x06\x12\'\n\"ATOM_DEVICE_POLICY_MANAGEMENT_MODE\x10\xe8O\x12\x1d\n\x18\x41TOM_DEVICE_POLICY_STATE\x10\xe9O\x12/\n*ATOM_DEVICE_LOCK_CHECK_IN_REQUEST_REPORTED\x10\xd6\x05\x12\x34\n/ATOM_DEVICE_LOCK_PROVISIONING_COMPLETE_REPORTED\x10\xd7\x05\x12\x30\n+ATOM_DEVICE_LOCK_KIOSK_APP_REQUEST_REPORTED\x10\xd8\x05\x12-\n(ATOM_DEVICE_LOCK_CHECK_IN_RETRY_REPORTED\x10\x95\x06\x12\x30\n+ATOM_DEVICE_LOCK_PROVISION_FAILURE_REPORTED\x10\x96\x06\x12\x39\n4ATOM_DEVICE_LOCK_LOCK_UNLOCK_DEVICE_FAILURE_REPORTED\x10\x97\x06\x12!\n\x1c\x41TOM_DESKTOP_MODE_UI_CHANGED\x10\xb2\x06\x12*\n%ATOM_DESKTOP_MODE_SESSION_TASK_UPDATE\x10\xb3\x06\x12(\n#ATOM_DESKTOP_MODE_TASK_SIZE_UPDATED\x10\xa7\x07\x12\x1f\n\x1a\x41TOM_CRONET_ENGINE_CREATED\x10\xbf\x05\x12!\n\x1c\x41TOM_CRONET_TRAFFIC_REPORTED\x10\xc0\x05\x12+\n&ATOM_CRONET_ENGINE_BUILDER_INITIALIZED\x10\xfa\x05\x12\'\n\"ATOM_CRONET_HTTP_FLAGS_INITIALIZED\x10\xfb\x05\x12\x1c\n\x17\x41TOM_CRONET_INITIALIZED\x10\xfc\x05\x12\'\n\"ATOM_CREDENTIAL_MANAGER_API_CALLED\x10\xc9\x04\x12\x30\n+ATOM_CREDENTIAL_MANAGER_INIT_PHASE_REPORTED\x10\x8b\x05\x12\x35\n0ATOM_CREDENTIAL_MANAGER_CANDIDATE_PHASE_REPORTED\x10\x8c\x05\x12\x31\n,ATOM_CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED\x10\x8d\x05\x12+\n&ATOM_CREDENTIAL_MANAGER_TOTAL_REPORTED\x10\x9b\x05\x12\x30\n+ATOM_CREDENTIAL_MANAGER_FINALNOUID_REPORTED\x10\x9c\x05\x12)\n$ATOM_CREDENTIAL_MANAGER_GET_REPORTED\x10\x9d\x05\x12\x30\n+ATOM_CREDENTIAL_MANAGER_AUTH_CLICK_REPORTED\x10\x9e\x05\x12)\n$ATOM_CREDENTIAL_MANAGER_APIV2_CALLED\x10\x9f\x05\x12\x14\n\x0f\x41TOM_CPU_POLICY\x10\xd7O\x12&\n!ATOM_VPN_CONNECTION_STATE_CHANGED\x10\xd2\x06\x12!\n\x1c\x41TOM_VPN_CONNECTION_REPORTED\x10\xd3\x06\x12$\n\x1f\x41TOM_IP_CLIENT_RA_INFO_REPORTED\x10\x8a\x06\x12#\n\x1e\x41TOM_APF_SESSION_INFO_REPORTED\x10\x89\x06\x12\x31\n,ATOM_CORE_NETWORKING_TERRIBLE_ERROR_OCCURRED\x10\xd3\x07\x12.\n)ATOM_NETWORK_STATS_RECORDER_FILE_OPERATED\x10\x8f\x06\x12\'\n\"ATOM_DAILY_KEEPALIVE_INFO_REPORTED\x10\x8a\x05\x12\'\n\"ATOM_NETWORK_REQUEST_STATE_CHANGED\x10\x8b\x06\x12,\n\'ATOM_TETHERING_ACTIVE_SESSIONS_REPORTED\x10\x9d\x07\x12@\n;ATOM_CERTIFICATE_TRANSPARENCY_LOG_LIST_UPDATE_STATE_CHANGED\x10\xcc\x07\x12!\n\x1c\x41TOM_HARDWARE_RENDERER_EVENT\x10\xb2\x07\x12\x1c\n\x17\x41TOM_TEXTURE_VIEW_EVENT\x10\xb3\x07\x12\x1f\n\x1a\x41TOM_SURFACE_CONTROL_EVENT\x10\xb4\x07\x12\x17\n\x12\x41TOM_IMAGE_DECODED\x10\xd1\x07\x12\x39\n4ATOM_CERTIFICATE_TRANSPARENCY_LOG_LIST_STATE_CHANGED\x10\xa6\x07\x12 \n\x1b\x41TOM_CONSCRYPT_SERVICE_USED\x10\xc5\x07\x12\x38\n3ATOM_CERTIFICATE_TRANSPARENCY_VERIFICATION_REPORTED\x10\xdd\x07\x12\x30\n+ATOM_CAMERA_FEATURE_COMBINATION_QUERY_EVENT\x10\x84\x07\x12\x18\n\x13\x41TOM_BROADCAST_SENT\x10\x9a\x07\x12/\n*ATOM_BLUETOOTH_HASHED_DEVICE_NAME_REPORTED\x10\xe5\x04\x12/\n*ATOM_BLUETOOTH_L2CAP_COC_CLIENT_CONNECTION\x10\xe6\x04\x12/\n*ATOM_BLUETOOTH_L2CAP_COC_SERVER_CONNECTION\x10\xe7\x04\x12(\n#ATOM_BLUETOOTH_LE_SESSION_CONNECTED\x10\x90\x05\x12\x33\n.ATOM_RESTRICTED_BLUETOOTH_DEVICE_NAME_REPORTED\x10\x9a\x05\x12\x30\n+ATOM_BLUETOOTH_PROFILE_CONNECTION_ATTEMPTED\x10\xb8\x05\x12\x32\n-ATOM_BLUETOOTH_CONTENT_PROFILE_ERROR_REPORTED\x10\x8d\x06\x12/\n*ATOM_BLUETOOTH_RFCOMM_CONNECTION_ATTEMPTED\x10\x8e\x06\x12\x32\n-ATOM_REMOTE_DEVICE_INFORMATION_WITH_METRIC_ID\x10\xde\x06\x12#\n\x1e\x41TOM_LE_APP_SCAN_STATE_CHANGED\x10\xe6\x06\x12\x1f\n\x1a\x41TOM_LE_RADIO_SCAN_STOPPED\x10\xe7\x06\x12!\n\x1c\x41TOM_LE_SCAN_RESULT_RECEIVED\x10\xe8\x06\x12\x18\n\x13\x41TOM_LE_SCAN_ABUSED\x10\xe9\x06\x12\x1e\n\x19\x41TOM_LE_ADV_STATE_CHANGED\x10\xea\x06\x12\x1f\n\x1a\x41TOM_LE_ADV_ERROR_REPORTED\x10\xeb\x06\x12\x1f\n\x1a\x41TOM_A2DP_SESSION_REPORTED\x10\x88\x07\x12.\n)ATOM_BLUETOOTH_CROSS_LAYER_EVENT_REPORTED\x10\x94\x07\x12*\n%ATOM_BROADCAST_AUDIO_SESSION_REPORTED\x10\x9f\x07\x12\'\n\"ATOM_BROADCAST_AUDIO_SYNC_REPORTED\x10\xa0\x07\x12\x37\n2ATOM_BLUETOOTH_RFCOMM_CONNECTION_REPORTED_AT_CLOSE\x10\xd6\x07\x12!\n\x1c\x41TOM_BLUETOOTH_LE_CONNECTION\x10\xdc\x07\x12.\n)ATOM_HEARING_DEVICE_ACTIVE_EVENT_REPORTED\x10\xfd\x07\x12(\n#ATOM_BACKPORTED_FIX_STATUS_REPORTED\x10\xdb\x07\x12\x1c\n\x17\x41TOM_PLUGIN_INITIALIZED\x10\x8f\x05\x12\x38\n3ATOM_CAR_SYSTEM_UI_DATA_SUBSCRIPTION_EVENT_REPORTED\x10\xce\x07\x12\x37\n2ATOM_CAR_SETTINGS_DATA_SUBSCRIPTION_EVENT_REPORTED\x10\xcf\x07\x12#\n\x1e\x41TOM_CAR_QC_LIB_EVENT_REPORTED\x10\xd0\x07\x12*\n%ATOM_CAR_WAKEUP_FROM_SUSPEND_REPORTED\x10\xd4\x06\x12$\n\x1f\x41TOM_CAR_RECENTS_EVENT_REPORTED\x10\x82\x06\x12&\n!ATOM_CAR_CALM_MODE_EVENT_REPORTED\x10\x9d\x06\x12$\n\x1f\x41TOM_AUTOFILL_UI_EVENT_REPORTED\x10\xdb\x04\x12(\n#ATOM_AUTOFILL_FILL_REQUEST_REPORTED\x10\xdc\x04\x12)\n$ATOM_AUTOFILL_FILL_RESPONSE_REPORTED\x10\xdd\x04\x12&\n!ATOM_AUTOFILL_SAVE_EVENT_REPORTED\x10\xde\x04\x12$\n\x1f\x41TOM_AUTOFILL_SESSION_COMMITTED\x10\xdf\x04\x12\x36\n1ATOM_AUTOFILL_FIELD_CLASSIFICATION_EVENT_REPORTED\x10\x93\x05\x12\x1c\n\x17\x41TOM_ODREFRESH_REPORTED\x10\xee\x02\x12\x19\n\x14\x41TOM_ODSIGN_REPORTED\x10\xa4\x04\x12%\n ATOM_BACKGROUND_DEXOPT_JOB_ENDED\x10\xd3\x03\x12$\n\x1f\x41TOM_PREREBOOT_DEXOPT_JOB_ENDED\x10\xf3\x06\x12\x1c\n\x17\x41TOM_ART_DATUM_REPORTED\x10\xcc\x02\x12#\n\x1e\x41TOM_ART_DEVICE_DATUM_REPORTED\x10\xa6\x04\x12\"\n\x1d\x41TOM_ART_DATUM_DELTA_REPORTED\x10\xb5\x04\x12\x1e\n\x19\x41TOM_ART_DEX2OAT_REPORTED\x10\xa1\x07\x12\x1b\n\x16\x41TOM_ART_DEVICE_STATUS\x10\xddO\x12.\n)ATOM_APP_SEARCH_SET_SCHEMA_STATS_REPORTED\x10\x81\x03\x12\x34\n/ATOM_APP_SEARCH_SCHEMA_MIGRATION_STATS_REPORTED\x10\xc3\x04\x12\x37\n2ATOM_APP_SEARCH_USAGE_SEARCH_INTENT_STATS_REPORTED\x10\xb9\x06\x12\x41\n\x12\x1c\n\x18VMSTAT_PGSCAN_DIRECT_DMA\x10?\x12\x1f\n\x1bVMSTAT_PGSCAN_DIRECT_NORMAL\x10@\x12 \n\x1cVMSTAT_PGSCAN_DIRECT_MOVABLE\x10\x41\x12!\n\x1dVMSTAT_PGSCAN_DIRECT_THROTTLE\x10\x42\x12\x17\n\x13VMSTAT_PGINODESTEAL\x10\x43\x12\x18\n\x14VMSTAT_SLABS_SCANNED\x10\x44\x12\x1c\n\x18VMSTAT_KSWAPD_INODESTEAL\x10\x45\x12\'\n#VMSTAT_KSWAPD_LOW_WMARK_HIT_QUICKLY\x10\x46\x12(\n$VMSTAT_KSWAPD_HIGH_WMARK_HIT_QUICKLY\x10G\x12\x15\n\x11VMSTAT_PAGEOUTRUN\x10H\x12\x15\n\x11VMSTAT_ALLOCSTALL\x10I\x12\x14\n\x10VMSTAT_PGROTATED\x10J\x12\x19\n\x15VMSTAT_DROP_PAGECACHE\x10K\x12\x14\n\x10VMSTAT_DROP_SLAB\x10L\x12\x1c\n\x18VMSTAT_PGMIGRATE_SUCCESS\x10M\x12\x19\n\x15VMSTAT_PGMIGRATE_FAIL\x10N\x12\"\n\x1eVMSTAT_COMPACT_MIGRATE_SCANNED\x10O\x12\x1f\n\x1bVMSTAT_COMPACT_FREE_SCANNED\x10P\x12\x1b\n\x17VMSTAT_COMPACT_ISOLATED\x10Q\x12\x18\n\x14VMSTAT_COMPACT_STALL\x10R\x12\x17\n\x13VMSTAT_COMPACT_FAIL\x10S\x12\x1a\n\x16VMSTAT_COMPACT_SUCCESS\x10T\x12\x1e\n\x1aVMSTAT_COMPACT_DAEMON_WAKE\x10U\x12!\n\x1dVMSTAT_UNEVICTABLE_PGS_CULLED\x10V\x12\"\n\x1eVMSTAT_UNEVICTABLE_PGS_SCANNED\x10W\x12\"\n\x1eVMSTAT_UNEVICTABLE_PGS_RESCUED\x10X\x12\"\n\x1eVMSTAT_UNEVICTABLE_PGS_MLOCKED\x10Y\x12$\n VMSTAT_UNEVICTABLE_PGS_MUNLOCKED\x10Z\x12\"\n\x1eVMSTAT_UNEVICTABLE_PGS_CLEARED\x10[\x12#\n\x1fVMSTAT_UNEVICTABLE_PGS_STRANDED\x10\\\x12\x15\n\x11VMSTAT_NR_ZSPAGES\x10]\x12\x16\n\x12VMSTAT_NR_ION_HEAP\x10^\x12\x16\n\x12VMSTAT_NR_GPU_HEAP\x10_\x12\x19\n\x15VMSTAT_ALLOCSTALL_DMA\x10`\x12\x1d\n\x19VMSTAT_ALLOCSTALL_MOVABLE\x10\x61\x12\x1c\n\x18VMSTAT_ALLOCSTALL_NORMAL\x10\x62\x12&\n\"VMSTAT_COMPACT_DAEMON_FREE_SCANNED\x10\x63\x12)\n%VMSTAT_COMPACT_DAEMON_MIGRATE_SCANNED\x10\x64\x12\x15\n\x11VMSTAT_NR_FASTRPC\x10\x65\x12$\n VMSTAT_NR_INDIRECTLY_RECLAIMABLE\x10\x66\x12\x1b\n\x17VMSTAT_NR_ION_HEAP_POOL\x10g\x12%\n!VMSTAT_NR_KERNEL_MISC_RECLAIMABLE\x10h\x12%\n!VMSTAT_NR_SHADOW_CALL_STACK_BYTES\x10i\x12\x1d\n\x19VMSTAT_NR_SHMEM_HUGEPAGES\x10j\x12\x1d\n\x19VMSTAT_NR_SHMEM_PMDMAPPED\x10k\x12!\n\x1dVMSTAT_NR_UNRECLAIMABLE_PAGES\x10l\x12\x1e\n\x1aVMSTAT_NR_ZONE_ACTIVE_ANON\x10m\x12\x1e\n\x1aVMSTAT_NR_ZONE_ACTIVE_FILE\x10n\x12 \n\x1cVMSTAT_NR_ZONE_INACTIVE_ANON\x10o\x12 \n\x1cVMSTAT_NR_ZONE_INACTIVE_FILE\x10p\x12\x1e\n\x1aVMSTAT_NR_ZONE_UNEVICTABLE\x10q\x12 \n\x1cVMSTAT_NR_ZONE_WRITE_PENDING\x10r\x12\x13\n\x0fVMSTAT_OOM_KILL\x10s\x12\x15\n\x11VMSTAT_PGLAZYFREE\x10t\x12\x16\n\x12VMSTAT_PGLAZYFREED\x10u\x12\x13\n\x0fVMSTAT_PGREFILL\x10v\x12\x18\n\x14VMSTAT_PGSCAN_DIRECT\x10w\x12\x18\n\x14VMSTAT_PGSCAN_KSWAPD\x10x\x12\x15\n\x11VMSTAT_PGSKIP_DMA\x10y\x12\x19\n\x15VMSTAT_PGSKIP_MOVABLE\x10z\x12\x18\n\x14VMSTAT_PGSKIP_NORMAL\x10{\x12\x19\n\x15VMSTAT_PGSTEAL_DIRECT\x10|\x12\x19\n\x15VMSTAT_PGSTEAL_KSWAPD\x10}\x12\x12\n\x0eVMSTAT_SWAP_RA\x10~\x12\x16\n\x12VMSTAT_SWAP_RA_HIT\x10\x7f\x12\x1e\n\x19VMSTAT_WORKINGSET_RESTORE\x10\x80\x01\x12\x1d\n\x18VMSTAT_ALLOCSTALL_DEVICE\x10\x81\x01\x12\x1c\n\x17VMSTAT_ALLOCSTALL_DMA32\x10\x82\x01\x12\x1b\n\x16VMSTAT_BALLOON_DEFLATE\x10\x83\x01\x12\x1b\n\x16VMSTAT_BALLOON_INFLATE\x10\x84\x01\x12\x1b\n\x16VMSTAT_BALLOON_MIGRATE\x10\x85\x01\x12\x1a\n\x15VMSTAT_CMA_ALLOC_FAIL\x10\x86\x01\x12\x1d\n\x18VMSTAT_CMA_ALLOC_SUCCESS\x10\x87\x01\x12\x1d\n\x18VMSTAT_NR_FILE_HUGEPAGES\x10\x88\x01\x12\x1d\n\x18VMSTAT_NR_FILE_PMDMAPPED\x10\x89\x01\x12 \n\x1bVMSTAT_NR_FOLL_PIN_ACQUIRED\x10\x8a\x01\x12 \n\x1bVMSTAT_NR_FOLL_PIN_RELEASED\x10\x8b\x01\x12#\n\x1eVMSTAT_NR_SEC_PAGE_TABLE_PAGES\x10\x8c\x01\x12 \n\x1bVMSTAT_NR_SHADOW_CALL_STACK\x10\x8d\x01\x12\x19\n\x14VMSTAT_NR_SWAPCACHED\x10\x8e\x01\x12 \n\x1bVMSTAT_NR_THROTTLED_WRITTEN\x10\x8f\x01\x12\x1a\n\x15VMSTAT_PGALLOC_DEVICE\x10\x90\x01\x12\x19\n\x14VMSTAT_PGALLOC_DMA32\x10\x91\x01\x12\x1b\n\x16VMSTAT_PGDEMOTE_DIRECT\x10\x92\x01\x12\x1b\n\x16VMSTAT_PGDEMOTE_KSWAPD\x10\x93\x01\x12\x13\n\x0eVMSTAT_PGREUSE\x10\x94\x01\x12\x17\n\x12VMSTAT_PGSCAN_ANON\x10\x95\x01\x12\x17\n\x12VMSTAT_PGSCAN_FILE\x10\x96\x01\x12\x19\n\x14VMSTAT_PGSKIP_DEVICE\x10\x97\x01\x12\x18\n\x13VMSTAT_PGSKIP_DMA32\x10\x98\x01\x12\x18\n\x13VMSTAT_PGSTEAL_ANON\x10\x99\x01\x12\x18\n\x13VMSTAT_PGSTEAL_FILE\x10\x9a\x01\x12\x1e\n\x19VMSTAT_THP_COLLAPSE_ALLOC\x10\x9b\x01\x12%\n VMSTAT_THP_COLLAPSE_ALLOC_FAILED\x10\x9c\x01\x12#\n\x1eVMSTAT_THP_DEFERRED_SPLIT_PAGE\x10\x9d\x01\x12\x1b\n\x16VMSTAT_THP_FAULT_ALLOC\x10\x9e\x01\x12\x1e\n\x19VMSTAT_THP_FAULT_FALLBACK\x10\x9f\x01\x12%\n VMSTAT_THP_FAULT_FALLBACK_CHARGE\x10\xa0\x01\x12\x1a\n\x15VMSTAT_THP_FILE_ALLOC\x10\xa1\x01\x12\x1d\n\x18VMSTAT_THP_FILE_FALLBACK\x10\xa2\x01\x12$\n\x1fVMSTAT_THP_FILE_FALLBACK_CHARGE\x10\xa3\x01\x12\x1b\n\x16VMSTAT_THP_FILE_MAPPED\x10\xa4\x01\x12\x1e\n\x19VMSTAT_THP_MIGRATION_FAIL\x10\xa5\x01\x12\x1f\n\x1aVMSTAT_THP_MIGRATION_SPLIT\x10\xa6\x01\x12!\n\x1cVMSTAT_THP_MIGRATION_SUCCESS\x10\xa7\x01\x12$\n\x1fVMSTAT_THP_SCAN_EXCEED_NONE_PTE\x10\xa8\x01\x12%\n VMSTAT_THP_SCAN_EXCEED_SHARE_PTE\x10\xa9\x01\x12$\n\x1fVMSTAT_THP_SCAN_EXCEED_SWAP_PTE\x10\xaa\x01\x12\x1a\n\x15VMSTAT_THP_SPLIT_PAGE\x10\xab\x01\x12!\n\x1cVMSTAT_THP_SPLIT_PAGE_FAILED\x10\xac\x01\x12\x19\n\x14VMSTAT_THP_SPLIT_PMD\x10\xad\x01\x12\x16\n\x11VMSTAT_THP_SWPOUT\x10\xae\x01\x12\x1f\n\x1aVMSTAT_THP_SWPOUT_FALLBACK\x10\xaf\x01\x12\x1f\n\x1aVMSTAT_THP_ZERO_PAGE_ALLOC\x10\xb0\x01\x12&\n!VMSTAT_THP_ZERO_PAGE_ALLOC_FAILED\x10\xb1\x01\x12\x1a\n\x15VMSTAT_VMA_LOCK_ABORT\x10\xb2\x01\x12\x19\n\x14VMSTAT_VMA_LOCK_MISS\x10\xb3\x01\x12\x1a\n\x15VMSTAT_VMA_LOCK_RETRY\x10\xb4\x01\x12\x1c\n\x17VMSTAT_VMA_LOCK_SUCCESS\x10\xb5\x01\x12$\n\x1fVMSTAT_WORKINGSET_ACTIVATE_ANON\x10\xb6\x01\x12$\n\x1fVMSTAT_WORKINGSET_ACTIVATE_FILE\x10\xb7\x01\x12\x1c\n\x17VMSTAT_WORKINGSET_NODES\x10\xb8\x01\x12#\n\x1eVMSTAT_WORKINGSET_REFAULT_ANON\x10\xb9\x01\x12#\n\x1eVMSTAT_WORKINGSET_REFAULT_FILE\x10\xba\x01\x12#\n\x1eVMSTAT_WORKINGSET_RESTORE_ANON\x10\xbb\x01\x12#\n\x1eVMSTAT_WORKINGSET_RESTORE_FILE\x10\xbc\x01*\xc8\x05\n\x11\x46traceParseStatus\x12\x1d\n\x19\x46TRACE_STATUS_UNSPECIFIED\x10\x00\x12\x14\n\x10\x46TRACE_STATUS_OK\x10\x01\x12\'\n#FTRACE_STATUS_UNEXPECTED_READ_ERROR\x10\x02\x12#\n\x1f\x46TRACE_STATUS_PARTIAL_PAGE_READ\x10\x03\x12)\n%FTRACE_STATUS_ABI_INVALID_PAGE_HEADER\x10\x04\x12(\n$FTRACE_STATUS_ABI_SHORT_EVENT_HEADER\x10\x05\x12\"\n\x1e\x46TRACE_STATUS_ABI_NULL_PADDING\x10\x06\x12*\n&FTRACE_STATUS_ABI_SHORT_PADDING_LENGTH\x10\x07\x12,\n(FTRACE_STATUS_ABI_INVALID_PADDING_LENGTH\x10\x08\x12\'\n#FTRACE_STATUS_ABI_SHORT_TIME_EXTEND\x10\t\x12&\n\"FTRACE_STATUS_ABI_SHORT_TIME_STAMP\x10\n\x12\'\n#FTRACE_STATUS_ABI_SHORT_DATA_LENGTH\x10\x0b\x12&\n\"FTRACE_STATUS_ABI_ZERO_DATA_LENGTH\x10\x0c\x12)\n%FTRACE_STATUS_ABI_INVALID_DATA_LENGTH\x10\r\x12$\n FTRACE_STATUS_ABI_SHORT_EVENT_ID\x10\x0e\x12\"\n\x1e\x46TRACE_STATUS_ABI_END_OVERFLOW\x10\x0f\x12%\n!FTRACE_STATUS_SHORT_COMPACT_EVENT\x10\x10\x12\x1f\n\x1b\x46TRACE_STATUS_INVALID_EVENT\x10\x11*\x91\x01\n\x0b\x46traceClock\x12\x1c\n\x18\x46TRACE_CLOCK_UNSPECIFIED\x10\x00\x12\x18\n\x14\x46TRACE_CLOCK_UNKNOWN\x10\x01\x12\x17\n\x13\x46TRACE_CLOCK_GLOBAL\x10\x02\x12\x16\n\x12\x46TRACE_CLOCK_LOCAL\x10\x03\x12\x19\n\x15\x46TRACE_CLOCK_MONO_RAW\x10\x04*\xb0\x05\n\x1f\x43hromeCompositorSchedulerAction\x12#\n\x1f\x43\x43_SCHEDULER_ACTION_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43\x43_SCHEDULER_ACTION_NONE\x10\x01\x12-\n)CC_SCHEDULER_ACTION_SEND_BEGIN_MAIN_FRAME\x10\x02\x12\x1e\n\x1a\x43\x43_SCHEDULER_ACTION_COMMIT\x10\x03\x12*\n&CC_SCHEDULER_ACTION_ACTIVATE_SYNC_TREE\x10\x04\x12(\n$CC_SCHEDULER_ACTION_DRAW_IF_POSSIBLE\x10\x05\x12#\n\x1f\x43\x43_SCHEDULER_ACTION_DRAW_FORCED\x10\x06\x12\"\n\x1e\x43\x43_SCHEDULER_ACTION_DRAW_ABORT\x10\x07\x12<\n8CC_SCHEDULER_ACTION_BEGIN_LAYER_TREE_FRAME_SINK_CREATION\x10\x08\x12%\n!CC_SCHEDULER_ACTION_PREPARE_TILES\x10\t\x12\x38\n4CC_SCHEDULER_ACTION_INVALIDATE_LAYER_TREE_FRAME_SINK\x10\n\x12\x36\n2CC_SCHEDULER_ACTION_PERFORM_IMPL_SIDE_INVALIDATION\x10\x0b\x12\x42\n>CC_SCHEDULER_ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_EXPECTED_UNTIL\x10\x0c\x12\x41\n=CC_SCHEDULER_ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_EXPECTED_SOON\x10\r*}\n\x0e\x43hromeRAILMode\x12\x12\n\x0eRAIL_MODE_NONE\x10\x00\x12\x16\n\x12RAIL_MODE_RESPONSE\x10\x01\x12\x17\n\x13RAIL_MODE_ANIMATION\x10\x02\x12\x12\n\x0eRAIL_MODE_IDLE\x10\x03\x12\x12\n\x0eRAIL_MODE_LOAD\x10\x04\x42+Z)github.com/google/perfetto/perfetto_proto') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -126,6 +126,10 @@ _globals['_DATASOURCECONFIG'].fields_by_name['journald_config']._serialized_options = b'(\001' _globals['_DATASOURCECONFIG'].fields_by_name['display_video_config']._loaded_options = None _globals['_DATASOURCECONFIG'].fields_by_name['display_video_config']._serialized_options = b'(\001' + _globals['_DATASOURCECONFIG'].fields_by_name['chromium_stack_sampling_profiler']._loaded_options = None + _globals['_DATASOURCECONFIG'].fields_by_name['chromium_stack_sampling_profiler']._serialized_options = b'(\001' + _globals['_DATASOURCECONFIG'].fields_by_name['chromium_sampling_heap_profiler']._loaded_options = None + _globals['_DATASOURCECONFIG'].fields_by_name['chromium_sampling_heap_profiler']._serialized_options = b'(\001' _globals['_DATASOURCECONFIG'].fields_by_name['qnx_config']._loaded_options = None _globals['_DATASOURCECONFIG'].fields_by_name['qnx_config']._serialized_options = b'(\001' _globals['_TRACECONFIG_GUARDRAILOVERRIDES'].fields_by_name['max_upload_per_day_bytes']._loaded_options = None @@ -238,32 +242,32 @@ _globals['_PROCESSTRACKNAMETRANSLATIONTABLE_RAWTODEOBFUSCATEDNAMEENTRY']._serialized_options = b'8\001' _globals['_CHROMESTUDYTRANSLATIONTABLE_HASHTONAMEENTRY']._loaded_options = None _globals['_CHROMESTUDYTRANSLATIONTABLE_HASHTONAMEENTRY']._serialized_options = b'8\001' - _globals['_VMCURSORENUM']._serialized_start=218462 - _globals['_VMCURSORENUM']._serialized_end=218561 - _globals['_BUILTINCLOCK']._serialized_start=218564 - _globals['_BUILTINCLOCK']._serialized_end=218909 - _globals['_SEMANTICTYPE']._serialized_start=218911 - _globals['_SEMANTICTYPE']._serialized_end=219033 - _globals['_ANDROIDLOGID']._serialized_start=219036 - _globals['_ANDROIDLOGID']._serialized_end=219178 - _globals['_ANDROIDLOGPRIORITY']._serialized_start=219181 - _globals['_ANDROIDLOGPRIORITY']._serialized_end=219336 - _globals['_PROTOLOGLEVEL']._serialized_start=219339 - _globals['_PROTOLOGLEVEL']._serialized_end=219538 - _globals['_ATOMID']._serialized_start=219542 - _globals['_ATOMID']._serialized_end=268169 - _globals['_MEMINFOCOUNTERS']._serialized_start=268172 - _globals['_MEMINFOCOUNTERS']._serialized_end=269105 - _globals['_VMSTATCOUNTERS']._serialized_start=269108 - _globals['_VMSTATCOUNTERS']._serialized_end=274741 - _globals['_FTRACEPARSESTATUS']._serialized_start=274744 - _globals['_FTRACEPARSESTATUS']._serialized_end=275456 - _globals['_FTRACECLOCK']._serialized_start=275459 - _globals['_FTRACECLOCK']._serialized_end=275604 - _globals['_CHROMECOMPOSITORSCHEDULERACTION']._serialized_start=275607 - _globals['_CHROMECOMPOSITORSCHEDULERACTION']._serialized_end=276295 - _globals['_CHROMERAILMODE']._serialized_start=276297 - _globals['_CHROMERAILMODE']._serialized_end=276422 + _globals['_VMCURSORENUM']._serialized_start=218832 + _globals['_VMCURSORENUM']._serialized_end=218931 + _globals['_BUILTINCLOCK']._serialized_start=218934 + _globals['_BUILTINCLOCK']._serialized_end=219279 + _globals['_SEMANTICTYPE']._serialized_start=219281 + _globals['_SEMANTICTYPE']._serialized_end=219403 + _globals['_ANDROIDLOGID']._serialized_start=219406 + _globals['_ANDROIDLOGID']._serialized_end=219548 + _globals['_ANDROIDLOGPRIORITY']._serialized_start=219551 + _globals['_ANDROIDLOGPRIORITY']._serialized_end=219706 + _globals['_PROTOLOGLEVEL']._serialized_start=219709 + _globals['_PROTOLOGLEVEL']._serialized_end=219908 + _globals['_ATOMID']._serialized_start=219912 + _globals['_ATOMID']._serialized_end=268539 + _globals['_MEMINFOCOUNTERS']._serialized_start=268542 + _globals['_MEMINFOCOUNTERS']._serialized_end=269475 + _globals['_VMSTATCOUNTERS']._serialized_start=269478 + _globals['_VMSTATCOUNTERS']._serialized_end=275111 + _globals['_FTRACEPARSESTATUS']._serialized_start=275114 + _globals['_FTRACEPARSESTATUS']._serialized_end=275826 + _globals['_FTRACECLOCK']._serialized_start=275829 + _globals['_FTRACECLOCK']._serialized_end=275974 + _globals['_CHROMECOMPOSITORSCHEDULERACTION']._serialized_start=275977 + _globals['_CHROMECOMPOSITORSCHEDULERACTION']._serialized_end=276665 + _globals['_CHROMERAILMODE']._serialized_start=276667 + _globals['_CHROMERAILMODE']._serialized_end=276792 _globals['_FTRACEDESCRIPTOR']._serialized_start=64 _globals['_FTRACEDESCRIPTOR']._serialized_end=212 _globals['_FTRACEDESCRIPTOR_ATRACECATEGORY']._serialized_start=161 @@ -392,2150 +396,2154 @@ _globals['_CHROMIUMHISTOGRAMSAMPLESCONFIG']._serialized_end=9346 _globals['_CHROMIUMHISTOGRAMSAMPLESCONFIG_HISTOGRAMSAMPLE']._serialized_start=9267 _globals['_CHROMIUMHISTOGRAMSAMPLESCONFIG_HISTOGRAMSAMPLE']._serialized_end=9346 - _globals['_CHROMIUMSYSTEMMETRICSCONFIG']._serialized_start=9348 - _globals['_CHROMIUMSYSTEMMETRICSCONFIG']._serialized_end=9407 - _globals['_V8CONFIG']._serialized_start=9409 - _globals['_V8CONFIG']._serialized_end=9473 - _globals['_ETWCONFIG']._serialized_start=9476 - _globals['_ETWCONFIG']._serialized_end=9796 - _globals['_ETWCONFIG_KERNELFLAG']._serialized_start=9755 - _globals['_ETWCONFIG_KERNELFLAG']._serialized_end=9796 - _globals['_FROZENFTRACECONFIG']._serialized_start=9798 - _globals['_FROZENFTRACECONFIG']._serialized_end=9841 - _globals['_FTRACECONFIG']._serialized_start=9844 - _globals['_FTRACECONFIG']._serialized_end=11710 - _globals['_FTRACECONFIG_COMPACTSCHEDCONFIG']._serialized_start=10944 - _globals['_FTRACECONFIG_COMPACTSCHEDCONFIG']._serialized_end=10981 - _globals['_FTRACECONFIG_PRINTFILTER']._serialized_start=10984 - _globals['_FTRACECONFIG_PRINTFILTER']._serialized_end=11242 - _globals['_FTRACECONFIG_PRINTFILTER_RULE']._serialized_start=11063 - _globals['_FTRACECONFIG_PRINTFILTER_RULE']._serialized_end=11242 - _globals['_FTRACECONFIG_PRINTFILTER_RULE_ATRACEMESSAGE']._serialized_start=11188 - _globals['_FTRACECONFIG_PRINTFILTER_RULE_ATRACEMESSAGE']._serialized_end=11233 - _globals['_FTRACECONFIG_KPROBEEVENT']._serialized_start=11245 - _globals['_FTRACECONFIG_KPROBEEVENT']._serialized_end=11453 - _globals['_FTRACECONFIG_KPROBEEVENT_KPROBETYPE']._serialized_start=11343 - _globals['_FTRACECONFIG_KPROBEEVENT_KPROBETYPE']._serialized_end=11453 - _globals['_FTRACECONFIG_TRACEFSOPTION']._serialized_start=11456 - _globals['_FTRACECONFIG_TRACEFSOPTION']._serialized_end=11618 - _globals['_FTRACECONFIG_TRACEFSOPTION_STATE']._serialized_start=11553 - _globals['_FTRACECONFIG_TRACEFSOPTION_STATE']._serialized_end=11618 - _globals['_FTRACECONFIG_KSYMSMEMPOLICY']._serialized_start=11620 - _globals['_FTRACECONFIG_KSYMSMEMPOLICY']._serialized_end=11704 - _globals['_GPUCOUNTERCONFIG']._serialized_start=11713 - _globals['_GPUCOUNTERCONFIG']._serialized_end=12584 - _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG']._serialized_start=11963 - _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG']._serialized_end=12554 - _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYNAMEFILTER']._serialized_start=12277 - _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYNAMEFILTER']._serialized_end=12508 - _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYNAMEFILTER_NAMEBASE']._serialized_start=12427 - _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYNAMEFILTER_NAMEBASE']._serialized_end=12508 - _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYRANGE']._serialized_start=12510 - _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYRANGE']._serialized_end=12554 - _globals['_GPURENDERSTAGESCONFIG']._serialized_start=12586 - _globals['_GPURENDERSTAGESCONFIG']._serialized_end=12678 - _globals['_VULKANMEMORYCONFIG']._serialized_start=12680 - _globals['_VULKANMEMORYCONFIG']._serialized_end=12770 - _globals['_INODEFILECONFIG']._serialized_start=12773 - _globals['_INODEFILECONFIG']._serialized_end=13064 - _globals['_INODEFILECONFIG_MOUNTPOINTMAPPINGENTRY']._serialized_start=13000 - _globals['_INODEFILECONFIG_MOUNTPOINTMAPPINGENTRY']._serialized_end=13064 - _globals['_CONSOLECONFIG']._serialized_start=13067 - _globals['_CONSOLECONFIG']._serialized_end=13232 - _globals['_CONSOLECONFIG_OUTPUT']._serialized_start=13162 - _globals['_CONSOLECONFIG_OUTPUT']._serialized_end=13232 - _globals['_INTERCEPTORCONFIG']._serialized_start=13234 - _globals['_INTERCEPTORCONFIG']._serialized_end=13323 - _globals['_SYSTEMDJOURNALDCONFIG']._serialized_start=13325 - _globals['_SYSTEMDJOURNALDCONFIG']._serialized_end=13416 - _globals['_ANDROIDPOWERCONFIG']._serialized_start=13419 - _globals['_ANDROIDPOWERCONFIG']._serialized_end=13867 - _globals['_ANDROIDPOWERCONFIG_BATTERYCOUNTERS']._serialized_start=13660 - _globals['_ANDROIDPOWERCONFIG_BATTERYCOUNTERS']._serialized_end=13867 - _globals['_PRIORITYBOOSTCONFIG']._serialized_start=13870 - _globals['_PRIORITYBOOSTCONFIG']._serialized_end=14061 - _globals['_PRIORITYBOOSTCONFIG_BOOSTPOLICY']._serialized_start=13977 - _globals['_PRIORITYBOOSTCONFIG_BOOSTPOLICY']._serialized_end=14061 - _globals['_PROCESSSTATSCONFIG']._serialized_start=14064 - _globals['_PROCESSSTATSCONFIG']._serialized_end=14555 - _globals['_PROCESSSTATSCONFIG_QUIRKS']._serialized_start=14458 - _globals['_PROCESSSTATSCONFIG_QUIRKS']._serialized_end=14543 - _globals['_HEAPPROFDCONFIG']._serialized_start=14558 - _globals['_HEAPPROFDCONFIG']._serialized_end=15402 - _globals['_HEAPPROFDCONFIG_CONTINUOUSDUMPCONFIG']._serialized_start=15325 - _globals['_HEAPPROFDCONFIG_CONTINUOUSDUMPCONFIG']._serialized_end=15396 - _globals['_SMAPSCONFIG']._serialized_start=15405 - _globals['_SMAPSCONFIG']._serialized_end=15885 - _globals['_SMAPSCONFIG_VMAFIELD']._serialized_start=15564 - _globals['_SMAPSCONFIG_VMAFIELD']._serialized_end=15885 - _globals['_REDACTIONRULE']._serialized_start=15888 - _globals['_REDACTIONRULE']._serialized_end=16198 - _globals['_REDACTIONRULE_MATCHMODE']._serialized_start=16086 - _globals['_REDACTIONRULE_MATCHMODE']._serialized_end=16198 - _globals['_JAVAHPROFCONFIG']._serialized_start=16201 - _globals['_JAVAHPROFCONFIG']._serialized_end=16666 - _globals['_JAVAHPROFCONFIG_CONTINUOUSDUMPCONFIG']._serialized_start=16562 - _globals['_JAVAHPROFCONFIG_CONTINUOUSDUMPCONFIG']._serialized_end=16666 - _globals['_PERFEVENTS']._serialized_start=16669 - _globals['_PERFEVENTS']._serialized_end=18022 - _globals['_PERFEVENTS_TIMEBASE']._serialized_start=16684 - _globals['_PERFEVENTS_TIMEBASE']._serialized_end=17097 - _globals['_PERFEVENTS_TRACEPOINT']._serialized_start=17099 - _globals['_PERFEVENTS_TRACEPOINT']._serialized_end=17141 - _globals['_PERFEVENTS_RAWEVENT']._serialized_start=17143 - _globals['_PERFEVENTS_RAWEVENT']._serialized_end=17235 - _globals['_PERFEVENTS_COUNTER']._serialized_start=17238 - _globals['_PERFEVENTS_COUNTER']._serialized_end=17726 - _globals['_PERFEVENTS_PERFCLOCK']._serialized_start=17729 - _globals['_PERFEVENTS_PERFCLOCK']._serialized_end=17870 - _globals['_PERFEVENTS_EVENTMODIFIER']._serialized_start=17873 - _globals['_PERFEVENTS_EVENTMODIFIER']._serialized_end=18022 - _globals['_FOLLOWEREVENT']._serialized_start=18025 - _globals['_FOLLOWEREVENT']._serialized_end=18302 - _globals['_PERFEVENTCONFIG']._serialized_start=18305 - _globals['_PERFEVENTCONFIG']._serialized_end=19462 - _globals['_PERFEVENTCONFIG_CALLSTACKSAMPLING']._serialized_start=19002 - _globals['_PERFEVENTCONFIG_CALLSTACKSAMPLING']._serialized_end=19165 - _globals['_PERFEVENTCONFIG_SCOPE']._serialized_start=19168 - _globals['_PERFEVENTCONFIG_SCOPE']._serialized_end=19328 - _globals['_PERFEVENTCONFIG_UNWINDMODE']._serialized_start=19330 - _globals['_PERFEVENTCONFIG_UNWINDMODE']._serialized_end=19456 - _globals['_PROTOVMCONFIG']._serialized_start=19464 - _globals['_PROTOVMCONFIG']._serialized_end=19504 - _globals['_QNXCONFIG']._serialized_start=19507 - _globals['_QNXCONFIG']._serialized_end=19698 - _globals['_STATSDTRACINGCONFIG']._serialized_start=19701 - _globals['_STATSDTRACINGCONFIG']._serialized_end=19855 - _globals['_STATSDPULLATOMCONFIG']._serialized_start=19858 - _globals['_STATSDPULLATOMCONFIG']._serialized_end=19998 - _globals['_SYSSTATSCONFIG']._serialized_start=20001 - _globals['_SYSSTATSCONFIG']._serialized_end=20645 - _globals['_SYSSTATSCONFIG_STATCOUNTERS']._serialized_start=20522 - _globals['_SYSSTATSCONFIG_STATCOUNTERS']._serialized_end=20645 - _globals['_SYSTEMINFOCONFIG']._serialized_start=20647 - _globals['_SYSTEMINFOCONFIG']._serialized_end=20684 - _globals['_TESTCONFIG']._serialized_start=20687 - _globals['_TESTCONFIG']._serialized_end=21212 - _globals['_TESTCONFIG_DUMMYFIELDS']._serialized_start=20889 - _globals['_TESTCONFIG_DUMMYFIELDS']._serialized_end=21212 - _globals['_TRACKEVENTCONFIG']._serialized_start=21215 - _globals['_TRACKEVENTCONFIG']._serialized_end=21553 - _globals['_DATASOURCECONFIG']._serialized_start=21556 - _globals['_DATASOURCECONFIG']._serialized_end=25524 - _globals['_DATASOURCECONFIG_SESSIONINITIATOR']._serialized_start=25256 - _globals['_DATASOURCECONFIG_SESSIONINITIATOR']._serialized_end=25347 - _globals['_DATASOURCECONFIG_BUFFEREXHAUSTEDPOLICY']._serialized_start=25350 - _globals['_DATASOURCECONFIG_BUFFEREXHAUSTEDPOLICY']._serialized_end=25511 - _globals['_TRACECONFIG']._serialized_start=25527 - _globals['_TRACECONFIG']._serialized_end=31387 - _globals['_TRACECONFIG_BUFFERCONFIG']._serialized_start=27636 - _globals['_TRACECONFIG_BUFFERCONFIG']._serialized_end=28040 - _globals['_TRACECONFIG_BUFFERCONFIG_FILLPOLICY']._serialized_start=27900 - _globals['_TRACECONFIG_BUFFERCONFIG_FILLPOLICY']._serialized_end=27959 - _globals['_TRACECONFIG_BUFFERCONFIG_EXPERIMENTALMODE']._serialized_start=27961 - _globals['_TRACECONFIG_BUFFERCONFIG_EXPERIMENTALMODE']._serialized_end=28028 - _globals['_TRACECONFIG_DATASOURCE']._serialized_start=28043 - _globals['_TRACECONFIG_DATASOURCE']._serialized_end=28201 - _globals['_TRACECONFIG_BUILTINDATASOURCE']._serialized_start=28204 - _globals['_TRACECONFIG_BUILTINDATASOURCE']._serialized_end=28604 - _globals['_TRACECONFIG_PRODUCERCONFIG']._serialized_start=28606 - _globals['_TRACECONFIG_PRODUCERCONFIG']._serialized_end=28688 - _globals['_TRACECONFIG_STATSDMETADATA']._serialized_start=28691 - _globals['_TRACECONFIG_STATSDMETADATA']._serialized_end=28833 - _globals['_TRACECONFIG_GUARDRAILOVERRIDES']._serialized_start=28835 - _globals['_TRACECONFIG_GUARDRAILOVERRIDES']._serialized_end=28929 - _globals['_TRACECONFIG_TRIGGERCONFIG']._serialized_start=28932 - _globals['_TRACECONFIG_TRIGGERCONFIG']._serialized_end=29390 - _globals['_TRACECONFIG_TRIGGERCONFIG_TRIGGER']._serialized_start=29166 - _globals['_TRACECONFIG_TRIGGERCONFIG_TRIGGER']._serialized_end=29289 - _globals['_TRACECONFIG_TRIGGERCONFIG_TRIGGERMODE']._serialized_start=29291 - _globals['_TRACECONFIG_TRIGGERCONFIG_TRIGGERMODE']._serialized_end=29384 - _globals['_TRACECONFIG_INCREMENTALSTATECONFIG']._serialized_start=29392 - _globals['_TRACECONFIG_INCREMENTALSTATECONFIG']._serialized_end=29441 - _globals['_TRACECONFIG_COMPRESSIONCONFIG']._serialized_start=29444 - _globals['_TRACECONFIG_COMPRESSIONCONFIG']._serialized_end=29637 - _globals['_TRACECONFIG_COMPRESSIONCONFIG_DEFLATE']._serialized_start=29605 - _globals['_TRACECONFIG_COMPRESSIONCONFIG_DEFLATE']._serialized_end=29614 - _globals['_TRACECONFIG_COMPRESSIONCONFIG_ZSTD']._serialized_start=29616 - _globals['_TRACECONFIG_COMPRESSIONCONFIG_ZSTD']._serialized_end=29637 - _globals['_TRACECONFIG_INCIDENTREPORTCONFIG']._serialized_start=29640 - _globals['_TRACECONFIG_INCIDENTREPORTCONFIG']._serialized_end=29791 - _globals['_TRACECONFIG_TRACEFILTER']._serialized_start=29794 - _globals['_TRACECONFIG_TRACEFILTER']._serialized_end=30582 - _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERRULE']._serialized_start=30061 - _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERRULE']._serialized_end=30283 - _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERCHAIN']._serialized_start=30285 - _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERCHAIN']._serialized_end=30378 - _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERPOLICY']._serialized_start=30381 - _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERPOLICY']._serialized_end=30582 - _globals['_TRACECONFIG_ANDROIDREPORTCONFIG']._serialized_start=30585 - _globals['_TRACECONFIG_ANDROIDREPORTCONFIG']._serialized_end=30736 - _globals['_TRACECONFIG_CMDTRACESTARTDELAY']._serialized_start=30738 - _globals['_TRACECONFIG_CMDTRACESTARTDELAY']._serialized_end=30802 - _globals['_TRACECONFIG_SESSIONSEMAPHORE']._serialized_start=30804 - _globals['_TRACECONFIG_SESSIONSEMAPHORE']._serialized_end=30869 - _globals['_TRACECONFIG_LOCKDOWNMODEOPERATION']._serialized_start=30871 - _globals['_TRACECONFIG_LOCKDOWNMODEOPERATION']._serialized_end=30956 - _globals['_TRACECONFIG_COMPRESSIONTYPE']._serialized_start=30958 - _globals['_TRACECONFIG_COMPRESSIONTYPE']._serialized_end=31039 - _globals['_TRACECONFIG_STATSDLOGGING']._serialized_start=31041 - _globals['_TRACECONFIG_STATSDLOGGING']._serialized_end=31145 - _globals['_TRACECONFIG_WRITEFLUSHMODE']._serialized_start=31147 - _globals['_TRACECONFIG_WRITEFLUSHMODE']._serialized_end=31265 - _globals['_TRACECONFIG_FFLUSHMODE']._serialized_start=31267 - _globals['_TRACECONFIG_FFLUSHMODE']._serialized_end=31344 - _globals['_UTSNAME']._serialized_start=31389 - _globals['_UTSNAME']._serialized_end=31466 - _globals['_SYSTEMINFO']._serialized_start=31469 - _globals['_SYSTEMINFO']._serialized_end=31967 - _globals['_TRACESTATS']._serialized_start=31970 - _globals['_TRACESTATS']._serialized_end=33555 - _globals['_TRACESTATS_BUFFERSTATS']._serialized_start=32605 - _globals['_TRACESTATS_BUFFERSTATS']._serialized_end=33159 - _globals['_TRACESTATS_WRITERSTATS']._serialized_start=33162 - _globals['_TRACESTATS_WRITERSTATS']._serialized_end=33297 - _globals['_TRACESTATS_FILTERSTATS']._serialized_start=33300 - _globals['_TRACESTATS_FILTERSTATS']._serialized_end=33454 - _globals['_TRACESTATS_FINALFLUSHOUTCOME']._serialized_start=33456 - _globals['_TRACESTATS_FINALFLUSHOUTCOME']._serialized_end=33555 - _globals['_ANDROIDAFLAGS']._serialized_start=33558 - _globals['_ANDROIDAFLAGS']._serialized_end=34540 - _globals['_ANDROIDAFLAGS_FLAG']._serialized_start=33643 - _globals['_ANDROIDAFLAGS_FLAG']._serialized_end=34029 - _globals['_ANDROIDAFLAGS_FLAGPERMISSION']._serialized_start=34031 - _globals['_ANDROIDAFLAGS_FLAGPERMISSION']._serialized_end=34143 - _globals['_ANDROIDAFLAGS_VALUEPICKEDFROM']._serialized_start=34146 - _globals['_ANDROIDAFLAGS_VALUEPICKEDFROM']._serialized_end=34288 - _globals['_ANDROIDAFLAGS_FLAGSTORAGEBACKEND']._serialized_start=34291 - _globals['_ANDROIDAFLAGS_FLAGSTORAGEBACKEND']._serialized_end=34455 - _globals['_ANDROIDAFLAGS_FLAGTYPE']._serialized_start=34457 - _globals['_ANDROIDAFLAGS_FLAGTYPE']._serialized_end=34540 - _globals['_ANDROIDGAMEINTERVENTIONLIST']._serialized_start=34543 - _globals['_ANDROIDGAMEINTERVENTIONLIST']._serialized_end=34942 - _globals['_ANDROIDGAMEINTERVENTIONLIST_GAMEMODEINFO']._serialized_start=34700 - _globals['_ANDROIDGAMEINTERVENTIONLIST_GAMEMODEINFO']._serialized_end=34790 - _globals['_ANDROIDGAMEINTERVENTIONLIST_GAMEPACKAGEINFO']._serialized_start=34793 - _globals['_ANDROIDGAMEINTERVENTIONLIST_GAMEPACKAGEINFO']._serialized_end=34942 - _globals['_ANDROIDLOGPACKET']._serialized_start=34945 - _globals['_ANDROIDLOGPACKET']._serialized_end=35507 - _globals['_ANDROIDLOGPACKET_LOGEVENT']._serialized_start=35082 - _globals['_ANDROIDLOGPACKET_LOGEVENT']._serialized_end=35438 - _globals['_ANDROIDLOGPACKET_LOGEVENT_ARG']._serialized_start=35342 - _globals['_ANDROIDLOGPACKET_LOGEVENT_ARG']._serialized_end=35438 - _globals['_ANDROIDLOGPACKET_STATS']._serialized_start=35440 - _globals['_ANDROIDLOGPACKET_STATS']._serialized_end=35507 - _globals['_ANDROIDSYSTEMPROPERTY']._serialized_start=35510 - _globals['_ANDROIDSYSTEMPROPERTY']._serialized_end=35649 - _globals['_ANDROIDSYSTEMPROPERTY_PROPERTYVALUE']._serialized_start=35605 - _globals['_ANDROIDSYSTEMPROPERTY_PROPERTYVALUE']._serialized_end=35649 - _globals['_CPUPERUIDDATA']._serialized_start=35651 - _globals['_CPUPERUIDDATA']._serialized_end=35733 - _globals['_GRAPHICSFRAMEEVENT']._serialized_start=35736 - _globals['_GRAPHICSFRAMEEVENT']._serialized_end=36233 - _globals['_GRAPHICSFRAMEEVENT_BUFFEREVENT']._serialized_start=35830 - _globals['_GRAPHICSFRAMEEVENT_BUFFEREVENT']._serialized_end=35992 - _globals['_GRAPHICSFRAMEEVENT_BUFFEREVENTTYPE']._serialized_start=35995 - _globals['_GRAPHICSFRAMEEVENT_BUFFEREVENTTYPE']._serialized_end=36233 - _globals['_INITIALDISPLAYSTATE']._serialized_start=36235 - _globals['_INITIALDISPLAYSTATE']._serialized_end=36299 - _globals['_KERNELWAKELOCKDATA']._serialized_start=36302 - _globals['_KERNELWAKELOCKDATA']._serialized_end=36680 - _globals['_KERNELWAKELOCKDATA_WAKELOCK']._serialized_start=36465 - _globals['_KERNELWAKELOCKDATA_WAKELOCK']._serialized_end=36680 - _globals['_KERNELWAKELOCKDATA_WAKELOCK_TYPE']._serialized_start=36595 - _globals['_KERNELWAKELOCKDATA_WAKELOCK_TYPE']._serialized_end=36680 - _globals['_PACKAGESLIST']._serialized_start=36683 - _globals['_PACKAGESLIST']._serialized_end=36915 - _globals['_PACKAGESLIST_PACKAGEINFO']._serialized_start=36801 - _globals['_PACKAGESLIST_PACKAGEINFO']._serialized_end=36915 - _globals['_PIXELMODEMEVENTS']._serialized_start=36917 - _globals['_PIXELMODEMEVENTS']._serialized_end=36977 - _globals['_PIXELMODEMTOKENDATABASE']._serialized_start=36979 - _globals['_PIXELMODEMTOKENDATABASE']._serialized_end=37022 - _globals['_ANDROIDUSERLIST']._serialized_start=37025 - _globals['_ANDROIDUSERLIST']._serialized_end=37154 - _globals['_ANDROIDUSERLIST_USERINFO']._serialized_start=37117 - _globals['_ANDROIDUSERLIST_USERINFO']._serialized_end=37154 - _globals['_CHROMEBENCHMARKMETADATA']._serialized_start=37157 - _globals['_CHROMEBENCHMARKMETADATA']._serialized_end=37399 - _globals['_CHROMEMETADATAPACKET']._serialized_start=37402 - _globals['_CHROMEMETADATAPACKET']._serialized_end=37762 - _globals['_CHROMEMETADATAPACKET_FINCHHASH']._serialized_start=37722 - _globals['_CHROMEMETADATAPACKET_FINCHHASH']._serialized_end=37762 - _globals['_BACKGROUNDTRACINGMETADATA']._serialized_start=37765 - _globals['_BACKGROUNDTRACINGMETADATA']._serialized_end=38810 - _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE']._serialized_start=37981 - _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE']._serialized_end=38810 - _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_HISTOGRAMRULE']._serialized_start=38285 - _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_HISTOGRAMRULE']._serialized_end=38391 - _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_NAMEDRULE']._serialized_start=38394 - _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_NAMEDRULE']._serialized_end=38672 - _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_NAMEDRULE_EVENTTYPE']._serialized_start=38539 - _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_NAMEDRULE_EVENTTYPE']._serialized_end=38672 - _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_TRIGGERTYPE']._serialized_start=38675 - _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_TRIGGERTYPE']._serialized_end=38810 - _globals['_CHROMETRACEDVALUE']._serialized_start=38813 - _globals['_CHROMETRACEDVALUE']._serialized_end=39152 - _globals['_CHROMETRACEDVALUE_NESTEDTYPE']._serialized_start=39119 - _globals['_CHROMETRACEDVALUE_NESTEDTYPE']._serialized_end=39152 - _globals['_CHROMESTRINGTABLEENTRY']._serialized_start=39154 - _globals['_CHROMESTRINGTABLEENTRY']._serialized_end=39208 - _globals['_CHROMETRACEEVENT']._serialized_start=39211 - _globals['_CHROMETRACEEVENT']._serialized_end=39852 - _globals['_CHROMETRACEEVENT_ARG']._serialized_start=39584 - _globals['_CHROMETRACEEVENT_ARG']._serialized_end=39852 - _globals['_CHROMEMETADATA']._serialized_start=39855 - _globals['_CHROMEMETADATA']._serialized_end=39983 - _globals['_CHROMELEGACYJSONTRACE']._serialized_start=39986 - _globals['_CHROMELEGACYJSONTRACE']._serialized_end=40134 - _globals['_CHROMELEGACYJSONTRACE_TRACETYPE']._serialized_start=40089 - _globals['_CHROMELEGACYJSONTRACE_TRACETYPE']._serialized_end=40134 - _globals['_CHROMEEVENTBUNDLE']._serialized_start=40137 - _globals['_CHROMEEVENTBUNDLE']._serialized_end=40432 - _globals['_CHROMETRIGGER']._serialized_start=40434 - _globals['_CHROMETRIGGER']._serialized_end=40515 - _globals['_V8STRING']._serialized_start=40517 - _globals['_V8STRING']._serialized_end=40603 - _globals['_INTERNEDV8STRING']._serialized_start=40605 - _globals['_INTERNEDV8STRING']._serialized_end=40712 - _globals['_INTERNEDV8JSSCRIPT']._serialized_start=40715 - _globals['_INTERNEDV8JSSCRIPT']._serialized_end=41040 - _globals['_INTERNEDV8JSSCRIPT_TYPE']._serialized_start=40910 - _globals['_INTERNEDV8JSSCRIPT_TYPE']._serialized_end=41040 - _globals['_INTERNEDV8WASMSCRIPT']._serialized_start=41042 - _globals['_INTERNEDV8WASMSCRIPT']._serialized_end=41129 - _globals['_INTERNEDV8JSFUNCTION']._serialized_start=41132 - _globals['_INTERNEDV8JSFUNCTION']._serialized_end=42241 - _globals['_INTERNEDV8JSFUNCTION_KIND']._serialized_start=41359 - _globals['_INTERNEDV8JSFUNCTION_KIND']._serialized_end=42241 - _globals['_INTERNEDV8ISOLATE']._serialized_start=42244 - _globals['_INTERNEDV8ISOLATE']._serialized_end=42571 - _globals['_INTERNEDV8ISOLATE_CODERANGE']._serialized_start=42452 - _globals['_INTERNEDV8ISOLATE_CODERANGE']._serialized_end=42571 - _globals['_V8JSCODE']._serialized_start=42574 - _globals['_V8JSCODE']._serialized_end=43046 - _globals['_V8JSCODE_TIER']._serialized_start=42896 - _globals['_V8JSCODE_TIER']._serialized_end=43016 - _globals['_V8INTERNALCODE']._serialized_start=43049 - _globals['_V8INTERNALCODE']._serialized_end=43530 - _globals['_V8INTERNALCODE_TYPE']._serialized_start=43272 - _globals['_V8INTERNALCODE_TYPE']._serialized_end=43530 - _globals['_V8WASMCODE']._serialized_start=43533 - _globals['_V8WASMCODE']._serialized_end=43856 - _globals['_V8WASMCODE_TIER']._serialized_start=43795 - _globals['_V8WASMCODE_TIER']._serialized_end=43856 - _globals['_V8REGEXPCODE']._serialized_start=43859 - _globals['_V8REGEXPCODE']._serialized_end=44035 - _globals['_V8CODEMOVE']._serialized_start=44038 - _globals['_V8CODEMOVE']._serialized_end=44263 - _globals['_V8CODEDEFAULTS']._serialized_start=44265 - _globals['_V8CODEDEFAULTS']._serialized_end=44294 - _globals['_CLOCKSNAPSHOT']._serialized_start=44297 - _globals['_CLOCKSNAPSHOT']._serialized_end=44699 - _globals['_CLOCKSNAPSHOT_CLOCK']._serialized_start=44429 - _globals['_CLOCKSNAPSHOT_CLOCK']._serialized_end=44699 - _globals['_CLOCKSNAPSHOT_CLOCK_BUILTINCLOCKS']._serialized_start=44528 - _globals['_CLOCKSNAPSHOT_CLOCK_BUILTINCLOCKS']._serialized_end=44699 - _globals['_CSWITCHETWEVENT']._serialized_start=44702 - _globals['_CSWITCHETWEVENT']._serialized_end=46320 - _globals['_CSWITCHETWEVENT_OLDTHREADWAITREASON']._serialized_start=45278 - _globals['_CSWITCHETWEVENT_OLDTHREADWAITREASON']._serialized_end=46023 - _globals['_CSWITCHETWEVENT_OLDTHREADWAITMODE']._serialized_start=46025 - _globals['_CSWITCHETWEVENT_OLDTHREADWAITMODE']._serialized_end=46076 - _globals['_CSWITCHETWEVENT_OLDTHREADSTATE']._serialized_start=46079 - _globals['_CSWITCHETWEVENT_OLDTHREADSTATE']._serialized_end=46214 - _globals['_READYTHREADETWEVENT']._serialized_start=46323 - _globals['_READYTHREADETWEVENT']._serialized_end=46843 - _globals['_READYTHREADETWEVENT_ADJUSTREASON']._serialized_start=46582 - _globals['_READYTHREADETWEVENT_ADJUSTREASON']._serialized_end=46670 - _globals['_READYTHREADETWEVENT_TRACEFLAG']._serialized_start=46672 - _globals['_READYTHREADETWEVENT_TRACEFLAG']._serialized_end=46794 - _globals['_MEMINFOETWEVENT']._serialized_start=46846 - _globals['_MEMINFOETWEVENT']._serialized_end=47246 - _globals['_FILEIOCREATEETWEVENT']._serialized_start=47249 - _globals['_FILEIOCREATEETWEVENT']._serialized_end=47413 - _globals['_FILEIODIRENUMETWEVENT']._serialized_start=47416 - _globals['_FILEIODIRENUMETWEVENT']._serialized_end=47600 - _globals['_FILEIOINFOETWEVENT']._serialized_start=47603 - _globals['_FILEIOINFOETWEVENT']._serialized_end=47749 - _globals['_FILEIOREADWRITEETWEVENT']._serialized_start=47752 - _globals['_FILEIOREADWRITEETWEVENT']._serialized_end=47914 - _globals['_FILEIOSIMPLEOPETWEVENT']._serialized_start=47916 - _globals['_FILEIOSIMPLEOPETWEVENT']._serialized_end=48026 - _globals['_FILEIOOPENDETWEVENT']._serialized_start=48028 - _globals['_FILEIOOPENDETWEVENT']._serialized_end=48105 - _globals['_FILEIOPATHOPERATIONETWEVENT']._serialized_start=48108 - _globals['_FILEIOPATHOPERATIONETWEVENT']._serialized_end=48282 - _globals['_STACKWALKETWEVENT']._serialized_start=48284 - _globals['_STACKWALKETWEVENT']._serialized_end=48343 - _globals['_DISKIOETWEVENT']._serialized_start=48346 - _globals['_DISKIOETWEVENT']._serialized_end=48550 - _globals['_ETWTRACEEVENT']._serialized_start=48553 - _globals['_ETWTRACEEVENT']._serialized_end=49388 - _globals['_ETWTRACEEVENTBUNDLE']._serialized_start=49390 - _globals['_ETWTRACEEVENTBUNDLE']._serialized_end=49471 - _globals['_FILEDESCRIPTORSET']._serialized_start=49473 - _globals['_FILEDESCRIPTORSET']._serialized_end=49544 - _globals['_FILEDESCRIPTORPROTO']._serialized_start=49547 - _globals['_FILEDESCRIPTORPROTO']._serialized_end=49866 - _globals['_DESCRIPTORPROTO']._serialized_start=49869 - _globals['_DESCRIPTORPROTO']._serialized_end=50335 - _globals['_DESCRIPTORPROTO_RESERVEDRANGE']._serialized_start=50280 - _globals['_DESCRIPTORPROTO_RESERVEDRANGE']._serialized_end=50323 - _globals['_UNINTERPRETEDOPTION']._serialized_start=50338 - _globals['_UNINTERPRETEDOPTION']._serialized_end=50624 - _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_start=50573 - _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_end=50624 - _globals['_FIELDOPTIONS']._serialized_start=50626 - _globals['_FIELDOPTIONS']._serialized_end=50725 - _globals['_FIELDDESCRIPTORPROTO']._serialized_start=50728 - _globals['_FIELDDESCRIPTORPROTO']._serialized_end=51415 - _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_start=51030 - _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_end=51340 - _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_start=51342 - _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_end=51409 - _globals['_ONEOFDESCRIPTORPROTO']._serialized_start=51417 - _globals['_ONEOFDESCRIPTORPROTO']._serialized_end=51501 - _globals['_ENUMDESCRIPTORPROTO']._serialized_start=51504 - _globals['_ENUMDESCRIPTORPROTO']._serialized_end=51632 - _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_start=51634 - _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_end=51696 - _globals['_ONEOFOPTIONS']._serialized_start=51698 - _globals['_ONEOFOPTIONS']._serialized_end=51731 - _globals['_EXTENSIONDESCRIPTOR']._serialized_start=51734 - _globals['_EXTENSIONDESCRIPTOR']._serialized_end=51879 - _globals['_INODEFILEMAP']._serialized_start=51882 - _globals['_INODEFILEMAP']._serialized_end=52146 - _globals['_INODEFILEMAP_ENTRY']._serialized_start=52000 - _globals['_INODEFILEMAP_ENTRY']._serialized_end=52146 - _globals['_INODEFILEMAP_ENTRY_TYPE']._serialized_start=52102 - _globals['_INODEFILEMAP_ENTRY_TYPE']._serialized_end=52146 - _globals['_ANDROIDFSDATAREADENDFTRACEEVENT']._serialized_start=52148 - _globals['_ANDROIDFSDATAREADENDFTRACEEVENT']._serialized_end=52225 - _globals['_ANDROIDFSDATAREADSTARTFTRACEEVENT']._serialized_start=52228 - _globals['_ANDROIDFSDATAREADSTARTFTRACEEVENT']._serialized_end=52370 - _globals['_ANDROIDFSDATAWRITEENDFTRACEEVENT']._serialized_start=52372 - _globals['_ANDROIDFSDATAWRITEENDFTRACEEVENT']._serialized_end=52450 - _globals['_ANDROIDFSDATAWRITESTARTFTRACEEVENT']._serialized_start=52453 - _globals['_ANDROIDFSDATAWRITESTARTFTRACEEVENT']._serialized_end=52596 - _globals['_ANDROIDFSFSYNCENDFTRACEEVENT']._serialized_start=52598 - _globals['_ANDROIDFSFSYNCENDFTRACEEVENT']._serialized_end=52672 - _globals['_ANDROIDFSFSYNCSTARTFTRACEEVENT']._serialized_start=52674 - _globals['_ANDROIDFSFSYNCSTARTFTRACEEVENT']._serialized_end=52782 - _globals['_BCLIRQTRIGGERFTRACEEVENT']._serialized_start=52785 - _globals['_BCLIRQTRIGGERFTRACEEVENT']._serialized_end=52974 - _globals['_BINDERTRANSACTIONFTRACEEVENT']._serialized_start=52977 - _globals['_BINDERTRANSACTIONFTRACEEVENT']._serialized_end=53126 - _globals['_BINDERTRANSACTIONRECEIVEDFTRACEEVENT']._serialized_start=53128 - _globals['_BINDERTRANSACTIONRECEIVEDFTRACEEVENT']._serialized_end=53184 - _globals['_BINDERSETPRIORITYFTRACEEVENT']._serialized_start=53186 - _globals['_BINDERSETPRIORITYFTRACEEVENT']._serialized_end=53304 - _globals['_BINDERLOCKFTRACEEVENT']._serialized_start=53306 - _globals['_BINDERLOCKFTRACEEVENT']._serialized_end=53342 - _globals['_BINDERLOCKEDFTRACEEVENT']._serialized_start=53344 - _globals['_BINDERLOCKEDFTRACEEVENT']._serialized_end=53382 - _globals['_BINDERUNLOCKFTRACEEVENT']._serialized_start=53384 - _globals['_BINDERUNLOCKFTRACEEVENT']._serialized_end=53422 - _globals['_BINDERTRANSACTIONALLOCBUFFTRACEEVENT']._serialized_start=53424 - _globals['_BINDERTRANSACTIONALLOCBUFFTRACEEVENT']._serialized_end=53549 - _globals['_BINDERCOMMANDFTRACEEVENT']._serialized_start=53551 - _globals['_BINDERCOMMANDFTRACEEVENT']._serialized_end=53590 - _globals['_BINDERRETURNFTRACEEVENT']._serialized_start=53592 - _globals['_BINDERRETURNFTRACEEVENT']._serialized_end=53630 - _globals['_BLOCKRQISSUEFTRACEEVENT']._serialized_start=53633 - _globals['_BLOCKRQISSUEFTRACEEVENT']._serialized_end=53762 - _globals['_BLOCKBIOBACKMERGEFTRACEEVENT']._serialized_start=53764 - _globals['_BLOCKBIOBACKMERGEFTRACEEVENT']._serialized_end=53870 - _globals['_BLOCKBIOBOUNCEFTRACEEVENT']._serialized_start=53872 - _globals['_BLOCKBIOBOUNCEFTRACEEVENT']._serialized_end=53975 - _globals['_BLOCKBIOCOMPLETEFTRACEEVENT']._serialized_start=53977 - _globals['_BLOCKBIOCOMPLETEFTRACEEVENT']._serialized_end=54083 - _globals['_BLOCKBIOFRONTMERGEFTRACEEVENT']._serialized_start=54085 - _globals['_BLOCKBIOFRONTMERGEFTRACEEVENT']._serialized_end=54192 - _globals['_BLOCKBIOQUEUEFTRACEEVENT']._serialized_start=54194 - _globals['_BLOCKBIOQUEUEFTRACEEVENT']._serialized_end=54296 - _globals['_BLOCKBIOREMAPFTRACEEVENT']._serialized_start=54298 - _globals['_BLOCKBIOREMAPFTRACEEVENT']._serialized_end=54423 - _globals['_BLOCKDIRTYBUFFERFTRACEEVENT']._serialized_start=54425 - _globals['_BLOCKDIRTYBUFFERFTRACEEVENT']._serialized_end=54497 - _globals['_BLOCKGETRQFTRACEEVENT']._serialized_start=54499 - _globals['_BLOCKGETRQFTRACEEVENT']._serialized_end=54598 - _globals['_BLOCKPLUGFTRACEEVENT']._serialized_start=54600 - _globals['_BLOCKPLUGFTRACEEVENT']._serialized_end=54636 - _globals['_BLOCKRQABORTFTRACEEVENT']._serialized_start=54638 - _globals['_BLOCKRQABORTFTRACEEVENT']._serialized_end=54754 - _globals['_BLOCKRQCOMPLETEFTRACEEVENT']._serialized_start=54757 - _globals['_BLOCKRQCOMPLETEFTRACEEVENT']._serialized_end=54891 - _globals['_BLOCKRQINSERTFTRACEEVENT']._serialized_start=54894 - _globals['_BLOCKRQINSERTFTRACEEVENT']._serialized_end=55024 - _globals['_BLOCKRQREMAPFTRACEEVENT']._serialized_start=55027 - _globals['_BLOCKRQREMAPFTRACEEVENT']._serialized_end=55168 - _globals['_BLOCKRQREQUEUEFTRACEEVENT']._serialized_start=55170 - _globals['_BLOCKRQREQUEUEFTRACEEVENT']._serialized_end=55288 - _globals['_BLOCKSLEEPRQFTRACEEVENT']._serialized_start=55290 - _globals['_BLOCKSLEEPRQFTRACEEVENT']._serialized_end=55391 - _globals['_BLOCKSPLITFTRACEEVENT']._serialized_start=55393 - _globals['_BLOCKSPLITFTRACEEVENT']._serialized_end=55493 - _globals['_BLOCKTOUCHBUFFERFTRACEEVENT']._serialized_start=55495 - _globals['_BLOCKTOUCHBUFFERFTRACEEVENT']._serialized_end=55567 - _globals['_BLOCKUNPLUGFTRACEEVENT']._serialized_start=55569 - _globals['_BLOCKUNPLUGFTRACEEVENT']._serialized_end=55622 - _globals['_BLOCKIOSTARTFTRACEEVENT']._serialized_start=55625 - _globals['_BLOCKIOSTARTFTRACEEVENT']._serialized_end=55770 - _globals['_BLOCKIODONEFTRACEEVENT']._serialized_start=55773 - _globals['_BLOCKIODONEFTRACEEVENT']._serialized_end=55917 - _globals['_CGROUPATTACHTASKFTRACEEVENT']._serialized_start=55920 - _globals['_CGROUPATTACHTASKFTRACEEVENT']._serialized_end=56062 - _globals['_CGROUPMKDIRFTRACEEVENT']._serialized_start=56064 - _globals['_CGROUPMKDIRFTRACEEVENT']._serialized_end=56158 - _globals['_CGROUPREMOUNTFTRACEEVENT']._serialized_start=56160 - _globals['_CGROUPREMOUNTFTRACEEVENT']._serialized_end=56231 - _globals['_CGROUPRMDIRFTRACEEVENT']._serialized_start=56233 - _globals['_CGROUPRMDIRFTRACEEVENT']._serialized_end=56327 - _globals['_CGROUPTRANSFERTASKSFTRACEEVENT']._serialized_start=56330 - _globals['_CGROUPTRANSFERTASKSFTRACEEVENT']._serialized_end=56475 - _globals['_CGROUPDESTROYROOTFTRACEEVENT']._serialized_start=56477 - _globals['_CGROUPDESTROYROOTFTRACEEVENT']._serialized_end=56552 - _globals['_CGROUPRELEASEFTRACEEVENT']._serialized_start=56554 - _globals['_CGROUPRELEASEFTRACEEVENT']._serialized_end=56650 - _globals['_CGROUPRENAMEFTRACEEVENT']._serialized_start=56652 - _globals['_CGROUPRENAMEFTRACEEVENT']._serialized_end=56747 - _globals['_CGROUPSETUPROOTFTRACEEVENT']._serialized_start=56749 - _globals['_CGROUPSETUPROOTFTRACEEVENT']._serialized_end=56822 - _globals['_CLKENABLEFTRACEEVENT']._serialized_start=56824 - _globals['_CLKENABLEFTRACEEVENT']._serialized_end=56860 - _globals['_CLKDISABLEFTRACEEVENT']._serialized_start=56862 - _globals['_CLKDISABLEFTRACEEVENT']._serialized_end=56899 - _globals['_CLKSETRATEFTRACEEVENT']._serialized_start=56901 - _globals['_CLKSETRATEFTRACEEVENT']._serialized_end=56952 - _globals['_CMAALLOCSTARTFTRACEEVENT']._serialized_start=56954 - _globals['_CMAALLOCSTARTFTRACEEVENT']._serialized_end=57024 - _globals['_CMAALLOCINFOFTRACEEVENT']._serialized_start=57027 - _globals['_CMAALLOCINFOFTRACEEVENT']._serialized_end=57223 - _globals['_CMAALLOCFINISHFTRACEEVENT']._serialized_start=57225 - _globals['_CMAALLOCFINISHFTRACEEVENT']._serialized_end=57340 - _globals['_MMCOMPACTIONBEGINFTRACEEVENT']._serialized_start=57342 - _globals['_MMCOMPACTIONBEGINFTRACEEVENT']._serialized_end=57463 - _globals['_MMCOMPACTIONDEFERCOMPACTIONFTRACEEVENT']._serialized_start=57466 - _globals['_MMCOMPACTIONDEFERCOMPACTIONFTRACEEVENT']._serialized_end=57610 - _globals['_MMCOMPACTIONDEFERREDFTRACEEVENT']._serialized_start=57613 - _globals['_MMCOMPACTIONDEFERREDFTRACEEVENT']._serialized_end=57750 - _globals['_MMCOMPACTIONDEFERRESETFTRACEEVENT']._serialized_start=57753 - _globals['_MMCOMPACTIONDEFERRESETFTRACEEVENT']._serialized_end=57892 - _globals['_MMCOMPACTIONENDFTRACEEVENT']._serialized_start=57895 - _globals['_MMCOMPACTIONENDFTRACEEVENT']._serialized_end=58030 - _globals['_MMCOMPACTIONFINISHEDFTRACEEVENT']._serialized_start=58032 - _globals['_MMCOMPACTIONFINISHEDFTRACEEVENT']._serialized_end=58119 - _globals['_MMCOMPACTIONISOLATEFREEPAGESFTRACEEVENT']._serialized_start=58121 - _globals['_MMCOMPACTIONISOLATEFREEPAGESFTRACEEVENT']._serialized_end=58236 - _globals['_MMCOMPACTIONISOLATEMIGRATEPAGESFTRACEEVENT']._serialized_start=58238 - _globals['_MMCOMPACTIONISOLATEMIGRATEPAGESFTRACEEVENT']._serialized_end=58356 - _globals['_MMCOMPACTIONKCOMPACTDSLEEPFTRACEEVENT']._serialized_start=58358 - _globals['_MMCOMPACTIONKCOMPACTDSLEEPFTRACEEVENT']._serialized_end=58410 - _globals['_MMCOMPACTIONKCOMPACTDWAKEFTRACEEVENT']._serialized_start=58412 - _globals['_MMCOMPACTIONKCOMPACTDWAKEFTRACEEVENT']._serialized_end=58526 - _globals['_MMCOMPACTIONMIGRATEPAGESFTRACEEVENT']._serialized_start=58528 - _globals['_MMCOMPACTIONMIGRATEPAGESFTRACEEVENT']._serialized_end=58605 - _globals['_MMCOMPACTIONSUITABLEFTRACEEVENT']._serialized_start=58607 - _globals['_MMCOMPACTIONSUITABLEFTRACEEVENT']._serialized_end=58694 - _globals['_MMCOMPACTIONTRYTOCOMPACTPAGESFTRACEEVENT']._serialized_start=58696 - _globals['_MMCOMPACTIONTRYTOCOMPACTPAGESFTRACEEVENT']._serialized_end=58799 - _globals['_MMCOMPACTIONWAKEUPKCOMPACTDFTRACEEVENT']._serialized_start=58801 - _globals['_MMCOMPACTIONWAKEUPKCOMPACTDFTRACEEVENT']._serialized_end=58917 - _globals['_PARAMSETVALUECPMFTRACEEVENT']._serialized_start=58919 - _globals['_PARAMSETVALUECPMFTRACEEVENT']._serialized_end=58996 - _globals['_CPUHPEXITFTRACEEVENT']._serialized_start=58998 - _globals['_CPUHPEXITFTRACEEVENT']._serialized_end=59074 - _globals['_CPUHPMULTIENTERFTRACEEVENT']._serialized_start=59076 - _globals['_CPUHPMULTIENTERFTRACEEVENT']._serialized_end=59159 - _globals['_CPUHPENTERFTRACEEVENT']._serialized_start=59161 - _globals['_CPUHPENTERFTRACEEVENT']._serialized_end=59239 - _globals['_CPUHPLATENCYFTRACEEVENT']._serialized_start=59241 - _globals['_CPUHPLATENCYFTRACEEVENT']._serialized_end=59321 - _globals['_CPUHPPAUSEFTRACEEVENT']._serialized_start=59323 - _globals['_CPUHPPAUSEFTRACEEVENT']._serialized_end=59410 - _globals['_CROSECSENSORHUBDATAFTRACEEVENT']._serialized_start=59413 - _globals['_CROSECSENSORHUBDATAFTRACEEVENT']._serialized_end=59583 - _globals['_DCVSHFREQFTRACEEVENT']._serialized_start=59585 - _globals['_DCVSHFREQFTRACEEVENT']._serialized_end=59634 - _globals['_DEVFREQFREQUENCYFTRACEEVENT']._serialized_start=59636 - _globals['_DEVFREQFREQUENCYFTRACEEVENT']._serialized_end=59755 - _globals['_DMAFENCEINITFTRACEEVENT']._serialized_start=59757 - _globals['_DMAFENCEINITFTRACEEVENT']._serialized_end=59848 - _globals['_DMAFENCEEMITFTRACEEVENT']._serialized_start=59850 - _globals['_DMAFENCEEMITFTRACEEVENT']._serialized_end=59941 - _globals['_DMAFENCESIGNALEDFTRACEEVENT']._serialized_start=59943 - _globals['_DMAFENCESIGNALEDFTRACEEVENT']._serialized_end=60038 - _globals['_DMAFENCEWAITSTARTFTRACEEVENT']._serialized_start=60040 - _globals['_DMAFENCEWAITSTARTFTRACEEVENT']._serialized_end=60136 - _globals['_DMAFENCEWAITENDFTRACEEVENT']._serialized_start=60138 - _globals['_DMAFENCEWAITENDFTRACEEVENT']._serialized_end=60232 - _globals['_DMAHEAPSTATFTRACEEVENT']._serialized_start=60234 - _globals['_DMAHEAPSTATFTRACEEVENT']._serialized_end=60311 - _globals['_DPUTRACINGMARKWRITEFTRACEEVENT']._serialized_start=60314 - _globals['_DPUTRACINGMARKWRITEFTRACEEVENT']._serialized_end=60443 - _globals['_DPUDSICMDFIFOSTATUSFTRACEEVENT']._serialized_start=60445 - _globals['_DPUDSICMDFIFOSTATUSFTRACEEVENT']._serialized_end=60510 - _globals['_DPUDSIRXFTRACEEVENT']._serialized_start=60512 - _globals['_DPUDSIRXFTRACEEVENT']._serialized_end=60562 - _globals['_DPUDSITXFTRACEEVENT']._serialized_start=60564 - _globals['_DPUDSITXFTRACEEVENT']._serialized_end=60647 - _globals['_DPUDISPDPUUNDERRUNFTRACEEVENT']._serialized_start=60649 - _globals['_DPUDISPDPUUNDERRUNFTRACEEVENT']._serialized_end=60737 - _globals['_DPUDISPVBLANKIRQENABLEFTRACEEVENT']._serialized_start=60739 - _globals['_DPUDISPVBLANKIRQENABLEFTRACEEVENT']._serialized_end=60821 - _globals['_DPUDISPFRAMEDONETIMEOUTFTRACEEVENT']._serialized_start=60824 - _globals['_DPUDISPFRAMEDONETIMEOUTFTRACEEVENT']._serialized_end=60965 - _globals['_DPUDISPFRAMESTARTTIMEOUTFTRACEEVENT']._serialized_start=60967 - _globals['_DPUDISPFRAMESTARTTIMEOUTFTRACEEVENT']._serialized_end=61085 - _globals['_DPUDISPFRAMEDONEMISSINGFTRACEEVENT']._serialized_start=61087 - _globals['_DPUDISPFRAMEDONEMISSINGFTRACEEVENT']._serialized_end=61204 - _globals['_DPUDISPFRAMESTARTMISSINGFTRACEEVENT']._serialized_start=61206 - _globals['_DPUDISPFRAMESTARTMISSINGFTRACEEVENT']._serialized_end=61324 - _globals['_DPUDISPDPULINEUNDERRUNFTRACEEVENT']._serialized_start=61326 - _globals['_DPUDISPDPULINEUNDERRUNFTRACEEVENT']._serialized_end=61418 - _globals['_DRMVBLANKEVENTFTRACEEVENT']._serialized_start=61420 - _globals['_DRMVBLANKEVENTFTRACEEVENT']._serialized_end=61507 - _globals['_DRMVBLANKEVENTDELIVEREDFTRACEEVENT']._serialized_start=61509 - _globals['_DRMVBLANKEVENTDELIVEREDFTRACEEVENT']._serialized_end=61586 - _globals['_DWC3ALLOCREQUESTFTRACEEVENT']._serialized_start=61589 - _globals['_DWC3ALLOCREQUESTFTRACEEVENT']._serialized_end=61751 - _globals['_DWC3COMPLETETRBFTRACEEVENT']._serialized_start=61754 - _globals['_DWC3COMPLETETRBFTRACEEVENT']._serialized_end=61946 - _globals['_DWC3CTRLREQFTRACEEVENT']._serialized_start=61948 - _globals['_DWC3CTRLREQFTRACEEVENT']._serialized_end=62074 - _globals['_DWC3EPDEQUEUEFTRACEEVENT']._serialized_start=62077 - _globals['_DWC3EPDEQUEUEFTRACEEVENT']._serialized_end=62236 - _globals['_DWC3EPQUEUEFTRACEEVENT']._serialized_start=62239 - _globals['_DWC3EPQUEUEFTRACEEVENT']._serialized_end=62396 - _globals['_DWC3EVENTFTRACEEVENT']._serialized_start=62398 - _globals['_DWC3EVENTFTRACEEVENT']._serialized_end=62466 - _globals['_DWC3FREEREQUESTFTRACEEVENT']._serialized_start=62469 - _globals['_DWC3FREEREQUESTFTRACEEVENT']._serialized_end=62630 - _globals['_DWC3GADGETEPCMDFTRACEEVENT']._serialized_start=62632 - _globals['_DWC3GADGETEPCMDFTRACEEVENT']._serialized_end=62755 - _globals['_DWC3GADGETEPDISABLEFTRACEEVENT']._serialized_start=62758 - _globals['_DWC3GADGETEPDISABLEFTRACEEVENT']._serialized_end=62963 - _globals['_DWC3GADGETEPENABLEFTRACEEVENT']._serialized_start=62966 - _globals['_DWC3GADGETEPENABLEFTRACEEVENT']._serialized_end=63170 - _globals['_DWC3GADGETGENERICCMDFTRACEEVENT']._serialized_start=63172 - _globals['_DWC3GADGETGENERICCMDFTRACEEVENT']._serialized_end=63249 - _globals['_DWC3GADGETGIVEBACKFTRACEEVENT']._serialized_start=63252 - _globals['_DWC3GADGETGIVEBACKFTRACEEVENT']._serialized_end=63416 - _globals['_DWC3PREPARETRBFTRACEEVENT']._serialized_start=63419 - _globals['_DWC3PREPARETRBFTRACEEVENT']._serialized_end=63610 - _globals['_DWC3READLFTRACEEVENT']._serialized_start=63612 - _globals['_DWC3READLFTRACEEVENT']._serialized_end=63692 - _globals['_DWC3WRITELFTRACEEVENT']._serialized_start=63694 - _globals['_DWC3WRITELFTRACEEVENT']._serialized_end=63775 - _globals['_EXT4DAWRITEBEGINFTRACEEVENT']._serialized_start=63777 - _globals['_EXT4DAWRITEBEGINFTRACEEVENT']._serialized_end=63873 - _globals['_EXT4DAWRITEENDFTRACEEVENT']._serialized_start=63875 - _globals['_EXT4DAWRITEENDFTRACEEVENT']._serialized_end=63970 - _globals['_EXT4SYNCFILEENTERFTRACEEVENT']._serialized_start=63972 - _globals['_EXT4SYNCFILEENTERFTRACEEVENT']._serialized_end=64062 - _globals['_EXT4SYNCFILEEXITFTRACEEVENT']._serialized_start=64064 - _globals['_EXT4SYNCFILEEXITFTRACEEVENT']._serialized_end=64132 - _globals['_EXT4ALLOCDABLOCKSFTRACEEVENT']._serialized_start=64134 - _globals['_EXT4ALLOCDABLOCKSFTRACEEVENT']._serialized_end=64232 - _globals['_EXT4ALLOCATEBLOCKSFTRACEEVENT']._serialized_start=64235 - _globals['_EXT4ALLOCATEBLOCKSFTRACEEVENT']._serialized_end=64428 - _globals['_EXT4ALLOCATEINODEFTRACEEVENT']._serialized_start=64430 - _globals['_EXT4ALLOCATEINODEFTRACEEVENT']._serialized_end=64513 - _globals['_EXT4BEGINORDEREDTRUNCATEFTRACEEVENT']._serialized_start=64515 - _globals['_EXT4BEGINORDEREDTRUNCATEFTRACEEVENT']._serialized_end=64596 - _globals['_EXT4COLLAPSERANGEFTRACEEVENT']._serialized_start=64598 - _globals['_EXT4COLLAPSERANGEFTRACEEVENT']._serialized_end=64683 - _globals['_EXT4DARELEASESPACEFTRACEEVENT']._serialized_start=64686 - _globals['_EXT4DARELEASESPACEFTRACEEVENT']._serialized_end=64888 - _globals['_EXT4DARESERVESPACEFTRACEEVENT']._serialized_start=64891 - _globals['_EXT4DARESERVESPACEFTRACEEVENT']._serialized_end=65059 - _globals['_EXT4DAUPDATERESERVESPACEFTRACEEVENT']._serialized_start=65062 - _globals['_EXT4DAUPDATERESERVESPACEFTRACEEVENT']._serialized_end=65290 - _globals['_EXT4DAWRITEPAGESFTRACEEVENT']._serialized_start=65293 - _globals['_EXT4DAWRITEPAGESFTRACEEVENT']._serialized_end=65500 - _globals['_EXT4DAWRITEPAGESEXTENTFTRACEEVENT']._serialized_start=65502 - _globals['_EXT4DAWRITEPAGESEXTENTFTRACEEVENT']._serialized_end=65605 - _globals['_EXT4DIRECTIOENTERFTRACEEVENT']._serialized_start=65607 - _globals['_EXT4DIRECTIOENTERFTRACEEVENT']._serialized_end=65701 - _globals['_EXT4DIRECTIOEXITFTRACEEVENT']._serialized_start=65703 - _globals['_EXT4DIRECTIOEXITFTRACEEVENT']._serialized_end=65809 - _globals['_EXT4DISCARDBLOCKSFTRACEEVENT']._serialized_start=65811 - _globals['_EXT4DISCARDBLOCKSFTRACEEVENT']._serialized_end=65882 - _globals['_EXT4DISCARDPREALLOCATIONSFTRACEEVENT']._serialized_start=65884 - _globals['_EXT4DISCARDPREALLOCATIONSFTRACEEVENT']._serialized_end=65977 - _globals['_EXT4DROPINODEFTRACEEVENT']._serialized_start=65979 - _globals['_EXT4DROPINODEFTRACEEVENT']._serialized_end=66045 - _globals['_EXT4ESCACHEEXTENTFTRACEEVENT']._serialized_start=66047 - _globals['_EXT4ESCACHEEXTENTFTRACEEVENT']._serialized_end=66160 - _globals['_EXT4ESFINDDELAYEDEXTENTRANGEENTERFTRACEEVENT']._serialized_start=66162 - _globals['_EXT4ESFINDDELAYEDEXTENTRANGEENTERFTRACEEVENT']._serialized_end=66248 - _globals['_EXT4ESFINDDELAYEDEXTENTRANGEEXITFTRACEEVENT']._serialized_start=66251 - _globals['_EXT4ESFINDDELAYEDEXTENTRANGEEXITFTRACEEVENT']._serialized_end=66379 - _globals['_EXT4ESINSERTEXTENTFTRACEEVENT']._serialized_start=66381 - _globals['_EXT4ESINSERTEXTENTFTRACEEVENT']._serialized_end=66495 - _globals['_EXT4ESLOOKUPEXTENTENTERFTRACEEVENT']._serialized_start=66497 - _globals['_EXT4ESLOOKUPEXTENTENTERFTRACEEVENT']._serialized_end=66573 - _globals['_EXT4ESLOOKUPEXTENTEXITFTRACEEVENT']._serialized_start=66576 - _globals['_EXT4ESLOOKUPEXTENTEXITFTRACEEVENT']._serialized_end=66709 - _globals['_EXT4ESREMOVEEXTENTFTRACEEVENT']._serialized_start=66711 - _globals['_EXT4ESREMOVEEXTENTFTRACEEVENT']._serialized_end=66795 - _globals['_EXT4ESSHRINKFTRACEEVENT']._serialized_start=66797 - _globals['_EXT4ESSHRINKFTRACEEVENT']._serialized_end=66910 - _globals['_EXT4ESSHRINKCOUNTFTRACEEVENT']._serialized_start=66912 - _globals['_EXT4ESSHRINKCOUNTFTRACEEVENT']._serialized_end=66994 - _globals['_EXT4ESSHRINKSCANENTERFTRACEEVENT']._serialized_start=66996 - _globals['_EXT4ESSHRINKSCANENTERFTRACEEVENT']._serialized_end=67082 - _globals['_EXT4ESSHRINKSCANEXITFTRACEEVENT']._serialized_start=67084 - _globals['_EXT4ESSHRINKSCANEXITFTRACEEVENT']._serialized_end=67168 - _globals['_EXT4EVICTINODEFTRACEEVENT']._serialized_start=67170 - _globals['_EXT4EVICTINODEFTRACEEVENT']._serialized_end=67238 - _globals['_EXT4EXTCONVERTTOINITIALIZEDENTERFTRACEEVENT']._serialized_start=67241 - _globals['_EXT4EXTCONVERTTOINITIALIZEDENTERFTRACEEVENT']._serialized_end=67390 - _globals['_EXT4EXTCONVERTTOINITIALIZEDFASTPATHFTRACEEVENT']._serialized_start=67393 - _globals['_EXT4EXTCONVERTTOINITIALIZEDFASTPATHFTRACEEVENT']._serialized_end=67592 - _globals['_EXT4EXTHANDLEUNWRITTENEXTENTSFTRACEEVENT']._serialized_start=67595 - _globals['_EXT4EXTHANDLEUNWRITTENEXTENTSFTRACEEVENT']._serialized_end=67754 - _globals['_EXT4EXTINCACHEFTRACEEVENT']._serialized_start=67756 - _globals['_EXT4EXTINCACHEFTRACEEVENT']._serialized_end=67836 - _globals['_EXT4EXTLOADEXTENTFTRACEEVENT']._serialized_start=67838 - _globals['_EXT4EXTLOADEXTENTFTRACEEVENT']._serialized_end=67922 - _globals['_EXT4EXTMAPBLOCKSENTERFTRACEEVENT']._serialized_start=67924 - _globals['_EXT4EXTMAPBLOCKSENTERFTRACEEVENT']._serialized_end=68026 - _globals['_EXT4EXTMAPBLOCKSEXITFTRACEEVENT']._serialized_start=68029 - _globals['_EXT4EXTMAPBLOCKSEXITFTRACEEVENT']._serialized_end=68173 - _globals['_EXT4EXTPUTINCACHEFTRACEEVENT']._serialized_start=68175 - _globals['_EXT4EXTPUTINCACHEFTRACEEVENT']._serialized_end=68273 - _globals['_EXT4EXTREMOVESPACEFTRACEEVENT']._serialized_start=68275 - _globals['_EXT4EXTREMOVESPACEFTRACEEVENT']._serialized_end=68375 - _globals['_EXT4EXTREMOVESPACEDONEFTRACEEVENT']._serialized_start=68378 - _globals['_EXT4EXTREMOVESPACEDONEFTRACEEVENT']._serialized_end=68571 - _globals['_EXT4EXTRMIDXFTRACEEVENT']._serialized_start=68573 - _globals['_EXT4EXTRMIDXFTRACEEVENT']._serialized_end=68638 - _globals['_EXT4EXTRMLEAFFTRACEEVENT']._serialized_start=68641 - _globals['_EXT4EXTRMLEAFFTRACEEVENT']._serialized_end=68827 - _globals['_EXT4EXTSHOWEXTENTFTRACEEVENT']._serialized_start=68829 - _globals['_EXT4EXTSHOWEXTENTFTRACEEVENT']._serialized_end=68926 - _globals['_EXT4FALLOCATEENTERFTRACEEVENT']._serialized_start=68928 - _globals['_EXT4FALLOCATEENTERFTRACEEVENT']._serialized_end=69041 - _globals['_EXT4FALLOCATEEXITFTRACEEVENT']._serialized_start=69043 - _globals['_EXT4FALLOCATEEXITFTRACEEVENT']._serialized_end=69141 - _globals['_EXT4FINDDELALLOCRANGEFTRACEEVENT']._serialized_start=69144 - _globals['_EXT4FINDDELALLOCRANGEFTRACEEVENT']._serialized_end=69281 - _globals['_EXT4FORGETFTRACEEVENT']._serialized_start=69283 - _globals['_EXT4FORGETFTRACEEVENT']._serialized_end=69382 - _globals['_EXT4FREEBLOCKSFTRACEEVENT']._serialized_start=69384 - _globals['_EXT4FREEBLOCKSFTRACEEVENT']._serialized_end=69496 - _globals['_EXT4FREEINODEFTRACEEVENT']._serialized_start=69498 - _globals['_EXT4FREEINODEFTRACEEVENT']._serialized_end=69606 - _globals['_EXT4GETIMPLIEDCLUSTERALLOCEXITFTRACEEVENT']._serialized_start=69608 - _globals['_EXT4GETIMPLIEDCLUSTERALLOCEXITFTRACEEVENT']._serialized_end=69733 - _globals['_EXT4GETRESERVEDCLUSTERALLOCFTRACEEVENT']._serialized_start=69735 - _globals['_EXT4GETRESERVEDCLUSTERALLOCFTRACEEVENT']._serialized_end=69828 - _globals['_EXT4INDMAPBLOCKSENTERFTRACEEVENT']._serialized_start=69830 - _globals['_EXT4INDMAPBLOCKSENTERFTRACEEVENT']._serialized_end=69932 - _globals['_EXT4INDMAPBLOCKSEXITFTRACEEVENT']._serialized_start=69935 - _globals['_EXT4INDMAPBLOCKSEXITFTRACEEVENT']._serialized_end=70079 - _globals['_EXT4INSERTRANGEFTRACEEVENT']._serialized_start=70081 - _globals['_EXT4INSERTRANGEFTRACEEVENT']._serialized_end=70164 - _globals['_EXT4INVALIDATEPAGEFTRACEEVENT']._serialized_start=70166 - _globals['_EXT4INVALIDATEPAGEFTRACEEVENT']._serialized_end=70270 - _globals['_EXT4JOURNALSTARTFTRACEEVENT']._serialized_start=70273 - _globals['_EXT4JOURNALSTARTFTRACEEVENT']._serialized_end=70402 - _globals['_EXT4JOURNALSTARTRESERVEDFTRACEEVENT']._serialized_start=70404 - _globals['_EXT4JOURNALSTARTRESERVEDFTRACEEVENT']._serialized_end=70482 - _globals['_EXT4JOURNALLEDINVALIDATEPAGEFTRACEEVENT']._serialized_start=70484 - _globals['_EXT4JOURNALLEDINVALIDATEPAGEFTRACEEVENT']._serialized_end=70598 - _globals['_EXT4JOURNALLEDWRITEENDFTRACEEVENT']._serialized_start=70600 - _globals['_EXT4JOURNALLEDWRITEENDFTRACEEVENT']._serialized_end=70703 - _globals['_EXT4LOADINODEFTRACEEVENT']._serialized_start=70705 - _globals['_EXT4LOADINODEFTRACEEVENT']._serialized_end=70757 - _globals['_EXT4LOADINODEBITMAPFTRACEEVENT']._serialized_start=70759 - _globals['_EXT4LOADINODEBITMAPFTRACEEVENT']._serialized_end=70819 - _globals['_EXT4MARKINODEDIRTYFTRACEEVENT']._serialized_start=70821 - _globals['_EXT4MARKINODEDIRTYFTRACEEVENT']._serialized_end=70890 - _globals['_EXT4MBBITMAPLOADFTRACEEVENT']._serialized_start=70892 - _globals['_EXT4MBBITMAPLOADFTRACEEVENT']._serialized_end=70949 - _globals['_EXT4MBBUDDYBITMAPLOADFTRACEEVENT']._serialized_start=70951 - _globals['_EXT4MBBUDDYBITMAPLOADFTRACEEVENT']._serialized_end=71013 - _globals['_EXT4MBDISCARDPREALLOCATIONSFTRACEEVENT']._serialized_start=71015 - _globals['_EXT4MBDISCARDPREALLOCATIONSFTRACEEVENT']._serialized_end=71084 - _globals['_EXT4MBNEWGROUPPAFTRACEEVENT']._serialized_start=71086 - _globals['_EXT4MBNEWGROUPPAFTRACEEVENT']._serialized_end=71195 - _globals['_EXT4MBNEWINODEPAFTRACEEVENT']._serialized_start=71197 - _globals['_EXT4MBNEWINODEPAFTRACEEVENT']._serialized_end=71306 - _globals['_EXT4MBRELEASEGROUPPAFTRACEEVENT']._serialized_start=71308 - _globals['_EXT4MBRELEASEGROUPPAFTRACEEVENT']._serialized_end=71389 - _globals['_EXT4MBRELEASEINODEPAFTRACEEVENT']._serialized_start=71391 - _globals['_EXT4MBRELEASEINODEPAFTRACEEVENT']._serialized_end=71480 - _globals['_EXT4MBALLOCALLOCFTRACEEVENT']._serialized_start=71483 - _globals['_EXT4MBALLOCALLOCFTRACEEVENT']._serialized_end=71873 - _globals['_EXT4MBALLOCDISCARDFTRACEEVENT']._serialized_start=71875 - _globals['_EXT4MBALLOCDISCARDFTRACEEVENT']._serialized_end=71996 - _globals['_EXT4MBALLOCFREEFTRACEEVENT']._serialized_start=71998 - _globals['_EXT4MBALLOCFREEFTRACEEVENT']._serialized_end=72116 - _globals['_EXT4MBALLOCPREALLOCFTRACEEVENT']._serialized_start=72119 - _globals['_EXT4MBALLOCPREALLOCFTRACEEVENT']._serialized_end=72345 - _globals['_EXT4OTHERINODEUPDATETIMEFTRACEEVENT']._serialized_start=72347 - _globals['_EXT4OTHERINODEUPDATETIMEFTRACEEVENT']._serialized_end=72468 - _globals['_EXT4PUNCHHOLEFTRACEEVENT']._serialized_start=72470 - _globals['_EXT4PUNCHHOLEFTRACEEVENT']._serialized_end=72565 - _globals['_EXT4READBLOCKBITMAPLOADFTRACEEVENT']._serialized_start=72567 - _globals['_EXT4READBLOCKBITMAPLOADFTRACEEVENT']._serialized_end=72649 - _globals['_EXT4READPAGEFTRACEEVENT']._serialized_start=72651 - _globals['_EXT4READPAGEFTRACEEVENT']._serialized_end=72717 - _globals['_EXT4RELEASEPAGEFTRACEEVENT']._serialized_start=72719 - _globals['_EXT4RELEASEPAGEFTRACEEVENT']._serialized_end=72788 - _globals['_EXT4REMOVEBLOCKSFTRACEEVENT']._serialized_start=72791 - _globals['_EXT4REMOVEBLOCKSFTRACEEVENT']._serialized_end=72991 - _globals['_EXT4REQUESTBLOCKSFTRACEEVENT']._serialized_start=72994 - _globals['_EXT4REQUESTBLOCKSFTRACEEVENT']._serialized_end=73171 - _globals['_EXT4REQUESTINODEFTRACEEVENT']._serialized_start=73173 - _globals['_EXT4REQUESTINODEFTRACEEVENT']._serialized_end=73242 - _globals['_EXT4SYNCFSFTRACEEVENT']._serialized_start=73244 - _globals['_EXT4SYNCFSFTRACEEVENT']._serialized_end=73294 - _globals['_EXT4TRIMALLFREEFTRACEEVENT']._serialized_start=73296 - _globals['_EXT4TRIMALLFREEFTRACEEVENT']._serialized_end=73405 - _globals['_EXT4TRIMEXTENTFTRACEEVENT']._serialized_start=73407 - _globals['_EXT4TRIMEXTENTFTRACEEVENT']._serialized_end=73515 - _globals['_EXT4TRUNCATEENTERFTRACEEVENT']._serialized_start=73517 - _globals['_EXT4TRUNCATEENTERFTRACEEVENT']._serialized_end=73589 - _globals['_EXT4TRUNCATEEXITFTRACEEVENT']._serialized_start=73591 - _globals['_EXT4TRUNCATEEXITFTRACEEVENT']._serialized_end=73662 - _globals['_EXT4UNLINKENTERFTRACEEVENT']._serialized_start=73664 - _globals['_EXT4UNLINKENTERFTRACEEVENT']._serialized_end=73748 - _globals['_EXT4UNLINKEXITFTRACEEVENT']._serialized_start=73750 - _globals['_EXT4UNLINKEXITFTRACEEVENT']._serialized_end=73816 - _globals['_EXT4WRITEBEGINFTRACEEVENT']._serialized_start=73818 - _globals['_EXT4WRITEBEGINFTRACEEVENT']._serialized_end=73912 - _globals['_EXT4WRITEENDFTRACEEVENT']._serialized_start=73914 - _globals['_EXT4WRITEENDFTRACEEVENT']._serialized_end=74007 - _globals['_EXT4WRITEPAGEFTRACEEVENT']._serialized_start=74009 - _globals['_EXT4WRITEPAGEFTRACEEVENT']._serialized_end=74076 - _globals['_EXT4WRITEPAGESFTRACEEVENT']._serialized_start=74079 - _globals['_EXT4WRITEPAGESFTRACEEVENT']._serialized_end=74303 - _globals['_EXT4WRITEPAGESRESULTFTRACEEVENT']._serialized_start=74306 - _globals['_EXT4WRITEPAGESRESULTFTRACEEVENT']._serialized_end=74468 - _globals['_EXT4ZERORANGEFTRACEEVENT']._serialized_start=74470 - _globals['_EXT4ZERORANGEFTRACEEVENT']._serialized_end=74565 - _globals['_F2FSDOSUBMITBIOFTRACEEVENT']._serialized_start=74567 - _globals['_F2FSDOSUBMITBIOFTRACEEVENT']._serialized_end=74667 - _globals['_F2FSEVICTINODEFTRACEEVENT']._serialized_start=74670 - _globals['_F2FSEVICTINODEFTRACEEVENT']._serialized_end=74812 - _globals['_F2FSFALLOCATEFTRACEEVENT']._serialized_start=74815 - _globals['_F2FSFALLOCATEFTRACEEVENT']._serialized_end=74953 - _globals['_F2FSGETDATABLOCKFTRACEEVENT']._serialized_start=74955 - _globals['_F2FSGETDATABLOCKFTRACEEVENT']._serialized_end=75074 - _globals['_F2FSGETVICTIMFTRACEEVENT']._serialized_start=75077 - _globals['_F2FSGETVICTIMFTRACEEVENT']._serialized_end=75283 - _globals['_F2FSIGETFTRACEEVENT']._serialized_start=75286 - _globals['_F2FSIGETFTRACEEVENT']._serialized_end=75422 - _globals['_F2FSIGETEXITFTRACEEVENT']._serialized_start=75424 - _globals['_F2FSIGETEXITFTRACEEVENT']._serialized_end=75488 - _globals['_F2FSNEWINODEFTRACEEVENT']._serialized_start=75490 - _globals['_F2FSNEWINODEFTRACEEVENT']._serialized_end=75554 - _globals['_F2FSREADPAGEFTRACEEVENT']._serialized_start=75557 - _globals['_F2FSREADPAGEFTRACEEVENT']._serialized_end=75700 - _globals['_F2FSRESERVENEWBLOCKFTRACEEVENT']._serialized_start=75702 - _globals['_F2FSRESERVENEWBLOCKFTRACEEVENT']._serialized_end=75781 - _globals['_F2FSSETPAGEDIRTYFTRACEEVENT']._serialized_start=75784 - _globals['_F2FSSETPAGEDIRTYFTRACEEVENT']._serialized_end=75914 - _globals['_F2FSSUBMITWRITEPAGEFTRACEEVENT']._serialized_start=75916 - _globals['_F2FSSUBMITWRITEPAGEFTRACEEVENT']._serialized_end=76018 - _globals['_F2FSSYNCFILEENTERFTRACEEVENT']._serialized_start=76021 - _globals['_F2FSSYNCFILEENTERFTRACEEVENT']._serialized_end=76166 - _globals['_F2FSSYNCFILEEXITFTRACEEVENT']._serialized_start=76168 - _globals['_F2FSSYNCFILEEXITFTRACEEVENT']._serialized_end=76290 - _globals['_F2FSSYNCFSFTRACEEVENT']._serialized_start=76292 - _globals['_F2FSSYNCFSFTRACEEVENT']._serialized_end=76357 - _globals['_F2FSTRUNCATEFTRACEEVENT']._serialized_start=76360 - _globals['_F2FSTRUNCATEFTRACEEVENT']._serialized_end=76500 - _globals['_F2FSTRUNCATEBLOCKSENTERFTRACEEVENT']._serialized_start=76502 - _globals['_F2FSTRUNCATEBLOCKSENTERFTRACEEVENT']._serialized_end=76608 - _globals['_F2FSTRUNCATEBLOCKSEXITFTRACEEVENT']._serialized_start=76610 - _globals['_F2FSTRUNCATEBLOCKSEXITFTRACEEVENT']._serialized_end=76684 - _globals['_F2FSTRUNCATEDATABLOCKSRANGEFTRACEEVENT']._serialized_start=76686 - _globals['_F2FSTRUNCATEDATABLOCKSRANGEFTRACEEVENT']._serialized_end=76792 - _globals['_F2FSTRUNCATEINODEBLOCKSENTERFTRACEEVENT']._serialized_start=76794 - _globals['_F2FSTRUNCATEINODEBLOCKSENTERFTRACEEVENT']._serialized_end=76905 - _globals['_F2FSTRUNCATEINODEBLOCKSEXITFTRACEEVENT']._serialized_start=76907 - _globals['_F2FSTRUNCATEINODEBLOCKSEXITFTRACEEVENT']._serialized_end=76986 - _globals['_F2FSTRUNCATENODEFTRACEEVENT']._serialized_start=76988 - _globals['_F2FSTRUNCATENODEFTRACEEVENT']._serialized_end=77074 - _globals['_F2FSTRUNCATENODESENTERFTRACEEVENT']._serialized_start=77076 - _globals['_F2FSTRUNCATENODESENTERFTRACEEVENT']._serialized_end=77168 - _globals['_F2FSTRUNCATENODESEXITFTRACEEVENT']._serialized_start=77170 - _globals['_F2FSTRUNCATENODESEXITFTRACEEVENT']._serialized_end=77243 - _globals['_F2FSTRUNCATEPARTIALNODESFTRACEEVENT']._serialized_start=77245 - _globals['_F2FSTRUNCATEPARTIALNODESFTRACEEVENT']._serialized_end=77349 - _globals['_F2FSUNLINKENTERFTRACEEVENT']._serialized_start=77351 - _globals['_F2FSUNLINKENTERFTRACEEVENT']._serialized_end=77449 - _globals['_F2FSUNLINKEXITFTRACEEVENT']._serialized_start=77451 - _globals['_F2FSUNLINKEXITFTRACEEVENT']._serialized_end=77517 - _globals['_F2FSVMPAGEMKWRITEFTRACEEVENT']._serialized_start=77520 - _globals['_F2FSVMPAGEMKWRITEFTRACEEVENT']._serialized_end=77651 - _globals['_F2FSWRITEBEGINFTRACEEVENT']._serialized_start=77653 - _globals['_F2FSWRITEBEGINFTRACEEVENT']._serialized_end=77747 - _globals['_F2FSWRITECHECKPOINTFTRACEEVENT']._serialized_start=77749 - _globals['_F2FSWRITECHECKPOINTFTRACEEVENT']._serialized_end=77857 - _globals['_F2FSWRITEENDFTRACEEVENT']._serialized_start=77859 - _globals['_F2FSWRITEENDFTRACEEVENT']._serialized_end=77952 - _globals['_F2FSIOSTATFTRACEEVENT']._serialized_start=77955 - _globals['_F2FSIOSTATFTRACEEVENT']._serialized_end=78380 - _globals['_F2FSIOSTATLATENCYFTRACEEVENT']._serialized_start=78383 - _globals['_F2FSIOSTATLATENCYFTRACEEVENT']._serialized_end=78966 - _globals['_F2FSBACKGROUNDGCFTRACEEVENT']._serialized_start=78968 - _globals['_F2FSBACKGROUNDGCFTRACEEVENT']._serialized_end=79058 - _globals['_F2FSGCBEGINFTRACEEVENT']._serialized_start=79061 - _globals['_F2FSGCBEGINFTRACEEVENT']._serialized_end=79331 - _globals['_F2FSGCENDFTRACEEVENT']._serialized_start=79334 - _globals['_F2FSGCENDFTRACEEVENT']._serialized_end=79562 - _globals['_F2FSLOCKELAPSEDTIMEFTRACEEVENT']._serialized_start=79565 - _globals['_F2FSLOCKELAPSEDTIMEFTRACEEVENT']._serialized_end=79839 - _globals['_FASTRPCDMASTATFTRACEEVENT']._serialized_start=79841 - _globals['_FASTRPCDMASTATFTRACEEVENT']._serialized_end=79919 - _globals['_FASTRPCDMAFREEFTRACEEVENT']._serialized_start=79921 - _globals['_FASTRPCDMAFREEFTRACEEVENT']._serialized_end=79989 - _globals['_FASTRPCDMAALLOCFTRACEEVENT']._serialized_start=79991 - _globals['_FASTRPCDMAALLOCFTRACEEVENT']._serialized_end=80090 - _globals['_FASTRPCDMAUNMAPFTRACEEVENT']._serialized_start=80092 - _globals['_FASTRPCDMAUNMAPFTRACEEVENT']._serialized_end=80161 - _globals['_FASTRPCDMAMAPFTRACEEVENT']._serialized_start=80163 - _globals['_FASTRPCDMAMAPFTRACEEVENT']._serialized_end=80285 - _globals['_FENCEINITFTRACEEVENT']._serialized_start=80287 - _globals['_FENCEINITFTRACEEVENT']._serialized_end=80375 - _globals['_FENCEDESTROYFTRACEEVENT']._serialized_start=80377 - _globals['_FENCEDESTROYFTRACEEVENT']._serialized_end=80468 - _globals['_FENCEENABLESIGNALFTRACEEVENT']._serialized_start=80470 - _globals['_FENCEENABLESIGNALFTRACEEVENT']._serialized_end=80566 - _globals['_FENCESIGNALEDFTRACEEVENT']._serialized_start=80568 - _globals['_FENCESIGNALEDFTRACEEVENT']._serialized_end=80660 - _globals['_MMFILEMAPADDTOPAGECACHEFTRACEEVENT']._serialized_start=80662 - _globals['_MMFILEMAPADDTOPAGECACHEFTRACEEVENT']._serialized_end=80770 - _globals['_MMFILEMAPDELETEFROMPAGECACHEFTRACEEVENT']._serialized_start=80772 - _globals['_MMFILEMAPDELETEFROMPAGECACHEFTRACEEVENT']._serialized_end=80885 - _globals['_DOSYSOPENFTRACEEVENT']._serialized_start=80887 - _globals['_DOSYSOPENFTRACEEVENT']._serialized_end=80956 - _globals['_OPENEXECFTRACEEVENT']._serialized_start=80958 - _globals['_OPENEXECFTRACEEVENT']._serialized_end=80997 - _globals['_PRINTFTRACEEVENT']._serialized_start=80999 - _globals['_PRINTFTRACEEVENT']._serialized_end=81042 - _globals['_FUNCGRAPHENTRYFTRACEEVENT']._serialized_start=81044 - _globals['_FUNCGRAPHENTRYFTRACEEVENT']._serialized_end=81100 - _globals['_FUNCGRAPHEXITFTRACEEVENT']._serialized_start=81102 - _globals['_FUNCGRAPHEXITFTRACEEVENT']._serialized_end=81209 - _globals['_FWTPPERFETTOCOUNTERFTRACEEVENT']._serialized_start=81211 - _globals['_FWTPPERFETTOCOUNTERFTRACEEVENT']._serialized_end=81327 - _globals['_FWTPPERFETTOSLICEFTRACEEVENT']._serialized_start=81329 - _globals['_FWTPPERFETTOSLICEFTRACEEVENT']._serialized_end=81443 - _globals['_G2DTRACINGMARKWRITEFTRACEEVENT']._serialized_start=81445 - _globals['_G2DTRACINGMARKWRITEFTRACEEVENT']._serialized_end=81533 - _globals['_GENERICFTRACEEVENT']._serialized_start=81536 - _globals['_GENERICFTRACEEVENT']._serialized_end=81730 - _globals['_GENERICFTRACEEVENT_FIELD']._serialized_start=81636 - _globals['_GENERICFTRACEEVENT_FIELD']._serialized_end=81730 - _globals['_KPROBEEVENT']._serialized_start=81733 - _globals['_KPROBEEVENT']._serialized_end=81923 - _globals['_KPROBEEVENT_KPROBETYPE']._serialized_start=81817 - _globals['_KPROBEEVENT_KPROBETYPE']._serialized_end=81923 - _globals['_GOOGLEICCEVENTFTRACEEVENT']._serialized_start=81925 - _globals['_GOOGLEICCEVENTFTRACEEVENT']._serialized_end=81986 - _globals['_GOOGLEIRMEVENTFTRACEEVENT']._serialized_start=81988 - _globals['_GOOGLEIRMEVENTFTRACEEVENT']._serialized_end=82049 - _globals['_GPUMEMTOTALFTRACEEVENT']._serialized_start=82051 - _globals['_GPUMEMTOTALFTRACEEVENT']._serialized_end=82118 - _globals['_DRMSCHEDJOBFTRACEEVENT']._serialized_start=82120 - _globals['_DRMSCHEDJOBFTRACEEVENT']._serialized_end=82242 - _globals['_DRMRUNJOBFTRACEEVENT']._serialized_start=82244 - _globals['_DRMRUNJOBFTRACEEVENT']._serialized_end=82364 - _globals['_DRMSCHEDPROCESSJOBFTRACEEVENT']._serialized_start=82366 - _globals['_DRMSCHEDPROCESSJOBFTRACEEVENT']._serialized_end=82412 - _globals['_DRMSCHEDJOBADDDEPFTRACEEVENT']._serialized_start=82414 - _globals['_DRMSCHEDJOBADDDEPFTRACEEVENT']._serialized_end=82516 - _globals['_DRMSCHEDJOBDONEFTRACEEVENT']._serialized_start=82518 - _globals['_DRMSCHEDJOBDONEFTRACEEVENT']._serialized_end=82590 - _globals['_DRMSCHEDJOBQUEUEFTRACEEVENT']._serialized_start=82593 - _globals['_DRMSCHEDJOBQUEUEFTRACEEVENT']._serialized_end=82753 - _globals['_DRMSCHEDJOBRUNFTRACEEVENT']._serialized_start=82756 - _globals['_DRMSCHEDJOBRUNFTRACEEVENT']._serialized_end=82914 - _globals['_DRMSCHEDJOBUNSCHEDULABLEFTRACEEVENT']._serialized_start=82916 - _globals['_DRMSCHEDJOBUNSCHEDULABLEFTRACEEVENT']._serialized_end=83025 - _globals['_HYPENTERFTRACEEVENT']._serialized_start=83027 - _globals['_HYPENTERFTRACEEVENT']._serialized_end=83048 - _globals['_HYPEXITFTRACEEVENT']._serialized_start=83050 - _globals['_HYPEXITFTRACEEVENT']._serialized_end=83070 - _globals['_HOSTHCALLFTRACEEVENT']._serialized_start=83072 - _globals['_HOSTHCALLFTRACEEVENT']._serialized_end=83123 - _globals['_HOSTSMCFTRACEEVENT']._serialized_start=83125 - _globals['_HOSTSMCFTRACEEVENT']._serialized_end=83176 - _globals['_HOSTMEMABORTFTRACEEVENT']._serialized_start=83178 - _globals['_HOSTMEMABORTFTRACEEVENT']._serialized_end=83230 - _globals['_HOSTFFACALLFTRACEEVENT']._serialized_start=83233 - _globals['_HOSTFFACALLFTRACEEVENT']._serialized_end=83368 - _globals['_IOMMUIDMAPFTRACEEVENT']._serialized_start=83370 - _globals['_IOMMUIDMAPFTRACEEVENT']._serialized_end=83433 - _globals['_PSCIMEMPROTECTFTRACEEVENT']._serialized_start=83435 - _globals['_PSCIMEMPROTECTFTRACEEVENT']._serialized_end=83490 - _globals['_HYPERVISORHOSTHCALLFTRACEEVENT']._serialized_start=83492 - _globals['_HYPERVISORHOSTHCALLFTRACEEVENT']._serialized_end=83553 - _globals['_HYPERVISORHOSTSMCFTRACEEVENT']._serialized_start=83555 - _globals['_HYPERVISORHOSTSMCFTRACEEVENT']._serialized_end=83616 - _globals['_HYPERVISORHYPEXITFTRACEEVENT']._serialized_start=83618 - _globals['_HYPERVISORHYPEXITFTRACEEVENT']._serialized_end=83648 - _globals['_HYPERVISORIOMMUIDMAPFTRACEEVENT']._serialized_start=83650 - _globals['_HYPERVISORIOMMUIDMAPFTRACEEVENT']._serialized_end=83723 - _globals['_HYPERVISORPSCIMEMPROTECTFTRACEEVENT']._serialized_start=83725 - _globals['_HYPERVISORPSCIMEMPROTECTFTRACEEVENT']._serialized_end=83790 - _globals['_HYPERVISORHOSTMEMABORTFTRACEEVENT']._serialized_start=83792 - _globals['_HYPERVISORHOSTMEMABORTFTRACEEVENT']._serialized_end=83854 - _globals['_HYPERVISORHYPENTERFTRACEEVENT']._serialized_start=83856 - _globals['_HYPERVISORHYPENTERFTRACEEVENT']._serialized_end=83887 - _globals['_HYPERVISORIOMMUIDMAPCOMPLETEFTRACEEVENT']._serialized_start=83889 - _globals['_HYPERVISORIOMMUIDMAPCOMPLETEFTRACEEVENT']._serialized_end=83943 - _globals['_HYPERVISORVCPUILLEGALTRAPFTRACEEVENT']._serialized_start=83945 - _globals['_HYPERVISORVCPUILLEGALTRAPFTRACEEVENT']._serialized_end=83996 - _globals['_I2CREADFTRACEEVENT']._serialized_start=83998 - _globals['_I2CREADFTRACEEVENT']._serialized_end=84096 - _globals['_I2CWRITEFTRACEEVENT']._serialized_start=84098 - _globals['_I2CWRITEFTRACEEVENT']._serialized_end=84210 - _globals['_I2CRESULTFTRACEEVENT']._serialized_start=84212 - _globals['_I2CRESULTFTRACEEVENT']._serialized_end=84284 - _globals['_I2CREPLYFTRACEEVENT']._serialized_start=84286 - _globals['_I2CREPLYFTRACEEVENT']._serialized_end=84398 - _globals['_SMBUSREADFTRACEEVENT']._serialized_start=84400 - _globals['_SMBUSREADFTRACEEVENT']._serialized_end=84506 - _globals['_SMBUSWRITEFTRACEEVENT']._serialized_start=84508 - _globals['_SMBUSWRITEFTRACEEVENT']._serialized_end=84628 - _globals['_SMBUSRESULTFTRACEEVENT']._serialized_start=84631 - _globals['_SMBUSRESULTFTRACEEVENT']._serialized_end=84772 - _globals['_SMBUSREPLYFTRACEEVENT']._serialized_start=84774 - _globals['_SMBUSREPLYFTRACEEVENT']._serialized_end=84894 - _globals['_IONSTATFTRACEEVENT']._serialized_start=84896 - _globals['_IONSTATFTRACEEVENT']._serialized_end=84973 - _globals['_IPIENTRYFTRACEEVENT']._serialized_start=84975 - _globals['_IPIENTRYFTRACEEVENT']._serialized_end=85012 - _globals['_IPIEXITFTRACEEVENT']._serialized_start=85014 - _globals['_IPIEXITFTRACEEVENT']._serialized_end=85050 - _globals['_IPIRAISEFTRACEEVENT']._serialized_start=85052 - _globals['_IPIRAISEFTRACEEVENT']._serialized_end=85110 - _globals['_SOFTIRQENTRYFTRACEEVENT']._serialized_start=85112 - _globals['_SOFTIRQENTRYFTRACEEVENT']._serialized_end=85150 - _globals['_SOFTIRQEXITFTRACEEVENT']._serialized_start=85152 - _globals['_SOFTIRQEXITFTRACEEVENT']._serialized_end=85189 - _globals['_SOFTIRQRAISEFTRACEEVENT']._serialized_start=85191 - _globals['_SOFTIRQRAISEFTRACEEVENT']._serialized_end=85229 - _globals['_IRQHANDLERENTRYFTRACEEVENT']._serialized_start=85231 - _globals['_IRQHANDLERENTRYFTRACEEVENT']._serialized_end=85303 - _globals['_IRQHANDLEREXITFTRACEEVENT']._serialized_start=85305 - _globals['_IRQHANDLEREXITFTRACEEVENT']._serialized_end=85358 - _globals['_LOCALTIMERENTRYFTRACEEVENT']._serialized_start=85360 - _globals['_LOCALTIMERENTRYFTRACEEVENT']._serialized_end=85404 - _globals['_LOCALTIMEREXITFTRACEEVENT']._serialized_start=85406 - _globals['_LOCALTIMEREXITFTRACEEVENT']._serialized_end=85449 - _globals['_KGSLGPUFREQUENCYFTRACEEVENT']._serialized_start=85451 - _globals['_KGSLGPUFREQUENCYFTRACEEVENT']._serialized_end=85514 - _globals['_KGSLADRENOCMDBATCHQUEUEDFTRACEEVENT']._serialized_start=85516 - _globals['_KGSLADRENOCMDBATCHQUEUEDFTRACEEVENT']._serialized_end=85629 - _globals['_KGSLADRENOCMDBATCHSUBMITTEDFTRACEEVENT']._serialized_start=85632 - _globals['_KGSLADRENOCMDBATCHSUBMITTEDFTRACEEVENT']._serialized_end=85881 - _globals['_KGSLADRENOCMDBATCHSYNCFTRACEEVENT']._serialized_start=85883 - _globals['_KGSLADRENOCMDBATCHSYNCFTRACEEVENT']._serialized_end=85978 - _globals['_KGSLADRENOCMDBATCHRETIREDFTRACEEVENT']._serialized_start=85981 - _globals['_KGSLADRENOCMDBATCHRETIREDFTRACEEVENT']._serialized_end=86322 - _globals['_ALLOCPAGESIOMMUENDFTRACEEVENT']._serialized_start=86324 - _globals['_ALLOCPAGESIOMMUENDFTRACEEVENT']._serialized_end=86389 - _globals['_ALLOCPAGESIOMMUFAILFTRACEEVENT']._serialized_start=86391 - _globals['_ALLOCPAGESIOMMUFAILFTRACEEVENT']._serialized_end=86457 - _globals['_ALLOCPAGESIOMMUSTARTFTRACEEVENT']._serialized_start=86459 - _globals['_ALLOCPAGESIOMMUSTARTFTRACEEVENT']._serialized_end=86526 - _globals['_ALLOCPAGESSYSENDFTRACEEVENT']._serialized_start=86528 - _globals['_ALLOCPAGESSYSENDFTRACEEVENT']._serialized_end=86591 - _globals['_ALLOCPAGESSYSFAILFTRACEEVENT']._serialized_start=86593 - _globals['_ALLOCPAGESSYSFAILFTRACEEVENT']._serialized_end=86657 - _globals['_ALLOCPAGESSYSSTARTFTRACEEVENT']._serialized_start=86659 - _globals['_ALLOCPAGESSYSSTARTFTRACEEVENT']._serialized_end=86724 - _globals['_DMAALLOCCONTIGUOUSRETRYFTRACEEVENT']._serialized_start=86726 - _globals['_DMAALLOCCONTIGUOUSRETRYFTRACEEVENT']._serialized_end=86777 - _globals['_IOMMUMAPRANGEFTRACEEVENT']._serialized_start=86779 - _globals['_IOMMUMAPRANGEFTRACEEVENT']._serialized_end=86862 - _globals['_IOMMUSECPTBLMAPRANGEENDFTRACEEVENT']._serialized_start=86864 - _globals['_IOMMUSECPTBLMAPRANGEENDFTRACEEVENT']._serialized_end=86966 - _globals['_IOMMUSECPTBLMAPRANGESTARTFTRACEEVENT']._serialized_start=86968 - _globals['_IOMMUSECPTBLMAPRANGESTARTFTRACEEVENT']._serialized_end=87072 - _globals['_IONALLOCBUFFERENDFTRACEEVENT']._serialized_start=87074 - _globals['_IONALLOCBUFFERENDFTRACEEVENT']._serialized_end=87186 - _globals['_IONALLOCBUFFERFAILFTRACEEVENT']._serialized_start=87189 - _globals['_IONALLOCBUFFERFAILFTRACEEVENT']._serialized_end=87317 - _globals['_IONALLOCBUFFERFALLBACKFTRACEEVENT']._serialized_start=87320 - _globals['_IONALLOCBUFFERFALLBACKFTRACEEVENT']._serialized_end=87452 - _globals['_IONALLOCBUFFERSTARTFTRACEEVENT']._serialized_start=87454 - _globals['_IONALLOCBUFFERSTARTFTRACEEVENT']._serialized_end=87568 - _globals['_IONCPALLOCRETRYFTRACEEVENT']._serialized_start=87570 - _globals['_IONCPALLOCRETRYFTRACEEVENT']._serialized_end=87613 - _globals['_IONCPSECUREBUFFERENDFTRACEEVENT']._serialized_start=87615 - _globals['_IONCPSECUREBUFFERENDFTRACEEVENT']._serialized_end=87710 - _globals['_IONCPSECUREBUFFERSTARTFTRACEEVENT']._serialized_start=87712 - _globals['_IONCPSECUREBUFFERSTARTFTRACEEVENT']._serialized_end=87809 - _globals['_IONPREFETCHINGFTRACEEVENT']._serialized_start=87811 - _globals['_IONPREFETCHINGFTRACEEVENT']._serialized_end=87851 - _globals['_IONSECURECMAADDTOPOOLENDFTRACEEVENT']._serialized_start=87853 - _globals['_IONSECURECMAADDTOPOOLENDFTRACEEVENT']._serialized_end=87944 - _globals['_IONSECURECMAADDTOPOOLSTARTFTRACEEVENT']._serialized_start=87946 - _globals['_IONSECURECMAADDTOPOOLSTARTFTRACEEVENT']._serialized_end=88039 - _globals['_IONSECURECMAALLOCATEENDFTRACEEVENT']._serialized_start=88041 - _globals['_IONSECURECMAALLOCATEENDFTRACEEVENT']._serialized_end=88139 - _globals['_IONSECURECMAALLOCATESTARTFTRACEEVENT']._serialized_start=88141 - _globals['_IONSECURECMAALLOCATESTARTFTRACEEVENT']._serialized_end=88241 - _globals['_IONSECURECMASHRINKPOOLENDFTRACEEVENT']._serialized_start=88243 - _globals['_IONSECURECMASHRINKPOOLENDFTRACEEVENT']._serialized_end=88325 - _globals['_IONSECURECMASHRINKPOOLSTARTFTRACEEVENT']._serialized_start=88327 - _globals['_IONSECURECMASHRINKPOOLSTARTFTRACEEVENT']._serialized_end=88411 - _globals['_KFREEFTRACEEVENT']._serialized_start=88413 - _globals['_KFREEFTRACEEVENT']._serialized_end=88463 - _globals['_KMALLOCFTRACEEVENT']._serialized_start=88465 - _globals['_KMALLOCFTRACEEVENT']._serialized_end=88576 - _globals['_KMALLOCNODEFTRACEEVENT']._serialized_start=88579 - _globals['_KMALLOCNODEFTRACEEVENT']._serialized_end=88708 - _globals['_KMEMCACHEALLOCFTRACEEVENT']._serialized_start=88710 - _globals['_KMEMCACHEALLOCFTRACEEVENT']._serialized_end=88828 - _globals['_KMEMCACHEALLOCNODEFTRACEEVENT']._serialized_start=88831 - _globals['_KMEMCACHEALLOCNODEFTRACEEVENT']._serialized_end=88967 - _globals['_KMEMCACHEFREEFTRACEEVENT']._serialized_start=88969 - _globals['_KMEMCACHEFREEFTRACEEVENT']._serialized_end=89027 - _globals['_MIGRATEPAGESENDFTRACEEVENT']._serialized_start=89029 - _globals['_MIGRATEPAGESENDFTRACEEVENT']._serialized_end=89071 - _globals['_MIGRATEPAGESSTARTFTRACEEVENT']._serialized_start=89073 - _globals['_MIGRATEPAGESSTARTFTRACEEVENT']._serialized_end=89117 - _globals['_MIGRATERETRYFTRACEEVENT']._serialized_start=89119 - _globals['_MIGRATERETRYFTRACEEVENT']._serialized_end=89159 - _globals['_MMPAGEALLOCFTRACEEVENT']._serialized_start=89161 - _globals['_MMPAGEALLOCFTRACEEVENT']._serialized_end=89267 - _globals['_MMPAGEALLOCEXTFRAGFTRACEEVENT']._serialized_start=89270 - _globals['_MMPAGEALLOCEXTFRAGFTRACEEVENT']._serialized_end=89456 - _globals['_MMPAGEALLOCZONELOCKEDFTRACEEVENT']._serialized_start=89458 - _globals['_MMPAGEALLOCZONELOCKEDFTRACEEVENT']._serialized_end=89555 - _globals['_MMPAGEFREEFTRACEEVENT']._serialized_start=89557 - _globals['_MMPAGEFREEFTRACEEVENT']._serialized_end=89622 - _globals['_MMPAGEFREEBATCHEDFTRACEEVENT']._serialized_start=89624 - _globals['_MMPAGEFREEBATCHEDFTRACEEVENT']._serialized_end=89695 - _globals['_MMPAGEPCPUDRAINFTRACEEVENT']._serialized_start=89697 - _globals['_MMPAGEPCPUDRAINFTRACEEVENT']._serialized_end=89788 - _globals['_RSSSTATFTRACEEVENT']._serialized_start=89790 - _globals['_RSSSTATFTRACEEVENT']._serialized_end=89869 - _globals['_IONHEAPSHRINKFTRACEEVENT']._serialized_start=89871 - _globals['_IONHEAPSHRINKFTRACEEVENT']._serialized_end=89954 - _globals['_IONHEAPGROWFTRACEEVENT']._serialized_start=89956 - _globals['_IONHEAPGROWFTRACEEVENT']._serialized_end=90037 - _globals['_IONBUFFERCREATEFTRACEEVENT']._serialized_start=90039 - _globals['_IONBUFFERCREATEFTRACEEVENT']._serialized_end=90094 - _globals['_IONBUFFERDESTROYFTRACEEVENT']._serialized_start=90096 - _globals['_IONBUFFERDESTROYFTRACEEVENT']._serialized_end=90152 - _globals['_MMALLOCCONTIGMIGRATERANGEINFOFTRACEEVENT']._serialized_start=90155 - _globals['_MMALLOCCONTIGMIGRATERANGEINFOFTRACEEVENT']._serialized_end=90308 - _globals['_DMABUFRSSSTATFTRACEEVENT']._serialized_start=90310 - _globals['_DMABUFRSSSTATFTRACEEVENT']._serialized_end=90383 - _globals['_KVMACCESSFAULTFTRACEEVENT']._serialized_start=90385 - _globals['_KVMACCESSFAULTFTRACEEVENT']._serialized_end=90425 - _globals['_KVMACKIRQFTRACEEVENT']._serialized_start=90427 - _globals['_KVMACKIRQFTRACEEVENT']._serialized_end=90479 - _globals['_KVMAGEHVAFTRACEEVENT']._serialized_start=90481 - _globals['_KVMAGEHVAFTRACEEVENT']._serialized_end=90531 - _globals['_KVMAGEPAGEFTRACEEVENT']._serialized_start=90533 - _globals['_KVMAGEPAGEFTRACEEVENT']._serialized_end=90617 - _globals['_KVMARMCLEARDEBUGFTRACEEVENT']._serialized_start=90619 - _globals['_KVMARMCLEARDEBUGFTRACEEVENT']._serialized_end=90669 - _globals['_KVMARMSETDREG32FTRACEEVENT']._serialized_start=90671 - _globals['_KVMARMSETDREG32FTRACEEVENT']._serialized_end=90728 - _globals['_KVMARMSETREGSETFTRACEEVENT']._serialized_start=90730 - _globals['_KVMARMSETREGSETFTRACEEVENT']._serialized_end=90785 - _globals['_KVMARMSETUPDEBUGFTRACEEVENT']._serialized_start=90787 - _globals['_KVMARMSETUPDEBUGFTRACEEVENT']._serialized_end=90851 - _globals['_KVMENTRYFTRACEEVENT']._serialized_start=90853 - _globals['_KVMENTRYFTRACEEVENT']._serialized_end=90891 - _globals['_KVMEXITFTRACEEVENT']._serialized_start=90893 - _globals['_KVMEXITFTRACEEVENT']._serialized_end=90959 - _globals['_KVMFPUFTRACEEVENT']._serialized_start=90961 - _globals['_KVMFPUFTRACEEVENT']._serialized_end=90994 - _globals['_KVMGETTIMERMAPFTRACEEVENT']._serialized_start=90996 - _globals['_KVMGETTIMERMAPFTRACEEVENT']._serialized_end=91107 - _globals['_KVMGUESTFAULTFTRACEEVENT']._serialized_start=91109 - _globals['_KVMGUESTFAULTFTRACEEVENT']._serialized_end=91193 - _globals['_KVMHANDLESYSREGFTRACEEVENT']._serialized_start=91195 - _globals['_KVMHANDLESYSREGFTRACEEVENT']._serialized_end=91236 - _globals['_KVMHVCARM64FTRACEEVENT']._serialized_start=91238 - _globals['_KVMHVCARM64FTRACEEVENT']._serialized_end=91304 - _globals['_KVMIRQLINEFTRACEEVENT']._serialized_start=91306 - _globals['_KVMIRQLINEFTRACEEVENT']._serialized_end=91393 - _globals['_KVMMMIOFTRACEEVENT']._serialized_start=91395 - _globals['_KVMMMIOFTRACEEVENT']._serialized_end=91468 - _globals['_KVMMMIOEMULATEFTRACEEVENT']._serialized_start=91470 - _globals['_KVMMMIOEMULATEFTRACEEVENT']._serialized_end=91543 - _globals['_KVMSETGUESTDEBUGFTRACEEVENT']._serialized_start=91545 - _globals['_KVMSETGUESTDEBUGFTRACEEVENT']._serialized_end=91609 - _globals['_KVMSETIRQFTRACEEVENT']._serialized_start=91611 - _globals['_KVMSETIRQFTRACEEVENT']._serialized_end=91684 - _globals['_KVMSETSPTEHVAFTRACEEVENT']._serialized_start=91686 - _globals['_KVMSETSPTEHVAFTRACEEVENT']._serialized_end=91725 - _globals['_KVMSETWAYFLUSHFTRACEEVENT']._serialized_start=91727 - _globals['_KVMSETWAYFLUSHFTRACEEVENT']._serialized_end=91786 - _globals['_KVMSYSACCESSFTRACEEVENT']._serialized_start=91789 - _globals['_KVMSYSACCESSFTRACEEVENT']._serialized_end=91928 - _globals['_KVMTESTAGEHVAFTRACEEVENT']._serialized_start=91930 - _globals['_KVMTESTAGEHVAFTRACEEVENT']._serialized_end=91969 - _globals['_KVMTIMEREMULATEFTRACEEVENT']._serialized_start=91971 - _globals['_KVMTIMEREMULATEFTRACEEVENT']._serialized_end=92039 - _globals['_KVMTIMERHRTIMEREXPIREFTRACEEVENT']._serialized_start=92041 - _globals['_KVMTIMERHRTIMEREXPIREFTRACEEVENT']._serialized_end=92094 - _globals['_KVMTIMERRESTORESTATEFTRACEEVENT']._serialized_start=92096 - _globals['_KVMTIMERRESTORESTATEFTRACEEVENT']._serialized_end=92175 - _globals['_KVMTIMERSAVESTATEFTRACEEVENT']._serialized_start=92177 - _globals['_KVMTIMERSAVESTATEFTRACEEVENT']._serialized_end=92253 - _globals['_KVMTIMERUPDATEIRQFTRACEEVENT']._serialized_start=92255 - _globals['_KVMTIMERUPDATEIRQFTRACEEVENT']._serialized_end=92330 - _globals['_KVMTOGGLECACHEFTRACEEVENT']._serialized_start=92332 - _globals['_KVMTOGGLECACHEFTRACEEVENT']._serialized_end=92402 - _globals['_KVMUNMAPHVARANGEFTRACEEVENT']._serialized_start=92404 - _globals['_KVMUNMAPHVARANGEFTRACEEVENT']._serialized_end=92461 - _globals['_KVMUSERSPACEEXITFTRACEEVENT']._serialized_start=92463 - _globals['_KVMUSERSPACEEXITFTRACEEVENT']._serialized_end=92508 - _globals['_KVMVCPUWAKEUPFTRACEEVENT']._serialized_start=92510 - _globals['_KVMVCPUWAKEUPFTRACEEVENT']._serialized_end=92579 - _globals['_KVMWFXARM64FTRACEEVENT']._serialized_start=92581 - _globals['_KVMWFXARM64FTRACEEVENT']._serialized_end=92638 - _globals['_TRAPREGFTRACEEVENT']._serialized_start=92640 - _globals['_TRAPREGFTRACEEVENT']._serialized_end=92724 - _globals['_VGICUPDATEIRQPENDINGFTRACEEVENT']._serialized_start=92726 - _globals['_VGICUPDATEIRQPENDINGFTRACEEVENT']._serialized_end=92804 - _globals['_LOWMEMORYKILLFTRACEEVENT']._serialized_start=92806 - _globals['_LOWMEMORYKILLFTRACEEVENT']._serialized_end=92922 - _globals['_LWISTRACINGMARKWRITEFTRACEEVENT']._serialized_start=92924 - _globals['_LWISTRACINGMARKWRITEFTRACEEVENT']._serialized_end=93037 - _globals['_MALITRACINGMARKWRITEFTRACEEVENT']._serialized_start=93039 - _globals['_MALITRACINGMARKWRITEFTRACEEVENT']._serialized_end=93128 - _globals['_MALIMALIKCPUCQSSETFTRACEEVENT']._serialized_start=93130 - _globals['_MALIMALIKCPUCQSSETFTRACEEVENT']._serialized_end=93247 - _globals['_MALIMALIKCPUCQSWAITSTARTFTRACEEVENT']._serialized_start=93249 - _globals['_MALIMALIKCPUCQSWAITSTARTFTRACEEVENT']._serialized_end=93372 - _globals['_MALIMALIKCPUCQSWAITENDFTRACEEVENT']._serialized_start=93374 - _globals['_MALIMALIKCPUCQSWAITENDFTRACEEVENT']._serialized_end=93495 - _globals['_MALIMALIKCPUFENCESIGNALFTRACEEVENT']._serialized_start=93497 - _globals['_MALIMALIKCPUFENCESIGNALFTRACEEVENT']._serialized_end=93619 - _globals['_MALIMALIKCPUFENCEWAITSTARTFTRACEEVENT']._serialized_start=93621 - _globals['_MALIMALIKCPUFENCEWAITSTARTFTRACEEVENT']._serialized_end=93746 - _globals['_MALIMALIKCPUFENCEWAITENDFTRACEEVENT']._serialized_start=93748 - _globals['_MALIMALIKCPUFENCEWAITENDFTRACEEVENT']._serialized_end=93871 - _globals['_MALIMALICSFINTERRUPTSTARTFTRACEEVENT']._serialized_start=93873 - _globals['_MALIMALICSFINTERRUPTSTARTFTRACEEVENT']._serialized_end=93965 - _globals['_MALIMALICSFINTERRUPTENDFTRACEEVENT']._serialized_start=93967 - _globals['_MALIMALICSFINTERRUPTENDFTRACEEVENT']._serialized_end=94057 - _globals['_MALIMALIPMMCUHCTLCORESDOWNSCALENOTIFYPENDFTRACEEVENT']._serialized_start=94059 - _globals['_MALIMALIPMMCUHCTLCORESDOWNSCALENOTIFYPENDFTRACEEVENT']._serialized_end=94167 - _globals['_MALIMALIPMMCUHCTLCORESNOTIFYPENDFTRACEEVENT']._serialized_start=94169 - _globals['_MALIMALIPMMCUHCTLCORESNOTIFYPENDFTRACEEVENT']._serialized_end=94268 - _globals['_MALIMALIPMMCUHCTLCOREINACTIVEPENDFTRACEEVENT']._serialized_start=94270 - _globals['_MALIMALIPMMCUHCTLCOREINACTIVEPENDFTRACEEVENT']._serialized_end=94370 - _globals['_MALIMALIPMMCUHCTLMCUONRECHECKFTRACEEVENT']._serialized_start=94372 - _globals['_MALIMALIPMMCUHCTLMCUONRECHECKFTRACEEVENT']._serialized_end=94468 - _globals['_MALIMALIPMMCUHCTLSHADERSCOREOFFPENDFTRACEEVENT']._serialized_start=94470 - _globals['_MALIMALIPMMCUHCTLSHADERSCOREOFFPENDFTRACEEVENT']._serialized_end=94572 - _globals['_MALIMALIPMMCUHCTLSHADERSPENDOFFFTRACEEVENT']._serialized_start=94574 - _globals['_MALIMALIPMMCUHCTLSHADERSPENDOFFFTRACEEVENT']._serialized_end=94672 - _globals['_MALIMALIPMMCUHCTLSHADERSPENDONFTRACEEVENT']._serialized_start=94674 - _globals['_MALIMALIPMMCUHCTLSHADERSPENDONFTRACEEVENT']._serialized_end=94771 - _globals['_MALIMALIPMMCUHCTLSHADERSREADYOFFFTRACEEVENT']._serialized_start=94773 - _globals['_MALIMALIPMMCUHCTLSHADERSREADYOFFFTRACEEVENT']._serialized_end=94872 - _globals['_MALIMALIPMMCUINSLEEPFTRACEEVENT']._serialized_start=94874 - _globals['_MALIMALIPMMCUINSLEEPFTRACEEVENT']._serialized_end=94961 - _globals['_MALIMALIPMMCUOFFFTRACEEVENT']._serialized_start=94963 - _globals['_MALIMALIPMMCUOFFFTRACEEVENT']._serialized_end=95046 - _globals['_MALIMALIPMMCUONFTRACEEVENT']._serialized_start=95048 - _globals['_MALIMALIPMMCUONFTRACEEVENT']._serialized_end=95130 - _globals['_MALIMALIPMMCUONCOREATTRUPDATEPENDFTRACEEVENT']._serialized_start=95132 - _globals['_MALIMALIPMMCUONCOREATTRUPDATEPENDFTRACEEVENT']._serialized_end=95232 - _globals['_MALIMALIPMMCUONGLBREINITPENDFTRACEEVENT']._serialized_start=95234 - _globals['_MALIMALIPMMCUONGLBREINITPENDFTRACEEVENT']._serialized_end=95329 - _globals['_MALIMALIPMMCUONHALTFTRACEEVENT']._serialized_start=95331 - _globals['_MALIMALIPMMCUONHALTFTRACEEVENT']._serialized_end=95417 - _globals['_MALIMALIPMMCUONHWCNTDISABLEFTRACEEVENT']._serialized_start=95419 - _globals['_MALIMALIPMMCUONHWCNTDISABLEFTRACEEVENT']._serialized_end=95513 - _globals['_MALIMALIPMMCUONHWCNTENABLEFTRACEEVENT']._serialized_start=95515 - _globals['_MALIMALIPMMCUONHWCNTENABLEFTRACEEVENT']._serialized_end=95608 - _globals['_MALIMALIPMMCUONPENDHALTFTRACEEVENT']._serialized_start=95610 - _globals['_MALIMALIPMMCUONPENDHALTFTRACEEVENT']._serialized_end=95700 - _globals['_MALIMALIPMMCUONPENDSLEEPFTRACEEVENT']._serialized_start=95702 - _globals['_MALIMALIPMMCUONPENDSLEEPFTRACEEVENT']._serialized_end=95793 - _globals['_MALIMALIPMMCUONSLEEPINITIATEFTRACEEVENT']._serialized_start=95795 - _globals['_MALIMALIPMMCUONSLEEPINITIATEFTRACEEVENT']._serialized_end=95890 - _globals['_MALIMALIPMMCUPENDOFFFTRACEEVENT']._serialized_start=95892 - _globals['_MALIMALIPMMCUPENDOFFFTRACEEVENT']._serialized_end=95979 - _globals['_MALIMALIPMMCUPENDONRELOADFTRACEEVENT']._serialized_start=95981 - _globals['_MALIMALIPMMCUPENDONRELOADFTRACEEVENT']._serialized_end=96073 - _globals['_MALIMALIPMMCUPOWERDOWNFTRACEEVENT']._serialized_start=96075 - _globals['_MALIMALIPMMCUPOWERDOWNFTRACEEVENT']._serialized_end=96164 - _globals['_MALIMALIPMMCURESETWAITFTRACEEVENT']._serialized_start=96166 - _globals['_MALIMALIPMMCURESETWAITFTRACEEVENT']._serialized_end=96255 - _globals['_MALIGPUPOWERSTATEFTRACEEVENT']._serialized_start=96257 - _globals['_MALIGPUPOWERSTATEFTRACEEVENT']._serialized_end=96344 - _globals['_MDPCMDKICKOFFFTRACEEVENT']._serialized_start=96346 - _globals['_MDPCMDKICKOFFFTRACEEVENT']._serialized_end=96410 - _globals['_MDPCOMMITFTRACEEVENT']._serialized_start=96412 - _globals['_MDPCOMMITFTRACEEVENT']._serialized_end=96502 - _globals['_MDPPERFSETOTFTRACEEVENT']._serialized_start=96504 - _globals['_MDPPERFSETOTFTRACEEVENT']._serialized_end=96595 - _globals['_MDPSSPPCHANGEFTRACEEVENT']._serialized_start=96598 - _globals['_MDPSSPPCHANGEFTRACEEVENT']._serialized_end=96866 - _globals['_TRACINGMARKWRITEFTRACEEVENT']._serialized_start=96868 - _globals['_TRACINGMARKWRITEFTRACEEVENT']._serialized_end=96951 - _globals['_MDPCMDPINGPONGDONEFTRACEEVENT']._serialized_start=96953 - _globals['_MDPCMDPINGPONGDONEFTRACEEVENT']._serialized_end=97053 - _globals['_MDPCOMPAREBWFTRACEEVENT']._serialized_start=97056 - _globals['_MDPCOMPAREBWFTRACEEVENT']._serialized_end=97220 - _globals['_MDPPERFSETPANICLUTSFTRACEEVENT']._serialized_start=97222 - _globals['_MDPPERFSETPANICLUTSFTRACEEVENT']._serialized_end=97334 - _globals['_MDPSSPPSETFTRACEEVENT']._serialized_start=97337 - _globals['_MDPSSPPSETFTRACEEVENT']._serialized_end=97602 - _globals['_MDPCMDREADPTRDONEFTRACEEVENT']._serialized_start=97604 - _globals['_MDPCMDREADPTRDONEFTRACEEVENT']._serialized_end=97669 - _globals['_MDPMISRCRCFTRACEEVENT']._serialized_start=97671 - _globals['_MDPMISRCRCFTRACEEVENT']._serialized_end=97744 - _globals['_MDPPERFSETQOSLUTSFTRACEEVENT']._serialized_start=97746 - _globals['_MDPPERFSETQOSLUTSFTRACEEVENT']._serialized_end=97871 - _globals['_MDPTRACECOUNTERFTRACEEVENT']._serialized_start=97873 - _globals['_MDPTRACECOUNTERFTRACEEVENT']._serialized_end=97951 - _globals['_MDPCMDRELEASEBWFTRACEEVENT']._serialized_start=97953 - _globals['_MDPCMDRELEASEBWFTRACEEVENT']._serialized_end=97998 - _globals['_MDPMIXERUPDATEFTRACEEVENT']._serialized_start=98000 - _globals['_MDPMIXERUPDATEFTRACEEVENT']._serialized_end=98046 - _globals['_MDPPERFSETWMLEVELSFTRACEEVENT']._serialized_start=98049 - _globals['_MDPPERFSETWMLEVELSFTRACEEVENT']._serialized_end=98209 - _globals['_MDPVIDEOUNDERRUNDONEFTRACEEVENT']._serialized_start=98211 - _globals['_MDPVIDEOUNDERRUNDONEFTRACEEVENT']._serialized_end=98283 - _globals['_MDPCMDWAITPINGPONGFTRACEEVENT']._serialized_start=98285 - _globals['_MDPCMDWAITPINGPONGFTRACEEVENT']._serialized_end=98354 - _globals['_MDPPERFPREFILLCALCFTRACEEVENT']._serialized_start=98357 - _globals['_MDPPERFPREFILLCALCFTRACEEVENT']._serialized_end=98563 - _globals['_MDPPERFUPDATEBUSFTRACEEVENT']._serialized_start=98565 - _globals['_MDPPERFUPDATEBUSFTRACEEVENT']._serialized_end=98646 - _globals['_ROTATORBWAOASCONTEXTFTRACEEVENT']._serialized_start=98648 - _globals['_ROTATORBWAOASCONTEXTFTRACEEVENT']._serialized_end=98696 - _globals['_MMEVENTRECORDFTRACEEVENT']._serialized_start=98698 - _globals['_MMEVENTRECORDFTRACEEVENT']._serialized_end=98787 - _globals['_NETIFRECEIVESKBFTRACEEVENT']._serialized_start=98789 - _globals['_NETIFRECEIVESKBFTRACEEVENT']._serialized_end=98861 - _globals['_NETDEVXMITFTRACEEVENT']._serialized_start=98863 - _globals['_NETDEVXMITFTRACEEVENT']._serialized_end=98942 - _globals['_NAPIGRORECEIVEENTRYFTRACEEVENT']._serialized_start=98945 - _globals['_NAPIGRORECEIVEENTRYFTRACEEVENT']._serialized_end=99324 - _globals['_NAPIGRORECEIVEEXITFTRACEEVENT']._serialized_start=99326 - _globals['_NAPIGRORECEIVEEXITFTRACEEVENT']._serialized_end=99370 - _globals['_OOMSCOREADJUPDATEFTRACEEVENT']._serialized_start=99372 - _globals['_OOMSCOREADJUPDATEFTRACEEVENT']._serialized_end=99452 - _globals['_MARKVICTIMFTRACEEVENT']._serialized_start=99454 - _globals['_MARKVICTIMFTRACEEVENT']._serialized_end=99490 - _globals['_DSICMDFIFOSTATUSFTRACEEVENT']._serialized_start=99492 - _globals['_DSICMDFIFOSTATUSFTRACEEVENT']._serialized_end=99554 - _globals['_DSIRXFTRACEEVENT']._serialized_start=99556 - _globals['_DSIRXFTRACEEVENT']._serialized_end=99603 - _globals['_DSITXFTRACEEVENT']._serialized_start=99605 - _globals['_DSITXFTRACEEVENT']._serialized_end=99667 - _globals['_PANELWRITEGENERICFTRACEEVENT']._serialized_start=99669 - _globals['_PANELWRITEGENERICFTRACEEVENT']._serialized_end=99796 - _globals['_GRAMCOLLISIONFTRACEEVENT']._serialized_start=99798 - _globals['_GRAMCOLLISIONFTRACEEVENT']._serialized_end=99868 - _globals['_PANELSETTINGSFULLFTRACEEVENT']._serialized_start=99871 - _globals['_PANELSETTINGSFULLFTRACEEVENT']._serialized_end=100068 - _globals['_PANELSETTINGSLITEFTRACEEVENT']._serialized_start=100070 - _globals['_PANELSETTINGSLITEFTRACEEVENT']._serialized_end=100183 - _globals['_SCHEDSWITCHWITHCTRSFTRACEEVENT']._serialized_start=100186 - _globals['_SCHEDSWITCHWITHCTRSFTRACEEVENT']._serialized_end=100574 - _globals['_PIXELMMKSWAPDWAKEFTRACEEVENT']._serialized_start=100576 - _globals['_PIXELMMKSWAPDWAKEFTRACEEVENT']._serialized_end=100624 - _globals['_PIXELMMKSWAPDDONEFTRACEEVENT']._serialized_start=100627 - _globals['_PIXELMMKSWAPDDONEFTRACEEVENT']._serialized_end=100760 - _globals['_CPUFREQUENCYFTRACEEVENT']._serialized_start=100762 - _globals['_CPUFREQUENCYFTRACEEVENT']._serialized_end=100818 - _globals['_CPUFREQUENCYLIMITSFTRACEEVENT']._serialized_start=100820 - _globals['_CPUFREQUENCYLIMITSFTRACEEVENT']._serialized_end=100903 - _globals['_CPUIDLEFTRACEEVENT']._serialized_start=100905 - _globals['_CPUIDLEFTRACEEVENT']._serialized_end=100956 - _globals['_CLOCKENABLEFTRACEEVENT']._serialized_start=100958 - _globals['_CLOCKENABLEFTRACEEVENT']._serialized_end=101027 - _globals['_CLOCKDISABLEFTRACEEVENT']._serialized_start=101029 - _globals['_CLOCKDISABLEFTRACEEVENT']._serialized_end=101099 - _globals['_CLOCKSETRATEFTRACEEVENT']._serialized_start=101101 - _globals['_CLOCKSETRATEFTRACEEVENT']._serialized_end=101171 - _globals['_SUSPENDRESUMEFTRACEEVENT']._serialized_start=101173 - _globals['_SUSPENDRESUMEFTRACEEVENT']._serialized_end=101243 - _globals['_GPUFREQUENCYFTRACEEVENT']._serialized_start=101245 - _globals['_GPUFREQUENCYFTRACEEVENT']._serialized_end=101301 - _globals['_WAKEUPSOURCEACTIVATEFTRACEEVENT']._serialized_start=101303 - _globals['_WAKEUPSOURCEACTIVATEFTRACEEVENT']._serialized_end=101365 - _globals['_WAKEUPSOURCEDEACTIVATEFTRACEEVENT']._serialized_start=101367 - _globals['_WAKEUPSOURCEDEACTIVATEFTRACEEVENT']._serialized_end=101431 - _globals['_GPUWORKPERIODFTRACEEVENT']._serialized_start=101434 - _globals['_GPUWORKPERIODFTRACEEVENT']._serialized_end=101567 - _globals['_DEVICEPMCALLBACKSTARTFTRACEEVENT']._serialized_start=101569 - _globals['_DEVICEPMCALLBACKSTARTFTRACEEVENT']._serialized_end=101682 - _globals['_DEVICEPMCALLBACKENDFTRACEEVENT']._serialized_start=101684 - _globals['_DEVICEPMCALLBACKENDFTRACEEVENT']._serialized_end=101763 - _globals['_GPUPOWERSTATEFTRACEEVENT']._serialized_start=101765 - _globals['_GPUPOWERSTATEFTRACEEVENT']._serialized_end=101829 - _globals['_PSCIDOMAINIDLEEXITFTRACEEVENT']._serialized_start=101831 - _globals['_PSCIDOMAINIDLEEXITFTRACEEVENT']._serialized_end=101909 - _globals['_PSCIDOMAINIDLEENTERFTRACEEVENT']._serialized_start=101911 - _globals['_PSCIDOMAINIDLEENTERFTRACEEVENT']._serialized_end=101990 - _globals['_CONSOLEFTRACEEVENT']._serialized_start=101992 - _globals['_CONSOLEFTRACEEVENT']._serialized_end=102025 - _globals['_SYSENTERFTRACEEVENT']._serialized_start=102027 - _globals['_SYSENTERFTRACEEVENT']._serialized_end=102074 - _globals['_SYSEXITFTRACEEVENT']._serialized_start=102076 - _globals['_SYSEXITFTRACEEVENT']._serialized_end=102121 - _globals['_REGULATORDISABLEFTRACEEVENT']._serialized_start=102123 - _globals['_REGULATORDISABLEFTRACEEVENT']._serialized_end=102166 - _globals['_REGULATORDISABLECOMPLETEFTRACEEVENT']._serialized_start=102168 - _globals['_REGULATORDISABLECOMPLETEFTRACEEVENT']._serialized_end=102219 - _globals['_REGULATORENABLEFTRACEEVENT']._serialized_start=102221 - _globals['_REGULATORENABLEFTRACEEVENT']._serialized_end=102263 - _globals['_REGULATORENABLECOMPLETEFTRACEEVENT']._serialized_start=102265 - _globals['_REGULATORENABLECOMPLETEFTRACEEVENT']._serialized_end=102315 - _globals['_REGULATORENABLEDELAYFTRACEEVENT']._serialized_start=102317 - _globals['_REGULATORENABLEDELAYFTRACEEVENT']._serialized_end=102364 - _globals['_REGULATORSETVOLTAGEFTRACEEVENT']._serialized_start=102366 - _globals['_REGULATORSETVOLTAGEFTRACEEVENT']._serialized_end=102438 - _globals['_REGULATORSETVOLTAGECOMPLETEFTRACEEVENT']._serialized_start=102440 - _globals['_REGULATORSETVOLTAGECOMPLETEFTRACEEVENT']._serialized_end=102507 - _globals['_RPMSTATUSFTRACEEVENT']._serialized_start=102509 - _globals['_RPMSTATUSFTRACEEVENT']._serialized_end=102561 - _globals['_SAMSUNGTRACINGMARKWRITEFTRACEEVENT']._serialized_start=102563 - _globals['_SAMSUNGTRACINGMARKWRITEFTRACEEVENT']._serialized_end=102688 - _globals['_SCHEDSWITCHFTRACEEVENT']._serialized_start=102691 - _globals['_SCHEDSWITCHFTRACEEVENT']._serialized_end=102847 - _globals['_SCHEDWAKEUPFTRACEEVENT']._serialized_start=102849 - _globals['_SCHEDWAKEUPFTRACEEVENT']._serialized_end=102951 - _globals['_SCHEDBLOCKEDREASONFTRACEEVENT']._serialized_start=102953 - _globals['_SCHEDBLOCKEDREASONFTRACEEVENT']._serialized_end=103030 - _globals['_SCHEDCPUHOTPLUGFTRACEEVENT']._serialized_start=103032 - _globals['_SCHEDCPUHOTPLUGFTRACEEVENT']._serialized_end=103113 - _globals['_SCHEDWAKINGFTRACEEVENT']._serialized_start=103115 - _globals['_SCHEDWAKINGFTRACEEVENT']._serialized_end=103217 - _globals['_SCHEDWAKEUPNEWFTRACEEVENT']._serialized_start=103219 - _globals['_SCHEDWAKEUPNEWFTRACEEVENT']._serialized_end=103324 - _globals['_SCHEDPROCESSEXECFTRACEEVENT']._serialized_start=103326 - _globals['_SCHEDPROCESSEXECFTRACEEVENT']._serialized_end=103403 - _globals['_SCHEDPROCESSEXITFTRACEEVENT']._serialized_start=103405 - _globals['_SCHEDPROCESSEXITFTRACEEVENT']._serialized_end=103489 - _globals['_SCHEDPROCESSFORKFTRACEEVENT']._serialized_start=103491 - _globals['_SCHEDPROCESSFORKFTRACEEVENT']._serialized_end=103600 - _globals['_SCHEDPROCESSFREEFTRACEEVENT']._serialized_start=103602 - _globals['_SCHEDPROCESSFREEFTRACEEVENT']._serialized_end=103672 - _globals['_SCHEDPROCESSHANGFTRACEEVENT']._serialized_start=103674 - _globals['_SCHEDPROCESSHANGFTRACEEVENT']._serialized_end=103730 - _globals['_SCHEDPROCESSWAITFTRACEEVENT']._serialized_start=103732 - _globals['_SCHEDPROCESSWAITFTRACEEVENT']._serialized_end=103802 - _globals['_SCHEDPISETPRIOFTRACEEVENT']._serialized_start=103804 - _globals['_SCHEDPISETPRIOFTRACEEVENT']._serialized_end=103892 - _globals['_SCHEDCPUUTILCFSFTRACEEVENT']._serialized_start=103895 - _globals['_SCHEDCPUUTILCFSFTRACEEVENT']._serialized_end=104223 - _globals['_SCHEDMIGRATETASKFTRACEEVENT']._serialized_start=104226 - _globals['_SCHEDMIGRATETASKFTRACEEVENT']._serialized_end=104363 - _globals['_SCHEDWAKEUPTASKATTRFTRACEEVENT']._serialized_start=104365 - _globals['_SCHEDWAKEUPTASKATTRFTRACEEVENT']._serialized_end=104489 - _globals['_SCHEDGROUPTRACKERFTRACEEVENT']._serialized_start=104491 - _globals['_SCHEDGROUPTRACKERFTRACEEVENT']._serialized_end=104582 - _globals['_SCMCALLSTARTFTRACEEVENT']._serialized_start=104584 - _globals['_SCMCALLSTARTFTRACEEVENT']._serialized_end=104650 - _globals['_SCMCALLENDFTRACEEVENT']._serialized_start=104652 - _globals['_SCMCALLENDFTRACEEVENT']._serialized_end=104675 - _globals['_SCSIDISPATCHCMDERRORFTRACEEVENT']._serialized_start=104678 - _globals['_SCSIDISPATCHCMDERRORFTRACEEVENT']._serialized_end=104930 - _globals['_SCSIDISPATCHCMDTIMEOUTFTRACEEVENT']._serialized_start=104933 - _globals['_SCSIDISPATCHCMDTIMEOUTFTRACEEVENT']._serialized_end=105236 - _globals['_SCSIEHWAKEUPFTRACEEVENT']._serialized_start=105238 - _globals['_SCSIEHWAKEUPFTRACEEVENT']._serialized_end=105280 - _globals['_SDETRACINGMARKWRITEFTRACEEVENT']._serialized_start=105282 - _globals['_SDETRACINGMARKWRITEFTRACEEVENT']._serialized_end=105403 - _globals['_SDESDEEVTLOGFTRACEEVENT']._serialized_start=105406 - _globals['_SDESDEEVTLOGFTRACEEVENT']._serialized_end=105675 - _globals['_SDESDEPERFCALCCRTCFTRACEEVENT']._serialized_start=105678 - _globals['_SDESDEPERFCALCCRTCFTRACEEVENT']._serialized_end=105858 - _globals['_SDESDEPERFCRTCUPDATEFTRACEEVENT']._serialized_start=105861 - _globals['_SDESDEPERFCRTCUPDATEFTRACEEVENT']._serialized_end=106144 - _globals['_SDESDEPERFSETQOSLUTSFTRACEEVENT']._serialized_start=106146 - _globals['_SDESDEPERFSETQOSLUTSFTRACEEVENT']._serialized_end=106262 - _globals['_SDESDEPERFUPDATEBUSFTRACEEVENT']._serialized_start=106264 - _globals['_SDESDEPERFUPDATEBUSFTRACEEVENT']._serialized_end=106364 - _globals['_SIGNALDELIVERFTRACEEVENT']._serialized_start=106366 - _globals['_SIGNALDELIVERFTRACEEVENT']._serialized_end=106437 - _globals['_SIGNALGENERATEFTRACEEVENT']._serialized_start=106439 - _globals['_SIGNALGENERATEFTRACEEVENT']._serialized_end=106551 - _globals['_KFREESKBFTRACEEVENT']._serialized_start=106553 - _globals['_KFREESKBFTRACEEVENT']._serialized_end=106627 - _globals['_INETSOCKSETSTATEFTRACEEVENT']._serialized_start=106630 - _globals['_INETSOCKSETSTATEFTRACEEVENT']._serialized_end=106805 - _globals['_SYNCPTFTRACEEVENT']._serialized_start=106807 - _globals['_SYNCPTFTRACEEVENT']._serialized_end=106859 - _globals['_SYNCTIMELINEFTRACEEVENT']._serialized_start=106861 - _globals['_SYNCTIMELINEFTRACEEVENT']._serialized_end=106915 - _globals['_SYNCWAITFTRACEEVENT']._serialized_start=106917 - _globals['_SYNCWAITFTRACEEVENT']._serialized_end=106983 - _globals['_RSSSTATTHROTTLEDFTRACEEVENT']._serialized_start=106985 - _globals['_RSSSTATTHROTTLEDFTRACEEVENT']._serialized_end=107073 - _globals['_SUSPENDRESUMEMINIMALFTRACEEVENT']._serialized_start=107075 - _globals['_SUSPENDRESUMEMINIMALFTRACEEVENT']._serialized_end=107123 - _globals['_ZEROFTRACEEVENT']._serialized_start=107125 - _globals['_ZEROFTRACEEVENT']._serialized_end=107198 - _globals['_TASKNEWTASKFTRACEEVENT']._serialized_start=107200 - _globals['_TASKNEWTASKFTRACEEVENT']._serialized_end=107295 - _globals['_TASKRENAMEFTRACEEVENT']._serialized_start=107297 - _globals['_TASKRENAMEFTRACEEVENT']._serialized_end=107390 - _globals['_TCPRETRANSMITSKBFTRACEEVENT']._serialized_start=107393 - _globals['_TCPRETRANSMITSKBFTRACEEVENT']._serialized_end=107530 - _globals['_THERMALTEMPERATUREFTRACEEVENT']._serialized_start=107532 - _globals['_THERMALTEMPERATUREFTRACEEVENT']._serialized_end=107630 - _globals['_CDEVUPDATEFTRACEEVENT']._serialized_start=107632 - _globals['_CDEVUPDATEFTRACEEVENT']._serialized_end=107685 - _globals['_THERMALEXYNOSACPMBULKFTRACEEVENT']._serialized_start=107688 - _globals['_THERMALEXYNOSACPMBULKFTRACEEVENT']._serialized_end=107916 - _globals['_THERMALEXYNOSACPMHIGHOVERHEADFTRACEEVENT']._serialized_start=107919 - _globals['_THERMALEXYNOSACPMHIGHOVERHEADFTRACEEVENT']._serialized_end=108081 - _globals['_HRTIMERSTARTFTRACEEVENT']._serialized_start=108083 - _globals['_HRTIMERSTARTFTRACEEVENT']._serialized_end=108195 - _globals['_HRTIMERCANCELFTRACEEVENT']._serialized_start=108197 - _globals['_HRTIMERCANCELFTRACEEVENT']._serialized_end=108240 - _globals['_HRTIMEREXPIREENTRYFTRACEEVENT']._serialized_start=108242 - _globals['_HRTIMEREXPIREENTRYFTRACEEVENT']._serialized_end=108321 - _globals['_HRTIMEREXPIREEXITFTRACEEVENT']._serialized_start=108323 - _globals['_HRTIMEREXPIREEXITFTRACEEVENT']._serialized_end=108370 - _globals['_TIMERSTARTFTRACEEVENT']._serialized_start=108373 - _globals['_TIMERSTARTFTRACEEVENT']._serialized_end=108517 - _globals['_TIMERCANCELFTRACEEVENT']._serialized_start=108519 - _globals['_TIMERCANCELFTRACEEVENT']._serialized_end=108558 - _globals['_TIMEREXPIREENTRYFTRACEEVENT']._serialized_start=108560 - _globals['_TIMEREXPIREENTRYFTRACEEVENT']._serialized_end=108652 - _globals['_TIMEREXPIREEXITFTRACEEVENT']._serialized_start=108654 - _globals['_TIMEREXPIREEXITFTRACEEVENT']._serialized_end=108697 - _globals['_TRUSTYSMCFTRACEEVENT']._serialized_start=108699 - _globals['_TRUSTYSMCFTRACEEVENT']._serialized_end=108769 - _globals['_TRUSTYSMCDONEFTRACEEVENT']._serialized_start=108771 - _globals['_TRUSTYSMCDONEFTRACEEVENT']._serialized_end=108810 - _globals['_TRUSTYSTDCALL32FTRACEEVENT']._serialized_start=108812 - _globals['_TRUSTYSTDCALL32FTRACEEVENT']._serialized_end=108888 - _globals['_TRUSTYSTDCALL32DONEFTRACEEVENT']._serialized_start=108890 - _globals['_TRUSTYSTDCALL32DONEFTRACEEVENT']._serialized_end=108935 - _globals['_TRUSTYSHAREMEMORYFTRACEEVENT']._serialized_start=108937 - _globals['_TRUSTYSHAREMEMORYFTRACEEVENT']._serialized_end=109009 - _globals['_TRUSTYSHAREMEMORYDONEFTRACEEVENT']._serialized_start=109011 - _globals['_TRUSTYSHAREMEMORYDONEFTRACEEVENT']._serialized_end=109116 - _globals['_TRUSTYRECLAIMMEMORYFTRACEEVENT']._serialized_start=109118 - _globals['_TRUSTYRECLAIMMEMORYFTRACEEVENT']._serialized_end=109162 - _globals['_TRUSTYRECLAIMMEMORYDONEFTRACEEVENT']._serialized_start=109164 - _globals['_TRUSTYRECLAIMMEMORYDONEFTRACEEVENT']._serialized_end=109225 - _globals['_TRUSTYIRQFTRACEEVENT']._serialized_start=109227 - _globals['_TRUSTYIRQFTRACEEVENT']._serialized_end=109262 - _globals['_TRUSTYIPCHANDLEEVENTFTRACEEVENT']._serialized_start=109264 - _globals['_TRUSTYIPCHANDLEEVENTFTRACEEVENT']._serialized_end=109347 - _globals['_TRUSTYIPCCONNECTFTRACEEVENT']._serialized_start=109349 - _globals['_TRUSTYIPCCONNECTFTRACEEVENT']._serialized_end=109421 - _globals['_TRUSTYIPCCONNECTENDFTRACEEVENT']._serialized_start=109423 - _globals['_TRUSTYIPCCONNECTENDFTRACEEVENT']._serialized_end=109497 - _globals['_TRUSTYIPCWRITEFTRACEEVENT']._serialized_start=109500 - _globals['_TRUSTYIPCWRITEFTRACEEVENT']._serialized_end=109630 - _globals['_TRUSTYIPCPOLLFTRACEEVENT']._serialized_start=109632 - _globals['_TRUSTYIPCPOLLFTRACEEVENT']._serialized_end=109709 - _globals['_TRUSTYIPCREADFTRACEEVENT']._serialized_start=109711 - _globals['_TRUSTYIPCREADFTRACEEVENT']._serialized_end=109769 - _globals['_TRUSTYIPCREADENDFTRACEEVENT']._serialized_start=109771 - _globals['_TRUSTYIPCREADENDFTRACEEVENT']._serialized_end=109885 - _globals['_TRUSTYIPCRXFTRACEEVENT']._serialized_start=109887 - _globals['_TRUSTYIPCRXFTRACEEVENT']._serialized_end=109959 - _globals['_TRUSTYENQUEUENOPFTRACEEVENT']._serialized_start=109961 - _globals['_TRUSTYENQUEUENOPFTRACEEVENT']._serialized_end=110032 - _globals['_UFSHCDCOMMANDFTRACEEVENT']._serialized_start=110035 - _globals['_UFSHCDCOMMANDFTRACEEVENT']._serialized_end=110221 - _globals['_UFSHCDCLKGATINGFTRACEEVENT']._serialized_start=110223 - _globals['_UFSHCDCLKGATINGFTRACEEVENT']._serialized_end=110284 - _globals['_V4L2QBUFFTRACEEVENT']._serialized_start=110287 - _globals['_V4L2QBUFFTRACEEVENT']._serialized_end=110698 - _globals['_V4L2DQBUFFTRACEEVENT']._serialized_start=110701 - _globals['_V4L2DQBUFFTRACEEVENT']._serialized_end=111113 - _globals['_VB2V4L2BUFQUEUEFTRACEEVENT']._serialized_start=111116 - _globals['_VB2V4L2BUFQUEUEFTRACEEVENT']._serialized_end=111486 - _globals['_VB2V4L2BUFDONEFTRACEEVENT']._serialized_start=111489 - _globals['_VB2V4L2BUFDONEFTRACEEVENT']._serialized_end=111858 - _globals['_VB2V4L2QBUFFTRACEEVENT']._serialized_start=111861 - _globals['_VB2V4L2QBUFFTRACEEVENT']._serialized_end=112227 - _globals['_VB2V4L2DQBUFFTRACEEVENT']._serialized_start=112230 - _globals['_VB2V4L2DQBUFFTRACEEVENT']._serialized_end=112597 - _globals['_VIRTIOGPUCMDQUEUEFTRACEEVENT']._serialized_start=112600 - _globals['_VIRTIOGPUCMDQUEUEFTRACEEVENT']._serialized_end=112765 - _globals['_VIRTIOGPUCMDRESPONSEFTRACEEVENT']._serialized_start=112768 - _globals['_VIRTIOGPUCMDRESPONSEFTRACEEVENT']._serialized_end=112936 - _globals['_VIRTIOVIDEOCMDFTRACEEVENT']._serialized_start=112938 - _globals['_VIRTIOVIDEOCMDFTRACEEVENT']._serialized_end=112998 - _globals['_VIRTIOVIDEOCMDDONEFTRACEEVENT']._serialized_start=113000 - _globals['_VIRTIOVIDEOCMDDONEFTRACEEVENT']._serialized_end=113064 - _globals['_VIRTIOVIDEORESOURCEQUEUEFTRACEEVENT']._serialized_start=113067 - _globals['_VIRTIOVIDEORESOURCEQUEUEFTRACEEVENT']._serialized_end=113263 - _globals['_VIRTIOVIDEORESOURCEQUEUEDONEFTRACEEVENT']._serialized_start=113266 - _globals['_VIRTIOVIDEORESOURCEQUEUEDONEFTRACEEVENT']._serialized_end=113466 - _globals['_MMVMSCANDIRECTRECLAIMBEGINFTRACEEVENT']._serialized_start=113468 - _globals['_MMVMSCANDIRECTRECLAIMBEGINFTRACEEVENT']._serialized_end=113564 - _globals['_MMVMSCANDIRECTRECLAIMENDFTRACEEVENT']._serialized_start=113566 - _globals['_MMVMSCANDIRECTRECLAIMENDFTRACEEVENT']._serialized_end=113625 - _globals['_MMVMSCANKSWAPDWAKEFTRACEEVENT']._serialized_start=113627 - _globals['_MMVMSCANKSWAPDWAKEFTRACEEVENT']._serialized_end=113699 - _globals['_MMVMSCANKSWAPDSLEEPFTRACEEVENT']._serialized_start=113701 - _globals['_MMVMSCANKSWAPDSLEEPFTRACEEVENT']._serialized_end=113746 - _globals['_MMSHRINKSLABSTARTFTRACEEVENT']._serialized_start=113749 - _globals['_MMSHRINKSLABSTARTFTRACEEVENT']._serialized_end=113982 - _globals['_MMSHRINKSLABENDFTRACEEVENT']._serialized_start=113985 - _globals['_MMSHRINKSLABENDFTRACEEVENT']._serialized_end=114130 - _globals['_MMVMSCANMEMCGRECLAIMBEGINFTRACEEVENT']._serialized_start=114132 - _globals['_MMVMSCANMEMCGRECLAIMBEGINFTRACEEVENT']._serialized_end=114227 - _globals['_MMVMSCANMEMCGRECLAIMENDFTRACEEVENT']._serialized_start=114229 - _globals['_MMVMSCANMEMCGRECLAIMENDFTRACEEVENT']._serialized_end=114287 - _globals['_WORKQUEUEACTIVATEWORKFTRACEEVENT']._serialized_start=114289 - _globals['_WORKQUEUEACTIVATEWORKFTRACEEVENT']._serialized_end=114355 - _globals['_WORKQUEUEEXECUTEENDFTRACEEVENT']._serialized_start=114357 - _globals['_WORKQUEUEEXECUTEENDFTRACEEVENT']._serialized_end=114421 - _globals['_WORKQUEUEEXECUTESTARTFTRACEEVENT']._serialized_start=114423 - _globals['_WORKQUEUEEXECUTESTARTFTRACEEVENT']._serialized_end=114489 - _globals['_WORKQUEUEQUEUEWORKFTRACEEVENT']._serialized_start=114491 - _globals['_WORKQUEUEQUEUEWORKFTRACEEVENT']._serialized_end=114603 - _globals['_FTRACEEVENT']._serialized_start=114607 - _globals['_FTRACEEVENT']._serialized_end=161202 - _globals['_FTRACECPUSTATS']._serialized_start=161205 - _globals['_FTRACECPUSTATS']._serialized_end=161398 - _globals['_FTRACEKPROBESTATS']._serialized_start=161400 - _globals['_FTRACEKPROBESTATS']._serialized_end=161449 - _globals['_FTRACESTATS']._serialized_start=161452 - _globals['_FTRACESTATS']._serialized_end=162035 - _globals['_FTRACESTATS_PHASE']._serialized_start=161973 - _globals['_FTRACESTATS_PHASE']._serialized_end=162035 - _globals['_FTRACEEVENTBUNDLE']._serialized_start=162038 - _globals['_FTRACEEVENTBUNDLE']._serialized_end=163118 - _globals['_FTRACEEVENTBUNDLE_COMPACTSCHED']._serialized_start=162576 - _globals['_FTRACEEVENTBUNDLE_COMPACTSCHED']._serialized_end=162942 - _globals['_FTRACEEVENTBUNDLE_FTRACEERROR']._serialized_start=162944 - _globals['_FTRACEEVENTBUNDLE_FTRACEERROR']._serialized_end=163028 - _globals['_FTRACEEVENTBUNDLE_GENERICEVENTDESCRIPTOR']._serialized_start=163030 - _globals['_FTRACEEVENTBUNDLE_GENERICEVENTDESCRIPTOR']._serialized_end=163118 - _globals['_GENERICGPUFREQUENCYEVENT']._serialized_start=163120 - _globals['_GENERICGPUFREQUENCYEVENT']._serialized_end=163185 - _globals['_GENERICKERNELCPUFREQUENCYEVENT']._serialized_start=163187 - _globals['_GENERICKERNELCPUFREQUENCYEVENT']._serialized_end=163249 - _globals['_GENERICKERNELTASKSTATEEVENT']._serialized_start=163252 - _globals['_GENERICKERNELTASKSTATEEVENT']._serialized_end=163670 - _globals['_GENERICKERNELTASKSTATEEVENT_TASKSTATEENUM']._serialized_start=163413 - _globals['_GENERICKERNELTASKSTATEEVENT_TASKSTATEENUM']._serialized_end=163670 - _globals['_GENERICKERNELTASKRENAMEEVENT']._serialized_start=163672 - _globals['_GENERICKERNELTASKRENAMEEVENT']._serialized_end=163729 - _globals['_GENERICKERNELPROCESSTREE']._serialized_start=163732 - _globals['_GENERICKERNELPROCESSTREE']._serialized_end=164041 - _globals['_GENERICKERNELPROCESSTREE_THREAD']._serialized_start=163897 - _globals['_GENERICKERNELPROCESSTREE_THREAD']._serialized_end=163986 - _globals['_GENERICKERNELPROCESSTREE_PROCESS']._serialized_start=163988 - _globals['_GENERICKERNELPROCESSTREE_PROCESS']._serialized_end=164041 - _globals['_GPUCOUNTEREVENT']._serialized_start=164044 - _globals['_GPUCOUNTEREVENT']._serialized_end=164339 - _globals['_GPUCOUNTEREVENT_GPUCOUNTER']._serialized_start=164245 - _globals['_GPUCOUNTEREVENT_GPUCOUNTER']._serialized_end=164331 - _globals['_INTERNEDGPUCOUNTERDESCRIPTOR']._serialized_start=164341 - _globals['_INTERNEDGPUCOUNTERDESCRIPTOR']._serialized_end=164467 - _globals['_GPULOG']._serialized_start=164470 - _globals['_GPULOG']._serialized_end=164730 - _globals['_GPULOG_SEVERITY']._serialized_start=164567 - _globals['_GPULOG_SEVERITY']._serialized_end=164730 - _globals['_GPUMEMTOTALEVENT']._serialized_start=164732 - _globals['_GPUMEMTOTALEVENT']._serialized_end=164793 - _globals['_GPURENDERSTAGEEVENT']._serialized_start=164796 - _globals['_GPURENDERSTAGEEVENT']._serialized_end=166343 - _globals['_GPURENDERSTAGEEVENT_EXTRADATA']._serialized_start=165459 - _globals['_GPURENDERSTAGEEVENT_EXTRADATA']._serialized_end=165499 - _globals['_GPURENDERSTAGEEVENT_DIM3']._serialized_start=165501 - _globals['_GPURENDERSTAGEEVENT_DIM3']._serialized_end=165540 - _globals['_GPURENDERSTAGEEVENT_EXTRACOMPUTEARG']._serialized_start=165543 - _globals['_GPURENDERSTAGEEVENT_EXTRACOMPUTEARG']._serialized_end=165738 - _globals['_GPURENDERSTAGEEVENT_COMPUTEKERNELLAUNCH']._serialized_start=165741 - _globals['_GPURENDERSTAGEEVENT_COMPUTEKERNELLAUNCH']._serialized_end=165959 - _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS']._serialized_start=165962 - _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS']._serialized_end=166323 - _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS_CONTEXTSPEC']._serialized_start=166230 - _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS_CONTEXTSPEC']._serialized_end=166273 - _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS_DESCRIPTION']._serialized_start=166275 - _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS_DESCRIPTION']._serialized_end=166323 - _globals['_INTERNEDGRAPHICSCONTEXT']._serialized_start=166346 - _globals['_INTERNEDGRAPHICSCONTEXT']._serialized_end=166535 - _globals['_INTERNEDGRAPHICSCONTEXT_API']._serialized_start=166458 - _globals['_INTERNEDGRAPHICSCONTEXT_API']._serialized_end=166535 - _globals['_INTERNEDGPURENDERSTAGESPECIFICATION']._serialized_start=166538 - _globals['_INTERNEDGPURENDERSTAGESPECIFICATION']._serialized_end=166776 - _globals['_INTERNEDGPURENDERSTAGESPECIFICATION_RENDERSTAGECATEGORY']._serialized_start=166717 - _globals['_INTERNEDGPURENDERSTAGESPECIFICATION_RENDERSTAGECATEGORY']._serialized_end=166776 - _globals['_INTERNEDCOMPUTEKERNEL']._serialized_start=166779 - _globals['_INTERNEDCOMPUTEKERNEL']._serialized_end=166935 - _globals['_INTERNEDCOMPUTEARGNAME']._serialized_start=166937 - _globals['_INTERNEDCOMPUTEARGNAME']._serialized_end=166988 - _globals['_VULKANAPIEVENT']._serialized_start=166991 - _globals['_VULKANAPIEVENT']._serialized_end=167434 - _globals['_VULKANAPIEVENT_VKDEBUGUTILSOBJECTNAME']._serialized_start=167177 - _globals['_VULKANAPIEVENT_VKDEBUGUTILSOBJECTNAME']._serialized_end=167291 - _globals['_VULKANAPIEVENT_VKQUEUESUBMIT']._serialized_start=167294 - _globals['_VULKANAPIEVENT_VKQUEUESUBMIT']._serialized_end=167425 - _globals['_VULKANMEMORYEVENTANNOTATION']._serialized_start=167436 - _globals['_VULKANMEMORYEVENTANNOTATION']._serialized_end=167558 - _globals['_VULKANMEMORYEVENT']._serialized_start=167561 - _globals['_VULKANMEMORYEVENT']._serialized_end=168433 - _globals['_VULKANMEMORYEVENT_SOURCE']._serialized_start=168046 - _globals['_VULKANMEMORYEVENT_SOURCE']._serialized_end=168179 - _globals['_VULKANMEMORYEVENT_OPERATION']._serialized_start=168181 - _globals['_VULKANMEMORYEVENT_OPERATION']._serialized_end=168298 - _globals['_VULKANMEMORYEVENT_ALLOCATIONSCOPE']._serialized_start=168301 - _globals['_VULKANMEMORYEVENT_ALLOCATIONSCOPE']._serialized_end=168433 - _globals['_INTERNEDSTRING']._serialized_start=168435 - _globals['_INTERNEDSTRING']._serialized_end=168477 - _globals['_LINE']._serialized_start=168479 - _globals['_LINE']._serialized_end=168555 - _globals['_ADDRESSSYMBOLS']._serialized_start=168557 - _globals['_ADDRESSSYMBOLS']._serialized_end=168628 - _globals['_MODULESYMBOLS']._serialized_start=168630 - _globals['_MODULESYMBOLS']._serialized_end=168735 - _globals['_MAPPING']._serialized_start=168738 - _globals['_MAPPING']._serialized_end=168894 - _globals['_FRAME']._serialized_start=168897 - _globals['_FRAME']._serialized_end=169231 - _globals['_FRAME_KIND']._serialized_start=169092 - _globals['_FRAME_KIND']._serialized_end=169217 - _globals['_CALLSTACK']._serialized_start=169233 - _globals['_CALLSTACK']._serialized_end=169276 - _globals['_INLINECALLSTACK']._serialized_start=169279 - _globals['_INLINECALLSTACK']._serialized_end=169426 - _globals['_INLINECALLSTACK_FRAME']._serialized_start=169354 - _globals['_INLINECALLSTACK_FRAME']._serialized_end=169426 - _globals['_STACKSAMPLE']._serialized_start=169429 - _globals['_STACKSAMPLE']._serialized_end=171093 - _globals['_STACKSAMPLE_TASKCONTEXT']._serialized_start=170061 - _globals['_STACKSAMPLE_TASKCONTEXT']._serialized_end=170131 - _globals['_STACKSAMPLE_ASYNCCONTEXTDESCRIPTOR']._serialized_start=170133 - _globals['_STACKSAMPLE_ASYNCCONTEXTDESCRIPTOR']._serialized_end=170218 - _globals['_STACKSAMPLE_EXECUTIONCONTEXT']._serialized_start=170220 - _globals['_STACKSAMPLE_EXECUTIONCONTEXT']._serialized_end=170313 - _globals['_STACKSAMPLE_COUNTERDESCRIPTOR']._serialized_start=170316 - _globals['_STACKSAMPLE_COUNTERDESCRIPTOR']._serialized_end=170627 - _globals['_STACKSAMPLE_COUNTERDESCRIPTOR_SCOPE']._serialized_start=170550 - _globals['_STACKSAMPLE_COUNTERDESCRIPTOR_SCOPE']._serialized_end=170613 - _globals['_STACKSAMPLE_MODE']._serialized_start=170629 - _globals['_STACKSAMPLE_MODE']._serialized_end=170750 - _globals['_STACKSAMPLE_UNIT']._serialized_start=170753 - _globals['_STACKSAMPLE_UNIT']._serialized_end=170975 - _globals['_STACKSAMPLEDEFAULTS']._serialized_start=171096 - _globals['_STACKSAMPLEDEFAULTS']._serialized_end=171287 - _globals['_HISTOGRAMNAME']._serialized_start=171289 - _globals['_HISTOGRAMNAME']._serialized_end=171331 - _globals['_CHROMEHISTOGRAMSAMPLE']._serialized_start=171333 - _globals['_CHROMEHISTOGRAMSAMPLE']._serialized_end=171423 - _globals['_DEBUGANNOTATION']._serialized_start=171426 - _globals['_DEBUGANNOTATION']._serialized_end=172366 - _globals['_DEBUGANNOTATION_NESTEDVALUE']._serialized_start=171938 - _globals['_DEBUGANNOTATION_NESTEDVALUE']._serialized_end=172318 - _globals['_DEBUGANNOTATION_NESTEDVALUE_NESTEDTYPE']._serialized_start=172268 - _globals['_DEBUGANNOTATION_NESTEDVALUE_NESTEDTYPE']._serialized_end=172318 - _globals['_DEBUGANNOTATIONNAME']._serialized_start=172368 - _globals['_DEBUGANNOTATIONNAME']._serialized_end=172416 - _globals['_DEBUGANNOTATIONVALUETYPENAME']._serialized_start=172418 - _globals['_DEBUGANNOTATIONVALUETYPENAME']._serialized_end=172475 - _globals['_LOGMESSAGE']._serialized_start=172478 - _globals['_LOGMESSAGE']._serialized_end=172737 - _globals['_LOGMESSAGE_PRIORITY']._serialized_start=172592 - _globals['_LOGMESSAGE_PRIORITY']._serialized_end=172737 - _globals['_LOGMESSAGEBODY']._serialized_start=172739 - _globals['_LOGMESSAGEBODY']._serialized_end=172782 - _globals['_UNSYMBOLIZEDSOURCELOCATION']._serialized_start=172784 - _globals['_UNSYMBOLIZEDSOURCELOCATION']._serialized_end=172861 - _globals['_SOURCELOCATION']._serialized_start=172863 - _globals['_SOURCELOCATION']._serialized_end=172955 - _globals['_CHROMEACTIVEPROCESSES']._serialized_start=172957 - _globals['_CHROMEACTIVEPROCESSES']._serialized_end=172993 - _globals['_CHROMEAPPLICATIONSTATEINFO']._serialized_start=172996 - _globals['_CHROMEAPPLICATIONSTATEINFO']._serialized_end=173362 - _globals['_CHROMEAPPLICATIONSTATEINFO_CHROMEAPPLICATIONSTATE']._serialized_start=173122 - _globals['_CHROMEAPPLICATIONSTATEINFO_CHROMEAPPLICATIONSTATE']._serialized_end=173362 - _globals['_CHROMECOMPOSITORSCHEDULERSTATE']._serialized_start=173365 - _globals['_CHROMECOMPOSITORSCHEDULERSTATE']._serialized_end=174452 - _globals['_CHROMECOMPOSITORSCHEDULERSTATE_BEGINIMPLFRAMEDEADLINEMODE']._serialized_start=174256 - _globals['_CHROMECOMPOSITORSCHEDULERSTATE_BEGINIMPLFRAMEDEADLINEMODE']._serialized_end=174446 - _globals['_CHROMECOMPOSITORSTATEMACHINE']._serialized_start=174455 - _globals['_CHROMECOMPOSITORSTATEMACHINE']._serialized_end=178165 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE']._serialized_start=174646 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE']._serialized_end=175945 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_BEGINIMPLFRAMESTATE']._serialized_start=175185 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_BEGINIMPLFRAMESTATE']._serialized_end=175346 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_BEGINMAINFRAMESTATE']._serialized_start=175349 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_BEGINMAINFRAMESTATE']._serialized_end=175496 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_LAYERTREEFRAMESINKSTATE']._serialized_start=175499 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_LAYERTREEFRAMESINKSTATE']._serialized_end=175743 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_FORCEDREDRAWONTIMEOUTSTATE']._serialized_start=175746 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_FORCEDREDRAWONTIMEOUTSTATE']._serialized_end=175945 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE']._serialized_start=175948 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE']._serialized_end=178165 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE_TREEPRIORITY']._serialized_start=177842 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE_TREEPRIORITY']._serialized_end=178026 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE_SCROLLHANDLERSTATE']._serialized_start=178029 - _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE_SCROLLHANDLERSTATE']._serialized_end=178159 - _globals['_BEGINFRAMEARGS']._serialized_start=178168 - _globals['_BEGINFRAMEARGS']._serialized_end=178722 - _globals['_BEGINFRAMEARGS_BEGINFRAMEARGSTYPE']._serialized_start=178544 - _globals['_BEGINFRAMEARGS_BEGINFRAMEARGSTYPE']._serialized_end=178706 - _globals['_BEGINIMPLFRAMEARGS']._serialized_start=178725 - _globals['_BEGINIMPLFRAMEARGS']._serialized_end=179301 - _globals['_BEGINIMPLFRAMEARGS_TIMESTAMPSINUS']._serialized_start=179042 - _globals['_BEGINIMPLFRAMEARGS_TIMESTAMPSINUS']._serialized_end=179235 - _globals['_BEGINIMPLFRAMEARGS_STATE']._serialized_start=179237 - _globals['_BEGINIMPLFRAMEARGS_STATE']._serialized_end=179293 - _globals['_BEGINFRAMEOBSERVERSTATE']._serialized_start=179303 - _globals['_BEGINFRAMEOBSERVERSTATE']._serialized_end=179426 - _globals['_BEGINFRAMESOURCESTATE']._serialized_start=179429 - _globals['_BEGINFRAMESOURCESTATE']._serialized_end=179574 - _globals['_COMPOSITORTIMINGHISTORY']._serialized_start=179577 - _globals['_COMPOSITORTIMINGHISTORY']._serialized_end=179957 - _globals['_CHROMECONTENTSETTINGSEVENTINFO']._serialized_start=179959 - _globals['_CHROMECONTENTSETTINGSEVENTINFO']._serialized_end=180021 - _globals['_CHROMEFRAMEREPORTER']._serialized_start=180024 - _globals['_CHROMEFRAMEREPORTER']._serialized_end=181144 - _globals['_CHROMEFRAMEREPORTER_STATE']._serialized_start=180739 - _globals['_CHROMEFRAMEREPORTER_STATE']._serialized_end=180848 - _globals['_CHROMEFRAMEREPORTER_FRAMEDROPREASON']._serialized_start=180850 - _globals['_CHROMEFRAMEREPORTER_FRAMEDROPREASON']._serialized_end=180976 - _globals['_CHROMEFRAMEREPORTER_SCROLLSTATE']._serialized_start=180978 - _globals['_CHROMEFRAMEREPORTER_SCROLLSTATE']._serialized_end=181101 - _globals['_CHROMEFRAMEREPORTER_FRAMETYPE']._serialized_start=181103 - _globals['_CHROMEFRAMEREPORTER_FRAMETYPE']._serialized_end=181140 - _globals['_CHROMEKEYEDSERVICE']._serialized_start=181146 - _globals['_CHROMEKEYEDSERVICE']._serialized_end=181180 - _globals['_CHROMELATENCYINFO']._serialized_start=181183 - _globals['_CHROMELATENCYINFO']._serialized_end=182965 - _globals['_CHROMELATENCYINFO_COMPONENTINFO']._serialized_start=181512 - _globals['_CHROMELATENCYINFO_COMPONENTINFO']._serialized_end=181625 - _globals['_CHROMELATENCYINFO_STEP']._serialized_start=181628 - _globals['_CHROMELATENCYINFO_STEP']._serialized_end=182030 - _globals['_CHROMELATENCYINFO_LATENCYCOMPONENTTYPE']._serialized_start=182033 - _globals['_CHROMELATENCYINFO_LATENCYCOMPONENTTYPE']._serialized_end=182790 - _globals['_CHROMELATENCYINFO_INPUTTYPE']._serialized_start=182793 - _globals['_CHROMELATENCYINFO_INPUTTYPE']._serialized_end=182965 - _globals['_CHROMELEGACYIPC']._serialized_start=182968 - _globals['_CHROMELEGACYIPC']._serialized_end=183942 - _globals['_CHROMELEGACYIPC_MESSAGECLASS']._serialized_start=183080 - _globals['_CHROMELEGACYIPC_MESSAGECLASS']._serialized_end=183942 - _globals['_CHROMEMESSAGEPUMP']._serialized_start=183944 - _globals['_CHROMEMESSAGEPUMP']._serialized_end=184028 - _globals['_CHROMEMOJOEVENTINFO']._serialized_start=184031 - _globals['_CHROMEMOJOEVENTINFO']._serialized_end=184235 - _globals['_CHROMERENDERERSCHEDULERSTATE']._serialized_start=184237 - _globals['_CHROMERENDERERSCHEDULERSTATE']._serialized_end=184363 - _globals['_CHROMEUSEREVENT']._serialized_start=184365 - _globals['_CHROMEUSEREVENT']._serialized_end=184419 - _globals['_CHROMEWINDOWHANDLEEVENTINFO']._serialized_start=184421 - _globals['_CHROMEWINDOWHANDLEEVENTINFO']._serialized_end=184501 - _globals['_SCREENSHOT']._serialized_start=184503 - _globals['_SCREENSHOT']._serialized_end=184572 - _globals['_TASKEXECUTION']._serialized_start=184574 - _globals['_TASKEXECUTION']._serialized_end=184614 - _globals['_TRACKEVENT']._serialized_start=184617 - _globals['_TRACKEVENT']._serialized_end=188065 - _globals['_TRACKEVENT_INLINECALLSTACK']._serialized_start=186923 - _globals['_TRACKEVENT_INLINECALLSTACK']._serialized_end=187081 - _globals['_TRACKEVENT_INLINECALLSTACK_FRAME']._serialized_start=169354 - _globals['_TRACKEVENT_INLINECALLSTACK_FRAME']._serialized_end=169426 - _globals['_TRACKEVENT_LEGACYEVENT']._serialized_start=187084 - _globals['_TRACKEVENT_LEGACYEVENT']._serialized_end=187766 - _globals['_TRACKEVENT_LEGACYEVENT_FLOWDIRECTION']._serialized_start=187575 - _globals['_TRACKEVENT_LEGACYEVENT_FLOWDIRECTION']._serialized_end=187655 - _globals['_TRACKEVENT_LEGACYEVENT_INSTANTEVENTSCOPE']._serialized_start=187657 - _globals['_TRACKEVENT_LEGACYEVENT_INSTANTEVENTSCOPE']._serialized_end=187754 - _globals['_TRACKEVENT_TYPE']._serialized_start=187768 - _globals['_TRACKEVENT_TYPE']._serialized_end=187890 - _globals['_TRACKEVENTDEFAULTS']._serialized_start=188067 - _globals['_TRACKEVENTDEFAULTS']._serialized_end=188184 - _globals['_EVENTCATEGORY']._serialized_start=188186 - _globals['_EVENTCATEGORY']._serialized_end=188228 - _globals['_EVENTNAME']._serialized_start=188230 - _globals['_EVENTNAME']._serialized_end=188268 - _globals['_INTERNEDDATA']._serialized_start=188271 - _globals['_INTERNEDDATA']._serialized_end=190388 - _globals['_SYSTEMDJOURNALDEVENT']._serialized_start=190391 - _globals['_SYSTEMDJOURNALDEVENT']._serialized_end=190634 - _globals['_MEMORYTRACKERSNAPSHOT']._serialized_start=190637 - _globals['_MEMORYTRACKERSNAPSHOT']._serialized_end=191645 - _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT']._serialized_start=190852 - _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT']._serialized_end=191570 - _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE']._serialized_start=191066 - _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE']._serialized_end=191477 - _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE_MEMORYNODEENTRY']._serialized_start=191250 - _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE_MEMORYNODEENTRY']._serialized_end=191477 - _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE_MEMORYNODEENTRY_UNITS']._serialized_start=191431 - _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE_MEMORYNODEENTRY_UNITS']._serialized_end=191477 - _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYEDGE']._serialized_start=191479 - _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYEDGE']._serialized_end=191570 - _globals['_MEMORYTRACKERSNAPSHOT_LEVELOFDETAIL']._serialized_start=191572 - _globals['_MEMORYTRACKERSNAPSHOT_LEVELOFDETAIL']._serialized_end=191645 - _globals['_CONCURRENTSESSIONEVENT']._serialized_start=191648 - _globals['_CONCURRENTSESSIONEVENT']._serialized_end=191985 - _globals['_CONCURRENTSESSIONEVENT_STATE']._serialized_start=191827 - _globals['_CONCURRENTSESSIONEVENT_STATE']._serialized_end=191985 - _globals['_PERFETTOMETATRACE']._serialized_start=191988 - _globals['_PERFETTOMETATRACE']._serialized_end=192533 - _globals['_PERFETTOMETATRACE_ARG']._serialized_start=192345 - _globals['_PERFETTOMETATRACE_ARG']._serialized_end=192472 - _globals['_PERFETTOMETATRACE_INTERNEDSTRING']._serialized_start=192474 - _globals['_PERFETTOMETATRACE_INTERNEDSTRING']._serialized_end=192518 - _globals['_TRACEPROVENANCE']._serialized_start=192536 - _globals['_TRACEPROVENANCE']._serialized_end=192728 - _globals['_TRACEPROVENANCE_SEQUENCE']._serialized_start=192613 - _globals['_TRACEPROVENANCE_SEQUENCE']._serialized_end=192656 - _globals['_TRACEPROVENANCE_BUFFER']._serialized_start=192658 - _globals['_TRACEPROVENANCE_BUFFER']._serialized_end=192728 - _globals['_TRACINGSERVICEEVENT']._serialized_start=192731 - _globals['_TRACINGSERVICEEVENT']._serialized_end=193381 - _globals['_TRACINGSERVICEEVENT_DATASOURCES']._serialized_start=193209 - _globals['_TRACINGSERVICEEVENT_DATASOURCES']._serialized_end=193367 - _globals['_TRACINGSERVICEEVENT_DATASOURCES_DATASOURCE']._serialized_start=193306 - _globals['_TRACINGSERVICEEVENT_DATASOURCES_DATASOURCE']._serialized_end=193367 - _globals['_ANDROIDENERGYCONSUMER']._serialized_start=193383 - _globals['_ANDROIDENERGYCONSUMER']._serialized_end=193479 - _globals['_ANDROIDENERGYCONSUMERDESCRIPTOR']._serialized_start=193481 - _globals['_ANDROIDENERGYCONSUMERDESCRIPTOR']._serialized_end=193580 - _globals['_ANDROIDENERGYESTIMATIONBREAKDOWN']._serialized_start=193583 - _globals['_ANDROIDENERGYESTIMATIONBREAKDOWN']._serialized_end=193903 - _globals['_ANDROIDENERGYESTIMATIONBREAKDOWN_ENERGYUIDBREAKDOWN']._serialized_start=193850 - _globals['_ANDROIDENERGYESTIMATIONBREAKDOWN_ENERGYUIDBREAKDOWN']._serialized_end=193903 - _globals['_ENTITYSTATERESIDENCY']._serialized_start=193906 - _globals['_ENTITYSTATERESIDENCY']._serialized_end=194349 - _globals['_ENTITYSTATERESIDENCY_POWERENTITYSTATE']._serialized_start=194087 - _globals['_ENTITYSTATERESIDENCY_POWERENTITYSTATE']._serialized_end=194189 - _globals['_ENTITYSTATERESIDENCY_STATERESIDENCY']._serialized_start=194192 - _globals['_ENTITYSTATERESIDENCY_STATERESIDENCY']._serialized_end=194349 - _globals['_BATTERYCOUNTERS']._serialized_start=194352 - _globals['_BATTERYCOUNTERS']._serialized_end=194529 - _globals['_POWERRAILS']._serialized_start=194532 - _globals['_POWERRAILS']._serialized_end=194859 - _globals['_POWERRAILS_RAILDESCRIPTOR']._serialized_start=194698 - _globals['_POWERRAILS_RAILDESCRIPTOR']._serialized_end=194792 - _globals['_POWERRAILS_ENERGYDATA']._serialized_start=194794 - _globals['_POWERRAILS_ENERGYDATA']._serialized_end=194859 - _globals['_JAVAFRAME']._serialized_start=194861 - _globals['_JAVAFRAME']._serialized_end=194935 - _globals['_JAVASTACK']._serialized_start=194937 - _globals['_JAVASTACK']._serialized_end=194992 - _globals['_ARTPROCESSMETADATA']._serialized_start=194995 - _globals['_ARTPROCESSMETADATA']._serialized_end=195260 - _globals['_OBFUSCATEDMEMBER']._serialized_start=195263 - _globals['_OBFUSCATEDMEMBER']._serialized_end=195445 - _globals['_OBFUSCATEDCLASS']._serialized_start=195448 - _globals['_OBFUSCATEDCLASS']._serialized_end=195643 - _globals['_DEOBFUSCATIONMAPPING']._serialized_start=195646 - _globals['_DEOBFUSCATIONMAPPING']._serialized_end=195774 - _globals['_PROFILEPACKET']._serialized_start=195777 - _globals['_PROFILEPACKET']._serialized_end=197270 - _globals['_PROFILEPACKET_HEAPSAMPLE']._serialized_start=196085 - _globals['_PROFILEPACKET_HEAPSAMPLE']._serialized_end=196271 - _globals['_PROFILEPACKET_HISTOGRAM']._serialized_start=196274 - _globals['_PROFILEPACKET_HISTOGRAM']._serialized_end=196417 - _globals['_PROFILEPACKET_HISTOGRAM_BUCKET']._serialized_start=196353 - _globals['_PROFILEPACKET_HISTOGRAM_BUCKET']._serialized_end=196417 - _globals['_PROFILEPACKET_PROCESSSTATS']._serialized_start=196420 - _globals['_PROFILEPACKET_PROCESSSTATS']._serialized_end=196642 - _globals['_PROFILEPACKET_PROCESSHEAPSAMPLES']._serialized_start=196645 - _globals['_PROFILEPACKET_PROCESSHEAPSAMPLES']._serialized_end=197270 - _globals['_PROFILEPACKET_PROCESSHEAPSAMPLES_CLIENTERROR']._serialized_start=197165 - _globals['_PROFILEPACKET_PROCESSHEAPSAMPLES_CLIENTERROR']._serialized_end=197270 - _globals['_STREAMINGALLOCATION']._serialized_start=197273 - _globals['_STREAMINGALLOCATION']._serialized_end=197430 - _globals['_STREAMINGFREE']._serialized_start=197432 - _globals['_STREAMINGFREE']._serialized_end=197506 - _globals['_STREAMINGPROFILEPACKET']._serialized_start=197508 - _globals['_STREAMINGPROFILEPACKET']._serialized_end=197609 - _globals['_PROFILING']._serialized_start=197612 - _globals['_PROFILING']._serialized_end=198268 - _globals['_PROFILING_CPUMODE']._serialized_start=197625 - _globals['_PROFILING_CPUMODE']._serialized_end=197749 - _globals['_PROFILING_STACKUNWINDERROR']._serialized_start=197752 - _globals['_PROFILING_STACKUNWINDERROR']._serialized_end=198268 - _globals['_PERFSAMPLE']._serialized_start=198271 - _globals['_PERFSAMPLE']._serialized_end=199150 - _globals['_PERFSAMPLE_PRODUCEREVENT']._serialized_start=198695 - _globals['_PERFSAMPLE_PRODUCEREVENT']._serialized_end=198915 - _globals['_PERFSAMPLE_PRODUCEREVENT_DATASOURCESTOPREASON']._serialized_start=198806 - _globals['_PERFSAMPLE_PRODUCEREVENT_DATASOURCESTOPREASON']._serialized_end=198884 - _globals['_PERFSAMPLE_SAMPLESKIPREASON']._serialized_start=198918 - _globals['_PERFSAMPLE_SAMPLESKIPREASON']._serialized_end=199091 - _globals['_PERFSAMPLEDEFAULTS']._serialized_start=199153 - _globals['_PERFSAMPLEDEFAULTS']._serialized_end=199339 - _globals['_SMAPSENTRY']._serialized_start=199342 - _globals['_SMAPSENTRY']._serialized_end=199729 - _globals['_PACKEDSMAPS']._serialized_start=199732 - _globals['_PACKEDSMAPS']._serialized_end=200117 - _globals['_SMAPSPACKET']._serialized_start=200120 - _globals['_SMAPSPACKET']._serialized_end=200468 - _globals['_SMAPSPACKET_RECORDINGTYPE']._serialized_start=200317 - _globals['_SMAPSPACKET_RECORDINGTYPE']._serialized_end=200468 - _globals['_PROCESSSTATS']._serialized_start=200471 - _globals['_PROCESSSTATS']._serialized_end=201298 - _globals['_PROCESSSTATS_THREAD']._serialized_start=200579 - _globals['_PROCESSSTATS_THREAD']._serialized_end=200618 - _globals['_PROCESSSTATS_FDINFO']._serialized_start=200620 - _globals['_PROCESSSTATS_FDINFO']._serialized_end=200654 - _globals['_PROCESSSTATS_PROCESS']._serialized_start=200657 - _globals['_PROCESSSTATS_PROCESS']._serialized_end=201298 - _globals['_PROCESSTREE']._serialized_start=201301 - _globals['_PROCESSTREE']._serialized_end=201693 - _globals['_PROCESSTREE_THREAD']._serialized_start=201461 - _globals['_PROCESSTREE_THREAD']._serialized_end=201525 - _globals['_PROCESSTREE_PROCESS']._serialized_start=201528 - _globals['_PROCESSTREE_PROCESS']._serialized_end=201693 - _globals['_REMOTECLOCKSYNC']._serialized_start=201696 - _globals['_REMOTECLOCKSYNC']._serialized_end=201907 - _globals['_REMOTECLOCKSYNC_SYNCEDCLOCKS']._serialized_start=201785 - _globals['_REMOTECLOCKSYNC_SYNCEDCLOCKS']._serialized_end=201907 - _globals['_ATOM']._serialized_start=201909 - _globals['_ATOM']._serialized_end=201915 - _globals['_STATSDATOM']._serialized_start=201917 - _globals['_STATSDATOM']._serialized_end=201991 - _globals['_SYSSTATS']._serialized_start=201994 - _globals['_SYSSTATS']._serialized_end=204142 - _globals['_SYSSTATS_MEMINFOVALUE']._serialized_start=202837 - _globals['_SYSSTATS_MEMINFOVALUE']._serialized_end=202913 - _globals['_SYSSTATS_VMSTATVALUE']._serialized_start=202915 - _globals['_SYSSTATS_VMSTATVALUE']._serialized_end=202989 - _globals['_SYSSTATS_CPUTIMES']._serialized_start=202992 - _globals['_SYSSTATS_CPUTIMES']._serialized_end=203172 - _globals['_SYSSTATS_INTERRUPTCOUNT']._serialized_start=203174 - _globals['_SYSSTATS_INTERRUPTCOUNT']._serialized_end=203218 - _globals['_SYSSTATS_DEVFREQVALUE']._serialized_start=203220 - _globals['_SYSSTATS_DEVFREQVALUE']._serialized_end=203262 - _globals['_SYSSTATS_BUDDYINFO']._serialized_start=203264 - _globals['_SYSSTATS_BUDDYINFO']._serialized_end=203324 - _globals['_SYSSTATS_DISKSTAT']._serialized_start=203327 - _globals['_SYSSTATS_DISKSTAT']._serialized_end=203542 - _globals['_SYSSTATS_PSISAMPLE']._serialized_start=203545 - _globals['_SYSSTATS_PSISAMPLE']._serialized_end=203853 - _globals['_SYSSTATS_PSISAMPLE_PSIRESOURCE']._serialized_start=203644 - _globals['_SYSSTATS_PSISAMPLE_PSIRESOURCE']._serialized_end=203853 - _globals['_SYSSTATS_THERMALZONE']._serialized_start=203855 - _globals['_SYSSTATS_THERMALZONE']._serialized_end=203910 - _globals['_SYSSTATS_CPUIDLESTATEENTRY']._serialized_start=203912 - _globals['_SYSSTATS_CPUIDLESTATEENTRY']._serialized_end=203967 - _globals['_SYSSTATS_CPUIDLESTATE']._serialized_start=203969 - _globals['_SYSSTATS_CPUIDLESTATE']._serialized_end=204073 - _globals['_SYSSTATS_SLABINFO']._serialized_start=204075 - _globals['_SYSSTATS_SLABINFO']._serialized_end=204142 - _globals['_CPUINFO']._serialized_start=204145 - _globals['_CPUINFO']._serialized_end=204477 - _globals['_CPUINFO_ARMCPUIDENTIFIER']._serialized_start=204200 - _globals['_CPUINFO_ARMCPUIDENTIFIER']._serialized_end=204310 - _globals['_CPUINFO_CPU']._serialized_start=204313 - _globals['_CPUINFO_CPU']._serialized_end=204477 - _globals['_GPUINFO']._serialized_start=204480 - _globals['_GPUINFO']._serialized_end=204738 - _globals['_GPUINFO_GPU']._serialized_start=204536 - _globals['_GPUINFO_GPU']._serialized_end=204738 - _globals['_GPUINFO_GPU_KEYVALUE']._serialized_start=204700 - _globals['_GPUINFO_GPU_KEYVALUE']._serialized_end=204738 - _globals['_INTERRUPTINFO']._serialized_start=204741 - _globals['_INTERRUPTINFO']._serialized_end=204876 - _globals['_INTERRUPTINFO_INTERRUPTMAPPING']._serialized_start=204828 - _globals['_INTERRUPTINFO_INTERRUPTMAPPING']._serialized_end=204876 - _globals['_TESTEVENT']._serialized_start=204879 - _globals['_TESTEVENT']._serialized_end=205981 - _globals['_TESTEVENT_TESTPAYLOAD']._serialized_start=205167 - _globals['_TESTEVENT_TESTPAYLOAD']._serialized_end=205409 - _globals['_TESTEVENT_PROTOVMMESSAGE']._serialized_start=205412 - _globals['_TESTEVENT_PROTOVMMESSAGE']._serialized_end=205562 - _globals['_TESTEVENT_PROTOVMMESSAGE_PROTOVMSUBMESSAGE']._serialized_start=205523 - _globals['_TESTEVENT_PROTOVMMESSAGE_PROTOVMSUBMESSAGE']._serialized_end=205562 - _globals['_TESTEVENT_PROTOVMPATCH']._serialized_start=205565 - _globals['_TESTEVENT_PROTOVMPATCH']._serialized_end=205782 - _globals['_TESTEVENT_PROTOVMINCREMENTALSTATE']._serialized_start=205785 - _globals['_TESTEVENT_PROTOVMINCREMENTALSTATE']._serialized_end=205981 - _globals['_TRACEPACKETDEFAULTS']._serialized_start=205984 - _globals['_TRACEPACKETDEFAULTS']._serialized_end=206295 - _globals['_TRACEUUID']._serialized_start=206297 - _globals['_TRACEUUID']._serialized_end=206334 - _globals['_PROCESSDESCRIPTOR']._serialized_start=206337 - _globals['_PROCESSDESCRIPTOR']._serialized_end=206824 - _globals['_PROCESSDESCRIPTOR_CHROMEPROCESSTYPE']._serialized_start=206599 - _globals['_PROCESSDESCRIPTOR_CHROMEPROCESSTYPE']._serialized_end=206824 - _globals['_TRACKEVENTRANGEOFINTEREST']._serialized_start=206826 - _globals['_TRACKEVENTRANGEOFINTEREST']._serialized_end=206871 - _globals['_THREADDESCRIPTOR']._serialized_start=206874 - _globals['_THREADDESCRIPTOR']._serialized_end=207630 - _globals['_THREADDESCRIPTOR_CHROMETHREADTYPE']._serialized_start=207159 - _globals['_THREADDESCRIPTOR_CHROMETHREADTYPE']._serialized_end=207630 - _globals['_CHROMEPROCESSDESCRIPTOR']._serialized_start=207633 - _globals['_CHROMEPROCESSDESCRIPTOR']._serialized_end=207788 - _globals['_CHROMETHREADDESCRIPTOR']._serialized_start=207790 - _globals['_CHROMETHREADDESCRIPTOR']._serialized_end=207888 - _globals['_COUNTERDESCRIPTOR']._serialized_start=207891 - _globals['_COUNTERDESCRIPTOR']._serialized_end=208346 - _globals['_COUNTERDESCRIPTOR_BUILTINCOUNTERTYPE']._serialized_start=208150 - _globals['_COUNTERDESCRIPTOR_BUILTINCOUNTERTYPE']._serialized_end=208261 - _globals['_COUNTERDESCRIPTOR_UNIT']._serialized_start=208263 - _globals['_COUNTERDESCRIPTOR_UNIT']._serialized_end=208346 - _globals['_STATEDESCRIPTOR']._serialized_start=208348 - _globals['_STATEDESCRIPTOR']._serialized_end=208365 - _globals['_TRACKDESCRIPTOR']._serialized_start=208368 - _globals['_TRACKDESCRIPTOR']._serialized_end=209784 - _globals['_TRACKDESCRIPTOR_CHILDTRACKSORDERING']._serialized_start=209291 - _globals['_TRACKDESCRIPTOR_CHILDTRACKSORDERING']._serialized_end=209377 - _globals['_TRACKDESCRIPTOR_SIBLINGMERGEBEHAVIOR']._serialized_start=209380 - _globals['_TRACKDESCRIPTOR_SIBLINGMERGEBEHAVIOR']._serialized_end=209566 - _globals['_TRACKDESCRIPTOR_PROCESSORDERING']._serialized_start=209568 - _globals['_TRACKDESCRIPTOR_PROCESSORDERING']._serialized_end=209650 - _globals['_TRACKDESCRIPTOR_THREADORDERING']._serialized_start=209652 - _globals['_TRACKDESCRIPTOR_THREADORDERING']._serialized_end=209731 - _globals['_TRANSLATIONTABLE']._serialized_start=209787 - _globals['_TRANSLATIONTABLE']._serialized_end=210280 - _globals['_CHROMEHISTORGRAMTRANSLATIONTABLE']._serialized_start=210283 - _globals['_CHROMEHISTORGRAMTRANSLATIONTABLE']._serialized_end=210457 - _globals['_CHROMEHISTORGRAMTRANSLATIONTABLE_HASHTONAMEENTRY']._serialized_start=210408 - _globals['_CHROMEHISTORGRAMTRANSLATIONTABLE_HASHTONAMEENTRY']._serialized_end=210457 - _globals['_CHROMEUSEREVENTTRANSLATIONTABLE']._serialized_start=210460 - _globals['_CHROMEUSEREVENTTRANSLATIONTABLE']._serialized_end=210651 - _globals['_CHROMEUSEREVENTTRANSLATIONTABLE_ACTIONHASHTONAMEENTRY']._serialized_start=210596 - _globals['_CHROMEUSEREVENTTRANSLATIONTABLE_ACTIONHASHTONAMEENTRY']._serialized_end=210651 - _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE']._serialized_start=210654 - _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE']._serialized_end=211009 - _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE_SITEHASHTONAMEENTRY']._serialized_start=210901 - _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE_SITEHASHTONAMEENTRY']._serialized_end=210954 - _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE_MARKHASHTONAMEENTRY']._serialized_start=210956 - _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE_MARKHASHTONAMEENTRY']._serialized_end=211009 - _globals['_SLICENAMETRANSLATIONTABLE']._serialized_start=211012 - _globals['_SLICENAMETRANSLATIONTABLE']._serialized_end=211206 - _globals['_SLICENAMETRANSLATIONTABLE_RAWTODEOBFUSCATEDNAMEENTRY']._serialized_start=211146 - _globals['_SLICENAMETRANSLATIONTABLE_RAWTODEOBFUSCATEDNAMEENTRY']._serialized_end=211206 - _globals['_PROCESSTRACKNAMETRANSLATIONTABLE']._serialized_start=211209 - _globals['_PROCESSTRACKNAMETRANSLATIONTABLE']._serialized_end=211417 - _globals['_PROCESSTRACKNAMETRANSLATIONTABLE_RAWTODEOBFUSCATEDNAMEENTRY']._serialized_start=211146 - _globals['_PROCESSTRACKNAMETRANSLATIONTABLE_RAWTODEOBFUSCATEDNAMEENTRY']._serialized_end=211206 - _globals['_CHROMESTUDYTRANSLATIONTABLE']._serialized_start=211420 - _globals['_CHROMESTUDYTRANSLATIONTABLE']._serialized_end=211584 - _globals['_CHROMESTUDYTRANSLATIONTABLE_HASHTONAMEENTRY']._serialized_start=210408 - _globals['_CHROMESTUDYTRANSLATIONTABLE_HASHTONAMEENTRY']._serialized_end=210457 - _globals['_TRIGGER']._serialized_start=211586 - _globals['_TRIGGER']._serialized_end=211693 - _globals['_UISTATE']._serialized_start=211696 - _globals['_UISTATE']._serialized_end=211893 - _globals['_UISTATE_HIGHLIGHTPROCESS']._serialized_start=211829 - _globals['_UISTATE_HIGHLIGHTPROCESS']._serialized_end=211893 - _globals['_TRACEPACKET']._serialized_start=211896 - _globals['_TRACEPACKET']._serialized_end=218405 - _globals['_TRACEPACKET_PROTOVMS']._serialized_start=217580 - _globals['_TRACEPACKET_PROTOVMS']._serialized_end=217805 - _globals['_TRACEPACKET_PROTOVMS_INSTANCE']._serialized_start=217659 - _globals['_TRACEPACKET_PROTOVMS_INSTANCE']._serialized_end=217805 - _globals['_TRACEPACKET_SEQUENCEFLAGS']._serialized_start=217807 - _globals['_TRACEPACKET_SEQUENCEFLAGS']._serialized_end=217911 - _globals['_TRACEPACKET_DATALOSSREASON']._serialized_start=217914 - _globals['_TRACEPACKET_DATALOSSREASON']._serialized_end=218218 - _globals['_TRACE']._serialized_start=218407 - _globals['_TRACE']._serialized_end=218460 + _globals['_CHROMIUMSAMPLINGHEAPPROFILERCONFIG']._serialized_start=9348 + _globals['_CHROMIUMSAMPLINGHEAPPROFILERCONFIG']._serialized_end=9447 + _globals['_CHROMIUMSTACKSAMPLINGPROFILERCONFIG']._serialized_start=9449 + _globals['_CHROMIUMSTACKSAMPLINGPROFILERCONFIG']._serialized_end=9516 + _globals['_CHROMIUMSYSTEMMETRICSCONFIG']._serialized_start=9518 + _globals['_CHROMIUMSYSTEMMETRICSCONFIG']._serialized_end=9577 + _globals['_V8CONFIG']._serialized_start=9579 + _globals['_V8CONFIG']._serialized_end=9643 + _globals['_ETWCONFIG']._serialized_start=9646 + _globals['_ETWCONFIG']._serialized_end=9966 + _globals['_ETWCONFIG_KERNELFLAG']._serialized_start=9925 + _globals['_ETWCONFIG_KERNELFLAG']._serialized_end=9966 + _globals['_FROZENFTRACECONFIG']._serialized_start=9968 + _globals['_FROZENFTRACECONFIG']._serialized_end=10011 + _globals['_FTRACECONFIG']._serialized_start=10014 + _globals['_FTRACECONFIG']._serialized_end=11880 + _globals['_FTRACECONFIG_COMPACTSCHEDCONFIG']._serialized_start=11114 + _globals['_FTRACECONFIG_COMPACTSCHEDCONFIG']._serialized_end=11151 + _globals['_FTRACECONFIG_PRINTFILTER']._serialized_start=11154 + _globals['_FTRACECONFIG_PRINTFILTER']._serialized_end=11412 + _globals['_FTRACECONFIG_PRINTFILTER_RULE']._serialized_start=11233 + _globals['_FTRACECONFIG_PRINTFILTER_RULE']._serialized_end=11412 + _globals['_FTRACECONFIG_PRINTFILTER_RULE_ATRACEMESSAGE']._serialized_start=11358 + _globals['_FTRACECONFIG_PRINTFILTER_RULE_ATRACEMESSAGE']._serialized_end=11403 + _globals['_FTRACECONFIG_KPROBEEVENT']._serialized_start=11415 + _globals['_FTRACECONFIG_KPROBEEVENT']._serialized_end=11623 + _globals['_FTRACECONFIG_KPROBEEVENT_KPROBETYPE']._serialized_start=11513 + _globals['_FTRACECONFIG_KPROBEEVENT_KPROBETYPE']._serialized_end=11623 + _globals['_FTRACECONFIG_TRACEFSOPTION']._serialized_start=11626 + _globals['_FTRACECONFIG_TRACEFSOPTION']._serialized_end=11788 + _globals['_FTRACECONFIG_TRACEFSOPTION_STATE']._serialized_start=11723 + _globals['_FTRACECONFIG_TRACEFSOPTION_STATE']._serialized_end=11788 + _globals['_FTRACECONFIG_KSYMSMEMPOLICY']._serialized_start=11790 + _globals['_FTRACECONFIG_KSYMSMEMPOLICY']._serialized_end=11874 + _globals['_GPUCOUNTERCONFIG']._serialized_start=11883 + _globals['_GPUCOUNTERCONFIG']._serialized_end=12754 + _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG']._serialized_start=12133 + _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG']._serialized_end=12724 + _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYNAMEFILTER']._serialized_start=12447 + _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYNAMEFILTER']._serialized_end=12678 + _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYNAMEFILTER_NAMEBASE']._serialized_start=12597 + _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYNAMEFILTER_NAMEBASE']._serialized_end=12678 + _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYRANGE']._serialized_start=12680 + _globals['_GPUCOUNTERCONFIG_INSTRUMENTEDSAMPLINGCONFIG_ACTIVITYRANGE']._serialized_end=12724 + _globals['_GPURENDERSTAGESCONFIG']._serialized_start=12756 + _globals['_GPURENDERSTAGESCONFIG']._serialized_end=12848 + _globals['_VULKANMEMORYCONFIG']._serialized_start=12850 + _globals['_VULKANMEMORYCONFIG']._serialized_end=12940 + _globals['_INODEFILECONFIG']._serialized_start=12943 + _globals['_INODEFILECONFIG']._serialized_end=13234 + _globals['_INODEFILECONFIG_MOUNTPOINTMAPPINGENTRY']._serialized_start=13170 + _globals['_INODEFILECONFIG_MOUNTPOINTMAPPINGENTRY']._serialized_end=13234 + _globals['_CONSOLECONFIG']._serialized_start=13237 + _globals['_CONSOLECONFIG']._serialized_end=13402 + _globals['_CONSOLECONFIG_OUTPUT']._serialized_start=13332 + _globals['_CONSOLECONFIG_OUTPUT']._serialized_end=13402 + _globals['_INTERCEPTORCONFIG']._serialized_start=13404 + _globals['_INTERCEPTORCONFIG']._serialized_end=13493 + _globals['_SYSTEMDJOURNALDCONFIG']._serialized_start=13495 + _globals['_SYSTEMDJOURNALDCONFIG']._serialized_end=13586 + _globals['_ANDROIDPOWERCONFIG']._serialized_start=13589 + _globals['_ANDROIDPOWERCONFIG']._serialized_end=14037 + _globals['_ANDROIDPOWERCONFIG_BATTERYCOUNTERS']._serialized_start=13830 + _globals['_ANDROIDPOWERCONFIG_BATTERYCOUNTERS']._serialized_end=14037 + _globals['_PRIORITYBOOSTCONFIG']._serialized_start=14040 + _globals['_PRIORITYBOOSTCONFIG']._serialized_end=14231 + _globals['_PRIORITYBOOSTCONFIG_BOOSTPOLICY']._serialized_start=14147 + _globals['_PRIORITYBOOSTCONFIG_BOOSTPOLICY']._serialized_end=14231 + _globals['_PROCESSSTATSCONFIG']._serialized_start=14234 + _globals['_PROCESSSTATSCONFIG']._serialized_end=14725 + _globals['_PROCESSSTATSCONFIG_QUIRKS']._serialized_start=14628 + _globals['_PROCESSSTATSCONFIG_QUIRKS']._serialized_end=14713 + _globals['_HEAPPROFDCONFIG']._serialized_start=14728 + _globals['_HEAPPROFDCONFIG']._serialized_end=15572 + _globals['_HEAPPROFDCONFIG_CONTINUOUSDUMPCONFIG']._serialized_start=15495 + _globals['_HEAPPROFDCONFIG_CONTINUOUSDUMPCONFIG']._serialized_end=15566 + _globals['_SMAPSCONFIG']._serialized_start=15575 + _globals['_SMAPSCONFIG']._serialized_end=16055 + _globals['_SMAPSCONFIG_VMAFIELD']._serialized_start=15734 + _globals['_SMAPSCONFIG_VMAFIELD']._serialized_end=16055 + _globals['_REDACTIONRULE']._serialized_start=16058 + _globals['_REDACTIONRULE']._serialized_end=16368 + _globals['_REDACTIONRULE_MATCHMODE']._serialized_start=16256 + _globals['_REDACTIONRULE_MATCHMODE']._serialized_end=16368 + _globals['_JAVAHPROFCONFIG']._serialized_start=16371 + _globals['_JAVAHPROFCONFIG']._serialized_end=16836 + _globals['_JAVAHPROFCONFIG_CONTINUOUSDUMPCONFIG']._serialized_start=16732 + _globals['_JAVAHPROFCONFIG_CONTINUOUSDUMPCONFIG']._serialized_end=16836 + _globals['_PERFEVENTS']._serialized_start=16839 + _globals['_PERFEVENTS']._serialized_end=18192 + _globals['_PERFEVENTS_TIMEBASE']._serialized_start=16854 + _globals['_PERFEVENTS_TIMEBASE']._serialized_end=17267 + _globals['_PERFEVENTS_TRACEPOINT']._serialized_start=17269 + _globals['_PERFEVENTS_TRACEPOINT']._serialized_end=17311 + _globals['_PERFEVENTS_RAWEVENT']._serialized_start=17313 + _globals['_PERFEVENTS_RAWEVENT']._serialized_end=17405 + _globals['_PERFEVENTS_COUNTER']._serialized_start=17408 + _globals['_PERFEVENTS_COUNTER']._serialized_end=17896 + _globals['_PERFEVENTS_PERFCLOCK']._serialized_start=17899 + _globals['_PERFEVENTS_PERFCLOCK']._serialized_end=18040 + _globals['_PERFEVENTS_EVENTMODIFIER']._serialized_start=18043 + _globals['_PERFEVENTS_EVENTMODIFIER']._serialized_end=18192 + _globals['_FOLLOWEREVENT']._serialized_start=18195 + _globals['_FOLLOWEREVENT']._serialized_end=18472 + _globals['_PERFEVENTCONFIG']._serialized_start=18475 + _globals['_PERFEVENTCONFIG']._serialized_end=19632 + _globals['_PERFEVENTCONFIG_CALLSTACKSAMPLING']._serialized_start=19172 + _globals['_PERFEVENTCONFIG_CALLSTACKSAMPLING']._serialized_end=19335 + _globals['_PERFEVENTCONFIG_SCOPE']._serialized_start=19338 + _globals['_PERFEVENTCONFIG_SCOPE']._serialized_end=19498 + _globals['_PERFEVENTCONFIG_UNWINDMODE']._serialized_start=19500 + _globals['_PERFEVENTCONFIG_UNWINDMODE']._serialized_end=19626 + _globals['_PROTOVMCONFIG']._serialized_start=19634 + _globals['_PROTOVMCONFIG']._serialized_end=19674 + _globals['_QNXCONFIG']._serialized_start=19677 + _globals['_QNXCONFIG']._serialized_end=19868 + _globals['_STATSDTRACINGCONFIG']._serialized_start=19871 + _globals['_STATSDTRACINGCONFIG']._serialized_end=20025 + _globals['_STATSDPULLATOMCONFIG']._serialized_start=20028 + _globals['_STATSDPULLATOMCONFIG']._serialized_end=20168 + _globals['_SYSSTATSCONFIG']._serialized_start=20171 + _globals['_SYSSTATSCONFIG']._serialized_end=20815 + _globals['_SYSSTATSCONFIG_STATCOUNTERS']._serialized_start=20692 + _globals['_SYSSTATSCONFIG_STATCOUNTERS']._serialized_end=20815 + _globals['_SYSTEMINFOCONFIG']._serialized_start=20817 + _globals['_SYSTEMINFOCONFIG']._serialized_end=20854 + _globals['_TESTCONFIG']._serialized_start=20857 + _globals['_TESTCONFIG']._serialized_end=21382 + _globals['_TESTCONFIG_DUMMYFIELDS']._serialized_start=21059 + _globals['_TESTCONFIG_DUMMYFIELDS']._serialized_end=21382 + _globals['_TRACKEVENTCONFIG']._serialized_start=21385 + _globals['_TRACKEVENTCONFIG']._serialized_end=21723 + _globals['_DATASOURCECONFIG']._serialized_start=21726 + _globals['_DATASOURCECONFIG']._serialized_end=25894 + _globals['_DATASOURCECONFIG_SESSIONINITIATOR']._serialized_start=25626 + _globals['_DATASOURCECONFIG_SESSIONINITIATOR']._serialized_end=25717 + _globals['_DATASOURCECONFIG_BUFFEREXHAUSTEDPOLICY']._serialized_start=25720 + _globals['_DATASOURCECONFIG_BUFFEREXHAUSTEDPOLICY']._serialized_end=25881 + _globals['_TRACECONFIG']._serialized_start=25897 + _globals['_TRACECONFIG']._serialized_end=31757 + _globals['_TRACECONFIG_BUFFERCONFIG']._serialized_start=28006 + _globals['_TRACECONFIG_BUFFERCONFIG']._serialized_end=28410 + _globals['_TRACECONFIG_BUFFERCONFIG_FILLPOLICY']._serialized_start=28270 + _globals['_TRACECONFIG_BUFFERCONFIG_FILLPOLICY']._serialized_end=28329 + _globals['_TRACECONFIG_BUFFERCONFIG_EXPERIMENTALMODE']._serialized_start=28331 + _globals['_TRACECONFIG_BUFFERCONFIG_EXPERIMENTALMODE']._serialized_end=28398 + _globals['_TRACECONFIG_DATASOURCE']._serialized_start=28413 + _globals['_TRACECONFIG_DATASOURCE']._serialized_end=28571 + _globals['_TRACECONFIG_BUILTINDATASOURCE']._serialized_start=28574 + _globals['_TRACECONFIG_BUILTINDATASOURCE']._serialized_end=28974 + _globals['_TRACECONFIG_PRODUCERCONFIG']._serialized_start=28976 + _globals['_TRACECONFIG_PRODUCERCONFIG']._serialized_end=29058 + _globals['_TRACECONFIG_STATSDMETADATA']._serialized_start=29061 + _globals['_TRACECONFIG_STATSDMETADATA']._serialized_end=29203 + _globals['_TRACECONFIG_GUARDRAILOVERRIDES']._serialized_start=29205 + _globals['_TRACECONFIG_GUARDRAILOVERRIDES']._serialized_end=29299 + _globals['_TRACECONFIG_TRIGGERCONFIG']._serialized_start=29302 + _globals['_TRACECONFIG_TRIGGERCONFIG']._serialized_end=29760 + _globals['_TRACECONFIG_TRIGGERCONFIG_TRIGGER']._serialized_start=29536 + _globals['_TRACECONFIG_TRIGGERCONFIG_TRIGGER']._serialized_end=29659 + _globals['_TRACECONFIG_TRIGGERCONFIG_TRIGGERMODE']._serialized_start=29661 + _globals['_TRACECONFIG_TRIGGERCONFIG_TRIGGERMODE']._serialized_end=29754 + _globals['_TRACECONFIG_INCREMENTALSTATECONFIG']._serialized_start=29762 + _globals['_TRACECONFIG_INCREMENTALSTATECONFIG']._serialized_end=29811 + _globals['_TRACECONFIG_COMPRESSIONCONFIG']._serialized_start=29814 + _globals['_TRACECONFIG_COMPRESSIONCONFIG']._serialized_end=30007 + _globals['_TRACECONFIG_COMPRESSIONCONFIG_DEFLATE']._serialized_start=29975 + _globals['_TRACECONFIG_COMPRESSIONCONFIG_DEFLATE']._serialized_end=29984 + _globals['_TRACECONFIG_COMPRESSIONCONFIG_ZSTD']._serialized_start=29986 + _globals['_TRACECONFIG_COMPRESSIONCONFIG_ZSTD']._serialized_end=30007 + _globals['_TRACECONFIG_INCIDENTREPORTCONFIG']._serialized_start=30010 + _globals['_TRACECONFIG_INCIDENTREPORTCONFIG']._serialized_end=30161 + _globals['_TRACECONFIG_TRACEFILTER']._serialized_start=30164 + _globals['_TRACECONFIG_TRACEFILTER']._serialized_end=30952 + _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERRULE']._serialized_start=30431 + _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERRULE']._serialized_end=30653 + _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERCHAIN']._serialized_start=30655 + _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERCHAIN']._serialized_end=30748 + _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERPOLICY']._serialized_start=30751 + _globals['_TRACECONFIG_TRACEFILTER_STRINGFILTERPOLICY']._serialized_end=30952 + _globals['_TRACECONFIG_ANDROIDREPORTCONFIG']._serialized_start=30955 + _globals['_TRACECONFIG_ANDROIDREPORTCONFIG']._serialized_end=31106 + _globals['_TRACECONFIG_CMDTRACESTARTDELAY']._serialized_start=31108 + _globals['_TRACECONFIG_CMDTRACESTARTDELAY']._serialized_end=31172 + _globals['_TRACECONFIG_SESSIONSEMAPHORE']._serialized_start=31174 + _globals['_TRACECONFIG_SESSIONSEMAPHORE']._serialized_end=31239 + _globals['_TRACECONFIG_LOCKDOWNMODEOPERATION']._serialized_start=31241 + _globals['_TRACECONFIG_LOCKDOWNMODEOPERATION']._serialized_end=31326 + _globals['_TRACECONFIG_COMPRESSIONTYPE']._serialized_start=31328 + _globals['_TRACECONFIG_COMPRESSIONTYPE']._serialized_end=31409 + _globals['_TRACECONFIG_STATSDLOGGING']._serialized_start=31411 + _globals['_TRACECONFIG_STATSDLOGGING']._serialized_end=31515 + _globals['_TRACECONFIG_WRITEFLUSHMODE']._serialized_start=31517 + _globals['_TRACECONFIG_WRITEFLUSHMODE']._serialized_end=31635 + _globals['_TRACECONFIG_FFLUSHMODE']._serialized_start=31637 + _globals['_TRACECONFIG_FFLUSHMODE']._serialized_end=31714 + _globals['_UTSNAME']._serialized_start=31759 + _globals['_UTSNAME']._serialized_end=31836 + _globals['_SYSTEMINFO']._serialized_start=31839 + _globals['_SYSTEMINFO']._serialized_end=32337 + _globals['_TRACESTATS']._serialized_start=32340 + _globals['_TRACESTATS']._serialized_end=33925 + _globals['_TRACESTATS_BUFFERSTATS']._serialized_start=32975 + _globals['_TRACESTATS_BUFFERSTATS']._serialized_end=33529 + _globals['_TRACESTATS_WRITERSTATS']._serialized_start=33532 + _globals['_TRACESTATS_WRITERSTATS']._serialized_end=33667 + _globals['_TRACESTATS_FILTERSTATS']._serialized_start=33670 + _globals['_TRACESTATS_FILTERSTATS']._serialized_end=33824 + _globals['_TRACESTATS_FINALFLUSHOUTCOME']._serialized_start=33826 + _globals['_TRACESTATS_FINALFLUSHOUTCOME']._serialized_end=33925 + _globals['_ANDROIDAFLAGS']._serialized_start=33928 + _globals['_ANDROIDAFLAGS']._serialized_end=34910 + _globals['_ANDROIDAFLAGS_FLAG']._serialized_start=34013 + _globals['_ANDROIDAFLAGS_FLAG']._serialized_end=34399 + _globals['_ANDROIDAFLAGS_FLAGPERMISSION']._serialized_start=34401 + _globals['_ANDROIDAFLAGS_FLAGPERMISSION']._serialized_end=34513 + _globals['_ANDROIDAFLAGS_VALUEPICKEDFROM']._serialized_start=34516 + _globals['_ANDROIDAFLAGS_VALUEPICKEDFROM']._serialized_end=34658 + _globals['_ANDROIDAFLAGS_FLAGSTORAGEBACKEND']._serialized_start=34661 + _globals['_ANDROIDAFLAGS_FLAGSTORAGEBACKEND']._serialized_end=34825 + _globals['_ANDROIDAFLAGS_FLAGTYPE']._serialized_start=34827 + _globals['_ANDROIDAFLAGS_FLAGTYPE']._serialized_end=34910 + _globals['_ANDROIDGAMEINTERVENTIONLIST']._serialized_start=34913 + _globals['_ANDROIDGAMEINTERVENTIONLIST']._serialized_end=35312 + _globals['_ANDROIDGAMEINTERVENTIONLIST_GAMEMODEINFO']._serialized_start=35070 + _globals['_ANDROIDGAMEINTERVENTIONLIST_GAMEMODEINFO']._serialized_end=35160 + _globals['_ANDROIDGAMEINTERVENTIONLIST_GAMEPACKAGEINFO']._serialized_start=35163 + _globals['_ANDROIDGAMEINTERVENTIONLIST_GAMEPACKAGEINFO']._serialized_end=35312 + _globals['_ANDROIDLOGPACKET']._serialized_start=35315 + _globals['_ANDROIDLOGPACKET']._serialized_end=35877 + _globals['_ANDROIDLOGPACKET_LOGEVENT']._serialized_start=35452 + _globals['_ANDROIDLOGPACKET_LOGEVENT']._serialized_end=35808 + _globals['_ANDROIDLOGPACKET_LOGEVENT_ARG']._serialized_start=35712 + _globals['_ANDROIDLOGPACKET_LOGEVENT_ARG']._serialized_end=35808 + _globals['_ANDROIDLOGPACKET_STATS']._serialized_start=35810 + _globals['_ANDROIDLOGPACKET_STATS']._serialized_end=35877 + _globals['_ANDROIDSYSTEMPROPERTY']._serialized_start=35880 + _globals['_ANDROIDSYSTEMPROPERTY']._serialized_end=36019 + _globals['_ANDROIDSYSTEMPROPERTY_PROPERTYVALUE']._serialized_start=35975 + _globals['_ANDROIDSYSTEMPROPERTY_PROPERTYVALUE']._serialized_end=36019 + _globals['_CPUPERUIDDATA']._serialized_start=36021 + _globals['_CPUPERUIDDATA']._serialized_end=36103 + _globals['_GRAPHICSFRAMEEVENT']._serialized_start=36106 + _globals['_GRAPHICSFRAMEEVENT']._serialized_end=36603 + _globals['_GRAPHICSFRAMEEVENT_BUFFEREVENT']._serialized_start=36200 + _globals['_GRAPHICSFRAMEEVENT_BUFFEREVENT']._serialized_end=36362 + _globals['_GRAPHICSFRAMEEVENT_BUFFEREVENTTYPE']._serialized_start=36365 + _globals['_GRAPHICSFRAMEEVENT_BUFFEREVENTTYPE']._serialized_end=36603 + _globals['_INITIALDISPLAYSTATE']._serialized_start=36605 + _globals['_INITIALDISPLAYSTATE']._serialized_end=36669 + _globals['_KERNELWAKELOCKDATA']._serialized_start=36672 + _globals['_KERNELWAKELOCKDATA']._serialized_end=37050 + _globals['_KERNELWAKELOCKDATA_WAKELOCK']._serialized_start=36835 + _globals['_KERNELWAKELOCKDATA_WAKELOCK']._serialized_end=37050 + _globals['_KERNELWAKELOCKDATA_WAKELOCK_TYPE']._serialized_start=36965 + _globals['_KERNELWAKELOCKDATA_WAKELOCK_TYPE']._serialized_end=37050 + _globals['_PACKAGESLIST']._serialized_start=37053 + _globals['_PACKAGESLIST']._serialized_end=37285 + _globals['_PACKAGESLIST_PACKAGEINFO']._serialized_start=37171 + _globals['_PACKAGESLIST_PACKAGEINFO']._serialized_end=37285 + _globals['_PIXELMODEMEVENTS']._serialized_start=37287 + _globals['_PIXELMODEMEVENTS']._serialized_end=37347 + _globals['_PIXELMODEMTOKENDATABASE']._serialized_start=37349 + _globals['_PIXELMODEMTOKENDATABASE']._serialized_end=37392 + _globals['_ANDROIDUSERLIST']._serialized_start=37395 + _globals['_ANDROIDUSERLIST']._serialized_end=37524 + _globals['_ANDROIDUSERLIST_USERINFO']._serialized_start=37487 + _globals['_ANDROIDUSERLIST_USERINFO']._serialized_end=37524 + _globals['_CHROMEBENCHMARKMETADATA']._serialized_start=37527 + _globals['_CHROMEBENCHMARKMETADATA']._serialized_end=37769 + _globals['_CHROMEMETADATAPACKET']._serialized_start=37772 + _globals['_CHROMEMETADATAPACKET']._serialized_end=38132 + _globals['_CHROMEMETADATAPACKET_FINCHHASH']._serialized_start=38092 + _globals['_CHROMEMETADATAPACKET_FINCHHASH']._serialized_end=38132 + _globals['_BACKGROUNDTRACINGMETADATA']._serialized_start=38135 + _globals['_BACKGROUNDTRACINGMETADATA']._serialized_end=39180 + _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE']._serialized_start=38351 + _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE']._serialized_end=39180 + _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_HISTOGRAMRULE']._serialized_start=38655 + _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_HISTOGRAMRULE']._serialized_end=38761 + _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_NAMEDRULE']._serialized_start=38764 + _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_NAMEDRULE']._serialized_end=39042 + _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_NAMEDRULE_EVENTTYPE']._serialized_start=38909 + _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_NAMEDRULE_EVENTTYPE']._serialized_end=39042 + _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_TRIGGERTYPE']._serialized_start=39045 + _globals['_BACKGROUNDTRACINGMETADATA_TRIGGERRULE_TRIGGERTYPE']._serialized_end=39180 + _globals['_CHROMETRACEDVALUE']._serialized_start=39183 + _globals['_CHROMETRACEDVALUE']._serialized_end=39522 + _globals['_CHROMETRACEDVALUE_NESTEDTYPE']._serialized_start=39489 + _globals['_CHROMETRACEDVALUE_NESTEDTYPE']._serialized_end=39522 + _globals['_CHROMESTRINGTABLEENTRY']._serialized_start=39524 + _globals['_CHROMESTRINGTABLEENTRY']._serialized_end=39578 + _globals['_CHROMETRACEEVENT']._serialized_start=39581 + _globals['_CHROMETRACEEVENT']._serialized_end=40222 + _globals['_CHROMETRACEEVENT_ARG']._serialized_start=39954 + _globals['_CHROMETRACEEVENT_ARG']._serialized_end=40222 + _globals['_CHROMEMETADATA']._serialized_start=40225 + _globals['_CHROMEMETADATA']._serialized_end=40353 + _globals['_CHROMELEGACYJSONTRACE']._serialized_start=40356 + _globals['_CHROMELEGACYJSONTRACE']._serialized_end=40504 + _globals['_CHROMELEGACYJSONTRACE_TRACETYPE']._serialized_start=40459 + _globals['_CHROMELEGACYJSONTRACE_TRACETYPE']._serialized_end=40504 + _globals['_CHROMEEVENTBUNDLE']._serialized_start=40507 + _globals['_CHROMEEVENTBUNDLE']._serialized_end=40802 + _globals['_CHROMETRIGGER']._serialized_start=40804 + _globals['_CHROMETRIGGER']._serialized_end=40885 + _globals['_V8STRING']._serialized_start=40887 + _globals['_V8STRING']._serialized_end=40973 + _globals['_INTERNEDV8STRING']._serialized_start=40975 + _globals['_INTERNEDV8STRING']._serialized_end=41082 + _globals['_INTERNEDV8JSSCRIPT']._serialized_start=41085 + _globals['_INTERNEDV8JSSCRIPT']._serialized_end=41410 + _globals['_INTERNEDV8JSSCRIPT_TYPE']._serialized_start=41280 + _globals['_INTERNEDV8JSSCRIPT_TYPE']._serialized_end=41410 + _globals['_INTERNEDV8WASMSCRIPT']._serialized_start=41412 + _globals['_INTERNEDV8WASMSCRIPT']._serialized_end=41499 + _globals['_INTERNEDV8JSFUNCTION']._serialized_start=41502 + _globals['_INTERNEDV8JSFUNCTION']._serialized_end=42611 + _globals['_INTERNEDV8JSFUNCTION_KIND']._serialized_start=41729 + _globals['_INTERNEDV8JSFUNCTION_KIND']._serialized_end=42611 + _globals['_INTERNEDV8ISOLATE']._serialized_start=42614 + _globals['_INTERNEDV8ISOLATE']._serialized_end=42941 + _globals['_INTERNEDV8ISOLATE_CODERANGE']._serialized_start=42822 + _globals['_INTERNEDV8ISOLATE_CODERANGE']._serialized_end=42941 + _globals['_V8JSCODE']._serialized_start=42944 + _globals['_V8JSCODE']._serialized_end=43416 + _globals['_V8JSCODE_TIER']._serialized_start=43266 + _globals['_V8JSCODE_TIER']._serialized_end=43386 + _globals['_V8INTERNALCODE']._serialized_start=43419 + _globals['_V8INTERNALCODE']._serialized_end=43900 + _globals['_V8INTERNALCODE_TYPE']._serialized_start=43642 + _globals['_V8INTERNALCODE_TYPE']._serialized_end=43900 + _globals['_V8WASMCODE']._serialized_start=43903 + _globals['_V8WASMCODE']._serialized_end=44226 + _globals['_V8WASMCODE_TIER']._serialized_start=44165 + _globals['_V8WASMCODE_TIER']._serialized_end=44226 + _globals['_V8REGEXPCODE']._serialized_start=44229 + _globals['_V8REGEXPCODE']._serialized_end=44405 + _globals['_V8CODEMOVE']._serialized_start=44408 + _globals['_V8CODEMOVE']._serialized_end=44633 + _globals['_V8CODEDEFAULTS']._serialized_start=44635 + _globals['_V8CODEDEFAULTS']._serialized_end=44664 + _globals['_CLOCKSNAPSHOT']._serialized_start=44667 + _globals['_CLOCKSNAPSHOT']._serialized_end=45069 + _globals['_CLOCKSNAPSHOT_CLOCK']._serialized_start=44799 + _globals['_CLOCKSNAPSHOT_CLOCK']._serialized_end=45069 + _globals['_CLOCKSNAPSHOT_CLOCK_BUILTINCLOCKS']._serialized_start=44898 + _globals['_CLOCKSNAPSHOT_CLOCK_BUILTINCLOCKS']._serialized_end=45069 + _globals['_CSWITCHETWEVENT']._serialized_start=45072 + _globals['_CSWITCHETWEVENT']._serialized_end=46690 + _globals['_CSWITCHETWEVENT_OLDTHREADWAITREASON']._serialized_start=45648 + _globals['_CSWITCHETWEVENT_OLDTHREADWAITREASON']._serialized_end=46393 + _globals['_CSWITCHETWEVENT_OLDTHREADWAITMODE']._serialized_start=46395 + _globals['_CSWITCHETWEVENT_OLDTHREADWAITMODE']._serialized_end=46446 + _globals['_CSWITCHETWEVENT_OLDTHREADSTATE']._serialized_start=46449 + _globals['_CSWITCHETWEVENT_OLDTHREADSTATE']._serialized_end=46584 + _globals['_READYTHREADETWEVENT']._serialized_start=46693 + _globals['_READYTHREADETWEVENT']._serialized_end=47213 + _globals['_READYTHREADETWEVENT_ADJUSTREASON']._serialized_start=46952 + _globals['_READYTHREADETWEVENT_ADJUSTREASON']._serialized_end=47040 + _globals['_READYTHREADETWEVENT_TRACEFLAG']._serialized_start=47042 + _globals['_READYTHREADETWEVENT_TRACEFLAG']._serialized_end=47164 + _globals['_MEMINFOETWEVENT']._serialized_start=47216 + _globals['_MEMINFOETWEVENT']._serialized_end=47616 + _globals['_FILEIOCREATEETWEVENT']._serialized_start=47619 + _globals['_FILEIOCREATEETWEVENT']._serialized_end=47783 + _globals['_FILEIODIRENUMETWEVENT']._serialized_start=47786 + _globals['_FILEIODIRENUMETWEVENT']._serialized_end=47970 + _globals['_FILEIOINFOETWEVENT']._serialized_start=47973 + _globals['_FILEIOINFOETWEVENT']._serialized_end=48119 + _globals['_FILEIOREADWRITEETWEVENT']._serialized_start=48122 + _globals['_FILEIOREADWRITEETWEVENT']._serialized_end=48284 + _globals['_FILEIOSIMPLEOPETWEVENT']._serialized_start=48286 + _globals['_FILEIOSIMPLEOPETWEVENT']._serialized_end=48396 + _globals['_FILEIOOPENDETWEVENT']._serialized_start=48398 + _globals['_FILEIOOPENDETWEVENT']._serialized_end=48475 + _globals['_FILEIOPATHOPERATIONETWEVENT']._serialized_start=48478 + _globals['_FILEIOPATHOPERATIONETWEVENT']._serialized_end=48652 + _globals['_STACKWALKETWEVENT']._serialized_start=48654 + _globals['_STACKWALKETWEVENT']._serialized_end=48713 + _globals['_DISKIOETWEVENT']._serialized_start=48716 + _globals['_DISKIOETWEVENT']._serialized_end=48920 + _globals['_ETWTRACEEVENT']._serialized_start=48923 + _globals['_ETWTRACEEVENT']._serialized_end=49758 + _globals['_ETWTRACEEVENTBUNDLE']._serialized_start=49760 + _globals['_ETWTRACEEVENTBUNDLE']._serialized_end=49841 + _globals['_FILEDESCRIPTORSET']._serialized_start=49843 + _globals['_FILEDESCRIPTORSET']._serialized_end=49914 + _globals['_FILEDESCRIPTORPROTO']._serialized_start=49917 + _globals['_FILEDESCRIPTORPROTO']._serialized_end=50236 + _globals['_DESCRIPTORPROTO']._serialized_start=50239 + _globals['_DESCRIPTORPROTO']._serialized_end=50705 + _globals['_DESCRIPTORPROTO_RESERVEDRANGE']._serialized_start=50650 + _globals['_DESCRIPTORPROTO_RESERVEDRANGE']._serialized_end=50693 + _globals['_UNINTERPRETEDOPTION']._serialized_start=50708 + _globals['_UNINTERPRETEDOPTION']._serialized_end=50994 + _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_start=50943 + _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_end=50994 + _globals['_FIELDOPTIONS']._serialized_start=50996 + _globals['_FIELDOPTIONS']._serialized_end=51095 + _globals['_FIELDDESCRIPTORPROTO']._serialized_start=51098 + _globals['_FIELDDESCRIPTORPROTO']._serialized_end=51785 + _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_start=51400 + _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_end=51710 + _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_start=51712 + _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_end=51779 + _globals['_ONEOFDESCRIPTORPROTO']._serialized_start=51787 + _globals['_ONEOFDESCRIPTORPROTO']._serialized_end=51871 + _globals['_ENUMDESCRIPTORPROTO']._serialized_start=51874 + _globals['_ENUMDESCRIPTORPROTO']._serialized_end=52002 + _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_start=52004 + _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_end=52066 + _globals['_ONEOFOPTIONS']._serialized_start=52068 + _globals['_ONEOFOPTIONS']._serialized_end=52101 + _globals['_EXTENSIONDESCRIPTOR']._serialized_start=52104 + _globals['_EXTENSIONDESCRIPTOR']._serialized_end=52249 + _globals['_INODEFILEMAP']._serialized_start=52252 + _globals['_INODEFILEMAP']._serialized_end=52516 + _globals['_INODEFILEMAP_ENTRY']._serialized_start=52370 + _globals['_INODEFILEMAP_ENTRY']._serialized_end=52516 + _globals['_INODEFILEMAP_ENTRY_TYPE']._serialized_start=52472 + _globals['_INODEFILEMAP_ENTRY_TYPE']._serialized_end=52516 + _globals['_ANDROIDFSDATAREADENDFTRACEEVENT']._serialized_start=52518 + _globals['_ANDROIDFSDATAREADENDFTRACEEVENT']._serialized_end=52595 + _globals['_ANDROIDFSDATAREADSTARTFTRACEEVENT']._serialized_start=52598 + _globals['_ANDROIDFSDATAREADSTARTFTRACEEVENT']._serialized_end=52740 + _globals['_ANDROIDFSDATAWRITEENDFTRACEEVENT']._serialized_start=52742 + _globals['_ANDROIDFSDATAWRITEENDFTRACEEVENT']._serialized_end=52820 + _globals['_ANDROIDFSDATAWRITESTARTFTRACEEVENT']._serialized_start=52823 + _globals['_ANDROIDFSDATAWRITESTARTFTRACEEVENT']._serialized_end=52966 + _globals['_ANDROIDFSFSYNCENDFTRACEEVENT']._serialized_start=52968 + _globals['_ANDROIDFSFSYNCENDFTRACEEVENT']._serialized_end=53042 + _globals['_ANDROIDFSFSYNCSTARTFTRACEEVENT']._serialized_start=53044 + _globals['_ANDROIDFSFSYNCSTARTFTRACEEVENT']._serialized_end=53152 + _globals['_BCLIRQTRIGGERFTRACEEVENT']._serialized_start=53155 + _globals['_BCLIRQTRIGGERFTRACEEVENT']._serialized_end=53344 + _globals['_BINDERTRANSACTIONFTRACEEVENT']._serialized_start=53347 + _globals['_BINDERTRANSACTIONFTRACEEVENT']._serialized_end=53496 + _globals['_BINDERTRANSACTIONRECEIVEDFTRACEEVENT']._serialized_start=53498 + _globals['_BINDERTRANSACTIONRECEIVEDFTRACEEVENT']._serialized_end=53554 + _globals['_BINDERSETPRIORITYFTRACEEVENT']._serialized_start=53556 + _globals['_BINDERSETPRIORITYFTRACEEVENT']._serialized_end=53674 + _globals['_BINDERLOCKFTRACEEVENT']._serialized_start=53676 + _globals['_BINDERLOCKFTRACEEVENT']._serialized_end=53712 + _globals['_BINDERLOCKEDFTRACEEVENT']._serialized_start=53714 + _globals['_BINDERLOCKEDFTRACEEVENT']._serialized_end=53752 + _globals['_BINDERUNLOCKFTRACEEVENT']._serialized_start=53754 + _globals['_BINDERUNLOCKFTRACEEVENT']._serialized_end=53792 + _globals['_BINDERTRANSACTIONALLOCBUFFTRACEEVENT']._serialized_start=53794 + _globals['_BINDERTRANSACTIONALLOCBUFFTRACEEVENT']._serialized_end=53919 + _globals['_BINDERCOMMANDFTRACEEVENT']._serialized_start=53921 + _globals['_BINDERCOMMANDFTRACEEVENT']._serialized_end=53960 + _globals['_BINDERRETURNFTRACEEVENT']._serialized_start=53962 + _globals['_BINDERRETURNFTRACEEVENT']._serialized_end=54000 + _globals['_BLOCKRQISSUEFTRACEEVENT']._serialized_start=54003 + _globals['_BLOCKRQISSUEFTRACEEVENT']._serialized_end=54132 + _globals['_BLOCKBIOBACKMERGEFTRACEEVENT']._serialized_start=54134 + _globals['_BLOCKBIOBACKMERGEFTRACEEVENT']._serialized_end=54240 + _globals['_BLOCKBIOBOUNCEFTRACEEVENT']._serialized_start=54242 + _globals['_BLOCKBIOBOUNCEFTRACEEVENT']._serialized_end=54345 + _globals['_BLOCKBIOCOMPLETEFTRACEEVENT']._serialized_start=54347 + _globals['_BLOCKBIOCOMPLETEFTRACEEVENT']._serialized_end=54453 + _globals['_BLOCKBIOFRONTMERGEFTRACEEVENT']._serialized_start=54455 + _globals['_BLOCKBIOFRONTMERGEFTRACEEVENT']._serialized_end=54562 + _globals['_BLOCKBIOQUEUEFTRACEEVENT']._serialized_start=54564 + _globals['_BLOCKBIOQUEUEFTRACEEVENT']._serialized_end=54666 + _globals['_BLOCKBIOREMAPFTRACEEVENT']._serialized_start=54668 + _globals['_BLOCKBIOREMAPFTRACEEVENT']._serialized_end=54793 + _globals['_BLOCKDIRTYBUFFERFTRACEEVENT']._serialized_start=54795 + _globals['_BLOCKDIRTYBUFFERFTRACEEVENT']._serialized_end=54867 + _globals['_BLOCKGETRQFTRACEEVENT']._serialized_start=54869 + _globals['_BLOCKGETRQFTRACEEVENT']._serialized_end=54968 + _globals['_BLOCKPLUGFTRACEEVENT']._serialized_start=54970 + _globals['_BLOCKPLUGFTRACEEVENT']._serialized_end=55006 + _globals['_BLOCKRQABORTFTRACEEVENT']._serialized_start=55008 + _globals['_BLOCKRQABORTFTRACEEVENT']._serialized_end=55124 + _globals['_BLOCKRQCOMPLETEFTRACEEVENT']._serialized_start=55127 + _globals['_BLOCKRQCOMPLETEFTRACEEVENT']._serialized_end=55261 + _globals['_BLOCKRQINSERTFTRACEEVENT']._serialized_start=55264 + _globals['_BLOCKRQINSERTFTRACEEVENT']._serialized_end=55394 + _globals['_BLOCKRQREMAPFTRACEEVENT']._serialized_start=55397 + _globals['_BLOCKRQREMAPFTRACEEVENT']._serialized_end=55538 + _globals['_BLOCKRQREQUEUEFTRACEEVENT']._serialized_start=55540 + _globals['_BLOCKRQREQUEUEFTRACEEVENT']._serialized_end=55658 + _globals['_BLOCKSLEEPRQFTRACEEVENT']._serialized_start=55660 + _globals['_BLOCKSLEEPRQFTRACEEVENT']._serialized_end=55761 + _globals['_BLOCKSPLITFTRACEEVENT']._serialized_start=55763 + _globals['_BLOCKSPLITFTRACEEVENT']._serialized_end=55863 + _globals['_BLOCKTOUCHBUFFERFTRACEEVENT']._serialized_start=55865 + _globals['_BLOCKTOUCHBUFFERFTRACEEVENT']._serialized_end=55937 + _globals['_BLOCKUNPLUGFTRACEEVENT']._serialized_start=55939 + _globals['_BLOCKUNPLUGFTRACEEVENT']._serialized_end=55992 + _globals['_BLOCKIOSTARTFTRACEEVENT']._serialized_start=55995 + _globals['_BLOCKIOSTARTFTRACEEVENT']._serialized_end=56140 + _globals['_BLOCKIODONEFTRACEEVENT']._serialized_start=56143 + _globals['_BLOCKIODONEFTRACEEVENT']._serialized_end=56287 + _globals['_CGROUPATTACHTASKFTRACEEVENT']._serialized_start=56290 + _globals['_CGROUPATTACHTASKFTRACEEVENT']._serialized_end=56432 + _globals['_CGROUPMKDIRFTRACEEVENT']._serialized_start=56434 + _globals['_CGROUPMKDIRFTRACEEVENT']._serialized_end=56528 + _globals['_CGROUPREMOUNTFTRACEEVENT']._serialized_start=56530 + _globals['_CGROUPREMOUNTFTRACEEVENT']._serialized_end=56601 + _globals['_CGROUPRMDIRFTRACEEVENT']._serialized_start=56603 + _globals['_CGROUPRMDIRFTRACEEVENT']._serialized_end=56697 + _globals['_CGROUPTRANSFERTASKSFTRACEEVENT']._serialized_start=56700 + _globals['_CGROUPTRANSFERTASKSFTRACEEVENT']._serialized_end=56845 + _globals['_CGROUPDESTROYROOTFTRACEEVENT']._serialized_start=56847 + _globals['_CGROUPDESTROYROOTFTRACEEVENT']._serialized_end=56922 + _globals['_CGROUPRELEASEFTRACEEVENT']._serialized_start=56924 + _globals['_CGROUPRELEASEFTRACEEVENT']._serialized_end=57020 + _globals['_CGROUPRENAMEFTRACEEVENT']._serialized_start=57022 + _globals['_CGROUPRENAMEFTRACEEVENT']._serialized_end=57117 + _globals['_CGROUPSETUPROOTFTRACEEVENT']._serialized_start=57119 + _globals['_CGROUPSETUPROOTFTRACEEVENT']._serialized_end=57192 + _globals['_CLKENABLEFTRACEEVENT']._serialized_start=57194 + _globals['_CLKENABLEFTRACEEVENT']._serialized_end=57230 + _globals['_CLKDISABLEFTRACEEVENT']._serialized_start=57232 + _globals['_CLKDISABLEFTRACEEVENT']._serialized_end=57269 + _globals['_CLKSETRATEFTRACEEVENT']._serialized_start=57271 + _globals['_CLKSETRATEFTRACEEVENT']._serialized_end=57322 + _globals['_CMAALLOCSTARTFTRACEEVENT']._serialized_start=57324 + _globals['_CMAALLOCSTARTFTRACEEVENT']._serialized_end=57394 + _globals['_CMAALLOCINFOFTRACEEVENT']._serialized_start=57397 + _globals['_CMAALLOCINFOFTRACEEVENT']._serialized_end=57593 + _globals['_CMAALLOCFINISHFTRACEEVENT']._serialized_start=57595 + _globals['_CMAALLOCFINISHFTRACEEVENT']._serialized_end=57710 + _globals['_MMCOMPACTIONBEGINFTRACEEVENT']._serialized_start=57712 + _globals['_MMCOMPACTIONBEGINFTRACEEVENT']._serialized_end=57833 + _globals['_MMCOMPACTIONDEFERCOMPACTIONFTRACEEVENT']._serialized_start=57836 + _globals['_MMCOMPACTIONDEFERCOMPACTIONFTRACEEVENT']._serialized_end=57980 + _globals['_MMCOMPACTIONDEFERREDFTRACEEVENT']._serialized_start=57983 + _globals['_MMCOMPACTIONDEFERREDFTRACEEVENT']._serialized_end=58120 + _globals['_MMCOMPACTIONDEFERRESETFTRACEEVENT']._serialized_start=58123 + _globals['_MMCOMPACTIONDEFERRESETFTRACEEVENT']._serialized_end=58262 + _globals['_MMCOMPACTIONENDFTRACEEVENT']._serialized_start=58265 + _globals['_MMCOMPACTIONENDFTRACEEVENT']._serialized_end=58400 + _globals['_MMCOMPACTIONFINISHEDFTRACEEVENT']._serialized_start=58402 + _globals['_MMCOMPACTIONFINISHEDFTRACEEVENT']._serialized_end=58489 + _globals['_MMCOMPACTIONISOLATEFREEPAGESFTRACEEVENT']._serialized_start=58491 + _globals['_MMCOMPACTIONISOLATEFREEPAGESFTRACEEVENT']._serialized_end=58606 + _globals['_MMCOMPACTIONISOLATEMIGRATEPAGESFTRACEEVENT']._serialized_start=58608 + _globals['_MMCOMPACTIONISOLATEMIGRATEPAGESFTRACEEVENT']._serialized_end=58726 + _globals['_MMCOMPACTIONKCOMPACTDSLEEPFTRACEEVENT']._serialized_start=58728 + _globals['_MMCOMPACTIONKCOMPACTDSLEEPFTRACEEVENT']._serialized_end=58780 + _globals['_MMCOMPACTIONKCOMPACTDWAKEFTRACEEVENT']._serialized_start=58782 + _globals['_MMCOMPACTIONKCOMPACTDWAKEFTRACEEVENT']._serialized_end=58896 + _globals['_MMCOMPACTIONMIGRATEPAGESFTRACEEVENT']._serialized_start=58898 + _globals['_MMCOMPACTIONMIGRATEPAGESFTRACEEVENT']._serialized_end=58975 + _globals['_MMCOMPACTIONSUITABLEFTRACEEVENT']._serialized_start=58977 + _globals['_MMCOMPACTIONSUITABLEFTRACEEVENT']._serialized_end=59064 + _globals['_MMCOMPACTIONTRYTOCOMPACTPAGESFTRACEEVENT']._serialized_start=59066 + _globals['_MMCOMPACTIONTRYTOCOMPACTPAGESFTRACEEVENT']._serialized_end=59169 + _globals['_MMCOMPACTIONWAKEUPKCOMPACTDFTRACEEVENT']._serialized_start=59171 + _globals['_MMCOMPACTIONWAKEUPKCOMPACTDFTRACEEVENT']._serialized_end=59287 + _globals['_PARAMSETVALUECPMFTRACEEVENT']._serialized_start=59289 + _globals['_PARAMSETVALUECPMFTRACEEVENT']._serialized_end=59366 + _globals['_CPUHPEXITFTRACEEVENT']._serialized_start=59368 + _globals['_CPUHPEXITFTRACEEVENT']._serialized_end=59444 + _globals['_CPUHPMULTIENTERFTRACEEVENT']._serialized_start=59446 + _globals['_CPUHPMULTIENTERFTRACEEVENT']._serialized_end=59529 + _globals['_CPUHPENTERFTRACEEVENT']._serialized_start=59531 + _globals['_CPUHPENTERFTRACEEVENT']._serialized_end=59609 + _globals['_CPUHPLATENCYFTRACEEVENT']._serialized_start=59611 + _globals['_CPUHPLATENCYFTRACEEVENT']._serialized_end=59691 + _globals['_CPUHPPAUSEFTRACEEVENT']._serialized_start=59693 + _globals['_CPUHPPAUSEFTRACEEVENT']._serialized_end=59780 + _globals['_CROSECSENSORHUBDATAFTRACEEVENT']._serialized_start=59783 + _globals['_CROSECSENSORHUBDATAFTRACEEVENT']._serialized_end=59953 + _globals['_DCVSHFREQFTRACEEVENT']._serialized_start=59955 + _globals['_DCVSHFREQFTRACEEVENT']._serialized_end=60004 + _globals['_DEVFREQFREQUENCYFTRACEEVENT']._serialized_start=60006 + _globals['_DEVFREQFREQUENCYFTRACEEVENT']._serialized_end=60125 + _globals['_DMAFENCEINITFTRACEEVENT']._serialized_start=60127 + _globals['_DMAFENCEINITFTRACEEVENT']._serialized_end=60218 + _globals['_DMAFENCEEMITFTRACEEVENT']._serialized_start=60220 + _globals['_DMAFENCEEMITFTRACEEVENT']._serialized_end=60311 + _globals['_DMAFENCESIGNALEDFTRACEEVENT']._serialized_start=60313 + _globals['_DMAFENCESIGNALEDFTRACEEVENT']._serialized_end=60408 + _globals['_DMAFENCEWAITSTARTFTRACEEVENT']._serialized_start=60410 + _globals['_DMAFENCEWAITSTARTFTRACEEVENT']._serialized_end=60506 + _globals['_DMAFENCEWAITENDFTRACEEVENT']._serialized_start=60508 + _globals['_DMAFENCEWAITENDFTRACEEVENT']._serialized_end=60602 + _globals['_DMAHEAPSTATFTRACEEVENT']._serialized_start=60604 + _globals['_DMAHEAPSTATFTRACEEVENT']._serialized_end=60681 + _globals['_DPUTRACINGMARKWRITEFTRACEEVENT']._serialized_start=60684 + _globals['_DPUTRACINGMARKWRITEFTRACEEVENT']._serialized_end=60813 + _globals['_DPUDSICMDFIFOSTATUSFTRACEEVENT']._serialized_start=60815 + _globals['_DPUDSICMDFIFOSTATUSFTRACEEVENT']._serialized_end=60880 + _globals['_DPUDSIRXFTRACEEVENT']._serialized_start=60882 + _globals['_DPUDSIRXFTRACEEVENT']._serialized_end=60932 + _globals['_DPUDSITXFTRACEEVENT']._serialized_start=60934 + _globals['_DPUDSITXFTRACEEVENT']._serialized_end=61017 + _globals['_DPUDISPDPUUNDERRUNFTRACEEVENT']._serialized_start=61019 + _globals['_DPUDISPDPUUNDERRUNFTRACEEVENT']._serialized_end=61107 + _globals['_DPUDISPVBLANKIRQENABLEFTRACEEVENT']._serialized_start=61109 + _globals['_DPUDISPVBLANKIRQENABLEFTRACEEVENT']._serialized_end=61191 + _globals['_DPUDISPFRAMEDONETIMEOUTFTRACEEVENT']._serialized_start=61194 + _globals['_DPUDISPFRAMEDONETIMEOUTFTRACEEVENT']._serialized_end=61335 + _globals['_DPUDISPFRAMESTARTTIMEOUTFTRACEEVENT']._serialized_start=61337 + _globals['_DPUDISPFRAMESTARTTIMEOUTFTRACEEVENT']._serialized_end=61455 + _globals['_DPUDISPFRAMEDONEMISSINGFTRACEEVENT']._serialized_start=61457 + _globals['_DPUDISPFRAMEDONEMISSINGFTRACEEVENT']._serialized_end=61574 + _globals['_DPUDISPFRAMESTARTMISSINGFTRACEEVENT']._serialized_start=61576 + _globals['_DPUDISPFRAMESTARTMISSINGFTRACEEVENT']._serialized_end=61694 + _globals['_DPUDISPDPULINEUNDERRUNFTRACEEVENT']._serialized_start=61696 + _globals['_DPUDISPDPULINEUNDERRUNFTRACEEVENT']._serialized_end=61788 + _globals['_DRMVBLANKEVENTFTRACEEVENT']._serialized_start=61790 + _globals['_DRMVBLANKEVENTFTRACEEVENT']._serialized_end=61877 + _globals['_DRMVBLANKEVENTDELIVEREDFTRACEEVENT']._serialized_start=61879 + _globals['_DRMVBLANKEVENTDELIVEREDFTRACEEVENT']._serialized_end=61956 + _globals['_DWC3ALLOCREQUESTFTRACEEVENT']._serialized_start=61959 + _globals['_DWC3ALLOCREQUESTFTRACEEVENT']._serialized_end=62121 + _globals['_DWC3COMPLETETRBFTRACEEVENT']._serialized_start=62124 + _globals['_DWC3COMPLETETRBFTRACEEVENT']._serialized_end=62316 + _globals['_DWC3CTRLREQFTRACEEVENT']._serialized_start=62318 + _globals['_DWC3CTRLREQFTRACEEVENT']._serialized_end=62444 + _globals['_DWC3EPDEQUEUEFTRACEEVENT']._serialized_start=62447 + _globals['_DWC3EPDEQUEUEFTRACEEVENT']._serialized_end=62606 + _globals['_DWC3EPQUEUEFTRACEEVENT']._serialized_start=62609 + _globals['_DWC3EPQUEUEFTRACEEVENT']._serialized_end=62766 + _globals['_DWC3EVENTFTRACEEVENT']._serialized_start=62768 + _globals['_DWC3EVENTFTRACEEVENT']._serialized_end=62836 + _globals['_DWC3FREEREQUESTFTRACEEVENT']._serialized_start=62839 + _globals['_DWC3FREEREQUESTFTRACEEVENT']._serialized_end=63000 + _globals['_DWC3GADGETEPCMDFTRACEEVENT']._serialized_start=63002 + _globals['_DWC3GADGETEPCMDFTRACEEVENT']._serialized_end=63125 + _globals['_DWC3GADGETEPDISABLEFTRACEEVENT']._serialized_start=63128 + _globals['_DWC3GADGETEPDISABLEFTRACEEVENT']._serialized_end=63333 + _globals['_DWC3GADGETEPENABLEFTRACEEVENT']._serialized_start=63336 + _globals['_DWC3GADGETEPENABLEFTRACEEVENT']._serialized_end=63540 + _globals['_DWC3GADGETGENERICCMDFTRACEEVENT']._serialized_start=63542 + _globals['_DWC3GADGETGENERICCMDFTRACEEVENT']._serialized_end=63619 + _globals['_DWC3GADGETGIVEBACKFTRACEEVENT']._serialized_start=63622 + _globals['_DWC3GADGETGIVEBACKFTRACEEVENT']._serialized_end=63786 + _globals['_DWC3PREPARETRBFTRACEEVENT']._serialized_start=63789 + _globals['_DWC3PREPARETRBFTRACEEVENT']._serialized_end=63980 + _globals['_DWC3READLFTRACEEVENT']._serialized_start=63982 + _globals['_DWC3READLFTRACEEVENT']._serialized_end=64062 + _globals['_DWC3WRITELFTRACEEVENT']._serialized_start=64064 + _globals['_DWC3WRITELFTRACEEVENT']._serialized_end=64145 + _globals['_EXT4DAWRITEBEGINFTRACEEVENT']._serialized_start=64147 + _globals['_EXT4DAWRITEBEGINFTRACEEVENT']._serialized_end=64243 + _globals['_EXT4DAWRITEENDFTRACEEVENT']._serialized_start=64245 + _globals['_EXT4DAWRITEENDFTRACEEVENT']._serialized_end=64340 + _globals['_EXT4SYNCFILEENTERFTRACEEVENT']._serialized_start=64342 + _globals['_EXT4SYNCFILEENTERFTRACEEVENT']._serialized_end=64432 + _globals['_EXT4SYNCFILEEXITFTRACEEVENT']._serialized_start=64434 + _globals['_EXT4SYNCFILEEXITFTRACEEVENT']._serialized_end=64502 + _globals['_EXT4ALLOCDABLOCKSFTRACEEVENT']._serialized_start=64504 + _globals['_EXT4ALLOCDABLOCKSFTRACEEVENT']._serialized_end=64602 + _globals['_EXT4ALLOCATEBLOCKSFTRACEEVENT']._serialized_start=64605 + _globals['_EXT4ALLOCATEBLOCKSFTRACEEVENT']._serialized_end=64798 + _globals['_EXT4ALLOCATEINODEFTRACEEVENT']._serialized_start=64800 + _globals['_EXT4ALLOCATEINODEFTRACEEVENT']._serialized_end=64883 + _globals['_EXT4BEGINORDEREDTRUNCATEFTRACEEVENT']._serialized_start=64885 + _globals['_EXT4BEGINORDEREDTRUNCATEFTRACEEVENT']._serialized_end=64966 + _globals['_EXT4COLLAPSERANGEFTRACEEVENT']._serialized_start=64968 + _globals['_EXT4COLLAPSERANGEFTRACEEVENT']._serialized_end=65053 + _globals['_EXT4DARELEASESPACEFTRACEEVENT']._serialized_start=65056 + _globals['_EXT4DARELEASESPACEFTRACEEVENT']._serialized_end=65258 + _globals['_EXT4DARESERVESPACEFTRACEEVENT']._serialized_start=65261 + _globals['_EXT4DARESERVESPACEFTRACEEVENT']._serialized_end=65429 + _globals['_EXT4DAUPDATERESERVESPACEFTRACEEVENT']._serialized_start=65432 + _globals['_EXT4DAUPDATERESERVESPACEFTRACEEVENT']._serialized_end=65660 + _globals['_EXT4DAWRITEPAGESFTRACEEVENT']._serialized_start=65663 + _globals['_EXT4DAWRITEPAGESFTRACEEVENT']._serialized_end=65870 + _globals['_EXT4DAWRITEPAGESEXTENTFTRACEEVENT']._serialized_start=65872 + _globals['_EXT4DAWRITEPAGESEXTENTFTRACEEVENT']._serialized_end=65975 + _globals['_EXT4DIRECTIOENTERFTRACEEVENT']._serialized_start=65977 + _globals['_EXT4DIRECTIOENTERFTRACEEVENT']._serialized_end=66071 + _globals['_EXT4DIRECTIOEXITFTRACEEVENT']._serialized_start=66073 + _globals['_EXT4DIRECTIOEXITFTRACEEVENT']._serialized_end=66179 + _globals['_EXT4DISCARDBLOCKSFTRACEEVENT']._serialized_start=66181 + _globals['_EXT4DISCARDBLOCKSFTRACEEVENT']._serialized_end=66252 + _globals['_EXT4DISCARDPREALLOCATIONSFTRACEEVENT']._serialized_start=66254 + _globals['_EXT4DISCARDPREALLOCATIONSFTRACEEVENT']._serialized_end=66347 + _globals['_EXT4DROPINODEFTRACEEVENT']._serialized_start=66349 + _globals['_EXT4DROPINODEFTRACEEVENT']._serialized_end=66415 + _globals['_EXT4ESCACHEEXTENTFTRACEEVENT']._serialized_start=66417 + _globals['_EXT4ESCACHEEXTENTFTRACEEVENT']._serialized_end=66530 + _globals['_EXT4ESFINDDELAYEDEXTENTRANGEENTERFTRACEEVENT']._serialized_start=66532 + _globals['_EXT4ESFINDDELAYEDEXTENTRANGEENTERFTRACEEVENT']._serialized_end=66618 + _globals['_EXT4ESFINDDELAYEDEXTENTRANGEEXITFTRACEEVENT']._serialized_start=66621 + _globals['_EXT4ESFINDDELAYEDEXTENTRANGEEXITFTRACEEVENT']._serialized_end=66749 + _globals['_EXT4ESINSERTEXTENTFTRACEEVENT']._serialized_start=66751 + _globals['_EXT4ESINSERTEXTENTFTRACEEVENT']._serialized_end=66865 + _globals['_EXT4ESLOOKUPEXTENTENTERFTRACEEVENT']._serialized_start=66867 + _globals['_EXT4ESLOOKUPEXTENTENTERFTRACEEVENT']._serialized_end=66943 + _globals['_EXT4ESLOOKUPEXTENTEXITFTRACEEVENT']._serialized_start=66946 + _globals['_EXT4ESLOOKUPEXTENTEXITFTRACEEVENT']._serialized_end=67079 + _globals['_EXT4ESREMOVEEXTENTFTRACEEVENT']._serialized_start=67081 + _globals['_EXT4ESREMOVEEXTENTFTRACEEVENT']._serialized_end=67165 + _globals['_EXT4ESSHRINKFTRACEEVENT']._serialized_start=67167 + _globals['_EXT4ESSHRINKFTRACEEVENT']._serialized_end=67280 + _globals['_EXT4ESSHRINKCOUNTFTRACEEVENT']._serialized_start=67282 + _globals['_EXT4ESSHRINKCOUNTFTRACEEVENT']._serialized_end=67364 + _globals['_EXT4ESSHRINKSCANENTERFTRACEEVENT']._serialized_start=67366 + _globals['_EXT4ESSHRINKSCANENTERFTRACEEVENT']._serialized_end=67452 + _globals['_EXT4ESSHRINKSCANEXITFTRACEEVENT']._serialized_start=67454 + _globals['_EXT4ESSHRINKSCANEXITFTRACEEVENT']._serialized_end=67538 + _globals['_EXT4EVICTINODEFTRACEEVENT']._serialized_start=67540 + _globals['_EXT4EVICTINODEFTRACEEVENT']._serialized_end=67608 + _globals['_EXT4EXTCONVERTTOINITIALIZEDENTERFTRACEEVENT']._serialized_start=67611 + _globals['_EXT4EXTCONVERTTOINITIALIZEDENTERFTRACEEVENT']._serialized_end=67760 + _globals['_EXT4EXTCONVERTTOINITIALIZEDFASTPATHFTRACEEVENT']._serialized_start=67763 + _globals['_EXT4EXTCONVERTTOINITIALIZEDFASTPATHFTRACEEVENT']._serialized_end=67962 + _globals['_EXT4EXTHANDLEUNWRITTENEXTENTSFTRACEEVENT']._serialized_start=67965 + _globals['_EXT4EXTHANDLEUNWRITTENEXTENTSFTRACEEVENT']._serialized_end=68124 + _globals['_EXT4EXTINCACHEFTRACEEVENT']._serialized_start=68126 + _globals['_EXT4EXTINCACHEFTRACEEVENT']._serialized_end=68206 + _globals['_EXT4EXTLOADEXTENTFTRACEEVENT']._serialized_start=68208 + _globals['_EXT4EXTLOADEXTENTFTRACEEVENT']._serialized_end=68292 + _globals['_EXT4EXTMAPBLOCKSENTERFTRACEEVENT']._serialized_start=68294 + _globals['_EXT4EXTMAPBLOCKSENTERFTRACEEVENT']._serialized_end=68396 + _globals['_EXT4EXTMAPBLOCKSEXITFTRACEEVENT']._serialized_start=68399 + _globals['_EXT4EXTMAPBLOCKSEXITFTRACEEVENT']._serialized_end=68543 + _globals['_EXT4EXTPUTINCACHEFTRACEEVENT']._serialized_start=68545 + _globals['_EXT4EXTPUTINCACHEFTRACEEVENT']._serialized_end=68643 + _globals['_EXT4EXTREMOVESPACEFTRACEEVENT']._serialized_start=68645 + _globals['_EXT4EXTREMOVESPACEFTRACEEVENT']._serialized_end=68745 + _globals['_EXT4EXTREMOVESPACEDONEFTRACEEVENT']._serialized_start=68748 + _globals['_EXT4EXTREMOVESPACEDONEFTRACEEVENT']._serialized_end=68941 + _globals['_EXT4EXTRMIDXFTRACEEVENT']._serialized_start=68943 + _globals['_EXT4EXTRMIDXFTRACEEVENT']._serialized_end=69008 + _globals['_EXT4EXTRMLEAFFTRACEEVENT']._serialized_start=69011 + _globals['_EXT4EXTRMLEAFFTRACEEVENT']._serialized_end=69197 + _globals['_EXT4EXTSHOWEXTENTFTRACEEVENT']._serialized_start=69199 + _globals['_EXT4EXTSHOWEXTENTFTRACEEVENT']._serialized_end=69296 + _globals['_EXT4FALLOCATEENTERFTRACEEVENT']._serialized_start=69298 + _globals['_EXT4FALLOCATEENTERFTRACEEVENT']._serialized_end=69411 + _globals['_EXT4FALLOCATEEXITFTRACEEVENT']._serialized_start=69413 + _globals['_EXT4FALLOCATEEXITFTRACEEVENT']._serialized_end=69511 + _globals['_EXT4FINDDELALLOCRANGEFTRACEEVENT']._serialized_start=69514 + _globals['_EXT4FINDDELALLOCRANGEFTRACEEVENT']._serialized_end=69651 + _globals['_EXT4FORGETFTRACEEVENT']._serialized_start=69653 + _globals['_EXT4FORGETFTRACEEVENT']._serialized_end=69752 + _globals['_EXT4FREEBLOCKSFTRACEEVENT']._serialized_start=69754 + _globals['_EXT4FREEBLOCKSFTRACEEVENT']._serialized_end=69866 + _globals['_EXT4FREEINODEFTRACEEVENT']._serialized_start=69868 + _globals['_EXT4FREEINODEFTRACEEVENT']._serialized_end=69976 + _globals['_EXT4GETIMPLIEDCLUSTERALLOCEXITFTRACEEVENT']._serialized_start=69978 + _globals['_EXT4GETIMPLIEDCLUSTERALLOCEXITFTRACEEVENT']._serialized_end=70103 + _globals['_EXT4GETRESERVEDCLUSTERALLOCFTRACEEVENT']._serialized_start=70105 + _globals['_EXT4GETRESERVEDCLUSTERALLOCFTRACEEVENT']._serialized_end=70198 + _globals['_EXT4INDMAPBLOCKSENTERFTRACEEVENT']._serialized_start=70200 + _globals['_EXT4INDMAPBLOCKSENTERFTRACEEVENT']._serialized_end=70302 + _globals['_EXT4INDMAPBLOCKSEXITFTRACEEVENT']._serialized_start=70305 + _globals['_EXT4INDMAPBLOCKSEXITFTRACEEVENT']._serialized_end=70449 + _globals['_EXT4INSERTRANGEFTRACEEVENT']._serialized_start=70451 + _globals['_EXT4INSERTRANGEFTRACEEVENT']._serialized_end=70534 + _globals['_EXT4INVALIDATEPAGEFTRACEEVENT']._serialized_start=70536 + _globals['_EXT4INVALIDATEPAGEFTRACEEVENT']._serialized_end=70640 + _globals['_EXT4JOURNALSTARTFTRACEEVENT']._serialized_start=70643 + _globals['_EXT4JOURNALSTARTFTRACEEVENT']._serialized_end=70772 + _globals['_EXT4JOURNALSTARTRESERVEDFTRACEEVENT']._serialized_start=70774 + _globals['_EXT4JOURNALSTARTRESERVEDFTRACEEVENT']._serialized_end=70852 + _globals['_EXT4JOURNALLEDINVALIDATEPAGEFTRACEEVENT']._serialized_start=70854 + _globals['_EXT4JOURNALLEDINVALIDATEPAGEFTRACEEVENT']._serialized_end=70968 + _globals['_EXT4JOURNALLEDWRITEENDFTRACEEVENT']._serialized_start=70970 + _globals['_EXT4JOURNALLEDWRITEENDFTRACEEVENT']._serialized_end=71073 + _globals['_EXT4LOADINODEFTRACEEVENT']._serialized_start=71075 + _globals['_EXT4LOADINODEFTRACEEVENT']._serialized_end=71127 + _globals['_EXT4LOADINODEBITMAPFTRACEEVENT']._serialized_start=71129 + _globals['_EXT4LOADINODEBITMAPFTRACEEVENT']._serialized_end=71189 + _globals['_EXT4MARKINODEDIRTYFTRACEEVENT']._serialized_start=71191 + _globals['_EXT4MARKINODEDIRTYFTRACEEVENT']._serialized_end=71260 + _globals['_EXT4MBBITMAPLOADFTRACEEVENT']._serialized_start=71262 + _globals['_EXT4MBBITMAPLOADFTRACEEVENT']._serialized_end=71319 + _globals['_EXT4MBBUDDYBITMAPLOADFTRACEEVENT']._serialized_start=71321 + _globals['_EXT4MBBUDDYBITMAPLOADFTRACEEVENT']._serialized_end=71383 + _globals['_EXT4MBDISCARDPREALLOCATIONSFTRACEEVENT']._serialized_start=71385 + _globals['_EXT4MBDISCARDPREALLOCATIONSFTRACEEVENT']._serialized_end=71454 + _globals['_EXT4MBNEWGROUPPAFTRACEEVENT']._serialized_start=71456 + _globals['_EXT4MBNEWGROUPPAFTRACEEVENT']._serialized_end=71565 + _globals['_EXT4MBNEWINODEPAFTRACEEVENT']._serialized_start=71567 + _globals['_EXT4MBNEWINODEPAFTRACEEVENT']._serialized_end=71676 + _globals['_EXT4MBRELEASEGROUPPAFTRACEEVENT']._serialized_start=71678 + _globals['_EXT4MBRELEASEGROUPPAFTRACEEVENT']._serialized_end=71759 + _globals['_EXT4MBRELEASEINODEPAFTRACEEVENT']._serialized_start=71761 + _globals['_EXT4MBRELEASEINODEPAFTRACEEVENT']._serialized_end=71850 + _globals['_EXT4MBALLOCALLOCFTRACEEVENT']._serialized_start=71853 + _globals['_EXT4MBALLOCALLOCFTRACEEVENT']._serialized_end=72243 + _globals['_EXT4MBALLOCDISCARDFTRACEEVENT']._serialized_start=72245 + _globals['_EXT4MBALLOCDISCARDFTRACEEVENT']._serialized_end=72366 + _globals['_EXT4MBALLOCFREEFTRACEEVENT']._serialized_start=72368 + _globals['_EXT4MBALLOCFREEFTRACEEVENT']._serialized_end=72486 + _globals['_EXT4MBALLOCPREALLOCFTRACEEVENT']._serialized_start=72489 + _globals['_EXT4MBALLOCPREALLOCFTRACEEVENT']._serialized_end=72715 + _globals['_EXT4OTHERINODEUPDATETIMEFTRACEEVENT']._serialized_start=72717 + _globals['_EXT4OTHERINODEUPDATETIMEFTRACEEVENT']._serialized_end=72838 + _globals['_EXT4PUNCHHOLEFTRACEEVENT']._serialized_start=72840 + _globals['_EXT4PUNCHHOLEFTRACEEVENT']._serialized_end=72935 + _globals['_EXT4READBLOCKBITMAPLOADFTRACEEVENT']._serialized_start=72937 + _globals['_EXT4READBLOCKBITMAPLOADFTRACEEVENT']._serialized_end=73019 + _globals['_EXT4READPAGEFTRACEEVENT']._serialized_start=73021 + _globals['_EXT4READPAGEFTRACEEVENT']._serialized_end=73087 + _globals['_EXT4RELEASEPAGEFTRACEEVENT']._serialized_start=73089 + _globals['_EXT4RELEASEPAGEFTRACEEVENT']._serialized_end=73158 + _globals['_EXT4REMOVEBLOCKSFTRACEEVENT']._serialized_start=73161 + _globals['_EXT4REMOVEBLOCKSFTRACEEVENT']._serialized_end=73361 + _globals['_EXT4REQUESTBLOCKSFTRACEEVENT']._serialized_start=73364 + _globals['_EXT4REQUESTBLOCKSFTRACEEVENT']._serialized_end=73541 + _globals['_EXT4REQUESTINODEFTRACEEVENT']._serialized_start=73543 + _globals['_EXT4REQUESTINODEFTRACEEVENT']._serialized_end=73612 + _globals['_EXT4SYNCFSFTRACEEVENT']._serialized_start=73614 + _globals['_EXT4SYNCFSFTRACEEVENT']._serialized_end=73664 + _globals['_EXT4TRIMALLFREEFTRACEEVENT']._serialized_start=73666 + _globals['_EXT4TRIMALLFREEFTRACEEVENT']._serialized_end=73775 + _globals['_EXT4TRIMEXTENTFTRACEEVENT']._serialized_start=73777 + _globals['_EXT4TRIMEXTENTFTRACEEVENT']._serialized_end=73885 + _globals['_EXT4TRUNCATEENTERFTRACEEVENT']._serialized_start=73887 + _globals['_EXT4TRUNCATEENTERFTRACEEVENT']._serialized_end=73959 + _globals['_EXT4TRUNCATEEXITFTRACEEVENT']._serialized_start=73961 + _globals['_EXT4TRUNCATEEXITFTRACEEVENT']._serialized_end=74032 + _globals['_EXT4UNLINKENTERFTRACEEVENT']._serialized_start=74034 + _globals['_EXT4UNLINKENTERFTRACEEVENT']._serialized_end=74118 + _globals['_EXT4UNLINKEXITFTRACEEVENT']._serialized_start=74120 + _globals['_EXT4UNLINKEXITFTRACEEVENT']._serialized_end=74186 + _globals['_EXT4WRITEBEGINFTRACEEVENT']._serialized_start=74188 + _globals['_EXT4WRITEBEGINFTRACEEVENT']._serialized_end=74282 + _globals['_EXT4WRITEENDFTRACEEVENT']._serialized_start=74284 + _globals['_EXT4WRITEENDFTRACEEVENT']._serialized_end=74377 + _globals['_EXT4WRITEPAGEFTRACEEVENT']._serialized_start=74379 + _globals['_EXT4WRITEPAGEFTRACEEVENT']._serialized_end=74446 + _globals['_EXT4WRITEPAGESFTRACEEVENT']._serialized_start=74449 + _globals['_EXT4WRITEPAGESFTRACEEVENT']._serialized_end=74673 + _globals['_EXT4WRITEPAGESRESULTFTRACEEVENT']._serialized_start=74676 + _globals['_EXT4WRITEPAGESRESULTFTRACEEVENT']._serialized_end=74838 + _globals['_EXT4ZERORANGEFTRACEEVENT']._serialized_start=74840 + _globals['_EXT4ZERORANGEFTRACEEVENT']._serialized_end=74935 + _globals['_F2FSDOSUBMITBIOFTRACEEVENT']._serialized_start=74937 + _globals['_F2FSDOSUBMITBIOFTRACEEVENT']._serialized_end=75037 + _globals['_F2FSEVICTINODEFTRACEEVENT']._serialized_start=75040 + _globals['_F2FSEVICTINODEFTRACEEVENT']._serialized_end=75182 + _globals['_F2FSFALLOCATEFTRACEEVENT']._serialized_start=75185 + _globals['_F2FSFALLOCATEFTRACEEVENT']._serialized_end=75323 + _globals['_F2FSGETDATABLOCKFTRACEEVENT']._serialized_start=75325 + _globals['_F2FSGETDATABLOCKFTRACEEVENT']._serialized_end=75444 + _globals['_F2FSGETVICTIMFTRACEEVENT']._serialized_start=75447 + _globals['_F2FSGETVICTIMFTRACEEVENT']._serialized_end=75653 + _globals['_F2FSIGETFTRACEEVENT']._serialized_start=75656 + _globals['_F2FSIGETFTRACEEVENT']._serialized_end=75792 + _globals['_F2FSIGETEXITFTRACEEVENT']._serialized_start=75794 + _globals['_F2FSIGETEXITFTRACEEVENT']._serialized_end=75858 + _globals['_F2FSNEWINODEFTRACEEVENT']._serialized_start=75860 + _globals['_F2FSNEWINODEFTRACEEVENT']._serialized_end=75924 + _globals['_F2FSREADPAGEFTRACEEVENT']._serialized_start=75927 + _globals['_F2FSREADPAGEFTRACEEVENT']._serialized_end=76070 + _globals['_F2FSRESERVENEWBLOCKFTRACEEVENT']._serialized_start=76072 + _globals['_F2FSRESERVENEWBLOCKFTRACEEVENT']._serialized_end=76151 + _globals['_F2FSSETPAGEDIRTYFTRACEEVENT']._serialized_start=76154 + _globals['_F2FSSETPAGEDIRTYFTRACEEVENT']._serialized_end=76284 + _globals['_F2FSSUBMITWRITEPAGEFTRACEEVENT']._serialized_start=76286 + _globals['_F2FSSUBMITWRITEPAGEFTRACEEVENT']._serialized_end=76388 + _globals['_F2FSSYNCFILEENTERFTRACEEVENT']._serialized_start=76391 + _globals['_F2FSSYNCFILEENTERFTRACEEVENT']._serialized_end=76536 + _globals['_F2FSSYNCFILEEXITFTRACEEVENT']._serialized_start=76538 + _globals['_F2FSSYNCFILEEXITFTRACEEVENT']._serialized_end=76660 + _globals['_F2FSSYNCFSFTRACEEVENT']._serialized_start=76662 + _globals['_F2FSSYNCFSFTRACEEVENT']._serialized_end=76727 + _globals['_F2FSTRUNCATEFTRACEEVENT']._serialized_start=76730 + _globals['_F2FSTRUNCATEFTRACEEVENT']._serialized_end=76870 + _globals['_F2FSTRUNCATEBLOCKSENTERFTRACEEVENT']._serialized_start=76872 + _globals['_F2FSTRUNCATEBLOCKSENTERFTRACEEVENT']._serialized_end=76978 + _globals['_F2FSTRUNCATEBLOCKSEXITFTRACEEVENT']._serialized_start=76980 + _globals['_F2FSTRUNCATEBLOCKSEXITFTRACEEVENT']._serialized_end=77054 + _globals['_F2FSTRUNCATEDATABLOCKSRANGEFTRACEEVENT']._serialized_start=77056 + _globals['_F2FSTRUNCATEDATABLOCKSRANGEFTRACEEVENT']._serialized_end=77162 + _globals['_F2FSTRUNCATEINODEBLOCKSENTERFTRACEEVENT']._serialized_start=77164 + _globals['_F2FSTRUNCATEINODEBLOCKSENTERFTRACEEVENT']._serialized_end=77275 + _globals['_F2FSTRUNCATEINODEBLOCKSEXITFTRACEEVENT']._serialized_start=77277 + _globals['_F2FSTRUNCATEINODEBLOCKSEXITFTRACEEVENT']._serialized_end=77356 + _globals['_F2FSTRUNCATENODEFTRACEEVENT']._serialized_start=77358 + _globals['_F2FSTRUNCATENODEFTRACEEVENT']._serialized_end=77444 + _globals['_F2FSTRUNCATENODESENTERFTRACEEVENT']._serialized_start=77446 + _globals['_F2FSTRUNCATENODESENTERFTRACEEVENT']._serialized_end=77538 + _globals['_F2FSTRUNCATENODESEXITFTRACEEVENT']._serialized_start=77540 + _globals['_F2FSTRUNCATENODESEXITFTRACEEVENT']._serialized_end=77613 + _globals['_F2FSTRUNCATEPARTIALNODESFTRACEEVENT']._serialized_start=77615 + _globals['_F2FSTRUNCATEPARTIALNODESFTRACEEVENT']._serialized_end=77719 + _globals['_F2FSUNLINKENTERFTRACEEVENT']._serialized_start=77721 + _globals['_F2FSUNLINKENTERFTRACEEVENT']._serialized_end=77819 + _globals['_F2FSUNLINKEXITFTRACEEVENT']._serialized_start=77821 + _globals['_F2FSUNLINKEXITFTRACEEVENT']._serialized_end=77887 + _globals['_F2FSVMPAGEMKWRITEFTRACEEVENT']._serialized_start=77890 + _globals['_F2FSVMPAGEMKWRITEFTRACEEVENT']._serialized_end=78021 + _globals['_F2FSWRITEBEGINFTRACEEVENT']._serialized_start=78023 + _globals['_F2FSWRITEBEGINFTRACEEVENT']._serialized_end=78117 + _globals['_F2FSWRITECHECKPOINTFTRACEEVENT']._serialized_start=78119 + _globals['_F2FSWRITECHECKPOINTFTRACEEVENT']._serialized_end=78227 + _globals['_F2FSWRITEENDFTRACEEVENT']._serialized_start=78229 + _globals['_F2FSWRITEENDFTRACEEVENT']._serialized_end=78322 + _globals['_F2FSIOSTATFTRACEEVENT']._serialized_start=78325 + _globals['_F2FSIOSTATFTRACEEVENT']._serialized_end=78750 + _globals['_F2FSIOSTATLATENCYFTRACEEVENT']._serialized_start=78753 + _globals['_F2FSIOSTATLATENCYFTRACEEVENT']._serialized_end=79336 + _globals['_F2FSBACKGROUNDGCFTRACEEVENT']._serialized_start=79338 + _globals['_F2FSBACKGROUNDGCFTRACEEVENT']._serialized_end=79428 + _globals['_F2FSGCBEGINFTRACEEVENT']._serialized_start=79431 + _globals['_F2FSGCBEGINFTRACEEVENT']._serialized_end=79701 + _globals['_F2FSGCENDFTRACEEVENT']._serialized_start=79704 + _globals['_F2FSGCENDFTRACEEVENT']._serialized_end=79932 + _globals['_F2FSLOCKELAPSEDTIMEFTRACEEVENT']._serialized_start=79935 + _globals['_F2FSLOCKELAPSEDTIMEFTRACEEVENT']._serialized_end=80209 + _globals['_FASTRPCDMASTATFTRACEEVENT']._serialized_start=80211 + _globals['_FASTRPCDMASTATFTRACEEVENT']._serialized_end=80289 + _globals['_FASTRPCDMAFREEFTRACEEVENT']._serialized_start=80291 + _globals['_FASTRPCDMAFREEFTRACEEVENT']._serialized_end=80359 + _globals['_FASTRPCDMAALLOCFTRACEEVENT']._serialized_start=80361 + _globals['_FASTRPCDMAALLOCFTRACEEVENT']._serialized_end=80460 + _globals['_FASTRPCDMAUNMAPFTRACEEVENT']._serialized_start=80462 + _globals['_FASTRPCDMAUNMAPFTRACEEVENT']._serialized_end=80531 + _globals['_FASTRPCDMAMAPFTRACEEVENT']._serialized_start=80533 + _globals['_FASTRPCDMAMAPFTRACEEVENT']._serialized_end=80655 + _globals['_FENCEINITFTRACEEVENT']._serialized_start=80657 + _globals['_FENCEINITFTRACEEVENT']._serialized_end=80745 + _globals['_FENCEDESTROYFTRACEEVENT']._serialized_start=80747 + _globals['_FENCEDESTROYFTRACEEVENT']._serialized_end=80838 + _globals['_FENCEENABLESIGNALFTRACEEVENT']._serialized_start=80840 + _globals['_FENCEENABLESIGNALFTRACEEVENT']._serialized_end=80936 + _globals['_FENCESIGNALEDFTRACEEVENT']._serialized_start=80938 + _globals['_FENCESIGNALEDFTRACEEVENT']._serialized_end=81030 + _globals['_MMFILEMAPADDTOPAGECACHEFTRACEEVENT']._serialized_start=81032 + _globals['_MMFILEMAPADDTOPAGECACHEFTRACEEVENT']._serialized_end=81140 + _globals['_MMFILEMAPDELETEFROMPAGECACHEFTRACEEVENT']._serialized_start=81142 + _globals['_MMFILEMAPDELETEFROMPAGECACHEFTRACEEVENT']._serialized_end=81255 + _globals['_DOSYSOPENFTRACEEVENT']._serialized_start=81257 + _globals['_DOSYSOPENFTRACEEVENT']._serialized_end=81326 + _globals['_OPENEXECFTRACEEVENT']._serialized_start=81328 + _globals['_OPENEXECFTRACEEVENT']._serialized_end=81367 + _globals['_PRINTFTRACEEVENT']._serialized_start=81369 + _globals['_PRINTFTRACEEVENT']._serialized_end=81412 + _globals['_FUNCGRAPHENTRYFTRACEEVENT']._serialized_start=81414 + _globals['_FUNCGRAPHENTRYFTRACEEVENT']._serialized_end=81470 + _globals['_FUNCGRAPHEXITFTRACEEVENT']._serialized_start=81472 + _globals['_FUNCGRAPHEXITFTRACEEVENT']._serialized_end=81579 + _globals['_FWTPPERFETTOCOUNTERFTRACEEVENT']._serialized_start=81581 + _globals['_FWTPPERFETTOCOUNTERFTRACEEVENT']._serialized_end=81697 + _globals['_FWTPPERFETTOSLICEFTRACEEVENT']._serialized_start=81699 + _globals['_FWTPPERFETTOSLICEFTRACEEVENT']._serialized_end=81813 + _globals['_G2DTRACINGMARKWRITEFTRACEEVENT']._serialized_start=81815 + _globals['_G2DTRACINGMARKWRITEFTRACEEVENT']._serialized_end=81903 + _globals['_GENERICFTRACEEVENT']._serialized_start=81906 + _globals['_GENERICFTRACEEVENT']._serialized_end=82100 + _globals['_GENERICFTRACEEVENT_FIELD']._serialized_start=82006 + _globals['_GENERICFTRACEEVENT_FIELD']._serialized_end=82100 + _globals['_KPROBEEVENT']._serialized_start=82103 + _globals['_KPROBEEVENT']._serialized_end=82293 + _globals['_KPROBEEVENT_KPROBETYPE']._serialized_start=82187 + _globals['_KPROBEEVENT_KPROBETYPE']._serialized_end=82293 + _globals['_GOOGLEICCEVENTFTRACEEVENT']._serialized_start=82295 + _globals['_GOOGLEICCEVENTFTRACEEVENT']._serialized_end=82356 + _globals['_GOOGLEIRMEVENTFTRACEEVENT']._serialized_start=82358 + _globals['_GOOGLEIRMEVENTFTRACEEVENT']._serialized_end=82419 + _globals['_GPUMEMTOTALFTRACEEVENT']._serialized_start=82421 + _globals['_GPUMEMTOTALFTRACEEVENT']._serialized_end=82488 + _globals['_DRMSCHEDJOBFTRACEEVENT']._serialized_start=82490 + _globals['_DRMSCHEDJOBFTRACEEVENT']._serialized_end=82612 + _globals['_DRMRUNJOBFTRACEEVENT']._serialized_start=82614 + _globals['_DRMRUNJOBFTRACEEVENT']._serialized_end=82734 + _globals['_DRMSCHEDPROCESSJOBFTRACEEVENT']._serialized_start=82736 + _globals['_DRMSCHEDPROCESSJOBFTRACEEVENT']._serialized_end=82782 + _globals['_DRMSCHEDJOBADDDEPFTRACEEVENT']._serialized_start=82784 + _globals['_DRMSCHEDJOBADDDEPFTRACEEVENT']._serialized_end=82886 + _globals['_DRMSCHEDJOBDONEFTRACEEVENT']._serialized_start=82888 + _globals['_DRMSCHEDJOBDONEFTRACEEVENT']._serialized_end=82960 + _globals['_DRMSCHEDJOBQUEUEFTRACEEVENT']._serialized_start=82963 + _globals['_DRMSCHEDJOBQUEUEFTRACEEVENT']._serialized_end=83123 + _globals['_DRMSCHEDJOBRUNFTRACEEVENT']._serialized_start=83126 + _globals['_DRMSCHEDJOBRUNFTRACEEVENT']._serialized_end=83284 + _globals['_DRMSCHEDJOBUNSCHEDULABLEFTRACEEVENT']._serialized_start=83286 + _globals['_DRMSCHEDJOBUNSCHEDULABLEFTRACEEVENT']._serialized_end=83395 + _globals['_HYPENTERFTRACEEVENT']._serialized_start=83397 + _globals['_HYPENTERFTRACEEVENT']._serialized_end=83418 + _globals['_HYPEXITFTRACEEVENT']._serialized_start=83420 + _globals['_HYPEXITFTRACEEVENT']._serialized_end=83440 + _globals['_HOSTHCALLFTRACEEVENT']._serialized_start=83442 + _globals['_HOSTHCALLFTRACEEVENT']._serialized_end=83493 + _globals['_HOSTSMCFTRACEEVENT']._serialized_start=83495 + _globals['_HOSTSMCFTRACEEVENT']._serialized_end=83546 + _globals['_HOSTMEMABORTFTRACEEVENT']._serialized_start=83548 + _globals['_HOSTMEMABORTFTRACEEVENT']._serialized_end=83600 + _globals['_HOSTFFACALLFTRACEEVENT']._serialized_start=83603 + _globals['_HOSTFFACALLFTRACEEVENT']._serialized_end=83738 + _globals['_IOMMUIDMAPFTRACEEVENT']._serialized_start=83740 + _globals['_IOMMUIDMAPFTRACEEVENT']._serialized_end=83803 + _globals['_PSCIMEMPROTECTFTRACEEVENT']._serialized_start=83805 + _globals['_PSCIMEMPROTECTFTRACEEVENT']._serialized_end=83860 + _globals['_HYPERVISORHOSTHCALLFTRACEEVENT']._serialized_start=83862 + _globals['_HYPERVISORHOSTHCALLFTRACEEVENT']._serialized_end=83923 + _globals['_HYPERVISORHOSTSMCFTRACEEVENT']._serialized_start=83925 + _globals['_HYPERVISORHOSTSMCFTRACEEVENT']._serialized_end=83986 + _globals['_HYPERVISORHYPEXITFTRACEEVENT']._serialized_start=83988 + _globals['_HYPERVISORHYPEXITFTRACEEVENT']._serialized_end=84018 + _globals['_HYPERVISORIOMMUIDMAPFTRACEEVENT']._serialized_start=84020 + _globals['_HYPERVISORIOMMUIDMAPFTRACEEVENT']._serialized_end=84093 + _globals['_HYPERVISORPSCIMEMPROTECTFTRACEEVENT']._serialized_start=84095 + _globals['_HYPERVISORPSCIMEMPROTECTFTRACEEVENT']._serialized_end=84160 + _globals['_HYPERVISORHOSTMEMABORTFTRACEEVENT']._serialized_start=84162 + _globals['_HYPERVISORHOSTMEMABORTFTRACEEVENT']._serialized_end=84224 + _globals['_HYPERVISORHYPENTERFTRACEEVENT']._serialized_start=84226 + _globals['_HYPERVISORHYPENTERFTRACEEVENT']._serialized_end=84257 + _globals['_HYPERVISORIOMMUIDMAPCOMPLETEFTRACEEVENT']._serialized_start=84259 + _globals['_HYPERVISORIOMMUIDMAPCOMPLETEFTRACEEVENT']._serialized_end=84313 + _globals['_HYPERVISORVCPUILLEGALTRAPFTRACEEVENT']._serialized_start=84315 + _globals['_HYPERVISORVCPUILLEGALTRAPFTRACEEVENT']._serialized_end=84366 + _globals['_I2CREADFTRACEEVENT']._serialized_start=84368 + _globals['_I2CREADFTRACEEVENT']._serialized_end=84466 + _globals['_I2CWRITEFTRACEEVENT']._serialized_start=84468 + _globals['_I2CWRITEFTRACEEVENT']._serialized_end=84580 + _globals['_I2CRESULTFTRACEEVENT']._serialized_start=84582 + _globals['_I2CRESULTFTRACEEVENT']._serialized_end=84654 + _globals['_I2CREPLYFTRACEEVENT']._serialized_start=84656 + _globals['_I2CREPLYFTRACEEVENT']._serialized_end=84768 + _globals['_SMBUSREADFTRACEEVENT']._serialized_start=84770 + _globals['_SMBUSREADFTRACEEVENT']._serialized_end=84876 + _globals['_SMBUSWRITEFTRACEEVENT']._serialized_start=84878 + _globals['_SMBUSWRITEFTRACEEVENT']._serialized_end=84998 + _globals['_SMBUSRESULTFTRACEEVENT']._serialized_start=85001 + _globals['_SMBUSRESULTFTRACEEVENT']._serialized_end=85142 + _globals['_SMBUSREPLYFTRACEEVENT']._serialized_start=85144 + _globals['_SMBUSREPLYFTRACEEVENT']._serialized_end=85264 + _globals['_IONSTATFTRACEEVENT']._serialized_start=85266 + _globals['_IONSTATFTRACEEVENT']._serialized_end=85343 + _globals['_IPIENTRYFTRACEEVENT']._serialized_start=85345 + _globals['_IPIENTRYFTRACEEVENT']._serialized_end=85382 + _globals['_IPIEXITFTRACEEVENT']._serialized_start=85384 + _globals['_IPIEXITFTRACEEVENT']._serialized_end=85420 + _globals['_IPIRAISEFTRACEEVENT']._serialized_start=85422 + _globals['_IPIRAISEFTRACEEVENT']._serialized_end=85480 + _globals['_SOFTIRQENTRYFTRACEEVENT']._serialized_start=85482 + _globals['_SOFTIRQENTRYFTRACEEVENT']._serialized_end=85520 + _globals['_SOFTIRQEXITFTRACEEVENT']._serialized_start=85522 + _globals['_SOFTIRQEXITFTRACEEVENT']._serialized_end=85559 + _globals['_SOFTIRQRAISEFTRACEEVENT']._serialized_start=85561 + _globals['_SOFTIRQRAISEFTRACEEVENT']._serialized_end=85599 + _globals['_IRQHANDLERENTRYFTRACEEVENT']._serialized_start=85601 + _globals['_IRQHANDLERENTRYFTRACEEVENT']._serialized_end=85673 + _globals['_IRQHANDLEREXITFTRACEEVENT']._serialized_start=85675 + _globals['_IRQHANDLEREXITFTRACEEVENT']._serialized_end=85728 + _globals['_LOCALTIMERENTRYFTRACEEVENT']._serialized_start=85730 + _globals['_LOCALTIMERENTRYFTRACEEVENT']._serialized_end=85774 + _globals['_LOCALTIMEREXITFTRACEEVENT']._serialized_start=85776 + _globals['_LOCALTIMEREXITFTRACEEVENT']._serialized_end=85819 + _globals['_KGSLGPUFREQUENCYFTRACEEVENT']._serialized_start=85821 + _globals['_KGSLGPUFREQUENCYFTRACEEVENT']._serialized_end=85884 + _globals['_KGSLADRENOCMDBATCHQUEUEDFTRACEEVENT']._serialized_start=85886 + _globals['_KGSLADRENOCMDBATCHQUEUEDFTRACEEVENT']._serialized_end=85999 + _globals['_KGSLADRENOCMDBATCHSUBMITTEDFTRACEEVENT']._serialized_start=86002 + _globals['_KGSLADRENOCMDBATCHSUBMITTEDFTRACEEVENT']._serialized_end=86251 + _globals['_KGSLADRENOCMDBATCHSYNCFTRACEEVENT']._serialized_start=86253 + _globals['_KGSLADRENOCMDBATCHSYNCFTRACEEVENT']._serialized_end=86348 + _globals['_KGSLADRENOCMDBATCHRETIREDFTRACEEVENT']._serialized_start=86351 + _globals['_KGSLADRENOCMDBATCHRETIREDFTRACEEVENT']._serialized_end=86692 + _globals['_ALLOCPAGESIOMMUENDFTRACEEVENT']._serialized_start=86694 + _globals['_ALLOCPAGESIOMMUENDFTRACEEVENT']._serialized_end=86759 + _globals['_ALLOCPAGESIOMMUFAILFTRACEEVENT']._serialized_start=86761 + _globals['_ALLOCPAGESIOMMUFAILFTRACEEVENT']._serialized_end=86827 + _globals['_ALLOCPAGESIOMMUSTARTFTRACEEVENT']._serialized_start=86829 + _globals['_ALLOCPAGESIOMMUSTARTFTRACEEVENT']._serialized_end=86896 + _globals['_ALLOCPAGESSYSENDFTRACEEVENT']._serialized_start=86898 + _globals['_ALLOCPAGESSYSENDFTRACEEVENT']._serialized_end=86961 + _globals['_ALLOCPAGESSYSFAILFTRACEEVENT']._serialized_start=86963 + _globals['_ALLOCPAGESSYSFAILFTRACEEVENT']._serialized_end=87027 + _globals['_ALLOCPAGESSYSSTARTFTRACEEVENT']._serialized_start=87029 + _globals['_ALLOCPAGESSYSSTARTFTRACEEVENT']._serialized_end=87094 + _globals['_DMAALLOCCONTIGUOUSRETRYFTRACEEVENT']._serialized_start=87096 + _globals['_DMAALLOCCONTIGUOUSRETRYFTRACEEVENT']._serialized_end=87147 + _globals['_IOMMUMAPRANGEFTRACEEVENT']._serialized_start=87149 + _globals['_IOMMUMAPRANGEFTRACEEVENT']._serialized_end=87232 + _globals['_IOMMUSECPTBLMAPRANGEENDFTRACEEVENT']._serialized_start=87234 + _globals['_IOMMUSECPTBLMAPRANGEENDFTRACEEVENT']._serialized_end=87336 + _globals['_IOMMUSECPTBLMAPRANGESTARTFTRACEEVENT']._serialized_start=87338 + _globals['_IOMMUSECPTBLMAPRANGESTARTFTRACEEVENT']._serialized_end=87442 + _globals['_IONALLOCBUFFERENDFTRACEEVENT']._serialized_start=87444 + _globals['_IONALLOCBUFFERENDFTRACEEVENT']._serialized_end=87556 + _globals['_IONALLOCBUFFERFAILFTRACEEVENT']._serialized_start=87559 + _globals['_IONALLOCBUFFERFAILFTRACEEVENT']._serialized_end=87687 + _globals['_IONALLOCBUFFERFALLBACKFTRACEEVENT']._serialized_start=87690 + _globals['_IONALLOCBUFFERFALLBACKFTRACEEVENT']._serialized_end=87822 + _globals['_IONALLOCBUFFERSTARTFTRACEEVENT']._serialized_start=87824 + _globals['_IONALLOCBUFFERSTARTFTRACEEVENT']._serialized_end=87938 + _globals['_IONCPALLOCRETRYFTRACEEVENT']._serialized_start=87940 + _globals['_IONCPALLOCRETRYFTRACEEVENT']._serialized_end=87983 + _globals['_IONCPSECUREBUFFERENDFTRACEEVENT']._serialized_start=87985 + _globals['_IONCPSECUREBUFFERENDFTRACEEVENT']._serialized_end=88080 + _globals['_IONCPSECUREBUFFERSTARTFTRACEEVENT']._serialized_start=88082 + _globals['_IONCPSECUREBUFFERSTARTFTRACEEVENT']._serialized_end=88179 + _globals['_IONPREFETCHINGFTRACEEVENT']._serialized_start=88181 + _globals['_IONPREFETCHINGFTRACEEVENT']._serialized_end=88221 + _globals['_IONSECURECMAADDTOPOOLENDFTRACEEVENT']._serialized_start=88223 + _globals['_IONSECURECMAADDTOPOOLENDFTRACEEVENT']._serialized_end=88314 + _globals['_IONSECURECMAADDTOPOOLSTARTFTRACEEVENT']._serialized_start=88316 + _globals['_IONSECURECMAADDTOPOOLSTARTFTRACEEVENT']._serialized_end=88409 + _globals['_IONSECURECMAALLOCATEENDFTRACEEVENT']._serialized_start=88411 + _globals['_IONSECURECMAALLOCATEENDFTRACEEVENT']._serialized_end=88509 + _globals['_IONSECURECMAALLOCATESTARTFTRACEEVENT']._serialized_start=88511 + _globals['_IONSECURECMAALLOCATESTARTFTRACEEVENT']._serialized_end=88611 + _globals['_IONSECURECMASHRINKPOOLENDFTRACEEVENT']._serialized_start=88613 + _globals['_IONSECURECMASHRINKPOOLENDFTRACEEVENT']._serialized_end=88695 + _globals['_IONSECURECMASHRINKPOOLSTARTFTRACEEVENT']._serialized_start=88697 + _globals['_IONSECURECMASHRINKPOOLSTARTFTRACEEVENT']._serialized_end=88781 + _globals['_KFREEFTRACEEVENT']._serialized_start=88783 + _globals['_KFREEFTRACEEVENT']._serialized_end=88833 + _globals['_KMALLOCFTRACEEVENT']._serialized_start=88835 + _globals['_KMALLOCFTRACEEVENT']._serialized_end=88946 + _globals['_KMALLOCNODEFTRACEEVENT']._serialized_start=88949 + _globals['_KMALLOCNODEFTRACEEVENT']._serialized_end=89078 + _globals['_KMEMCACHEALLOCFTRACEEVENT']._serialized_start=89080 + _globals['_KMEMCACHEALLOCFTRACEEVENT']._serialized_end=89198 + _globals['_KMEMCACHEALLOCNODEFTRACEEVENT']._serialized_start=89201 + _globals['_KMEMCACHEALLOCNODEFTRACEEVENT']._serialized_end=89337 + _globals['_KMEMCACHEFREEFTRACEEVENT']._serialized_start=89339 + _globals['_KMEMCACHEFREEFTRACEEVENT']._serialized_end=89397 + _globals['_MIGRATEPAGESENDFTRACEEVENT']._serialized_start=89399 + _globals['_MIGRATEPAGESENDFTRACEEVENT']._serialized_end=89441 + _globals['_MIGRATEPAGESSTARTFTRACEEVENT']._serialized_start=89443 + _globals['_MIGRATEPAGESSTARTFTRACEEVENT']._serialized_end=89487 + _globals['_MIGRATERETRYFTRACEEVENT']._serialized_start=89489 + _globals['_MIGRATERETRYFTRACEEVENT']._serialized_end=89529 + _globals['_MMPAGEALLOCFTRACEEVENT']._serialized_start=89531 + _globals['_MMPAGEALLOCFTRACEEVENT']._serialized_end=89637 + _globals['_MMPAGEALLOCEXTFRAGFTRACEEVENT']._serialized_start=89640 + _globals['_MMPAGEALLOCEXTFRAGFTRACEEVENT']._serialized_end=89826 + _globals['_MMPAGEALLOCZONELOCKEDFTRACEEVENT']._serialized_start=89828 + _globals['_MMPAGEALLOCZONELOCKEDFTRACEEVENT']._serialized_end=89925 + _globals['_MMPAGEFREEFTRACEEVENT']._serialized_start=89927 + _globals['_MMPAGEFREEFTRACEEVENT']._serialized_end=89992 + _globals['_MMPAGEFREEBATCHEDFTRACEEVENT']._serialized_start=89994 + _globals['_MMPAGEFREEBATCHEDFTRACEEVENT']._serialized_end=90065 + _globals['_MMPAGEPCPUDRAINFTRACEEVENT']._serialized_start=90067 + _globals['_MMPAGEPCPUDRAINFTRACEEVENT']._serialized_end=90158 + _globals['_RSSSTATFTRACEEVENT']._serialized_start=90160 + _globals['_RSSSTATFTRACEEVENT']._serialized_end=90239 + _globals['_IONHEAPSHRINKFTRACEEVENT']._serialized_start=90241 + _globals['_IONHEAPSHRINKFTRACEEVENT']._serialized_end=90324 + _globals['_IONHEAPGROWFTRACEEVENT']._serialized_start=90326 + _globals['_IONHEAPGROWFTRACEEVENT']._serialized_end=90407 + _globals['_IONBUFFERCREATEFTRACEEVENT']._serialized_start=90409 + _globals['_IONBUFFERCREATEFTRACEEVENT']._serialized_end=90464 + _globals['_IONBUFFERDESTROYFTRACEEVENT']._serialized_start=90466 + _globals['_IONBUFFERDESTROYFTRACEEVENT']._serialized_end=90522 + _globals['_MMALLOCCONTIGMIGRATERANGEINFOFTRACEEVENT']._serialized_start=90525 + _globals['_MMALLOCCONTIGMIGRATERANGEINFOFTRACEEVENT']._serialized_end=90678 + _globals['_DMABUFRSSSTATFTRACEEVENT']._serialized_start=90680 + _globals['_DMABUFRSSSTATFTRACEEVENT']._serialized_end=90753 + _globals['_KVMACCESSFAULTFTRACEEVENT']._serialized_start=90755 + _globals['_KVMACCESSFAULTFTRACEEVENT']._serialized_end=90795 + _globals['_KVMACKIRQFTRACEEVENT']._serialized_start=90797 + _globals['_KVMACKIRQFTRACEEVENT']._serialized_end=90849 + _globals['_KVMAGEHVAFTRACEEVENT']._serialized_start=90851 + _globals['_KVMAGEHVAFTRACEEVENT']._serialized_end=90901 + _globals['_KVMAGEPAGEFTRACEEVENT']._serialized_start=90903 + _globals['_KVMAGEPAGEFTRACEEVENT']._serialized_end=90987 + _globals['_KVMARMCLEARDEBUGFTRACEEVENT']._serialized_start=90989 + _globals['_KVMARMCLEARDEBUGFTRACEEVENT']._serialized_end=91039 + _globals['_KVMARMSETDREG32FTRACEEVENT']._serialized_start=91041 + _globals['_KVMARMSETDREG32FTRACEEVENT']._serialized_end=91098 + _globals['_KVMARMSETREGSETFTRACEEVENT']._serialized_start=91100 + _globals['_KVMARMSETREGSETFTRACEEVENT']._serialized_end=91155 + _globals['_KVMARMSETUPDEBUGFTRACEEVENT']._serialized_start=91157 + _globals['_KVMARMSETUPDEBUGFTRACEEVENT']._serialized_end=91221 + _globals['_KVMENTRYFTRACEEVENT']._serialized_start=91223 + _globals['_KVMENTRYFTRACEEVENT']._serialized_end=91261 + _globals['_KVMEXITFTRACEEVENT']._serialized_start=91263 + _globals['_KVMEXITFTRACEEVENT']._serialized_end=91329 + _globals['_KVMFPUFTRACEEVENT']._serialized_start=91331 + _globals['_KVMFPUFTRACEEVENT']._serialized_end=91364 + _globals['_KVMGETTIMERMAPFTRACEEVENT']._serialized_start=91366 + _globals['_KVMGETTIMERMAPFTRACEEVENT']._serialized_end=91477 + _globals['_KVMGUESTFAULTFTRACEEVENT']._serialized_start=91479 + _globals['_KVMGUESTFAULTFTRACEEVENT']._serialized_end=91563 + _globals['_KVMHANDLESYSREGFTRACEEVENT']._serialized_start=91565 + _globals['_KVMHANDLESYSREGFTRACEEVENT']._serialized_end=91606 + _globals['_KVMHVCARM64FTRACEEVENT']._serialized_start=91608 + _globals['_KVMHVCARM64FTRACEEVENT']._serialized_end=91674 + _globals['_KVMIRQLINEFTRACEEVENT']._serialized_start=91676 + _globals['_KVMIRQLINEFTRACEEVENT']._serialized_end=91763 + _globals['_KVMMMIOFTRACEEVENT']._serialized_start=91765 + _globals['_KVMMMIOFTRACEEVENT']._serialized_end=91838 + _globals['_KVMMMIOEMULATEFTRACEEVENT']._serialized_start=91840 + _globals['_KVMMMIOEMULATEFTRACEEVENT']._serialized_end=91913 + _globals['_KVMSETGUESTDEBUGFTRACEEVENT']._serialized_start=91915 + _globals['_KVMSETGUESTDEBUGFTRACEEVENT']._serialized_end=91979 + _globals['_KVMSETIRQFTRACEEVENT']._serialized_start=91981 + _globals['_KVMSETIRQFTRACEEVENT']._serialized_end=92054 + _globals['_KVMSETSPTEHVAFTRACEEVENT']._serialized_start=92056 + _globals['_KVMSETSPTEHVAFTRACEEVENT']._serialized_end=92095 + _globals['_KVMSETWAYFLUSHFTRACEEVENT']._serialized_start=92097 + _globals['_KVMSETWAYFLUSHFTRACEEVENT']._serialized_end=92156 + _globals['_KVMSYSACCESSFTRACEEVENT']._serialized_start=92159 + _globals['_KVMSYSACCESSFTRACEEVENT']._serialized_end=92298 + _globals['_KVMTESTAGEHVAFTRACEEVENT']._serialized_start=92300 + _globals['_KVMTESTAGEHVAFTRACEEVENT']._serialized_end=92339 + _globals['_KVMTIMEREMULATEFTRACEEVENT']._serialized_start=92341 + _globals['_KVMTIMEREMULATEFTRACEEVENT']._serialized_end=92409 + _globals['_KVMTIMERHRTIMEREXPIREFTRACEEVENT']._serialized_start=92411 + _globals['_KVMTIMERHRTIMEREXPIREFTRACEEVENT']._serialized_end=92464 + _globals['_KVMTIMERRESTORESTATEFTRACEEVENT']._serialized_start=92466 + _globals['_KVMTIMERRESTORESTATEFTRACEEVENT']._serialized_end=92545 + _globals['_KVMTIMERSAVESTATEFTRACEEVENT']._serialized_start=92547 + _globals['_KVMTIMERSAVESTATEFTRACEEVENT']._serialized_end=92623 + _globals['_KVMTIMERUPDATEIRQFTRACEEVENT']._serialized_start=92625 + _globals['_KVMTIMERUPDATEIRQFTRACEEVENT']._serialized_end=92700 + _globals['_KVMTOGGLECACHEFTRACEEVENT']._serialized_start=92702 + _globals['_KVMTOGGLECACHEFTRACEEVENT']._serialized_end=92772 + _globals['_KVMUNMAPHVARANGEFTRACEEVENT']._serialized_start=92774 + _globals['_KVMUNMAPHVARANGEFTRACEEVENT']._serialized_end=92831 + _globals['_KVMUSERSPACEEXITFTRACEEVENT']._serialized_start=92833 + _globals['_KVMUSERSPACEEXITFTRACEEVENT']._serialized_end=92878 + _globals['_KVMVCPUWAKEUPFTRACEEVENT']._serialized_start=92880 + _globals['_KVMVCPUWAKEUPFTRACEEVENT']._serialized_end=92949 + _globals['_KVMWFXARM64FTRACEEVENT']._serialized_start=92951 + _globals['_KVMWFXARM64FTRACEEVENT']._serialized_end=93008 + _globals['_TRAPREGFTRACEEVENT']._serialized_start=93010 + _globals['_TRAPREGFTRACEEVENT']._serialized_end=93094 + _globals['_VGICUPDATEIRQPENDINGFTRACEEVENT']._serialized_start=93096 + _globals['_VGICUPDATEIRQPENDINGFTRACEEVENT']._serialized_end=93174 + _globals['_LOWMEMORYKILLFTRACEEVENT']._serialized_start=93176 + _globals['_LOWMEMORYKILLFTRACEEVENT']._serialized_end=93292 + _globals['_LWISTRACINGMARKWRITEFTRACEEVENT']._serialized_start=93294 + _globals['_LWISTRACINGMARKWRITEFTRACEEVENT']._serialized_end=93407 + _globals['_MALITRACINGMARKWRITEFTRACEEVENT']._serialized_start=93409 + _globals['_MALITRACINGMARKWRITEFTRACEEVENT']._serialized_end=93498 + _globals['_MALIMALIKCPUCQSSETFTRACEEVENT']._serialized_start=93500 + _globals['_MALIMALIKCPUCQSSETFTRACEEVENT']._serialized_end=93617 + _globals['_MALIMALIKCPUCQSWAITSTARTFTRACEEVENT']._serialized_start=93619 + _globals['_MALIMALIKCPUCQSWAITSTARTFTRACEEVENT']._serialized_end=93742 + _globals['_MALIMALIKCPUCQSWAITENDFTRACEEVENT']._serialized_start=93744 + _globals['_MALIMALIKCPUCQSWAITENDFTRACEEVENT']._serialized_end=93865 + _globals['_MALIMALIKCPUFENCESIGNALFTRACEEVENT']._serialized_start=93867 + _globals['_MALIMALIKCPUFENCESIGNALFTRACEEVENT']._serialized_end=93989 + _globals['_MALIMALIKCPUFENCEWAITSTARTFTRACEEVENT']._serialized_start=93991 + _globals['_MALIMALIKCPUFENCEWAITSTARTFTRACEEVENT']._serialized_end=94116 + _globals['_MALIMALIKCPUFENCEWAITENDFTRACEEVENT']._serialized_start=94118 + _globals['_MALIMALIKCPUFENCEWAITENDFTRACEEVENT']._serialized_end=94241 + _globals['_MALIMALICSFINTERRUPTSTARTFTRACEEVENT']._serialized_start=94243 + _globals['_MALIMALICSFINTERRUPTSTARTFTRACEEVENT']._serialized_end=94335 + _globals['_MALIMALICSFINTERRUPTENDFTRACEEVENT']._serialized_start=94337 + _globals['_MALIMALICSFINTERRUPTENDFTRACEEVENT']._serialized_end=94427 + _globals['_MALIMALIPMMCUHCTLCORESDOWNSCALENOTIFYPENDFTRACEEVENT']._serialized_start=94429 + _globals['_MALIMALIPMMCUHCTLCORESDOWNSCALENOTIFYPENDFTRACEEVENT']._serialized_end=94537 + _globals['_MALIMALIPMMCUHCTLCORESNOTIFYPENDFTRACEEVENT']._serialized_start=94539 + _globals['_MALIMALIPMMCUHCTLCORESNOTIFYPENDFTRACEEVENT']._serialized_end=94638 + _globals['_MALIMALIPMMCUHCTLCOREINACTIVEPENDFTRACEEVENT']._serialized_start=94640 + _globals['_MALIMALIPMMCUHCTLCOREINACTIVEPENDFTRACEEVENT']._serialized_end=94740 + _globals['_MALIMALIPMMCUHCTLMCUONRECHECKFTRACEEVENT']._serialized_start=94742 + _globals['_MALIMALIPMMCUHCTLMCUONRECHECKFTRACEEVENT']._serialized_end=94838 + _globals['_MALIMALIPMMCUHCTLSHADERSCOREOFFPENDFTRACEEVENT']._serialized_start=94840 + _globals['_MALIMALIPMMCUHCTLSHADERSCOREOFFPENDFTRACEEVENT']._serialized_end=94942 + _globals['_MALIMALIPMMCUHCTLSHADERSPENDOFFFTRACEEVENT']._serialized_start=94944 + _globals['_MALIMALIPMMCUHCTLSHADERSPENDOFFFTRACEEVENT']._serialized_end=95042 + _globals['_MALIMALIPMMCUHCTLSHADERSPENDONFTRACEEVENT']._serialized_start=95044 + _globals['_MALIMALIPMMCUHCTLSHADERSPENDONFTRACEEVENT']._serialized_end=95141 + _globals['_MALIMALIPMMCUHCTLSHADERSREADYOFFFTRACEEVENT']._serialized_start=95143 + _globals['_MALIMALIPMMCUHCTLSHADERSREADYOFFFTRACEEVENT']._serialized_end=95242 + _globals['_MALIMALIPMMCUINSLEEPFTRACEEVENT']._serialized_start=95244 + _globals['_MALIMALIPMMCUINSLEEPFTRACEEVENT']._serialized_end=95331 + _globals['_MALIMALIPMMCUOFFFTRACEEVENT']._serialized_start=95333 + _globals['_MALIMALIPMMCUOFFFTRACEEVENT']._serialized_end=95416 + _globals['_MALIMALIPMMCUONFTRACEEVENT']._serialized_start=95418 + _globals['_MALIMALIPMMCUONFTRACEEVENT']._serialized_end=95500 + _globals['_MALIMALIPMMCUONCOREATTRUPDATEPENDFTRACEEVENT']._serialized_start=95502 + _globals['_MALIMALIPMMCUONCOREATTRUPDATEPENDFTRACEEVENT']._serialized_end=95602 + _globals['_MALIMALIPMMCUONGLBREINITPENDFTRACEEVENT']._serialized_start=95604 + _globals['_MALIMALIPMMCUONGLBREINITPENDFTRACEEVENT']._serialized_end=95699 + _globals['_MALIMALIPMMCUONHALTFTRACEEVENT']._serialized_start=95701 + _globals['_MALIMALIPMMCUONHALTFTRACEEVENT']._serialized_end=95787 + _globals['_MALIMALIPMMCUONHWCNTDISABLEFTRACEEVENT']._serialized_start=95789 + _globals['_MALIMALIPMMCUONHWCNTDISABLEFTRACEEVENT']._serialized_end=95883 + _globals['_MALIMALIPMMCUONHWCNTENABLEFTRACEEVENT']._serialized_start=95885 + _globals['_MALIMALIPMMCUONHWCNTENABLEFTRACEEVENT']._serialized_end=95978 + _globals['_MALIMALIPMMCUONPENDHALTFTRACEEVENT']._serialized_start=95980 + _globals['_MALIMALIPMMCUONPENDHALTFTRACEEVENT']._serialized_end=96070 + _globals['_MALIMALIPMMCUONPENDSLEEPFTRACEEVENT']._serialized_start=96072 + _globals['_MALIMALIPMMCUONPENDSLEEPFTRACEEVENT']._serialized_end=96163 + _globals['_MALIMALIPMMCUONSLEEPINITIATEFTRACEEVENT']._serialized_start=96165 + _globals['_MALIMALIPMMCUONSLEEPINITIATEFTRACEEVENT']._serialized_end=96260 + _globals['_MALIMALIPMMCUPENDOFFFTRACEEVENT']._serialized_start=96262 + _globals['_MALIMALIPMMCUPENDOFFFTRACEEVENT']._serialized_end=96349 + _globals['_MALIMALIPMMCUPENDONRELOADFTRACEEVENT']._serialized_start=96351 + _globals['_MALIMALIPMMCUPENDONRELOADFTRACEEVENT']._serialized_end=96443 + _globals['_MALIMALIPMMCUPOWERDOWNFTRACEEVENT']._serialized_start=96445 + _globals['_MALIMALIPMMCUPOWERDOWNFTRACEEVENT']._serialized_end=96534 + _globals['_MALIMALIPMMCURESETWAITFTRACEEVENT']._serialized_start=96536 + _globals['_MALIMALIPMMCURESETWAITFTRACEEVENT']._serialized_end=96625 + _globals['_MALIGPUPOWERSTATEFTRACEEVENT']._serialized_start=96627 + _globals['_MALIGPUPOWERSTATEFTRACEEVENT']._serialized_end=96714 + _globals['_MDPCMDKICKOFFFTRACEEVENT']._serialized_start=96716 + _globals['_MDPCMDKICKOFFFTRACEEVENT']._serialized_end=96780 + _globals['_MDPCOMMITFTRACEEVENT']._serialized_start=96782 + _globals['_MDPCOMMITFTRACEEVENT']._serialized_end=96872 + _globals['_MDPPERFSETOTFTRACEEVENT']._serialized_start=96874 + _globals['_MDPPERFSETOTFTRACEEVENT']._serialized_end=96965 + _globals['_MDPSSPPCHANGEFTRACEEVENT']._serialized_start=96968 + _globals['_MDPSSPPCHANGEFTRACEEVENT']._serialized_end=97236 + _globals['_TRACINGMARKWRITEFTRACEEVENT']._serialized_start=97238 + _globals['_TRACINGMARKWRITEFTRACEEVENT']._serialized_end=97321 + _globals['_MDPCMDPINGPONGDONEFTRACEEVENT']._serialized_start=97323 + _globals['_MDPCMDPINGPONGDONEFTRACEEVENT']._serialized_end=97423 + _globals['_MDPCOMPAREBWFTRACEEVENT']._serialized_start=97426 + _globals['_MDPCOMPAREBWFTRACEEVENT']._serialized_end=97590 + _globals['_MDPPERFSETPANICLUTSFTRACEEVENT']._serialized_start=97592 + _globals['_MDPPERFSETPANICLUTSFTRACEEVENT']._serialized_end=97704 + _globals['_MDPSSPPSETFTRACEEVENT']._serialized_start=97707 + _globals['_MDPSSPPSETFTRACEEVENT']._serialized_end=97972 + _globals['_MDPCMDREADPTRDONEFTRACEEVENT']._serialized_start=97974 + _globals['_MDPCMDREADPTRDONEFTRACEEVENT']._serialized_end=98039 + _globals['_MDPMISRCRCFTRACEEVENT']._serialized_start=98041 + _globals['_MDPMISRCRCFTRACEEVENT']._serialized_end=98114 + _globals['_MDPPERFSETQOSLUTSFTRACEEVENT']._serialized_start=98116 + _globals['_MDPPERFSETQOSLUTSFTRACEEVENT']._serialized_end=98241 + _globals['_MDPTRACECOUNTERFTRACEEVENT']._serialized_start=98243 + _globals['_MDPTRACECOUNTERFTRACEEVENT']._serialized_end=98321 + _globals['_MDPCMDRELEASEBWFTRACEEVENT']._serialized_start=98323 + _globals['_MDPCMDRELEASEBWFTRACEEVENT']._serialized_end=98368 + _globals['_MDPMIXERUPDATEFTRACEEVENT']._serialized_start=98370 + _globals['_MDPMIXERUPDATEFTRACEEVENT']._serialized_end=98416 + _globals['_MDPPERFSETWMLEVELSFTRACEEVENT']._serialized_start=98419 + _globals['_MDPPERFSETWMLEVELSFTRACEEVENT']._serialized_end=98579 + _globals['_MDPVIDEOUNDERRUNDONEFTRACEEVENT']._serialized_start=98581 + _globals['_MDPVIDEOUNDERRUNDONEFTRACEEVENT']._serialized_end=98653 + _globals['_MDPCMDWAITPINGPONGFTRACEEVENT']._serialized_start=98655 + _globals['_MDPCMDWAITPINGPONGFTRACEEVENT']._serialized_end=98724 + _globals['_MDPPERFPREFILLCALCFTRACEEVENT']._serialized_start=98727 + _globals['_MDPPERFPREFILLCALCFTRACEEVENT']._serialized_end=98933 + _globals['_MDPPERFUPDATEBUSFTRACEEVENT']._serialized_start=98935 + _globals['_MDPPERFUPDATEBUSFTRACEEVENT']._serialized_end=99016 + _globals['_ROTATORBWAOASCONTEXTFTRACEEVENT']._serialized_start=99018 + _globals['_ROTATORBWAOASCONTEXTFTRACEEVENT']._serialized_end=99066 + _globals['_MMEVENTRECORDFTRACEEVENT']._serialized_start=99068 + _globals['_MMEVENTRECORDFTRACEEVENT']._serialized_end=99157 + _globals['_NETIFRECEIVESKBFTRACEEVENT']._serialized_start=99159 + _globals['_NETIFRECEIVESKBFTRACEEVENT']._serialized_end=99231 + _globals['_NETDEVXMITFTRACEEVENT']._serialized_start=99233 + _globals['_NETDEVXMITFTRACEEVENT']._serialized_end=99312 + _globals['_NAPIGRORECEIVEENTRYFTRACEEVENT']._serialized_start=99315 + _globals['_NAPIGRORECEIVEENTRYFTRACEEVENT']._serialized_end=99694 + _globals['_NAPIGRORECEIVEEXITFTRACEEVENT']._serialized_start=99696 + _globals['_NAPIGRORECEIVEEXITFTRACEEVENT']._serialized_end=99740 + _globals['_OOMSCOREADJUPDATEFTRACEEVENT']._serialized_start=99742 + _globals['_OOMSCOREADJUPDATEFTRACEEVENT']._serialized_end=99822 + _globals['_MARKVICTIMFTRACEEVENT']._serialized_start=99824 + _globals['_MARKVICTIMFTRACEEVENT']._serialized_end=99860 + _globals['_DSICMDFIFOSTATUSFTRACEEVENT']._serialized_start=99862 + _globals['_DSICMDFIFOSTATUSFTRACEEVENT']._serialized_end=99924 + _globals['_DSIRXFTRACEEVENT']._serialized_start=99926 + _globals['_DSIRXFTRACEEVENT']._serialized_end=99973 + _globals['_DSITXFTRACEEVENT']._serialized_start=99975 + _globals['_DSITXFTRACEEVENT']._serialized_end=100037 + _globals['_PANELWRITEGENERICFTRACEEVENT']._serialized_start=100039 + _globals['_PANELWRITEGENERICFTRACEEVENT']._serialized_end=100166 + _globals['_GRAMCOLLISIONFTRACEEVENT']._serialized_start=100168 + _globals['_GRAMCOLLISIONFTRACEEVENT']._serialized_end=100238 + _globals['_PANELSETTINGSFULLFTRACEEVENT']._serialized_start=100241 + _globals['_PANELSETTINGSFULLFTRACEEVENT']._serialized_end=100438 + _globals['_PANELSETTINGSLITEFTRACEEVENT']._serialized_start=100440 + _globals['_PANELSETTINGSLITEFTRACEEVENT']._serialized_end=100553 + _globals['_SCHEDSWITCHWITHCTRSFTRACEEVENT']._serialized_start=100556 + _globals['_SCHEDSWITCHWITHCTRSFTRACEEVENT']._serialized_end=100944 + _globals['_PIXELMMKSWAPDWAKEFTRACEEVENT']._serialized_start=100946 + _globals['_PIXELMMKSWAPDWAKEFTRACEEVENT']._serialized_end=100994 + _globals['_PIXELMMKSWAPDDONEFTRACEEVENT']._serialized_start=100997 + _globals['_PIXELMMKSWAPDDONEFTRACEEVENT']._serialized_end=101130 + _globals['_CPUFREQUENCYFTRACEEVENT']._serialized_start=101132 + _globals['_CPUFREQUENCYFTRACEEVENT']._serialized_end=101188 + _globals['_CPUFREQUENCYLIMITSFTRACEEVENT']._serialized_start=101190 + _globals['_CPUFREQUENCYLIMITSFTRACEEVENT']._serialized_end=101273 + _globals['_CPUIDLEFTRACEEVENT']._serialized_start=101275 + _globals['_CPUIDLEFTRACEEVENT']._serialized_end=101326 + _globals['_CLOCKENABLEFTRACEEVENT']._serialized_start=101328 + _globals['_CLOCKENABLEFTRACEEVENT']._serialized_end=101397 + _globals['_CLOCKDISABLEFTRACEEVENT']._serialized_start=101399 + _globals['_CLOCKDISABLEFTRACEEVENT']._serialized_end=101469 + _globals['_CLOCKSETRATEFTRACEEVENT']._serialized_start=101471 + _globals['_CLOCKSETRATEFTRACEEVENT']._serialized_end=101541 + _globals['_SUSPENDRESUMEFTRACEEVENT']._serialized_start=101543 + _globals['_SUSPENDRESUMEFTRACEEVENT']._serialized_end=101613 + _globals['_GPUFREQUENCYFTRACEEVENT']._serialized_start=101615 + _globals['_GPUFREQUENCYFTRACEEVENT']._serialized_end=101671 + _globals['_WAKEUPSOURCEACTIVATEFTRACEEVENT']._serialized_start=101673 + _globals['_WAKEUPSOURCEACTIVATEFTRACEEVENT']._serialized_end=101735 + _globals['_WAKEUPSOURCEDEACTIVATEFTRACEEVENT']._serialized_start=101737 + _globals['_WAKEUPSOURCEDEACTIVATEFTRACEEVENT']._serialized_end=101801 + _globals['_GPUWORKPERIODFTRACEEVENT']._serialized_start=101804 + _globals['_GPUWORKPERIODFTRACEEVENT']._serialized_end=101937 + _globals['_DEVICEPMCALLBACKSTARTFTRACEEVENT']._serialized_start=101939 + _globals['_DEVICEPMCALLBACKSTARTFTRACEEVENT']._serialized_end=102052 + _globals['_DEVICEPMCALLBACKENDFTRACEEVENT']._serialized_start=102054 + _globals['_DEVICEPMCALLBACKENDFTRACEEVENT']._serialized_end=102133 + _globals['_GPUPOWERSTATEFTRACEEVENT']._serialized_start=102135 + _globals['_GPUPOWERSTATEFTRACEEVENT']._serialized_end=102199 + _globals['_PSCIDOMAINIDLEEXITFTRACEEVENT']._serialized_start=102201 + _globals['_PSCIDOMAINIDLEEXITFTRACEEVENT']._serialized_end=102279 + _globals['_PSCIDOMAINIDLEENTERFTRACEEVENT']._serialized_start=102281 + _globals['_PSCIDOMAINIDLEENTERFTRACEEVENT']._serialized_end=102360 + _globals['_CONSOLEFTRACEEVENT']._serialized_start=102362 + _globals['_CONSOLEFTRACEEVENT']._serialized_end=102395 + _globals['_SYSENTERFTRACEEVENT']._serialized_start=102397 + _globals['_SYSENTERFTRACEEVENT']._serialized_end=102444 + _globals['_SYSEXITFTRACEEVENT']._serialized_start=102446 + _globals['_SYSEXITFTRACEEVENT']._serialized_end=102491 + _globals['_REGULATORDISABLEFTRACEEVENT']._serialized_start=102493 + _globals['_REGULATORDISABLEFTRACEEVENT']._serialized_end=102536 + _globals['_REGULATORDISABLECOMPLETEFTRACEEVENT']._serialized_start=102538 + _globals['_REGULATORDISABLECOMPLETEFTRACEEVENT']._serialized_end=102589 + _globals['_REGULATORENABLEFTRACEEVENT']._serialized_start=102591 + _globals['_REGULATORENABLEFTRACEEVENT']._serialized_end=102633 + _globals['_REGULATORENABLECOMPLETEFTRACEEVENT']._serialized_start=102635 + _globals['_REGULATORENABLECOMPLETEFTRACEEVENT']._serialized_end=102685 + _globals['_REGULATORENABLEDELAYFTRACEEVENT']._serialized_start=102687 + _globals['_REGULATORENABLEDELAYFTRACEEVENT']._serialized_end=102734 + _globals['_REGULATORSETVOLTAGEFTRACEEVENT']._serialized_start=102736 + _globals['_REGULATORSETVOLTAGEFTRACEEVENT']._serialized_end=102808 + _globals['_REGULATORSETVOLTAGECOMPLETEFTRACEEVENT']._serialized_start=102810 + _globals['_REGULATORSETVOLTAGECOMPLETEFTRACEEVENT']._serialized_end=102877 + _globals['_RPMSTATUSFTRACEEVENT']._serialized_start=102879 + _globals['_RPMSTATUSFTRACEEVENT']._serialized_end=102931 + _globals['_SAMSUNGTRACINGMARKWRITEFTRACEEVENT']._serialized_start=102933 + _globals['_SAMSUNGTRACINGMARKWRITEFTRACEEVENT']._serialized_end=103058 + _globals['_SCHEDSWITCHFTRACEEVENT']._serialized_start=103061 + _globals['_SCHEDSWITCHFTRACEEVENT']._serialized_end=103217 + _globals['_SCHEDWAKEUPFTRACEEVENT']._serialized_start=103219 + _globals['_SCHEDWAKEUPFTRACEEVENT']._serialized_end=103321 + _globals['_SCHEDBLOCKEDREASONFTRACEEVENT']._serialized_start=103323 + _globals['_SCHEDBLOCKEDREASONFTRACEEVENT']._serialized_end=103400 + _globals['_SCHEDCPUHOTPLUGFTRACEEVENT']._serialized_start=103402 + _globals['_SCHEDCPUHOTPLUGFTRACEEVENT']._serialized_end=103483 + _globals['_SCHEDWAKINGFTRACEEVENT']._serialized_start=103485 + _globals['_SCHEDWAKINGFTRACEEVENT']._serialized_end=103587 + _globals['_SCHEDWAKEUPNEWFTRACEEVENT']._serialized_start=103589 + _globals['_SCHEDWAKEUPNEWFTRACEEVENT']._serialized_end=103694 + _globals['_SCHEDPROCESSEXECFTRACEEVENT']._serialized_start=103696 + _globals['_SCHEDPROCESSEXECFTRACEEVENT']._serialized_end=103773 + _globals['_SCHEDPROCESSEXITFTRACEEVENT']._serialized_start=103775 + _globals['_SCHEDPROCESSEXITFTRACEEVENT']._serialized_end=103859 + _globals['_SCHEDPROCESSFORKFTRACEEVENT']._serialized_start=103861 + _globals['_SCHEDPROCESSFORKFTRACEEVENT']._serialized_end=103970 + _globals['_SCHEDPROCESSFREEFTRACEEVENT']._serialized_start=103972 + _globals['_SCHEDPROCESSFREEFTRACEEVENT']._serialized_end=104042 + _globals['_SCHEDPROCESSHANGFTRACEEVENT']._serialized_start=104044 + _globals['_SCHEDPROCESSHANGFTRACEEVENT']._serialized_end=104100 + _globals['_SCHEDPROCESSWAITFTRACEEVENT']._serialized_start=104102 + _globals['_SCHEDPROCESSWAITFTRACEEVENT']._serialized_end=104172 + _globals['_SCHEDPISETPRIOFTRACEEVENT']._serialized_start=104174 + _globals['_SCHEDPISETPRIOFTRACEEVENT']._serialized_end=104262 + _globals['_SCHEDCPUUTILCFSFTRACEEVENT']._serialized_start=104265 + _globals['_SCHEDCPUUTILCFSFTRACEEVENT']._serialized_end=104593 + _globals['_SCHEDMIGRATETASKFTRACEEVENT']._serialized_start=104596 + _globals['_SCHEDMIGRATETASKFTRACEEVENT']._serialized_end=104733 + _globals['_SCHEDWAKEUPTASKATTRFTRACEEVENT']._serialized_start=104735 + _globals['_SCHEDWAKEUPTASKATTRFTRACEEVENT']._serialized_end=104859 + _globals['_SCHEDGROUPTRACKERFTRACEEVENT']._serialized_start=104861 + _globals['_SCHEDGROUPTRACKERFTRACEEVENT']._serialized_end=104952 + _globals['_SCMCALLSTARTFTRACEEVENT']._serialized_start=104954 + _globals['_SCMCALLSTARTFTRACEEVENT']._serialized_end=105020 + _globals['_SCMCALLENDFTRACEEVENT']._serialized_start=105022 + _globals['_SCMCALLENDFTRACEEVENT']._serialized_end=105045 + _globals['_SCSIDISPATCHCMDERRORFTRACEEVENT']._serialized_start=105048 + _globals['_SCSIDISPATCHCMDERRORFTRACEEVENT']._serialized_end=105300 + _globals['_SCSIDISPATCHCMDTIMEOUTFTRACEEVENT']._serialized_start=105303 + _globals['_SCSIDISPATCHCMDTIMEOUTFTRACEEVENT']._serialized_end=105606 + _globals['_SCSIEHWAKEUPFTRACEEVENT']._serialized_start=105608 + _globals['_SCSIEHWAKEUPFTRACEEVENT']._serialized_end=105650 + _globals['_SDETRACINGMARKWRITEFTRACEEVENT']._serialized_start=105652 + _globals['_SDETRACINGMARKWRITEFTRACEEVENT']._serialized_end=105773 + _globals['_SDESDEEVTLOGFTRACEEVENT']._serialized_start=105776 + _globals['_SDESDEEVTLOGFTRACEEVENT']._serialized_end=106045 + _globals['_SDESDEPERFCALCCRTCFTRACEEVENT']._serialized_start=106048 + _globals['_SDESDEPERFCALCCRTCFTRACEEVENT']._serialized_end=106228 + _globals['_SDESDEPERFCRTCUPDATEFTRACEEVENT']._serialized_start=106231 + _globals['_SDESDEPERFCRTCUPDATEFTRACEEVENT']._serialized_end=106514 + _globals['_SDESDEPERFSETQOSLUTSFTRACEEVENT']._serialized_start=106516 + _globals['_SDESDEPERFSETQOSLUTSFTRACEEVENT']._serialized_end=106632 + _globals['_SDESDEPERFUPDATEBUSFTRACEEVENT']._serialized_start=106634 + _globals['_SDESDEPERFUPDATEBUSFTRACEEVENT']._serialized_end=106734 + _globals['_SIGNALDELIVERFTRACEEVENT']._serialized_start=106736 + _globals['_SIGNALDELIVERFTRACEEVENT']._serialized_end=106807 + _globals['_SIGNALGENERATEFTRACEEVENT']._serialized_start=106809 + _globals['_SIGNALGENERATEFTRACEEVENT']._serialized_end=106921 + _globals['_KFREESKBFTRACEEVENT']._serialized_start=106923 + _globals['_KFREESKBFTRACEEVENT']._serialized_end=106997 + _globals['_INETSOCKSETSTATEFTRACEEVENT']._serialized_start=107000 + _globals['_INETSOCKSETSTATEFTRACEEVENT']._serialized_end=107175 + _globals['_SYNCPTFTRACEEVENT']._serialized_start=107177 + _globals['_SYNCPTFTRACEEVENT']._serialized_end=107229 + _globals['_SYNCTIMELINEFTRACEEVENT']._serialized_start=107231 + _globals['_SYNCTIMELINEFTRACEEVENT']._serialized_end=107285 + _globals['_SYNCWAITFTRACEEVENT']._serialized_start=107287 + _globals['_SYNCWAITFTRACEEVENT']._serialized_end=107353 + _globals['_RSSSTATTHROTTLEDFTRACEEVENT']._serialized_start=107355 + _globals['_RSSSTATTHROTTLEDFTRACEEVENT']._serialized_end=107443 + _globals['_SUSPENDRESUMEMINIMALFTRACEEVENT']._serialized_start=107445 + _globals['_SUSPENDRESUMEMINIMALFTRACEEVENT']._serialized_end=107493 + _globals['_ZEROFTRACEEVENT']._serialized_start=107495 + _globals['_ZEROFTRACEEVENT']._serialized_end=107568 + _globals['_TASKNEWTASKFTRACEEVENT']._serialized_start=107570 + _globals['_TASKNEWTASKFTRACEEVENT']._serialized_end=107665 + _globals['_TASKRENAMEFTRACEEVENT']._serialized_start=107667 + _globals['_TASKRENAMEFTRACEEVENT']._serialized_end=107760 + _globals['_TCPRETRANSMITSKBFTRACEEVENT']._serialized_start=107763 + _globals['_TCPRETRANSMITSKBFTRACEEVENT']._serialized_end=107900 + _globals['_THERMALTEMPERATUREFTRACEEVENT']._serialized_start=107902 + _globals['_THERMALTEMPERATUREFTRACEEVENT']._serialized_end=108000 + _globals['_CDEVUPDATEFTRACEEVENT']._serialized_start=108002 + _globals['_CDEVUPDATEFTRACEEVENT']._serialized_end=108055 + _globals['_THERMALEXYNOSACPMBULKFTRACEEVENT']._serialized_start=108058 + _globals['_THERMALEXYNOSACPMBULKFTRACEEVENT']._serialized_end=108286 + _globals['_THERMALEXYNOSACPMHIGHOVERHEADFTRACEEVENT']._serialized_start=108289 + _globals['_THERMALEXYNOSACPMHIGHOVERHEADFTRACEEVENT']._serialized_end=108451 + _globals['_HRTIMERSTARTFTRACEEVENT']._serialized_start=108453 + _globals['_HRTIMERSTARTFTRACEEVENT']._serialized_end=108565 + _globals['_HRTIMERCANCELFTRACEEVENT']._serialized_start=108567 + _globals['_HRTIMERCANCELFTRACEEVENT']._serialized_end=108610 + _globals['_HRTIMEREXPIREENTRYFTRACEEVENT']._serialized_start=108612 + _globals['_HRTIMEREXPIREENTRYFTRACEEVENT']._serialized_end=108691 + _globals['_HRTIMEREXPIREEXITFTRACEEVENT']._serialized_start=108693 + _globals['_HRTIMEREXPIREEXITFTRACEEVENT']._serialized_end=108740 + _globals['_TIMERSTARTFTRACEEVENT']._serialized_start=108743 + _globals['_TIMERSTARTFTRACEEVENT']._serialized_end=108887 + _globals['_TIMERCANCELFTRACEEVENT']._serialized_start=108889 + _globals['_TIMERCANCELFTRACEEVENT']._serialized_end=108928 + _globals['_TIMEREXPIREENTRYFTRACEEVENT']._serialized_start=108930 + _globals['_TIMEREXPIREENTRYFTRACEEVENT']._serialized_end=109022 + _globals['_TIMEREXPIREEXITFTRACEEVENT']._serialized_start=109024 + _globals['_TIMEREXPIREEXITFTRACEEVENT']._serialized_end=109067 + _globals['_TRUSTYSMCFTRACEEVENT']._serialized_start=109069 + _globals['_TRUSTYSMCFTRACEEVENT']._serialized_end=109139 + _globals['_TRUSTYSMCDONEFTRACEEVENT']._serialized_start=109141 + _globals['_TRUSTYSMCDONEFTRACEEVENT']._serialized_end=109180 + _globals['_TRUSTYSTDCALL32FTRACEEVENT']._serialized_start=109182 + _globals['_TRUSTYSTDCALL32FTRACEEVENT']._serialized_end=109258 + _globals['_TRUSTYSTDCALL32DONEFTRACEEVENT']._serialized_start=109260 + _globals['_TRUSTYSTDCALL32DONEFTRACEEVENT']._serialized_end=109305 + _globals['_TRUSTYSHAREMEMORYFTRACEEVENT']._serialized_start=109307 + _globals['_TRUSTYSHAREMEMORYFTRACEEVENT']._serialized_end=109379 + _globals['_TRUSTYSHAREMEMORYDONEFTRACEEVENT']._serialized_start=109381 + _globals['_TRUSTYSHAREMEMORYDONEFTRACEEVENT']._serialized_end=109486 + _globals['_TRUSTYRECLAIMMEMORYFTRACEEVENT']._serialized_start=109488 + _globals['_TRUSTYRECLAIMMEMORYFTRACEEVENT']._serialized_end=109532 + _globals['_TRUSTYRECLAIMMEMORYDONEFTRACEEVENT']._serialized_start=109534 + _globals['_TRUSTYRECLAIMMEMORYDONEFTRACEEVENT']._serialized_end=109595 + _globals['_TRUSTYIRQFTRACEEVENT']._serialized_start=109597 + _globals['_TRUSTYIRQFTRACEEVENT']._serialized_end=109632 + _globals['_TRUSTYIPCHANDLEEVENTFTRACEEVENT']._serialized_start=109634 + _globals['_TRUSTYIPCHANDLEEVENTFTRACEEVENT']._serialized_end=109717 + _globals['_TRUSTYIPCCONNECTFTRACEEVENT']._serialized_start=109719 + _globals['_TRUSTYIPCCONNECTFTRACEEVENT']._serialized_end=109791 + _globals['_TRUSTYIPCCONNECTENDFTRACEEVENT']._serialized_start=109793 + _globals['_TRUSTYIPCCONNECTENDFTRACEEVENT']._serialized_end=109867 + _globals['_TRUSTYIPCWRITEFTRACEEVENT']._serialized_start=109870 + _globals['_TRUSTYIPCWRITEFTRACEEVENT']._serialized_end=110000 + _globals['_TRUSTYIPCPOLLFTRACEEVENT']._serialized_start=110002 + _globals['_TRUSTYIPCPOLLFTRACEEVENT']._serialized_end=110079 + _globals['_TRUSTYIPCREADFTRACEEVENT']._serialized_start=110081 + _globals['_TRUSTYIPCREADFTRACEEVENT']._serialized_end=110139 + _globals['_TRUSTYIPCREADENDFTRACEEVENT']._serialized_start=110141 + _globals['_TRUSTYIPCREADENDFTRACEEVENT']._serialized_end=110255 + _globals['_TRUSTYIPCRXFTRACEEVENT']._serialized_start=110257 + _globals['_TRUSTYIPCRXFTRACEEVENT']._serialized_end=110329 + _globals['_TRUSTYENQUEUENOPFTRACEEVENT']._serialized_start=110331 + _globals['_TRUSTYENQUEUENOPFTRACEEVENT']._serialized_end=110402 + _globals['_UFSHCDCOMMANDFTRACEEVENT']._serialized_start=110405 + _globals['_UFSHCDCOMMANDFTRACEEVENT']._serialized_end=110591 + _globals['_UFSHCDCLKGATINGFTRACEEVENT']._serialized_start=110593 + _globals['_UFSHCDCLKGATINGFTRACEEVENT']._serialized_end=110654 + _globals['_V4L2QBUFFTRACEEVENT']._serialized_start=110657 + _globals['_V4L2QBUFFTRACEEVENT']._serialized_end=111068 + _globals['_V4L2DQBUFFTRACEEVENT']._serialized_start=111071 + _globals['_V4L2DQBUFFTRACEEVENT']._serialized_end=111483 + _globals['_VB2V4L2BUFQUEUEFTRACEEVENT']._serialized_start=111486 + _globals['_VB2V4L2BUFQUEUEFTRACEEVENT']._serialized_end=111856 + _globals['_VB2V4L2BUFDONEFTRACEEVENT']._serialized_start=111859 + _globals['_VB2V4L2BUFDONEFTRACEEVENT']._serialized_end=112228 + _globals['_VB2V4L2QBUFFTRACEEVENT']._serialized_start=112231 + _globals['_VB2V4L2QBUFFTRACEEVENT']._serialized_end=112597 + _globals['_VB2V4L2DQBUFFTRACEEVENT']._serialized_start=112600 + _globals['_VB2V4L2DQBUFFTRACEEVENT']._serialized_end=112967 + _globals['_VIRTIOGPUCMDQUEUEFTRACEEVENT']._serialized_start=112970 + _globals['_VIRTIOGPUCMDQUEUEFTRACEEVENT']._serialized_end=113135 + _globals['_VIRTIOGPUCMDRESPONSEFTRACEEVENT']._serialized_start=113138 + _globals['_VIRTIOGPUCMDRESPONSEFTRACEEVENT']._serialized_end=113306 + _globals['_VIRTIOVIDEOCMDFTRACEEVENT']._serialized_start=113308 + _globals['_VIRTIOVIDEOCMDFTRACEEVENT']._serialized_end=113368 + _globals['_VIRTIOVIDEOCMDDONEFTRACEEVENT']._serialized_start=113370 + _globals['_VIRTIOVIDEOCMDDONEFTRACEEVENT']._serialized_end=113434 + _globals['_VIRTIOVIDEORESOURCEQUEUEFTRACEEVENT']._serialized_start=113437 + _globals['_VIRTIOVIDEORESOURCEQUEUEFTRACEEVENT']._serialized_end=113633 + _globals['_VIRTIOVIDEORESOURCEQUEUEDONEFTRACEEVENT']._serialized_start=113636 + _globals['_VIRTIOVIDEORESOURCEQUEUEDONEFTRACEEVENT']._serialized_end=113836 + _globals['_MMVMSCANDIRECTRECLAIMBEGINFTRACEEVENT']._serialized_start=113838 + _globals['_MMVMSCANDIRECTRECLAIMBEGINFTRACEEVENT']._serialized_end=113934 + _globals['_MMVMSCANDIRECTRECLAIMENDFTRACEEVENT']._serialized_start=113936 + _globals['_MMVMSCANDIRECTRECLAIMENDFTRACEEVENT']._serialized_end=113995 + _globals['_MMVMSCANKSWAPDWAKEFTRACEEVENT']._serialized_start=113997 + _globals['_MMVMSCANKSWAPDWAKEFTRACEEVENT']._serialized_end=114069 + _globals['_MMVMSCANKSWAPDSLEEPFTRACEEVENT']._serialized_start=114071 + _globals['_MMVMSCANKSWAPDSLEEPFTRACEEVENT']._serialized_end=114116 + _globals['_MMSHRINKSLABSTARTFTRACEEVENT']._serialized_start=114119 + _globals['_MMSHRINKSLABSTARTFTRACEEVENT']._serialized_end=114352 + _globals['_MMSHRINKSLABENDFTRACEEVENT']._serialized_start=114355 + _globals['_MMSHRINKSLABENDFTRACEEVENT']._serialized_end=114500 + _globals['_MMVMSCANMEMCGRECLAIMBEGINFTRACEEVENT']._serialized_start=114502 + _globals['_MMVMSCANMEMCGRECLAIMBEGINFTRACEEVENT']._serialized_end=114597 + _globals['_MMVMSCANMEMCGRECLAIMENDFTRACEEVENT']._serialized_start=114599 + _globals['_MMVMSCANMEMCGRECLAIMENDFTRACEEVENT']._serialized_end=114657 + _globals['_WORKQUEUEACTIVATEWORKFTRACEEVENT']._serialized_start=114659 + _globals['_WORKQUEUEACTIVATEWORKFTRACEEVENT']._serialized_end=114725 + _globals['_WORKQUEUEEXECUTEENDFTRACEEVENT']._serialized_start=114727 + _globals['_WORKQUEUEEXECUTEENDFTRACEEVENT']._serialized_end=114791 + _globals['_WORKQUEUEEXECUTESTARTFTRACEEVENT']._serialized_start=114793 + _globals['_WORKQUEUEEXECUTESTARTFTRACEEVENT']._serialized_end=114859 + _globals['_WORKQUEUEQUEUEWORKFTRACEEVENT']._serialized_start=114861 + _globals['_WORKQUEUEQUEUEWORKFTRACEEVENT']._serialized_end=114973 + _globals['_FTRACEEVENT']._serialized_start=114977 + _globals['_FTRACEEVENT']._serialized_end=161572 + _globals['_FTRACECPUSTATS']._serialized_start=161575 + _globals['_FTRACECPUSTATS']._serialized_end=161768 + _globals['_FTRACEKPROBESTATS']._serialized_start=161770 + _globals['_FTRACEKPROBESTATS']._serialized_end=161819 + _globals['_FTRACESTATS']._serialized_start=161822 + _globals['_FTRACESTATS']._serialized_end=162405 + _globals['_FTRACESTATS_PHASE']._serialized_start=162343 + _globals['_FTRACESTATS_PHASE']._serialized_end=162405 + _globals['_FTRACEEVENTBUNDLE']._serialized_start=162408 + _globals['_FTRACEEVENTBUNDLE']._serialized_end=163488 + _globals['_FTRACEEVENTBUNDLE_COMPACTSCHED']._serialized_start=162946 + _globals['_FTRACEEVENTBUNDLE_COMPACTSCHED']._serialized_end=163312 + _globals['_FTRACEEVENTBUNDLE_FTRACEERROR']._serialized_start=163314 + _globals['_FTRACEEVENTBUNDLE_FTRACEERROR']._serialized_end=163398 + _globals['_FTRACEEVENTBUNDLE_GENERICEVENTDESCRIPTOR']._serialized_start=163400 + _globals['_FTRACEEVENTBUNDLE_GENERICEVENTDESCRIPTOR']._serialized_end=163488 + _globals['_GENERICGPUFREQUENCYEVENT']._serialized_start=163490 + _globals['_GENERICGPUFREQUENCYEVENT']._serialized_end=163555 + _globals['_GENERICKERNELCPUFREQUENCYEVENT']._serialized_start=163557 + _globals['_GENERICKERNELCPUFREQUENCYEVENT']._serialized_end=163619 + _globals['_GENERICKERNELTASKSTATEEVENT']._serialized_start=163622 + _globals['_GENERICKERNELTASKSTATEEVENT']._serialized_end=164040 + _globals['_GENERICKERNELTASKSTATEEVENT_TASKSTATEENUM']._serialized_start=163783 + _globals['_GENERICKERNELTASKSTATEEVENT_TASKSTATEENUM']._serialized_end=164040 + _globals['_GENERICKERNELTASKRENAMEEVENT']._serialized_start=164042 + _globals['_GENERICKERNELTASKRENAMEEVENT']._serialized_end=164099 + _globals['_GENERICKERNELPROCESSTREE']._serialized_start=164102 + _globals['_GENERICKERNELPROCESSTREE']._serialized_end=164411 + _globals['_GENERICKERNELPROCESSTREE_THREAD']._serialized_start=164267 + _globals['_GENERICKERNELPROCESSTREE_THREAD']._serialized_end=164356 + _globals['_GENERICKERNELPROCESSTREE_PROCESS']._serialized_start=164358 + _globals['_GENERICKERNELPROCESSTREE_PROCESS']._serialized_end=164411 + _globals['_GPUCOUNTEREVENT']._serialized_start=164414 + _globals['_GPUCOUNTEREVENT']._serialized_end=164709 + _globals['_GPUCOUNTEREVENT_GPUCOUNTER']._serialized_start=164615 + _globals['_GPUCOUNTEREVENT_GPUCOUNTER']._serialized_end=164701 + _globals['_INTERNEDGPUCOUNTERDESCRIPTOR']._serialized_start=164711 + _globals['_INTERNEDGPUCOUNTERDESCRIPTOR']._serialized_end=164837 + _globals['_GPULOG']._serialized_start=164840 + _globals['_GPULOG']._serialized_end=165100 + _globals['_GPULOG_SEVERITY']._serialized_start=164937 + _globals['_GPULOG_SEVERITY']._serialized_end=165100 + _globals['_GPUMEMTOTALEVENT']._serialized_start=165102 + _globals['_GPUMEMTOTALEVENT']._serialized_end=165163 + _globals['_GPURENDERSTAGEEVENT']._serialized_start=165166 + _globals['_GPURENDERSTAGEEVENT']._serialized_end=166713 + _globals['_GPURENDERSTAGEEVENT_EXTRADATA']._serialized_start=165829 + _globals['_GPURENDERSTAGEEVENT_EXTRADATA']._serialized_end=165869 + _globals['_GPURENDERSTAGEEVENT_DIM3']._serialized_start=165871 + _globals['_GPURENDERSTAGEEVENT_DIM3']._serialized_end=165910 + _globals['_GPURENDERSTAGEEVENT_EXTRACOMPUTEARG']._serialized_start=165913 + _globals['_GPURENDERSTAGEEVENT_EXTRACOMPUTEARG']._serialized_end=166108 + _globals['_GPURENDERSTAGEEVENT_COMPUTEKERNELLAUNCH']._serialized_start=166111 + _globals['_GPURENDERSTAGEEVENT_COMPUTEKERNELLAUNCH']._serialized_end=166329 + _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS']._serialized_start=166332 + _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS']._serialized_end=166693 + _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS_CONTEXTSPEC']._serialized_start=166600 + _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS_CONTEXTSPEC']._serialized_end=166643 + _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS_DESCRIPTION']._serialized_start=166645 + _globals['_GPURENDERSTAGEEVENT_SPECIFICATIONS_DESCRIPTION']._serialized_end=166693 + _globals['_INTERNEDGRAPHICSCONTEXT']._serialized_start=166716 + _globals['_INTERNEDGRAPHICSCONTEXT']._serialized_end=166905 + _globals['_INTERNEDGRAPHICSCONTEXT_API']._serialized_start=166828 + _globals['_INTERNEDGRAPHICSCONTEXT_API']._serialized_end=166905 + _globals['_INTERNEDGPURENDERSTAGESPECIFICATION']._serialized_start=166908 + _globals['_INTERNEDGPURENDERSTAGESPECIFICATION']._serialized_end=167146 + _globals['_INTERNEDGPURENDERSTAGESPECIFICATION_RENDERSTAGECATEGORY']._serialized_start=167087 + _globals['_INTERNEDGPURENDERSTAGESPECIFICATION_RENDERSTAGECATEGORY']._serialized_end=167146 + _globals['_INTERNEDCOMPUTEKERNEL']._serialized_start=167149 + _globals['_INTERNEDCOMPUTEKERNEL']._serialized_end=167305 + _globals['_INTERNEDCOMPUTEARGNAME']._serialized_start=167307 + _globals['_INTERNEDCOMPUTEARGNAME']._serialized_end=167358 + _globals['_VULKANAPIEVENT']._serialized_start=167361 + _globals['_VULKANAPIEVENT']._serialized_end=167804 + _globals['_VULKANAPIEVENT_VKDEBUGUTILSOBJECTNAME']._serialized_start=167547 + _globals['_VULKANAPIEVENT_VKDEBUGUTILSOBJECTNAME']._serialized_end=167661 + _globals['_VULKANAPIEVENT_VKQUEUESUBMIT']._serialized_start=167664 + _globals['_VULKANAPIEVENT_VKQUEUESUBMIT']._serialized_end=167795 + _globals['_VULKANMEMORYEVENTANNOTATION']._serialized_start=167806 + _globals['_VULKANMEMORYEVENTANNOTATION']._serialized_end=167928 + _globals['_VULKANMEMORYEVENT']._serialized_start=167931 + _globals['_VULKANMEMORYEVENT']._serialized_end=168803 + _globals['_VULKANMEMORYEVENT_SOURCE']._serialized_start=168416 + _globals['_VULKANMEMORYEVENT_SOURCE']._serialized_end=168549 + _globals['_VULKANMEMORYEVENT_OPERATION']._serialized_start=168551 + _globals['_VULKANMEMORYEVENT_OPERATION']._serialized_end=168668 + _globals['_VULKANMEMORYEVENT_ALLOCATIONSCOPE']._serialized_start=168671 + _globals['_VULKANMEMORYEVENT_ALLOCATIONSCOPE']._serialized_end=168803 + _globals['_INTERNEDSTRING']._serialized_start=168805 + _globals['_INTERNEDSTRING']._serialized_end=168847 + _globals['_LINE']._serialized_start=168849 + _globals['_LINE']._serialized_end=168925 + _globals['_ADDRESSSYMBOLS']._serialized_start=168927 + _globals['_ADDRESSSYMBOLS']._serialized_end=168998 + _globals['_MODULESYMBOLS']._serialized_start=169000 + _globals['_MODULESYMBOLS']._serialized_end=169105 + _globals['_MAPPING']._serialized_start=169108 + _globals['_MAPPING']._serialized_end=169264 + _globals['_FRAME']._serialized_start=169267 + _globals['_FRAME']._serialized_end=169601 + _globals['_FRAME_KIND']._serialized_start=169462 + _globals['_FRAME_KIND']._serialized_end=169587 + _globals['_CALLSTACK']._serialized_start=169603 + _globals['_CALLSTACK']._serialized_end=169646 + _globals['_INLINECALLSTACK']._serialized_start=169649 + _globals['_INLINECALLSTACK']._serialized_end=169796 + _globals['_INLINECALLSTACK_FRAME']._serialized_start=169724 + _globals['_INLINECALLSTACK_FRAME']._serialized_end=169796 + _globals['_STACKSAMPLE']._serialized_start=169799 + _globals['_STACKSAMPLE']._serialized_end=171463 + _globals['_STACKSAMPLE_TASKCONTEXT']._serialized_start=170431 + _globals['_STACKSAMPLE_TASKCONTEXT']._serialized_end=170501 + _globals['_STACKSAMPLE_ASYNCCONTEXTDESCRIPTOR']._serialized_start=170503 + _globals['_STACKSAMPLE_ASYNCCONTEXTDESCRIPTOR']._serialized_end=170588 + _globals['_STACKSAMPLE_EXECUTIONCONTEXT']._serialized_start=170590 + _globals['_STACKSAMPLE_EXECUTIONCONTEXT']._serialized_end=170683 + _globals['_STACKSAMPLE_COUNTERDESCRIPTOR']._serialized_start=170686 + _globals['_STACKSAMPLE_COUNTERDESCRIPTOR']._serialized_end=170997 + _globals['_STACKSAMPLE_COUNTERDESCRIPTOR_SCOPE']._serialized_start=170920 + _globals['_STACKSAMPLE_COUNTERDESCRIPTOR_SCOPE']._serialized_end=170983 + _globals['_STACKSAMPLE_MODE']._serialized_start=170999 + _globals['_STACKSAMPLE_MODE']._serialized_end=171120 + _globals['_STACKSAMPLE_UNIT']._serialized_start=171123 + _globals['_STACKSAMPLE_UNIT']._serialized_end=171345 + _globals['_STACKSAMPLEDEFAULTS']._serialized_start=171466 + _globals['_STACKSAMPLEDEFAULTS']._serialized_end=171657 + _globals['_HISTOGRAMNAME']._serialized_start=171659 + _globals['_HISTOGRAMNAME']._serialized_end=171701 + _globals['_CHROMEHISTOGRAMSAMPLE']._serialized_start=171703 + _globals['_CHROMEHISTOGRAMSAMPLE']._serialized_end=171793 + _globals['_DEBUGANNOTATION']._serialized_start=171796 + _globals['_DEBUGANNOTATION']._serialized_end=172736 + _globals['_DEBUGANNOTATION_NESTEDVALUE']._serialized_start=172308 + _globals['_DEBUGANNOTATION_NESTEDVALUE']._serialized_end=172688 + _globals['_DEBUGANNOTATION_NESTEDVALUE_NESTEDTYPE']._serialized_start=172638 + _globals['_DEBUGANNOTATION_NESTEDVALUE_NESTEDTYPE']._serialized_end=172688 + _globals['_DEBUGANNOTATIONNAME']._serialized_start=172738 + _globals['_DEBUGANNOTATIONNAME']._serialized_end=172786 + _globals['_DEBUGANNOTATIONVALUETYPENAME']._serialized_start=172788 + _globals['_DEBUGANNOTATIONVALUETYPENAME']._serialized_end=172845 + _globals['_LOGMESSAGE']._serialized_start=172848 + _globals['_LOGMESSAGE']._serialized_end=173107 + _globals['_LOGMESSAGE_PRIORITY']._serialized_start=172962 + _globals['_LOGMESSAGE_PRIORITY']._serialized_end=173107 + _globals['_LOGMESSAGEBODY']._serialized_start=173109 + _globals['_LOGMESSAGEBODY']._serialized_end=173152 + _globals['_UNSYMBOLIZEDSOURCELOCATION']._serialized_start=173154 + _globals['_UNSYMBOLIZEDSOURCELOCATION']._serialized_end=173231 + _globals['_SOURCELOCATION']._serialized_start=173233 + _globals['_SOURCELOCATION']._serialized_end=173325 + _globals['_CHROMEACTIVEPROCESSES']._serialized_start=173327 + _globals['_CHROMEACTIVEPROCESSES']._serialized_end=173363 + _globals['_CHROMEAPPLICATIONSTATEINFO']._serialized_start=173366 + _globals['_CHROMEAPPLICATIONSTATEINFO']._serialized_end=173732 + _globals['_CHROMEAPPLICATIONSTATEINFO_CHROMEAPPLICATIONSTATE']._serialized_start=173492 + _globals['_CHROMEAPPLICATIONSTATEINFO_CHROMEAPPLICATIONSTATE']._serialized_end=173732 + _globals['_CHROMECOMPOSITORSCHEDULERSTATE']._serialized_start=173735 + _globals['_CHROMECOMPOSITORSCHEDULERSTATE']._serialized_end=174822 + _globals['_CHROMECOMPOSITORSCHEDULERSTATE_BEGINIMPLFRAMEDEADLINEMODE']._serialized_start=174626 + _globals['_CHROMECOMPOSITORSCHEDULERSTATE_BEGINIMPLFRAMEDEADLINEMODE']._serialized_end=174816 + _globals['_CHROMECOMPOSITORSTATEMACHINE']._serialized_start=174825 + _globals['_CHROMECOMPOSITORSTATEMACHINE']._serialized_end=178535 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE']._serialized_start=175016 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE']._serialized_end=176315 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_BEGINIMPLFRAMESTATE']._serialized_start=175555 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_BEGINIMPLFRAMESTATE']._serialized_end=175716 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_BEGINMAINFRAMESTATE']._serialized_start=175719 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_BEGINMAINFRAMESTATE']._serialized_end=175866 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_LAYERTREEFRAMESINKSTATE']._serialized_start=175869 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_LAYERTREEFRAMESINKSTATE']._serialized_end=176113 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_FORCEDREDRAWONTIMEOUTSTATE']._serialized_start=176116 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MAJORSTATE_FORCEDREDRAWONTIMEOUTSTATE']._serialized_end=176315 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE']._serialized_start=176318 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE']._serialized_end=178535 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE_TREEPRIORITY']._serialized_start=178212 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE_TREEPRIORITY']._serialized_end=178396 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE_SCROLLHANDLERSTATE']._serialized_start=178399 + _globals['_CHROMECOMPOSITORSTATEMACHINE_MINORSTATE_SCROLLHANDLERSTATE']._serialized_end=178529 + _globals['_BEGINFRAMEARGS']._serialized_start=178538 + _globals['_BEGINFRAMEARGS']._serialized_end=179092 + _globals['_BEGINFRAMEARGS_BEGINFRAMEARGSTYPE']._serialized_start=178914 + _globals['_BEGINFRAMEARGS_BEGINFRAMEARGSTYPE']._serialized_end=179076 + _globals['_BEGINIMPLFRAMEARGS']._serialized_start=179095 + _globals['_BEGINIMPLFRAMEARGS']._serialized_end=179671 + _globals['_BEGINIMPLFRAMEARGS_TIMESTAMPSINUS']._serialized_start=179412 + _globals['_BEGINIMPLFRAMEARGS_TIMESTAMPSINUS']._serialized_end=179605 + _globals['_BEGINIMPLFRAMEARGS_STATE']._serialized_start=179607 + _globals['_BEGINIMPLFRAMEARGS_STATE']._serialized_end=179663 + _globals['_BEGINFRAMEOBSERVERSTATE']._serialized_start=179673 + _globals['_BEGINFRAMEOBSERVERSTATE']._serialized_end=179796 + _globals['_BEGINFRAMESOURCESTATE']._serialized_start=179799 + _globals['_BEGINFRAMESOURCESTATE']._serialized_end=179944 + _globals['_COMPOSITORTIMINGHISTORY']._serialized_start=179947 + _globals['_COMPOSITORTIMINGHISTORY']._serialized_end=180327 + _globals['_CHROMECONTENTSETTINGSEVENTINFO']._serialized_start=180329 + _globals['_CHROMECONTENTSETTINGSEVENTINFO']._serialized_end=180391 + _globals['_CHROMEFRAMEREPORTER']._serialized_start=180394 + _globals['_CHROMEFRAMEREPORTER']._serialized_end=181514 + _globals['_CHROMEFRAMEREPORTER_STATE']._serialized_start=181109 + _globals['_CHROMEFRAMEREPORTER_STATE']._serialized_end=181218 + _globals['_CHROMEFRAMEREPORTER_FRAMEDROPREASON']._serialized_start=181220 + _globals['_CHROMEFRAMEREPORTER_FRAMEDROPREASON']._serialized_end=181346 + _globals['_CHROMEFRAMEREPORTER_SCROLLSTATE']._serialized_start=181348 + _globals['_CHROMEFRAMEREPORTER_SCROLLSTATE']._serialized_end=181471 + _globals['_CHROMEFRAMEREPORTER_FRAMETYPE']._serialized_start=181473 + _globals['_CHROMEFRAMEREPORTER_FRAMETYPE']._serialized_end=181510 + _globals['_CHROMEKEYEDSERVICE']._serialized_start=181516 + _globals['_CHROMEKEYEDSERVICE']._serialized_end=181550 + _globals['_CHROMELATENCYINFO']._serialized_start=181553 + _globals['_CHROMELATENCYINFO']._serialized_end=183335 + _globals['_CHROMELATENCYINFO_COMPONENTINFO']._serialized_start=181882 + _globals['_CHROMELATENCYINFO_COMPONENTINFO']._serialized_end=181995 + _globals['_CHROMELATENCYINFO_STEP']._serialized_start=181998 + _globals['_CHROMELATENCYINFO_STEP']._serialized_end=182400 + _globals['_CHROMELATENCYINFO_LATENCYCOMPONENTTYPE']._serialized_start=182403 + _globals['_CHROMELATENCYINFO_LATENCYCOMPONENTTYPE']._serialized_end=183160 + _globals['_CHROMELATENCYINFO_INPUTTYPE']._serialized_start=183163 + _globals['_CHROMELATENCYINFO_INPUTTYPE']._serialized_end=183335 + _globals['_CHROMELEGACYIPC']._serialized_start=183338 + _globals['_CHROMELEGACYIPC']._serialized_end=184312 + _globals['_CHROMELEGACYIPC_MESSAGECLASS']._serialized_start=183450 + _globals['_CHROMELEGACYIPC_MESSAGECLASS']._serialized_end=184312 + _globals['_CHROMEMESSAGEPUMP']._serialized_start=184314 + _globals['_CHROMEMESSAGEPUMP']._serialized_end=184398 + _globals['_CHROMEMOJOEVENTINFO']._serialized_start=184401 + _globals['_CHROMEMOJOEVENTINFO']._serialized_end=184605 + _globals['_CHROMERENDERERSCHEDULERSTATE']._serialized_start=184607 + _globals['_CHROMERENDERERSCHEDULERSTATE']._serialized_end=184733 + _globals['_CHROMEUSEREVENT']._serialized_start=184735 + _globals['_CHROMEUSEREVENT']._serialized_end=184789 + _globals['_CHROMEWINDOWHANDLEEVENTINFO']._serialized_start=184791 + _globals['_CHROMEWINDOWHANDLEEVENTINFO']._serialized_end=184871 + _globals['_SCREENSHOT']._serialized_start=184873 + _globals['_SCREENSHOT']._serialized_end=184942 + _globals['_TASKEXECUTION']._serialized_start=184944 + _globals['_TASKEXECUTION']._serialized_end=184984 + _globals['_TRACKEVENT']._serialized_start=184987 + _globals['_TRACKEVENT']._serialized_end=188435 + _globals['_TRACKEVENT_INLINECALLSTACK']._serialized_start=187293 + _globals['_TRACKEVENT_INLINECALLSTACK']._serialized_end=187451 + _globals['_TRACKEVENT_INLINECALLSTACK_FRAME']._serialized_start=169724 + _globals['_TRACKEVENT_INLINECALLSTACK_FRAME']._serialized_end=169796 + _globals['_TRACKEVENT_LEGACYEVENT']._serialized_start=187454 + _globals['_TRACKEVENT_LEGACYEVENT']._serialized_end=188136 + _globals['_TRACKEVENT_LEGACYEVENT_FLOWDIRECTION']._serialized_start=187945 + _globals['_TRACKEVENT_LEGACYEVENT_FLOWDIRECTION']._serialized_end=188025 + _globals['_TRACKEVENT_LEGACYEVENT_INSTANTEVENTSCOPE']._serialized_start=188027 + _globals['_TRACKEVENT_LEGACYEVENT_INSTANTEVENTSCOPE']._serialized_end=188124 + _globals['_TRACKEVENT_TYPE']._serialized_start=188138 + _globals['_TRACKEVENT_TYPE']._serialized_end=188260 + _globals['_TRACKEVENTDEFAULTS']._serialized_start=188437 + _globals['_TRACKEVENTDEFAULTS']._serialized_end=188554 + _globals['_EVENTCATEGORY']._serialized_start=188556 + _globals['_EVENTCATEGORY']._serialized_end=188598 + _globals['_EVENTNAME']._serialized_start=188600 + _globals['_EVENTNAME']._serialized_end=188638 + _globals['_INTERNEDDATA']._serialized_start=188641 + _globals['_INTERNEDDATA']._serialized_end=190758 + _globals['_SYSTEMDJOURNALDEVENT']._serialized_start=190761 + _globals['_SYSTEMDJOURNALDEVENT']._serialized_end=191004 + _globals['_MEMORYTRACKERSNAPSHOT']._serialized_start=191007 + _globals['_MEMORYTRACKERSNAPSHOT']._serialized_end=192015 + _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT']._serialized_start=191222 + _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT']._serialized_end=191940 + _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE']._serialized_start=191436 + _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE']._serialized_end=191847 + _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE_MEMORYNODEENTRY']._serialized_start=191620 + _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE_MEMORYNODEENTRY']._serialized_end=191847 + _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE_MEMORYNODEENTRY_UNITS']._serialized_start=191801 + _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYNODE_MEMORYNODEENTRY_UNITS']._serialized_end=191847 + _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYEDGE']._serialized_start=191849 + _globals['_MEMORYTRACKERSNAPSHOT_PROCESSSNAPSHOT_MEMORYEDGE']._serialized_end=191940 + _globals['_MEMORYTRACKERSNAPSHOT_LEVELOFDETAIL']._serialized_start=191942 + _globals['_MEMORYTRACKERSNAPSHOT_LEVELOFDETAIL']._serialized_end=192015 + _globals['_CONCURRENTSESSIONEVENT']._serialized_start=192018 + _globals['_CONCURRENTSESSIONEVENT']._serialized_end=192355 + _globals['_CONCURRENTSESSIONEVENT_STATE']._serialized_start=192197 + _globals['_CONCURRENTSESSIONEVENT_STATE']._serialized_end=192355 + _globals['_PERFETTOMETATRACE']._serialized_start=192358 + _globals['_PERFETTOMETATRACE']._serialized_end=192903 + _globals['_PERFETTOMETATRACE_ARG']._serialized_start=192715 + _globals['_PERFETTOMETATRACE_ARG']._serialized_end=192842 + _globals['_PERFETTOMETATRACE_INTERNEDSTRING']._serialized_start=192844 + _globals['_PERFETTOMETATRACE_INTERNEDSTRING']._serialized_end=192888 + _globals['_TRACEPROVENANCE']._serialized_start=192906 + _globals['_TRACEPROVENANCE']._serialized_end=193098 + _globals['_TRACEPROVENANCE_SEQUENCE']._serialized_start=192983 + _globals['_TRACEPROVENANCE_SEQUENCE']._serialized_end=193026 + _globals['_TRACEPROVENANCE_BUFFER']._serialized_start=193028 + _globals['_TRACEPROVENANCE_BUFFER']._serialized_end=193098 + _globals['_TRACINGSERVICEEVENT']._serialized_start=193101 + _globals['_TRACINGSERVICEEVENT']._serialized_end=193751 + _globals['_TRACINGSERVICEEVENT_DATASOURCES']._serialized_start=193579 + _globals['_TRACINGSERVICEEVENT_DATASOURCES']._serialized_end=193737 + _globals['_TRACINGSERVICEEVENT_DATASOURCES_DATASOURCE']._serialized_start=193676 + _globals['_TRACINGSERVICEEVENT_DATASOURCES_DATASOURCE']._serialized_end=193737 + _globals['_ANDROIDENERGYCONSUMER']._serialized_start=193753 + _globals['_ANDROIDENERGYCONSUMER']._serialized_end=193849 + _globals['_ANDROIDENERGYCONSUMERDESCRIPTOR']._serialized_start=193851 + _globals['_ANDROIDENERGYCONSUMERDESCRIPTOR']._serialized_end=193950 + _globals['_ANDROIDENERGYESTIMATIONBREAKDOWN']._serialized_start=193953 + _globals['_ANDROIDENERGYESTIMATIONBREAKDOWN']._serialized_end=194273 + _globals['_ANDROIDENERGYESTIMATIONBREAKDOWN_ENERGYUIDBREAKDOWN']._serialized_start=194220 + _globals['_ANDROIDENERGYESTIMATIONBREAKDOWN_ENERGYUIDBREAKDOWN']._serialized_end=194273 + _globals['_ENTITYSTATERESIDENCY']._serialized_start=194276 + _globals['_ENTITYSTATERESIDENCY']._serialized_end=194719 + _globals['_ENTITYSTATERESIDENCY_POWERENTITYSTATE']._serialized_start=194457 + _globals['_ENTITYSTATERESIDENCY_POWERENTITYSTATE']._serialized_end=194559 + _globals['_ENTITYSTATERESIDENCY_STATERESIDENCY']._serialized_start=194562 + _globals['_ENTITYSTATERESIDENCY_STATERESIDENCY']._serialized_end=194719 + _globals['_BATTERYCOUNTERS']._serialized_start=194722 + _globals['_BATTERYCOUNTERS']._serialized_end=194899 + _globals['_POWERRAILS']._serialized_start=194902 + _globals['_POWERRAILS']._serialized_end=195229 + _globals['_POWERRAILS_RAILDESCRIPTOR']._serialized_start=195068 + _globals['_POWERRAILS_RAILDESCRIPTOR']._serialized_end=195162 + _globals['_POWERRAILS_ENERGYDATA']._serialized_start=195164 + _globals['_POWERRAILS_ENERGYDATA']._serialized_end=195229 + _globals['_JAVAFRAME']._serialized_start=195231 + _globals['_JAVAFRAME']._serialized_end=195305 + _globals['_JAVASTACK']._serialized_start=195307 + _globals['_JAVASTACK']._serialized_end=195362 + _globals['_ARTPROCESSMETADATA']._serialized_start=195365 + _globals['_ARTPROCESSMETADATA']._serialized_end=195630 + _globals['_OBFUSCATEDMEMBER']._serialized_start=195633 + _globals['_OBFUSCATEDMEMBER']._serialized_end=195815 + _globals['_OBFUSCATEDCLASS']._serialized_start=195818 + _globals['_OBFUSCATEDCLASS']._serialized_end=196013 + _globals['_DEOBFUSCATIONMAPPING']._serialized_start=196016 + _globals['_DEOBFUSCATIONMAPPING']._serialized_end=196144 + _globals['_PROFILEPACKET']._serialized_start=196147 + _globals['_PROFILEPACKET']._serialized_end=197640 + _globals['_PROFILEPACKET_HEAPSAMPLE']._serialized_start=196455 + _globals['_PROFILEPACKET_HEAPSAMPLE']._serialized_end=196641 + _globals['_PROFILEPACKET_HISTOGRAM']._serialized_start=196644 + _globals['_PROFILEPACKET_HISTOGRAM']._serialized_end=196787 + _globals['_PROFILEPACKET_HISTOGRAM_BUCKET']._serialized_start=196723 + _globals['_PROFILEPACKET_HISTOGRAM_BUCKET']._serialized_end=196787 + _globals['_PROFILEPACKET_PROCESSSTATS']._serialized_start=196790 + _globals['_PROFILEPACKET_PROCESSSTATS']._serialized_end=197012 + _globals['_PROFILEPACKET_PROCESSHEAPSAMPLES']._serialized_start=197015 + _globals['_PROFILEPACKET_PROCESSHEAPSAMPLES']._serialized_end=197640 + _globals['_PROFILEPACKET_PROCESSHEAPSAMPLES_CLIENTERROR']._serialized_start=197535 + _globals['_PROFILEPACKET_PROCESSHEAPSAMPLES_CLIENTERROR']._serialized_end=197640 + _globals['_STREAMINGALLOCATION']._serialized_start=197643 + _globals['_STREAMINGALLOCATION']._serialized_end=197800 + _globals['_STREAMINGFREE']._serialized_start=197802 + _globals['_STREAMINGFREE']._serialized_end=197876 + _globals['_STREAMINGPROFILEPACKET']._serialized_start=197878 + _globals['_STREAMINGPROFILEPACKET']._serialized_end=197979 + _globals['_PROFILING']._serialized_start=197982 + _globals['_PROFILING']._serialized_end=198638 + _globals['_PROFILING_CPUMODE']._serialized_start=197995 + _globals['_PROFILING_CPUMODE']._serialized_end=198119 + _globals['_PROFILING_STACKUNWINDERROR']._serialized_start=198122 + _globals['_PROFILING_STACKUNWINDERROR']._serialized_end=198638 + _globals['_PERFSAMPLE']._serialized_start=198641 + _globals['_PERFSAMPLE']._serialized_end=199520 + _globals['_PERFSAMPLE_PRODUCEREVENT']._serialized_start=199065 + _globals['_PERFSAMPLE_PRODUCEREVENT']._serialized_end=199285 + _globals['_PERFSAMPLE_PRODUCEREVENT_DATASOURCESTOPREASON']._serialized_start=199176 + _globals['_PERFSAMPLE_PRODUCEREVENT_DATASOURCESTOPREASON']._serialized_end=199254 + _globals['_PERFSAMPLE_SAMPLESKIPREASON']._serialized_start=199288 + _globals['_PERFSAMPLE_SAMPLESKIPREASON']._serialized_end=199461 + _globals['_PERFSAMPLEDEFAULTS']._serialized_start=199523 + _globals['_PERFSAMPLEDEFAULTS']._serialized_end=199709 + _globals['_SMAPSENTRY']._serialized_start=199712 + _globals['_SMAPSENTRY']._serialized_end=200099 + _globals['_PACKEDSMAPS']._serialized_start=200102 + _globals['_PACKEDSMAPS']._serialized_end=200487 + _globals['_SMAPSPACKET']._serialized_start=200490 + _globals['_SMAPSPACKET']._serialized_end=200838 + _globals['_SMAPSPACKET_RECORDINGTYPE']._serialized_start=200687 + _globals['_SMAPSPACKET_RECORDINGTYPE']._serialized_end=200838 + _globals['_PROCESSSTATS']._serialized_start=200841 + _globals['_PROCESSSTATS']._serialized_end=201668 + _globals['_PROCESSSTATS_THREAD']._serialized_start=200949 + _globals['_PROCESSSTATS_THREAD']._serialized_end=200988 + _globals['_PROCESSSTATS_FDINFO']._serialized_start=200990 + _globals['_PROCESSSTATS_FDINFO']._serialized_end=201024 + _globals['_PROCESSSTATS_PROCESS']._serialized_start=201027 + _globals['_PROCESSSTATS_PROCESS']._serialized_end=201668 + _globals['_PROCESSTREE']._serialized_start=201671 + _globals['_PROCESSTREE']._serialized_end=202063 + _globals['_PROCESSTREE_THREAD']._serialized_start=201831 + _globals['_PROCESSTREE_THREAD']._serialized_end=201895 + _globals['_PROCESSTREE_PROCESS']._serialized_start=201898 + _globals['_PROCESSTREE_PROCESS']._serialized_end=202063 + _globals['_REMOTECLOCKSYNC']._serialized_start=202066 + _globals['_REMOTECLOCKSYNC']._serialized_end=202277 + _globals['_REMOTECLOCKSYNC_SYNCEDCLOCKS']._serialized_start=202155 + _globals['_REMOTECLOCKSYNC_SYNCEDCLOCKS']._serialized_end=202277 + _globals['_ATOM']._serialized_start=202279 + _globals['_ATOM']._serialized_end=202285 + _globals['_STATSDATOM']._serialized_start=202287 + _globals['_STATSDATOM']._serialized_end=202361 + _globals['_SYSSTATS']._serialized_start=202364 + _globals['_SYSSTATS']._serialized_end=204512 + _globals['_SYSSTATS_MEMINFOVALUE']._serialized_start=203207 + _globals['_SYSSTATS_MEMINFOVALUE']._serialized_end=203283 + _globals['_SYSSTATS_VMSTATVALUE']._serialized_start=203285 + _globals['_SYSSTATS_VMSTATVALUE']._serialized_end=203359 + _globals['_SYSSTATS_CPUTIMES']._serialized_start=203362 + _globals['_SYSSTATS_CPUTIMES']._serialized_end=203542 + _globals['_SYSSTATS_INTERRUPTCOUNT']._serialized_start=203544 + _globals['_SYSSTATS_INTERRUPTCOUNT']._serialized_end=203588 + _globals['_SYSSTATS_DEVFREQVALUE']._serialized_start=203590 + _globals['_SYSSTATS_DEVFREQVALUE']._serialized_end=203632 + _globals['_SYSSTATS_BUDDYINFO']._serialized_start=203634 + _globals['_SYSSTATS_BUDDYINFO']._serialized_end=203694 + _globals['_SYSSTATS_DISKSTAT']._serialized_start=203697 + _globals['_SYSSTATS_DISKSTAT']._serialized_end=203912 + _globals['_SYSSTATS_PSISAMPLE']._serialized_start=203915 + _globals['_SYSSTATS_PSISAMPLE']._serialized_end=204223 + _globals['_SYSSTATS_PSISAMPLE_PSIRESOURCE']._serialized_start=204014 + _globals['_SYSSTATS_PSISAMPLE_PSIRESOURCE']._serialized_end=204223 + _globals['_SYSSTATS_THERMALZONE']._serialized_start=204225 + _globals['_SYSSTATS_THERMALZONE']._serialized_end=204280 + _globals['_SYSSTATS_CPUIDLESTATEENTRY']._serialized_start=204282 + _globals['_SYSSTATS_CPUIDLESTATEENTRY']._serialized_end=204337 + _globals['_SYSSTATS_CPUIDLESTATE']._serialized_start=204339 + _globals['_SYSSTATS_CPUIDLESTATE']._serialized_end=204443 + _globals['_SYSSTATS_SLABINFO']._serialized_start=204445 + _globals['_SYSSTATS_SLABINFO']._serialized_end=204512 + _globals['_CPUINFO']._serialized_start=204515 + _globals['_CPUINFO']._serialized_end=204847 + _globals['_CPUINFO_ARMCPUIDENTIFIER']._serialized_start=204570 + _globals['_CPUINFO_ARMCPUIDENTIFIER']._serialized_end=204680 + _globals['_CPUINFO_CPU']._serialized_start=204683 + _globals['_CPUINFO_CPU']._serialized_end=204847 + _globals['_GPUINFO']._serialized_start=204850 + _globals['_GPUINFO']._serialized_end=205108 + _globals['_GPUINFO_GPU']._serialized_start=204906 + _globals['_GPUINFO_GPU']._serialized_end=205108 + _globals['_GPUINFO_GPU_KEYVALUE']._serialized_start=205070 + _globals['_GPUINFO_GPU_KEYVALUE']._serialized_end=205108 + _globals['_INTERRUPTINFO']._serialized_start=205111 + _globals['_INTERRUPTINFO']._serialized_end=205246 + _globals['_INTERRUPTINFO_INTERRUPTMAPPING']._serialized_start=205198 + _globals['_INTERRUPTINFO_INTERRUPTMAPPING']._serialized_end=205246 + _globals['_TESTEVENT']._serialized_start=205249 + _globals['_TESTEVENT']._serialized_end=206351 + _globals['_TESTEVENT_TESTPAYLOAD']._serialized_start=205537 + _globals['_TESTEVENT_TESTPAYLOAD']._serialized_end=205779 + _globals['_TESTEVENT_PROTOVMMESSAGE']._serialized_start=205782 + _globals['_TESTEVENT_PROTOVMMESSAGE']._serialized_end=205932 + _globals['_TESTEVENT_PROTOVMMESSAGE_PROTOVMSUBMESSAGE']._serialized_start=205893 + _globals['_TESTEVENT_PROTOVMMESSAGE_PROTOVMSUBMESSAGE']._serialized_end=205932 + _globals['_TESTEVENT_PROTOVMPATCH']._serialized_start=205935 + _globals['_TESTEVENT_PROTOVMPATCH']._serialized_end=206152 + _globals['_TESTEVENT_PROTOVMINCREMENTALSTATE']._serialized_start=206155 + _globals['_TESTEVENT_PROTOVMINCREMENTALSTATE']._serialized_end=206351 + _globals['_TRACEPACKETDEFAULTS']._serialized_start=206354 + _globals['_TRACEPACKETDEFAULTS']._serialized_end=206665 + _globals['_TRACEUUID']._serialized_start=206667 + _globals['_TRACEUUID']._serialized_end=206704 + _globals['_PROCESSDESCRIPTOR']._serialized_start=206707 + _globals['_PROCESSDESCRIPTOR']._serialized_end=207194 + _globals['_PROCESSDESCRIPTOR_CHROMEPROCESSTYPE']._serialized_start=206969 + _globals['_PROCESSDESCRIPTOR_CHROMEPROCESSTYPE']._serialized_end=207194 + _globals['_TRACKEVENTRANGEOFINTEREST']._serialized_start=207196 + _globals['_TRACKEVENTRANGEOFINTEREST']._serialized_end=207241 + _globals['_THREADDESCRIPTOR']._serialized_start=207244 + _globals['_THREADDESCRIPTOR']._serialized_end=208000 + _globals['_THREADDESCRIPTOR_CHROMETHREADTYPE']._serialized_start=207529 + _globals['_THREADDESCRIPTOR_CHROMETHREADTYPE']._serialized_end=208000 + _globals['_CHROMEPROCESSDESCRIPTOR']._serialized_start=208003 + _globals['_CHROMEPROCESSDESCRIPTOR']._serialized_end=208158 + _globals['_CHROMETHREADDESCRIPTOR']._serialized_start=208160 + _globals['_CHROMETHREADDESCRIPTOR']._serialized_end=208258 + _globals['_COUNTERDESCRIPTOR']._serialized_start=208261 + _globals['_COUNTERDESCRIPTOR']._serialized_end=208716 + _globals['_COUNTERDESCRIPTOR_BUILTINCOUNTERTYPE']._serialized_start=208520 + _globals['_COUNTERDESCRIPTOR_BUILTINCOUNTERTYPE']._serialized_end=208631 + _globals['_COUNTERDESCRIPTOR_UNIT']._serialized_start=208633 + _globals['_COUNTERDESCRIPTOR_UNIT']._serialized_end=208716 + _globals['_STATEDESCRIPTOR']._serialized_start=208718 + _globals['_STATEDESCRIPTOR']._serialized_end=208735 + _globals['_TRACKDESCRIPTOR']._serialized_start=208738 + _globals['_TRACKDESCRIPTOR']._serialized_end=210154 + _globals['_TRACKDESCRIPTOR_CHILDTRACKSORDERING']._serialized_start=209661 + _globals['_TRACKDESCRIPTOR_CHILDTRACKSORDERING']._serialized_end=209747 + _globals['_TRACKDESCRIPTOR_SIBLINGMERGEBEHAVIOR']._serialized_start=209750 + _globals['_TRACKDESCRIPTOR_SIBLINGMERGEBEHAVIOR']._serialized_end=209936 + _globals['_TRACKDESCRIPTOR_PROCESSORDERING']._serialized_start=209938 + _globals['_TRACKDESCRIPTOR_PROCESSORDERING']._serialized_end=210020 + _globals['_TRACKDESCRIPTOR_THREADORDERING']._serialized_start=210022 + _globals['_TRACKDESCRIPTOR_THREADORDERING']._serialized_end=210101 + _globals['_TRANSLATIONTABLE']._serialized_start=210157 + _globals['_TRANSLATIONTABLE']._serialized_end=210650 + _globals['_CHROMEHISTORGRAMTRANSLATIONTABLE']._serialized_start=210653 + _globals['_CHROMEHISTORGRAMTRANSLATIONTABLE']._serialized_end=210827 + _globals['_CHROMEHISTORGRAMTRANSLATIONTABLE_HASHTONAMEENTRY']._serialized_start=210778 + _globals['_CHROMEHISTORGRAMTRANSLATIONTABLE_HASHTONAMEENTRY']._serialized_end=210827 + _globals['_CHROMEUSEREVENTTRANSLATIONTABLE']._serialized_start=210830 + _globals['_CHROMEUSEREVENTTRANSLATIONTABLE']._serialized_end=211021 + _globals['_CHROMEUSEREVENTTRANSLATIONTABLE_ACTIONHASHTONAMEENTRY']._serialized_start=210966 + _globals['_CHROMEUSEREVENTTRANSLATIONTABLE_ACTIONHASHTONAMEENTRY']._serialized_end=211021 + _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE']._serialized_start=211024 + _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE']._serialized_end=211379 + _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE_SITEHASHTONAMEENTRY']._serialized_start=211271 + _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE_SITEHASHTONAMEENTRY']._serialized_end=211324 + _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE_MARKHASHTONAMEENTRY']._serialized_start=211326 + _globals['_CHROMEPERFORMANCEMARKTRANSLATIONTABLE_MARKHASHTONAMEENTRY']._serialized_end=211379 + _globals['_SLICENAMETRANSLATIONTABLE']._serialized_start=211382 + _globals['_SLICENAMETRANSLATIONTABLE']._serialized_end=211576 + _globals['_SLICENAMETRANSLATIONTABLE_RAWTODEOBFUSCATEDNAMEENTRY']._serialized_start=211516 + _globals['_SLICENAMETRANSLATIONTABLE_RAWTODEOBFUSCATEDNAMEENTRY']._serialized_end=211576 + _globals['_PROCESSTRACKNAMETRANSLATIONTABLE']._serialized_start=211579 + _globals['_PROCESSTRACKNAMETRANSLATIONTABLE']._serialized_end=211787 + _globals['_PROCESSTRACKNAMETRANSLATIONTABLE_RAWTODEOBFUSCATEDNAMEENTRY']._serialized_start=211516 + _globals['_PROCESSTRACKNAMETRANSLATIONTABLE_RAWTODEOBFUSCATEDNAMEENTRY']._serialized_end=211576 + _globals['_CHROMESTUDYTRANSLATIONTABLE']._serialized_start=211790 + _globals['_CHROMESTUDYTRANSLATIONTABLE']._serialized_end=211954 + _globals['_CHROMESTUDYTRANSLATIONTABLE_HASHTONAMEENTRY']._serialized_start=210778 + _globals['_CHROMESTUDYTRANSLATIONTABLE_HASHTONAMEENTRY']._serialized_end=210827 + _globals['_TRIGGER']._serialized_start=211956 + _globals['_TRIGGER']._serialized_end=212063 + _globals['_UISTATE']._serialized_start=212066 + _globals['_UISTATE']._serialized_end=212263 + _globals['_UISTATE_HIGHLIGHTPROCESS']._serialized_start=212199 + _globals['_UISTATE_HIGHLIGHTPROCESS']._serialized_end=212263 + _globals['_TRACEPACKET']._serialized_start=212266 + _globals['_TRACEPACKET']._serialized_end=218775 + _globals['_TRACEPACKET_PROTOVMS']._serialized_start=217950 + _globals['_TRACEPACKET_PROTOVMS']._serialized_end=218175 + _globals['_TRACEPACKET_PROTOVMS_INSTANCE']._serialized_start=218029 + _globals['_TRACEPACKET_PROTOVMS_INSTANCE']._serialized_end=218175 + _globals['_TRACEPACKET_SEQUENCEFLAGS']._serialized_start=218177 + _globals['_TRACEPACKET_SEQUENCEFLAGS']._serialized_end=218281 + _globals['_TRACEPACKET_DATALOSSREASON']._serialized_start=218284 + _globals['_TRACEPACKET_DATALOSSREASON']._serialized_end=218588 + _globals['_TRACE']._serialized_start=218777 + _globals['_TRACE']._serialized_end=218830 # @@protoc_insertion_point(module_scope) diff --git a/python/perfetto/protos/perfetto/trace/perfetto_trace_pb2.pyi b/python/perfetto/protos/perfetto/trace/perfetto_trace_pb2.pyi index a02208362d3..7985f0af02b 100644 --- a/python/perfetto/protos/perfetto/trace/perfetto_trace_pb2.pyi +++ b/python/perfetto/protos/perfetto/trace/perfetto_trace_pb2.pyi @@ -3833,6 +3833,20 @@ class ChromiumHistogramSamplesConfig(_message.Message): filter_histogram_names: bool def __init__(self, histograms: _Optional[_Iterable[_Union[ChromiumHistogramSamplesConfig.HistogramSample, _Mapping]]] = ..., filter_histogram_names: bool = ...) -> None: ... +class ChromiumSamplingHeapProfilerConfig(_message.Message): + __slots__ = ("sampling_interval_bytes", "sampling_interval_ms") + SAMPLING_INTERVAL_BYTES_FIELD_NUMBER: _ClassVar[int] + SAMPLING_INTERVAL_MS_FIELD_NUMBER: _ClassVar[int] + sampling_interval_bytes: int + sampling_interval_ms: int + def __init__(self, sampling_interval_bytes: _Optional[int] = ..., sampling_interval_ms: _Optional[int] = ...) -> None: ... + +class ChromiumStackSamplingProfilerConfig(_message.Message): + __slots__ = ("sampling_interval_ms",) + SAMPLING_INTERVAL_MS_FIELD_NUMBER: _ClassVar[int] + sampling_interval_ms: int + def __init__(self, sampling_interval_ms: _Optional[int] = ...) -> None: ... + class ChromiumSystemMetricsConfig(_message.Message): __slots__ = ("sampling_interval_ms",) SAMPLING_INTERVAL_MS_FIELD_NUMBER: _ClassVar[int] @@ -4742,7 +4756,7 @@ class TrackEventConfig(_message.Message): def __init__(self, disabled_categories: _Optional[_Iterable[str]] = ..., enabled_categories: _Optional[_Iterable[str]] = ..., disabled_tags: _Optional[_Iterable[str]] = ..., enabled_tags: _Optional[_Iterable[str]] = ..., disable_incremental_timestamps: bool = ..., timestamp_unit_multiplier: _Optional[int] = ..., filter_debug_annotations: bool = ..., enable_thread_time_sampling: bool = ..., thread_time_subsampling_ns: _Optional[int] = ..., filter_dynamic_event_names: bool = ...) -> None: ... class DataSourceConfig(_message.Message): - __slots__ = ("name", "target_buffer", "target_buffer_name", "trace_duration_ms", "prefer_suspend_clock_for_duration", "stop_timeout_ms", "enable_extra_guardrails", "session_initiator", "tracing_session_id", "buffer_exhausted_policy", "priority_boost", "protovm_config", "ftrace_config", "inode_file_config", "process_stats_config", "sys_stats_config", "heapprofd_config", "java_hprof_config", "android_power_config", "android_log_config", "gpu_counter_config", "android_game_intervention_list_config", "packages_list_config", "perf_event_config", "vulkan_memory_config", "track_event_config", "android_polled_state_config", "android_system_property_config", "statsd_tracing_config", "system_info_config", "frozen_ftrace_config", "chrome_config", "v8_config", "interceptor_config", "network_packet_trace_config", "surfaceflinger_layers_config", "surfaceflinger_transactions_config", "android_sdk_sysprop_guard_config", "etw_config", "protolog_config", "android_input_event_config", "pixel_modem_config", "windowmanager_config", "chromium_system_metrics", "kernel_wakelocks_config", "gpu_renderstages_config", "chromium_histogram_samples", "app_wakelocks_config", "cpu_per_uid_config", "user_list_config", "inputmethod_config", "android_aflags_config", "journald_config", "display_video_config", "qnx_config", "legacy_config", "for_testing") + __slots__ = ("name", "target_buffer", "target_buffer_name", "trace_duration_ms", "prefer_suspend_clock_for_duration", "stop_timeout_ms", "enable_extra_guardrails", "session_initiator", "tracing_session_id", "buffer_exhausted_policy", "priority_boost", "protovm_config", "ftrace_config", "inode_file_config", "process_stats_config", "sys_stats_config", "heapprofd_config", "java_hprof_config", "android_power_config", "android_log_config", "gpu_counter_config", "android_game_intervention_list_config", "packages_list_config", "perf_event_config", "vulkan_memory_config", "track_event_config", "android_polled_state_config", "android_system_property_config", "statsd_tracing_config", "system_info_config", "frozen_ftrace_config", "chrome_config", "v8_config", "interceptor_config", "network_packet_trace_config", "surfaceflinger_layers_config", "surfaceflinger_transactions_config", "android_sdk_sysprop_guard_config", "etw_config", "protolog_config", "android_input_event_config", "pixel_modem_config", "windowmanager_config", "chromium_system_metrics", "kernel_wakelocks_config", "gpu_renderstages_config", "chromium_histogram_samples", "app_wakelocks_config", "cpu_per_uid_config", "user_list_config", "inputmethod_config", "android_aflags_config", "journald_config", "display_video_config", "chromium_stack_sampling_profiler", "chromium_sampling_heap_profiler", "qnx_config", "legacy_config", "for_testing") class SessionInitiator(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): __slots__ = () SESSION_INITIATOR_UNSPECIFIED: _ClassVar[DataSourceConfig.SessionInitiator] @@ -4813,6 +4827,8 @@ class DataSourceConfig(_message.Message): ANDROID_AFLAGS_CONFIG_FIELD_NUMBER: _ClassVar[int] JOURNALD_CONFIG_FIELD_NUMBER: _ClassVar[int] DISPLAY_VIDEO_CONFIG_FIELD_NUMBER: _ClassVar[int] + CHROMIUM_STACK_SAMPLING_PROFILER_FIELD_NUMBER: _ClassVar[int] + CHROMIUM_SAMPLING_HEAP_PROFILER_FIELD_NUMBER: _ClassVar[int] QNX_CONFIG_FIELD_NUMBER: _ClassVar[int] LEGACY_CONFIG_FIELD_NUMBER: _ClassVar[int] FOR_TESTING_FIELD_NUMBER: _ClassVar[int] @@ -4870,10 +4886,12 @@ class DataSourceConfig(_message.Message): android_aflags_config: AndroidAflagsConfig journald_config: SystemdJournaldConfig display_video_config: DisplayVideoConfig + chromium_stack_sampling_profiler: ChromiumStackSamplingProfilerConfig + chromium_sampling_heap_profiler: ChromiumSamplingHeapProfilerConfig qnx_config: QnxConfig legacy_config: str for_testing: TestConfig - def __init__(self, name: _Optional[str] = ..., target_buffer: _Optional[int] = ..., target_buffer_name: _Optional[str] = ..., trace_duration_ms: _Optional[int] = ..., prefer_suspend_clock_for_duration: bool = ..., stop_timeout_ms: _Optional[int] = ..., enable_extra_guardrails: bool = ..., session_initiator: _Optional[_Union[DataSourceConfig.SessionInitiator, str]] = ..., tracing_session_id: _Optional[int] = ..., buffer_exhausted_policy: _Optional[_Union[DataSourceConfig.BufferExhaustedPolicy, str]] = ..., priority_boost: _Optional[_Union[PriorityBoostConfig, _Mapping]] = ..., protovm_config: _Optional[_Union[ProtoVmConfig, _Mapping]] = ..., ftrace_config: _Optional[_Union[FtraceConfig, _Mapping]] = ..., inode_file_config: _Optional[_Union[InodeFileConfig, _Mapping]] = ..., process_stats_config: _Optional[_Union[ProcessStatsConfig, _Mapping]] = ..., sys_stats_config: _Optional[_Union[SysStatsConfig, _Mapping]] = ..., heapprofd_config: _Optional[_Union[HeapprofdConfig, _Mapping]] = ..., java_hprof_config: _Optional[_Union[JavaHprofConfig, _Mapping]] = ..., android_power_config: _Optional[_Union[AndroidPowerConfig, _Mapping]] = ..., android_log_config: _Optional[_Union[AndroidLogConfig, _Mapping]] = ..., gpu_counter_config: _Optional[_Union[GpuCounterConfig, _Mapping]] = ..., android_game_intervention_list_config: _Optional[_Union[AndroidGameInterventionListConfig, _Mapping]] = ..., packages_list_config: _Optional[_Union[PackagesListConfig, _Mapping]] = ..., perf_event_config: _Optional[_Union[PerfEventConfig, _Mapping]] = ..., vulkan_memory_config: _Optional[_Union[VulkanMemoryConfig, _Mapping]] = ..., track_event_config: _Optional[_Union[TrackEventConfig, _Mapping]] = ..., android_polled_state_config: _Optional[_Union[AndroidPolledStateConfig, _Mapping]] = ..., android_system_property_config: _Optional[_Union[AndroidSystemPropertyConfig, _Mapping]] = ..., statsd_tracing_config: _Optional[_Union[StatsdTracingConfig, _Mapping]] = ..., system_info_config: _Optional[_Union[SystemInfoConfig, _Mapping]] = ..., frozen_ftrace_config: _Optional[_Union[FrozenFtraceConfig, _Mapping]] = ..., chrome_config: _Optional[_Union[ChromeConfig, _Mapping]] = ..., v8_config: _Optional[_Union[V8Config, _Mapping]] = ..., interceptor_config: _Optional[_Union[InterceptorConfig, _Mapping]] = ..., network_packet_trace_config: _Optional[_Union[NetworkPacketTraceConfig, _Mapping]] = ..., surfaceflinger_layers_config: _Optional[_Union[SurfaceFlingerLayersConfig, _Mapping]] = ..., surfaceflinger_transactions_config: _Optional[_Union[SurfaceFlingerTransactionsConfig, _Mapping]] = ..., android_sdk_sysprop_guard_config: _Optional[_Union[AndroidSdkSyspropGuardConfig, _Mapping]] = ..., etw_config: _Optional[_Union[EtwConfig, _Mapping]] = ..., protolog_config: _Optional[_Union[ProtoLogConfig, _Mapping]] = ..., android_input_event_config: _Optional[_Union[AndroidInputEventConfig, _Mapping]] = ..., pixel_modem_config: _Optional[_Union[PixelModemConfig, _Mapping]] = ..., windowmanager_config: _Optional[_Union[WindowManagerConfig, _Mapping]] = ..., chromium_system_metrics: _Optional[_Union[ChromiumSystemMetricsConfig, _Mapping]] = ..., kernel_wakelocks_config: _Optional[_Union[KernelWakelocksConfig, _Mapping]] = ..., gpu_renderstages_config: _Optional[_Union[GpuRenderStagesConfig, _Mapping]] = ..., chromium_histogram_samples: _Optional[_Union[ChromiumHistogramSamplesConfig, _Mapping]] = ..., app_wakelocks_config: _Optional[_Union[AppWakelocksConfig, _Mapping]] = ..., cpu_per_uid_config: _Optional[_Union[CpuPerUidConfig, _Mapping]] = ..., user_list_config: _Optional[_Union[AndroidUserListConfig, _Mapping]] = ..., inputmethod_config: _Optional[_Union[InputMethodConfig, _Mapping]] = ..., android_aflags_config: _Optional[_Union[AndroidAflagsConfig, _Mapping]] = ..., journald_config: _Optional[_Union[SystemdJournaldConfig, _Mapping]] = ..., display_video_config: _Optional[_Union[DisplayVideoConfig, _Mapping]] = ..., qnx_config: _Optional[_Union[QnxConfig, _Mapping]] = ..., legacy_config: _Optional[str] = ..., for_testing: _Optional[_Union[TestConfig, _Mapping]] = ...) -> None: ... + def __init__(self, name: _Optional[str] = ..., target_buffer: _Optional[int] = ..., target_buffer_name: _Optional[str] = ..., trace_duration_ms: _Optional[int] = ..., prefer_suspend_clock_for_duration: bool = ..., stop_timeout_ms: _Optional[int] = ..., enable_extra_guardrails: bool = ..., session_initiator: _Optional[_Union[DataSourceConfig.SessionInitiator, str]] = ..., tracing_session_id: _Optional[int] = ..., buffer_exhausted_policy: _Optional[_Union[DataSourceConfig.BufferExhaustedPolicy, str]] = ..., priority_boost: _Optional[_Union[PriorityBoostConfig, _Mapping]] = ..., protovm_config: _Optional[_Union[ProtoVmConfig, _Mapping]] = ..., ftrace_config: _Optional[_Union[FtraceConfig, _Mapping]] = ..., inode_file_config: _Optional[_Union[InodeFileConfig, _Mapping]] = ..., process_stats_config: _Optional[_Union[ProcessStatsConfig, _Mapping]] = ..., sys_stats_config: _Optional[_Union[SysStatsConfig, _Mapping]] = ..., heapprofd_config: _Optional[_Union[HeapprofdConfig, _Mapping]] = ..., java_hprof_config: _Optional[_Union[JavaHprofConfig, _Mapping]] = ..., android_power_config: _Optional[_Union[AndroidPowerConfig, _Mapping]] = ..., android_log_config: _Optional[_Union[AndroidLogConfig, _Mapping]] = ..., gpu_counter_config: _Optional[_Union[GpuCounterConfig, _Mapping]] = ..., android_game_intervention_list_config: _Optional[_Union[AndroidGameInterventionListConfig, _Mapping]] = ..., packages_list_config: _Optional[_Union[PackagesListConfig, _Mapping]] = ..., perf_event_config: _Optional[_Union[PerfEventConfig, _Mapping]] = ..., vulkan_memory_config: _Optional[_Union[VulkanMemoryConfig, _Mapping]] = ..., track_event_config: _Optional[_Union[TrackEventConfig, _Mapping]] = ..., android_polled_state_config: _Optional[_Union[AndroidPolledStateConfig, _Mapping]] = ..., android_system_property_config: _Optional[_Union[AndroidSystemPropertyConfig, _Mapping]] = ..., statsd_tracing_config: _Optional[_Union[StatsdTracingConfig, _Mapping]] = ..., system_info_config: _Optional[_Union[SystemInfoConfig, _Mapping]] = ..., frozen_ftrace_config: _Optional[_Union[FrozenFtraceConfig, _Mapping]] = ..., chrome_config: _Optional[_Union[ChromeConfig, _Mapping]] = ..., v8_config: _Optional[_Union[V8Config, _Mapping]] = ..., interceptor_config: _Optional[_Union[InterceptorConfig, _Mapping]] = ..., network_packet_trace_config: _Optional[_Union[NetworkPacketTraceConfig, _Mapping]] = ..., surfaceflinger_layers_config: _Optional[_Union[SurfaceFlingerLayersConfig, _Mapping]] = ..., surfaceflinger_transactions_config: _Optional[_Union[SurfaceFlingerTransactionsConfig, _Mapping]] = ..., android_sdk_sysprop_guard_config: _Optional[_Union[AndroidSdkSyspropGuardConfig, _Mapping]] = ..., etw_config: _Optional[_Union[EtwConfig, _Mapping]] = ..., protolog_config: _Optional[_Union[ProtoLogConfig, _Mapping]] = ..., android_input_event_config: _Optional[_Union[AndroidInputEventConfig, _Mapping]] = ..., pixel_modem_config: _Optional[_Union[PixelModemConfig, _Mapping]] = ..., windowmanager_config: _Optional[_Union[WindowManagerConfig, _Mapping]] = ..., chromium_system_metrics: _Optional[_Union[ChromiumSystemMetricsConfig, _Mapping]] = ..., kernel_wakelocks_config: _Optional[_Union[KernelWakelocksConfig, _Mapping]] = ..., gpu_renderstages_config: _Optional[_Union[GpuRenderStagesConfig, _Mapping]] = ..., chromium_histogram_samples: _Optional[_Union[ChromiumHistogramSamplesConfig, _Mapping]] = ..., app_wakelocks_config: _Optional[_Union[AppWakelocksConfig, _Mapping]] = ..., cpu_per_uid_config: _Optional[_Union[CpuPerUidConfig, _Mapping]] = ..., user_list_config: _Optional[_Union[AndroidUserListConfig, _Mapping]] = ..., inputmethod_config: _Optional[_Union[InputMethodConfig, _Mapping]] = ..., android_aflags_config: _Optional[_Union[AndroidAflagsConfig, _Mapping]] = ..., journald_config: _Optional[_Union[SystemdJournaldConfig, _Mapping]] = ..., display_video_config: _Optional[_Union[DisplayVideoConfig, _Mapping]] = ..., chromium_stack_sampling_profiler: _Optional[_Union[ChromiumStackSamplingProfilerConfig, _Mapping]] = ..., chromium_sampling_heap_profiler: _Optional[_Union[ChromiumSamplingHeapProfilerConfig, _Mapping]] = ..., qnx_config: _Optional[_Union[QnxConfig, _Mapping]] = ..., legacy_config: _Optional[str] = ..., for_testing: _Optional[_Union[TestConfig, _Mapping]] = ...) -> None: ... class TraceConfig(_message.Message): __slots__ = ("buffers", "data_sources", "builtin_data_sources", "duration_ms", "prefer_suspend_clock_for_duration", "enable_extra_guardrails", "lockdown_mode", "producers", "statsd_metadata", "write_into_file", "output_path", "file_write_period_ms", "max_file_size_bytes", "guardrail_overrides", "deferred_start", "flush_period_ms", "flush_timeout_ms", "data_source_stop_timeout_ms", "notify_traceur", "bugreport_score", "bugreport_filename", "trigger_config", "activate_triggers", "incremental_state_config", "allow_user_build_tracing", "unique_session_name", "compression_type", "compression", "incident_report_config", "statsd_logging", "trace_uuid_msb", "trace_uuid_lsb", "trace_filter", "android_report_config", "cmd_trace_start_delay", "session_semaphores", "priority_boost", "exclusive_prio", "write_flush_mode", "fflush_post_write", "trace_all_machines", "trace_attributes") diff --git a/python/perfetto/trace_processor/api.py b/python/perfetto/trace_processor/api.py index a0efb1f57b4..57018c582a2 100644 --- a/python/perfetto/trace_processor/api.py +++ b/python/perfetto/trace_processor/api.py @@ -305,12 +305,15 @@ def export(self, output_path: str, export_format: str): for external consumers, but it cannot be loaded back into Trace Processor. `perfetto` can be loaded by a fresh Trace Processor instance from the same version. Loading it in a different version may work but is not guaranteed. + `sqlite` writes all SQL-visible tables and views into a standard SQLite + database; the database is materialized on the server and streamed to + `output_path`, so the server must support file access. Output is streamed directly to disk without materializing the complete archive in memory. Args: output_path: Path to write the export to. - export_format: Either `arrow_tar` or `perfetto`. + export_format: Either `arrow_tar`, `perfetto` or `sqlite`. """ with open(output_path, 'wb') as f: self.http.export(f, export_format) diff --git a/python/perfetto/trace_processor/http.py b/python/perfetto/trace_processor/http.py index 6e9dfac566b..58207ef596f 100644 --- a/python/perfetto/trace_processor/http.py +++ b/python/perfetto/trace_processor/http.py @@ -115,6 +115,8 @@ def export(self, output_file, export_format: str): args.format = self.protos.ExportArgs.Format.PERFETTO elif export_format == 'arrow_tar': args.format = self.protos.ExportArgs.Format.ARROW_TAR + elif export_format == 'sqlite': + args.format = self.protos.ExportArgs.Format.SQLITE else: raise ValueError(f'Unknown export format: {export_format}') self.conn.request('POST', '/export', body=args.SerializeToString()) diff --git a/python/perfetto/trace_processor/trace_processor.descriptor b/python/perfetto/trace_processor/trace_processor.descriptor index 6fce45065e3..4c37f44bf11 100644 Binary files a/python/perfetto/trace_processor/trace_processor.descriptor and b/python/perfetto/trace_processor/trace_processor.descriptor differ diff --git a/python/test/api_integrationtest.py b/python/test/api_integrationtest.py index c7086030ed1..f662d54165b 100644 --- a/python/test/api_integrationtest.py +++ b/python/test/api_integrationtest.py @@ -15,6 +15,7 @@ import io import os +import sqlite3 import tempfile import unittest from typing import Optional @@ -346,6 +347,26 @@ def test_remote_sql_file_access_must_be_enabled_by_server(self): 'server must be started with'): TraceProcessor(addr='localhost:1', config=config) + def test_sqlite_export(self): + with tempfile.TemporaryDirectory() as temp_dir: + path = os.path.join(temp_dir, 'export.db') + + config = TraceProcessorConfig(bin_path=os.environ["SHELL_PATH"]) + with TraceProcessor( + trace=example_android_trace_path(), config=config) as tp: + tp.export(path, 'sqlite') + + con = sqlite3.connect(path) + try: + table_count = con.execute( + "SELECT COUNT(*) FROM sqlite_master WHERE type='table'").fetchone( + )[0] + self.assertGreater(table_count, 0) + self.assertGreater( + con.execute('SELECT COUNT(*) FROM slice').fetchone()[0], 0) + finally: + con.close() + def test_add_sql_packages(self): with tempfile.TemporaryDirectory() as temp_dir: # Create a directory structure for the package. The root of the diff --git a/python/tools/check_ratchet.py b/python/tools/check_ratchet.py index 246f9ac8bfe..b748c8488f1 100755 --- a/python/tools/check_ratchet.py +++ b/python/tools/check_ratchet.py @@ -37,7 +37,7 @@ from dataclasses import dataclass EXPECTED_ANY_COUNT = 28 -EXPECTED_RUN_METRIC_COUNT = 3 +EXPECTED_RUN_METRIC_COUNT = 2 ROOT_DIR = os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) diff --git a/src/base/file_utils.cc b/src/base/file_utils.cc index 5875ed1f091..85b0e4ae250 100644 --- a/src/base/file_utils.cc +++ b/src/base/file_utils.cc @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -265,6 +266,52 @@ bool FlushFile(int fd) { #endif } +bool SeekFile(int fd, uint64_t offset) { +#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) + if (fd < 0) { + errno = EBADF; + return false; + } + if (offset > static_cast(std::numeric_limits::max())) { + errno = EOVERFLOW; + return false; + } + return _lseeki64(fd, static_cast(offset), SEEK_SET) != -1; +#else + if (offset > static_cast(std::numeric_limits::max())) { + errno = EOVERFLOW; + return false; + } + return lseek(fd, static_cast(offset), SEEK_SET) != + static_cast(-1); +#endif +} + +bool TruncateFile(int fd, uint64_t size) { +#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) + if (fd < 0) { + errno = EBADF; + return false; + } + if (size > static_cast(std::numeric_limits::max())) { + errno = EOVERFLOW; + return false; + } + int result = _chsize_s(fd, size); + if (result != 0) { + errno = result; + return false; + } + return true; +#else + if (size > static_cast(std::numeric_limits::max())) { + errno = EOVERFLOW; + return false; + } + return PERFETTO_EINTR(ftruncate(fd, static_cast(size))) == 0; +#endif +} + bool Mkdir(const std::string& path, uint32_t mode) { #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) base::ignore_result(mode); @@ -580,6 +627,27 @@ std::string Dirname(const std::string& path) { return p.substr(0, last_sep); } +size_t PathRootPrefixLength(const std::string& path) { + size_t pos = 0; + // Skip over a leading drive letter, e.g. "C:\foo". + bool has_drive_letter = path.size() >= 2 && path[1] == ':' && + ((path[0] >= 'a' && path[0] <= 'z') || + (path[0] >= 'A' && path[0] <= 'Z')); + if (has_drive_letter) + pos = 2; + + size_t end = path.find_first_not_of("/\\", pos); + end = end == std::string::npos ? path.size() : end; + + // A drive letter not followed by a separator ("C:foo") is relative to the + // current directory of that drive, not absolute. + return end > pos ? end : 0; +} + +bool IsAbsolutePath(const std::string& path) { + return PathRootPrefixLength(path) != 0; +} + base::Status SetFilePermissions(const std::string& file_path, const std::string& group_name_or_id, const std::string& mode_bits) { @@ -663,6 +731,12 @@ std::optional GetFileSize(PlatformHandle fd) { #endif } +#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) +std::optional GetFileSize(int fd) { + return GetFileSize(reinterpret_cast(_get_osfhandle(fd))); +} +#endif + // LinuxFileWatch #if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX_BUT_NOT_QNX) || \ diff --git a/src/base/file_utils_unittest.cc b/src/base/file_utils_unittest.cc index 90fb783cc65..86aeba80956 100644 --- a/src/base/file_utils_unittest.cc +++ b/src/base/file_utils_unittest.cc @@ -59,6 +59,28 @@ TEST(FileUtilsTest, Basename) { EXPECT_EQ(Basename("foo/bar\\"), "bar"); } +TEST(FileUtilsTest, PathRootPrefixLength) { + EXPECT_EQ(PathRootPrefixLength("/usr/bin/ls"), 1u); + EXPECT_EQ(PathRootPrefixLength("/"), 1u); + EXPECT_EQ(PathRootPrefixLength("//usr//bin"), 2u); + EXPECT_EQ(PathRootPrefixLength("foo/bar"), 0u); + EXPECT_EQ(PathRootPrefixLength(""), 0u); + + // Windows. + EXPECT_EQ(PathRootPrefixLength("C:\\Windows\\System32"), 3u); + EXPECT_EQ(PathRootPrefixLength("c:/Windows"), 3u); + EXPECT_EQ(PathRootPrefixLength("\\\\server\\share"), 2u); + // Relative to the current directory of drive C:, not absolute. + EXPECT_EQ(PathRootPrefixLength("C:foo"), 0u); + EXPECT_EQ(PathRootPrefixLength("C:"), 0u); + EXPECT_EQ(PathRootPrefixLength("1:\\foo"), 0u); + + EXPECT_TRUE(IsAbsolutePath("/usr/bin/ls")); + EXPECT_TRUE(IsAbsolutePath("C:\\Windows")); + EXPECT_FALSE(IsAbsolutePath("foo/bar")); + EXPECT_FALSE(IsAbsolutePath("")); +} + TEST(FileUtilsTest, Dirname) { EXPECT_EQ(Dirname("/usr/bin/ls"), "/usr/bin"); EXPECT_EQ(Dirname("/usr/bin"), "/usr"); diff --git a/src/base/utils_unittest.cc b/src/base/utils_unittest.cc index 94e6670d902..5d985b9c552 100644 --- a/src/base/utils_unittest.cc +++ b/src/base/utils_unittest.cc @@ -364,6 +364,44 @@ TEST(UtilsTest, CopyFileContents) { #endif } +TEST(UtilsTest, SeekFile) { + TempFile file = TempFile::Create(); + ASSERT_EQ(WriteAll(*file, "abcdef", 6), 6); + + ASSERT_TRUE(SeekFile(*file, 3)); + char data[3] = {}; + ASSERT_EQ(Read(*file, data, sizeof(data)), 3); + EXPECT_EQ(std::string(data, sizeof(data)), "def"); +} + +TEST(UtilsTest, TruncateFile) { + TempFile file = TempFile::Create(); + ASSERT_EQ(WriteAll(*file, "abcdef", 6), 6); + + ASSERT_TRUE(TruncateFile(*file, 3)); + EXPECT_EQ(GetFileSize(*file), 3u); + + std::string contents; + ASSERT_TRUE(ReadFile(file.path(), &contents)); + EXPECT_EQ(contents, "abc"); + + ASSERT_TRUE(TruncateFile(*file, 8)); + EXPECT_EQ(GetFileSize(*file), 8u); + contents.clear(); + ASSERT_TRUE(ReadFile(file.path(), &contents)); + EXPECT_EQ(contents, std::string("abc\0\0\0\0\0", 8)); +} + +TEST(UtilsTest, SeekAndTruncateFileErrors) { + EXPECT_FALSE(SeekFile(-1, 0)); + EXPECT_FALSE(TruncateFile(-1, 0)); + + constexpr uint64_t kTooLarge = std::numeric_limits::max(); + TempFile file = TempFile::Create(); + EXPECT_FALSE(SeekFile(*file, kTooLarge)); + EXPECT_FALSE(TruncateFile(*file, kTooLarge)); +} + TEST(UtilsTest, GetFileSize) { TempFile file = TempFile::Create(); // Explicitly set the string size, we want to write all data to the file. diff --git a/src/profiling/common/unwind_support.cc b/src/profiling/common/unwind_support.cc index c0a504c5fda..5e543d9cbb3 100644 --- a/src/profiling/common/unwind_support.cc +++ b/src/profiling/common/unwind_support.cc @@ -129,13 +129,12 @@ unwindstack::DexFiles* UnwindingMetadata::GetDexFiles( } #endif -const std::string& UnwindingMetadata::GetBuildId( - const unwindstack::FrameData& frame) { +std::string UnwindingMetadata::GetBuildId(const unwindstack::FrameData& frame) { if (frame.map_info != nullptr && !frame.map_info->name().empty()) { return frame.map_info->GetBuildID(); } - return empty_string_; + return ""; } std::string StringifyLibUnwindstackError(unwindstack::ErrorCode e) { diff --git a/src/profiling/common/unwind_support.h b/src/profiling/common/unwind_support.h index 1b0d909278d..a6eb6e060ad 100644 --- a/src/profiling/common/unwind_support.h +++ b/src/profiling/common/unwind_support.h @@ -107,9 +107,8 @@ struct UnwindingMetadata { unwindstack::DexFiles* GetDexFiles(unwindstack::ArchEnum arch); #endif - const std::string& GetBuildId(const unwindstack::FrameData& frame); + std::string GetBuildId(const unwindstack::FrameData& frame); - std::string empty_string_; FDMaps fd_maps; // The API of libunwindstack expects shared_ptr for Memory. std::shared_ptr fd_mem; diff --git a/src/profiling/memory/client.cc b/src/profiling/memory/client.cc index 62f78e8d51b..e99a09c2e40 100644 --- a/src/profiling/memory/client.cc +++ b/src/profiling/memory/client.cc @@ -345,8 +345,6 @@ bool Client::IsPostFork() { return false; } -#if PERFETTO_BUILDFLAG(PERFETTO_ARCH_CPU_RISCV) && \ - !PERFETTO_HAS_BUILTIN_STACK_ADDRESS() ssize_t Client::GetStackRegister(unwindstack::ArchEnum arch) { ssize_t reg_sp, reg_size; switch (arch) { @@ -382,7 +380,6 @@ uintptr_t Client::GetStackAddress(char* reg_data, unwindstack::ArchEnum arch) { return reinterpret_cast(nullptr); return *reinterpret_cast(®_data[reg]); } -#endif /* PERFETTO_ARCH_CPU_RISCV && !PERFETTO_HAS_BUILTIN_STACK_ADDRESS() */ // The stack grows towards numerically smaller addresses, so the stack layout // of main calling malloc is as follows. @@ -404,31 +401,27 @@ bool Client::RecordMalloc(uint32_t heap_id, return postfork_return_value_; } - AllocMetadata metadata; - // By the difference between calling conventions, the frame pointer might - // include the current frame or not. So, using __builtin_frame_address() - // on specific architectures such as riscv can make stack unwinding failed. - // Thus, using __builtin_stack_address() or reading the stack pointer in - // register data directly instead of using __builtin_frame_address() on riscv. -#if PERFETTO_BUILDFLAG(PERFETTO_ARCH_CPU_RISCV) -#if PERFETTO_HAS_BUILTIN_STACK_ADDRESS() - const char* stackptr = reinterpret_cast(__builtin_stack_address()); + AllocMetadata metadata = {}; unwindstack::AsmGetRegs(metadata.register_data); + +#if PERFETTO_BUILDFLAG(PERFETTO_ARCH_CPU_ARM64) + // On ARM64, the prologue allocates the callee-saved register block first and + // sets x29 (FP) to the base of that block. Starting the stack copy at FP + // captures all saved registers while omitting ~450 bytes of RecordMalloc's + // own local stack frame to save ring buffer space. + const char* stackptr = reinterpret_cast(__builtin_frame_address(0)); #else - char* register_data = metadata.register_data; - unwindstack::AsmGetRegs(register_data); - const char* stackptr = reinterpret_cast( - GetStackAddress(register_data, unwindstack::Regs::CurrentArch())); + // On other architectures (such as x86_64 and RISC-V), callee-saved registers + // are pushed below the frame pointer (or calling conventions differ). We must + // copy from the sampled stack pointer (SP) to include all saved registers. + const char* stackptr = reinterpret_cast(GetStackAddress( + metadata.register_data, unwindstack::Regs::CurrentArch())); if (!stackptr) { PERFETTO_ELOG("Failed to get stack address."); shmem_.SetErrorState(SharedRingBuffer::kInvalidStackBounds); return false; } -#endif /* PERFETTO_HAS_BUILTIN_STACK_ADDRESS() */ -#else - const char* stackptr = reinterpret_cast(__builtin_frame_address(0)); - unwindstack::AsmGetRegs(metadata.register_data); -#endif /* PERFETTO_BUILDFLAG(PERFETTO_ARCH_CPU_RISCV) */ +#endif const char* stackend = GetStackEnd(stackptr); if (!stackend) { PERFETTO_ELOG("Failed to find stackend."); diff --git a/src/profiling/memory/client.h b/src/profiling/memory/client.h index 3f62551e38c..8d2d82fdbfe 100644 --- a/src/profiling/memory/client.h +++ b/src/profiling/memory/client.h @@ -118,15 +118,8 @@ class Client { bool IsConnected(); private: -#if PERFETTO_BUILDFLAG(PERFETTO_ARCH_CPU_RISCV) && \ - !PERFETTO_HAS_BUILTIN_STACK_ADDRESS() - // For specific architectures, such as riscv, different calling conventions - // make a difference in the meaning of the frame pointer. (see comments in - // client.cc) So, we want to use other method to get the stack address for - // specific architectures such as riscv. ssize_t GetStackRegister(unwindstack::ArchEnum arch); uintptr_t GetStackAddress(char* reg_data, unwindstack::ArchEnum arch); -#endif const char* GetStackEnd(const char* stacktop); bool SendControlSocketByte() PERFETTO_WARN_UNUSED_RESULT; int64_t SendWireMessageWithRetriesIfBlocking(const WireMessage&) diff --git a/src/profiling/perf/frame_pointer_unwinder_unittest.cc b/src/profiling/perf/frame_pointer_unwinder_unittest.cc index c494fd7e23e..b4cb23d3557 100644 --- a/src/profiling/perf/frame_pointer_unwinder_unittest.cc +++ b/src/profiling/perf/frame_pointer_unwinder_unittest.cc @@ -39,10 +39,13 @@ class RegsFake : public unwindstack::Regs { } ~RegsFake() override = default; - unwindstack::ArchEnum Arch() override { return fake_arch_; } + unwindstack::ArchEnum Arch() { return fake_arch_; } + unwindstack::ArchEnum Arch() const { return fake_arch_; } void* RawData() override { return fake_data_.get(); } - uint64_t pc() override { return fake_pc_; } - uint64_t sp() override { return fake_sp_; } + uint64_t pc() { return fake_pc_; } + uint64_t pc() const { return fake_pc_; } + uint64_t sp() { return fake_sp_; } + uint64_t sp() const { return fake_sp_; } void set_pc(uint64_t pc) override { fake_pc_ = pc; } void set_sp(uint64_t sp) override { fake_sp_ = sp; } @@ -67,7 +70,8 @@ class RegsFake : public unwindstack::Regs { bool SetPcFromReturnAddress(unwindstack::Memory*) override { return false; } - void IterateRegisters(std::function) override {} + void IterateRegisters(std::function) {} + void IterateRegisters(std::function) const {} bool StepIfSignalHandler(uint64_t, unwindstack::Elf*, @@ -77,7 +81,8 @@ class RegsFake : public unwindstack::Regs { void FakeSetArch(unwindstack::ArchEnum arch) { fake_arch_ = arch; } - Regs* Clone() override { return nullptr; } + Regs* Clone() { return nullptr; } + Regs* Clone() const { return nullptr; } private: unwindstack::ArchEnum fake_arch_ = unwindstack::ARCH_UNKNOWN; diff --git a/src/shared_lib/data_source.cc b/src/shared_lib/data_source.cc index 7aa42e98871..69a93848f33 100644 --- a/src/shared_lib/data_source.cc +++ b/src/shared_lib/data_source.cc @@ -611,6 +611,13 @@ void PerfettoDsTracerImplFlush(struct PerfettoDsTracerImpl* tracer, tls_inst->trace_writer->Flush(fn); } +uint64_t PerfettoDsTracerImplGetDropCount(struct PerfettoDsTracerImpl* tracer) { + auto* tls_inst = + reinterpret_cast(tracer); + + return tls_inst->trace_writer->drop_count(); +} + uint32_t PerfettoDsGetDefaultClockId() { #if !PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE) && \ !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) diff --git a/src/shared_lib/test/api_integrationtest.cc b/src/shared_lib/test/api_integrationtest.cc index 9a047459641..0f3575ff9bb 100644 --- a/src/shared_lib/test/api_integrationtest.cc +++ b/src/shared_lib/test/api_integrationtest.cc @@ -883,6 +883,61 @@ TEST_F(SharedLibDataSourceTest, FlushCb) { EXPECT_TRUE(notification.IsNotified()); } +TEST_F(SharedLibDataSourceTest, DropCount) { + TracingSession tracing_session = + TracingSession::Builder().set_data_source_name(kDataSourceName2).Build(); + WaitableEvent on_flush_started; + WaitableEvent on_flush_unblocked; + EXPECT_CALL(ds2_callbacks_, OnFlush(_, _, _, _, _)) + .WillOnce([&] { + on_flush_started.Notify(); + on_flush_unblocked.WaitForNotification(); + }) + .WillRepeatedly([] {}); + + // Block the internal perfetto thread inside the OnFlush callback. The + // in-process tracing service runs on the same thread, so it cannot free + // shared memory buffer chunks while blocked: writing enough data below is + // guaranteed to exhaust the buffer and cause data loss. + PerfettoTracingSessionFlushAsync(tracing_session.session(), 0, nullptr, + nullptr); + on_flush_started.WaitForNotification(); + + uint64_t initial_drop_count = 0; + uint64_t final_drop_count = 0; + PERFETTO_DS_TRACE(data_source_2, ctx) { + initial_drop_count = PerfettoDsTracerGetDropCount(&ctx); + // Write way more data than the shared memory buffer can hold (the default + // shared memory buffer size is 256 KiB). + std::string large_str(1024, 'x'); + for (size_t i = 0; i < 2048; i++) { + struct PerfettoDsRootTracePacket trace_packet; + PerfettoDsTracerPacketBegin(&ctx, &trace_packet); + { + struct perfetto_protos_TestEvent for_testing; + perfetto_protos_TracePacket_begin_for_testing(&trace_packet.msg, + &for_testing); + { + struct perfetto_protos_TestEvent_TestPayload payload; + perfetto_protos_TestEvent_begin_payload(&for_testing, &payload); + perfetto_protos_TestEvent_TestPayload_set_cstr_str(&payload, + large_str.c_str()); + perfetto_protos_TestEvent_end_payload(&for_testing, &payload); + } + perfetto_protos_TracePacket_end_for_testing(&trace_packet.msg, + &for_testing); + } + PerfettoDsTracerPacketEnd(&ctx, &trace_packet); + } + final_drop_count = PerfettoDsTracerGetDropCount(&ctx); + } + on_flush_unblocked.Notify(); + tracing_session.StopBlocking(); + + EXPECT_EQ(initial_drop_count, 0u); + EXPECT_GT(final_drop_count, 0u); +} + TEST_F(SharedLibDataSourceTest, LifetimeCallbacks) { void* const kInstancePtr = reinterpret_cast(0x44); testing::InSequence seq; diff --git a/src/tools/proto_merger/proto_file.cc b/src/tools/proto_merger/proto_file.cc index 585e6a304fd..3b0a824fb54 100644 --- a/src/tools/proto_merger/proto_file.cc +++ b/src/tools/proto_merger/proto_file.cc @@ -249,6 +249,14 @@ ProtoFile::Message MessageFromDescriptor( const google::protobuf::Descriptor& desc) { auto message = InitFromDescriptor(desc); message.name = desc.name(); + + for (int i = 0; i < desc.reserved_range_count(); ++i) { + const auto* range = desc.reserved_range(i); + for (int num = range->start; num < range->end; ++num) { + message.reserved_numbers.insert(num); + } + } + for (int i = 0; i < desc.enum_type_count(); ++i) { message.enums.emplace_back(EnumFromDescriptor(*desc.enum_type(i))); } diff --git a/src/tools/proto_merger/proto_file.h b/src/tools/proto_merger/proto_file.h index 08a410ba0be..ad5aaef40ab 100644 --- a/src/tools/proto_merger/proto_file.h +++ b/src/tools/proto_merger/proto_file.h @@ -18,6 +18,7 @@ #define SRC_TOOLS_PROTO_MERGER_PROTO_FILE_H_ #include +#include #include // We include this intentionally instead of forward declaring to allow @@ -69,6 +70,8 @@ struct ProtoFile { std::vector oneofs; std::vector fields; + std::unordered_set reserved_numbers; + std::vector deleted_enums; std::vector deleted_nested_messages; std::vector deleted_oneofs; diff --git a/src/tools/proto_merger/proto_file_serializer_unittest.cc b/src/tools/proto_merger/proto_file_serializer_unittest.cc index 434b0c403cd..92d7e86e9ef 100644 --- a/src/tools/proto_merger/proto_file_serializer_unittest.cc +++ b/src/tools/proto_merger/proto_file_serializer_unittest.cc @@ -640,6 +640,127 @@ TEST(ProtoFileSerializerTest, PassthroughDeepRecursion) { EXPECT_THAT(out, HasSubstr("proto_filter_merge_passthrough) = true")); } +TEST(ProtoFileSerializerTest, ReservedUpstreamFieldIsMarkedDeprecated) { + ProtoFile input; + { + ProtoFile::Message message{}; + message.name = "Container"; + message.fields.push_back(MakeField("int32", "active_field", 1)); + message.fields.push_back(MakeField("string", "reserved_field", 2)); + message.fields.push_back(MakeField("bool", "truly_deleted_field", 3)); + input.messages.push_back(message); + } + + ProtoFile upstream; + { + ProtoFile::Message message{}; + message.name = "Container"; + message.fields.push_back(MakeField("int32", "active_field", 1)); + + // Field 2 is marked reserved upstream (not in fields list) + message.reserved_numbers.insert(2); + // Field 3 was removed completely without reserving + + upstream.messages.push_back(message); + } + + ProtoFile merged; + ASSERT_TRUE(MergeProtoFiles(input, upstream, Allowlist{}, merged).ok()); + + std::string out = ProtoFileToDotProto(merged); + + // 1. active_field is present as normal + EXPECT_THAT(out, HasSubstr("int32 active_field = 1;")); + + // 2. reserved_field is kept in active fields with [deprecated = true] + EXPECT_THAT(out, HasSubstr("string reserved_field = 2 [deprecated = true];")); + + // 3. truly_deleted_field is placed in the commented-out section + EXPECT_THAT(out, HasSubstr("bool truly_deleted_field = 3;")); + EXPECT_THAT(out, HasSubstr("not present upstream")); +} + +TEST(ProtoFileSerializerTest, EndToEndReservedFieldMerge) { + struct ScopedUnlink { + std::string path; + ~ScopedUnlink() { base::Unlink(path.c_str()); } + }; + + base::TempDir temp_dir = base::TempDir::Create(); + std::string input_path = temp_dir.path() + "/input.proto"; + std::string upstream_path = temp_dir.path() + "/upstream.proto"; + + ScopedUnlink unlink_input{input_path}; + ScopedUnlink unlink_upstream{upstream_path}; + + std::string input_content = R"( + syntax = "proto2"; + package perfetto.protos; + + // --- PREAMBLE ENDS HERE - EVERYTHING BELOW AUTOGENERATED --- + + message Config { + optional int32 active_field = 1; + optional string legacy_field = 2; + optional bool deleted_field = 3; + } + )"; + + std::string upstream_content = R"( + syntax = "proto2"; + package perfetto.protos; + + message Config { + optional int32 active_field = 1; + reserved 2; + } + )"; + + { + base::ScopedFile file(base::OpenFile(input_path, O_CREAT | O_WRONLY, 0600)); + ASSERT_TRUE(file); + ASSERT_TRUE( + base::WriteAll(*file, input_content.c_str(), input_content.size())); + } + { + base::ScopedFile file( + base::OpenFile(upstream_path, O_CREAT | O_WRONLY, 0600)); + ASSERT_TRUE(file); + ASSERT_TRUE(base::WriteAll(*file, upstream_content.c_str(), + upstream_content.size())); + } + + protozero::MultiFileErrorCollectorImpl mfe; + // Use google::protobuf::compiler here: + google::protobuf::compiler::DiskSourceTree dst; + dst.MapPath("", temp_dir.path()); + dst.MapPath("", "."); + dst.MapPath("", "buildtools/protobuf/src"); + + google::protobuf::compiler::Importer importer_input(&dst, &mfe); + const auto* input_desc = importer_input.Import("input.proto"); + + google::protobuf::compiler::Importer importer_upstream(&dst, &mfe); + const auto* upstream_desc = importer_upstream.Import("upstream.proto"); + + ASSERT_NE(input_desc, nullptr); + ASSERT_NE(upstream_desc, nullptr); + + ProtoFile input_file = ProtoFileFromDescriptor("", *input_desc); + ProtoFile upstream_file = ProtoFileFromDescriptor("", *upstream_desc); + + ProtoFile merged; + ASSERT_TRUE( + MergeProtoFiles(input_file, upstream_file, Allowlist{}, merged).ok()); + + std::string out = ProtoFileToDotProto(merged); + + EXPECT_THAT(out, HasSubstr("int32 active_field = 1;")); + EXPECT_THAT(out, HasSubstr("string legacy_field = 2 [deprecated = true];")); + EXPECT_THAT(out, HasSubstr("bool deleted_field = 3;")); + EXPECT_THAT(out, HasSubstr("not present upstream")); +} + } // namespace } // namespace proto_merger } // namespace perfetto diff --git a/src/tools/proto_merger/proto_merger.cc b/src/tools/proto_merger/proto_merger.cc index 7cb5895c185..4354a2c7347 100644 --- a/src/tools/proto_merger/proto_merger.cc +++ b/src/tools/proto_merger/proto_merger.cc @@ -73,6 +73,17 @@ void MergeAllowlistedOptions(const std::vector& upstream, } } +void MarkFieldAsDeprecated(ProtoFile::Field& field) { + auto it = std::find_if( + field.options.begin(), field.options.end(), + [](const ProtoFile::Option& opt) { return opt.key == "deprecated"; }); + if (it != field.options.end()) { + it->value = "true"; + } else { + field.options.push_back(ProtoFile::Option{"deprecated", "true"}); + } +} + template std::optional FindInMap(const std::map& map, const Key& key) { @@ -374,6 +385,13 @@ base::Status MergeFields(const std::vector& input, return status; out.emplace_back(std::move(out_field)); } + + // Sort all fields by tag number so reserved/deprecated fields are in place. + std::sort(out.begin(), out.end(), + [](const ProtoFile::Field& a, const ProtoFile::Field& b) { + return a.number < b.number; + }); + return base::OkStatus(); } @@ -476,7 +494,18 @@ base::Status Merge(const ProtoFile::Message& input, out.deleted_nested_messages = ComputeDeletedByName(input.nested_messages, upstream.nested_messages); out.deleted_oneofs = ComputeDeletedByName(input.oneofs, upstream.oneofs); - out.deleted_fields = ComputeDeletedByNumber(input.fields, upstream.fields); + + // Check if fields in input are deprecated in upstream or deleted. + std::vector missing_fields = + ComputeDeletedByNumber(input.fields, upstream.fields); + for (auto& field : missing_fields) { + if (upstream.reserved_numbers.count(field.number)) { + MarkFieldAsDeprecated(field); + out.fields.emplace_back(std::move(field)); + } else { + out.deleted_fields.emplace_back(std::move(field)); + } + } // Merge any nested enum types. out.enums = MergeEnums(input.enums, upstream.enums, allowlist.enums, diff --git a/src/trace_processor/BUILD.gn b/src/trace_processor/BUILD.gn index 1ed0cf95763..26290fba021 100644 --- a/src/trace_processor/BUILD.gn +++ b/src/trace_processor/BUILD.gn @@ -246,6 +246,7 @@ if (enable_perfetto_trace_processor_sqlite) { "plugins/experimental_flamegraph", "plugins/experimental_flat_slice", "plugins/experimental_slice_layout", + "plugins/flamegraph:intrinsics", "plugins/graph_scan", "plugins/graph_traversal", "plugins/import", diff --git a/src/trace_processor/core/common/storage_types.h b/src/trace_processor/core/common/storage_types.h index fdeffffb00e..7b9b2aa8564 100644 --- a/src/trace_processor/core/common/storage_types.h +++ b/src/trace_processor/core/common/storage_types.h @@ -57,6 +57,12 @@ struct String { using cpp_type = StringPool::Id; }; +// Represents a column with no values at all: every row is null. Such columns +// carry no payload and no underlying value type. +struct Null { + using cpp_type = void; +}; + // TypeSet of all possible storage value types. using StorageType = core::TypeSet; diff --git a/src/trace_processor/core/dataframe/arrow_deserializer.cc b/src/trace_processor/core/dataframe/arrow_deserializer.cc index 5febbb167ab..160c43143ea 100644 --- a/src/trace_processor/core/dataframe/arrow_deserializer.cc +++ b/src/trace_processor/core/dataframe/arrow_deserializer.cc @@ -69,8 +69,26 @@ class BodyReader { base::StatusOr ReadVariableSize() { return Read(0, false); } + // Returns the buffer as the pieces it arrived in. Callers which only copy the + // bytes out can consume those directly, where ReadExact would first have to + // join them into one allocation. + base::StatusOr> ReadExactPieces( + uint64_t expected_size) { + ASSIGN_OR_RETURN(ArrowBuffer buffer, Next(expected_size, true)); + auto size = static_cast(buffer.length); + std::vector pieces = data_.MultiSliceOff( + body_offset_ + static_cast(buffer.offset), size); + size_t total = 0; + for (const TraceBlobView& piece : pieces) { + total += piece.size(); + } + return total == size + ? base::StatusOr>(std::move(pieces)) + : base::StatusOr>(InvalidFile()); + } + private: - base::StatusOr Read(uint64_t expected_size, bool exact) { + base::StatusOr Next(uint64_t expected_size, bool exact) { if (next_buffer_ >= buffers_.size()) { return InvalidFile(); } @@ -79,7 +97,12 @@ class BodyReader { if ((exact && size != expected_size) || (!exact && size < expected_size)) { return InvalidFile(); } - if (!size) { + return buffer; + } + + base::StatusOr Read(uint64_t expected_size, bool exact) { + ASSIGN_OR_RETURN(ArrowBuffer buffer, Next(expected_size, exact)); + if (!buffer.length) { return TraceBlobView{}; } auto blob = @@ -107,72 +130,114 @@ base::StatusOr ReadValidityBuffer(BodyReader* reader, ASSIGN_OR_RETURN(TraceBlobView bitmap, reader->ReadExact(ValidityBufferSize(rows))); - BitVector validity = BitVector::CreateWithSize(rows, false); - int64_t nulls = rows; - for (uint32_t row = 0; row < rows; ++row) { - if (bitmap.data()[BitmapByteIndex(row)] & BitmapMask(row)) { - validity.set(row); - --nulls; - } - } + BitVector validity = BitVector::CreateFromBitmap(bitmap.data(), rows); + int64_t nulls = static_cast(rows) - + static_cast(validity.CountSetBits()); return nulls == expected_nulls ? base::StatusOr(std::move(validity)) : base::StatusOr(InvalidFile()); } -// Reverses WriteUtf8Buffers: validate Arrow's offsets, intern each string, and -// store the resulting StringPool IDs in dense or compact sparse storage. -base::Status ReadUtf8Buffers(BodyReader* reader, - uint32_t rows, - bool nullable, - bool sparse, - const BitVector& validity, - StringPool* pool, - Storage* storage) { +using Dictionary = FlexVector; + +// Reverses ArrowSerializer::WriteDictionary. +base::StatusOr ReadDictionaryValues(BodyReader* reader, + uint32_t count, + StringPool* pool) { + RETURN_IF_ERROR(reader->ReadEmpty()); ASSIGN_OR_RETURN(TraceBlobView offsets, - reader->ReadExact(Utf8OffsetBufferSize(rows))); + reader->ReadExact(Utf8OffsetBufferSize(count))); ASSIGN_OR_RETURN(TraceBlobView strings, reader->ReadVariableSize()); if (Load(offsets.data(), 0) != 0) { return InvalidFile(); } - auto& output = storage->unchecked_get(); - for (uint32_t row = 0; row < rows; ++row) { - int32_t start = Load(offsets.data(), row); - int32_t end = Load(offsets.data(), row + 1); + const char* bytes = + strings.size() ? reinterpret_cast(strings.data()) : ""; + Dictionary values = Dictionary::CreateWithCapacity(count); + for (uint32_t i = 0; i < count; ++i) { + int32_t start = Load(offsets.data(), i); + int32_t end = Load(offsets.data(), i + 1); if (start < 0 || end < start || static_cast(end) > strings.size()) { return InvalidFile(); } - if (!nullable || validity.is_set(row)) { - output.push_back(pool->InternString(base::StringView( - reinterpret_cast(strings.data()) + start, - static_cast(end - start)))); - } else if (!sparse) { - output.push_back({}); + values.push_back(pool->InternString( + base::StringView(bytes + start, static_cast(end - start)))); + } + if (static_cast(Load(offsets.data(), count)) != + strings.size()) { + return InvalidFile(); + } + return std::move(values); +} + +// Reverses ArrowSerializer::WriteDictionaryIndices. +base::Status ReadDictionaryIndices(BodyReader* reader, + uint32_t rows, + uint32_t stored_rows, + bool nullable, + bool sparse, + const BitVector& validity, + const Dictionary& dictionary, + Storage* storage) { + ASSIGN_OR_RETURN( + TraceBlobView indices, + reader->ReadExact(static_cast(rows) * sizeof(DictionaryIndex))); + auto& output = storage->unchecked_get(); + output.reserve(stored_rows); + for (uint32_t row = 0; row < rows; ++row) { + if (nullable && !validity.is_set(row)) { + if (!sparse) { + output.push_back({}); + } + continue; + } + DictionaryIndex index = Load(indices.data(), row); + if (index < 0 || static_cast(index) >= dictionary.size()) { + return InvalidFile(); } + output.push_back(dictionary[static_cast(index)]); + } + return base::OkStatus(); +} + +template +void VisitNumericStorage(Storage* storage, Fn fn) { + if (storage->type().Is()) { + fn(&storage->unchecked_get()); + } else if (storage->type().Is()) { + fn(&storage->unchecked_get()); + } else if (storage->type().Is()) { + fn(&storage->unchecked_get()); + } else { + fn(&storage->unchecked_get()); } - return Load(offsets.data(), rows) == - static_cast(strings.size()) - ? base::OkStatus() - : InvalidFile(); } template -void ReadNumericValues(const TraceBlobView& values, - uint32_t rows, - bool sparse, - const BitVector& validity, - FlexVector* output) { - if (!sparse) { - output->resize(rows); - if (rows) { - memcpy(output->data(), values.data(), - static_cast(rows) * sizeof(T)); - } +void CopyDenseValues(const std::vector& pieces, + uint32_t rows, + FlexVector* output) { + output->resize(rows); + if (!rows) { return; } - // Arrow has one value slot per logical row. Sparse dataframe storage keeps - // only valid values, so compact the Arrow buffer using its validity bitmap. + auto* out = reinterpret_cast(output->data()); + for (const TraceBlobView& piece : pieces) { + memcpy(out, piece.data(), piece.size()); + out += piece.size(); + } +} + +// Arrow has one value slot per logical row. Sparse dataframe storage keeps +// only valid values, so compact the Arrow buffer using its validity bitmap. +template +void CompactSparseValues(const TraceBlobView& values, + uint32_t rows, + uint32_t stored_rows, + const BitVector& validity, + FlexVector* output) { + output->reserve(stored_rows); for (uint32_t row = 0; row < rows; ++row) { if (validity.is_set(row)) { output->push_back(Load(values.data(), row)); @@ -182,25 +247,22 @@ void ReadNumericValues(const TraceBlobView& values, base::Status ReadNumericBuffer(BodyReader* reader, uint32_t rows, + uint32_t stored_rows, bool sparse, const BitVector& validity, Storage* storage) { - ASSIGN_OR_RETURN(TraceBlobView values, - reader->ReadExact(static_cast(rows) * - NumericSize(storage->type()))); - if (storage->type().Is()) { - ReadNumericValues(values, rows, sparse, validity, - &storage->unchecked_get()); - } else if (storage->type().Is()) { - ReadNumericValues(values, rows, sparse, validity, - &storage->unchecked_get()); - } else if (storage->type().Is()) { - ReadNumericValues(values, rows, sparse, validity, - &storage->unchecked_get()); - } else { - ReadNumericValues(values, rows, sparse, validity, - &storage->unchecked_get()); + uint64_t size = static_cast(rows) * NumericSize(storage->type()); + if (!sparse) { + ASSIGN_OR_RETURN(std::vector pieces, + reader->ReadExactPieces(size)); + VisitNumericStorage( + storage, [&](auto* output) { CopyDenseValues(pieces, rows, output); }); + return base::OkStatus(); } + ASSIGN_OR_RETURN(TraceBlobView values, reader->ReadExact(size)); + VisitNumericStorage(storage, [&](auto* output) { + CompactSparseValues(values, rows, stored_rows, validity, output); + }); return base::OkStatus(); } @@ -219,13 +281,15 @@ void InstallValidity(Nullability nullability, } } -struct LocatedRecordBatch { +struct LocatedBatches { + std::vector dictionaries; Block block; size_t message_offset; }; -// Phase 1: validate the outer file framing and locate the only record batch. -base::StatusOr LocateRecordBatch( +// Phase 1: validate the outer file framing and locate the dictionary batches +// and the only record batch. +base::StatusOr LocateBatches( const util::TraceBlobViewReader& data) { size_t base = data.start_offset(); size_t file_size = data.end_offset() - base; @@ -257,6 +321,9 @@ base::StatusOr LocateRecordBatch( auto footer = FlatBufferReader::GetRoot(footer_blob->data(), footer_size); auto blocks = footer ? footer->VecScalar(footer_field::kRecordBatches) : util::FlatBufferScalarVec{}; + auto dictionary_blocks = + footer ? footer->VecScalar(footer_field::kDictionaries) + : util::FlatBufferScalarVec{}; if (!footer || footer->Scalar(footer_field::kVersion, kMissingSignedValue) != kMetadataV5 || @@ -277,10 +344,44 @@ base::StatusOr LocateRecordBatch( if (block_offset > footer_relative || metadata_length > footer_relative - block_offset || body_length > footer_relative - block_offset - metadata_length || - block_offset + metadata_length + body_length != footer_relative) { + block_offset + metadata_length + body_length + kEndOfStreamSize != + footer_relative) { + return InvalidFile(); + } + + std::vector dictionaries; + dictionaries.reserve(dictionary_blocks.size()); + for (uint32_t i = 0; i < dictionary_blocks.size(); ++i) { + Block dictionary = dictionary_blocks[i]; + if (dictionary.offset < 0 || dictionary.metadata_length < 0 || + static_cast(dictionary.metadata_length) < + kMessagePrefixSize || + dictionary.body_length < 0) { + return InvalidFile(); + } + uint64_t offset = static_cast(dictionary.offset); + uint64_t metadata = static_cast(dictionary.metadata_length); + uint64_t body = static_cast(dictionary.body_length); + if (offset > block_offset || metadata > block_offset - offset || + body > block_offset - offset - metadata) { + return InvalidFile(); + } + dictionaries.push_back(dictionary); + } + auto marker = data.SliceOff( + base + static_cast(footer_relative - kEndOfStreamSize), + kEndOfStreamSize); + MessagePrefix end_of_stream{}; + if (!marker) { return InvalidFile(); } - return LocatedRecordBatch{block, base + static_cast(block_offset)}; + memcpy(&end_of_stream, marker->data(), sizeof(end_of_stream)); + if (end_of_stream.continuation != kContinuation || + end_of_stream.metadata_size != 0) { + return InvalidFile(); + } + return LocatedBatches{std::move(dictionaries), block, + base + static_cast(block_offset)}; } struct RecordBatchMetadata { @@ -291,16 +392,18 @@ struct RecordBatchMetadata { util::FlatBufferScalarVec buffers; }; -// Phase 2: parse and validate the record-batch metadata. Keeping |blob| in the -// result preserves the backing storage referenced by the flatbuffer vectors. -base::StatusOr ReadRecordBatchMetadata( - const util::TraceBlobViewReader& data, - const LocatedRecordBatch& located, - uint32_t expected_nodes, - uint32_t expected_buffers) { - uint64_t metadata_length = - static_cast(located.block.metadata_length); - auto prefix = data.SliceOff(located.message_offset, kMessagePrefixSize); +struct Message { + TraceBlobView blob; + FlatBufferReader message; + size_t body_offset; +}; + +base::StatusOr ReadMessage(const util::TraceBlobViewReader& data, + const Block& block, + size_t message_offset, + uint8_t expected_header) { + uint64_t metadata_length = static_cast(block.metadata_length); + auto prefix = data.SliceOff(message_offset, kMessagePrefixSize); uint32_t continuation = 0; int32_t metadata_size = 0; if (prefix) { @@ -315,25 +418,32 @@ base::StatusOr ReadRecordBatchMetadata( } uint32_t metadata_size_u32 = static_cast(metadata_size); - auto metadata = data.SliceOff(located.message_offset + kMessagePrefixSize, - metadata_size_u32); + auto metadata = + data.SliceOff(message_offset + kMessagePrefixSize, metadata_size_u32); auto message = metadata ? FlatBufferReader::GetRoot(metadata->data(), metadata_size_u32) : std::nullopt; - auto record_batch = - message ? message->Table(message_field::kHeader) : FlatBufferReader{}; if (!message || message->Scalar(message_field::kVersion, kMissingSignedValue) != kMetadataV5 || - message->Scalar(message_field::kHeaderType) != - kHeaderRecordBatch || - !record_batch || + message->Scalar(message_field::kHeaderType) != expected_header || message->Scalar(message_field::kBodyLength, - kMissingSignedValue) != - located.block.body_length) { + kMissingSignedValue) != block.body_length) { return InvalidFile(); } + return Message{std::move(*metadata), *message, + message_offset + static_cast(metadata_length)}; +} +// Phase 2: validate the shape of a record batch against the layout the caller +// derived from the dataframe spec. +base::StatusOr ReadRecordBatch( + Message message, + const FlatBufferReader& record_batch, + int64_t body_length, + std::optional expected_rows, + uint32_t expected_nodes, + uint32_t expected_buffers) { int64_t row_count = record_batch.Scalar(record_batch_field::kLength, kMissingSignedValue); auto nodes = record_batch.VecScalar(record_batch_field::kNodes); @@ -345,27 +455,63 @@ base::StatusOr ReadRecordBatchMetadata( } uint32_t rows = static_cast(row_count); + if (expected_rows && rows != *expected_rows) { + return InvalidFile(); + } for (uint32_t i = 0; i < nodes.size(); ++i) { FieldNode node = nodes[i]; if (node.length != rows || node.null_count < 0 || node.null_count > rows) { return InvalidFile(); } } - uint64_t body_length = static_cast(located.block.body_length); for (uint32_t i = 0; i < buffers.size(); ++i) { ArrowBuffer buffer = buffers[i]; + uint64_t body = static_cast(body_length); if (buffer.offset < 0 || buffer.length < 0 || - static_cast(buffer.offset) > body_length || + static_cast(buffer.offset) > body || static_cast(buffer.length) > - body_length - static_cast(buffer.offset)) { + body - static_cast(buffer.offset)) { return InvalidFile(); } } + return RecordBatchMetadata{std::move(message.blob), rows, message.body_offset, + nodes, buffers}; +} - size_t body_offset = - located.message_offset + static_cast(metadata_length); - return RecordBatchMetadata{std::move(*metadata), rows, body_offset, nodes, - buffers}; +base::StatusOr> ReadDictionaries( + const util::TraceBlobViewReader& data, + const LocatedBatches& located, + StringPool* pool) { + size_t base = data.start_offset(); + std::vector dictionaries; + dictionaries.reserve(located.dictionaries.size()); + for (uint32_t i = 0; i < located.dictionaries.size(); ++i) { + const Block& block = located.dictionaries[i]; + ASSIGN_OR_RETURN( + Message message, + ReadMessage(data, block, base + static_cast(block.offset), + kHeaderDictionaryBatch)); + auto batch = message.message.Table(message_field::kHeader); + if (!batch || + batch.Scalar(dictionary_batch_field::kId, + kMissingSignedValue) != i || + batch.Scalar(dictionary_batch_field::kIsDelta)) { + return InvalidFile(); + } + auto record_batch = batch.Table(dictionary_batch_field::kData); + if (!record_batch) { + return InvalidFile(); + } + ASSIGN_OR_RETURN( + RecordBatchMetadata values, + ReadRecordBatch(std::move(message), record_batch, block.body_length, + std::nullopt, 1, kUtf8BufferCount)); + BodyReader reader(data, values.body_offset, values.buffers); + ASSIGN_OR_RETURN(Dictionary dictionary, + ReadDictionaryValues(&reader, values.rows, pool)); + dictionaries.push_back(std::move(dictionary)); + } + return std::move(dictionaries); } } // namespace @@ -386,29 +532,43 @@ base::StatusOr DeserializeFromArrow( Dataframe dataframe(pool, static_cast(column_names.size()), column_names.data(), spec.column_specs.data()); - // The dataframe spec supplies the schema. Derive the exact node and buffer - // counts for the supported layout before parsing file metadata. + // The dataframe spec supplies the schema. Derive the exact node, buffer and + // dictionary counts for the supported layout before parsing file metadata. uint32_t expected_nodes = 0; uint32_t expected_buffers = 0; + uint32_t expected_dictionaries = 0; for (const auto& column : dataframe.columns_) { if (!column->storage.type().Is()) { ++expected_nodes; - expected_buffers += column->storage.type().Is() - ? kUtf8BufferCount - : kFixedWidthBufferCount; + expected_buffers += kFixedWidthBufferCount; + expected_dictionaries += column->storage.type().Is(); } } - ASSIGN_OR_RETURN(LocatedRecordBatch located, LocateRecordBatch(data)); - ASSIGN_OR_RETURN( - RecordBatchMetadata batch, - ReadRecordBatchMetadata(data, located, expected_nodes, expected_buffers)); + ASSIGN_OR_RETURN(LocatedBatches located, LocateBatches(data)); + if (located.dictionaries.size() != expected_dictionaries) { + return InvalidFile(); + } + ASSIGN_OR_RETURN(std::vector dictionaries, + ReadDictionaries(data, located, pool)); + ASSIGN_OR_RETURN(Message message, + ReadMessage(data, located.block, located.message_offset, + kHeaderRecordBatch)); + auto record_batch = message.message.Table(message_field::kHeader); + if (!record_batch) { + return InvalidFile(); + } + ASSIGN_OR_RETURN(RecordBatchMetadata batch, + ReadRecordBatch(std::move(message), record_batch, + located.block.body_length, std::nullopt, + expected_nodes, expected_buffers)); // Phase 3: decode buffers in the same validity-then-values order used by the // serializer. Id columns are reconstructed from the record-batch row count // because they are implicit and therefore absent from Arrow. BodyReader reader(data, batch.body_offset, batch.buffers); uint32_t serialized_column = 0; + uint32_t dictionary_index = 0; for (uint32_t column_index = 0; column_index < dataframe.column_count(); ++column_index) { auto& column = *dataframe.columns_[column_index]; @@ -423,12 +583,16 @@ base::StatusOr DeserializeFromArrow( ASSIGN_OR_RETURN( BitVector validity, ReadValidityBuffer(&reader, batch.rows, node.null_count, nullable)); + uint32_t stored_rows = + sparse ? batch.rows - static_cast(node.null_count) + : batch.rows; if (column.storage.type().Is()) { - RETURN_IF_ERROR(ReadUtf8Buffers(&reader, batch.rows, nullable, sparse, - validity, pool, &column.storage)); + RETURN_IF_ERROR(ReadDictionaryIndices( + &reader, batch.rows, stored_rows, nullable, sparse, validity, + dictionaries[dictionary_index++], &column.storage)); } else { - RETURN_IF_ERROR(ReadNumericBuffer(&reader, batch.rows, sparse, validity, - &column.storage)); + RETURN_IF_ERROR(ReadNumericBuffer(&reader, batch.rows, stored_rows, + sparse, validity, &column.storage)); } InstallValidity(nullability, std::move(validity), &column.null_storage); } diff --git a/src/trace_processor/core/dataframe/arrow_deserializer_unittest.cc b/src/trace_processor/core/dataframe/arrow_deserializer_unittest.cc index 207c3aec0f3..2ea02312b47 100644 --- a/src/trace_processor/core/dataframe/arrow_deserializer_unittest.cc +++ b/src/trace_processor/core/dataframe/arrow_deserializer_unittest.cc @@ -122,6 +122,34 @@ util::FlatBufferReader MutableRecordBatch(std::vector* bytes) { return record_batch; } +TestBlock ReadDictionaryBlock(const std::vector& bytes) { + size_t footer_offset = FooterOffset(bytes); + uint32_t footer_size = + static_cast(bytes.size() - 10 - footer_offset); + auto footer = util::FlatBufferReader::GetRoot(bytes.data() + footer_offset, + footer_size); + EXPECT_TRUE(footer.has_value()); + auto blocks = footer->VecScalar(2); + EXPECT_EQ(blocks.size(), 1u); + return blocks[0]; +} + +util::FlatBufferReader MutableDictionaryRecordBatch( + std::vector* bytes) { + TestBlock block = ReadDictionaryBlock(*bytes); + uint32_t metadata_size; + memcpy(&metadata_size, bytes->data() + block.offset + 4, + sizeof(metadata_size)); + auto message = util::FlatBufferReader::GetRoot( + bytes->data() + block.offset + 8, metadata_size); + EXPECT_TRUE(message.has_value()); + auto dictionary_batch = message->Table(2); + EXPECT_TRUE(static_cast(dictionary_batch)); + auto record_batch = dictionary_batch.Table(1); + EXPECT_TRUE(static_cast(record_batch)); + return record_batch; +} + inline constexpr auto kUint32NonNull = CreateTypedDataframeSpec( {"_auto_id", "val"}, CreateTypedColumnSpec(Id{}, NonNull{}, IdSorted{}, NoDuplicates{}), @@ -574,6 +602,17 @@ TEST(ArrowDeserializerTest, RejectsInconsistentBlockLength) { EXPECT_THAT(Deserialize(bytes, &pool, dst.CreateSpec()), IsError()); } +TEST(ArrowDeserializerTest, RejectsCorruptEndOfStreamMarker) { + StringPool pool; + auto src = MakeDataframe(kUint32NonNull, &pool, uint32_t{1}); + std::vector bytes = Serialize(src, pool); + + uint32_t garbage = 0; + memcpy(bytes.data() + FooterOffset(bytes) - 8, &garbage, sizeof(garbage)); + auto dst = Dataframe::CreateFromTypedSpec(kUint32NonNull, &pool); + EXPECT_THAT(Deserialize(bytes, &pool, dst.CreateSpec()), IsError()); +} + TEST(ArrowDeserializerTest, RejectsInconsistentFieldNode) { StringPool pool; auto src = MakeDataframe(kUint32NonNull, &pool, uint32_t{1}); @@ -613,8 +652,8 @@ TEST(ArrowDeserializerTest, RejectsInvalidStringOffsets) { auto src = MakeDataframe(kStringNonNull, &pool, value); std::vector bytes = Serialize(src, pool); - TestBlock block = ReadBlock(bytes); - auto record_batch = MutableRecordBatch(&bytes); + TestBlock block = ReadDictionaryBlock(bytes); + auto record_batch = MutableDictionaryRecordBatch(&bytes); uint8_t* buffer_data = MutableVectorData(&bytes, record_batch, 2); TestArrowBuffer offsets_buffer; memcpy(&offsets_buffer, buffer_data + sizeof(TestArrowBuffer), @@ -628,6 +667,27 @@ TEST(ArrowDeserializerTest, RejectsInvalidStringOffsets) { EXPECT_THAT(Deserialize(bytes, &pool, dst.CreateSpec()), IsError()); } +TEST(ArrowDeserializerTest, RejectsOutOfRangeDictionaryIndex) { + StringPool pool; + auto value = pool.InternString(base::StringView("value")); + auto src = MakeDataframe(kStringNonNull, &pool, value); + std::vector bytes = Serialize(src, pool); + + TestBlock block = ReadBlock(bytes); + auto record_batch = MutableRecordBatch(&bytes); + uint8_t* buffer_data = MutableVectorData(&bytes, record_batch, 2); + TestArrowBuffer indices_buffer; + memcpy(&indices_buffer, buffer_data + sizeof(TestArrowBuffer), + sizeof(indices_buffer)); + int32_t invalid_index = 1; + memcpy(bytes.data() + block.offset + block.metadata_length + + indices_buffer.offset, + &invalid_index, sizeof(invalid_index)); + + auto dst = Dataframe::CreateFromTypedSpec(kStringNonNull, &pool); + EXPECT_THAT(Deserialize(bytes, &pool, dst.CreateSpec()), IsError()); +} + TEST(ArrowDeserializerTest, RejectsSchemaShapeMismatch) { StringPool pool; auto src = MakeDataframe(kUint32NonNull, &pool, uint32_t{1}); diff --git a/src/trace_processor/core/dataframe/arrow_internal.h b/src/trace_processor/core/dataframe/arrow_internal.h index 97d997c9143..8496adc613e 100644 --- a/src/trace_processor/core/dataframe/arrow_internal.h +++ b/src/trace_processor/core/dataframe/arrow_internal.h @@ -39,6 +39,7 @@ constexpr uint8_t kPaddedMagic[] = {'A', 'R', 'R', 'O', 'W', '1', 0, 0}; constexpr uint32_t kContinuation = 0xFFFFFFFF; constexpr int16_t kMetadataV5 = 4; constexpr uint8_t kHeaderSchema = 1; +constexpr uint8_t kHeaderDictionaryBatch = 2; constexpr uint8_t kHeaderRecordBatch = 3; constexpr uint8_t kTypeInt = 2; constexpr uint8_t kTypeFloatingPoint = 3; @@ -49,16 +50,22 @@ constexpr int16_t kEndiannessLittle = 0; constexpr uint32_t kArrowAlignment = 8; constexpr uint32_t kBitsPerByte = 8; constexpr uint32_t kMessagePrefixSize = 8; +constexpr uint32_t kEndOfStreamSize = kMessagePrefixSize; constexpr uint32_t kFooterSizeFieldSize = sizeof(uint32_t); constexpr uint32_t kFileTrailerSize = kFooterSizeFieldSize + sizeof(kMagic); constexpr uint32_t kMinimumFileSize = sizeof(kPaddedMagic) + kFooterSizeFieldSize + sizeof(kMagic); constexpr uint32_t kFixedWidthBufferCount = 2; // Validity + values. constexpr uint32_t kUtf8BufferCount = 3; // Validity + offsets + bytes. -constexpr uint32_t kDictionaryBatchCount = 0; constexpr uint32_t kRecordBatchCount = 1; constexpr int64_t kMissingSignedValue = -1; +// String columns are dictionary encoded: the record batch holds int32 indices +// and the values live in a dictionary batch, mirroring how a dataframe stores +// StringPool ids. +constexpr int32_t kDictionaryIndexBits = 32; +using DictionaryIndex = int32_t; + // Field indices from the official Arrow flatbuffer schema. namespace int_field { constexpr uint32_t kBitWidth = 0; @@ -72,7 +79,18 @@ constexpr uint32_t kName = 0; constexpr uint32_t kNullable = 1; constexpr uint32_t kTypeType = 2; constexpr uint32_t kType = 3; +constexpr uint32_t kDictionary = 4; } // namespace field_field +namespace dictionary_encoding_field { +constexpr uint32_t kId = 0; +constexpr uint32_t kIndexType = 1; +constexpr uint32_t kIsOrdered = 2; +} // namespace dictionary_encoding_field +namespace dictionary_batch_field { +constexpr uint32_t kId = 0; +constexpr uint32_t kData = 1; +constexpr uint32_t kIsDelta = 2; +} // namespace dictionary_batch_field namespace schema_field { constexpr uint32_t kEndianness = 0; constexpr uint32_t kFields = 1; @@ -134,8 +152,8 @@ inline uint64_t ValidityBufferSize(uint32_t rows) { return (static_cast(rows) + kBitsPerByte - 1) / kBitsPerByte; } -inline uint64_t Utf8OffsetBufferSize(uint32_t rows) { - return (static_cast(rows) + 1) * sizeof(int32_t); +inline uint64_t Utf8OffsetBufferSize(uint32_t values) { + return (static_cast(values) + 1) * sizeof(int32_t); } inline size_t BitmapByteIndex(uint32_t row) { diff --git a/src/trace_processor/core/dataframe/arrow_serializer.cc b/src/trace_processor/core/dataframe/arrow_serializer.cc index 6e9758b3df9..e1722f6756b 100644 --- a/src/trace_processor/core/dataframe/arrow_serializer.cc +++ b/src/trace_processor/core/dataframe/arrow_serializer.cc @@ -27,6 +27,7 @@ #include "perfetto/base/logging.h" #include "perfetto/base/status.h" +#include "perfetto/ext/base/flat_hash_map.h" #include "perfetto/ext/base/status_macros.h" #include "perfetto/ext/base/status_or.h" #include "src/trace_processor/containers/string_pool.h" @@ -46,6 +47,15 @@ struct ArrowSerializer::BodyPlan { std::vector buffers; }; +struct ArrowSerializer::DictionaryPlan { + std::vector values; + base::FlatHashMap index_by_id; + uint32_t data_length = 0; + uint64_t body_size = 0; + std::vector buffers; + std::vector message; +}; + namespace { using W = util::FlatBufferWriter; @@ -163,11 +173,8 @@ class BufferedOutput { }; int64_t CountNulls(uint32_t rows, const BitVector& validity) { - int64_t nulls = 0; - for (uint32_t row = 0; row < rows; ++row) { - nulls += !validity.is_set(row); - } - return nulls; + PERFETTO_DCHECK(validity.size() == rows); + return rows - static_cast(validity.CountSetBits()); } // Maps Arrow's logical row index to dataframe's physical storage index. Dense @@ -193,27 +200,6 @@ class StorageIndexMapper { uint32_t sparse_row_ = 0; }; -base::StatusOr MeasureUtf8(uint32_t rows, - const Column& column, - const StringPool& pool, - const BitVector* validity, - bool sparse) { - const auto* ids = column.storage.unchecked_data(); - StorageIndexMapper mapper(validity, sparse); - uint32_t bytes = 0; - for (uint32_t row = 0; row < rows; ++row) { - if (mapper.HasValue(row)) { - size_t size = pool.Get(ids[mapper.Take(row)]).size(); - if (size > - static_cast(std::numeric_limits::max() - bytes)) { - return base::ErrStatus("String column is too large for Arrow Utf8"); - } - bytes += static_cast(size); - } - } - return bytes; -} - // Small subset of the Arrow flatbuffer schema used by this file. W::Offset BuildInt(W& w, int32_t width, bool is_signed) { w.StartTable(); @@ -233,15 +219,27 @@ W::Offset BuildUtf8(W& w) { return w.EndTable(); } +W::Offset BuildDictionaryEncoding(W& w, int64_t id) { + auto index_type = BuildInt(w, kDictionaryIndexBits, true); + w.StartTable(); + w.FieldI64(dictionary_encoding_field::kId, id); + w.FieldOffset(dictionary_encoding_field::kIndexType, index_type); + return w.EndTable(); +} + W::Offset BuildField(W& w, const std::string& name, StorageType type, - bool nullable) { + bool nullable, + int64_t dictionary_id) { uint8_t arrow_type; W::Offset type_table; + W::Offset dictionary; + bool has_dictionary = type.Is(); if (type.Is()) { arrow_type = kTypeUtf8; type_table = BuildUtf8(w); + dictionary = BuildDictionaryEncoding(w, dictionary_id); } else if (type.Is()) { arrow_type = kTypeFloatingPoint; type_table = BuildFloatingPoint(w); @@ -257,6 +255,9 @@ W::Offset BuildField(W& w, w.FieldBool(field_field::kNullable, nullable); w.FieldU8(field_field::kTypeType, arrow_type); w.FieldOffset(field_field::kType, type_table); + if (has_dictionary) { + w.FieldOffset(field_field::kDictionary, dictionary); + } return w.EndTable(); } @@ -289,11 +290,27 @@ W::Offset BuildRecordBatch(W& w, return w.EndTable(); } -W::Offset BuildFooter(W& w, W::Offset schema, const Block& block) { +W::Offset BuildDictionaryBatch(W& w, + int64_t id, + uint32_t length, + const std::vector& buffers) { + std::vector nodes{FieldNode{length, 0}}; + auto data = BuildRecordBatch(w, length, nodes, buffers); + w.StartTable(); + w.FieldI64(dictionary_batch_field::kId, id); + w.FieldOffset(dictionary_batch_field::kData, data); + return w.EndTable(); +} + +W::Offset BuildFooter(W& w, + W::Offset schema, + const std::vector& dictionary_blocks, + const Block& block) { auto blocks = w.WriteVecStruct(&block, sizeof(block), kRecordBatchCount, alignof(int64_t)); - auto dictionaries = w.WriteVecStruct(nullptr, sizeof(Block), - kDictionaryBatchCount, alignof(int64_t)); + auto dictionaries = w.WriteVecStruct( + dictionary_blocks.data(), sizeof(Block), + static_cast(dictionary_blocks.size()), alignof(int64_t)); w.StartTable(); w.FieldI16(footer_field::kVersion, kMetadataV5); w.FieldOffset(footer_field::kSchema, schema); @@ -325,49 +342,21 @@ base::Status WriteValidityBuffer(uint32_t rows, return output.Finish(); } -// Arrow Utf8 stores an offset per logical row followed by one contiguous byte -// buffer. Dataframe stores StringPool IDs, so this is where IDs are resolved -// and their bytes are streamed in Arrow's representation. -base::Status WriteUtf8Buffers(uint32_t rows, - const Column& column, - const StringPool& pool, - const BitVector* validity, - bool sparse, - uint32_t string_bytes, - FlexVector* scratch, - const ArrowSerializer::WriteFn& write) { - size_t offsets_bytes = static_cast(Utf8OffsetBufferSize(rows)); - const auto* ids = column.storage.unchecked_data(); - BufferedOutput output(scratch, write); - - // Offset buffer. Resolving IDs here only reads string lengths; bytes are - // emitted in the second pass below. - StorageIndexMapper offset_mapper(validity, sparse); +base::Status WriteUtf8OffsetBuffer(const std::vector& values, + const StringPool& pool, + uint32_t data_length, + BufferedOutput* output) { int32_t offset = 0; - for (uint32_t row = 0; row < rows; ++row) { - RETURN_IF_ERROR(output.Append(&offset, sizeof(offset))); - if (offset_mapper.HasValue(row)) { - offset += - static_cast(pool.Get(ids[offset_mapper.Take(row)]).size()); - } - } - RETURN_IF_ERROR(output.Append(&offset, sizeof(offset))); - RETURN_IF_ERROR(output.AppendPadding( - static_cast(AlignToArrow(offsets_bytes)) - offsets_bytes)); - PERFETTO_CHECK(static_cast(offset) == string_bytes); - - // Data buffer. Values already live in the StringPool, so stream those bytes - // directly instead of gathering the whole Arrow buffer in memory. - StorageIndexMapper string_mapper(validity, sparse); - for (uint32_t row = 0; row < rows; ++row) { - if (string_mapper.HasValue(row)) { - NullTermStringView value = pool.Get(ids[string_mapper.Take(row)]); - RETURN_IF_ERROR(output.Append(value.data(), value.size())); - } + for (StringPool::Id id : values) { + RETURN_IF_ERROR(output->Append(&offset, sizeof(offset))); + offset += static_cast(pool.Get(id).size()); } - RETURN_IF_ERROR(output.AppendPadding( - static_cast(AlignToArrow(string_bytes)) - string_bytes)); - return output.Finish(); + RETURN_IF_ERROR(output->Append(&offset, sizeof(offset))); + PERFETTO_CHECK(static_cast(offset) == data_length); + size_t bytes = static_cast( + Utf8OffsetBufferSize(static_cast(values.size()))); + return output->AppendPadding(static_cast(AlignToArrow(bytes)) - + bytes); } base::Status WriteIdBuffer(uint32_t rows, @@ -421,14 +410,68 @@ base::Status WriteNumericBuffer(uint32_t rows, ArrowSerializer::ArrowSerializer(IdColumnMode id_column_mode) : id_column_mode_(id_column_mode) {} +ArrowSerializer::~ArrowSerializer() = default; + void ArrowSerializer::Reset() { prepared_dataframe_ = nullptr; prepared_string_pool_ = nullptr; prepared_columns_.clear(); + dictionaries_.clear(); header_.clear(); + batch_header_.clear(); trailer_.clear(); } +// Collects the distinct StringPool ids of a column in first-appearance order +// and lays out the dictionary batch which will carry their bytes. +base::Status ArrowSerializer::PlanDictionary(uint32_t rows, + const Column& column, + const StringPool& pool, + const BitVector* validity, + bool sparse) { + constexpr uint32_t kMaxData = + static_cast(std::numeric_limits::max()); + constexpr size_t kMaxValues = + static_cast(std::numeric_limits::max()); + + DictionaryPlan dictionary; + const auto* ids = column.storage.unchecked_data(); + StorageIndexMapper mapper(validity, sparse); + for (uint32_t row = 0; row < rows; ++row) { + if (!mapper.HasValue(row)) { + continue; + } + StringPool::Id id = ids[mapper.Take(row)]; + auto [index, inserted] = dictionary.index_by_id.Insert( + id.raw_id(), static_cast(dictionary.values.size())); + if (!inserted) { + continue; + } + if (dictionary.values.size() == kMaxValues) { + return base::ErrStatus("String column has too many distinct values"); + } + size_t size = pool.Get(id).size(); + if (size > kMaxData - dictionary.data_length) { + return base::ErrStatus("String column is too large for Arrow Utf8"); + } + dictionary.data_length += static_cast(size); + dictionary.values.push_back(id); + } + + auto values = static_cast(dictionary.values.size()); + uint64_t cursor = 0; + dictionary.buffers.push_back({0, 0}); + ASSIGN_OR_RETURN(auto offsets_buffer, + AddBuffer(Utf8OffsetBufferSize(values), &cursor)); + dictionary.buffers.push_back(offsets_buffer); + ASSIGN_OR_RETURN(auto data_buffer, + AddBuffer(dictionary.data_length, &cursor)); + dictionary.buffers.push_back(data_buffer); + dictionary.body_size = cursor; + dictionaries_.push_back(std::move(dictionary)); + return base::OkStatus(); +} + // Phase 1: derive the exact record-batch body layout from the dataframe. Arrow // metadata stores every buffer offset before the body, so this pass also // measures variable-width strings. @@ -463,18 +506,16 @@ base::Status ArrowSerializer::PlanBody(const Dataframe& dataframe, } if (type.Is()) { - ASSIGN_OR_RETURN( - auto offsets_buffer, - AddBuffer(Utf8OffsetBufferSize(plan->rows), &body_cursor)); - plan->buffers.push_back(offsets_buffer); const BitVector* validity = nullable ? &column.null_storage.GetNullBitVector() : nullptr; - ASSIGN_OR_RETURN(uint32_t string_bytes, - MeasureUtf8(plan->rows, column, pool, validity, sparse)); - prepared.string_data_length = string_bytes; - ASSIGN_OR_RETURN(auto string_buffer, - AddBuffer(string_bytes, &body_cursor)); - plan->buffers.push_back(string_buffer); + prepared.dictionary = static_cast(dictionaries_.size()); + RETURN_IF_ERROR( + PlanDictionary(plan->rows, column, pool, validity, sparse)); + ASSIGN_OR_RETURN( + auto index_buffer, + AddBuffer(static_cast(plan->rows) * sizeof(DictionaryIndex), + &body_cursor)); + plan->buffers.push_back(index_buffer); } else { ASSIGN_OR_RETURN( auto data_buffer, @@ -497,8 +538,9 @@ base::Status ArrowSerializer::BuildFileFraming(const BodyPlan& plan) { std::vector fields; fields.reserve(prepared_columns_.size()); for (const auto& column : prepared_columns_) { - fields.push_back( - BuildField(w, column.name, column.storage_type, column.nullable)); + fields.push_back(BuildField(w, column.name, column.storage_type, + column.nullable, + static_cast(column.dictionary))); } auto field_vector = w.WriteVecOffsets(fields.data(), static_cast(fields.size())); @@ -527,21 +569,48 @@ base::Status ArrowSerializer::BuildFileFraming(const BodyPlan& plan) { return base::ErrStatus("Arrow metadata is too large"); } + Append(&header_, kPaddedMagic, sizeof(kPaddedMagic)); + AppendMessage(&header_, schema, schema_size); + + uint64_t cursor = header_.size(); + std::vector dictionary_blocks; + dictionary_blocks.reserve(dictionaries_.size()); + for (uint32_t i = 0; i < dictionaries_.size(); ++i) { + DictionaryPlan& dictionary = dictionaries_[i]; + W writer; + auto values = static_cast(dictionary.values.size()); + std::vector dictionary_metadata = FinishFlatbuffer( + &writer, BuildMessage(writer, kHeaderDictionaryBatch, + BuildDictionaryBatch(writer, i, values, + dictionary.buffers), + static_cast(dictionary.body_size))); + auto size = static_cast(AlignToArrow(dictionary_metadata.size())); + if (size > maximum_metadata_size) { + return base::ErrStatus("Arrow metadata is too large"); + } + AppendMessage(&dictionary.message, dictionary_metadata, size); + dictionary_blocks.push_back( + Block{static_cast(cursor), + static_cast(kMessagePrefixSize + size), + {}, + static_cast(dictionary.body_size)}); + cursor += dictionary.message.size() + dictionary.body_size; + } + W footer_writer; - Block block{static_cast(sizeof(kPaddedMagic) + kMessagePrefixSize + - schema_size), + Block block{static_cast(cursor), static_cast(kMessagePrefixSize + metadata_size), {}, static_cast(plan.size)}; std::vector footer = FinishFlatbuffer( - &footer_writer, - BuildFooter(footer_writer, build_schema(footer_writer), block)); - - // Assemble framing separately from the body so Write() only needs to stream - // header, column buffers, and footer in that order. - Append(&header_, kPaddedMagic, sizeof(kPaddedMagic)); - AppendMessage(&header_, schema, schema_size); - AppendMessage(&header_, batch_metadata, metadata_size); + &footer_writer, BuildFooter(footer_writer, build_schema(footer_writer), + dictionary_blocks, block)); + + AppendMessage(&batch_header_, batch_metadata, metadata_size); + // Readers which walk the message stream instead of the footer rely on the + // end-of-stream marker to stop before the footer. + AppendU32(&trailer_, kContinuation); + AppendU32(&trailer_, 0); Append(&trailer_, footer.data(), footer.size()); AppendU32(&trailer_, static_cast(footer.size())); Append(&trailer_, kMagic, sizeof(kMagic)); @@ -566,22 +635,70 @@ base::StatusOr ArrowSerializer::Prepare(const Dataframe& dataframe, // Phase 3: validate the final platform-sized result and record the objects // whose identity and mutation count Write() must verify. - uint64_t total = header_.size() + plan.size + trailer_.size(); - uint64_t max_output_size = std::numeric_limits::max(); - if (total < plan.size || total > max_output_size) { + constexpr uint64_t kMaxOutputSize = std::numeric_limits::max(); + uint64_t total = header_.size() + batch_header_.size() + trailer_.size(); + for (const DictionaryPlan& dictionary : dictionaries_) { + uint64_t dictionary_size = dictionary.message.size() + dictionary.body_size; + if (dictionary_size > kMaxOutputSize - total) { + return base::ErrStatus("Dataframe is too large for an Arrow file"); + } + total += dictionary_size; + } + if (plan.size > kMaxOutputSize - total) { return base::ErrStatus("Dataframe is too large for an Arrow file"); } + total += plan.size; prepared_dataframe_ = &dataframe; prepared_string_pool_ = &pool; prepared_mutations_ = dataframe.mutations(); return static_cast(total); } +base::Status ArrowSerializer::WriteDictionary(const DictionaryPlan& dictionary, + const StringPool& pool, + const WriteFn& write) { + BufferedOutput output(&scratch_, write); + RETURN_IF_ERROR(WriteUtf8OffsetBuffer(dictionary.values, pool, + dictionary.data_length, &output)); + for (StringPool::Id id : dictionary.values) { + NullTermStringView value = pool.Get(id); + RETURN_IF_ERROR(output.Append(value.data(), value.size())); + } + RETURN_IF_ERROR(output.AppendPadding(static_cast( + AlignToArrow(dictionary.data_length) - dictionary.data_length))); + return output.Finish(); +} + +base::Status ArrowSerializer::WriteDictionaryIndices( + uint32_t rows, + const Column& column, + bool sparse, + const BitVector* validity, + const DictionaryPlan& dictionary, + const WriteFn& write) { + const auto* ids = column.storage.unchecked_data(); + BufferedOutput output(&scratch_, write); + StorageIndexMapper mapper(validity, sparse); + for (uint32_t row = 0; row < rows; ++row) { + DictionaryIndex index = 0; + if (mapper.HasValue(row)) { + const uint32_t* found = + dictionary.index_by_id.Find(ids[mapper.Take(row)].raw_id()); + PERFETTO_CHECK(found); + index = static_cast(*found); + } + RETURN_IF_ERROR(output.Append(&index, sizeof(index))); + } + size_t bytes = static_cast(rows) * sizeof(DictionaryIndex); + RETURN_IF_ERROR( + output.AppendPadding(static_cast(AlignToArrow(bytes)) - bytes)); + return output.Finish(); +} + // Phase 4: materialize the buffers planned by PlanBody(). Each logical column -// is encoded as validity followed by either Utf8's offsets and bytes or one -// fixed-width numeric buffer. +// is encoded as validity followed by one fixed-width buffer holding either the +// numeric values or the dictionary indices. base::Status ArrowSerializer::WriteBody(const Dataframe& dataframe, - const StringPool& pool, const WriteFn& write) { uint32_t rows = dataframe.row_count(); for (const auto& prepared : prepared_columns_) { @@ -596,9 +713,9 @@ base::Status ArrowSerializer::WriteBody(const Dataframe& dataframe, if (prepared.storage_type.Is()) { RETURN_IF_ERROR(WriteIdBuffer(rows, &scratch_, write)); } else if (prepared.storage_type.Is()) { - RETURN_IF_ERROR(WriteUtf8Buffers(rows, column, pool, validity, sparse, - prepared.string_data_length, &scratch_, - write)); + RETURN_IF_ERROR(WriteDictionaryIndices(rows, column, sparse, validity, + dictionaries_[prepared.dictionary], + write)); } else { RETURN_IF_ERROR( WriteNumericBuffer(rows, column, sparse, validity, &scratch_, write)); @@ -617,7 +734,13 @@ base::Status ArrowSerializer::Write(const Dataframe& dataframe, return base::ErrStatus("Dataframe changed after Arrow Prepare"); } RETURN_IF_ERROR(Emit(write, header_.data(), header_.size())); - RETURN_IF_ERROR(WriteBody(dataframe, pool, write)); + for (const DictionaryPlan& dictionary : dictionaries_) { + RETURN_IF_ERROR( + Emit(write, dictionary.message.data(), dictionary.message.size())); + RETURN_IF_ERROR(WriteDictionary(dictionary, pool, write)); + } + RETURN_IF_ERROR(Emit(write, batch_header_.data(), batch_header_.size())); + RETURN_IF_ERROR(WriteBody(dataframe, write)); return Emit(write, trailer_.data(), trailer_.size()); } diff --git a/src/trace_processor/core/dataframe/arrow_serializer.h b/src/trace_processor/core/dataframe/arrow_serializer.h index f4a9547b659..585859e95f7 100644 --- a/src/trace_processor/core/dataframe/arrow_serializer.h +++ b/src/trace_processor/core/dataframe/arrow_serializer.h @@ -37,10 +37,10 @@ namespace perfetto::trace_processor::core::dataframe { // Serializes a Dataframe as a standard Arrow file containing one record batch. // The output can be read by full Arrow implementations such as PyArrow. // -// Sparse columns are expanded to Arrow's dense logical layout, and StringPool -// IDs are encoded as Arrow Utf8 offset and data buffers. Input dataframes must -// be finalized so their column storage remains stable across the Prepare() and -// Write() passes. +// Sparse columns are expanded to Arrow's dense logical layout. String columns +// are dictionary encoded, with the values written as a dictionary batch ahead +// of the record batch. Input dataframes must be finalized so their column +// storage remains stable across the Prepare() and Write() passes. class ArrowSerializer { public: enum class IdColumnMode { @@ -54,6 +54,7 @@ class ArrowSerializer { using WriteFn = std::function; explicit ArrowSerializer(IdColumnMode = IdColumnMode::kOmit); + ~ArrowSerializer(); // Computes Arrow buffer metadata and the exact output size for a finalized // dataframe. Arrow places buffer lengths before buffer contents, so @@ -68,22 +69,39 @@ class ArrowSerializer { private: struct BodyPlan; + struct DictionaryPlan; struct PreparedColumn { uint32_t dataframe_column; std::string name; bool nullable; StorageType storage_type; - uint32_t string_data_length = 0; + uint32_t dictionary = 0; }; void Reset(); base::Status PlanBody(const Dataframe&, const StringPool&, BodyPlan*); + base::Status PlanDictionary(uint32_t rows, + const Column&, + const StringPool&, + const BitVector*, + bool sparse); base::Status BuildFileFraming(const BodyPlan&); - base::Status WriteBody(const Dataframe&, const StringPool&, const WriteFn&); + base::Status WriteDictionary(const DictionaryPlan&, + const StringPool&, + const WriteFn&); + base::Status WriteDictionaryIndices(uint32_t rows, + const Column&, + bool sparse, + const BitVector*, + const DictionaryPlan&, + const WriteFn&); + base::Status WriteBody(const Dataframe&, const WriteFn&); std::vector header_; + std::vector batch_header_; std::vector trailer_; std::vector prepared_columns_; + std::vector dictionaries_; FlexVector scratch_; const Dataframe* prepared_dataframe_ = nullptr; diff --git a/src/trace_processor/core/dataframe/arrow_serializer_unittest.cc b/src/trace_processor/core/dataframe/arrow_serializer_unittest.cc index 8aaa64307b3..acc9b5dc4e3 100644 --- a/src/trace_processor/core/dataframe/arrow_serializer_unittest.cc +++ b/src/trace_processor/core/dataframe/arrow_serializer_unittest.cc @@ -56,6 +56,12 @@ inline constexpr auto kStringNonNull = CreateTypedDataframeSpec( CreateTypedColumnSpec(Id{}, NonNull{}, IdSorted{}, NoDuplicates{}), CreateTypedColumnSpec(String{}, NonNull{}, Unsorted{})); +inline constexpr auto kTwoStrings = CreateTypedDataframeSpec( + {"_auto_id", "first", "second"}, + CreateTypedColumnSpec(Id{}, NonNull{}, IdSorted{}, NoDuplicates{}), + CreateTypedColumnSpec(String{}, NonNull{}, Unsorted{}), + CreateTypedColumnSpec(String{}, NonNull{}, Unsorted{})); + inline constexpr auto kInt32Sparse = CreateTypedDataframeSpec( {"_auto_id", "val"}, CreateTypedColumnSpec(Id{}, NonNull{}, IdSorted{}, NoDuplicates{}), @@ -73,8 +79,17 @@ struct SerializedRecordBatch { util::FlatBufferScalarVec buffers; }; -std::optional ReadRecordBatch( - const std::vector& bytes) { +size_t FooterOffset(const std::vector& bytes) { + using namespace arrow_internal; + uint32_t footer_size = + Load(bytes.data() + bytes.size() - kFileTrailerSize, 0); + return bytes.size() - kFileTrailerSize - footer_size; +} + +std::optional ReadBatch( + const std::vector& bytes, + uint32_t footer_blocks_field, + uint32_t index) { using namespace arrow_internal; if (bytes.size() < kMinimumFileSize) { return std::nullopt; @@ -84,17 +99,17 @@ std::optional ReadRecordBatch( if (footer_size > bytes.size() - kFileTrailerSize) { return std::nullopt; } - size_t footer_offset = bytes.size() - kFileTrailerSize - footer_size; + size_t footer_offset = FooterOffset(bytes); auto footer = util::FlatBufferReader::GetRoot(bytes.data() + footer_offset, footer_size); if (!footer) { return std::nullopt; } - auto blocks = footer->VecScalar(footer_field::kRecordBatches); - if (blocks.size() != kRecordBatchCount) { + auto blocks = footer->VecScalar(footer_blocks_field); + if (index >= blocks.size()) { return std::nullopt; } - Block block = blocks[0]; + Block block = blocks[index]; if (block.offset < 0 || block.metadata_length < 0 || static_cast(block.offset) + static_cast(block.metadata_length) > @@ -109,8 +124,11 @@ std::optional ReadRecordBatch( auto message = util::FlatBufferReader::GetRoot( bytes.data() + message_offset + kMessagePrefixSize, static_cast(prefix.metadata_size)); - auto record_batch = message ? message->Table(message_field::kHeader) - : util::FlatBufferReader{}; + auto header = message ? message->Table(message_field::kHeader) + : util::FlatBufferReader{}; + auto record_batch = footer_blocks_field == footer_field::kDictionaries + ? header.Table(dictionary_batch_field::kData) + : header; if (!record_batch) { return std::nullopt; } @@ -121,6 +139,32 @@ std::optional ReadRecordBatch( record_batch.VecScalar(record_batch_field::kBuffers)}; } +std::optional ReadRecordBatch( + const std::vector& bytes) { + return ReadBatch(bytes, arrow_internal::footer_field::kRecordBatches, 0); +} + +std::optional ReadDictionaryBatch( + const std::vector& bytes, + uint32_t index) { + return ReadBatch(bytes, arrow_internal::footer_field::kDictionaries, index); +} + +// Reads the schema message, which is the first message in the file. +util::FlatBufferReader ReadSchema(const std::vector& bytes) { + using namespace arrow_internal; + MessagePrefix prefix = + Load(bytes.data() + sizeof(kPaddedMagic), 0); + EXPECT_EQ(prefix.continuation, kContinuation); + auto message = util::FlatBufferReader::GetRoot( + bytes.data() + sizeof(kPaddedMagic) + kMessagePrefixSize, + static_cast(prefix.metadata_size)); + EXPECT_TRUE(message.has_value()); + auto schema = message->Table(message_field::kHeader); + EXPECT_TRUE(static_cast(schema)); + return schema; +} + template T ReadBodyValue(const std::vector& bytes, const SerializedRecordBatch& batch, @@ -186,32 +230,99 @@ TEST(ArrowSerializerTest, WritesValidityAndDensifiesSparseNumericBuffer) { EXPECT_EQ(ReadBodyValue(bytes, *batch, 1, 2), 33); } -TEST(ArrowSerializerTest, WritesUtf8OffsetAndDataBuffers) { +TEST(ArrowSerializerTest, WritesDictionaryIndicesAndValues) { StringPool pool; auto hello = pool.InternString(base::StringView("hello")); auto empty = pool.InternString(base::StringView("")); auto world = pool.InternString(base::StringView("world")); - auto source = MakeDataframe(kStringNonNull, &pool, hello, empty, world); + auto source = + MakeDataframe(kStringNonNull, &pool, hello, empty, world, hello); std::vector bytes = Serialize(source, pool); auto batch = ReadRecordBatch(bytes); + auto dictionary = ReadDictionaryBatch(bytes, 0); ASSERT_TRUE(batch); - ASSERT_EQ(batch->buffers.size(), 3u); + ASSERT_EQ(batch->rows, 4); + ASSERT_EQ(batch->buffers.size(), 2u); EXPECT_EQ(batch->buffers[0].length, 0); EXPECT_EQ(batch->buffers[1].length, static_cast(4 * sizeof(int32_t))); - EXPECT_EQ(batch->buffers[2].length, 10); EXPECT_EQ(ReadBodyValue(bytes, *batch, 1, 0), 0); - EXPECT_EQ(ReadBodyValue(bytes, *batch, 1, 1), 5); - EXPECT_EQ(ReadBodyValue(bytes, *batch, 1, 2), 5); - EXPECT_EQ(ReadBodyValue(bytes, *batch, 1, 3), 10); - ArrowBuffer strings = batch->buffers[2]; + EXPECT_EQ(ReadBodyValue(bytes, *batch, 1, 1), 1); + EXPECT_EQ(ReadBodyValue(bytes, *batch, 1, 2), 2); + EXPECT_EQ(ReadBodyValue(bytes, *batch, 1, 3), 0); + + ASSERT_TRUE(dictionary); + ASSERT_EQ(dictionary->rows, 3); + ASSERT_EQ(dictionary->buffers.size(), 3u); + EXPECT_EQ(dictionary->buffers[0].length, 0); + EXPECT_EQ(dictionary->buffers[1].length, + static_cast(4 * sizeof(int32_t))); + EXPECT_EQ(dictionary->buffers[2].length, 10); + EXPECT_EQ(ReadBodyValue(bytes, *dictionary, 1, 0), 0); + EXPECT_EQ(ReadBodyValue(bytes, *dictionary, 1, 1), 5); + EXPECT_EQ(ReadBodyValue(bytes, *dictionary, 1, 2), 5); + EXPECT_EQ(ReadBodyValue(bytes, *dictionary, 1, 3), 10); + ArrowBuffer strings = dictionary->buffers[2]; const char* string_data = reinterpret_cast( - bytes.data() + batch->body_offset + strings.offset); + bytes.data() + dictionary->body_offset + strings.offset); EXPECT_EQ(std::string_view(string_data, static_cast(strings.length)), "helloworld"); } +TEST(ArrowSerializerTest, WritesDictionaryEncodingInSchema) { + using namespace arrow_internal; + StringPool pool; + auto hello = pool.InternString(base::StringView("hello")); + auto source = MakeDataframe(kStringNonNull, &pool, hello); + std::vector bytes = Serialize(source, pool); + + auto fields = ReadSchema(bytes).VecTable(schema_field::kFields); + ASSERT_EQ(fields.size(), 1u); + EXPECT_EQ(fields[0].Scalar(field_field::kTypeType), kTypeUtf8); + auto encoding = fields[0].Table(field_field::kDictionary); + ASSERT_TRUE(static_cast(encoding)); + EXPECT_EQ(encoding.Scalar(dictionary_encoding_field::kId, + kMissingSignedValue), + 0); + auto index_type = encoding.Table(dictionary_encoding_field::kIndexType); + ASSERT_TRUE(static_cast(index_type)); + EXPECT_EQ(index_type.Scalar(int_field::kBitWidth), + kDictionaryIndexBits); + EXPECT_TRUE(index_type.Scalar(int_field::kIsSigned)); +} + +TEST(ArrowSerializerTest, WritesOneDictionaryPerStringColumn) { + StringPool pool; + auto a = pool.InternString(base::StringView("a")); + auto source = Dataframe::CreateFromTypedSpec(kTwoStrings, &pool); + source.InsertUnchecked(kTwoStrings, std::monostate{}, a, a); + std::vector bytes = Serialize(source, pool); + + ASSERT_TRUE(ReadDictionaryBatch(bytes, 0)); + ASSERT_TRUE(ReadDictionaryBatch(bytes, 1)); + EXPECT_FALSE(ReadDictionaryBatch(bytes, 2)); + auto batch = ReadRecordBatch(bytes); + ASSERT_TRUE(batch); + EXPECT_EQ(batch->buffers.size(), 2u * arrow_internal::kFixedWidthBufferCount); +} + +TEST(ArrowSerializerTest, WritesEndOfStreamMarkerBeforeFooter) { + using namespace arrow_internal; + StringPool pool; + auto source = MakeDataframe(kUint32NonNull, &pool, uint32_t{1}); + std::vector bytes = Serialize(source, pool); + auto batch = ReadRecordBatch(bytes); + + ASSERT_TRUE(batch); + size_t batch_end = + batch->body_offset + static_cast(batch->block.body_length); + MessagePrefix marker = Load(bytes.data() + batch_end, 0); + EXPECT_EQ(marker.continuation, kContinuation); + EXPECT_EQ(marker.metadata_size, 0); + EXPECT_EQ(batch_end + kEndOfStreamSize, FooterOffset(bytes)); +} + TEST(ArrowSerializerTest, OmitsImplicitIdColumn) { StringPool pool; auto source = Dataframe::CreateFromTypedSpec(kIdOnly, &pool); diff --git a/src/trace_processor/core/tree/tree.h b/src/trace_processor/core/tree/tree.h index c3e77dc8522..4870fbe2451 100644 --- a/src/trace_processor/core/tree/tree.h +++ b/src/trace_processor/core/tree/tree.h @@ -28,6 +28,7 @@ #include #include "perfetto/base/logging.h" +#include "perfetto/ext/base/flat_hash_map.h" #include "src/trace_processor/core/common/storage_types.h" #include "src/trace_processor/core/util/bit_vector.h" #include "src/trace_processor/core/util/slab.h" @@ -48,8 +49,64 @@ namespace perfetto::trace_processor::core { struct Tree { static constexpr uint32_t kNullParent = std::numeric_limits::max(); + // Index mapping the tree's original node ids (the "id" column produced by + // BuildTree) to row indices, built once during construction so consumers + // can resolve ids to rows via FindRow without rebuilding the map. + // + // Storage is chosen to match the id shape: identity ids (id == row index) + // need no storage; a reasonably dense uint32 id range uses a direct index + // vector; arbitrary ids fall back to a hash map. The default state is + // identity: a tree without an id column has row indices as its ids by + // definition, so a default-constructed tree resolves ids correctly. + struct IdIndex { + bool identity_ids = true; + std::vector dense; // dense uint32 ids -> row, kNullParent absent + // Arbitrary ids -> row. Optional because FlatHashMap's constructor is + // explicit, which would break aggregate initialization of Tree. + std::optional> hash; + + // Resolves an id to a row index within a table of |num_rows| rows, or + // kNullParent if absent (returned as a sentinel rather than wrapped in + // std::optional as this is on the hot path of consumers). |num_rows| + // bounds the identity case, where ids are the row indices themselves. + uint32_t Find(int64_t id, uint32_t num_rows) const { + if (identity_ids) { + if (id < 0 || static_cast(id) >= num_rows) { + return kNullParent; + } + return static_cast(id); + } + if (!dense.empty()) { + if (id < 0 || static_cast(id) >= dense.size()) { + return kNullParent; + } + return dense[static_cast(id)]; + } + if (hash) { + const uint32_t* row = hash->Find(id); + return row ? *row : kNullParent; + } + return kNullParent; + } + }; + + IdIndex id_index; + + // Resolves an original node id to its row index, or kNullParent if absent. + uint32_t FindRow(int64_t id) const { return id_index.Find(id, row_count); } + struct Column { - using Type = TypeSet; + // Null-typed columns have no payload at all; their null_bv marks every + // row as null and their data is never read. + using Type = TypeSet; + + // Creates a null-typed column of |rows| rows: no payload, every row null. + static Column CreateNull(uint32_t rows) { + Column column; + column.type = Type(Null{}); + column.null_bv = BitVector::CreateWithSize(rows, false); + return column; + } template static Column Create(uint32_t rows, bool nullable = false) { diff --git a/src/trace_processor/core/tree/tree_algorithms_unittest.cc b/src/trace_processor/core/tree/tree_algorithms_unittest.cc index 2d85893868f..3c160efa2ff 100644 --- a/src/trace_processor/core/tree/tree_algorithms_unittest.cc +++ b/src/trace_processor/core/tree/tree_algorithms_unittest.cc @@ -150,5 +150,154 @@ TEST(TreeFromDataframeTest, RejectsCycle) { EXPECT_THAT(result.status().message(), testing::HasSubstr("cycle detected")); } +TEST(TreeTest, DefaultConstructedTreeResolvesIdentityIds) { + // The index defaults to identity: an empty tree has no rows, so every id + // resolves to absent, and a tree without an id column would resolve row + // indices directly. + Tree tree; + ASSERT_TRUE(tree.id_index.identity_ids); + EXPECT_EQ(tree.FindRow(0), Tree::kNullParent); + EXPECT_EQ(tree.FindRow(-1), Tree::kNullParent); +} + +TEST(TreeFromDataframeTest, FindRowIdentityIds) { + StringPool pool; + dataframe::AdhocDataframeBuilder::Options options; + options.types = {dataframe::AdhocColumnType::kInt64, + dataframe::AdhocColumnType::kInt64}; + options.nullability_type = dataframe::NullabilityType::kDenseNull; + dataframe::AdhocDataframeBuilder builder({"id", "parent_id"}, &pool, options); + + // Ids equal their row index, so the index is identity and needs no storage. + ASSERT_TRUE(builder.PushNonNull(0, int64_t{0})); + builder.PushNull(1); + ASSERT_TRUE(builder.PushNonNull(0, int64_t{1})); + ASSERT_TRUE(builder.PushNonNull(1, int64_t{0})); + ASSERT_TRUE(builder.PushNonNull(0, int64_t{2})); + ASSERT_TRUE(builder.PushNonNull(1, int64_t{0})); + + auto result = BuildTree(std::move(builder)); + ASSERT_TRUE(result.ok()) << result.status().message(); + Tree tree = std::move(result.value()); + ASSERT_TRUE(tree.id_index.identity_ids); + + EXPECT_EQ(tree.FindRow(0), 0u); + EXPECT_EQ(tree.FindRow(1), 1u); + EXPECT_EQ(tree.FindRow(2), 2u); + EXPECT_EQ(tree.FindRow(3), Tree::kNullParent); + EXPECT_EQ(tree.FindRow(-1), Tree::kNullParent); +} + +TEST(TreeFromDataframeTest, FindRowDenseIds) { + StringPool pool; + dataframe::AdhocDataframeBuilder::Options options; + options.types = {dataframe::AdhocColumnType::kInt64, + dataframe::AdhocColumnType::kInt64}; + options.nullability_type = dataframe::NullabilityType::kDenseNull; + dataframe::AdhocDataframeBuilder builder({"id", "parent_id"}, &pool, options); + + // A compact non-identity uint32 id range is stored as a direct index + // vector (max_id + 1 <= 2 * row_count). + ASSERT_TRUE(builder.PushNonNull(0, int64_t{1})); + builder.PushNull(1); + ASSERT_TRUE(builder.PushNonNull(0, int64_t{2})); + ASSERT_TRUE(builder.PushNonNull(1, int64_t{1})); + ASSERT_TRUE(builder.PushNonNull(0, int64_t{3})); + ASSERT_TRUE(builder.PushNonNull(1, int64_t{1})); + + auto result = BuildTree(std::move(builder)); + ASSERT_TRUE(result.ok()) << result.status().message(); + Tree tree = std::move(result.value()); + ASSERT_FALSE(tree.id_index.identity_ids); + ASSERT_FALSE(tree.id_index.dense.empty()); + + EXPECT_EQ(tree.FindRow(1), 0u); + EXPECT_EQ(tree.FindRow(2), 1u); + EXPECT_EQ(tree.FindRow(3), 2u); + EXPECT_EQ(tree.FindRow(0), Tree::kNullParent); // absent id + EXPECT_EQ(tree.FindRow(4), Tree::kNullParent); // beyond the dense range + EXPECT_EQ(tree.FindRow(-1), Tree::kNullParent); +} + +TEST(TreeFromDataframeTest, FindRowHashIds) { + StringPool pool; + dataframe::AdhocDataframeBuilder::Options options; + options.types = {dataframe::AdhocColumnType::kInt64, + dataframe::AdhocColumnType::kInt64}; + options.nullability_type = dataframe::NullabilityType::kDenseNull; + dataframe::AdhocDataframeBuilder builder({"id", "parent_id"}, &pool, options); + + // Sparse ids, including one beyond uint32, fall back to a hash map. + ASSERT_TRUE(builder.PushNonNull(0, int64_t{1000})); + builder.PushNull(1); + ASSERT_TRUE(builder.PushNonNull(0, int64_t{5000000000})); + ASSERT_TRUE(builder.PushNonNull(1, int64_t{1000})); + ASSERT_TRUE(builder.PushNonNull(0, int64_t{9000})); + ASSERT_TRUE(builder.PushNonNull(1, int64_t{1000})); + + auto result = BuildTree(std::move(builder)); + ASSERT_TRUE(result.ok()) << result.status().message(); + Tree tree = std::move(result.value()); + ASSERT_FALSE(tree.id_index.identity_ids); + ASSERT_TRUE(tree.id_index.dense.empty()); + ASSERT_TRUE(tree.id_index.hash.has_value()); + + EXPECT_EQ(tree.FindRow(1000), 0u); + EXPECT_EQ(tree.FindRow(5000000000), 1u); + EXPECT_EQ(tree.FindRow(9000), 2u); + EXPECT_EQ(tree.FindRow(1001), Tree::kNullParent); + EXPECT_EQ(tree.FindRow(-1), Tree::kNullParent); +} + +TEST(TreeFromDataframeTest, ReorderRebuildsIdIndex) { + StringPool pool; + dataframe::AdhocDataframeBuilder::Options options; + options.types = {dataframe::AdhocColumnType::kInt64, + dataframe::AdhocColumnType::kInt64}; + options.nullability_type = dataframe::NullabilityType::kDenseNull; + dataframe::AdhocDataframeBuilder builder({"id", "parent_id"}, &pool, options); + + // Child rows precede their parents in the input, so the topological reorder + // invalidates the input-order index and it is rebuilt from the output id + // column. + ASSERT_TRUE(builder.PushNonNull(0, int64_t{5})); + ASSERT_TRUE(builder.PushNonNull(1, int64_t{3})); + ASSERT_TRUE(builder.PushNonNull(0, int64_t{3})); + builder.PushNull(1); + ASSERT_TRUE(builder.PushNonNull(0, int64_t{4})); + ASSERT_TRUE(builder.PushNonNull(1, int64_t{3})); + + auto result = BuildTree(std::move(builder)); + ASSERT_TRUE(result.ok()) << result.status().message(); + Tree tree = std::move(result.value()); + ASSERT_FALSE(tree.id_index.identity_ids); + ASSERT_FALSE(tree.id_index.dense.empty()); + + EXPECT_THAT(tree.columns[0].unchecked_span(), + testing::ElementsAre(3, 5, 4)); + EXPECT_EQ(tree.FindRow(3), 0u); + EXPECT_EQ(tree.FindRow(5), 1u); + EXPECT_EQ(tree.FindRow(4), 2u); + EXPECT_EQ(tree.FindRow(6), Tree::kNullParent); +} + +TEST(TreeFromDataframeTest, RejectsDuplicateIds) { + StringPool pool; + dataframe::AdhocDataframeBuilder::Options options; + options.types = {dataframe::AdhocColumnType::kInt64, + dataframe::AdhocColumnType::kInt64}; + options.nullability_type = dataframe::NullabilityType::kDenseNull; + dataframe::AdhocDataframeBuilder builder({"id", "parent_id"}, &pool, options); + + ASSERT_TRUE(builder.PushNonNull(0, int64_t{2})); + builder.PushNull(1); + ASSERT_TRUE(builder.PushNonNull(0, int64_t{2})); + builder.PushNull(1); + + auto result = BuildTree(std::move(builder)); + ASSERT_FALSE(result.ok()); + EXPECT_THAT(result.status().message(), testing::HasSubstr("duplicate id")); +} + } // namespace } // namespace perfetto::trace_processor::core diff --git a/src/trace_processor/core/tree/tree_column_ops.cc b/src/trace_processor/core/tree/tree_column_ops.cc index 5f8e1d15cdc..a9fe6132f6a 100644 --- a/src/trace_processor/core/tree/tree_column_ops.cc +++ b/src/trace_processor/core/tree/tree_column_ops.cc @@ -59,46 +59,6 @@ Tree::Column GatherTyped(const Tree::Column& input, Span rows) { return output; } -template -void GatherInto(const Tree::Column& input, - Span rows, - uint32_t offset, - Tree::Column* output) { - Span destination = - output->unchecked_span().subspan(offset, rows.size()); - Span source = input.unchecked_span(); - for (uint32_t row = 0; row < rows.size(); ++row) { - const uint32_t source_row = rows[row]; - if (input.null_bv.size() > 0 && !input.null_bv.is_set(source_row)) { - continue; - } - destination[row] = source[source_row]; - output->null_bv.set(offset + row); - } -} - -template -Tree::Column GatherConcatTyped(const Tree::Column& first, - Span first_rows, - const Tree::Column& second, - Span second_rows) { - const uint32_t first_size = static_cast(first_rows.size()); - const uint32_t second_size = static_cast(second_rows.size()); - Tree::Column output = Tree::Column::Create(first_size + second_size); - if (first.null_bv.size() == 0 && second.null_bv.size() == 0) { - Span destination = output.unchecked_span(); - ops::GatherRows(first.unchecked_span(), - destination.subspan(0, first_size), first_rows); - ops::GatherRows(second.unchecked_span(), - destination.subspan(first_size, second_size), second_rows); - return output; - } - output.null_bv = BitVector::CreateWithSize(first_size + second_size, false); - GatherInto(first, first_rows, 0, &output); - GatherInto(second, second_rows, first_size, &output); - return output; -} - } // namespace void UpdateRowHashes(const Tree::Column& column, @@ -116,6 +76,13 @@ void UpdateRowHashes(const Tree::Column& column, UpdateTypedRowHashes(column.unchecked_span(), non_null, hashes); return; + case Tree::Column::Type::GetTypeIndex(): + // Combine the same marker a nullable typed column contributes for a + // null row. + for (uint32_t row = 0; row < hashes.size(); ++row) { + hashes[row].Combine(false, int64_t{}); + } + return; default: PERFETTO_FATAL("Unsupported tree column type"); } @@ -129,24 +96,8 @@ Tree::Column Gather(const Tree::Column& input, Span rows) { return GatherTyped(input, rows); case Tree::Column::Type::GetTypeIndex(): return GatherTyped(input, rows); - default: - PERFETTO_FATAL("Unsupported tree column type"); - } -} - -Tree::Column GatherConcat(const Tree::Column& first, - Span first_rows, - const Tree::Column& second, - Span second_rows) { - PERFETTO_DCHECK(first.type.index() == second.type.index()); - switch (first.type.index()) { - case Tree::Column::Type::GetTypeIndex(): - return GatherConcatTyped(first, first_rows, second, second_rows); - case Tree::Column::Type::GetTypeIndex(): - return GatherConcatTyped(first, first_rows, second, second_rows); - case Tree::Column::Type::GetTypeIndex(): - return GatherConcatTyped(first, first_rows, second, - second_rows); + case Tree::Column::Type::GetTypeIndex(): + return Tree::Column::CreateNull(static_cast(rows.size())); default: PERFETTO_FATAL("Unsupported tree column type"); } diff --git a/src/trace_processor/core/tree/tree_column_ops.h b/src/trace_processor/core/tree/tree_column_ops.h index 10efe225873..866633e14d5 100644 --- a/src/trace_processor/core/tree/tree_column_ops.h +++ b/src/trace_processor/core/tree/tree_column_ops.h @@ -33,13 +33,6 @@ void UpdateRowHashes(const Tree::Column&, // its type and nullability. Tree::Column Gather(const Tree::Column&, Span rows); -// Concatenates selected rows from two same-typed columns into a new dense -// column while preserving nullability. -Tree::Column GatherConcat(const Tree::Column& first, - Span first_rows, - const Tree::Column& second, - Span second_rows); - } // namespace perfetto::trace_processor::core::tree_ops #endif // SRC_TRACE_PROCESSOR_CORE_TREE_TREE_COLUMN_OPS_H_ diff --git a/src/trace_processor/core/tree/tree_column_ops_unittest.cc b/src/trace_processor/core/tree/tree_column_ops_unittest.cc index 0e402274a53..f65bc6bed43 100644 --- a/src/trace_processor/core/tree/tree_column_ops_unittest.cc +++ b/src/trace_processor/core/tree/tree_column_ops_unittest.cc @@ -54,26 +54,5 @@ TEST(TreeColumnOpsTest, GathersNullableRows) { EXPECT_FALSE(output.null_bv.is_set(1)); } -TEST(TreeColumnOpsTest, ConcatenatesRowsAndNullability) { - Tree::Column first = Tree::Column::Create(2); - first.unchecked_span()[0] = 10; - first.unchecked_span()[1] = 20; - Tree::Column second = Tree::Column::Create(2); - second.unchecked_span()[0] = 30; - second.unchecked_span()[1] = 40; - second.null_bv = BitVector::CreateWithSize(2, true); - second.null_bv.clear(0); - const uint32_t first_rows[] = {1}; - const uint32_t second_rows[] = {0, 1}; - - Tree::Column output = - GatherConcat(first, MakeSpan(first_rows), second, MakeSpan(second_rows)); - EXPECT_EQ(output.unchecked_span()[0], 20); - EXPECT_EQ(output.unchecked_span()[2], 40); - EXPECT_TRUE(output.null_bv.is_set(0)); - EXPECT_FALSE(output.null_bv.is_set(1)); - EXPECT_TRUE(output.null_bv.is_set(2)); -} - } // namespace } // namespace perfetto::trace_processor::core::tree_ops diff --git a/src/trace_processor/core/tree/tree_from_dataframe.cc b/src/trace_processor/core/tree/tree_from_dataframe.cc index 0d1669ae112..886111c8aab 100644 --- a/src/trace_processor/core/tree/tree_from_dataframe.cc +++ b/src/trace_processor/core/tree/tree_from_dataframe.cc @@ -80,9 +80,10 @@ Tree::Column MoveRawColumn(dataframe::AdhocDataframeBuilder::RawColumn& rc) { } else { PERFETTO_FATAL("Unexpected storage type in raw column"); } + } else { + // Columns which never saw a value have no storage and no value type. + tc.type = Tree::Column::Type(Null{}); } - // All-null columns keep the default Int64 type with no payload; null_bv - // flags every row as null so the data is never read. tc.null_bv = std::move(rc.null_bv); return tc; } @@ -96,8 +97,8 @@ Tree::Column GatherRawColumn(dataframe::AdhocDataframeBuilder::RawColumn& rc, const BitVector* source_non_null = rc.null_bv.size() > 0 ? &rc.null_bv : nullptr; if (!rc.storage) { - // All-null column: keep the default Int64 type with no payload; null_bv - // flags every row as null so the data is never read. + // Columns which never saw a value have no storage and no value type. + tc.type = Tree::Column::Type(Null{}); tc.null_bv = BitVector::CreateWithSize(row_count); return tc; } @@ -126,31 +127,56 @@ Tree::Column GatherRawColumn(dataframe::AdhocDataframeBuilder::RawColumn& rc, return tc; } -struct IdIndex { - std::optional Find(int64_t id) const { - if (identity_ids) { - if (id < 0 || static_cast(id) >= row_count) { - return std::nullopt; +// Direct indexing is used while the dense vector is at least +// 1 / kDenseIndexMaxSizeFactor full; sparser id ranges fall back to the hash +// map to bound the memory wasted on empty slots. +constexpr uint64_t kDenseIndexMaxSizeFactor = 2; + +// Builds an id -> row index matching storage to the id shape: identity ids +// (id == row index) need no storage; a reasonably dense uint32 id range uses +// a direct index vector; arbitrary int64 ids fall back to a hash map. Fails +// on duplicate ids. +base::StatusOr BuildIdIndex(Span ids, + uint32_t row_count) { + Tree::IdIndex result; + bool identity_ids = true; + bool uint32_ids = true; + uint32_t max_id = 0; + for (uint32_t i = 0; i < row_count; ++i) { + const int64_t id = ids[i]; + identity_ids = identity_ids && id == i; + if (id < 0 || + static_cast(id) > std::numeric_limits::max()) { + uint32_ids = false; + } else { + max_id = std::max(max_id, static_cast(id)); + } + } + result.identity_ids = identity_ids; + const bool dense_ids = + !identity_ids && uint32_ids && + uint64_t(max_id) + 1 <= uint64_t(row_count) * kDenseIndexMaxSizeFactor; + if (dense_ids) { + result.dense.resize(uint64_t(max_id) + 1, Tree::kNullParent); + for (uint32_t i = 0; i < row_count; ++i) { + const uint32_t id = static_cast(ids[i]); + if (result.dense[id] != Tree::kNullParent) { + return base::ErrStatus("tree: duplicate id"); } - return static_cast(id); + result.dense[id] = i; } - if (dense_ids) { - if (id < 0 || static_cast(id) >= dense_index.size()) { - return std::nullopt; + } else if (!identity_ids) { + result.hash.emplace(); + for (uint32_t i = 0; i < row_count; ++i) { + auto [row, inserted] = result.hash->Insert(ids[i], i); + base::ignore_result(row); + if (!inserted) { + return base::ErrStatus("tree: duplicate id"); } - const uint32_t row = dense_index[static_cast(id)]; - return row == Tree::kNullParent ? std::nullopt : std::make_optional(row); } - const uint32_t* row = hash_index->Find(id); - return row ? std::make_optional(*row) : std::nullopt; } - - bool identity_ids; - bool dense_ids; - uint32_t row_count; - Span dense_index; - const base::FlatHashMap* hash_index; -}; + return std::move(result); +} base::StatusOr BuildFromRawColumns( std::vector raw_cols); @@ -162,6 +188,11 @@ base::StatusOr BuildTree(dataframe::AdhocDataframeBuilder&& builder) { return BuildFromRawColumns(std::move(raw_cols)); } +base::StatusOr BuildTree(dataframe::RuntimeDataframeBuilder&& builder) { + ASSIGN_OR_RETURN(auto raw_cols, std::move(builder).BuildRaw()); + return BuildFromRawColumns(std::move(raw_cols)); +} + namespace { base::StatusOr BuildFromRawColumns( @@ -197,46 +228,11 @@ base::StatusOr BuildFromRawColumns( Tree result; result.row_count = row_count; - // Prefer indexes which avoid hashing. Identity ids need no storage; a - // reasonably dense uint32 range uses direct indexing; arbitrary int64 ids - // fall back to a hash map. - bool identity_ids = true; - bool uint32_ids = true; - uint32_t max_id = 0; - for (uint32_t i = 0; i < row_count; ++i) { - int64_t id = id_vec[i]; - identity_ids = identity_ids && id == i; - if (id < 0 || - static_cast(id) > std::numeric_limits::max()) { - uint32_ids = false; - } else { - max_id = std::max(max_id, static_cast(id)); - } - } - bool dense_ids = !identity_ids && uint32_ids && - uint64_t(max_id) + 1 <= uint64_t(row_count) * 2; - std::vector dense_index; - base::FlatHashMap hash_index; - if (dense_ids) { - dense_index.resize(uint64_t(max_id) + 1, Tree::kNullParent); - for (uint32_t i = 0; i < row_count; ++i) { - uint32_t id = static_cast(id_vec[i]); - if (dense_index[id] != Tree::kNullParent) { - return base::ErrStatus("tree: duplicate id"); - } - dense_index[id] = i; - } - } else if (!identity_ids) { - for (uint32_t i = 0; i < row_count; ++i) { - auto [row, inserted] = hash_index.Insert(id_vec[i], i); - base::ignore_result(row); - if (!inserted) { - return base::ErrStatus("tree: duplicate id"); - } - } - } - const IdIndex id_index{identity_ids, dense_ids, row_count, - MakeSpan(dense_index), &hash_index}; + // Id index over the input rows, used to resolve parent_id references during + // normalization. If the input already satisfies the ordering invariant it is + // persisted on the tree as-is; a topological reorder invalidates it, in + // which case it is rebuilt from the output-order id column below. + ASSIGN_OR_RETURN(auto id_index, BuildIdIndex(id_vec.span(), row_count)); // Normalize parent_id to input row indices first. Track whether the input // already satisfies the Tree ordering invariant while doing so. @@ -253,12 +249,12 @@ base::StatusOr BuildFromRawColumns( if (pid_rc.null_bv.size() > 0 && !pid_rc.null_bv.is_set(row)) { continue; } - std::optional parent = id_index.Find(pid_vec[row]); - if (PERFETTO_UNLIKELY(!parent)) { + const uint32_t parent = id_index.Find(pid_vec[row], row_count); + if (PERFETTO_UNLIKELY(parent == Tree::kNullParent)) { return base::ErrStatus("tree: parent_id not found in id column"); } - input_parent[row] = *parent; - if (*parent >= row) { + input_parent[row] = parent; + if (parent >= row) { identity_order = false; } } @@ -316,16 +312,22 @@ base::StatusOr BuildFromRawColumns( result.names.push_back(std::move(rc.name)); result.columns.push_back(MoveRawColumn(rc)); } + result.id_index = std::move(id_index); } else { // Gather all columns (including id/parent_id) in topological order. for (auto& rc : raw_cols) { result.names.push_back(std::move(rc.name)); result.columns.push_back(GatherRawColumn(rc, row_count, MakeSpan(order))); } + // The reorder invalidated the input-space index; rebuild it from the + // gathered id column, which is in output row order. + const auto* ids = result.columns[0].unchecked_data(); + ASSIGN_OR_RETURN( + result.id_index, + BuildIdIndex(Span(ids, ids + row_count), row_count)); } return std::move(result); } } // namespace - } // namespace perfetto::trace_processor::core diff --git a/src/trace_processor/core/tree/tree_from_dataframe.h b/src/trace_processor/core/tree/tree_from_dataframe.h index 65a10eb3aba..a1f3ad61fff 100644 --- a/src/trace_processor/core/tree/tree_from_dataframe.h +++ b/src/trace_processor/core/tree/tree_from_dataframe.h @@ -19,6 +19,7 @@ #include "perfetto/ext/base/status_or.h" #include "src/trace_processor/core/dataframe/adhoc_dataframe_builder.h" +#include "src/trace_processor/core/dataframe/runtime_dataframe_builder.h" #include "src/trace_processor/core/tree/tree.h" namespace perfetto::trace_processor::core { @@ -27,6 +28,7 @@ namespace perfetto::trace_processor::core { // The first two columns must be integer id and parent_id columns. This // validates their relationships and normalizes parent ids to row indices. base::StatusOr BuildTree(dataframe::AdhocDataframeBuilder&& builder); +base::StatusOr BuildTree(dataframe::RuntimeDataframeBuilder&& builder); } // namespace perfetto::trace_processor::core diff --git a/src/trace_processor/core/util/bit_vector.h b/src/trace_processor/core/util/bit_vector.h index aea35062aa3..63c6c0ed3f1 100644 --- a/src/trace_processor/core/util/bit_vector.h +++ b/src/trace_processor/core/util/bit_vector.h @@ -82,6 +82,36 @@ struct BitVector { return BitVector(std::move(words), size); } + // Allocates a new BitVector of `size` bits from a packed bitmap of + // ceil(size / 8) bytes holding bit i at byte i / 8, bit i % 8. This is the + // layout of the words below, so the bitmap is taken verbatim. + static BitVector CreateFromBitmap(const uint8_t* bitmap, uint64_t size) { + static_assert(PERFETTO_IS_LITTLE_ENDIAN()); + if (size == 0) { + return {}; + } + auto words = FlexVector::CreateWithSize((size + 63u) / 64u); + size_t bitmap_bytes = static_cast((size + 7u) / 8u); + size_t word_bytes = words.size() * sizeof(uint64_t); + memcpy(words.data(), bitmap, bitmap_bytes); + memset(reinterpret_cast(words.data()) + bitmap_bytes, 0, + word_bytes - bitmap_bytes); + // Bits past `size` are unspecified in the source bitmap. + if (size % 64u != 0u) { + words.back() &= (1ull << (size % 64u)) - 1ull; + } + return BitVector(std::move(words), size); + } + + // Returns the number of set bits in the vector. + PERFETTO_ALWAYS_INLINE uint64_t CountSetBits() const { + uint64_t count = 0; + for (uint64_t i = 0; i < (size_ + 63ull) / 64ull; ++i) { + count += static_cast(PERFETTO_POPCOUNT(words_[i])); + } + return count; + } + // Adds a bit to the end of the vector. // // bit: The boolean value to add to the end of the BitVector. diff --git a/src/trace_processor/importers/proto/proto_trace_reader.cc b/src/trace_processor/importers/proto/proto_trace_reader.cc index 9155f0cb1a8..67f3ade7834 100644 --- a/src/trace_processor/importers/proto/proto_trace_reader.cc +++ b/src/trace_processor/importers/proto/proto_trace_reader.cc @@ -1287,7 +1287,30 @@ void ProtoTraceReader::OnEventsFullyExtracted() { using Config = protos::pbzero::TraceConfig; Config::Decoder trace_config(trace_config_raw_.data(), trace_config_raw_.size()); - if (!trace_config.write_into_file() || trace_config.flush_period_ms()) { + if (!trace_config.write_into_file()) { + return; + } + + // Overwritten data never reached the file, so it counts as a data loss. + // A period of a day or more means "still a ring-buffer trace", the same + // cutoff as is_long_trace in tracing_service_impl.cc. In practice that is + // Traceur, which only uses write_into_file for detached mode. + constexpr uint32_t kMinRingBufferIntentPeriodMs = 24 * 60 * 60 * 1000; + if (trace_config.file_write_period_ms() < kMinRingBufferIntentPeriodMs) { + int buffer_index = 0; + for (auto it = trace_config.buffers(); it; ++it, ++buffer_index) { + std::optional bytes_overwritten = + context_->stats_tracker->GetIndexedStats( + stats::traced_buf_bytes_overwritten, buffer_index); + if (bytes_overwritten.value_or(0) > 0) { + context_->stats_tracker->SetIndexedStats( + stats::long_trace_mode_bytes_overwritten, buffer_index, + *bytes_overwritten); + } + } + } + + if (trace_config.flush_period_ms()) { return; } diff --git a/src/trace_processor/local_file_system.cc b/src/trace_processor/local_file_system.cc index 78cf66fb8fd..16ce4b80660 100644 --- a/src/trace_processor/local_file_system.cc +++ b/src/trace_processor/local_file_system.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -31,47 +32,159 @@ namespace { class LocalFile final : public File { public: - LocalFile(std::string path, base::ScopedFile file) - : path_(std::move(path)), file_(std::move(file)) {} + LocalFile(std::string path, base::ScopedFile fd) + : path_(std::move(path)), fd_(std::move(fd)) {} - base::Status Write(const void* data, size_t size) override { - ssize_t written = base::WriteAll(file_.get(), data, size); - if (written < 0) { + base::Status ReadAt(uint64_t offset, + void* data, + size_t size, + size_t* bytes_read) override { + if (!base::SeekFile(fd_.get(), offset)) { + return base::ErrStatus("Failed to seek file %s: %s", path_.c_str(), + strerror(errno)); + } + size_t total = 0; + auto* dst = static_cast(data); + while (total < size) { + ssize_t read = base::Read(fd_.get(), dst + total, size - total); + if (read < 0) { + return base::ErrStatus("Failed to read file %s: %s", path_.c_str(), + strerror(errno)); + } + if (read == 0) { + break; + } + total += static_cast(read); + } + *bytes_read = total; + return base::OkStatus(); + } + + base::Status WriteAt(uint64_t offset, + const void* data, + size_t size) override { + if (!base::SeekFile(fd_.get(), offset)) { + return base::ErrStatus("Failed to seek file %s: %s", path_.c_str(), + strerror(errno)); + } + if (base::WriteAll(fd_.get(), data, size) != static_cast(size)) { return base::ErrStatus("Failed to write file %s: %s", path_.c_str(), strerror(errno)); } - if (static_cast(written) != size) { - return base::ErrStatus("Short write to file %s: wrote %zu of %zu bytes", - path_.c_str(), static_cast(written), size); + return base::OkStatus(); + } + + base::Status Truncate(uint64_t size) override { + if (!base::TruncateFile(fd_.get(), size)) { + return base::ErrStatus("Failed to truncate file %s: %s", path_.c_str(), + strerror(errno)); + } + return base::OkStatus(); + } + + base::Status GetSize(uint64_t* size) override { + std::optional result = base::GetFileSize(fd_.get()); + if (!result) { + return base::ErrStatus("Failed to get size of file %s: %s", path_.c_str(), + strerror(errno)); + } + *size = *result; + return base::OkStatus(); + } + + base::Status Flush() override { + if (!base::FlushFile(fd_.get())) { + return base::ErrStatus("Failed to flush file %s: %s", path_.c_str(), + strerror(errno)); } return base::OkStatus(); } private: std::string path_; - base::ScopedFile file_; + base::ScopedFile fd_; +}; + +class NoopFileSystem final : public FileSystem { + public: + base::Status OpenFile(const std::string&, + const FileOpenOptions&, + std::unique_ptr*) override { + return base::ErrStatus("File I/O is not supported"); + } + + base::Status DeleteFile(const std::string&) override { + return base::ErrStatus("File I/O is not supported"); + } + + base::Status FileExists(const std::string&, bool*) override { + return base::ErrStatus("File I/O is not supported"); + } }; class LocalFileSystem final : public FileSystem { public: base::Status OpenFile(const std::string& path, + const FileOpenOptions& options, std::unique_ptr* file) override { - file->reset(); - base::ScopedFile scoped_file = - base::OpenFile(path, O_CREAT | O_WRONLY | O_TRUNC, 0600); - if (!scoped_file) { + if ((options.create || options.truncate) && + options.access == FileAccess::kReadOnly) { + return base::ErrStatus( + "Creating or truncating a file requires write access"); + } + + int flags = 0; + switch (options.access) { + case FileAccess::kReadOnly: + flags = O_RDONLY; + break; + case FileAccess::kWriteOnly: + flags = O_WRONLY; + break; + case FileAccess::kReadWrite: + flags = O_RDWR; + break; + } + if (options.create) { + flags |= O_CREAT; + } + if (options.truncate) { + flags |= O_TRUNC; + } + + base::ScopedFile fd = base::OpenFile(path, flags, 0600); + if (!fd) { return base::ErrStatus("Failed to open file %s: %s", path.c_str(), strerror(errno)); } - file->reset(new LocalFile(path, std::move(scoped_file))); + file->reset(new LocalFile(path, std::move(fd))); + return base::OkStatus(); + } + + base::Status DeleteFile(const std::string& path) override { + if (!base::Unlink(path.c_str())) { + return base::ErrStatus("Failed to delete file %s: %s", path.c_str(), + strerror(errno)); + } + return base::OkStatus(); + } + + base::Status FileExists(const std::string& path, bool* exists) override { + *exists = base::FileExists(path); return base::OkStatus(); } }; } // namespace -std::unique_ptr CreateLocalFileSystem() { - return std::make_unique(); +FileSystem* CreateLocalFileSystem() { + static LocalFileSystem* file_system = new LocalFileSystem(); + return file_system; +} + +FileSystem* CreateNoopFileSystem() { + static NoopFileSystem* file_system = new NoopFileSystem(); + return file_system; } } // namespace perfetto::trace_processor::io diff --git a/src/trace_processor/local_file_system.h b/src/trace_processor/local_file_system.h index 22dc0386a68..fdf145bf047 100644 --- a/src/trace_processor/local_file_system.h +++ b/src/trace_processor/local_file_system.h @@ -23,7 +23,13 @@ namespace perfetto::trace_processor::io { -std::unique_ptr CreateLocalFileSystem(); +// Returns a process-wide filesystem backed by the native filesystem. +FileSystem* CreateLocalFileSystem(); + +// Returns a process-wide filesystem which rejects every operation. Embedders +// without file I/O use this explicitly rather than accidentally falling +// through to process filesystem calls. +FileSystem* CreateNoopFileSystem(); } // namespace perfetto::trace_processor::io diff --git a/src/trace_processor/local_file_system_unittest.cc b/src/trace_processor/local_file_system_unittest.cc index 597582b15c5..6f4923120ef 100644 --- a/src/trace_processor/local_file_system_unittest.cc +++ b/src/trace_processor/local_file_system_unittest.cc @@ -22,6 +22,7 @@ #include "perfetto/ext/base/file_utils.h" #include "perfetto/ext/base/temp_file.h" #include "perfetto/trace_processor/basic_types.h" +#include "src/base/test/status_matchers.h" #include "test/gtest_and_gmock.h" namespace perfetto::trace_processor::io { @@ -32,11 +33,14 @@ TEST(LocalFileSystemTest, WritesAndReplacesFile) { std::string path = dir.path() + "/output"; auto file_system = CreateLocalFileSystem(); + FileOpenOptions options; + options.access = FileAccess::kWriteOnly; + options.create = true; + options.truncate = true; { std::unique_ptr file; - base::Status status = file_system->OpenFile(path, &file); - ASSERT_TRUE(status.ok()) << status.c_message(); - ASSERT_TRUE(file->Write("abc", 3).ok()); + ASSERT_OK(file_system->OpenFile(path, options, &file)); + ASSERT_OK(file->WriteAt(0, "abc", 3)); } std::string contents; @@ -45,15 +49,79 @@ TEST(LocalFileSystemTest, WritesAndReplacesFile) { { std::unique_ptr file; - base::Status status = file_system->OpenFile(path, &file); - ASSERT_TRUE(status.ok()) << status.c_message(); - ASSERT_TRUE(file->Write("d", 1).ok()); + ASSERT_OK(file_system->OpenFile(path, options, &file)); + ASSERT_OK(file->WriteAt(0, "d", 1)); } contents.clear(); ASSERT_TRUE(base::ReadFile(path, &contents)); EXPECT_EQ(contents, "d"); - ASSERT_TRUE(base::Unlink(path.c_str())); + ASSERT_OK(file_system->DeleteFile(path)); +} + +TEST(LocalFileSystemTest, RandomAccessReadWrite) { + base::TempDir dir = base::TempDir::Create(); + std::string path = dir.path() + "/output"; + auto file_system = CreateLocalFileSystem(); + + FileOpenOptions options; + options.access = FileAccess::kReadWrite; + options.create = true; + options.truncate = true; + std::unique_ptr file; + ASSERT_OK(file_system->OpenFile(path, options, &file)); + ASSERT_OK(file->WriteAt(10, "hello", 5)); + ASSERT_OK(file->WriteAt(0, "start ", 6)); + ASSERT_OK(file->Flush()); + uint64_t size = 0; + ASSERT_OK(file->GetSize(&size)); + EXPECT_EQ(size, 15u); + + char buffer[16] = {}; + size_t read = 0; + ASSERT_OK(file->ReadAt(10, buffer, 7, &read)); + EXPECT_EQ(read, 5u); + EXPECT_EQ(std::string(buffer, 5), "hello"); + // The gap between the two writes is a sparse hole read back as zeros. + ASSERT_OK(file->ReadAt(0, buffer, 10, &read)); + EXPECT_EQ(read, 10u); + EXPECT_EQ(std::string(buffer, 6), "start "); + EXPECT_EQ(std::string(buffer + 6, 4), std::string(4, '\0')); + + ASSERT_OK(file->Truncate(6)); + ASSERT_OK(file->GetSize(&size)); + EXPECT_EQ(size, 6u); + + file.reset(); + ASSERT_OK(file_system->DeleteFile(path)); +} + +TEST(LocalFileSystemTest, RejectsReadOnlyCreate) { + base::TempDir dir = base::TempDir::Create(); + std::string path = dir.path() + "/output"; + auto file_system = CreateLocalFileSystem(); + + FileOpenOptions options; + options.access = FileAccess::kReadOnly; + options.create = true; + std::unique_ptr file; + EXPECT_THAT(file_system->OpenFile(path, options, &file), + base::gtest_matchers::IsError()); +} + +TEST(LocalFileSystemTest, NoopFileSystemRejectsAllOperations) { + auto file_system = CreateNoopFileSystem(); + + FileOpenOptions options; + options.access = FileAccess::kReadWrite; + options.create = true; + std::unique_ptr file; + EXPECT_THAT(file_system->OpenFile("path", options, &file), + base::gtest_matchers::IsError()); + EXPECT_THAT(file_system->DeleteFile("path"), base::gtest_matchers::IsError()); + bool exists = false; + EXPECT_THAT(file_system->FileExists("path", &exists), + base::gtest_matchers::IsError()); } TEST(FileSystemConfigTest, DisabledByDefault) { diff --git a/src/trace_processor/metrics/sql/android/android_blocking_calls_cuj_metric.sql b/src/trace_processor/metrics/sql/android/android_blocking_calls_cuj_metric.sql index 92ca7fcad15..76d7c5496a1 100644 --- a/src/trace_processor/metrics/sql/android/android_blocking_calls_cuj_metric.sql +++ b/src/trace_processor/metrics/sql/android/android_blocking_calls_cuj_metric.sql @@ -30,29 +30,22 @@ INCLUDE PERFETTO MODULE android.cujs.sysui_cujs; -- slice, there needs to be 2 entries for that slice, one for each cuj id. -- (2) each slice needs to be trimmed to be fully inside the cuj associated -- (as we don't care about what's outside cujs) +-- Legacy table name preserved for backwards compatibility with external analytical pipelines. DROP TABLE IF EXISTS blocking_call_slices_scoped_to_cujs; CREATE PERFETTO TABLE blocking_call_slices_scoped_to_cujs AS SELECT - s.id, - s.id AS slice_id, - s.name, - max(s.ts, cuj.ts) AS ts, - min(s.ts + s.dur, cuj.ts_end) as ts_end, - min(s.ts + s.dur, cuj.ts_end) - max(s.ts, cuj.ts) AS dur, - cuj.cuj_id, - cuj.cuj_name, - s.process_name, - s.upid, - s.utid -FROM _android_critical_blocking_calls s - JOIN android_jank_latency_cujs cuj - -- only when there is an overlap - ON s.ts + s.dur > cuj.ts AND s.ts < cuj.ts_end - -- and are from the same process - AND s.upid = cuj.upid - LEFT JOIN _render_thread_per_process rt - ON rt.upid = cuj.upid - WHERE s.utid = cuj.ui_thread OR s.utid = rt.render_thread_utid; + slice_id AS id, + slice_id, + name, + ts, + ts_end, + dur, + cuj_id, + cuj_name, + process_name, + upid, + utid +FROM android_cuj_blocking_calls; DROP TABLE IF EXISTS android_blocking_calls_cuj_calls; diff --git a/src/trace_processor/perfetto_sql/engine/BUILD.gn b/src/trace_processor/perfetto_sql/engine/BUILD.gn index 626d3139ea0..aa5fbe02243 100644 --- a/src/trace_processor/perfetto_sql/engine/BUILD.gn +++ b/src/trace_processor/perfetto_sql/engine/BUILD.gn @@ -28,6 +28,8 @@ source_set("engine") { "perfetto_sql_database.h", "runtime_table_function.cc", "runtime_table_function.h", + "sqlite_dataframe_builder.cc", + "sqlite_dataframe_builder.h", "static_table_function_module.cc", "static_table_function_module.h", ] diff --git a/src/trace_processor/perfetto_sql/engine/perfetto_sql_connection.cc b/src/trace_processor/perfetto_sql/engine/perfetto_sql_connection.cc index 1cedfc3addf..8181f6f8d0c 100644 --- a/src/trace_processor/perfetto_sql/engine/perfetto_sql_connection.cc +++ b/src/trace_processor/perfetto_sql/engine/perfetto_sql_connection.cc @@ -48,6 +48,7 @@ #include "src/trace_processor/perfetto_sql/engine/created_function.h" #include "src/trace_processor/perfetto_sql/engine/dataframe_module.h" #include "src/trace_processor/perfetto_sql/engine/runtime_table_function.h" +#include "src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.h" #include "src/trace_processor/perfetto_sql/engine/static_table_function_module.h" #include "src/trace_processor/perfetto_sql/parser/function_util.h" #include "src/trace_processor/perfetto_sql/parser/perfetto_sql_parser.h" @@ -83,53 +84,6 @@ namespace perfetto::trace_processor { namespace { -struct SqliteStmtValueFetcher : public dataframe::ValueFetcher { - using Type = sqlite::Type; - static constexpr Type kInt64 = sqlite::Type::kInteger; - static constexpr Type kDouble = sqlite::Type::kFloat; - static constexpr Type kString = sqlite::Type::kText; - static constexpr Type kNull = sqlite::Type::kNull; - static constexpr Type kBytes = sqlite::Type::kBlob; - - int64_t GetInt64Value(uint32_t i) const { - return sqlite::column::Int64(stmt_, i); - } - double GetDoubleValue(uint32_t i) const { - return sqlite::column::Double(stmt_, i); - } - const char* GetStringValue(uint32_t i) const { - return sqlite::column::Text(stmt_, i); - } - Type GetValueType(uint32_t i) const { return sqlite::column::Type(stmt_, i); } - sqlite3_stmt* stmt_; -}; - -// Similar to SqliteStmtValueFetcher but for validating views have the correct -// types. Will ignore blobs and treat them as nulls. -struct SqliteStmtValueViewFetcher : public dataframe::ValueFetcher { - using Type = sqlite::Type; - static constexpr Type kInt64 = sqlite::Type::kInteger; - static constexpr Type kDouble = sqlite::Type::kFloat; - static constexpr Type kString = sqlite::Type::kText; - static constexpr Type kNull = sqlite::Type::kNull; - static constexpr Type kBytes = sqlite::Type::kBlob; - - int64_t GetInt64Value(uint32_t i) const { - return sqlite::column::Int64(stmt_, i); - } - double GetDoubleValue(uint32_t i) const { - return sqlite::column::Double(stmt_, i); - } - const char* GetStringValue(uint32_t i) const { - return sqlite::column::Text(stmt_, i); - } - [[maybe_unused]] Type GetValueType(uint32_t i) const { - auto type = sqlite::column::Type(stmt_, i); - return type == kBytes ? kNull : type; - } - sqlite3_stmt* stmt_; -}; - void IncrementCountForStmt(const SqliteConnection::PreparedStatement& p_stmt, PerfettoSqlConnection::ExecutionStats* res) { res->statement_count++; @@ -335,36 +289,6 @@ ArgumentTypeToDataframeType(sql_argument::Type type, bool bytes_as_int64) { PERFETTO_FATAL("For GCC"); } -template -base::StatusOr CreateDataframeFromSqliteStatement( - sqlite3* db, - StringPool* pool, - std::vector column_names, - std::vector types, - sqlite3_stmt* sqlite_stmt, - const std::string& name, - ValueFetcherImpl* fetcher, - const char* tag) { - dataframe::RuntimeDataframeBuilder builder( - std::move(column_names), pool, - {std::move(types), core::dataframe::NullabilityType::kSparseNull}); - int res; - for (res = sqlite3_step(sqlite_stmt); res == SQLITE_ROW; - res = sqlite3_step(sqlite_stmt)) { - if (!builder.AddRow(fetcher)) { - PERFETTO_CHECK(!builder.status().ok()); - return base::ErrStatus("%s(%s): %s", tag, name.c_str(), - builder.status().c_message()); - } - } - if (res != SQLITE_DONE) { - return base::ErrStatus( - "CREATE PERFETTO TABLE(%s): SQLite error while creating body: %s", - name.c_str(), sqlite3_errmsg(db)); - } - return std::move(builder).Build(); -} - base::StatusOr> GetTypesFromSelectStatement( bool bytes_as_int64, @@ -1024,13 +948,16 @@ base::Status PerfettoSqlConnection::ExecuteCreateTable( ASSIGN_OR_RETURN(auto types, GetTypesFromSelectStatement( false, schema, column_names, create_table.name, "CREATE PERFETTO TABLE")); - auto* sqlite_stmt = stmt.sqlite_stmt(); - SqliteStmtValueFetcher fetcher{{}, sqlite_stmt}; - ASSIGN_OR_RETURN( - auto dataframe, - CreateDataframeFromSqliteStatement( - connection_->db(), pool_, std::move(column_names), std::move(types), - sqlite_stmt, create_table.name, &fetcher, "CREATE PERFETTO TABLE")); + stmt.Step(); + RETURN_IF_ERROR(stmt.status()); + SqliteDataframeBuilderOptions options; + options.column_types = std::move(types); + const std::string error_context = + "CREATE PERFETTO TABLE(" + create_table.name + ")"; + ASSIGN_OR_RETURN(auto builder, BuildRuntimeDataframeFromSqliteStatement( + pool_, std::move(column_names), &stmt, + error_context, std::move(options))); + ASSIGN_OR_RETURN(auto dataframe, std::move(builder).Build()); base::StackString<1024> drop("DROP TABLE IF EXISTS %s;", create_table.name.c_str()); @@ -1108,16 +1035,22 @@ base::Status PerfettoSqlConnection::ExecuteCreateView( if (enable_extra_checks_) { // If extra checks are enabled, materialize the view to ensure that its // values are correct. - SqliteStmtValueViewFetcher fetcher{{}, stmt.sqlite_stmt()}; ASSIGN_OR_RETURN(auto types, GetTypesFromSelectStatement( true, effective_schema, column_names, create_view.name, "CREATE PERFETTO VIEW")); + stmt.Step(); + RETURN_IF_ERROR(stmt.status()); + SqliteDataframeBuilderOptions options; + options.column_types = std::move(types); + options.blobs_as_null = true; + const std::string error_context = + "CREATE PERFETTO VIEW(" + create_view.name + ")"; + ASSIGN_OR_RETURN(auto builder, BuildRuntimeDataframeFromSqliteStatement( + pool_, std::move(column_names), &stmt, + error_context, std::move(options))); base::StatusOr materialized = - CreateDataframeFromSqliteStatement( - connection_->db(), pool_, std::move(column_names), - std::move(types), stmt.sqlite_stmt(), create_view.name, &fetcher, - "CREATE PERFETTO VIEW"); + std::move(builder).Build(); RETURN_IF_ERROR(materialized.status()); } } diff --git a/src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.cc b/src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.cc new file mode 100644 index 00000000000..684070a0faa --- /dev/null +++ b/src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.cc @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2026 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/perfetto_sql/engine/sqlite_dataframe_builder.h" + +#include +#include + +#include "perfetto/ext/base/status_macros.h" +#include "perfetto/ext/base/status_or.h" +#include "src/trace_processor/core/dataframe/runtime_dataframe_builder.h" +#include "src/trace_processor/sqlite/bindings/sqlite_column.h" +#include "src/trace_processor/sqlite/bindings/sqlite_type.h" + +namespace perfetto::trace_processor { +namespace { + +struct SqliteValueFetcher : public dataframe::ValueFetcher { + SqliteValueFetcher(sqlite3_stmt* sql_stmt, bool null_blobs) + : stmt(sql_stmt), blobs_as_null(null_blobs) {} + + using Type = sqlite::Type; + static constexpr Type kInt64 = sqlite::Type::kInteger; + static constexpr Type kDouble = sqlite::Type::kFloat; + static constexpr Type kString = sqlite::Type::kText; + static constexpr Type kNull = sqlite::Type::kNull; + static constexpr Type kBytes = sqlite::Type::kBlob; + + int64_t GetInt64Value(uint32_t column) const { + return sqlite::column::Int64(stmt, column); + } + double GetDoubleValue(uint32_t column) const { + return sqlite::column::Double(stmt, column); + } + const char* GetStringValue(uint32_t column) const { + return sqlite::column::Text(stmt, column); + } + Type GetValueType(uint32_t column) const { + Type type = sqlite::column::Type(stmt, column); + return blobs_as_null && type == kBytes ? kNull : type; + } + + sqlite3_stmt* stmt; + bool blobs_as_null; +}; + +} // namespace + +base::StatusOr +BuildRuntimeDataframeFromSqliteStatement( + StringPool* pool, + std::vector column_names, + SqliteConnection::PreparedStatement* stmt, + std::string_view error_context, + SqliteDataframeBuilderOptions options) { + dataframe::RuntimeDataframeBuilder builder( + std::move(column_names), pool, + {std::move(options.column_types), options.nullability}); + SqliteValueFetcher fetcher{stmt->sqlite_stmt(), options.blobs_as_null}; + while (!stmt->IsDone()) { + if (!builder.AddRow(&fetcher)) { + return base::ErrStatus("%.*s: %s", static_cast(error_context.size()), + error_context.data(), + builder.status().c_message()); + } + stmt->Step(); + } + RETURN_IF_ERROR(stmt->status()); + return std::move(builder); +} + +} // namespace perfetto::trace_processor diff --git a/src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.h b/src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.h new file mode 100644 index 00000000000..51e3bebe790 --- /dev/null +++ b/src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2026 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. + */ + +#ifndef SRC_TRACE_PROCESSOR_PERFETTO_SQL_ENGINE_SQLITE_DATAFRAME_BUILDER_H_ +#define SRC_TRACE_PROCESSOR_PERFETTO_SQL_ENGINE_SQLITE_DATAFRAME_BUILDER_H_ + +#include + +#include +#include +#include + +#include "perfetto/ext/base/status_or.h" +#include "src/trace_processor/containers/string_pool.h" +#include "src/trace_processor/core/dataframe/adhoc_dataframe_builder.h" +#include "src/trace_processor/core/dataframe/runtime_dataframe_builder.h" +#include "src/trace_processor/sqlite/sqlite_connection.h" + +namespace perfetto::trace_processor { + +struct SqliteDataframeBuilderOptions { + std::vector column_types; + dataframe::NullabilityType nullability = + dataframe::NullabilityType::kSparseNull; + bool blobs_as_null = false; +}; + +// Consumes |stmt| into a runtime-typed dataframe. The statement must already +// have been stepped once, leaving it either on its first row or done. +base::StatusOr +BuildRuntimeDataframeFromSqliteStatement( + StringPool* pool, + std::vector column_names, + SqliteConnection::PreparedStatement* stmt, + std::string_view error_context, + SqliteDataframeBuilderOptions options = {}); + +} // namespace perfetto::trace_processor + +#endif // SRC_TRACE_PROCESSOR_PERFETTO_SQL_ENGINE_SQLITE_DATAFRAME_BUILDER_H_ diff --git a/src/trace_processor/perfetto_sql/stdlib/android/cujs/sysui_cujs.sql b/src/trace_processor/perfetto_sql/stdlib/android/cujs/sysui_cujs.sql index ce210bd5310..47e0b9a73c1 100644 --- a/src/trace_processor/perfetto_sql/stdlib/android/cujs/sysui_cujs.sql +++ b/src/trace_processor/perfetto_sql/stdlib/android/cujs/sysui_cujs.sql @@ -17,6 +17,10 @@ INCLUDE PERFETTO MODULE android.frames.timeline; INCLUDE PERFETTO MODULE android.cujs.base; +INCLUDE PERFETTO MODULE android.critical_blocking_calls; + +INCLUDE PERFETTO MODULE android.render_thread; + -- Table tracking all jank CUJs information. CREATE PERFETTO TABLE android_sysui_jank_cujs( -- Unique incremental ID for each CUJ. @@ -286,3 +290,50 @@ SELECT end_vsync, cuj_type FROM combined_cujs; + +-- Slices corresponding to critical blocking calls that occurred during a CUJ, +-- clipped to the CUJ time boundaries. +CREATE PERFETTO TABLE android_cuj_blocking_calls( + -- Unique slice id. + slice_id JOINID(slice.id), + -- Standardized name of the blocking call. + name STRING, + -- Timestamp of the blocking call, clamped to the CUJ start timestamp. + ts TIMESTAMP, + -- Duration of the blocking call within the CUJ boundaries. + dur DURATION, + -- End timestamp of the blocking call, clamped to the CUJ end timestamp. + ts_end TIMESTAMP, + -- CUJ ID. + cuj_id LONG, + -- Name of the CUJ. + cuj_name STRING, + -- Process name. + process_name STRING, + -- Process upid. + upid JOINID(process.id), + -- Thread utid. + utid JOINID(thread.id) +) +AS +SELECT + s.id AS slice_id, + s.name, + max(s.ts, cuj.ts) AS ts, + min(s.ts + s.dur, cuj.ts_end) - max(s.ts, cuj.ts) AS dur, + min(s.ts + s.dur, cuj.ts_end) AS ts_end, + cuj.cuj_id, + cuj.cuj_name, + s.process_name, + s.upid, + s.utid +FROM _android_critical_blocking_calls AS s +JOIN android_jank_latency_cujs AS cuj + ON s.ts + s.dur > cuj.ts + AND s.ts < cuj.ts_end + AND s.upid = cuj.upid +LEFT JOIN _render_thread_per_process AS rt + ON rt.upid = cuj.upid +WHERE + s.utid = cuj.ui_thread + OR s.utid = rt.render_thread_utid; diff --git a/src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/dominator_tree.sql b/src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/dominator_tree.sql index 80e24990c8c..f1e29507926 100644 --- a/src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/dominator_tree.sql +++ b/src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/dominator_tree.sql @@ -13,71 +13,8 @@ -- See the License for the specific language governing permissions and -- limitations under the License. -INCLUDE PERFETTO MODULE graphs.scan; - INCLUDE PERFETTO MODULE android.memory.heap_graph.raw_dominator_tree; -CREATE PERFETTO TABLE _heap_graph_dominator_tree_bottom_up_scan AS -SELECT * -FROM _graph_aggregating_scan!( - ( - SELECT id AS source_node_id, idom_id AS dest_node_id - FROM _raw_heap_graph_dominator_tree - WHERE idom_id IS NOT NULL - ), - ( - SELECT - p.id, - 1 AS subtree_count, - o.self_size AS subtree_size_bytes, - o.native_size AS subtree_native_size_bytes - FROM _raw_heap_graph_dominator_tree p - JOIN heap_graph_object o USING (id) - LEFT JOIN _raw_heap_graph_dominator_tree c ON p.id = c.idom_id - WHERE c.id IS NULL - ), - (subtree_count, subtree_size_bytes, subtree_native_size_bytes), - ( - WITH children_agg AS ( - SELECT - t.id, - SUM(t.subtree_count) AS subtree_count, - SUM(t.subtree_size_bytes) AS subtree_size_bytes, - SUM(t.subtree_native_size_bytes) AS subtree_native_size_bytes - FROM $table t - GROUP BY t.id - ) - SELECT - c.id, - c.subtree_count + 1 AS subtree_count, - c.subtree_size_bytes + self_size AS subtree_size_bytes, - c.subtree_native_size_bytes + native_size AS subtree_native_size_bytes - FROM children_agg c - JOIN heap_graph_object o USING (id) - ) -) -ORDER BY - id; - -CREATE PERFETTO TABLE _heap_graph_dominator_tree_top_down_scan AS -SELECT * -FROM _graph_scan!( - ( - SELECT idom_id AS source_node_id, id AS dest_node_id - FROM _raw_heap_graph_dominator_tree - WHERE idom_id IS NOT NULL - ), - ( - SELECT id, 1 AS depth - FROM _raw_heap_graph_dominator_tree - WHERE idom_id IS NULL - ), - (depth), - (SELECT t.id, t.depth + 1 AS depth FROM $table t) -) -ORDER BY - id; - -- All reachable heap graph objects, their immediate dominators and summary of -- their dominated sets. -- The heap graph dominator tree is calculated by stdlib graphs.dominator_tree. @@ -103,16 +40,37 @@ CREATE PERFETTO TABLE heap_graph_dominator_tree( ) AS SELECT - r.id, - r.idom_id AS idom_id, - d.subtree_count AS dominated_obj_count, - d.subtree_size_bytes AS dominated_size_bytes, - d.subtree_native_size_bytes AS dominated_native_size_bytes, - t.depth -FROM _raw_heap_graph_dominator_tree AS r -JOIN _heap_graph_dominator_tree_bottom_up_scan AS d USING (id) -JOIN _heap_graph_dominator_tree_top_down_scan AS t USING (id) + c0 AS id, + c1 AS idom_id, + c2 AS dominated_obj_count, + c3 AS dominated_size_bytes, + c4 AS dominated_native_size_bytes, + c5 AS depth +FROM __intrinsic_table_ptr( + ( + SELECT + __intrinsic_tree_dominator_summary( + __intrinsic_tree_from_table( + 'id', + p.id, + 'parent_id', + p.idom_id, + 'self_size', + o.self_size, + 'native_size', + o.native_size + ) + ) + FROM _raw_heap_graph_dominator_tree AS p + JOIN heap_graph_object AS o USING (id) + ) +) WHERE - r.id IS NOT NULL + __intrinsic_table_ptr_bind(c0, 'id') + AND __intrinsic_table_ptr_bind(c1, 'idom_id') + AND __intrinsic_table_ptr_bind(c2, 'dominated_obj_count') + AND __intrinsic_table_ptr_bind(c3, 'dominated_size_bytes') + AND __intrinsic_table_ptr_bind(c4, 'dominated_native_size_bytes') + AND __intrinsic_table_ptr_bind(c5, 'depth') ORDER BY id; diff --git a/src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/raw_dominator_tree.sql b/src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/raw_dominator_tree.sql index 880e2df51ed..ae832e1b563 100644 --- a/src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/raw_dominator_tree.sql +++ b/src/trace_processor/perfetto_sql/stdlib/android/memory/heap_graph/raw_dominator_tree.sql @@ -52,7 +52,3 @@ WHERE dominator_node_id IS NOT NULL ORDER BY id; - -CREATE PERFETTO INDEX _raw_heap_graph_dominator_tree_idom_id_idx ON _raw_heap_graph_dominator_tree( - idom_id -); diff --git a/src/trace_processor/perfetto_sql/stdlib/pixel/touch.sql b/src/trace_processor/perfetto_sql/stdlib/pixel/touch.sql index 240d13f5b51..d9b8e7dc2c1 100644 --- a/src/trace_processor/perfetto_sql/stdlib/pixel/touch.sql +++ b/src/trace_processor/perfetto_sql/stdlib/pixel/touch.sql @@ -85,7 +85,11 @@ WITH track_id = (SELECT id FROM track WHERE name = 'gti_th_irq_index' LIMIT 1) ), irq_slices AS ( - SELECT id, ts, dur, track_id FROM slice WHERE name GLOB 'IRQ (*)' + SELECT id, ts, dur, track_id + FROM slice + WHERE + name GLOB 'IRQ (*)' + AND dur > 0 ) SELECT s.id AS th_slice_id, diff --git a/src/trace_processor/perfetto_sql/stdlib/viz/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/viz/BUILD.gn index bc5b891ccdc..df5ec95aad2 100644 --- a/src/trace_processor/perfetto_sql/stdlib/viz/BUILD.gn +++ b/src/trace_processor/perfetto_sql/stdlib/viz/BUILD.gn @@ -16,7 +16,6 @@ import("../../../../../gn/perfetto_sql.gni") perfetto_sql_source_set("viz") { sources = [ - "flamegraph.sql", "slices.sql", "threads.sql", "track_event_callstacks.sql", diff --git a/src/trace_processor/perfetto_sql/stdlib/viz/flamegraph.sql b/src/trace_processor/perfetto_sql/stdlib/viz/flamegraph.sql deleted file mode 100644 index 70c6a809ad5..00000000000 --- a/src/trace_processor/perfetto_sql/stdlib/viz/flamegraph.sql +++ /dev/null @@ -1,408 +0,0 @@ --- --- Copyright 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 --- --- https://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. - --- sqlformat file off --- The case sensitivity of this file matters so don't format it which --- changes sensitivity. - -INCLUDE PERFETTO MODULE graphs.scan; - -INCLUDE PERFETTO MODULE std.metasql.unparenthesize; - -CREATE PERFETTO MACRO _viz_flamegraph_hash_coalesce(col ColumnName) -RETURNS Expr -AS IFNULL($col, 0); - --- For each frame in |tab|, returns a row containing the result of running --- all the filtering operations over that frame's name. -CREATE PERFETTO MACRO _viz_flamegraph_prepare_filter( - tab TableOrSubquery, - show_stack Expr, - hide_stack Expr, - show_from_frame Expr, - hide_frame Expr, - pivot Expr, - impossible_stack_bits Expr, - grouping ColumnNameList -) -RETURNS TableOrSubquery -AS ( - SELECT - *, - IIF($hide_stack, $impossible_stack_bits, $show_stack) AS stackBits, - $show_from_frame As showFromFrameBits, - $hide_frame = 0 AS showFrame, - $pivot AS isPivot, - HASH( - name, - __intrinsic_token_apply!(_viz_flamegraph_hash_coalesce, $grouping) - ) AS groupingHash - FROM $tab - ORDER BY id -); - --- Walks the forest from root to leaf and performs the following operations: --- 1) removes frames which were filtered out --- 2) make any pivot nodes become the roots --- 3) computes whether the stack as a whole should be retained or not -CREATE PERFETTO MACRO _viz_flamegraph_filter_frames( - source TableOrSubquery, - show_from_frame_bits Expr -) -RETURNS TableOrSubquery -AS ( - WITH edges AS ( - SELECT parentId AS source_node_id, id AS dest_node_id - FROM $source - WHERE parentId IS NOT NULL - ), - inits AS ( - SELECT - id, - IIF( - showFrame AND showFromFrameBits = $show_from_frame_bits, - id, - NULL - ) AS filteredId, - NULL AS filteredParentId, - NULL AS filteredUnpivotedParentId, - IIF( - showFrame, - showFromFrameBits, - 0 - ) AS showFromFrameBits, - IIF( - showFrame AND showFromFrameBits = $show_from_frame_bits, - stackBits, - 0 - ) AS stackBits - FROM $source - WHERE parentId IS NULL - ) - SELECT - g.filteredId AS id, - g.filteredParentId AS parentId, - g.filteredUnpivotedParentId AS unpivotedParentId, - g.stackBits, - SUM(t.value) AS value - FROM _graph_scan!( - edges, - inits, - (filteredId, filteredParentId, filteredUnpivotedParentId, showFromFrameBits, stackBits), - ( - SELECT - t.id, - IIF( - x.showFrame AND (t.showFromFrameBits | x.showFromFrameBits) = $show_from_frame_bits, - t.id, - t.filteredId - ) AS filteredId, - IIF( - x.showFrame AND (t.showFromFrameBits | x.showFromFrameBits) = $show_from_frame_bits, - IIF(x.isPivot, NULL, t.filteredId), - t.filteredParentId - ) AS filteredParentId, - IIF( - x.showFrame AND (t.showFromFrameBits | x.showFromFrameBits) = $show_from_frame_bits, - t.filteredId, - t.filteredParentId - ) AS filteredUnpivotedParentId, - IIF( - x.showFrame, - (t.showFromFrameBits | x.showFromFrameBits), - t.showFromFrameBits - ) AS showFromFrameBits, - IIF( - x.showFrame AND (t.showFromFrameBits | x.showFromFrameBits) = $show_from_frame_bits, - (t.stackBits | x.stackBits), - t.stackBits - ) AS stackBits - FROM $table t - JOIN $source x USING (id) - ) - ) g - JOIN $source t USING (id) - WHERE filteredId IS NOT NULL - GROUP BY filteredId - ORDER BY filteredId -); - --- Walks the forest from leaves to root and does the following: --- 1) removes nodes whose stacks are filtered out --- 2) computes the cumulative value for each node (i.e. the sum of the self --- value of the node and all descendants). -CREATE PERFETTO MACRO _viz_flamegraph_accumulate( - filtered TableOrSubquery, - showStackBits Expr -) -RETURNS TableOrSubquery -AS ( - WITH edges AS ( - SELECT id AS source_node_id, parentId AS dest_node_id - FROM $filtered - WHERE parentId IS NOT NULL - ), inits AS ( - SELECT f.id, f.value AS cumulativeValue - FROM $filtered f - LEFT JOIN $filtered c ON c.parentId = f.id - WHERE c.id IS NULL AND f.stackBits = $showStackBits - ) - SELECT id, cumulativeValue - FROM _graph_aggregating_scan!( - edges, - inits, - (cumulativeValue), - ( - SELECT - x.id, - x.childValue + IIF( - t.stackBits = $showStackBits, - t.value, - 0 - ) AS cumulativeValue - FROM ( - SELECT id, SUM(cumulativeValue) AS childValue - FROM $table - GROUP BY id - ) x - JOIN $filtered t USING (id) - ) - ) - ORDER BY id -); - -CREATE PERFETTO MACRO _viz_flamegraph_s_prefix(col ColumnName) -RETURNS Expr -AS s.$col; - --- Propogates the cumulative value of the pivot nodes to the roots --- and computes the "fingerprint" of the path. -CREATE PERFETTO MACRO _viz_flamegraph_upwards_hash( - source TableOrSubquery, - filtered TableOrSubquery, - accumulated TableOrSubquery, - grouping ColumnNameList, - grouped ColumnNameList -) -RETURNS TableOrSubquery -AS ( - WITH edges AS ( - SELECT id AS source_node_id, unpivotedParentId AS dest_node_id - FROM $filtered - WHERE unpivotedParentId IS NOT NULL - ), - inits AS ( - SELECT - f.id, - HASH(-1, s.groupingHash) AS hash, - NULL AS parentHash, - -1 AS depth, - a.cumulativeValue - FROM $filtered f - JOIN $source s USING (id) - JOIN $accumulated a USING (id) - WHERE s.isPivot AND a.cumulativeValue > 0 - ) - SELECT - g.id, - g.hash, - g.parentHash, - g.depth, - s.name, - __intrinsic_token_apply!(_viz_flamegraph_s_prefix, $grouping), - __intrinsic_token_apply!(_viz_flamegraph_s_prefix, $grouped), - f.value, - g.cumulativeValue - FROM _graph_scan!( - edges, - inits, - (hash, parentHash, depth, cumulativeValue), - ( - SELECT - t.id, - HASH(t.hash, x.groupingHash) AS hash, - t.hash AS parentHash, - t.depth - 1 AS depth, - t.cumulativeValue - FROM $table t - JOIN $source x USING (id) - ) - ) g - JOIN $source s USING (id) - JOIN $filtered f USING (id) -); - --- Computes the "fingerprint" of the path by walking from the laves --- to the root. -CREATE PERFETTO MACRO _viz_flamegraph_downwards_hash( - source TableOrSubquery, - filtered TableOrSubquery, - accumulated TableOrSubquery, - grouping ColumnNameList, - grouped ColumnNameList, - showDownward Expr -) -RETURNS TableOrSubquery -AS ( - WITH - edges AS ( - SELECT parentId AS source_node_id, id AS dest_node_id - FROM $filtered - WHERE parentId IS NOT NULL - ), - inits AS ( - SELECT - f.id, - HASH(1, s.groupingHash) AS hash, - NULL AS parentHash, - 1 AS depth - FROM $filtered f - JOIN $source s USING (id) - WHERE f.parentId IS NULL AND $showDownward - ) - SELECT - g.id, - g.hash, - g.parentHash, - g.depth, - s.name, - __intrinsic_token_apply!(_viz_flamegraph_s_prefix, $grouping), - __intrinsic_token_apply!(_viz_flamegraph_s_prefix, $grouped), - f.value, - a.cumulativeValue - FROM _graph_scan!( - edges, - inits, - (hash, parentHash, depth), - ( - SELECT - t.id, - HASH(t.hash, x.groupingHash) AS hash, - t.hash AS parentHash, - t.depth + 1 AS depth - FROM $table t - JOIN $source x USING (id) - ) - ) g - JOIN $source s USING (id) - JOIN $filtered f USING (id) - JOIN $accumulated a USING (id) - ORDER BY hash -); - --- Converts a table of hashes and paretn hashes into ids and parent --- ids, grouping all hashes together. -CREATE PERFETTO MACRO _viz_flamegraph_merge_hashes( - hashed TableOrSubquery, - grouping ColumnNameList, - grouped_agged_exprs ColumnNameList -) -RETURNS TableOrSubquery -AS ( - SELECT - _auto_id AS id, - ( - SELECT p._auto_id - FROM $hashed p - WHERE p.hash = c.parentHash - LIMIT 1 - ) AS parentId, - depth, - name, - -- The grouping columns should be passed through as-is because the - -- hash took them into account: we would not merged any nodes where - -- the grouping columns were different. - metasql_unparenthesize_exprlist!($grouping), - metasql_unparenthesize_exprlist!($grouped_agged_exprs), - SUM(value) AS value, - SUM(cumulativeValue) AS cumulativeValue - FROM $hashed c - GROUP BY hash -); - --- Performs a "layout" of nodes in the flamegraph relative to their --- siblings. -CREATE PERFETTO MACRO _viz_flamegraph_local_layout(merged TableOrSubquery) -RETURNS TableOrSubquery -AS ( - WITH partial_layout AS ( - SELECT - id, - cumulativeValue, - SUM(cumulativeValue) OVER win AS xEnd - FROM $merged - WHERE cumulativeValue > 0 - WINDOW win AS ( - PARTITION BY parentId, depth - ORDER BY cumulativeValue DESC - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ) - ) - SELECT id, xEnd - cumulativeValue as xStart, xEnd - FROM partial_layout - ORDER BY id -); - --- Walks the graph from root to leaf, propogating the layout of --- parents to their children. -CREATE PERFETTO MACRO _viz_flamegraph_global_layout( - merged TableOrSubquery, - layout TableOrSubquery, - grouping ColumnNameList, - grouped ColumnNameList -) -RETURNS TableOrSubquery -AS ( - WITH edges AS ( - SELECT parentId AS source_node_id, id AS dest_node_id - FROM $merged - WHERE parentId IS NOT NULL - ), - inits AS ( - SELECT h.id, 1 AS rootDistance, l.xStart, l.xEnd - FROM $merged h - JOIN $layout l USING (id) - WHERE h.parentId IS NULL - ) - SELECT - s.id, - IFNULL(s.parentId, -1) AS parentId, - IIF(s.name = '', 'unknown', s.name) AS name, - __intrinsic_token_apply!(_viz_flamegraph_s_prefix, $grouping), - __intrinsic_token_apply!(_viz_flamegraph_s_prefix, $grouped), - s.value AS selfValue, - s.cumulativeValue, - p.cumulativeValue AS parentCumulativeValue, - s.depth, - g.xStart, - g.xEnd - FROM _graph_scan!( - edges, - inits, - (rootDistance, xStart, xEnd), - ( - SELECT - t.id, - t.rootDistance + 1 as rootDistance, - t.xStart + w.xStart AS xStart, - t.xStart + w.xEnd AS xEnd - FROM $table t - JOIN $layout w USING (id) - ) - ) g - JOIN $merged s USING (id) - LEFT JOIN $merged p ON s.parentId = p.id - ORDER BY rootDistance, xStart -); diff --git a/src/trace_processor/plugins/flamegraph/BUILD.gn b/src/trace_processor/plugins/flamegraph/BUILD.gn index e6f3968e4b6..959618a4bd6 100644 --- a/src/trace_processor/plugins/flamegraph/BUILD.gn +++ b/src/trace_processor/plugins/flamegraph/BUILD.gn @@ -26,11 +26,38 @@ source_set("flamegraph") { ] deps = [ "../../../../gn:default_deps", + "../../../../include/perfetto/ext/base", "../../../base", "../../../base/regex", "../../containers", + "../../core/common", + "../../core/tree", + "../../core/util", + ] +} + +# The SQL intrinsics exposing the computation to PerfettoSQL. +source_set("intrinsics") { + sources = [ + "flamegraph_function.cc", + "flamegraph_function.h", + ] + deps = [ + ":flamegraph", + "../../../../gn:default_deps", + "../../../../gn:sqlite", + "../../../base", + "../../../base/regex", + "../../containers", + "../../core/common", "../../core/dataframe", + "../../core/plugin", + "../../core/tree", "../../core/util", + "../../perfetto_sql/engine", + "../../sqlite", + "../../storage", + "../../types", ] } @@ -44,7 +71,9 @@ if (enable_perfetto_benchmarks) { "../../../../gn:default_deps", "../../../base", "../../containers", - "../../core/dataframe", + "../../core/common", + "../../core/tree", + "../../core/util", ] } } @@ -58,7 +87,7 @@ perfetto_unittest_source_set("unittests") { "../../../../gn:gtest_and_gmock", "../../../base", "../../containers", - "../../core/dataframe", + "../../core/tree", "../../core/util", ] } diff --git a/src/trace_processor/plugins/flamegraph/flamegraph.cc b/src/trace_processor/plugins/flamegraph/flamegraph.cc index 6121abfa1b5..2e197122043 100644 --- a/src/trace_processor/plugins/flamegraph/flamegraph.cc +++ b/src/trace_processor/plugins/flamegraph/flamegraph.cc @@ -17,670 +17,1618 @@ #include "src/trace_processor/plugins/flamegraph/flamegraph.h" #include -#include +#include +#include #include #include #include -#include +#include +#include #include #include #include "perfetto/base/logging.h" #include "perfetto/base/status.h" +#include "perfetto/ext/base/endian.h" #include "perfetto/ext/base/flat_hash_map.h" -#include "perfetto/ext/base/regex.h" +#include "perfetto/ext/base/hash.h" +#include "perfetto/ext/base/murmur_hash.h" #include "perfetto/ext/base/status_macros.h" #include "perfetto/ext/base/status_or.h" -#include "src/trace_processor/core/dataframe/adhoc_dataframe_builder.h" -#include "src/trace_processor/core/dataframe/dataframe.h" +#include "perfetto/ext/base/string_utils.h" +#include "perfetto/ext/base/utils.h" +#include "src/trace_processor/core/tree/tree_column_ops.h" +#include "src/trace_processor/core/tree/tree_path_interner.h" +#include "src/trace_processor/core/util/bit_vector.h" #include "src/trace_processor/core/util/flex_vector.h" +#include "src/trace_processor/core/util/slab.h" +#include "src/trace_processor/core/util/sort.h" namespace perfetto::trace_processor::flamegraph { namespace { -using core::FlexVector; +// A bit outside the SHOW_STACK mask. Once set, equality with the required +// SHOW_STACK mask is impossible, rejecting this path and all its descendants. +constexpr uint64_t kHideStackBit = uint64_t{1} << 63; -// Show-stack and show-from filters are tracked as per-frame bitmasks, one -// bit per filter, ORed along each path: a stack satisfies them when every -// bit is present. -constexpr size_t kMaxBitFilters = 63; - -// Row helpers for the flattened metric columns; explicit loops so they -// inline instead of dispatching into libc for a handful of bytes. -void AddRow(double* dst, const double* src, uint32_t k) { - for (uint32_t m = 0; m < k; ++m) { - dst[m] += src[m]; +template +bool TryAdd(T value, T* total) { + static_assert(std::is_same_v || std::is_same_v); + if constexpr (std::is_same_v) { + return base::CheckedAdd(*total, value, total); + } else { + *total += value; + return true; } } -void CopyRow(double* dst, const double* src, uint32_t k) { - for (uint32_t m = 0; m < k; ++m) { - dst[m] = src[m]; +template +bool AccumulateSum(T value, + uint32_t destination, + core::Span sums, + core::BitVector* has_value) { + PERFETTO_DCHECK(destination < sums.size()); + PERFETTO_DCHECK(has_value->size() == sums.size()); + if (!has_value->is_set(destination)) { + sums[destination] = value; + has_value->set(destination); + return true; } + return TryAdd(value, &sums[destination]); +} + +template +core::Slab AllocFilled(uint64_t size, T value) { + core::Slab slab = core::Slab::Alloc(size); + std::fill_n(slab.data(), size, value); + return slab; } -bool AnyNonZero(const double* row, uint32_t k) { - for (uint32_t m = 0; m < k; ++m) { - if (row[m] < 0 || row[m] > 0) { - return true; +void UpdateNonZeroRows(const core::Tree::Column& column, + uint32_t offset, + core::Span rows) { + if (column.type.Is()) { + core::Span values = + column.unchecked_span().subspan(offset, rows.size()); + for (uint32_t row = 0; row < rows.size(); ++row) { + rows[row] |= !base::IsZero(values[row]); } + return; + } + PERFETTO_DCHECK(column.type.Is()); + core::Span values = + column.unchecked_span().subspan(offset, rows.size()); + for (uint32_t row = 0; row < rows.size(); ++row) { + rows[row] |= !base::IsZero(values[row]); } - return false; } -// The compiled filter regexes. The pivot pattern is an extra show-stack -// filter (only pivot-containing stacks are shown), remembered by index so -// pivot frames can be identified from the match bitmask. -struct Filters { - std::vector show_stack; - std::vector hide_stack; - std::vector show_from; - std::vector hide_frame; - uint32_t pivot_idx = 0; - uint64_t show_stack_mask = 0; - uint64_t show_from_mask = 0; - // A bit outside the mask: assigning it to a frame's bits makes its - // stacks unable to ever satisfy the mask, implementing hide-stack. - uint64_t impossible_bits = 0; +struct FilterMatches { + uint64_t show_stack : Config::kMaxShowStackFilters; + uint64_t view_pattern : 1; + uint64_t hide_stack : 1; + uint64_t hide_frame : 1; +}; +static_assert(sizeof(FilterMatches) == 8); + +constexpr FilterMatches kNoFilterMatches{}; + +// Everything later phases need from the root-to-row path traversal. Keeping +// the path-compressed retained frame avoids any later ancestor search. +struct PathState { + // SHOW_STACK matches on retained frames, plus kHideStackBit if a retained + // frame on this path matched HIDE_STACK. Removed frames inherit this value + // unchanged, so their names cannot affect stack filtering. + uint64_t stack_bits; + + // The nearest retained input row. A retained frame points to itself, while a + // removed frame inherits its nearest retained ancestor. + uint32_t retained_frame; + uint8_t padding[4]; + + bool IsRetained(uint32_t row) const; + bool StackIsHidden() const; + bool StackContributes(uint64_t required_show_stack_bits) const; +}; +static_assert(sizeof(PathState) == 16); + +static constexpr PathState kEmptyPathState = + PathState{0, core::Tree::kNullParent, {}}; + +struct UpwardPath { + uint32_t root; + uint32_t leaf; +}; +static_assert(sizeof(UpwardPath) == 8); + +struct UpwardAnchor { + uint32_t frame; + UpwardPath path; +}; +static_assert(sizeof(UpwardAnchor) == 12); + +struct TreeConstituent { + uint32_t frame; + uint32_t node; +}; +static_assert(sizeof(TreeConstituent) == 8); + +// Self and cumulative values for one value column, indexed by combined node +// id: downward nodes first, then upward nodes offset by the downward size. +// Aggregate columns use the same combined id space. +struct MetricColumns { + core::Tree::Column self; + core::Tree::Column cumulative; +}; + +// Outputs of the three build stages, produced in order by Run(). + +// View-independent per-row analysis: frame identity, filter matching and +// path compression. Depends only on the input tree and the config's +// regexes; both halves are built from it. +struct PathAnalysis { + std::vector frame_hashes; + core::Slab states; + // Retained rows whose frame matches the view pattern. Allocated only when + // the config has a view pattern. + core::BitVector view_pattern_matches; +}; - bool any() const { - return !show_stack.empty() || !hide_stack.empty() || !show_from.empty() || - !hide_frame.empty(); +// The merged downward (descendant) half of the view. +struct DownwardHalf { + explicit DownwardHalf(uint32_t interner_capacity) : tree(interner_capacity) {} + + core::TreePathInterner tree; + // Input row -> merged node receiving its values, kNullParent when the row + // is outside the downward half. + core::Slab node; +}; + +// The merged upward (ancestor) half of the view. +struct UpwardHalf { + explicit UpwardHalf(uint32_t interner_capacity) : tree(interner_capacity) {} + + core::TreePathInterner tree; + core::Slab bottom_up_paths; + core::FlexVector pivot_anchors; + core::FlexVector aggregate_constituents; +}; + +// Compact two-level routing for aggregates. Output nodes reference retained +// frames, and retained frames reference the input rows folded into them. +struct AggregateRouting { + core::Slab output_frame_offsets; + core::Slab output_frames; + core::Slab frame_row_offsets; + core::Slab frame_rows; + bool frame_rows_are_identity = false; +}; + +// Appends the textual form of an aggregated value: strings verbatim, +// numbers formatted directly so numeric columns need no per-row interning. +void AppendValue(StringPool::Id value, + const StringPool& pool, + std::string* out) { + const NullTermStringView str = pool.Get(value); + out->append(str.data(), str.size()); +} +void AppendValue(int64_t value, const StringPool&, std::string* out) { + base::StackString<32> str("%" PRId64, value); + out->append(str.c_str(), str.len()); +} +void AppendValue(double value, const StringPool&, std::string* out) { + base::StackString<32> str("%.15g", value); + out->append(str.c_str(), str.len()); + // Match SQLite's REAL rendering: integral values keep a trailing ".0". + // The scan set also skips infinities and NaNs. + if (strcspn(str.c_str(), ".eEnN") == str.len()) { + out->append(".0"); + } +} + +// Canonical 64-bit pattern used to count distinct aggregate values without +// comparing the values themselves (which -Wfloat-equal forbids for doubles). +uint64_t DistinctKey(StringPool::Id value) { + return value.raw_id(); +} +uint64_t DistinctKey(int64_t value) { + return static_cast(value); +} +uint64_t DistinctKey(double value) { + if (base::IsZero(value)) { + return 0; // Canonicalize -0.0 to +0.0. } + uint64_t bits; + memcpy(&bits, &value, sizeof(bits)); + return bits; +} + +struct NativeFrameRouting { + core::Span states; + core::Span downward_nodes; + core::Span upward_constituents; + uint32_t downward_size; + uint64_t required_show_stack_bits; + bool has_downward; }; -base::StatusOr CompileFilters(const Config& config) { - Filters f; - for (const auto& spec : config.filters) { - ASSIGN_OR_RETURN(base::Regex re, base::Regex::Create(spec.pattern)); - switch (spec.kind) { - case Config::FilterKind::kShowStack: - f.show_stack.push_back(std::move(re)); - break; - case Config::FilterKind::kHideStack: - f.hide_stack.push_back(std::move(re)); - break; - case Config::FilterKind::kShowFromFrame: - f.show_from.push_back(std::move(re)); - break; - case Config::FilterKind::kHideFrame: - f.hide_frame.push_back(std::move(re)); - break; - } +class AggregateOperator { + public: + enum class InputMode { + kRowsToOutputs, + kNativeRowsToFramesThenFramesToOutputs, + }; + + virtual ~AggregateOperator(); + virtual InputMode input_mode() const { return InputMode::kRowsToOutputs; } + virtual base::Status UpdateBatch(core::Span, + core::Span) { + PERFETTO_FATAL("Aggregate operator does not support direct row updates"); } - if (config.view == Config::View::kPivot) { - if (!config.pivot_pattern) { - return base::ErrStatus( - "flamegraph: pivot pattern is required for the pivot view"); - } - ASSIGN_OR_RETURN(base::Regex re, - base::Regex::Create(*config.pivot_pattern)); - f.pivot_idx = static_cast(f.show_stack.size()); - f.show_stack.push_back(std::move(re)); - } else if (config.pivot_pattern) { - return base::ErrStatus( - "flamegraph: pivot pattern is only valid for the pivot view"); + virtual base::Status UpdateFrames(const NativeFrameRouting&) { + PERFETTO_FATAL("Aggregate operator does not support frame aggregation"); } - if (f.show_stack.size() > kMaxBitFilters || - f.show_from.size() > kMaxBitFilters) { - return base::ErrStatus("flamegraph: too many filters (max %zu per kind)", - kMaxBitFilters); + virtual base::Status MergeFrames(const NativeFrameRouting&) { + PERFETTO_FATAL("Aggregate operator does not support frame merging"); } - f.show_stack_mask = (uint64_t(1) << f.show_stack.size()) - 1; - f.show_from_mask = (uint64_t(1) << f.show_from.size()) - 1; - f.impossible_bits = uint64_t(1) << f.show_stack.size(); - return base::StatusOr(std::move(f)); -} - -// Returns the frames in parents-before-children order, excluding frames -// unreachable from a root (dangling parent indices, cycles). Input that is -// already ordered, the common case, is detected and returned as the -// identity order with no index built. -FlexVector TopoOrder(const Forest& forest) { - auto n = static_cast(forest.size()); - bool ordered = true; - for (uint32_t i = 0; i < n && ordered; ++i) { - uint32_t p = forest.parent[i]; - ordered = p == kNoParent || p < i; - } - auto order = FlexVector::CreateWithSize(n); - if (ordered) { - for (uint32_t i = 0; i < n; ++i) { - order[i] = i; - } - return order; - } - // Reverse the parent index into child lists with a count + scatter pass, - // then DFS from the roots. - auto child_offset = FlexVector::CreateFilled(n + 2, 0); - for (uint32_t i = 0; i < n; ++i) { - if (forest.parent[i] < n) { - child_offset[forest.parent[i] + 2]++; - } - } - for (uint32_t i = 2; i < n + 2; ++i) { - child_offset[i] += child_offset[i - 1]; - } - auto child_list = FlexVector::CreateWithSize(child_offset[n + 1]); - for (uint32_t i = 0; i < n; ++i) { - if (forest.parent[i] < n) { - child_list[child_offset[forest.parent[i] + 1]++] = i; - } - } - order.clear(); - FlexVector stack; - for (uint32_t i = n; i-- > 0;) { - if (forest.parent[i] == kNoParent) { - stack.push_back(i); - } - } - while (!stack.empty()) { - uint32_t i = stack.back(); - stack.pop_back(); - order.push_back(i); - for (uint32_t c = child_offset[i + 1]; c-- > child_offset[i];) { - stack.push_back(child_list[c]); - } - } - return order; -} - -// A merged tree under construction. Node identity is (parent node, key), -// resolved through one exact hash map; nodes are created in -// parents-before-children order by construction. |expected_nodes| sizes -// the map and node columns so steady-state growth never reallocates; pass -// 0 when the output is expected to be small (pivot views). -struct Trie { - Trie(uint32_t metric_count, uint32_t expected_nodes) - : k(metric_count), - // 1.5x keeps the expected node count under the map's load limit. - map(NextPow2(uint64_t(expected_nodes) + expected_nodes / 2)) { - parent.reserve(expected_nodes); - rep_frame.reserve(expected_nodes); - self.reserve(uint64_t(expected_nodes) * k); - cumulative.reserve(uint64_t(expected_nodes) * k); - } - - static size_t NextPow2(uint64_t v) { - uint64_t p = 16; - while (p < v) { - p *= 2; - } - PERFETTO_CHECK(p <= std::numeric_limits::max()); - return static_cast(p); - } - - uint32_t ChildOf(uint32_t node, uint32_t key, uint32_t frame) { - auto next = static_cast(parent.size()); - auto [id, inserted] = map.Insert((uint64_t(node) << 32) | key, next); - if (inserted) { - parent.push_back(node); - rep_frame.push_back(frame); - self.push_back_multiple(0, k); - cumulative.push_back_multiple(0, k); - } - return *id; + virtual base::Status Finalize() { return base::OkStatus(); } + virtual core::Tree::Column TakeOutput() = 0; +}; + +AggregateOperator::~AggregateOperator() = default; + +template +class SumAggregateOperator final : public AggregateOperator { + public: + SumAggregateOperator(const core::Tree::Column& input, uint32_t output_rows) + : input_(input), + frame_totals_(core::Tree::Column::Create( + static_cast(input.unchecked_span().size()))), + output_(core::Tree::Column::Create(output_rows)) { + frame_totals_.null_bv = core::BitVector::CreateWithSize( + input.unchecked_span().size(), false); + output_.null_bv = core::BitVector::CreateWithSize(output_rows, false); } - size_t size() const { return parent.size(); } - - uint32_t k; - base::FlatHashMapV2 map; - FlexVector parent; - FlexVector rep_frame; - FlexVector self; - FlexVector cumulative; -}; + InputMode input_mode() const override { + return InputMode::kNativeRowsToFramesThenFramesToOutputs; + } -// Drops every node whose subtree is zero on all metrics (uncounted or -// valueless stacks) and packs the survivors into the output Tree, along -// with the constituent index built from the (node, frame) pairs by a -// count + scatter pass. -Tree PackTree(Trie trie, const FlexVector& node_frame_pairs) { - auto nodes = static_cast(trie.size()); - uint32_t k = trie.k; - if (nodes == 0) { - Tree tree; - tree.metric_count = k; - tree.constituents_offset = FlexVector::CreateFilled(1, 0); - return tree; - } - // A node stays if its own subtree has value; children come after their - // parent, so one reverse scan propagates "has a kept descendant". - auto keep = FlexVector::CreateFilled(nodes, 0); - for (uint32_t i = nodes; i-- > 0;) { - keep[i] = keep[i] || AnyNonZero(&trie.cumulative[i * k], k); - if (keep[i] && trie.parent[i] != kNoParent) { - keep[trie.parent[i]] = 1; - } - } - auto remap = FlexVector::CreateWithSize(nodes); - uint32_t packed = 0; - for (uint32_t i = 0; i < nodes; ++i) { - remap[i] = keep[i] ? packed++ : kNoParent; - } - - Tree tree; - tree.metric_count = k; - if (packed == nodes) { - // Nothing dropped: adopt the trie's columns as-is (remap is the - // identity). - tree.parent = std::move(trie.parent); - tree.rep_frame = std::move(trie.rep_frame); - tree.self = std::move(trie.self); - tree.cumulative = std::move(trie.cumulative); - } else { - tree.parent = FlexVector::CreateWithSize(packed); - tree.rep_frame = FlexVector::CreateWithSize(packed); - tree.self = FlexVector::CreateWithSize(uint64_t(packed) * k); - tree.cumulative = FlexVector::CreateWithSize(uint64_t(packed) * k); - for (uint32_t i = 0; i < nodes; ++i) { - if (!keep[i]) { + base::Status UpdateFrames(const NativeFrameRouting& routing) override { + core::Span input = input_.unchecked_span(); + core::Span totals = frame_totals_.unchecked_span(); + for (uint32_t row = 0; row < input.size(); ++row) { + if (input_.null_bv.size() > 0 && !input_.null_bv.is_set(row)) { continue; } - uint32_t out = remap[i]; - tree.parent[out] = - trie.parent[i] == kNoParent ? kNoParent : remap[trie.parent[i]]; - tree.rep_frame[out] = trie.rep_frame[i]; - CopyRow(&tree.self[out * k], &trie.self[i * k], k); - CopyRow(&tree.cumulative[out * k], &trie.cumulative[i * k], k); - } - } - - tree.constituents_offset = FlexVector::CreateFilled(packed + 1, 0); - for (uint64_t pair : node_frame_pairs) { - uint32_t node = remap[pair >> 32]; - if (node != kNoParent) { - tree.constituents_offset[node + 1]++; - } - } - for (uint32_t i = 1; i <= packed; ++i) { - tree.constituents_offset[i] += tree.constituents_offset[i - 1]; - } - tree.constituents = - FlexVector::CreateWithSize(tree.constituents_offset[packed]); - if (packed != 0) { - auto cursor = FlexVector::CreateWithSize(packed); - memcpy(cursor.data(), tree.constituents_offset.data(), - packed * sizeof(uint32_t)); - for (uint64_t pair : node_frame_pairs) { - uint32_t node = remap[pair >> 32]; - if (node != kNoParent) { - tree.constituents[cursor[node]++] = static_cast(pair); + const PathState& state = routing.states[row]; + if (state.retained_frame == core::Tree::kNullParent || + state.StackIsHidden()) { + continue; + } + if (!AccumulateSum(input[row], state.retained_frame, totals, + &frame_totals_.null_bv)) { + return base::ErrStatus("flamegraph: integer aggregate overflow"); } } + return base::OkStatus(); } - return tree; -} -// The state shared by the phases of one Build() call. See Build() at the -// bottom for the phase sequence. -class Builder { + base::Status MergeFrames(const NativeFrameRouting& routing) override { + const core::Tree::Column& frame_totals = frame_totals_; + core::Span totals = frame_totals.unchecked_span(); + core::Span output = output_.unchecked_span(); + if (routing.has_downward) { + for (uint32_t frame = 0; frame < routing.states.size(); ++frame) { + const PathState& state = routing.states[frame]; + if (!state.IsRetained(frame) || !frame_totals_.null_bv.is_set(frame) || + routing.downward_nodes[frame] == core::Tree::kNullParent || + !state.StackContributes(routing.required_show_stack_bits)) { + continue; + } + if (!AccumulateSum(totals[frame], routing.downward_nodes[frame], output, + &output_.null_bv)) { + return base::ErrStatus("flamegraph: integer aggregate overflow"); + } + } + } + for (const TreeConstituent& constituent : routing.upward_constituents) { + if (!frame_totals_.null_bv.is_set(constituent.frame)) { + continue; + } + if (!AccumulateSum(totals[constituent.frame], + routing.downward_size + constituent.node, output, + &output_.null_bv)) { + return base::ErrStatus("flamegraph: integer aggregate overflow"); + } + } + return base::OkStatus(); + } + + core::Tree::Column TakeOutput() override { return std::move(output_); } + + private: + const core::Tree::Column& input_; + core::Tree::Column frame_totals_; + core::Tree::Column output_; +}; + +template +class OneOrSummaryAggregateOperator final : public AggregateOperator { public: - Builder(const Forest& forest, - const Config& config, - const StringPool& pool, - Filters filters) - : forest_(forest), - config_(config), + OneOrSummaryAggregateOperator(const core::Tree::Column& input, + StringPool& pool, + uint32_t output_rows) + : input_(input), pool_(pool), - filters_(std::move(filters)), - frame_count_(static_cast(forest.size())), - metric_count_(forest.metric_count), - // Full top-down / bottom-up output has up to one node per frame; - // pivot output is typically far smaller, so let that grow on - // demand. - expected_nodes_(config.view == Config::View::kPivot ? 0 - : frame_count_) {} - - Flamegraph Run() { - EvaluateNameMasks(); - order_ = TopoOrder(forest_); - EvaluatePaths(); - SelectAnchors(); - Flamegraph result; - result.down.metric_count = metric_count_; - result.down.constituents_offset = FlexVector::CreateFilled(1, 0); - result.up.metric_count = metric_count_; - result.up.constituents_offset = FlexVector::CreateFilled(1, 0); - if (config_.view != Config::View::kBottomUp) { - result.down = BuildDown(); - } - if (config_.view != Config::View::kTopDown) { - result.up = BuildUp(); - } - return result; + output_(core::Tree::Column::Create(output_rows)) { + output_.null_bv = core::BitVector::CreateWithSize(output_rows, false); } - private: - // Per distinct name, its regex results across all filters. - struct NameMasks { - uint64_t show_stack_bits; - uint64_t show_from_bits; - bool shown; - }; + base::Status UpdateBatch(core::Span output_rows, + core::Span input_rows) override { + core::Span input = input_.unchecked_span(); + for (uint32_t i = 0; i < input_rows.size(); ++i) { + const uint32_t input_row = input_rows[i]; + if (input_.null_bv.size() > 0 && !input_.null_bv.is_set(input_row)) { + continue; + } + if (output_rows[i] != current_output_row_) { + FinishGroup(); + current_output_row_ = output_rows[i]; + } + Add(input[input_row]); + } + return base::OkStatus(); + } - const NameMasks& MasksOf(uint32_t frame) const { - return masks_[forest_.name[frame]]; + base::Status Finalize() override { + FinishGroup(); + return base::OkStatus(); } - bool IsPivotFrame(uint32_t frame) const { - return ((MasksOf(frame).show_stack_bits >> filters_.pivot_idx) & 1) != 0; + core::Tree::Column TakeOutput() override { return std::move(output_); } + + private: + void Add(T value) { + const uint64_t key = DistinctKey(value); + if (!has_value_) { + representative_ = value; + representative_key_ = key; + has_value_ = true; + } else if (!has_multiple_values_ && key != representative_key_) { + distinct_keys_.push_back(representative_key_); + distinct_keys_.push_back(key); + has_multiple_values_ = true; + } else if (has_multiple_values_) { + distinct_keys_.push_back(key); + } } - // Runs every filter regex against every distinct name once. - void EvaluateNameMasks() { - auto names = static_cast(forest_.name_table.size()); - masks_ = FlexVector::CreateFilled(names, {0, 0, true}); - if (!filters_.any()) { + void FinishGroup() { + if (!has_value_) { return; } - for (uint32_t t = 0; t < names; ++t) { - NullTermStringView name = pool_.Get(forest_.name_table[t]); - std::string_view view(name.data(), name.size()); - auto matches = [&](const base::Regex& re) { - if (re.PartialMatch(view)) { - return true; - } - if (forest_.match_offset.empty()) { - return false; - } - for (uint32_t s = forest_.match_offset[t]; - s < forest_.match_offset[t + 1]; ++s) { - NullTermStringView extra = pool_.Get(forest_.match_strings[s]); - if (re.PartialMatch(std::string_view(extra.data(), extra.size()))) { - return true; - } - } - return false; - }; - uint64_t sb = 0; - for (uint32_t j = 0; j < filters_.show_stack.size(); ++j) { - sb |= uint64_t(matches(filters_.show_stack[j])) << j; + core::Span output = + output_.unchecked_span(); + if constexpr (std::is_same_v) { + if (!has_multiple_values_) { + output[current_output_row_] = representative_; + output_.null_bv.set(current_output_row_); + ResetGroup(); + return; } - bool hidden = std::any_of(filters_.hide_stack.begin(), - filters_.hide_stack.end(), matches); - masks_[t].show_stack_bits = hidden ? filters_.impossible_bits : sb; - for (uint32_t j = 0; j < filters_.show_from.size(); ++j) { - masks_[t].show_from_bits |= uint64_t(matches(filters_.show_from[j])) - << j; + } + summary_.clear(); + AppendValue(representative_, pool_, &summary_); + if (has_multiple_values_) { + std::sort(distinct_keys_.begin(), distinct_keys_.end()); + const size_t distinct_count = static_cast(std::distance( + distinct_keys_.begin(), + std::unique(distinct_keys_.begin(), distinct_keys_.end()))); + summary_ += " and "; + summary_ += std::to_string(distinct_count); + summary_ += " others"; + } + output[current_output_row_] = + pool_.InternString(base::StringView(summary_)); + output_.null_bv.set(current_output_row_); + ResetGroup(); + } + + void ResetGroup() { + distinct_keys_.clear(); + has_value_ = false; + has_multiple_values_ = false; + } + + const core::Tree::Column& input_; + StringPool& pool_; + core::Tree::Column output_; + std::vector distinct_keys_; + std::string summary_; + T representative_{}; + uint64_t representative_key_ = 0; + uint32_t current_output_row_ = core::Tree::kNullParent; + bool has_value_ = false; + bool has_multiple_values_ = false; +}; + +template +class ConcatAggregateOperator final : public AggregateOperator { + public: + ConcatAggregateOperator(const core::Tree::Column& input, + StringPool& pool, + uint32_t output_rows) + : input_(input), + pool_(pool), + output_(core::Tree::Column::Create(output_rows)) { + output_.null_bv = core::BitVector::CreateWithSize(output_rows, false); + } + + base::Status UpdateBatch(core::Span output_rows, + core::Span input_rows) override { + core::Span input = input_.unchecked_span(); + for (uint32_t i = 0; i < input_rows.size(); ++i) { + const uint32_t input_row = input_rows[i]; + if (input_.null_bv.size() > 0 && !input_.null_bv.is_set(input_row)) { + continue; } - masks_[t].shown = !std::any_of(filters_.hide_frame.begin(), - filters_.hide_frame.end(), matches); - } - } - - // One pass along every path, in topological order. Per frame: whether it - // is kept (hide-frame, show-from), its nearest kept ancestor, whether - // its stack satisfies every show/hide-stack filter (so its values - // count), and its metrics with hidden frames' values folded into the - // kept ancestor. - void EvaluatePaths() { - kept_ = FlexVector::CreateFilled(frame_count_, 0); - counted_ = FlexVector::CreateFilled(frame_count_, 0); - ancestor_ = FlexVector::CreateFilled(frame_count_, kNoParent); - auto sb_path = FlexVector::CreateWithSize(frame_count_); - auto sf_path = FlexVector::CreateWithSize(frame_count_); - folded_ = FlexVector::CreateWithSize(uint64_t(frame_count_) * - metric_count_); - memcpy(folded_.data(), forest_.metrics.data(), - uint64_t(frame_count_) * metric_count_ * sizeof(double)); - for (uint32_t i : order_) { - uint32_t p = forest_.parent[i]; - bool has_parent = p != kNoParent; - const NameMasks& m = MasksOf(i); - sf_path[i] = - (has_parent ? sf_path[p] : 0) | (m.shown ? m.show_from_bits : 0); - kept_[i] = m.shown && sf_path[i] == filters_.show_from_mask; - ancestor_[i] = !has_parent ? kNoParent : (kept_[p] ? p : ancestor_[p]); - sb_path[i] = - (has_parent ? sb_path[p] : 0) | (kept_[i] ? m.show_stack_bits : 0); - counted_[i] = kept_[i] && sb_path[i] == filters_.show_stack_mask; - if (!kept_[i] && ancestor_[i] != kNoParent) { - AddRow(&folded_[ancestor_[i] * metric_count_], - &forest_.metrics[i * metric_count_], metric_count_); + if (output_rows[i] != current_output_row_) { + FinishGroup(); + current_output_row_ = output_rows[i]; } + if (!text_.empty()) { + text_.push_back(','); + } + AppendValue(input[input_row], pool_, &text_); } + return base::OkStatus(); } - // Selects the frames the merged trees grow from and re-root at. This is - // the only place the views differ; every phase after this treats - // anchors uniformly. - void SelectAnchors() { - anchor_ = FlexVector::CreateFilled(frame_count_, 0); - for (uint32_t i : order_) { - switch (config_.view) { - case Config::View::kTopDown: - // The roots of the kept forest. - anchor_[i] = kept_[i] && ancestor_[i] == kNoParent; - break; - case Config::View::kBottomUp: - // Every frame whose own values count: each one is a stack - // sample whose caller chain the up tree attributes. - anchor_[i] = counted_[i]; - break; - case Config::View::kPivot: - // Frames matching the pivot pattern; nested matches re-root. - anchor_[i] = kept_[i] && IsPivotFrame(i); - break; - } + base::Status Finalize() override { + FinishGroup(); + return base::OkStatus(); + } + + core::Tree::Column TakeOutput() override { return std::move(output_); } + + private: + void FinishGroup() { + if (text_.empty()) { + return; } + output_.unchecked_span()[current_output_row_] = + pool_.InternString(base::StringView(text_)); + output_.null_bv.set(current_output_row_); + text_.clear(); } - // The downward half: one forward scan with a trie cursor. Anchors start - // merged roots; every other kept frame merges under its ancestor's - // node. - Tree BuildDown() { - Trie trie(metric_count_, expected_nodes_); - auto trie_of = FlexVector::CreateFilled(frame_count_, kNoParent); - for (uint32_t i : order_) { - if (!kept_[i]) { - continue; - } - uint32_t node; - if (anchor_[i]) { - node = trie.ChildOf(kNoParent, forest_.key[i], i); - } else if (ancestor_[i] != kNoParent && - trie_of[ancestor_[i]] != kNoParent) { - node = trie.ChildOf(trie_of[ancestor_[i]], forest_.key[i], i); + const core::Tree::Column& input_; + StringPool& pool_; + core::Tree::Column output_; + std::string text_; + uint32_t current_output_row_ = core::Tree::kNullParent; +}; + +struct PackedTree { + explicit PackedTree(uint32_t capacity) + : depths(core::Slab::Alloc(capacity)), + source_nodes(core::Slab::Alloc(capacity)), + parents(core::Slab::Alloc(capacity)), + representative_frames(core::Slab::Alloc(capacity)) {} + + void Append(int64_t depth, + uint32_t source_node, + uint32_t parent, + uint32_t representative_frame) { + PERFETTO_DCHECK(rows < depths.size()); + depths[rows] = depth; + source_nodes[rows] = source_node; + parents[rows] = parent; + representative_frames[rows] = representative_frame; + ++rows; + } + + uint32_t size() const { return rows; } + core::Span source_node_span() const { + return source_nodes.span().subspan(0, rows); + } + core::Span representative_frame_span() const { + return representative_frames.span().subspan(0, rows); + } + + core::Slab depths; + core::Slab source_nodes; + core::Slab parents; + core::Slab representative_frames; + uint32_t rows = 0; +}; + +// Owns all temporary state for one flamegraph computation. The methods are the +// algorithm phases in execution order; helpers are outlined below to keep the +// class declaration readable. +class FlamegraphBuilder { + public: + FlamegraphBuilder(const core::Tree& input, const Config& config); + + base::StatusOr Run(); + + private: + FilterMatches MatchText(const char* value) const; + + template + FilterMatches MatchNumber(T value) const; + + FilterMatches MatchColumn(const core::Tree::Column& column, + uint32_t row) const; + FilterMatches MatchFrame(uint32_t row) const; + void PrepareFrameHashes(); + void AnalyzePaths(); + void BuildDownwardHalf(); + base::Status BuildUpwardHalf(); + UpwardPath BuildUpwardPath(uint32_t frame, bool include_aggregates); + bool ContributesToDownwardCumulative(uint32_t row) const; + base::Status AccumulateMetrics(); + void BuildAggregateRouting(); + base::Status RunAggregateOperator(AggregateOperator* op); + base::Status ComputeAggregates(); + base::StatusOr PackOutput(); + + template + base::Status MarkActiveBottomUpAnchors(const core::Tree::Column& column, + core::Span active); + + template + static void InitializeMetricColumns(uint32_t rows, MetricColumns* output); + + template + base::Status AccumulateMetric(const core::Tree::Column& input, + MetricColumns* output); + + template + base::Status AccumulateDownwardMetric(const core::Tree::Column& input, + core::Span self, + core::Span cumulative); + + template + base::Status AccumulateUpwardMetric(const core::Tree::Column& input, + core::Span self, + core::Span cumulative); + + template + base::Status AccumulateBottomUpMetric(const core::Tree::Column& input, + core::Span self, + core::Span cumulative); + + template + base::Status AccumulatePivotUpwardMetric(const core::Tree::Column& input, + core::Span self, + core::Span cumulative); + + template + static base::Status PropagateCumulative(const core::TreePathInterner& tree, + core::Span cumulative); + + void AppendPackedNodes(const core::TreePathInterner& tree, + uint32_t id_offset, + bool upward, + PackedTree* output) const; + + const core::Tree& input_; + const Config& config_; + uint64_t required_show_stack_bits_; + + PathAnalysis analysis_; + DownwardHalf downward_; + UpwardHalf upward_; + AggregateRouting aggregate_routing_; + std::vector metrics_; + std::vector aggregate_columns_; +}; + +bool IsValidConfig(const core::Tree& input, const Config& config) { + if (!config.name || !config.name->type.Is() || + config.value_columns.empty()) { + return false; + } + for (const core::Tree::Column* value : config.value_columns) { + if (!value || !IsNumericColumn(*value)) { + return false; + } + } + + std::vector output_names{"depth", "name"}; + const auto add_output_name = [&](std::string name) { + if (name.empty() || std::find(output_names.begin(), output_names.end(), + name) != output_names.end()) { + return false; + } + output_names.push_back(std::move(name)); + return true; + }; + for (const core::Tree::Column* grouping : config.grouping_columns) { + if (!grouping || + !add_output_name(std::string(input.ColumnName(grouping)))) { + return false; + } + } + for (const core::Tree::Column* value : config.value_columns) { + const std::string name(input.ColumnName(value)); + if (!add_output_name("self_" + name) || + !add_output_name("cumulative_" + name)) { + return false; + } + } + for (const Config::AggregateColumn& aggregate : config.aggregate_columns) { + if (!aggregate.input || !add_output_name(aggregate.output_name)) { + return false; + } + if (aggregate.input->type.Is()) { + // A column with no values aggregates to no values under any mode. + } else if (aggregate.aggregate == Config::Aggregate::kSum && + !IsNumericColumn(*aggregate.input)) { + return false; + } + } + if (config.show_stack_filters.size() > Config::kMaxShowStackFilters) { + return false; + } + const bool is_pattern_view = config.view.IsAnyOf(); + return is_pattern_view == config.view_pattern.has_value(); +} + +bool PathState::IsRetained(uint32_t row) const { + return retained_frame == row; +} + +bool PathState::StackIsHidden() const { + return (stack_bits & kHideStackBit) != 0; +} + +bool PathState::StackContributes(uint64_t required_show_stack_bits) const { + return retained_frame != core::Tree::kNullParent && + stack_bits == required_show_stack_bits; +} + +bool FlamegraphBuilder::ContributesToDownwardCumulative(uint32_t row) const { + return downward_.node[row] != core::Tree::kNullParent && + analysis_.states[row].StackContributes(required_show_stack_bits_); +} + +FlamegraphBuilder::FlamegraphBuilder(const core::Tree& input, + const Config& config) + : input_(input), + config_(config), + required_show_stack_bits_( + (uint64_t{1} << config.show_stack_filters.size()) - 1), + downward_(config.view.Is() ? input.row_count : 0), + upward_(config.view.Is() ? input.row_count : 0) {} + +base::StatusOr FlamegraphBuilder::Run() { + AnalyzePaths(); + BuildDownwardHalf(); + RETURN_IF_ERROR(BuildUpwardHalf()); + analysis_.frame_hashes.clear(); + analysis_.frame_hashes.shrink_to_fit(); + RETURN_IF_ERROR(AccumulateMetrics()); + upward_.bottom_up_paths = {}; + upward_.pivot_anchors = {}; + RETURN_IF_ERROR(ComputeAggregates()); + analysis_.states = {}; + upward_.aggregate_constituents = {}; + return PackOutput(); +} + +FilterMatches FlamegraphBuilder::MatchText(const char* value) const { + FilterMatches matches{}; + if (config_.view_pattern) { + matches.view_pattern = config_.view_pattern->PartialMatch(value); + } + for (size_t i = 0; i < config_.show_stack_filters.size(); ++i) { + if (config_.show_stack_filters[i].PartialMatch(value)) { + matches.show_stack |= uint64_t{1} << i; + } + } + for (const base::Regex& filter : config_.hide_stack_filters) { + if (filter.PartialMatch(value)) { + matches.hide_stack = 1; + break; + } + } + for (const base::Regex& filter : config_.hide_frame_filters) { + if (filter.PartialMatch(value)) { + matches.hide_frame = 1; + break; + } + } + return matches; +} + +void FlamegraphBuilder::PrepareFrameHashes() { + analysis_.frame_hashes.resize(input_.row_count); + core::Span hashes = + core::MakeMutableSpan(analysis_.frame_hashes); + core::tree_ops::UpdateRowHashes(*config_.name, hashes); + for (const core::Tree::Column* column : config_.grouping_columns) { + core::tree_ops::UpdateRowHashes(*column, hashes); + } +} + +template +FilterMatches FlamegraphBuilder::MatchNumber(T value) const { + if constexpr (std::is_same_v) { + return MatchText(base::StackString<32>("%" PRId64, value).c_str()); + } else { + return MatchText(base::StackString<32>("%.15g", value).c_str()); + } +} + +FilterMatches FlamegraphBuilder::MatchColumn(const core::Tree::Column& column, + uint32_t row) const { + if (column.null_bv.size() > 0 && !column.null_bv.is_set(row)) { + return kNoFilterMatches; + } + if (column.type.Is()) { + const StringPool::Id value = column.unchecked_data()[row]; + return value.is_null() ? kNoFilterMatches + : MatchText(config_.pool.Get(value).c_str()); + } + if (column.type.Is()) { + return MatchNumber(column.unchecked_data()[row]); + } + return MatchNumber(column.unchecked_data()[row]); +} + +FilterMatches FlamegraphBuilder::MatchFrame(uint32_t row) const { + FilterMatches matches = MatchColumn(*config_.name, row); + for (const core::Tree::Column* column : config_.grouping_columns) { + const FilterMatches column_matches = MatchColumn(*column, row); + matches.show_stack |= column_matches.show_stack; + matches.view_pattern |= column_matches.view_pattern; + matches.hide_stack |= column_matches.hide_stack; + matches.hide_frame |= column_matches.hide_frame; + } + return matches; +} + +void FlamegraphBuilder::AnalyzePaths() { + PrepareFrameHashes(); + analysis_.states = core::Slab::Alloc(input_.row_count); + if (config_.view_pattern) { + analysis_.view_pattern_matches = + core::BitVector::CreateWithSize(input_.row_count, false); + } + const bool needs_matching = config_.HasFilters() || config_.view_pattern; + base::FlatHashMapV2> + frame_match_index; + base::FlatHashMapV2 name_match_index; + std::vector match_pool; + const StringPool::Id* names = config_.name->unchecked_data(); + + for (uint32_t row = 0; row < input_.row_count; ++row) { + // Tree guarantees parents precede children, so inheritance is an O(1) + // reference rather than an ancestor walk or a copy. Roots inherit the + // shared empty path. + const uint32_t parent = input_.parent[row]; + const PathState& inheritance = parent == core::Tree::kNullParent + ? kEmptyPathState + : analysis_.states[parent]; + PERFETTO_DCHECK(parent == core::Tree::kNullParent || parent < row); + + // A HIDE_FRAME row folds into its parent's path and cannot affect stack + // filtering. + PathState& state = analysis_.states[row]; + const FilterMatches* matches = &kNoFilterMatches; + if (needs_matching) { + const uint32_t next_index = static_cast(match_pool.size()); + uint32_t* index; + bool inserted; + StringPool::Id matched_name; + if (config_.grouping_columns.empty()) { + const bool is_null = config_.name->null_bv.size() > 0 && + !config_.name->null_bv.is_set(row); + matched_name = is_null ? StringPool::Id() : names[row]; + std::tie(index, inserted) = + name_match_index.Insert(matched_name, next_index); } else { - continue; // Not under any anchor. + const uint64_t frame_hash = analysis_.frame_hashes[row].digest(); + std::tie(index, inserted) = + frame_match_index.Insert(frame_hash, next_index); } - trie_of[i] = node; - // Self shows the merged frames' own values regardless of stack - // filters; only cumulative is limited to counted stacks. - AddRow(&trie.self[node * metric_count_], &folded_[i * metric_count_], - metric_count_); - if (counted_[i]) { - AddRow(&trie.cumulative[node * metric_count_], - &folded_[i * metric_count_], metric_count_); + if (inserted) { + if (config_.grouping_columns.empty()) { + match_pool.push_back( + matched_name.is_null() + ? kNoFilterMatches + : MatchText(config_.pool.Get(matched_name).c_str())); + } else { + match_pool.push_back(MatchFrame(row)); + } } + matches = &match_pool[*index]; } - // Cumulative: children were created after their parent, so one - // reverse scan sums subtrees onto the counted bases. - for (uint32_t i = static_cast(trie.size()); i-- > 0;) { - if (trie.parent[i] != kNoParent) { - AddRow(&trie.cumulative[trie.parent[i] * metric_count_], - &trie.cumulative[i * metric_count_], metric_count_); - } + if (matches->hide_frame) { + state = inheritance; + PERFETTO_DCHECK(!state.IsRetained(row)); + continue; } - FlexVector pairs; - for (uint32_t i = 0; i < frame_count_; ++i) { - if (trie_of[i] != kNoParent) { - pairs.push_back((uint64_t(trie_of[i]) << 32) | i); - } + + // Every other row is retained, even when it is outside the built halves. + // This lets matching descendants start roots and lets upward paths walk + // through retained ancestors. + state.retained_frame = row; + if (config_.view_pattern && matches->view_pattern) { + analysis_.view_pattern_matches.set(row); } - return PackTree(std::move(trie), pairs); - } - - // The upward half: walk each anchor's kept ancestor chain, descending - // the trie by key and attributing the anchor's weight to every node on - // the chain. - Tree BuildUp() { - FlexVector weights = AnchorWeights(); - // Unlike the downward half, the up tree is usually much smaller than - // the input (distinct caller suffixes); growing on demand keeps the - // map compact and cache-resident. - Trie trie(metric_count_, 0); - FlexVector pairs; - for (uint32_t i : order_) { - if (!anchor_[i] || - !AnyNonZero(&weights[i * metric_count_], metric_count_)) { + state.stack_bits = matches->hide_stack + ? kHideStackBit + : matches->show_stack | inheritance.stack_bits; + } +} + +void FlamegraphBuilder::BuildDownwardHalf() { + if (!config_.view.IsAnyOf()) { + // Every row sits outside the downward half. + downward_.node = + AllocFilled(input_.row_count, core::Tree::kNullParent); + return; + } + downward_.node = core::Slab::Alloc(input_.row_count); + for (uint32_t row = 0; row < input_.row_count; ++row) { + const uint32_t parent = input_.parent[row]; + const uint32_t parent_node = parent == core::Tree::kNullParent + ? core::Tree::kNullParent + : downward_.node[parent]; + const PathState& state = analysis_.states[row]; + if (!state.IsRetained(row)) { + downward_.node[row] = parent_node; + continue; + } + + // Top-down starts at every retained root. Pivot and from-frame start only + // at matching frames; nested matches deliberately start another root. + // Bottom-up has no downward half and never starts one. + const bool has_retained_parent = + parent != core::Tree::kNullParent && + analysis_.states[parent].retained_frame != core::Tree::kNullParent; + const bool is_top_down_root = + config_.view.Is() && !has_retained_parent; + const bool starts_downward_tree = + (config_.view_pattern && analysis_.view_pattern_matches.is_set(row)) || + is_top_down_root; + if (!starts_downward_tree && parent_node == core::Tree::kNullParent) { + downward_.node[row] = core::Tree::kNullParent; + continue; + } + + // Equivalent frames under the same merged parent share a node. The first + // row which creates the node remains its representative. + downward_.node[row] = downward_.tree.Intern( + starts_downward_tree ? core::Tree::kNullParent : parent_node, + analysis_.frame_hashes[row], row); + } +} + +template +base::Status FlamegraphBuilder::MarkActiveBottomUpAnchors( + const core::Tree::Column& column, + core::Span active) { + core::Span values = column.unchecked_span(); + for (uint32_t row = 0; row < input_.row_count; ++row) { + if (column.null_bv.size() > 0 && !column.null_bv.is_set(row)) { + continue; + } + const T value = values[row]; + if (value < 0) { + return base::ErrStatus("flamegraph: value columns must be non-negative"); + } + const PathState& state = analysis_.states[row]; + if (!base::IsZero(value) && + state.StackContributes(required_show_stack_bits_)) { + active[state.retained_frame] = 1; + } + } + return base::OkStatus(); +} + +base::Status FlamegraphBuilder::BuildUpwardHalf() { + if (config_.view.Is()) { + // Anchors are the retained rows matching the view pattern, in row order. + for (uint32_t row = 0; row < input_.row_count; ++row) { + if (!analysis_.view_pattern_matches.is_set(row)) { continue; } - uint32_t node = kNoParent; - for (uint32_t f = i; f != kNoParent; f = ancestor_[f]) { - node = trie.ChildOf(node, forest_.key[f], f); - AddRow(&trie.cumulative[node * metric_count_], - &weights[i * metric_count_], metric_count_); - AddRow(&trie.self[node * metric_count_], &folded_[f * metric_count_], - metric_count_); - pairs.push_back((uint64_t(node) << 32) | f); - } + const bool include_aggregates = + !config_.aggregate_columns.empty() && + analysis_.states[row].StackContributes(required_show_stack_bits_); + upward_.pivot_anchors.push_back( + UpwardAnchor{row, BuildUpwardPath(row, include_aggregates)}); } - return PackTree(std::move(trie), pairs); + return base::OkStatus(); + } + if (!config_.view.Is()) { + return base::OkStatus(); } - // The weight each anchor carries up its caller chain: its counted - // subtree total, accumulated bottom-up along the kept tree and stopping - // at other anchors (the same re-rooting the downward half applies). - // With bottom-up anchors, where every counted frame is an anchor, this - // reduces to each frame's own values. - FlexVector AnchorWeights() { - auto weights = FlexVector::CreateFilled( - uint64_t(frame_count_) * metric_count_, 0); - for (uint32_t idx = static_cast(order_.size()); idx-- > 0;) { - uint32_t i = order_[idx]; - if (!kept_[i]) { - continue; + auto active = AllocFilled(input_.row_count, 0); + for (const core::Tree::Column* column : config_.value_columns) { + if (column->type.Is()) { + RETURN_IF_ERROR( + MarkActiveBottomUpAnchors(*column, active.mutable_span())); + } else { + RETURN_IF_ERROR( + MarkActiveBottomUpAnchors(*column, active.mutable_span())); + } + } + constexpr UpwardPath kNoPath{core::Tree::kNullParent, + core::Tree::kNullParent}; + upward_.bottom_up_paths = AllocFilled(input_.row_count, kNoPath); + for (uint32_t row = 0; row < input_.row_count; ++row) { + if (active[row]) { + upward_.bottom_up_paths[row] = BuildUpwardPath(row, true); + } + } + return base::OkStatus(); +} + +UpwardPath FlamegraphBuilder::BuildUpwardPath(uint32_t frame, + bool include_aggregates) { + UpwardPath result{core::Tree::kNullParent, core::Tree::kNullParent}; + uint32_t upward_parent = core::Tree::kNullParent; + while (frame != core::Tree::kNullParent) { + upward_parent = upward_.tree.Intern(upward_parent, + analysis_.frame_hashes[frame], frame); + if (result.root == core::Tree::kNullParent) { + result.root = upward_parent; + } + if (include_aggregates) { + upward_.aggregate_constituents.push_back( + TreeConstituent{frame, upward_parent}); + } + const uint32_t parent = input_.parent[frame]; + frame = parent == core::Tree::kNullParent + ? core::Tree::kNullParent + : analysis_.states[parent].retained_frame; + } + result.leaf = upward_parent; + return result; +} + +template +void FlamegraphBuilder::InitializeMetricColumns(uint32_t rows, + MetricColumns* output) { + output->self = core::Tree::Column::Create(rows); + output->cumulative = core::Tree::Column::Create(rows); + core::Span self = output->self.unchecked_span(); + core::Span cumulative = output->cumulative.unchecked_span(); + std::fill(self.begin(), self.end(), T{}); + std::fill(cumulative.begin(), cumulative.end(), T{}); +} + +template +base::Status FlamegraphBuilder::AccumulateMetric( + const core::Tree::Column& input, + MetricColumns* output) { + const uint32_t downward_size = downward_.tree.size(); + const uint32_t upward_size = upward_.tree.size(); + InitializeMetricColumns(downward_size + upward_size, output); + core::Span self = output->self.unchecked_span(); + core::Span cumulative = output->cumulative.unchecked_span(); + RETURN_IF_ERROR( + AccumulateDownwardMetric(input, self.subspan(0, downward_size), + cumulative.subspan(0, downward_size))); + return AccumulateUpwardMetric( + input, self.subspan(downward_size, upward_size), + cumulative.subspan(downward_size, upward_size)); +} + +template +base::Status FlamegraphBuilder::PropagateCumulative( + const core::TreePathInterner& tree, + core::Span cumulative) { + PERFETTO_DCHECK(tree.size() == cumulative.size()); + for (uint32_t node = tree.size(); node-- > 0;) { + const uint32_t parent = tree.parent(node); + if (parent != core::Tree::kNullParent && + !TryAdd(cumulative[node], &cumulative[parent])) { + return base::ErrStatus("flamegraph: integer value overflow"); + } + } + return base::OkStatus(); +} + +template +base::Status FlamegraphBuilder::AccumulateDownwardMetric( + const core::Tree::Column& input, + core::Span self, + core::Span cumulative) { + if (!config_.view.IsAnyOf()) { + return base::OkStatus(); + } + + core::Span values = input.unchecked_span(); + for (uint32_t row = 0; row < input_.row_count; ++row) { + if (input.null_bv.size() > 0 && !input.null_bv.is_set(row)) { + continue; + } + const T value = values[row]; + if (value < 0) { + return base::ErrStatus("flamegraph: value columns must be non-negative"); + } + + const uint32_t node = downward_.node[row]; + if (node == core::Tree::kNullParent) { + continue; + } + if (analysis_.states[row].StackContributes(required_show_stack_bits_) && + (!TryAdd(value, &self[node]) || !TryAdd(value, &cumulative[node]))) { + return base::ErrStatus("flamegraph: integer value overflow"); + } + } + + return PropagateCumulative(downward_.tree, cumulative); +} + +template +base::Status FlamegraphBuilder::AccumulateUpwardMetric( + const core::Tree::Column& input, + core::Span self, + core::Span cumulative) { + if (!config_.view.IsAnyOf()) { + return base::OkStatus(); + } + return config_.view.Is() + ? AccumulateBottomUpMetric(input, self, cumulative) + : AccumulatePivotUpwardMetric(input, self, cumulative); +} + +template +base::Status FlamegraphBuilder::AccumulateBottomUpMetric( + const core::Tree::Column& input, + core::Span self, + core::Span cumulative) { + core::Span values = input.unchecked_span(); + for (uint32_t row = 0; row < input_.row_count; ++row) { + if (input.null_bv.size() > 0 && !input.null_bv.is_set(row)) { + continue; + } + const T value = values[row]; + const PathState& state = analysis_.states[row]; + if (base::IsZero(value) || + !state.StackContributes(required_show_stack_bits_)) { + continue; + } + const uint32_t retained = state.retained_frame; + const UpwardPath& path = upward_.bottom_up_paths[retained]; + const uint32_t root = path.root; + const uint32_t leaf = path.leaf; + PERFETTO_DCHECK(root != core::Tree::kNullParent); + PERFETTO_DCHECK(leaf != core::Tree::kNullParent); + if (!TryAdd(value, &self[root]) || !TryAdd(value, &cumulative[leaf])) { + return base::ErrStatus("flamegraph: integer value overflow"); + } + } + return PropagateCumulative(upward_.tree, cumulative); +} + +template +base::Status FlamegraphBuilder::AccumulatePivotUpwardMetric( + const core::Tree::Column& input, + core::Span self, + core::Span cumulative) { + core::Span values = input.unchecked_span(); + + auto anchor_weights = AllocFilled(input_.row_count, T{}); + for (uint32_t row = 0; row < input_.row_count; ++row) { + if (input.null_bv.size() > 0 && !input.null_bv.is_set(row)) { + continue; + } + const PathState& state = analysis_.states[row]; + if (ContributesToDownwardCumulative(row) && + !TryAdd(values[row], &anchor_weights[state.retained_frame])) { + return base::ErrStatus("flamegraph: integer value overflow"); + } + } + + for (uint32_t row = input_.row_count; row-- > 0;) { + const PathState& state = analysis_.states[row]; + const uint32_t node = downward_.node[row]; + if (!state.IsRetained(row) || node == core::Tree::kNullParent || + downward_.tree.parent(node) == core::Tree::kNullParent) { + continue; + } + const uint32_t parent = input_.parent[row]; + PERFETTO_DCHECK(parent != core::Tree::kNullParent); + const uint32_t retained_parent = analysis_.states[parent].retained_frame; + PERFETTO_DCHECK(retained_parent != core::Tree::kNullParent); + if (!TryAdd(anchor_weights[row], &anchor_weights[retained_parent])) { + return base::ErrStatus("flamegraph: integer value overflow"); + } + } + + for (const UpwardAnchor& anchor : upward_.pivot_anchors) { + const T value = anchor_weights[anchor.frame]; + if (!TryAdd(value, &self[anchor.path.root]) || + !TryAdd(value, &cumulative[anchor.path.leaf])) { + return base::ErrStatus("flamegraph: integer value overflow"); + } + } + return PropagateCumulative(upward_.tree, cumulative); +} + +base::Status FlamegraphBuilder::AccumulateMetrics() { + metrics_.resize(config_.value_columns.size()); + for (uint32_t i = 0; i < config_.value_columns.size(); ++i) { + const core::Tree::Column& column = *config_.value_columns[i]; + switch (column.type.index()) { + case core::Tree::Column::Type::GetTypeIndex(): + RETURN_IF_ERROR(AccumulateMetric(column, &metrics_[i])); + break; + case core::Tree::Column::Type::GetTypeIndex(): + RETURN_IF_ERROR(AccumulateMetric(column, &metrics_[i])); + break; + default: + PERFETTO_FATAL("Unsupported flamegraph value column type"); + } + } + return base::OkStatus(); +} + +void FlamegraphBuilder::BuildAggregateRouting() { + const uint32_t rows = input_.row_count; + aggregate_routing_.frame_rows_are_identity = true; + for (uint32_t row = 0; row < rows; ++row) { + const PathState& state = analysis_.states[row]; + if (state.retained_frame != row || state.StackIsHidden()) { + aggregate_routing_.frame_rows_are_identity = false; + break; + } + } + if (!aggregate_routing_.frame_rows_are_identity) { + aggregate_routing_.frame_row_offsets = + core::Slab::Alloc(uint64_t{rows} + 1); + std::fill(aggregate_routing_.frame_row_offsets.begin(), + aggregate_routing_.frame_row_offsets.end(), 0u); + uint32_t routed_rows = 0; + for (uint32_t row = 0; row < rows; ++row) { + const PathState& state = analysis_.states[row]; + if (state.retained_frame != core::Tree::kNullParent && + !state.StackIsHidden()) { + aggregate_routing_.frame_row_offsets[state.retained_frame + 1]++; + routed_rows++; } - if (counted_[i]) { - AddRow(&weights[i * metric_count_], &folded_[i * metric_count_], - metric_count_); + } + for (uint32_t frame = 0; frame < rows; ++frame) { + aggregate_routing_.frame_row_offsets[frame + 1] += + aggregate_routing_.frame_row_offsets[frame]; + } + aggregate_routing_.frame_rows = core::Slab::Alloc(routed_rows); + core::Slab frame_fill = core::Slab::Alloc(rows); + memcpy(frame_fill.data(), aggregate_routing_.frame_row_offsets.data(), + rows * sizeof(uint32_t)); + for (uint32_t row = 0; row < rows; ++row) { + const PathState& state = analysis_.states[row]; + if (state.retained_frame != core::Tree::kNullParent && + !state.StackIsHidden()) { + aggregate_routing_.frame_rows[frame_fill[state.retained_frame]++] = row; } - if (!anchor_[i] && ancestor_[i] != kNoParent) { - AddRow(&weights[ancestor_[i] * metric_count_], - &weights[i * metric_count_], metric_count_); + } + } + + const uint32_t downward_size = downward_.tree.size(); + const uint32_t nodes = downward_size + upward_.tree.size(); + aggregate_routing_.output_frame_offsets = + core::Slab::Alloc(uint64_t{nodes} + 1); + std::fill(aggregate_routing_.output_frame_offsets.begin(), + aggregate_routing_.output_frame_offsets.end(), 0u); + uint32_t routed_frames = 0; + if (config_.view.IsAnyOf()) { + for (uint32_t frame = 0; frame < rows; ++frame) { + if (analysis_.states[frame].IsRetained(frame) && + ContributesToDownwardCumulative(frame)) { + aggregate_routing_.output_frame_offsets[downward_.node[frame] + 1]++; + routed_frames++; + } + } + } + for (const TreeConstituent& constituent : upward_.aggregate_constituents) { + aggregate_routing_ + .output_frame_offsets[downward_size + constituent.node + 1]++; + routed_frames++; + } + for (uint32_t node = 0; node < nodes; ++node) { + aggregate_routing_.output_frame_offsets[node + 1] += + aggregate_routing_.output_frame_offsets[node]; + } + aggregate_routing_.output_frames = core::Slab::Alloc(routed_frames); + core::Slab output_fill = core::Slab::Alloc(nodes); + memcpy(output_fill.data(), aggregate_routing_.output_frame_offsets.data(), + nodes * sizeof(uint32_t)); + if (config_.view.IsAnyOf()) { + for (uint32_t frame = 0; frame < rows; ++frame) { + if (analysis_.states[frame].IsRetained(frame) && + ContributesToDownwardCumulative(frame)) { + const uint32_t node = downward_.node[frame]; + aggregate_routing_.output_frames[output_fill[node]++] = frame; } } - return weights; } + for (const TreeConstituent& constituent : upward_.aggregate_constituents) { + const uint32_t node = downward_size + constituent.node; + aggregate_routing_.output_frames[output_fill[node]++] = constituent.frame; + } +} - const Forest& forest_; - const Config& config_; - const StringPool& pool_; - Filters filters_; - uint32_t frame_count_; - uint32_t metric_count_; - uint32_t expected_nodes_; - - FlexVector masks_; - FlexVector order_; // Topological, unreachable frames absent. - FlexVector kept_; // Survives hide-frame / show-from. - FlexVector counted_; // Kept and stack satisfies every filter. - FlexVector anchor_; // Roots the merged trees. SelectAnchors(). - FlexVector ancestor_; // Nearest kept ancestor, or kNoParent. - FlexVector folded_; // Metrics, hidden frames folded in. -}; +base::Status FlamegraphBuilder::RunAggregateOperator(AggregateOperator* op) { + constexpr size_t kBatchSize = 4096; + std::vector destinations; + std::vector sources; + destinations.reserve(kBatchSize); + sources.reserve(kBatchSize); -} // namespace + if (op->input_mode() == + AggregateOperator::InputMode::kNativeRowsToFramesThenFramesToOutputs) { + const core::Slab& states = analysis_.states; + const core::Slab& downward_nodes = downward_.node; + const core::FlexVector& upward_constituents = + upward_.aggregate_constituents; + NativeFrameRouting routing{ + states.span(), + downward_nodes.span(), + upward_constituents.span(), + downward_.tree.size(), + required_show_stack_bits_, + config_.view.IsAnyOf(), + }; + RETURN_IF_ERROR(op->UpdateFrames(routing)); + RETURN_IF_ERROR(op->MergeFrames(routing)); + return op->Finalize(); + } -base::StatusOr Build(const Forest& forest, - const Config& config, - const StringPool& pool) { - auto n = static_cast(forest.size()); - uint32_t k = forest.metric_count; - if (k == 0) { - return base::ErrStatus("flamegraph: at least one metric is required"); - } - if (forest.key.size() != n || forest.name.size() != n || - forest.metrics.size() != uint64_t(n) * k) { - return base::ErrStatus("flamegraph: forest column sizes do not match"); - } - for (uint32_t i = 0; i < n; ++i) { - if (forest.name[i] >= forest.name_table.size()) { - return base::ErrStatus("flamegraph: frame name index out of range"); - } - } - if (!forest.match_offset.empty() && - forest.match_offset.size() != forest.name_table.size() + 1) { - return base::ErrStatus( - "flamegraph: match_offset must have one entry per name plus one"); - } - ASSIGN_OR_RETURN(Filters filters, CompileFilters(config)); - if (n == 0) { - Flamegraph empty; - empty.down.metric_count = k; - empty.down.constituents_offset = FlexVector::CreateFilled(1, 0); - empty.up.metric_count = k; - empty.up.constituents_offset = FlexVector::CreateFilled(1, 0); - return base::StatusOr(std::move(empty)); - } - return Builder(forest, config, pool, std::move(filters)).Run(); -} - -base::StatusOr ToDataframe( - const Flamegraph& flamegraph, - const Forest& forest, - StringPool* pool) { - uint32_t k = forest.metric_count; - std::vector columns = {"id", "parentId", "depth", "name"}; - for (uint32_t m = 0; m < k; ++m) { - std::string suffix = k == 1 ? "" : std::to_string(m); - columns.push_back("selfValue" + suffix); - columns.push_back("cumulativeValue" + suffix); - } - // Sums of integral inputs are integral, so inspecting the output values - // decides each metric's column type. - std::vector integral(k, true); - for (const Tree* tree : {&flamegraph.down, &flamegraph.up}) { - for (const FlexVector* col : {&tree->self, &tree->cumulative}) { - for (uint64_t i = 0; i < col->size(); ++i) { - double v = (*col)[i]; - double t = std::trunc(v); - if (t < v || t > v) { - integral[i % k] = false; + const uint32_t nodes = downward_.tree.size() + upward_.tree.size(); + for (uint32_t node = 0; node < nodes; ++node) { + for (uint32_t fi = aggregate_routing_.output_frame_offsets[node]; + fi < aggregate_routing_.output_frame_offsets[node + 1]; ++fi) { + const uint32_t frame = aggregate_routing_.output_frames[fi]; + if (aggregate_routing_.frame_rows_are_identity) { + destinations.push_back(node); + sources.push_back(frame); + } else { + for (uint32_t ri = aggregate_routing_.frame_row_offsets[frame]; + ri < aggregate_routing_.frame_row_offsets[frame + 1]; ++ri) { + destinations.push_back(node); + sources.push_back(aggregate_routing_.frame_rows[ri]); + if (sources.size() == kBatchSize) { + RETURN_IF_ERROR(op->UpdateBatch(core::MakeSpan(destinations), + core::MakeSpan(sources))); + destinations.clear(); + sources.clear(); + } } } + if (sources.size() == kBatchSize) { + RETURN_IF_ERROR(op->UpdateBatch(core::MakeSpan(destinations), + core::MakeSpan(sources))); + destinations.clear(); + sources.clear(); + } } } + if (!sources.empty()) { + RETURN_IF_ERROR( + op->UpdateBatch(core::MakeSpan(destinations), core::MakeSpan(sources))); + } + return op->Finalize(); +} - core::dataframe::AdhocDataframeBuilder builder(columns, pool); - bool ok = true; - int64_t base = 0; - for (const Tree* tree : {&flamegraph.down, &flamegraph.up}) { - bool up = tree == &flamegraph.up; - std::vector depth(tree->size()); - for (uint32_t i = 0; ok && i < tree->size(); ++i) { - bool root = tree->parent[i] == kNoParent; - depth[i] = root ? 1 : depth[tree->parent[i]] + 1; - ok = ok && builder.PushNonNull(0, base + i); - ok = ok && - builder.PushNonNull(1, root ? int64_t(-1) : base + tree->parent[i]); - ok = ok && builder.PushNonNull(2, up ? -depth[i] : depth[i]); - ok = ok && builder.PushNonNull( - 3, forest.name_table[forest.name[tree->rep_frame[i]]]); - for (uint32_t m = 0; m < k; ++m) { - double self = tree->self[i * k + m]; - double cumulative = tree->cumulative[i * k + m]; - if (integral[m]) { - ok = ok && builder.PushNonNull(4 + 2 * m, static_cast(self)); - ok = ok && - builder.PushNonNull(5 + 2 * m, static_cast(cumulative)); +base::Status FlamegraphBuilder::ComputeAggregates() { + bool needs_materialized_routing = false; + for (const Config::AggregateColumn& aggregate : config_.aggregate_columns) { + needs_materialized_routing |= + aggregate.aggregate != Config::Aggregate::kSum; + } + if (needs_materialized_routing) { + BuildAggregateRouting(); + } + const uint32_t nodes = downward_.tree.size() + upward_.tree.size(); + aggregate_columns_.resize(config_.aggregate_columns.size()); + for (uint32_t i = 0; i < config_.aggregate_columns.size(); ++i) { + const Config::AggregateColumn& aggregate = config_.aggregate_columns[i]; + const core::Tree::Column& input = *aggregate.input; + if (input.type.Is()) { + aggregate_columns_[i] = core::Tree::Column::CreateNull(nodes); + continue; + } + switch (aggregate.aggregate) { + case Config::Aggregate::kSum: + if (input.type.Is()) { + SumAggregateOperator op(input, nodes); + RETURN_IF_ERROR(RunAggregateOperator(&op)); + aggregate_columns_[i] = op.TakeOutput(); } else { - ok = ok && builder.PushNonNull(4 + 2 * m, self); - ok = ok && builder.PushNonNull(5 + 2 * m, cumulative); + SumAggregateOperator op(input, nodes); + RETURN_IF_ERROR(RunAggregateOperator(&op)); + aggregate_columns_[i] = op.TakeOutput(); } - } + break; + case Config::Aggregate::kOneOrSummary: + if (input.type.Is()) { + OneOrSummaryAggregateOperator op(input, config_.pool, + nodes); + RETURN_IF_ERROR(RunAggregateOperator(&op)); + aggregate_columns_[i] = op.TakeOutput(); + } else if (input.type.Is()) { + OneOrSummaryAggregateOperator op(input, config_.pool, nodes); + RETURN_IF_ERROR(RunAggregateOperator(&op)); + aggregate_columns_[i] = op.TakeOutput(); + } else { + OneOrSummaryAggregateOperator op(input, config_.pool, nodes); + RETURN_IF_ERROR(RunAggregateOperator(&op)); + aggregate_columns_[i] = op.TakeOutput(); + } + break; + case Config::Aggregate::kConcatWithComma: + if (input.type.Is()) { + ConcatAggregateOperator op(input, config_.pool, + nodes); + RETURN_IF_ERROR(RunAggregateOperator(&op)); + aggregate_columns_[i] = op.TakeOutput(); + } else if (input.type.Is()) { + ConcatAggregateOperator op(input, config_.pool, nodes); + RETURN_IF_ERROR(RunAggregateOperator(&op)); + aggregate_columns_[i] = op.TakeOutput(); + } else { + ConcatAggregateOperator op(input, config_.pool, nodes); + RETURN_IF_ERROR(RunAggregateOperator(&op)); + aggregate_columns_[i] = op.TakeOutput(); + } + break; } - base += static_cast(tree->size()); } - if (!ok) { - return builder.status(); + return base::OkStatus(); +} + +void FlamegraphBuilder::AppendPackedNodes(const core::TreePathInterner& tree, + uint32_t id_offset, + bool upward, + PackedTree* output) const { + auto keep = AllocFilled(tree.size(), 0); + for (const MetricColumns& metric : metrics_) { + UpdateNonZeroRows(metric.cumulative, id_offset, keep.mutable_span()); + } + + auto output_row = AllocFilled(tree.size(), core::Tree::kNullParent); + for (uint32_t node = 0; node < tree.size(); ++node) { + if (!keep[node]) { + continue; + } + const uint32_t parent = tree.parent(node); + const uint32_t packed_parent = parent == core::Tree::kNullParent + ? core::Tree::kNullParent + : output_row[parent]; + PERFETTO_DCHECK(parent == core::Tree::kNullParent || + packed_parent != core::Tree::kNullParent); + const int64_t depth = + packed_parent == core::Tree::kNullParent + ? (upward ? -1 : 1) + : output->depths[packed_parent] + (upward ? -1 : 1); + output_row[node] = output->size(); + output->Append(depth, id_offset + node, packed_parent, + tree.representative_row(node)); + } +} + +base::StatusOr FlamegraphBuilder::PackOutput() { + PackedTree packed(downward_.tree.size() + upward_.tree.size()); + AppendPackedNodes(downward_.tree, 0, false, &packed); + AppendPackedNodes(upward_.tree, downward_.tree.size(), true, &packed); + + core::Tree output; + output.row_count = packed.size(); + const size_t column_count = 2 + config_.grouping_columns.size() + + 2 * config_.value_columns.size() + + config_.aggregate_columns.size(); + output.names.reserve(column_count); + output.columns.reserve(column_count); + + // The packed arrays are already in output order: adopt them. + packed.parents.Truncate(packed.size()); + output.parent = std::move(packed.parents); + packed.depths.Truncate(packed.size()); + core::Tree::Column depth; + depth.data = std::move(packed.depths).TakeAsBytes(); + output.names.push_back("depth"); + output.columns.push_back(std::move(depth)); + + // TODO(lalitm): the copies below exist because every Tree operation + // materializes a full rewritten tree for the next one to consume. If tree + // operations composed as a linear pipeline of ops over the source instead, + // the intermediate rewrites (and this packing step with them) would + // largely disappear. + const core::Span representatives = + packed.representative_frame_span(); + output.names.push_back("name"); + output.columns.push_back( + core::tree_ops::Gather(*config_.name, representatives)); + for (const core::Tree::Column* grouping : config_.grouping_columns) { + output.names.emplace_back(input_.ColumnName(grouping)); + output.columns.push_back( + core::tree_ops::Gather(*grouping, representatives)); + } + + // Kept nodes are appended in id order, so the packed sources are a strictly + // increasing filter over the combined id space. When every node is kept the + // filter is the identity and the builder-owned columns can be adopted + // outright instead of gathered. + const core::Span packed_sources = packed.source_node_span(); + const bool keep_all = + packed.size() == downward_.tree.size() + upward_.tree.size(); + const auto take_or_gather = [&](core::Tree::Column& column) { + return keep_all ? std::move(column) + : core::tree_ops::Gather(column, packed_sources); + }; + for (uint32_t i = 0; i < config_.value_columns.size(); ++i) { + const std::string name(input_.ColumnName(config_.value_columns[i])); + output.names.push_back("self_" + name); + output.columns.push_back(take_or_gather(metrics_[i].self)); + output.names.push_back("cumulative_" + name); + output.columns.push_back(take_or_gather(metrics_[i].cumulative)); + } + for (uint32_t i = 0; i < config_.aggregate_columns.size(); ++i) { + output.names.push_back(config_.aggregate_columns[i].output_name); + output.columns.push_back(take_or_gather(aggregate_columns_[i])); + } + return std::move(output); +} + +} // namespace + +base::StatusOr Build(const core::Tree& tree, const Config& config) { + if (!IsValidConfig(tree, config)) { + return base::ErrStatus("flamegraph: invalid configuration"); + } + return FlamegraphBuilder(tree, config).Run(); +} + +namespace {} // namespace + +// Lays out siblings widest first: a stable radix sort orders all nodes by +// descending width, and distributing that order into per-parent buckets +// keeps it within every sibling list. A breadth-first walk then packs each +// node's children left-to-right from the node's own position; the walk +// order is the render order. +Layout ComputeLayout(const core::Tree& tree, + const core::Tree::Column& cumulative, + const core::Tree::Column& depth) { + const uint32_t row_count = tree.row_count; + if (row_count == 0) { + return {}; + } + const core::Span depths = depth.unchecked_span(); + core::Slab width = core::Slab::Alloc(row_count); + const bool cumulative_is_int = cumulative.type.Is(); + for (uint32_t node = 0; node < row_count; ++node) { + if (cumulative.null_bv.size() > 0 && !cumulative.null_bv.is_set(node)) { + width[node] = 0; + continue; + } + const double value = + cumulative_is_int + ? static_cast(cumulative.unchecked_data()[node]) + : cumulative.unchecked_data()[node]; + width[node] = std::max(value, 0.0); + } + + // Order all nodes by descending width, ties in input order. The key is the + // complemented big-endian IEEE representation, whose unsigned order matches + // descending width for the non-negative widths used here. + core::Slab keys = core::Slab::Alloc(row_count); + core::Slab by_width = core::Slab::Alloc(row_count); + for (uint32_t node = 0; node < row_count; ++node) { + uint64_t bits; + memcpy(&bits, &width[node], sizeof(bits)); + keys[node] = base::HostToBE64(~bits); + by_width[node] = node; + } + core::Slab scratch = core::Slab::Alloc(row_count); + core::Slab radix_counts = core::Slab::Alloc(1u << 16); + const uint32_t* by_width_sorted = core::RadixSort( + by_width.begin(), by_width.end(), scratch.begin(), radix_counts.data(), + sizeof(uint64_t), [&](uint32_t node) { + return reinterpret_cast(&keys[node]); + }); + + // Distribute the width order into per-parent buckets. Roots go to one + // strip per traversal direction, each starting at x = 0. + uint32_t downward_root_count = 0; + uint32_t upward_root_count = 0; + core::Slab child_offset = + core::Slab::Alloc(row_count + 1); + std::fill(child_offset.begin(), child_offset.end(), 0u); + for (uint32_t node = 0; node < row_count; ++node) { + if (tree.parent[node] != core::Tree::kNullParent) { + child_offset[tree.parent[node] + 1]++; + } else if (depths[node] >= 0) { + downward_root_count++; + } else { + upward_root_count++; + } + } + for (uint32_t node = 0; node < row_count; ++node) { + child_offset[node + 1] += child_offset[node]; + } + core::Slab child_fill = core::Slab::Alloc(row_count); + memcpy(child_fill.data(), child_offset.data(), row_count * sizeof(uint32_t)); + core::Slab children = + core::Slab::Alloc(child_offset[row_count]); + core::Slab downward_roots = + core::Slab::Alloc(downward_root_count); + core::Slab upward_roots = + core::Slab::Alloc(upward_root_count); + uint32_t downward_fill = 0; + uint32_t upward_fill = 0; + for (uint32_t i = 0; i < row_count; ++i) { + const uint32_t node = by_width_sorted[i]; + const uint32_t parent = tree.parent[node]; + if (parent != core::Tree::kNullParent) { + children[child_fill[parent]++] = node; + } else if (depths[node] >= 0) { + downward_roots[downward_fill++] = node; + } else { + upward_roots[upward_fill++] = node; + } + } + + core::Slab x = core::Slab::Alloc(row_count); + double strip_x = 0; + for (const uint32_t root : downward_roots) { + x[root] = strip_x; + strip_x += width[root]; + } + strip_x = 0; + for (const uint32_t root : upward_roots) { + x[root] = strip_x; + strip_x += width[root]; + } + + Layout layout; + layout.node = core::Slab::Alloc(row_count); + layout.parent_row = core::Slab::Alloc(row_count); + layout.x_start = core::Slab::Alloc(row_count); + uint32_t tail = 0; + const auto emit = [&](uint32_t node, uint32_t parent_row) { + layout.node[tail] = node; + layout.parent_row[tail] = parent_row; + layout.x_start[tail] = x[node]; + tail++; + }; + + // Each strip is in x order, so merging them by position (the downward + // strip first on ties) yields the roots' render order; the walk keeps it + // level by level. + for (uint32_t di = 0, ui = 0; + di < downward_roots.size() || ui < upward_roots.size();) { + if (ui >= upward_roots.size() || + (di < downward_roots.size() && + x[downward_roots[di]] <= x[upward_roots[ui]])) { + emit(downward_roots[di++], core::Tree::kNullParent); + } else { + emit(upward_roots[ui++], core::Tree::kNullParent); + } + } + for (uint32_t row = 0; row < tail; ++row) { + const uint32_t node = layout.node[row]; + double offset = layout.x_start[row]; + for (uint32_t i = child_offset[node]; i < child_offset[node + 1]; ++i) { + const uint32_t child = children[i]; + x[child] = offset; + offset += width[child]; + emit(child, row); + } } - ASSIGN_OR_RETURN(core::dataframe::Dataframe df, std::move(builder).Build()); - df.Finalize(); - return base::StatusOr(std::move(df)); + PERFETTO_DCHECK(tail == row_count); + return layout; } } // namespace perfetto::trace_processor::flamegraph diff --git a/src/trace_processor/plugins/flamegraph/flamegraph.h b/src/trace_processor/plugins/flamegraph/flamegraph.h index 79b8311380a..e2bf3fef22a 100644 --- a/src/trace_processor/plugins/flamegraph/flamegraph.h +++ b/src/trace_processor/plugins/flamegraph/flamegraph.h @@ -17,147 +17,118 @@ #ifndef SRC_TRACE_PROCESSOR_PLUGINS_FLAMEGRAPH_FLAMEGRAPH_H_ #define SRC_TRACE_PROCESSOR_PLUGINS_FLAMEGRAPH_FLAMEGRAPH_H_ -#include #include -#include #include #include #include +#include "perfetto/ext/base/regex.h" #include "perfetto/ext/base/status_or.h" #include "src/trace_processor/containers/string_pool.h" -#include "src/trace_processor/core/dataframe/dataframe.h" -#include "src/trace_processor/core/util/flex_vector.h" +#include "src/trace_processor/core/tree/tree.h" +#include "src/trace_processor/core/util/slab.h" +#include "src/trace_processor/core/util/type_set.h" namespace perfetto::trace_processor::flamegraph { -// Computes merged flamegraph trees from a forest of stack frames. -// -// A flamegraph is the trie of key-paths: every path through the input -// forest with the same sequence of keys collapses into one merged node. -// This library computes that trie and nothing else: no sibling ordering, -// no x layout, no output formatting. Those are cheap post-passes over the -// (much smaller) merged tree and belong to downstream consumers. -// -// All columns are structure-of-arrays; per-frame and per-node metric -// values are flattened row-major with a constant stride of |metric_count| -// values per row. - -constexpr uint32_t kNoParent = std::numeric_limits::max(); - -// A forest of stack frames, column-oriented: index i across all vectors -// describes frame i. Frames reference parents by index; kNoParent marks -// roots. Any frame order is accepted; parents-before-children order is -// detected and used as a fast path. Frames unreachable from a root -// (dangling parent indices, cycles) are ignored. -struct Forest { - core::FlexVector parent; - // Merge identity: frames merge iff their path of keys from the root - // matches. Callers fold whatever defines identity (name, mapping, ...) - // into this one interned value. - core::FlexVector key; - // The distinct display names occurring in the forest, and per frame an - // index into that table. Filters and the pivot pattern match against - // each distinct name once, so builders should dedup names here (they - // intern them anyway). - core::FlexVector name_table; - core::FlexVector name; - // Optional extra strings filters also match against, per name_table - // entry: match_strings[match_offset[t]..match_offset[t + 1]). Builders - // that fold extra dimensions into entries (e.g. property values merged - // into the key) list them here so filters see them too. Empty means - // names match alone; otherwise match_offset has name_table size + 1 - // entries. - core::FlexVector match_strings; - core::FlexVector match_offset; - // Self values: metric m of frame i is metrics[i * metric_count + m]. - // All metrics are summed through the merge; a merged subtree is dropped - // only when every metric sums to zero across it. Must be >= 1. - uint32_t metric_count = 1; - core::FlexVector metrics; - - size_t size() const { return parent.size(); } -}; +inline bool IsNumericColumn(const core::Tree::Column& column) { + return column.type.Is() || column.type.Is(); +} +// Fully resolved inputs to the flamegraph algorithm. The SQL layer is +// responsible for resolving column names, validating column types, and +// compiling patterns before calling Build. Per-row matching remains part of +// the algorithm. +// Column pointers refer to the Tree passed to Build and only need to remain +// valid for that call. struct Config { - enum class View : uint8_t { kTopDown, kBottomUp, kPivot }; - enum class FilterKind : uint8_t { - // Keep only stacks where some frame matches. - kShowStack, - // Drop stacks where any frame matches. - kHideStack, - // Drop frames above the first match on each stack. - kShowFromFrame, - // Drop matching frames, folding their self values into the nearest - // kept ancestor. - kHideFrame, - }; - struct Filter { - FilterKind kind; - // A regex (ECMAScript syntax) matched against frame names. - std::string pattern; + explicit Config(StringPool& string_pool) : pool(string_pool) {} + + static constexpr uint32_t kMaxShowStackFilters = 61; + + // Structural orientations of the output. The named subsets below describe + // which views share a behaviour; membership tests use View::IsAnyOf. + struct TopDown {}; + struct BottomUp {}; + struct Pivot {}; + struct FromFrame {}; + using View = core::TypeSet; + + // Views anchored on frames matching |view_pattern|. + using PatternViews = core::TypeSet; + // Views which build the downward (descendant) half of the output. + using DownwardViews = core::TypeSet; + // Views which build the upward (ancestor) half of the output. + using UpwardViews = core::TypeSet; + + enum class Aggregate { + kSum, + kOneOrSummary, + kConcatWithComma, }; - View view = View::kTopDown; - // Regex selecting the pivot frames. Must be set iff |view| is kPivot. - std::optional pivot_pattern; - std::vector filters; -}; + struct AggregateColumn { + const core::Tree::Column* input; + Aggregate aggregate; + std::string output_name; + }; -// A merged tree. Nodes are stored parents-before-children in creation -// order; no sibling order is implied. -struct Tree { - core::FlexVector parent; // kNoParent for roots. - // A representative input frame per node (the first one merged in), - // giving downstream access to names and any other per-frame data. - core::FlexVector rep_frame; - // Metric sums, flattened like Forest::metrics: metric m of node n is - // self[n * metric_count + m]. |self| sums the merged frames' own - // values regardless of stack filters; |cumulative| sums the node's - // subtree counting only frames whose stack satisfies every filter. Going up - // (bottom-up / above-pivot), |cumulative| is instead the sum of the - // originating anchors' weights: the classic bottom-up "attributed to this - // caller chain" value. - uint32_t metric_count = 1; - core::FlexVector self; - core::FlexVector cumulative; - // The input frames merged into each node: - // constituents[constituents_offset[n]..constituents_offset[n + 1]). - // Going up a frame appears once per stack it contributes through, so - // duplicates encode multiplicity. - core::FlexVector constituents_offset; // size() + 1 entries. - core::FlexVector constituents; - - size_t size() const { return parent.size(); } + StringPool& pool; + + // Structural orientation. Pivot builds both descendants and ancestors of + // rows matching |view_pattern|. From-frame builds only descendants of the + // matching rows. |view_pattern| is set exactly for those two views. + View view = View(TopDown{}); + std::optional view_pattern; + + // Frame identity. Grouping columns, together with name, determine which + // frames can be merged. Regex filters match against all of these columns. + const core::Tree::Column* name = nullptr; + std::vector grouping_columns; + + // Filtering, separated by operation before entering the algorithm. + std::vector show_stack_filters; + std::vector hide_stack_filters; + std::vector hide_frame_filters; + + // Numeric sample-weight columns. Each is SUM-aggregated into a + // self_/cumulative_ output pair. At least one is required. + std::vector value_columns; + + // Additional aggregates carried through structural folds. They do not + // contribute to flamegraph geometry. + std::vector aggregate_columns; + + // Returns true if any filters are configured, false otherwise. + bool HasFilters() const { + return !show_stack_filters.empty() || !hide_stack_filters.empty() || + !hide_frame_filters.empty(); + } }; -// The result: a downward tree (top-down view, or the subtrees hanging off -// pivot frames) and an upward tree (bottom-up view, or the caller chains -// of pivot frames). Views populate the halves they define; the other is -// empty. -struct Flamegraph { - Tree down; - Tree up; +// Builds a merged structural flamegraph from a parent-before-child tree. +// Presentation layout is a separate operation: see ComputeLayout. +base::StatusOr Build(const core::Tree&, const Config&); + +// Presentation geometry for one built flamegraph, in render order: +// breadth-first, siblings packed left-to-right by decreasing cumulative +// value. A node's width is its cumulative value clamped to zero, so its end +// position is x_start plus that width. +struct Layout { + core::Slab node; // output row -> tree row + core::Slab parent_row; // output row -> parent output row + core::Slab x_start; }; -base::StatusOr Build(const Forest& forest, - const Config& config, - const StringPool& pool); - -// Converts the merged trees into one flat dataframe: one row per node, -// parents before children, with columns -// id, parentId (-1 for roots), depth (1, 2, ... going down and -// -1, -2, ... going up), name, and per metric selfValue and -// cumulativeValue (suffixed with the metric index when there is more -// than one). -// A metric's columns are LONG when all its values are integral, DOUBLE -// otherwise. Presentation (sibling order, x extents) is deliberately -// absent: consumers compute it over this far smaller output, or consume -// the trees directly. -base::StatusOr ToDataframe( - const Flamegraph& flamegraph, - const Forest& forest, - StringPool* pool); +// Computes presentation geometry for a tree returned by Build, positioning +// each node by |cumulative|, one of the tree's cumulative value columns. +// |depth| is the tree's depth column; its sign separates the downward and +// upward halves of the flamegraph, which are laid out as independent strips. +// Nodes with non-positive cumulative value take up no width but keep their +// position so that consumers of secondary value columns still see them. +Layout ComputeLayout(const core::Tree&, + const core::Tree::Column& cumulative, + const core::Tree::Column& depth); } // namespace perfetto::trace_processor::flamegraph diff --git a/src/trace_processor/plugins/flamegraph/flamegraph_benchmark.cc b/src/trace_processor/plugins/flamegraph/flamegraph_benchmark.cc index 89fb220c133..bf66a29e8b0 100644 --- a/src/trace_processor/plugins/flamegraph/flamegraph_benchmark.cc +++ b/src/trace_processor/plugins/flamegraph/flamegraph_benchmark.cc @@ -16,21 +16,20 @@ #include -#include #include +#include #include #include #include "perfetto/base/logging.h" #include "src/trace_processor/containers/string_pool.h" -#include "src/trace_processor/core/dataframe/dataframe.h" -#include "src/trace_processor/core/dataframe/specs.h" +#include "src/trace_processor/core/tree/tree.h" +#include "src/trace_processor/core/util/slab.h" #include "src/trace_processor/plugins/flamegraph/flamegraph.h" namespace perfetto::trace_processor::flamegraph { namespace { -// Deterministic LCG so runs are comparable. struct Rng { uint64_t state = 42; uint32_t operator()() { @@ -39,254 +38,179 @@ struct Rng { } }; -// A forest plus the per-frame property columns the collection step would -// intern alongside it: |mapping| groups (and is folded into the merge -// key), |source_file| aggregates. -struct BenchInput { - Forest forest; - std::vector mapping; - std::vector source_file; -}; - -BenchInput GenForest(StringPool* pool, - uint32_t n, - uint32_t metric_count, - bool with_properties) { - constexpr uint32_t kNameCardinality = 10000; - constexpr uint32_t kMappingCardinality = 40; - constexpr uint32_t kSourceFileCardinality = 2000; +template +core::Tree::Column ColumnFromValues(const std::vector& values) { + auto column = + core::Tree::Column::Create(static_cast(values.size())); + memcpy(column.data.begin(), values.data(), values.size() * sizeof(T)); + return column; +} +core::Tree MakeInput(StringPool* pool, uint32_t rows) { + constexpr uint32_t kNames = 10000; Rng rng; - BenchInput in; - Forest& forest = in.forest; - forest.metric_count = metric_count; - for (uint32_t t = 0; t < kNameCardinality; ++t) { - forest.name_table.push_back( - pool->InternString(base::StringView("frame_" + std::to_string(t)))); - } - std::vector mappings; - for (uint32_t t = 0; t < kMappingCardinality && with_properties; ++t) { - mappings.push_back( - pool->InternString(base::StringView("mapping_" + std::to_string(t)))); - } - std::vector files; - for (uint32_t t = 0; t < kSourceFileCardinality && with_properties; ++t) { - files.push_back( - pool->InternString(base::StringView("file_" + std::to_string(t)))); + std::vector name_table; + for (uint32_t i = 0; i < kNames; ++i) { + name_table.push_back( + pool->InternString(base::StringView("frame_" + std::to_string(i)))); } + core::Tree tree; + tree.row_count = rows; + tree.parent = core::Slab::Alloc(rows); + std::vector names; + std::vector values; + std::vector groupings; + names.reserve(rows); + values.reserve(rows); + groupings.reserve(rows); std::vector stack; - for (uint32_t i = 0; i < n; ++i) { + for (uint32_t row = 0; row < rows; ++row) { if (!stack.empty() && rng() % 100 < 40) { stack.resize(stack.size() - (rng() % stack.size())); } - forest.parent.push_back(stack.empty() ? kNoParent : stack.back()); - uint32_t name = rng() % kNameCardinality; - forest.name.push_back(name); - // The merge key folds the grouping properties in; the generated - // mapping is a function of the name, so the name index is exactly the - // distinct (name, mapping) id. - forest.key.push_back(name); - for (uint32_t m = 0; m < metric_count; ++m) { - forest.metrics.push_back(rng() % 3 == 0 ? rng() % 100 : 0); - } - if (with_properties) { - in.mapping.push_back(mappings[name % kMappingCardinality]); - in.source_file.push_back(files[rng() % kSourceFileCardinality]); - } - stack.push_back(i); + tree.parent[row] = stack.empty() ? core::Tree::kNullParent : stack.back(); + names.push_back(name_table[rng() % kNames]); + values.push_back(rng() % 3 == 0 ? rng() % 100 : 0); + groupings.push_back(row); + stack.push_back(row); } - return in; -} - -// Converts the trees to a flat dataframe like the library's ToDataframe, -// additionally emitting the grouping property of the representative frame -// and the ONE_OR_SUMMARY aggregation of the constituents' values: the -// work the SQL intrinsic glue does for property columns. -constexpr auto PropsRowSpec() { - using core::dataframe::CreateTypedColumnSpec; - using core::dataframe::Int64; - using core::dataframe::NonNull; - using core::dataframe::String; - using core::dataframe::Unsorted; - return core::dataframe::CreateTypedDataframeSpec( - {"id", "parentId", "depth", "name", "mapping", "sourceFile", "selfValue", - "cumulativeValue"}, - CreateTypedColumnSpec(Int64{}, NonNull{}, Unsorted{}), - CreateTypedColumnSpec(Int64{}, NonNull{}, Unsorted{}), - CreateTypedColumnSpec(Int64{}, NonNull{}, Unsorted{}), - CreateTypedColumnSpec(String{}, NonNull{}, Unsorted{}), - CreateTypedColumnSpec(String{}, NonNull{}, Unsorted{}), - CreateTypedColumnSpec(String{}, NonNull{}, Unsorted{}), - CreateTypedColumnSpec(Int64{}, NonNull{}, Unsorted{}), - CreateTypedColumnSpec(Int64{}, NonNull{}, Unsorted{})); + tree.names = {"name", "value", "grouping"}; + tree.columns.push_back(ColumnFromValues(names)); + tree.columns.push_back(ColumnFromValues(values)); + tree.columns.push_back(ColumnFromValues(groupings)); + return tree; } -core::dataframe::Dataframe TreesToDataframeWithProps(const Flamegraph& fg, - const BenchInput& in, - StringPool* pool) { - static constexpr auto kSpec = PropsRowSpec(); - auto df = core::dataframe::Dataframe::CreateFromTypedSpec(kSpec, pool); - std::vector seen; - int64_t base = 0; - for (const Tree* tree : {&fg.down, &fg.up}) { - uint32_t k = tree->metric_count; - std::vector depth(tree->size()); - for (uint32_t i = 0; i < tree->size(); ++i) { - bool root = tree->parent[i] == kNoParent; - depth[i] = root ? 1 : depth[tree->parent[i]] + 1; - // ONE_OR_SUMMARY: the representative frame's value, with a summary - // suffix when the merged frames had several distinct ones. The - // double space and the count including the shown value mirror the - // SQL surface this replaces. - seen.clear(); - for (uint32_t c = tree->constituents_offset[i]; - c < tree->constituents_offset[i + 1]; ++c) { - StringPool::Id file = in.source_file[tree->constituents[c]]; - if (std::find(seen.begin(), seen.end(), file) == seen.end()) { - seen.push_back(file); - } - } - StringPool::Id file = in.source_file[tree->rep_frame[i]]; - if (seen.size() > 1) { - std::string text = pool->Get(file).ToStdString() + " and " + - std::to_string(seen.size()) + " others"; - file = pool->InternString(base::StringView(text)); - } - df.InsertUnchecked( - kSpec, base + i, root ? -1 : base + tree->parent[i], - tree == &fg.up ? -depth[i] : depth[i], - in.forest.name_table[in.forest.name[tree->rep_frame[i]]], - in.mapping[tree->rep_frame[i]], file, - static_cast(tree->self[i * k]), - static_cast(tree->cumulative[i * k])); - } - base += static_cast(tree->size()); +struct RunOptions { + static RunOptions Filtered() { + RunOptions options; + options.filtered = true; + return options; } - df.Finalize(); - return df; -} - -void Run(benchmark::State& state, - const BenchInput& in, - const Config& config, - StringPool* pool) { - for (auto _ : state) { - auto fg = Build(in.forest, config, *pool); - PERFETTO_CHECK(fg.ok()); - benchmark::DoNotOptimize(fg); + static RunOptions Pivot() { + RunOptions options; + options.pivot = true; + return options; + } + static RunOptions Aggregate() { + RunOptions options; + options.aggregate = true; + return options; + } + static RunOptions SummaryAggregate() { + RunOptions options; + options.summary_aggregate = true; + return options; + } + static RunOptions ConcatAggregate() { + RunOptions options; + options.concat_aggregate = true; + return options; + } + static RunOptions NumericFilter() { + RunOptions options; + options.numeric_filter = true; + return options; } - state.counters["frames/s"] = - benchmark::Counter(static_cast(in.forest.size()), - benchmark::Counter::kIsIterationInvariantRate); -} -// Build plus the dataframe conversion (and property aggregation when the -// input has properties). -void RunWithRows(benchmark::State& state, - const BenchInput& in, - const Config& config, - StringPool* pool) { + bool filtered = false; + bool pivot = false; + bool aggregate = false; + bool summary_aggregate = false; + bool concat_aggregate = false; + bool numeric_filter = false; +}; + +void Run(benchmark::State& state, Config::View view, RunOptions options = {}) { + StringPool pool; + uint32_t rows = static_cast(state.range(0)); for (auto _ : state) { - auto fg = Build(in.forest, config, *pool); - PERFETTO_CHECK(fg.ok()); - if (in.mapping.empty()) { - auto df = ToDataframe(*fg, in.forest, pool); - PERFETTO_CHECK(df.ok()); - benchmark::DoNotOptimize(df); - } else { - auto df = TreesToDataframeWithProps(*fg, in, pool); - benchmark::DoNotOptimize(df); + state.PauseTiming(); + core::Tree input = MakeInput(&pool, rows); + Config config(pool); + config.view = view; + config.name = &input.columns[0]; + config.value_columns.push_back(&input.columns[1]); + if (options.aggregate) { + config.aggregate_columns.push_back( + {&input.columns[1], Config::Aggregate::kSum, "sum_value"}); + } + if (options.summary_aggregate) { + config.aggregate_columns.push_back( + {&input.columns[2], Config::Aggregate::kOneOrSummary, "summary"}); + } + if (options.concat_aggregate) { + config.aggregate_columns.push_back({&input.columns[2], + Config::Aggregate::kConcatWithComma, + "concatenated"}); } + if (options.numeric_filter) { + config.grouping_columns.push_back(&input.columns[2]); + config.show_stack_filters.push_back( + base::Regex::CreateOrCheck("^12345$")); + } + if (options.filtered) { + config.show_stack_filters.push_back( + base::Regex::CreateOrCheck("frame_1\\d\\d")); + config.hide_frame_filters.push_back( + base::Regex::CreateOrCheck("frame_2\\d\\d")); + } + if (options.pivot) { + config.view_pattern = base::Regex::CreateOrCheck("frame_12"); + } + state.ResumeTiming(); + auto output = Build(std::move(input), config); + PERFETTO_CHECK(output.ok()); + benchmark::DoNotOptimize(output); } - state.counters["frames/s"] = - benchmark::Counter(static_cast(in.forest.size()), - benchmark::Counter::kIsIterationInvariantRate); + state.counters["frames/s"] = benchmark::Counter( + static_cast(rows), benchmark::Counter::kIsIterationInvariantRate); } -void BM_FlamegraphTreeTopDown(benchmark::State& state) { - StringPool pool; - BenchInput in = - GenForest(&pool, static_cast(state.range(0)), 1, false); - Run(state, in, Config{}, &pool); +void BM_FlamegraphTopDown(benchmark::State& state) { + Run(state, Config::View(Config::TopDown{})); } -BENCHMARK(BM_FlamegraphTreeTopDown)->Arg(100000)->Arg(1000000); +BENCHMARK(BM_FlamegraphTopDown)->Arg(100000)->Arg(1000000); -void BM_FlamegraphTreeTopDown4Metrics(benchmark::State& state) { - StringPool pool; - BenchInput in = - GenForest(&pool, static_cast(state.range(0)), 4, false); - Run(state, in, Config{}, &pool); +void BM_FlamegraphTopDownFiltered(benchmark::State& state) { + Run(state, Config::View(Config::TopDown{}), RunOptions::Filtered()); } -BENCHMARK(BM_FlamegraphTreeTopDown4Metrics)->Arg(100000)->Arg(1000000); +BENCHMARK(BM_FlamegraphTopDownFiltered)->Arg(100000)->Arg(1000000); -void BM_FlamegraphTreeTopDownFiltered(benchmark::State& state) { - StringPool pool; - BenchInput in = - GenForest(&pool, static_cast(state.range(0)), 1, false); - Config config; - config.filters.push_back({Config::FilterKind::kShowStack, "frame_1\\d\\d"}); - config.filters.push_back({Config::FilterKind::kHideFrame, "frame_2\\d\\d"}); - Run(state, in, config, &pool); +void BM_FlamegraphTopDownAggregate(benchmark::State& state) { + Run(state, Config::View(Config::TopDown{}), RunOptions::Aggregate()); } -BENCHMARK(BM_FlamegraphTreeTopDownFiltered)->Arg(100000)->Arg(1000000); +BENCHMARK(BM_FlamegraphTopDownAggregate)->Arg(100000)->Arg(1000000); -void BM_FlamegraphTreeBottomUp(benchmark::State& state) { - StringPool pool; - BenchInput in = - GenForest(&pool, static_cast(state.range(0)), 1, false); - Config config; - config.view = Config::View::kBottomUp; - Run(state, in, config, &pool); +void BM_FlamegraphTopDownNumericFilter(benchmark::State& state) { + Run(state, Config::View(Config::TopDown{}), RunOptions::NumericFilter()); } -BENCHMARK(BM_FlamegraphTreeBottomUp)->Arg(100000)->Arg(1000000); +BENCHMARK(BM_FlamegraphTopDownNumericFilter)->Arg(100000)->Arg(1000000); -void BM_FlamegraphTreePivot(benchmark::State& state) { - StringPool pool; - BenchInput in = - GenForest(&pool, static_cast(state.range(0)), 1, false); - Config config; - config.view = Config::View::kPivot; - config.pivot_pattern = "frame_12"; - Run(state, in, config, &pool); +void BM_FlamegraphBottomUp(benchmark::State& state) { + Run(state, Config::View(Config::BottomUp{})); } -BENCHMARK(BM_FlamegraphTreePivot)->Arg(100000)->Arg(1000000); +BENCHMARK(BM_FlamegraphBottomUp)->Arg(100000)->Arg(1000000); -void BM_FlamegraphTreeTopDownRows(benchmark::State& state) { - StringPool pool; - BenchInput in = - GenForest(&pool, static_cast(state.range(0)), 1, false); - RunWithRows(state, in, Config{}, &pool); +void BM_FlamegraphBottomUpAggregate(benchmark::State& state) { + Run(state, Config::View(Config::BottomUp{}), RunOptions::Aggregate()); } -BENCHMARK(BM_FlamegraphTreeTopDownRows)->Arg(100000)->Arg(1000000); +BENCHMARK(BM_FlamegraphBottomUpAggregate)->Arg(100000)->Arg(1000000); -void BM_FlamegraphTreeTopDownPropertiesRows(benchmark::State& state) { - StringPool pool; - BenchInput in = - GenForest(&pool, static_cast(state.range(0)), 1, true); - RunWithRows(state, in, Config{}, &pool); +void BM_FlamegraphTopDownSummaryAggregate(benchmark::State& state) { + Run(state, Config::View(Config::TopDown{}), RunOptions::SummaryAggregate()); } -BENCHMARK(BM_FlamegraphTreeTopDownPropertiesRows)->Arg(100000)->Arg(1000000); +BENCHMARK(BM_FlamegraphTopDownSummaryAggregate)->Arg(100000)->Arg(1000000); -void BM_FlamegraphTreeBottomUpRows(benchmark::State& state) { - StringPool pool; - BenchInput in = - GenForest(&pool, static_cast(state.range(0)), 1, false); - Config config; - config.view = Config::View::kBottomUp; - RunWithRows(state, in, config, &pool); +void BM_FlamegraphTopDownConcatAggregate(benchmark::State& state) { + Run(state, Config::View(Config::TopDown{}), RunOptions::ConcatAggregate()); } -BENCHMARK(BM_FlamegraphTreeBottomUpRows)->Arg(100000)->Arg(1000000); +BENCHMARK(BM_FlamegraphTopDownConcatAggregate)->Arg(100000)->Arg(1000000); -void BM_FlamegraphTreePivotRows(benchmark::State& state) { - StringPool pool; - BenchInput in = - GenForest(&pool, static_cast(state.range(0)), 1, false); - Config config; - config.view = Config::View::kPivot; - config.pivot_pattern = "frame_12"; - RunWithRows(state, in, config, &pool); +void BM_FlamegraphPivot(benchmark::State& state) { + Run(state, Config::View(Config::Pivot{}), RunOptions::Pivot()); } -BENCHMARK(BM_FlamegraphTreePivotRows)->Arg(100000)->Arg(1000000); +BENCHMARK(BM_FlamegraphPivot)->Arg(100000)->Arg(1000000); } // namespace } // namespace perfetto::trace_processor::flamegraph diff --git a/src/trace_processor/plugins/flamegraph/flamegraph_function.cc b/src/trace_processor/plugins/flamegraph/flamegraph_function.cc new file mode 100644 index 00000000000..b4ff99dcd48 --- /dev/null +++ b/src/trace_processor/plugins/flamegraph/flamegraph_function.cc @@ -0,0 +1,782 @@ +/* + * Copyright (C) 2026 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/plugins/flamegraph/flamegraph_function.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "perfetto/base/compiler.h" +#include "perfetto/base/logging.h" +#include "perfetto/base/status.h" +#include "perfetto/ext/base/regex.h" +#include "perfetto/ext/base/status_macros.h" +#include "perfetto/ext/base/status_or.h" +#include "perfetto/public/compiler.h" +#include "src/trace_processor/containers/string_pool.h" +#include "src/trace_processor/core/common/storage_types.h" +#include "src/trace_processor/core/dataframe/adhoc_dataframe_builder.h" +#include "src/trace_processor/core/plugin/plugin.h" +#include "src/trace_processor/core/tree/tree.h" +#include "src/trace_processor/core/tree/tree_from_dataframe.h" +#include "src/trace_processor/perfetto_sql/engine/perfetto_sql_connection.h" +#include "src/trace_processor/perfetto_sql/engine/sqlite_dataframe_builder.h" +#include "src/trace_processor/plugins/flamegraph/flamegraph.h" +#include "src/trace_processor/sqlite/bindings/sqlite_column.h" +#include "src/trace_processor/sqlite/bindings/sqlite_result.h" +#include "src/trace_processor/sqlite/bindings/sqlite_type.h" +#include "src/trace_processor/sqlite/module_state_manager.h" +#include "src/trace_processor/sqlite/sql_source.h" +#include "src/trace_processor/sqlite/sqlite_tagged_args.h" +#include "src/trace_processor/sqlite/sqlite_utils.h" +#include "src/trace_processor/storage/trace_storage.h" +#include "src/trace_processor/types/trace_processor_context.h" + +namespace perfetto::trace_processor { +namespace { + +constexpr char kConfigPointerType[] = "FLAMEGRAPH_CONFIG"; + +constexpr uint32_t kConfigColumn = 0; +constexpr uint32_t kTreeIdColumn = 1; +constexpr uint32_t kTreeParentIdColumn = 2; +constexpr uint32_t kDepthColumn = 3; +constexpr uint32_t kNameColumn = 4; +constexpr uint32_t kSelfValueColumn = 5; +constexpr uint32_t kCumulativeValueColumn = 6; +constexpr uint32_t kParentCumulativeValueColumn = 7; +constexpr uint32_t kXStartColumn = 8; +constexpr uint32_t kXEndColumn = 9; +constexpr uint32_t kPropertyColumnStart = 10; +constexpr uint32_t kArgCount = 1; +constexpr int kSuperRootConstraint = SQLITE_INDEX_CONSTRAINT_FUNCTION + 1; +constexpr int kSuperRootPlan = 1; + +bool IsArgumentColumn(size_t column) { + return column == kConfigColumn; +} + +base::StatusOr ParseRegexSpec(const char* context, + sqlite3_value* pattern, + sqlite3_value* flags) { + ASSIGN_OR_RETURN(std::string parsed_pattern, + sqlite::TaggedArgText(context, pattern)); + ASSIGN_OR_RETURN(std::string parsed_flags, + sqlite::TaggedArgText(context, flags)); + if (!parsed_flags.empty() && parsed_flags != "i") { + return base::ErrStatus("%s: unknown regex flags '%s'", context, + parsed_flags.c_str()); + } + return FlamegraphRegexSpec{std::move(parsed_pattern), parsed_flags == "i"}; +} + +// Parses a text token which must be one of the named values. +template +base::StatusOr ParseToken( + const char* context, + sqlite3_value* value, + std::initializer_list> tokens) { + ASSIGN_OR_RETURN(std::string token, sqlite::TaggedArgText(context, value)); + for (const auto& [name, parsed] : tokens) { + if (token == name) { + return parsed; + } + } + return base::ErrStatus("%s: unknown value '%s'", context, token.c_str()); +} + +base::StatusOr CompileRegex(const FlamegraphRegexSpec& spec) { + const auto sensitivity = spec.case_insensitive + ? base::Regex::CaseSensitivity::kInsensitive + : base::Regex::CaseSensitivity::kSensitive; + return base::Regex::Create(spec.pattern, sensitivity); +} + +base::StatusOr ResolveColumn( + const core::Tree& tree, + const char* context, + const std::string& name) { + auto column = tree.Find(name); + if (!column) { + return base::ErrStatus("%s: column '%s' does not exist", context, + name.c_str()); + } + return *column; +} + +base::StatusOr ResolveConfig(const core::Tree& source, + StringPool& pool, + const FlamegraphQuery& query) { + flamegraph::Config config(pool); + config.view = query.view; + if (query.view_pattern) { + ASSIGN_OR_RETURN(config.view_pattern, CompileRegex(*query.view_pattern)); + } + ASSIGN_OR_RETURN(config.name, + ResolveColumn(source, "flamegraph: name", "name")); + if (!config.name->type.Is()) { + return base::ErrStatus("flamegraph: name column must be a string"); + } + for (const std::string& name : query.grouping_columns) { + ASSIGN_OR_RETURN( + auto column, + ResolveColumn(source, "flamegraph: grouping column", name)); + config.grouping_columns.push_back(column); + } + for (const std::string& name : query.value_columns) { + ASSIGN_OR_RETURN(auto column, + ResolveColumn(source, "flamegraph: value column", name)); + if (!flamegraph::IsNumericColumn(*column)) { + return base::ErrStatus("flamegraph: value columns must be numeric"); + } + config.value_columns.push_back(column); + } + if (config.value_columns.empty()) { + return base::ErrStatus("flamegraph: at least one value column is required"); + } + for (const FlamegraphFilterSpec& filter : query.filters) { + ASSIGN_OR_RETURN(auto regex, CompileRegex(filter.regex)); + switch (filter.kind) { + case FlamegraphFilterSpec::Kind::kShowStack: + config.show_stack_filters.push_back(std::move(regex)); + break; + case FlamegraphFilterSpec::Kind::kHideStack: + config.hide_stack_filters.push_back(std::move(regex)); + break; + case FlamegraphFilterSpec::Kind::kHideFrame: + config.hide_frame_filters.push_back(std::move(regex)); + break; + } + } + if (config.show_stack_filters.size() > + flamegraph::Config::kMaxShowStackFilters) { + return base::ErrStatus("flamegraph: too many SHOW_STACK filters"); + } + for (const FlamegraphAggregateSpec& aggregate : query.aggregate_columns) { + if (aggregate.output_name != aggregate.input_name) { + return base::ErrStatus( + "flamegraph: aggregate output must match its source column"); + } + ASSIGN_OR_RETURN(auto column, + ResolveColumn(source, "flamegraph: aggregate column", + aggregate.input_name)); + if (column->type.Is()) { + // A column with no values aggregates to no values under any mode. + } else if (aggregate.aggregate == flamegraph::Config::Aggregate::kSum && + !flamegraph::IsNumericColumn(*column)) { + return base::ErrStatus( + "flamegraph: SUM aggregate columns must be numeric"); + } + config.aggregate_columns.push_back( + {column, aggregate.aggregate, aggregate.output_name}); + } + return std::move(config); +} + +bool IsReservedOutputName(std::string_view name) { + return name == "in_config" || name == "_tree_id" || + name == "_tree_parent_id" || name == "depth" || name == "name" || + name == "self_value" || name == "cumulative_value" || + name == "parent_cumulative_value" || name == "x_start" || + name == "x_end"; +} + +// Number of fixed leading source columns: id, parent_id, name, value. +constexpr uint32_t kFixedSourceColumns = 4; + +base::StatusOr> LoadSource( + FlamegraphOperator::Context* context, + const char* source) { + std::string sql = "SELECT * FROM "; + sql.append(source); + ASSIGN_OR_RETURN( + auto execution, + context->connection->ExecuteUntilLastStatement( + SqlSource::FromTraceProcessorImplementation(std::move(sql)))); + sqlite3_stmt* stmt = execution.stmt.sqlite_stmt(); + const uint32_t column_count = sqlite::column::Count(stmt); + if (column_count < kFixedSourceColumns) { + return base::ErrStatus( + "flamegraph: source must contain id, parent_id, name and value"); + } + std::vector names; + names.reserve(column_count); + for (uint32_t column = 0; column < column_count; ++column) { + names.emplace_back(sqlite::column::Name(stmt, column)); + } + if (names[0] != "id" || names[1] != "parent_id" || names[2] != "name" || + names[3] != "value") { + return base::ErrStatus( + "flamegraph: first source columns must be id, parent_id, name, value"); + } + for (uint32_t column = kFixedSourceColumns; column < column_count; ++column) { + if (IsReservedOutputName(names[column])) { + return base::ErrStatus("flamegraph: reserved property column '%s'", + names[column].c_str()); + } + } + + SqliteDataframeBuilderOptions options; + options.nullability = dataframe::NullabilityType::kDenseNull; + ASSIGN_OR_RETURN(auto builder, BuildRuntimeDataframeFromSqliteStatement( + context->pool, names, &execution.stmt, + "flamegraph", std::move(options))); + ASSIGN_OR_RETURN(core::Tree tree, core::BuildTree(std::move(builder))); + auto state = std::make_unique(); + state->pool = context->pool; + state->source = std::move(tree); + state->property_names.assign(names.begin() + kFixedSourceColumns, + names.end()); + for (uint32_t column = kFixedSourceColumns; column < column_count; ++column) { + if (flamegraph::IsNumericColumn(state->source.columns[column])) { + state->candidate_value_names.push_back(names[column]); + } + } + const core::Tree::Column* value = *state->source.Find("value"); + if (state->source.row_count > 0 && !flamegraph::IsNumericColumn(*value)) { + return base::ErrStatus("flamegraph: value column must be numeric"); + } + for (uint32_t row = 0; row < state->source.row_count; ++row) { + if (value->null_bv.size() > 0 && !value->null_bv.is_set(row)) { + continue; + } + state->source_value_sum += + value->type.Is() + ? static_cast(value->unchecked_data()[row]) + : value->unchecked_data()[row]; + } + state->candidate_column_start = + kPropertyColumnStart + + static_cast(state->property_names.size()); + state->output_column_count = + state->candidate_column_start + + 2 * static_cast(state->candidate_value_names.size()); + return std::move(state); +} + +std::string QuoteIdentifier(std::string_view identifier) { + std::string quoted(1, '"'); + for (char c : identifier) { + quoted.push_back(c); + if (c == '"') { + quoted.push_back('"'); + } + } + quoted.push_back('"'); + return quoted; +} + +std::string BuildSchema(const FlamegraphOperator::State& state) { + std::string schema = R"( + CREATE TABLE x( + in_config BLOB HIDDEN, + _tree_id BIGINT, + _tree_parent_id BIGINT, + depth BIGINT, + name TEXT, + self_value, + cumulative_value, + parent_cumulative_value, + x_start, + x_end)"; + for (const std::string& property : state.property_names) { + schema.append(",\n "); + schema.append(QuoteIdentifier(property)); + } + for (const std::string& value : state.candidate_value_names) { + schema.append(",\n "); + schema.append(QuoteIdentifier("self_" + value)); + schema.append(",\n "); + schema.append(QuoteIdentifier("cumulative_" + value)); + } + schema.append(R"(, + PRIMARY KEY(_tree_id) + ) WITHOUT ROWID + )"); + return schema; +} + +int DeclareSchema(sqlite3* db, + const FlamegraphOperator::State& state, + char** error) { + std::string schema = BuildSchema(state); + int result = sqlite3_declare_vtab(db, schema.c_str()); + if (result != SQLITE_OK && error) { + *error = sqlite3_mprintf("flamegraph: failed to declare schema"); + } + return result; +} + +void ReturnTreeColumn(sqlite3_context* context, + StringPool& pool, + const core::Tree::Column* column, + uint32_t row) { + if (!column || (column->null_bv.size() > 0 && !column->null_bv.is_set(row))) { + sqlite::result::Null(context); + return; + } + if (column->type.Is()) { + sqlite::result::Long(context, column->unchecked_data()[row]); + return; + } + if (column->type.Is()) { + sqlite::result::Double(context, column->unchecked_data()[row]); + return; + } + StringPool::Id id = column->unchecked_data()[row]; + if (id.is_null()) { + sqlite::result::Null(context); + return; + } + const auto value = pool.Get(id); + // Static (no copy) is safe: StringPool storage is never freed while the + // connection is alive. + sqlite::result::StaticString(context, value.c_str(), + static_cast(value.size())); +} + +} // namespace + +void FlamegraphFindFunction::Step(sqlite3_context* context, + int, + sqlite3_value**) { + sqlite::result::Error( + context, "__intrinsic_flamegraph_find must constrain a flamegraph"); +} + +void FlamegraphConfigFunction::Step(sqlite3_context* context, + int argc, + sqlite3_value** argv) { + FlamegraphQuery query; + base::Status status = sqlite::ParseTaggedArgs( + kName, argc, argv, + { + {"view", 1, + [&](sqlite3_value** values) -> base::Status { + using Config = flamegraph::Config; + ASSIGN_OR_RETURN( + query.view, + ParseToken( + "flamegraph_config: view", values[0], + {{"TOP_DOWN", Config::View(Config::TopDown{})}, + {"BOTTOM_UP", Config::View(Config::BottomUp{})}, + {"PIVOT", Config::View(Config::Pivot{})}, + {"FROM_FRAME", Config::View(Config::FromFrame{})}})); + return base::OkStatus(); + }}, + {"view_pattern", 2, + [&](sqlite3_value** values) -> base::Status { + ASSIGN_OR_RETURN(query.view_pattern, + ParseRegexSpec("flamegraph_config: view_pattern", + values[0], values[1])); + return base::OkStatus(); + }}, + {"filter", 3, + [&](sqlite3_value** values) -> base::Status { + using Kind = FlamegraphFilterSpec::Kind; + ASSIGN_OR_RETURN( + Kind kind, + ParseToken("flamegraph_config: filter", values[0], + {{"SHOW_STACK", Kind::kShowStack}, + {"HIDE_STACK", Kind::kHideStack}, + {"HIDE_FRAME", Kind::kHideFrame}})); + ASSIGN_OR_RETURN(auto regex, + ParseRegexSpec("flamegraph_config: filter", + values[1], values[2])); + query.filters.push_back({kind, std::move(regex)}); + return base::OkStatus(); + }}, + {"grouping", 1, + [&](sqlite3_value** values) -> base::Status { + ASSIGN_OR_RETURN(std::string name, + sqlite::TaggedArgText( + "flamegraph_config: grouping", values[0])); + query.grouping_columns.push_back(std::move(name)); + return base::OkStatus(); + }}, + {"value", 1, + [&](sqlite3_value** values) -> base::Status { + ASSIGN_OR_RETURN( + std::string name, + sqlite::TaggedArgText("flamegraph_config: value", values[0])); + query.value_columns.push_back(std::move(name)); + return base::OkStatus(); + }}, + {"aggregate", 3, + [&](sqlite3_value** values) -> base::Status { + using Aggregate = flamegraph::Config::Aggregate; + ASSIGN_OR_RETURN( + Aggregate aggregate, + ParseToken( + "flamegraph_config: aggregate", values[0], + {{"SUM", Aggregate::kSum}, + {"ONE_OR_SUMMARY", Aggregate::kOneOrSummary}, + {"CONCAT_WITH_COMMA", Aggregate::kConcatWithComma}})); + ASSIGN_OR_RETURN(std::string input, + sqlite::TaggedArgText( + "flamegraph_config: aggregate", values[1])); + ASSIGN_OR_RETURN(std::string output, + sqlite::TaggedArgText( + "flamegraph_config: aggregate", values[2])); + query.aggregate_columns.push_back( + {aggregate, std::move(input), std::move(output)}); + return base::OkStatus(); + }}, + }); + if (!status.ok()) { + sqlite::utils::SetError(context, status); + return; + } + const bool is_pattern_view = + query.view.IsAnyOf(); + if (is_pattern_view != query.view_pattern.has_value()) { + sqlite::utils::SetError( + context, + "flamegraph_config: PIVOT and FROM_FRAME require a view pattern"); + return; + } + sqlite::utils::MovePointerResult(context, std::move(query), + kConfigPointerType); +} + +int FlamegraphOperator::Create(sqlite3* db, + void* raw_context, + int argc, + const char* const* argv, + sqlite3_vtab** output, + char** error) { + if (argc != 4) { + *error = sqlite3_mprintf("flamegraph: wrong number of arguments"); + return SQLITE_ERROR; + } + auto* context = GetContext(raw_context); + auto state = LoadSource(context, argv[3]); + if (!state.ok()) { + *error = sqlite3_mprintf("%s", state.status().c_message()); + return SQLITE_ERROR; + } + if (int result = DeclareSchema(db, **state, error); result != SQLITE_OK) { + return result; + } + std::unique_ptr vtab = std::make_unique(); + vtab->state = context->OnCreate(argc, argv, std::move(*state)); + *output = vtab.release(); + return SQLITE_OK; +} + +int FlamegraphOperator::Destroy(sqlite3_vtab* raw_vtab) { + std::unique_ptr vtab(GetVtab(raw_vtab)); + sqlite::ModuleStateManager::OnDestroy(vtab->state); + return SQLITE_OK; +} + +int FlamegraphOperator::Connect(sqlite3* db, + void* raw_context, + int argc, + const char* const* argv, + sqlite3_vtab** output, + char** error) { + auto* context = GetContext(raw_context); + auto* managed_state = context->OnConnect(argc, argv); + if (!managed_state) { + *error = sqlite3_mprintf("flamegraph: state not found"); + return SQLITE_ERROR; + } + State* state = + sqlite::ModuleStateManager::GetState(managed_state); + if (int result = DeclareSchema(db, *state, error); result != SQLITE_OK) { + return result; + } + std::unique_ptr vtab = std::make_unique(); + vtab->state = managed_state; + *output = vtab.release(); + return SQLITE_OK; +} + +int FlamegraphOperator::Disconnect(sqlite3_vtab* raw_vtab) { + std::unique_ptr vtab(GetVtab(raw_vtab)); + return SQLITE_OK; +} + +int FlamegraphOperator::BestIndex(sqlite3_vtab*, sqlite3_index_info* info) { + base::Status status = sqlite::utils::ValidateFunctionArguments( + info, kArgCount, IsArgumentColumn); + if (!status.ok()) { + return SQLITE_CONSTRAINT; + } + for (int i = 0; i < info->nConstraint; ++i) { + const auto& input = info->aConstraint[i]; + if (input.usable && input.iColumn == kTreeIdColumn && + input.op == kSuperRootConstraint) { + info->aConstraintUsage[i].argvIndex = 2; + info->aConstraintUsage[i].omit = true; + info->idxNum = kSuperRootPlan; + break; + } + } + return SQLITE_OK; +} + +int FlamegraphOperator::Open(sqlite3_vtab*, sqlite3_vtab_cursor** output) { + std::unique_ptr cursor = std::make_unique(); + *output = cursor.release(); + return SQLITE_OK; +} + +int FlamegraphOperator::Close(sqlite3_vtab_cursor* raw_cursor) { + std::unique_ptr cursor(GetCursor(raw_cursor)); + return SQLITE_OK; +} + +int FlamegraphOperator::Filter(sqlite3_vtab_cursor* raw_cursor, + int plan, + const char*, + int argc, + sqlite3_value** argv) { + Cursor* cursor = GetCursor(raw_cursor); + Vtab* vtab = GetVtab(cursor->pVtab); + State* state = + sqlite::ModuleStateManager::GetState(vtab->state); + PERFETTO_CHECK(argc == kArgCount || + (plan == kSuperRootPlan && argc == kArgCount + 1)); + cursor->result.reset(); + cursor->columns.clear(); + cursor->layout = {}; + cursor->row = 0; + cursor->super_root_only = plan == kSuperRootPlan; + if (cursor->super_root_only) { + const unsigned char* selector = sqlite3_value_text(argv[1]); + if (!selector || + strcmp(reinterpret_cast(selector), "SUPER_ROOT") != 0) { + return sqlite::utils::SetError(vtab, "flamegraph: unknown find selector"); + } + } + + auto query = sqlite::utils::TakeMovePointerValue( + argv[0], kConfigPointerType, "flamegraph"); + if (!query.ok()) { + return sqlite::utils::SetError(vtab, query.status()); + } + if (query->value_columns.empty()) { + return sqlite::utils::SetError( + vtab, "flamegraph: at least one value column is required"); + } + if (cursor->super_root_only || state->source.row_count == 0) { + return SQLITE_OK; + } + + auto config = ResolveConfig(state->source, *state->pool, *query); + if (!config.ok()) { + return sqlite::utils::SetError(vtab, config.status()); + } + // TODO: Cache metric-independent intermediate results across metric queries, + // not complete query results. In particular, preserve the computed tree shape + // when only the value columns change so switching metrics only recomputes + // metric-dependent values. + auto result = flamegraph::Build(state->source, *config); + if (!result.ok()) { + return sqlite::utils::SetError(vtab, result.status()); + } + cursor->result = std::make_unique(std::move(*result)); + + // Resolve every schema column against the result tree once so that Column() + // is a plain array lookup per cell. + const core::Tree& tree = *cursor->result; + cursor->columns.assign(state->output_column_count, nullptr); + auto resolve = [&](uint32_t index, const std::string& name) { + auto found = tree.Find(name); + cursor->columns[index] = found ? *found : nullptr; + }; + const std::string& primary = query->value_columns[0]; + resolve(kDepthColumn, "depth"); + resolve(kNameColumn, "name"); + resolve(kSelfValueColumn, "self_" + primary); + resolve(kCumulativeValueColumn, "cumulative_" + primary); + for (uint32_t i = 0; i < state->property_names.size(); ++i) { + resolve(kPropertyColumnStart + i, state->property_names[i]); + } + for (uint32_t i = 0; i < state->candidate_value_names.size(); ++i) { + const std::string& name = state->candidate_value_names[i]; + resolve(state->candidate_column_start + 2 * i, "self_" + name); + resolve(state->candidate_column_start + 2 * i + 1, "cumulative_" + name); + } + + const core::Tree::Column* cumulative = + cursor->columns[kCumulativeValueColumn]; + const core::Tree::Column* depth = cursor->columns[kDepthColumn]; + PERFETTO_CHECK(cumulative && depth); + cursor->value_is_int = cumulative->type.Is(); + cursor->layout = flamegraph::ComputeLayout(tree, *cumulative, *depth); + return SQLITE_OK; +} + +int FlamegraphOperator::Next(sqlite3_vtab_cursor* raw_cursor) { + GetCursor(raw_cursor)->row++; + return SQLITE_OK; +} + +int FlamegraphOperator::Eof(sqlite3_vtab_cursor* raw_cursor) { + Cursor* cursor = GetCursor(raw_cursor); + if (cursor->super_root_only) { + return cursor->row > 0; + } + return cursor->row >= cursor->layout.node.size(); +} + +int FlamegraphOperator::Column(sqlite3_vtab_cursor* raw_cursor, + sqlite3_context* context, + int raw_column) { + Cursor* cursor = GetCursor(raw_cursor); + Vtab* vtab = GetVtab(cursor->pVtab); + State* state = + sqlite::ModuleStateManager::GetState(vtab->state); + const auto column = static_cast(raw_column); + if (cursor->super_root_only) { + if (column == kTreeIdColumn) { + sqlite::result::Long(context, 0); + } else if (column == kDepthColumn) { + sqlite::result::Long(context, 0); + } else if (column == kCumulativeValueColumn) { + sqlite::result::Double(context, state->source_value_sum); + } else { + sqlite::result::Null(context); + } + return SQLITE_OK; + } + const uint32_t row = cursor->row; + switch (column) { + case kTreeIdColumn: + sqlite::result::Long(context, row); + return SQLITE_OK; + case kTreeParentIdColumn: { + const uint32_t parent = cursor->layout.parent_row[row]; + if (parent == core::Tree::kNullParent) { + sqlite::result::Null(context); + } else { + sqlite::result::Long(context, parent); + } + return SQLITE_OK; + } + case kParentCumulativeValueColumn: { + const uint32_t parent = cursor->layout.parent_row[row]; + if (parent == core::Tree::kNullParent) { + sqlite::result::Null(context); + } else { + ReturnTreeColumn(context, *state->pool, + cursor->columns[kCumulativeValueColumn], + cursor->layout.node[parent]); + } + return SQLITE_OK; + } + case kXStartColumn: + case kXEndColumn: { + double x = cursor->layout.x_start[row]; + if (column == kXEndColumn) { + // A node's width is its cumulative value clamped to zero. + const core::Tree::Column* cumulative = + cursor->columns[kCumulativeValueColumn]; + const uint32_t node = cursor->layout.node[row]; + const double value = + cursor->value_is_int + ? static_cast( + cumulative->unchecked_data()[node]) + : cumulative->unchecked_data()[node]; + x += std::max(value, 0.0); + } + if (cursor->value_is_int) { + sqlite::result::Long(context, static_cast(x)); + } else { + sqlite::result::Double(context, x); + } + return SQLITE_OK; + } + default: + break; + } + if (column >= cursor->columns.size()) { + return sqlite::utils::SetError(vtab, "flamegraph: bad column"); + } + ReturnTreeColumn(context, *state->pool, cursor->columns[column], + cursor->layout.node[row]); + return SQLITE_OK; +} + +int FlamegraphOperator::Rowid(sqlite3_vtab_cursor*, sqlite_int64*) { + return SQLITE_ERROR; +} + +int FlamegraphOperator::FindFunction(sqlite3_vtab*, + int, + const char* name, + FindFunctionFn** function, + void**) { + if (base::CaseInsensitiveEqual(name, FlamegraphFindFunction::kName)) { + *function = [](sqlite3_context* context, int, sqlite3_value**) { + sqlite::result::Error(context, "super-root constraint was not consumed"); + }; + return kSuperRootConstraint; + } + return SQLITE_OK; +} + +namespace flamegraph { +namespace { + +class FlamegraphPlugin : public Plugin { + public: + ~FlamegraphPlugin() override; + + void RegisterFunctions(PerfettoSqlConnection*, + std::vector& out) override { + StringPool* pool = trace_context_->storage->mutable_string_pool(); + out.push_back(MakeFunctionRegistration(pool)); + out.push_back(MakeFunctionRegistration(nullptr)); + } + + void RegisterSqliteModules( + PerfettoSqlConnection* connection, + std::vector& out) override { + StringPool* pool = trace_context_->storage->mutable_string_pool(); + out.push_back(MakeSqliteModule( + "__intrinsic_flamegraph", + std::make_unique(connection, pool))); + } +}; + +FlamegraphPlugin::~FlamegraphPlugin() = default; + +} // namespace + +void RegisterPlugin() { + static PluginRegistration registration( + []() -> std::unique_ptr { + return std::make_unique(); + }, + FlamegraphPlugin::kPluginId, FlamegraphPlugin::kDepIds.data(), + FlamegraphPlugin::kDepIds.size()); + base::ignore_result(registration); +} + +} // namespace flamegraph +} // namespace perfetto::trace_processor diff --git a/src/trace_processor/plugins/flamegraph/flamegraph_function.h b/src/trace_processor/plugins/flamegraph/flamegraph_function.h new file mode 100644 index 00000000000..225df392054 --- /dev/null +++ b/src/trace_processor/plugins/flamegraph/flamegraph_function.h @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2026 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. + */ + +#ifndef SRC_TRACE_PROCESSOR_PLUGINS_FLAMEGRAPH_FLAMEGRAPH_FUNCTION_H_ +#define SRC_TRACE_PROCESSOR_PLUGINS_FLAMEGRAPH_FLAMEGRAPH_FUNCTION_H_ + +#include +#include +#include +#include +#include + +#include "src/trace_processor/containers/string_pool.h" +#include "src/trace_processor/core/tree/tree.h" +#include "src/trace_processor/perfetto_sql/engine/perfetto_sql_connection.h" +#include "src/trace_processor/plugins/flamegraph/flamegraph.h" +#include "src/trace_processor/sqlite/bindings/sqlite_function.h" +#include "src/trace_processor/sqlite/bindings/sqlite_module.h" +#include "src/trace_processor/sqlite/module_state_manager.h" + +namespace perfetto::trace_processor { + +struct FlamegraphRegexSpec { + std::string pattern; + bool case_insensitive = false; +}; + +struct FlamegraphFilterSpec { + enum class Kind { + kShowStack, + kHideStack, + kHideFrame, + }; + Kind kind; + FlamegraphRegexSpec regex; +}; + +struct FlamegraphAggregateSpec { + flamegraph::Config::Aggregate aggregate; + std::string input_name; + std::string output_name; +}; + +// Query-specific configuration passed from the scalar config builder to the +// virtual table in the same SQLite statement. +struct FlamegraphQuery { + flamegraph::Config::View view = + flamegraph::Config::View(flamegraph::Config::TopDown{}); + std::optional view_pattern; + std::vector filters; + std::vector grouping_columns; + std::vector value_columns; + std::vector aggregate_columns; +}; + +// Marker predicate overloaded by the flamegraph virtual table to select its +// synthetic super-root row. +struct FlamegraphFindFunction + : public sqlite::Function { + static constexpr char kName[] = "__intrinsic_flamegraph_find"; + static constexpr int kArgCount = 2; + using UserData = void; + + static void Step(sqlite3_context*, int, sqlite3_value**); +}; + +// Builds the opaque argument consumed by a flamegraph virtual table call. +struct FlamegraphConfigFunction + : public sqlite::Function { + static constexpr char kName[] = "__intrinsic_flamegraph_config"; + static constexpr int kArgCount = -1; + using UserData = StringPool; + + static void Step(sqlite3_context*, int argc, sqlite3_value** argv); +}; + +// Create-only virtual table operator. The module argument is the immutable raw +// source table; calls on the created table provide only a FlamegraphQuery. +struct FlamegraphOperator : sqlite::Module { + struct State { + StringPool* pool = nullptr; + core::Tree source; + std::vector property_names; + std::vector candidate_value_names; + double source_value_sum = 0; + // Schema column indices, fixed at creation time. + uint32_t candidate_column_start = 0; + uint32_t output_column_count = 0; + }; + + struct Context : sqlite::ModuleStateManager { + Context(PerfettoSqlConnection* _connection, StringPool* _pool) + : sqlite::ModuleStateManager(owned_store_), + connection(_connection), + pool(_pool) {} + + PerfettoSqlConnection* connection; + StringPool* pool; + + private: + sqlite::CommittedStateManager owned_store_; + }; + + struct Vtab : sqlite::Module::Vtab { + sqlite::ModuleStateManager::PerVtabState* state; + }; + + struct Cursor : sqlite::Module::Cursor { + std::unique_ptr result; + // Schema column index -> result tree column (null where the result has + // no such column). Resolved once per query. + std::vector columns; + flamegraph::Layout layout; + bool value_is_int = false; + uint32_t row = 0; + bool super_root_only = false; + }; + + static constexpr auto kType = kCreateOnly; + static constexpr bool kSupportsWrites = false; + static constexpr bool kDoesOverloadFunctions = true; + + static int Create(sqlite3*, + void*, + int, + const char* const*, + sqlite3_vtab**, + char**); + static int Destroy(sqlite3_vtab*); + static int Connect(sqlite3*, + void*, + int, + const char* const*, + sqlite3_vtab**, + char**); + static int Disconnect(sqlite3_vtab*); + static int BestIndex(sqlite3_vtab*, sqlite3_index_info*); + static int Open(sqlite3_vtab*, sqlite3_vtab_cursor**); + static int Close(sqlite3_vtab_cursor*); + static int Filter(sqlite3_vtab_cursor*, + int, + const char*, + int, + sqlite3_value**); + static int Next(sqlite3_vtab_cursor*); + static int Eof(sqlite3_vtab_cursor*); + static int Column(sqlite3_vtab_cursor*, sqlite3_context*, int); + static int Rowid(sqlite3_vtab_cursor*, sqlite_int64*); + static int FindFunction(sqlite3_vtab*, + int, + const char*, + FindFunctionFn**, + void**); + + static int Begin(sqlite3_vtab*) { return SQLITE_OK; } + static int Sync(sqlite3_vtab*) { return SQLITE_OK; } + static int Commit(sqlite3_vtab*) { return SQLITE_OK; } + static int Rollback(sqlite3_vtab*) { return SQLITE_OK; } + static int Savepoint(sqlite3_vtab* table, int savepoint) { + Vtab* vtab = GetVtab(table); + sqlite::ModuleStateManager::OnSavepoint(vtab->state, + savepoint); + return SQLITE_OK; + } + static int Release(sqlite3_vtab* table, int savepoint) { + Vtab* vtab = GetVtab(table); + sqlite::ModuleStateManager::OnRelease(vtab->state, + savepoint); + return SQLITE_OK; + } + static int RollbackTo(sqlite3_vtab* table, int savepoint) { + Vtab* vtab = GetVtab(table); + sqlite::ModuleStateManager::OnRollbackTo(vtab->state, + savepoint); + return SQLITE_OK; + } + + static constexpr sqlite3_module kModule = CreateModule(); +}; + +} // namespace perfetto::trace_processor + +namespace perfetto::trace_processor::flamegraph { + +void RegisterPlugin(); + +} // namespace perfetto::trace_processor::flamegraph + +#endif // SRC_TRACE_PROCESSOR_PLUGINS_FLAMEGRAPH_FLAMEGRAPH_FUNCTION_H_ diff --git a/src/trace_processor/plugins/flamegraph/flamegraph_unittest.cc b/src/trace_processor/plugins/flamegraph/flamegraph_unittest.cc index 2752dc2dbaa..f8d239bf5eb 100644 --- a/src/trace_processor/plugins/flamegraph/flamegraph_unittest.cc +++ b/src/trace_processor/plugins/flamegraph/flamegraph_unittest.cc @@ -16,511 +16,373 @@ #include "src/trace_processor/plugins/flamegraph/flamegraph.h" -#include #include -#include +#include +#include #include #include -#include -#include -#include #include #include "perfetto/base/logging.h" #include "src/trace_processor/containers/string_pool.h" -#include "src/trace_processor/core/dataframe/cursor.h" -#include "src/trace_processor/core/dataframe/dataframe.h" +#include "src/trace_processor/core/tree/tree.h" +#include "src/trace_processor/core/tree/tree_column_ops.h" +#include "src/trace_processor/core/util/slab.h" #include "test/gtest_and_gmock.h" namespace perfetto::trace_processor::flamegraph { namespace { -struct FrameSpec { +struct Frame { std::string name; std::optional parent; - std::vector metrics; + int64_t value; }; -using Cell = std::variant; - -Cell I(int64_t v) { - return Cell(v); -} -Cell D(double v) { - return Cell(v); -} -Cell S(const char* v) { - return Cell(std::string(v)); +template +core::Tree::Column ColumnFromValues(const std::vector& values) { + auto column = + core::Tree::Column::Create(static_cast(values.size())); + memcpy(column.data.begin(), values.data(), values.size() * sizeof(T)); + return column; } -struct CellCollector : core::dataframe::CellCallback { - void OnCell(int64_t v) { value = v; } - void OnCell(double v) { value = v; } - void OnCell(NullTermStringView v) { value = std::string(v.data(), v.size()); } - void OnCell(std::nullptr_t) { value = std::monostate(); } - void OnCell(uint32_t v) { value = static_cast(v); } - void OnCell(int32_t v) { value = static_cast(v); } - Cell value; -}; - -void ExpectTable(const core::dataframe::Dataframe& df, - const std::vector& cols, - const std::vector>& expected) { - ASSERT_EQ(df.row_count(), expected.size()); - for (uint32_t r = 0; r < expected.size(); ++r) { - std::vector actual; - for (const std::string& c : cols) { - auto idx = df.IndexOfColumnLegacy(c); - ASSERT_TRUE(idx.has_value()) << c; - CellCollector collector; - df.GetCell(r, *idx, collector); - actual.push_back(collector.value); - } - EXPECT_EQ(actual, expected[r]) << "row " << r; +core::Tree MakeTree(StringPool* pool, const std::vector& frames) { + core::Tree tree; + tree.row_count = static_cast(frames.size()); + tree.parent = core::Slab::Alloc(frames.size()); + std::vector names; + std::vector values; + for (uint32_t i = 0; i < frames.size(); ++i) { + tree.parent[i] = frames[i].parent.value_or(core::Tree::kNullParent); + names.push_back(pool->InternString(base::StringView(frames[i].name))); + values.push_back(frames[i].value); } + tree.names = {"name", "value"}; + tree.columns.push_back(ColumnFromValues(names)); + tree.columns.push_back(ColumnFromValues(values)); + return tree; } -// Path -> (self, cumulative, sorted constituent names): everything a test -// asserts on, independent of node and frame numbering. -using TreeSummary = std::map, - std::vector, - std::vector>>; - -class FlamegraphTest : public ::testing::Test { - protected: - Forest MakeForest(const std::vector& frames, - uint32_t metric_count = 1) { - Forest f; - f.metric_count = metric_count; - std::map name_idx; - for (const FrameSpec& fr : frames) { - auto [it, inserted] = name_idx.insert( - {fr.name, static_cast(f.name_table.size())}); - if (inserted) { - f.name_table.push_back(pool_.InternString(base::StringView(fr.name))); - } - f.name.push_back(it->second); - f.key.push_back(it->second); - f.parent.push_back(fr.parent ? *fr.parent : kNoParent); - PERFETTO_CHECK(fr.metrics.size() == metric_count); - for (double m : fr.metrics) { - f.metrics.push_back(m); - } - } - return f; - } - - Flamegraph BuildOk(const Forest& forest, const Config& config) { - auto res = Build(forest, config, pool_); - PERFETTO_CHECK(res.ok()); - return std::move(*res); - } - - std::string NameOf(const Forest& forest, uint32_t frame) { - return pool_.Get(forest.name_table[forest.name[frame]]).ToStdString(); - } - - TreeSummary Summarize(const Tree& tree, const Forest& forest) { - uint32_t k = tree.metric_count; - std::vector path(tree.size()); - TreeSummary out; - for (uint32_t i = 0; i < tree.size(); ++i) { - path[i] = - (tree.parent[i] == kNoParent ? "" : path[tree.parent[i]] + "/") + - NameOf(forest, tree.rep_frame[i]); - std::vector self(tree.self.data() + i * k, - tree.self.data() + (i + 1) * k); - std::vector cum(tree.cumulative.data() + i * k, - tree.cumulative.data() + (i + 1) * k); - std::vector cons; - for (uint32_t c = tree.constituents_offset[i]; - c < tree.constituents_offset[i + 1]; ++c) { - cons.push_back(NameOf(forest, tree.constituents[c])); - } - std::sort(cons.begin(), cons.end()); - out[path[i]] = {self, cum, cons}; - } - return out; - } - - StringPool pool_; -}; - -TEST_F(FlamegraphTest, TopDownMergesSiblingsByKey) { - // main -> {b, b, c}; the two b siblings merge, c stays under the merged - // b node's sibling set. - Forest f = MakeForest({ - {"main", std::nullopt, {1}}, - {"b", 0, {2}}, - {"b", 0, {3}}, - {"c", 1, {4}}, - }); - Flamegraph fg = BuildOk(f, Config{}); - EXPECT_EQ(fg.up.size(), 0u); - ASSERT_EQ(fg.up.constituents_offset.size(), 1u); - EXPECT_EQ(fg.up.constituents_offset[0], 0u); - TreeSummary s = Summarize(fg.down, f); - ASSERT_EQ(s.size(), 3u); - EXPECT_EQ(s["main"], - (std::tuple{std::vector{1}, std::vector{10}, - std::vector{"main"}})); - EXPECT_EQ(s["main/b"], - (std::tuple{std::vector{5}, std::vector{9}, - std::vector{"b", "b"}})); - EXPECT_EQ(s["main/b/c"], - (std::tuple{std::vector{4}, std::vector{4}, - std::vector{"c"}})); +template +void AddColumn(core::Tree* tree, + const char* name, + const std::vector& values) { + tree->names.emplace_back(name); + tree->columns.push_back(ColumnFromValues(values)); } -TEST_F(FlamegraphTest, TopDownMergesRoots) { - Forest f = MakeForest({ - {"main", std::nullopt, {1}}, - {"main", std::nullopt, {2}}, - {"a", 1, {4}}, - }); - Flamegraph fg = BuildOk(f, Config{}); - TreeSummary s = Summarize(fg.down, f); - ASSERT_EQ(s.size(), 2u); - EXPECT_EQ(std::get<0>(s["main"]), std::vector{3}); - EXPECT_EQ(std::get<1>(s["main"]), std::vector{7}); - EXPECT_EQ(std::get<1>(s["main/a"]), std::vector{4}); -} - -TEST_F(FlamegraphTest, NonTopologicalOrderMatchesTopological) { - Forest ordered = MakeForest({ - {"main", std::nullopt, {1}}, - {"b", 0, {2}}, - {"b", 0, {3}}, - {"c", 1, {4}}, - }); - // The same forest with children listed before their parents. - Forest shuffled = MakeForest({ - {"c", 3, {4}}, - {"b", 2, {3}}, - {"main", std::nullopt, {1}}, - {"b", 2, {2}}, - }); - Flamegraph a = BuildOk(ordered, Config{}); - Flamegraph b = BuildOk(shuffled, Config{}); - EXPECT_EQ(Summarize(a.down, ordered), Summarize(b.down, shuffled)); +void AddStringColumn(core::Tree* tree, + StringPool* pool, + const char* name, + const std::vector& values) { + std::vector ids; + ids.reserve(values.size()); + for (const std::string& value : values) { + ids.push_back(pool->InternString(base::StringView(value))); + } + AddColumn(tree, name, ids); } -TEST_F(FlamegraphTest, DanglingParentsAndCyclesAreIgnored) { - Forest f = MakeForest({ - {"main", std::nullopt, {1}}, - {"dangling", 100, {10}}, - {"cycle_a", 3, {10}}, - {"cycle_b", 2, {10}}, - }); - Flamegraph fg = BuildOk(f, Config{}); - TreeSummary s = Summarize(fg.down, f); - ASSERT_EQ(s.size(), 1u); - EXPECT_EQ(std::get<1>(s["main"]), std::vector{1}); +Config MakeConfig(const core::Tree& tree, StringPool& pool) { + Config config(pool); + config.name = &tree.columns[0]; + config.value_columns.push_back(&tree.columns[1]); + return config; } -TEST_F(FlamegraphTest, BottomUp) { - // main -> a -> b; every frame has a value, so every frame anchors a - // caller chain. - Forest f = MakeForest({ - {"main", std::nullopt, {1}}, - {"a", 0, {2}}, - {"b", 1, {4}}, - }); - Config config; - config.view = Config::View::kBottomUp; - Flamegraph fg = BuildOk(f, config); - EXPECT_EQ(fg.down.size(), 0u); - ASSERT_EQ(fg.down.constituents_offset.size(), 1u); - EXPECT_EQ(fg.down.constituents_offset[0], 0u); - TreeSummary s = Summarize(fg.up, f); - ASSERT_EQ(s.size(), 6u); - EXPECT_EQ(std::get<1>(s["main"]), std::vector{1}); - EXPECT_EQ(std::get<1>(s["a"]), std::vector{2}); - EXPECT_EQ(std::get<1>(s["a/main"]), std::vector{2}); - EXPECT_EQ(std::get<1>(s["b"]), std::vector{4}); - EXPECT_EQ(std::get<1>(s["b/a"]), std::vector{4}); - EXPECT_EQ(std::get<1>(s["b/a/main"]), std::vector{4}); - // Self on an up node sums the frames at that chain position. - EXPECT_EQ(std::get<0>(s["b/a"]), std::vector{2}); - EXPECT_EQ(std::get<2>(s["b/a"]), std::vector{"a"}); +template +T Value(const core::Tree& tree, const char* name, uint32_t row) { + auto column = tree.Find(name); + PERFETTO_CHECK(column); + return (*column)->unchecked_data()[row]; } -TEST_F(FlamegraphTest, BottomUpMergesSharedSuffixes) { - // Two different b frames under main: their caller chains merge under - // the same b root, and the shared main suffix appears once per anchor - // in the constituents. - Forest f = MakeForest({ - {"main", std::nullopt, {0}}, - {"b", 0, {2}}, - {"b", 0, {3}}, - }); - Config config; - config.view = Config::View::kBottomUp; - Flamegraph fg = BuildOk(f, config); - TreeSummary s = Summarize(fg.up, f); - ASSERT_EQ(s.size(), 2u); - EXPECT_EQ(std::get<1>(s["b"]), std::vector{5}); - EXPECT_EQ(std::get<0>(s["b"]), std::vector{5}); - EXPECT_EQ(std::get<1>(s["b/main"]), std::vector{5}); - EXPECT_EQ(std::get<2>(s["b/main"]), - (std::vector{"main", "main"})); +TEST(FlamegraphTest, TopDownMergesSiblings) { + StringPool pool; + core::Tree input = MakeTree( + &pool, + {{"main", std::nullopt, 1}, {"b", 0, 2}, {"b", 0, 3}, {"c", 1, 4}}); + Config config = MakeConfig(input, pool); + auto result = Build(std::move(input), config); + ASSERT_TRUE(result.ok()); + ASSERT_EQ(result->row_count, 3u); + EXPECT_EQ(pool.Get(Value(*result, "name", 0)).ToStdString(), + "main"); + EXPECT_EQ(Value(*result, "cumulative_value", 0), 10); + EXPECT_EQ(Value(*result, "self_value", 1), 5); + EXPECT_EQ(Value(*result, "cumulative_value", 1), 9); + EXPECT_EQ(result->parent[2], 1u); } -TEST_F(FlamegraphTest, Pivot) { - // main -> a -> x -> c and main -> x: pivoting on x roots both halves at - // the merged x. - Forest f = MakeForest({ - {"main", std::nullopt, {1}}, - {"a", 0, {2}}, - {"x", 1, {3}}, - {"c", 2, {4}}, - {"x", 0, {5}}, - }); - Config config; - config.view = Config::View::kPivot; - config.pivot_pattern = "x"; - Flamegraph fg = BuildOk(f, config); - - TreeSummary down = Summarize(fg.down, f); - ASSERT_EQ(down.size(), 2u); - EXPECT_EQ(std::get<0>(down["x"]), std::vector{8}); - EXPECT_EQ(std::get<1>(down["x"]), std::vector{12}); - EXPECT_EQ(std::get<1>(down["x/c"]), std::vector{4}); - - TreeSummary up = Summarize(fg.up, f); - ASSERT_EQ(up.size(), 4u); - // Each anchor carries its own subtree total up its caller chain. - EXPECT_EQ(std::get<1>(up["x"]), std::vector{12}); - EXPECT_EQ(std::get<1>(up["x/a"]), std::vector{7}); - EXPECT_EQ(std::get<1>(up["x/a/main"]), std::vector{7}); - EXPECT_EQ(std::get<1>(up["x/main"]), std::vector{5}); +TEST(FlamegraphTest, LayoutPacksWidestFirstBreadthFirst) { + StringPool pool; + core::Tree input = MakeTree( + &pool, + {{"main", std::nullopt, 4}, {"a", 0, 3}, {"b", 0, 6}, {"c", 1, 2}}); + Config config = MakeConfig(input, pool); + auto result = Build(input, config); + ASSERT_TRUE(result.ok()); + ASSERT_EQ(result->row_count, 4u); + + auto cumulative = result->Find("cumulative_value"); + auto depth = result->Find("depth"); + ASSERT_TRUE(cumulative && depth); + Layout layout = ComputeLayout(*result, **cumulative, **depth); + + auto name_at = [&](uint32_t row) { + return pool.Get(Value(*result, "name", layout.node[row])) + .ToStdString(); + }; + EXPECT_EQ(name_at(0), "main"); + EXPECT_EQ(name_at(1), "b"); + EXPECT_EQ(name_at(2), "a"); + EXPECT_EQ(name_at(3), "c"); + EXPECT_EQ(layout.parent_row[0], core::Tree::kNullParent); + EXPECT_EQ(layout.parent_row[1], 0u); + EXPECT_EQ(layout.parent_row[2], 0u); + EXPECT_EQ(layout.parent_row[3], 2u); + EXPECT_DOUBLE_EQ(layout.x_start[0], 0.0); + EXPECT_DOUBLE_EQ(layout.x_start[1], 0.0); + EXPECT_DOUBLE_EQ(layout.x_start[2], 6.0); + EXPECT_DOUBLE_EQ(layout.x_start[3], 6.0); } -TEST_F(FlamegraphTest, PivotReRootsNestedMatches) { - // x -> a -> x: the nested x starts its own root; the outer x's subtree - // stops at it. - Forest f = MakeForest({ - {"x", std::nullopt, {1}}, - {"a", 0, {2}}, - {"x", 1, {4}}, - }); - Config config; - config.view = Config::View::kPivot; - config.pivot_pattern = "x"; - Flamegraph fg = BuildOk(f, config); - TreeSummary down = Summarize(fg.down, f); - ASSERT_EQ(down.size(), 2u); - EXPECT_EQ(std::get<0>(down["x"]), std::vector{5}); - EXPECT_EQ(std::get<1>(down["x"]), std::vector{7}); - EXPECT_EQ(std::get<1>(down["x/a"]), std::vector{2}); - // Upward, the outer x weighs 3 (itself + a, stopping at the nested x) - // and the nested x weighs 4; both merge into the x root. - TreeSummary up = Summarize(fg.up, f); - EXPECT_EQ(std::get<1>(up["x"]), std::vector{7}); - EXPECT_EQ(std::get<1>(up["x/a"]), std::vector{4}); - EXPECT_EQ(std::get<1>(up["x/a/x"]), std::vector{4}); +TEST(FlamegraphTest, StringAggregates) { + StringPool pool; + core::Tree input = + MakeTree(&pool, {{"main", std::nullopt, 1}, {"x", 0, 2}, {"x", 0, 3}}); + AddStringColumn(&input, &pool, "source", {"root", "a", "b"}); + AddColumn(&input, "num", std::vector{5, 7, 8}); + AddColumn(&input, "frac", std::vector{1.5, 2.0, 2.0}); + Config config = MakeConfig(input, pool); + config.aggregate_columns.push_back( + {&input.columns[2], Config::Aggregate::kOneOrSummary, "summary"}); + config.aggregate_columns.push_back( + {&input.columns[2], Config::Aggregate::kConcatWithComma, "concatenated"}); + config.aggregate_columns.push_back( + {&input.columns[3], Config::Aggregate::kOneOrSummary, "num_summary"}); + config.aggregate_columns.push_back( + {&input.columns[3], Config::Aggregate::kConcatWithComma, "nums"}); + config.aggregate_columns.push_back( + {&input.columns[4], Config::Aggregate::kOneOrSummary, "frac_summary"}); + config.aggregate_columns.push_back( + {&input.columns[4], Config::Aggregate::kConcatWithComma, "fracs"}); + + auto result = Build(input, config); + ASSERT_TRUE(result.ok()); + ASSERT_EQ(result->row_count, 2u); + EXPECT_EQ( + pool.Get(Value(*result, "summary", 0)).ToStdString(), + "root"); + EXPECT_EQ( + pool.Get(Value(*result, "summary", 1)).ToStdString(), + "a and 2 others"); + EXPECT_EQ( + pool.Get(Value(*result, "concatenated", 1)).ToStdString(), + "a,b"); + EXPECT_EQ( + pool.Get(Value(*result, "num_summary", 0)).ToStdString(), + "5"); + EXPECT_EQ( + pool.Get(Value(*result, "num_summary", 1)).ToStdString(), + "7 and 2 others"); + EXPECT_EQ(pool.Get(Value(*result, "nums", 1)).ToStdString(), + "7,8"); + EXPECT_EQ( + pool.Get(Value(*result, "frac_summary", 0)).ToStdString(), + "1.5"); + EXPECT_EQ( + pool.Get(Value(*result, "frac_summary", 1)).ToStdString(), + "2.0"); + EXPECT_EQ(pool.Get(Value(*result, "fracs", 1)).ToStdString(), + "2.0,2.0"); } -TEST_F(FlamegraphTest, HideFrameFoldsValuesIntoKeptAncestor) { - Forest f = MakeForest({ - {"main", std::nullopt, {1}}, - {"hideme", 0, {2}}, - {"b", 1, {4}}, - }); - Config config; - config.filters.push_back({Config::FilterKind::kHideFrame, "hideme"}); - Flamegraph fg = BuildOk(f, config); - TreeSummary s = Summarize(fg.down, f); - ASSERT_EQ(s.size(), 2u); - EXPECT_EQ(s["main"], - (std::tuple{std::vector{3}, std::vector{7}, - std::vector{"main"}})); - EXPECT_EQ(std::get<1>(s["main/b"]), std::vector{4}); +// The dataframe layer materializes a column whose rows are all null as a +// null-typed column. Every aggregate mode over such a column produces an +// all-null output. +TEST(FlamegraphTest, AllNullAggregates) { + StringPool pool; + core::Tree input = + MakeTree(&pool, {{"main", std::nullopt, 1}, {"x", 0, 2}, {"x", 0, 3}}); + input.names.emplace_back("source"); + input.columns.push_back(core::Tree::Column::CreateNull(3)); + Config config = MakeConfig(input, pool); + config.aggregate_columns.push_back( + {&input.columns[2], Config::Aggregate::kOneOrSummary, "summary"}); + config.aggregate_columns.push_back( + {&input.columns[2], Config::Aggregate::kConcatWithComma, "concatenated"}); + config.aggregate_columns.push_back( + {&input.columns[2], Config::Aggregate::kSum, "summed"}); + + auto result = Build(input, config); + ASSERT_TRUE(result.ok()); + ASSERT_EQ(result->row_count, 2u); + for (uint32_t row = 0; row < result->row_count; ++row) { + for (const char* name : {"summary", "concatenated", "summed"}) { + auto output = result->Find(name); + ASSERT_TRUE(output); + ASSERT_TRUE((*output)->null_bv.size() > 0); + EXPECT_FALSE((*output)->null_bv.is_set(row)); + } + } } -TEST_F(FlamegraphTest, HiddenRootValuesAreDropped) { - Forest f = MakeForest({ - {"hideme", std::nullopt, {1}}, - {"b", 0, {4}}, - }); - Config config; - config.filters.push_back({Config::FilterKind::kHideFrame, "hideme"}); - Flamegraph fg = BuildOk(f, config); - TreeSummary s = Summarize(fg.down, f); - ASSERT_EQ(s.size(), 1u); - EXPECT_EQ(std::get<1>(s["b"]), std::vector{4}); +TEST(FlamegraphTest, BottomUp) { + StringPool pool; + core::Tree input = + MakeTree(&pool, {{"main", std::nullopt, 1}, {"a", 0, 2}, {"b", 1, 4}}); + Config config = MakeConfig(input, pool); + config.view = Config::View(Config::BottomUp{}); + auto result = Build(std::move(input), config); + ASSERT_TRUE(result.ok()); + ASSERT_EQ(result->row_count, 6u); + EXPECT_EQ(Value(*result, "depth", 0), -1); + EXPECT_EQ(Value(*result, "self_value", 4), 0); + EXPECT_EQ(Value(*result, "cumulative_value", 4), 4); } -TEST_F(FlamegraphTest, ShowStackDropsValuelessSubtrees) { - Forest f = MakeForest({ - {"root", std::nullopt, {1}}, - {"keepme", 0, {2}}, - {"other", 0, {4}}, - }); - Config config; - config.filters.push_back({Config::FilterKind::kShowStack, "keepme"}); - Flamegraph fg = BuildOk(f, config); - TreeSummary s = Summarize(fg.down, f); - ASSERT_EQ(s.size(), 2u); - // root's own value still shows as self, but does not count towards any - // cumulative value (its stack prefix has no match). - EXPECT_EQ(std::get<0>(s["root"]), std::vector{1}); - EXPECT_EQ(std::get<1>(s["root"]), std::vector{2}); - EXPECT_EQ(std::get<1>(s["root/keepme"]), std::vector{2}); +TEST(FlamegraphTest, PivotAndFromFrameViews) { + StringPool pool; + const std::vector frames = {{"main", std::nullopt, 1}, + {"pivot", 0, 2}, + {"leaf", 1, 4}, + {"other", 0, 8}}; + for (bool pivot : {false, true}) { + core::Tree input = MakeTree(&pool, frames); + Config config = MakeConfig(input, pool); + config.view = pivot ? Config::View(Config::Pivot{}) + : Config::View(Config::FromFrame{}); + config.view_pattern = base::Regex::CreateOrCheck("^pivot$"); + auto result = Build(std::move(input), config); + ASSERT_TRUE(result.ok()); + EXPECT_EQ(result->row_count, pivot ? 4u : 2u); + EXPECT_EQ(pool.Get(Value(*result, "name", 0)).ToStdString(), + "pivot"); + EXPECT_EQ(Value(*result, "depth", 0), 1); + EXPECT_EQ(pool.Get(Value(*result, "name", 1)).ToStdString(), + "leaf"); + if (pivot) { + EXPECT_EQ( + pool.Get(Value(*result, "name", 2)).ToStdString(), + "pivot"); + EXPECT_EQ( + pool.Get(Value(*result, "name", 3)).ToStdString(), + "main"); + EXPECT_EQ(Value(*result, "depth", 3), -2); + } + } } -TEST_F(FlamegraphTest, HideStack) { - Forest f = MakeForest({ - {"main", std::nullopt, {1}}, - {"bad", 0, {2}}, - {"c", 1, {3}}, - {"ok", 0, {4}}, - }); - Config config; - config.filters.push_back({Config::FilterKind::kHideStack, "bad"}); - Flamegraph fg = BuildOk(f, config); - TreeSummary s = Summarize(fg.down, f); - ASSERT_EQ(s.size(), 2u); - EXPECT_EQ(std::get<1>(s["main"]), std::vector{5}); - EXPECT_EQ(std::get<1>(s["main/ok"]), std::vector{4}); +TEST(FlamegraphTest, ShowAndHideStackFilters) { + StringPool pool; + core::Tree input = MakeTree(&pool, {{"main", std::nullopt, 1}, + {"show", 0, 2}, + {"leaf", 1, 4}, + {"hidden", 0, 8}, + {"hidden_leaf", 3, 16}}); + Config config = MakeConfig(input, pool); + config.show_stack_filters.push_back(base::Regex::CreateOrCheck("^leaf$")); + config.hide_stack_filters.push_back( + base::Regex::CreateOrCheck("^hidden_leaf$")); + auto result = Build(std::move(input), config); + ASSERT_TRUE(result.ok()); + ASSERT_EQ(result->row_count, 3u); + EXPECT_EQ(pool.Get(Value(*result, "name", 0)).ToStdString(), + "main"); + EXPECT_EQ(pool.Get(Value(*result, "name", 1)).ToStdString(), + "show"); + EXPECT_EQ(pool.Get(Value(*result, "name", 2)).ToStdString(), + "leaf"); } -TEST_F(FlamegraphTest, ShowFromFrame) { - Forest f = MakeForest({ - {"main", std::nullopt, {1}}, - {"start", 0, {2}}, - {"b", 1, {3}}, - }); - Config config; - config.filters.push_back({Config::FilterKind::kShowFromFrame, "start"}); - Flamegraph fg = BuildOk(f, config); - TreeSummary s = Summarize(fg.down, f); - ASSERT_EQ(s.size(), 2u); - EXPECT_EQ(std::get<1>(s["start"]), std::vector{5}); - EXPECT_EQ(std::get<1>(s["start/b"]), std::vector{3}); -} +TEST(FlamegraphTest, RejectsInvalidConfig) { + StringPool pool; + core::Tree input = + MakeTree(&pool, {{"main", std::nullopt, 1}, {"child", 0, 2}}); -TEST_F(FlamegraphTest, MultipleMetrics) { - Forest f = MakeForest( - { - {"main", std::nullopt, {1, 0}}, - {"a", 0, {0, 2}}, - {"b", 0, {0, 0}}, - }, - 2); - Flamegraph fg = BuildOk(f, Config{}); - TreeSummary s = Summarize(fg.down, f); - // b is zero on every metric and is dropped; a survives via metric 1. - ASSERT_EQ(s.size(), 2u); - EXPECT_EQ(std::get<0>(s["main"]), (std::vector{1, 0})); - EXPECT_EQ(std::get<1>(s["main"]), (std::vector{1, 2})); - EXPECT_EQ(std::get<1>(s["main/a"]), (std::vector{0, 2})); -} + Config missing_value(pool); + missing_value.name = &input.columns[0]; + EXPECT_FALSE(Build(input, missing_value).ok()); -TEST_F(FlamegraphTest, EmptyForest) { - Forest f = MakeForest({}); - Flamegraph fg = BuildOk(f, Config{}); - EXPECT_EQ(fg.down.size(), 0u); - EXPECT_EQ(fg.up.size(), 0u); - ASSERT_EQ(fg.down.constituents_offset.size(), 1u); - EXPECT_EQ(fg.down.constituents_offset[0], 0u); - ASSERT_EQ(fg.up.constituents_offset.size(), 1u); - EXPECT_EQ(fg.up.constituents_offset[0], 0u); -} + Config non_numeric = MakeConfig(input, pool); + non_numeric.value_columns = {&input.columns[0]}; + EXPECT_FALSE(Build(input, non_numeric).ok()); -TEST_F(FlamegraphTest, FiltersMatchExtraStrings) { - // Filters also match the extra strings attached to a name entry (how - // builders expose property values folded into the key). - Forest f = MakeForest({ - {"root", std::nullopt, {1}}, - {"aa", 0, {2}}, - {"bb", 0, {4}}, - }); - f.match_offset.push_back(0); // root: no extras. - f.match_offset.push_back(0); // aa: one extra, "libkeep.so". - f.match_offset.push_back(1); - f.match_offset.push_back(1); // bb: none. - f.match_strings.push_back(pool_.InternString("libkeep.so")); - Config config; - config.filters.push_back({Config::FilterKind::kShowStack, "libkeep"}); - Flamegraph fg = BuildOk(f, config); - TreeSummary s = Summarize(fg.down, f); - ASSERT_EQ(s.size(), 2u); - EXPECT_EQ(std::get<1>(s["root"]), std::vector{2}); - EXPECT_EQ(std::get<1>(s["root/aa"]), std::vector{2}); + Config duplicate_output = MakeConfig(input, pool); + duplicate_output.aggregate_columns.push_back( + {&input.columns[1], Config::Aggregate::kSum, "self_value"}); + EXPECT_FALSE(Build(input, duplicate_output).ok()); } -TEST_F(FlamegraphTest, ToDataframe) { - Forest f = MakeForest({ - {"main", std::nullopt, {1}}, - {"b", 0, {2}}, - {"b", 0, {3}}, - }); - Flamegraph fg = BuildOk(f, Config{}); - auto df = ToDataframe(fg, f, &pool_); - ASSERT_TRUE(df.ok()); - ExpectTable( - *df, {"id", "parentId", "depth", "name", "selfValue", "cumulativeValue"}, - { - {I(0), I(-1), I(1), S("main"), I(1), I(6)}, - {I(1), I(0), I(2), S("b"), I(5), I(5)}, - }); +TEST(FlamegraphTest, RejectsNegativeValues) { + StringPool pool; + // Negative values are rejected in downward views (TOP_DOWN). + { + core::Tree input = MakeTree(&pool, {{"main", std::nullopt, -1}}); + Config config = MakeConfig(input, pool); + EXPECT_FALSE(Build(std::move(input), config).ok()); + } + // Negative values are rejected in upward views (BOTTOM_UP) too. + { + core::Tree input = MakeTree(&pool, {{"main", std::nullopt, -1}}); + Config config = MakeConfig(input, pool); + config.view = Config::View(Config::BottomUp{}); + EXPECT_FALSE(Build(std::move(input), config).ok()); + } } -TEST_F(FlamegraphTest, ToDataframeBottomUpAndDoubles) { - // A fractional value makes the metric's columns DOUBLE; the up tree - // emits negative depths. - Forest f = MakeForest({ - {"main", std::nullopt, {1.5}}, - {"a", 0, {2}}, - }); - Config config; - config.view = Config::View::kBottomUp; - Flamegraph fg = BuildOk(f, config); - auto df = ToDataframe(fg, f, &pool_); - ASSERT_TRUE(df.ok()); - ExpectTable( - *df, {"id", "parentId", "depth", "name", "selfValue", "cumulativeValue"}, - { - {I(0), I(-1), I(-1), S("main"), D(1.5), D(1.5)}, - {I(1), I(-1), I(-1), S("a"), D(2), D(2)}, - {I(2), I(1), I(-2), S("main"), D(1.5), D(2)}, - }); +TEST(FlamegraphTest, RejectsIntegerOverflow) { + StringPool pool; + { + core::Tree input = MakeTree( + &pool, {{"main", std::nullopt, std::numeric_limits::max()}, + {"main", std::nullopt, 1}}); + Config config = MakeConfig(input, pool); + EXPECT_FALSE(Build(std::move(input), config).ok()); + } + { + core::Tree input = MakeTree( + &pool, {{"main", std::nullopt, std::numeric_limits::max()}, + {"child", 0, 1}}); + Config config = MakeConfig(input, pool); + EXPECT_FALSE(Build(std::move(input), config).ok()); + } } -TEST_F(FlamegraphTest, ToDataframeMultipleMetrics) { - Forest f = MakeForest( - { - {"main", std::nullopt, {1, 0}}, - {"a", 0, {0, 2.5}}, - }, - 2); - Flamegraph fg = BuildOk(f, Config{}); - auto df = ToDataframe(fg, f, &pool_); - ASSERT_TRUE(df.ok()); - ExpectTable(*df, - {"id", "parentId", "depth", "name", "selfValue0", - "cumulativeValue0", "selfValue1", "cumulativeValue1"}, - { - {I(0), I(-1), I(1), S("main"), I(1), I(1), D(0), D(2.5)}, - {I(1), I(0), I(2), S("a"), I(0), I(0), D(2.5), D(2.5)}, - }); +TEST(FlamegraphTest, EmptyLayout) { + core::Tree tree; + core::Tree::Column cumulative = core::Tree::Column::Create(0); + core::Tree::Column depth = core::Tree::Column::Create(0); + Layout layout = ComputeLayout(tree, cumulative, depth); + EXPECT_EQ(layout.node.size(), 0u); + EXPECT_EQ(layout.parent_row.size(), 0u); + EXPECT_EQ(layout.x_start.size(), 0u); } -TEST_F(FlamegraphTest, ConfigValidation) { - Forest f = MakeForest({{"main", std::nullopt, {1}}}); - Config pivot_without_pattern; - pivot_without_pattern.view = Config::View::kPivot; - EXPECT_FALSE(Build(f, pivot_without_pattern, pool_).ok()); - - Config pattern_without_pivot; - pattern_without_pivot.pivot_pattern = "x"; - EXPECT_FALSE(Build(f, pattern_without_pivot, pool_).ok()); - - Forest no_metrics; - no_metrics.metric_count = 0; - EXPECT_FALSE(Build(no_metrics, Config{}, pool_).ok()); +TEST(FlamegraphTest, HideFrameFoldsValue) { + StringPool pool; + core::Tree input = + MakeTree(&pool, {{"main", std::nullopt, 1}, {"hide", 0, 2}, {"b", 1, 4}}); + AddStringColumn(&input, &pool, "source", {"root", "hidden", "child"}); + Config config = MakeConfig(input, pool); + config.hide_frame_filters.push_back(base::Regex::CreateOrCheck("hide")); + config.aggregate_columns.push_back( + {&input.columns[2], Config::Aggregate::kOneOrSummary, "summary"}); + config.aggregate_columns.push_back( + {&input.columns[2], Config::Aggregate::kConcatWithComma, "concatenated"}); + auto result = Build(std::move(input), config); + ASSERT_TRUE(result.ok()); + ASSERT_EQ(result->row_count, 2u); + EXPECT_EQ(Value(*result, "self_value", 0), 3); + EXPECT_EQ(Value(*result, "cumulative_value", 0), 7); + EXPECT_EQ( + pool.Get(Value(*result, "summary", 0)).ToStdString(), + "root and 2 others"); + EXPECT_EQ( + pool.Get(Value(*result, "concatenated", 0)).ToStdString(), + "root,hidden"); } } // namespace diff --git a/src/trace_processor/plugins/trace_export/trace_export.cc b/src/trace_processor/plugins/trace_export/trace_export.cc index 89c501454cd..2aecb52d39f 100644 --- a/src/trace_processor/plugins/trace_export/trace_export.cc +++ b/src/trace_processor/plugins/trace_export/trace_export.cc @@ -126,6 +126,10 @@ base::Status WriteExport(const std::vector& dataframes, return base::ErrStatus("Export output is null"); } + if (format == TraceProcessor::ExportFormat::kSqlite) { + return base::ErrStatus("SQLite export must use random-access output"); + } + util::TarWriter tar(std::make_unique(output)); if (format == TraceProcessor::ExportFormat::kArrowTar || format == TraceProcessor::ExportFormat::kPerfetto) { diff --git a/src/trace_processor/plugins/tree_functions/tree_conversion.cc b/src/trace_processor/plugins/tree_functions/tree_conversion.cc index c30b8185136..05c3fb66bc0 100644 --- a/src/trace_processor/plugins/tree_functions/tree_conversion.cc +++ b/src/trace_processor/plugins/tree_functions/tree_conversion.cc @@ -183,6 +183,141 @@ void TreeToTable::Step(sqlite3_context* ctx, int argc, sqlite3_value** argv) { ctx, std::make_unique(std::move(df)), "TABLE"); } +// Computes depth and subtree aggregations (object count, self size, native +// size) for a dominator tree in O(N) linear time using two topological passes. +static base::StatusOr TreeDominatorSummaryImpl( + core::Tree tree, + StringPool* pool) { + std::vector names = {"id", + "idom_id", + "dominated_obj_count", + "dominated_size_bytes", + "dominated_native_size_bytes", + "depth"}; + + dataframe::AdhocDataframeBuilder builder( + std::move(names), pool, + dataframe::AdhocDataframeBuilder::Options{ + {dataframe::AdhocColumnType::kInt64, + dataframe::AdhocColumnType::kInt64, + dataframe::AdhocColumnType::kInt64, + dataframe::AdhocColumnType::kInt64, + dataframe::AdhocColumnType::kInt64, + dataframe::AdhocColumnType::kInt64}, + dataframe::NullabilityType::kDenseNull}); + + uint32_t N = tree.row_count; + if (N == 0) { + return std::move(builder).Build(); + } + + // Pre-initialize working vectors. Every node dominates itself (count=1, + // depth=1). + std::vector subtree_count(N, 1); + std::vector subtree_size_bytes(N, 0); + std::vector subtree_native_size_bytes(N, 0); + std::vector depth(N, 1); + + const auto* ids = tree.columns[0].unchecked_data(); + const auto* self_sizes = tree.columns[2].unchecked_data(); + const auto* native_sizes = tree.columns[3].unchecked_data(); + + // Copy initial self-sizes into subtree accumulators, skipping nulls if + // present. + if (tree.columns[2].null_bv.size() == 0) { + std::copy(self_sizes, self_sizes + N, subtree_size_bytes.begin()); + } else { + for (uint32_t i = 0; i < N; ++i) { + if (tree.columns[2].null_bv.is_set(i)) { + subtree_size_bytes[i] = self_sizes[i]; + } + } + } + + // Copy initial native-sizes into subtree accumulators, skipping nulls if + // present. + if (tree.columns[3].null_bv.size() == 0) { + std::copy(native_sizes, native_sizes + N, + subtree_native_size_bytes.begin()); + } else { + for (uint32_t i = 0; i < N; ++i) { + if (tree.columns[3].null_bv.is_set(i)) { + subtree_native_size_bytes[i] = native_sizes[i]; + } + } + } + + // 1. Top-down pass: Parent depth is guaranteed to be computed before child + // since nodes in `core::Tree` are topologically ordered. + for (uint32_t i = 0; i < N; ++i) { + uint32_t p = tree.parent[i]; + if (p != core::Tree::kNullParent) { + depth[i] = depth[p] + 1; + } + } + + // 2. Bottom-up pass: Traverse in reverse topological order so children + // accumulate + // their total dominated subtree sizes/counts into their immediate parent. + for (uint32_t i = N; i > 0; --i) { + uint32_t idx = i - 1; + uint32_t p = tree.parent[idx]; + if (p != core::Tree::kNullParent) { + subtree_count[p] += subtree_count[idx]; + subtree_size_bytes[p] += subtree_size_bytes[idx]; + subtree_native_size_bytes[p] += subtree_native_size_bytes[idx]; + } + } + + // 3. Construct and return output dataframe table for Perfetto SQL. + bool ok = true; + for (uint32_t i = 0; i < N && ok; ++i) { + ok = builder.PushNonNull(0, ids[i]); + uint32_t p = tree.parent[i]; + if (p == core::Tree::kNullParent) { + builder.PushNull(1); + } else { + ok = ok && builder.PushNonNull(1, ids[p]); + } + ok = ok && builder.PushNonNull(2, subtree_count[i]); + ok = ok && builder.PushNonNull(3, subtree_size_bytes[i]); + ok = ok && builder.PushNonNull(4, subtree_native_size_bytes[i]); + ok = ok && builder.PushNonNull(5, depth[i]); + } + if (!ok) { + return builder.status(); + } + + return std::move(builder).Build(); +} + +void TreeDominatorSummary::Step(sqlite3_context* ctx, + int argc, + sqlite3_value** argv) { + if (argc != 1) { + return sqlite::result::Error( + ctx, "__intrinsic_tree_dominator_summary: expected 1 argument"); + } + auto tree_or = sqlite::utils::TakeMovePointerValue( + argv[0], "TREE", "__intrinsic_tree_dominator_summary"); + if (!tree_or.ok()) { + if (sqlite::value::Type(argv[0]) == sqlite::Type::kNull) { + SQLITE_ASSIGN_OR_RETURN( + ctx, auto empty_df, + TreeDominatorSummaryImpl(core::Tree{}, GetUserData(ctx))); + return sqlite::result::UniquePointer( + ctx, std::make_unique(std::move(empty_df)), + "TABLE"); + } + return sqlite::utils::SetError(ctx, tree_or.status()); + } + SQLITE_ASSIGN_OR_RETURN( + ctx, auto df, + TreeDominatorSummaryImpl(std::move(*tree_or), GetUserData(ctx))); + return sqlite::result::UniquePointer( + ctx, std::make_unique(std::move(df)), "TABLE"); +} + namespace tree_functions { namespace { @@ -194,6 +329,7 @@ class TreeFunctionsPlugin : public Plugin { std::vector& out) override { StringPool* pool = trace_context_->storage->mutable_string_pool(); out.push_back(MakeFunctionRegistration(pool)); + out.push_back(MakeFunctionRegistration(pool)); } void RegisterAggregateFunctions( diff --git a/src/trace_processor/plugins/tree_functions/tree_conversion.h b/src/trace_processor/plugins/tree_functions/tree_conversion.h index 46c0ac6d8df..328b526857d 100644 --- a/src/trace_processor/plugins/tree_functions/tree_conversion.h +++ b/src/trace_processor/plugins/tree_functions/tree_conversion.h @@ -42,6 +42,16 @@ struct TreeToTable : public sqlite::Function { static void Step(sqlite3_context* ctx, int argc, sqlite3_value** argv); }; +// Scalar function that computes dominator tree summary (depth & subtree +// aggregates) from a Tree. +struct TreeDominatorSummary : public sqlite::Function { + static constexpr char kName[] = "__intrinsic_tree_dominator_summary"; + static constexpr int kArgCount = 1; + using UserData = StringPool; + + static void Step(sqlite3_context* ctx, int argc, sqlite3_value** argv); +}; + } // namespace perfetto::trace_processor #endif // SRC_TRACE_PROCESSOR_PLUGINS_TREE_FUNCTIONS_TREE_CONVERSION_H_ diff --git a/src/trace_processor/plugins/utils_functions/utils_functions.cc b/src/trace_processor/plugins/utils_functions/utils_functions.cc index 7bb6c9c50e0..abdb03402e2 100644 --- a/src/trace_processor/plugins/utils_functions/utils_functions.cc +++ b/src/trace_processor/plugins/utils_functions/utils_functions.cc @@ -56,10 +56,10 @@ namespace perfetto::trace_processor { namespace { io::FileSystem* GetSqlFileSystem(TraceProcessorContext* context) { - if (!context->config.enable_sql_file_access || !context->platform) { + if (!context->config.enable_sql_file_access) { return nullptr; } - return context->platform->GetFileSystem(); + return context->file_system; } class FileOutputWriter final : public json::OutputWriter { @@ -85,8 +85,9 @@ class FileOutputWriter final : public json::OutputWriter { if (!status_.ok() || buffer_.empty()) { return status_; } - status_ = file_->Write(buffer_.data(), buffer_.size()); + status_ = file_->WriteAt(offset_, buffer_.data(), buffer_.size()); if (status_.ok()) { + offset_ += buffer_.size(); buffer_.clear(); } return status_; @@ -95,6 +96,7 @@ class FileOutputWriter final : public json::OutputWriter { static constexpr size_t kBufferSize = 64 * 1024; std::unique_ptr file_; + uint64_t offset_ = 0; std::string buffer_; base::Status status_ = base::OkStatus(); }; @@ -130,9 +132,13 @@ void ExportJson::Step(sqlite3_context* ctx, int argc, sqlite3_value** argv) { if (!file_system) { return sqlite::utils::SetError(ctx, "EXPORT_JSON: File I/O is disabled"); } + io::FileOpenOptions options; + options.access = io::FileAccess::kWriteOnly; + options.create = true; + options.truncate = true; std::unique_ptr file; base::Status open_status = - file_system->OpenFile(sqlite::value::Text(argv[0]), &file); + file_system->OpenFile(sqlite::value::Text(argv[0]), options, &file); if (!open_status.ok()) { return sqlite::utils::SetError( ctx, base::ErrStatus("EXPORT_JSON: %s", open_status.c_message())); @@ -296,9 +302,13 @@ void FileWrite::Step(sqlite3_context* ctx, int argc, sqlite3_value** argv) { ctx, "__intrinsic_file_write: File I/O is disabled"); } + io::FileOpenOptions options; + options.access = io::FileAccess::kWriteOnly; + options.create = true; + options.truncate = true; std::unique_ptr file; base::Status open_status = - file_system->OpenFile(sqlite::value::Text(argv[0]), &file); + file_system->OpenFile(sqlite::value::Text(argv[0]), options, &file); if (!open_status.ok()) { return sqlite::utils::SetError( ctx, @@ -311,7 +321,7 @@ void FileWrite::Step(sqlite3_context* ctx, int argc, sqlite3_value** argv) { // Make sure to call last as sqlite::value::Bytes can invalidate pointer // returned. const void* data = sqlite::value::Blob(argv[1]); - base::Status status = file->Write(data, len); + base::Status status = file->WriteAt(0, data, len); if (!status.ok()) { return sqlite::utils::SetError( ctx, base::ErrStatus("__intrinsic_file_write: %s", status.c_message())); diff --git a/src/trace_processor/rpc/rpc.cc b/src/trace_processor/rpc/rpc.cc index 2adcb2c2424..ce221c93f04 100644 --- a/src/trace_processor/rpc/rpc.cc +++ b/src/trace_processor/rpc/rpc.cc @@ -30,7 +30,11 @@ #include "perfetto/base/logging.h" #include "perfetto/base/status.h" #include "perfetto/base/time.h" +#include "perfetto/ext/base/file_utils.h" +#include "perfetto/ext/base/scoped_file.h" #include "perfetto/ext/base/status_macros.h" +#include "perfetto/ext/base/temp_file.h" +#include "perfetto/ext/base/utils.h" #include "perfetto/ext/base/version.h" #include "perfetto/ext/protozero/proto_ring_buffer.h" #include "perfetto/ext/trace_processor/rpc/query_result_serializer.h" @@ -188,16 +192,22 @@ PERFETTO_NO_INLINE void SendSingleStatementResponse( class RpcExportOutput : public TraceProcessor::ExportOutput { public: - explicit RpcExportOutput(const Rpc::ExportCallback& callback) - : callback_(callback) {} + // |path|, when provided, makes the export write to that file instead of + // streaming through Write(). + explicit RpcExportOutput(const Rpc::ExportCallback& callback, + std::optional path = std::nullopt) + : callback_(callback), path_(std::move(path)) {} base::Status Write(const void* data, size_t size) override { return callback_(static_cast(data), size, /*has_more=*/true); } + std::optional GetFilePath() const override { return path_; } + private: const Rpc::ExportCallback& callback_; + std::optional path_; }; } // namespace @@ -803,16 +813,54 @@ std::optional Rpc::ParseExportFormat( if (format == protos::pbzero::ExportArgs::ARROW_TAR) { return TraceProcessor::ExportFormat::kArrowTar; } + if (format == protos::pbzero::ExportArgs::SQLITE) { + return TraceProcessor::ExportFormat::kSqlite; + } return std::nullopt; } base::Status Rpc::Export(TraceProcessor::ExportFormat format, const ExportCallback& callback) { + if (format == TraceProcessor::ExportFormat::kSqlite) { + return ExportSqlite(callback); + } RpcExportOutput output(callback); RETURN_IF_ERROR(trace_processor_->Export(format, &output)); return callback(nullptr, 0, /*has_more=*/false); } +base::Status Rpc::ExportSqlite(const ExportCallback& callback) { + // SQLite export needs random-access output, so the server materializes the + // database in a server-controlled temporary file and streams the bytes back + // to the client. The client never names a path on the server, so this does + // not expose the server's filesystem. + base::TempDir dir = base::TempDir::Create(); + std::string path = dir.path() + "/export.db"; + auto cleanup = base::OnScopeExit([&path] { base::Unlink(path.c_str()); }); + + RpcExportOutput output(callback, path); + RETURN_IF_ERROR( + trace_processor_->Export(TraceProcessor::ExportFormat::kSqlite, &output)); + + base::ScopedFile fd = base::OpenFile(path, O_RDONLY); + if (!fd) { + return base::ErrStatus("Failed to open exported SQLite database"); + } + std::vector buffer(64 * 1024); + for (;;) { + ssize_t read = base::Read(fd.get(), buffer.data(), buffer.size()); + if (read < 0) { + return base::ErrStatus("Failed to read exported SQLite database"); + } + if (read == 0) { + break; + } + RETURN_IF_ERROR(callback(buffer.data(), static_cast(read), + /*has_more=*/true)); + } + return callback(nullptr, 0, /*has_more=*/false); +} + void Rpc::RestoreInitialTables() { trace_processor_->RestoreInitialTables(); } diff --git a/src/trace_processor/rpc/rpc.h b/src/trace_processor/rpc/rpc.h index 77a28f327fe..c158b7e0f65 100644 --- a/src/trace_processor/rpc/rpc.h +++ b/src/trace_processor/rpc/rpc.h @@ -148,6 +148,8 @@ class Rpc { TraceProcessor* trace_processor() const { return trace_processor_.get(); } private: + base::Status ExportSqlite(const ExportCallback&); + void ParseRpcRequest(const uint8_t*, size_t); void ResetTraceProcessor(const uint8_t*, size_t); base::Status RegisterSqlPackage(protozero::ConstBytes); diff --git a/src/trace_processor/rpc/session_paths.cc b/src/trace_processor/rpc/session_paths.cc index 96ee91f1867..dfa5fdbf156 100644 --- a/src/trace_processor/rpc/session_paths.cc +++ b/src/trace_processor/rpc/session_paths.cc @@ -65,16 +65,6 @@ constexpr const char* kAnimals[] = { "otter", "falcon", "lynx", "panda", "tapir", "heron", "ibex", "koala", "marten", "quokka", "raven", "shrew", "stork", "viper", "wren", "yak"}; -bool IsAbsolutePath(const std::string& p) { - if (p.empty()) - return false; - if (p[0] == '/' || p[0] == '\\') - return true; - // Windows drive-letter path, e.g. "C:\foo" or "C:/foo". - return p.size() >= 3 && std::isalpha(static_cast(p[0])) && - p[1] == ':' && (p[2] == '\\' || p[2] == '/'); -} - // Returns true if the substring after the last ':' is non-empty and all digits // (i.e. a "host:port" address). bool HasTrailingPort(const std::string& addr) { @@ -168,7 +158,7 @@ base::Status ValidateAfUnixPathLength(const std::string& path) { } std::string MakeAbsolutePath(const std::string& path) { - if (path.empty() || IsAbsolutePath(path)) + if (path.empty() || base::IsAbsolutePath(path)) return path; char cwd[4096]; #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) @@ -204,7 +194,7 @@ base::StatusOr ParseDurationMs(const std::string& s) { } RemoteAddrKind ClassifyRemoteAddr(const std::string& addr) { - if (base::EndsWith(addr, ".sock") || IsAbsolutePath(addr)) + if (base::EndsWith(addr, ".sock") || base::IsAbsolutePath(addr)) return RemoteAddrKind::kUnixPath; if (addr.find("://") != std::string::npos || HasTrailingPort(addr)) return RemoteAddrKind::kHttp; diff --git a/src/trace_processor/shell/BUILD.gn b/src/trace_processor/shell/BUILD.gn index 2021714f256..0da7e4c03c8 100644 --- a/src/trace_processor/shell/BUILD.gn +++ b/src/trace_processor/shell/BUILD.gn @@ -118,6 +118,7 @@ source_set("unittests") { deps = [ ":shell", ":subcommands", + "..:local_file_system", "../../../gn:default_deps", "../../../gn:gtest_and_gmock", "../../../gn:protobuf_full", diff --git a/src/trace_processor/shell/export_subcommand.cc b/src/trace_processor/shell/export_subcommand.cc index 78c3894141b..036c7615937 100644 --- a/src/trace_processor/shell/export_subcommand.cc +++ b/src/trace_processor/shell/export_subcommand.cc @@ -43,7 +43,7 @@ const char* ExportSubcommand::detailed_help() const { return R"(Load a trace and export it to a file. Supported formats: - sqlite Exports using the SQLite database format. + sqlite Exports all SQL-visible tables and views to SQLite. arrow_tar Exports static tables as a cross-version-compatible tar of Arrow files for external consumers. It cannot be loaded back into Trace Processor. @@ -94,12 +94,14 @@ base::Status ExportSubcommand::Run(const SubcommandContext& ctx) { SetupTraceProcessor(*ctx.global, config, ctx.platform)); RETURN_IF_ERROR(LoadTraceFile(tp.get(), ctx.platform, trace_file).status()); + TraceProcessor::ExportFormat export_format; if (format == "sqlite") { - return ExportTraceToDatabase(tp.get(), output_path_); + export_format = TraceProcessor::ExportFormat::kSqlite; + } else if (format == "arrow_tar") { + export_format = TraceProcessor::ExportFormat::kArrowTar; + } else { + export_format = TraceProcessor::ExportFormat::kPerfetto; } - TraceProcessor::ExportFormat export_format = - format == "arrow_tar" ? TraceProcessor::ExportFormat::kArrowTar - : TraceProcessor::ExportFormat::kPerfetto; return ExportTrace(tp.get(), export_format, output_path_); } diff --git a/src/trace_processor/shell/shell_utils.cc b/src/trace_processor/shell/shell_utils.cc index 1fa98f80b5c..d0b958eaa6e 100644 --- a/src/trace_processor/shell/shell_utils.cc +++ b/src/trace_processor/shell/shell_utils.cc @@ -16,8 +16,6 @@ #include "src/trace_processor/shell/shell_utils.h" -#include -#include #include #include #include @@ -36,9 +34,6 @@ #if !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) #include -#else -#include -#define ftruncate _chsize #endif namespace perfetto::trace_processor { @@ -83,38 +78,6 @@ bool StderrSupportsColors() { namespace { -// Builds a SQLite "file:" URI for `path`, percent-encoding characters that are -// not safe in a URI path. -// -// The main trace processor connection is opened on the in-memory "memdb" VFS. -// ATTACH DATABASE inherits the connection's VFS, so a plain path would create -// the export database in memory too. Pin the default VFS instead: it is the -// OS-backed one, under a platform-dependent name ("unix", "win32", ...). -std::string MakeExportFileUri(const std::string& path) { - std::string normalized = path; -#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) - std::replace(normalized.begin(), normalized.end(), '\\', '/'); -#endif - std::string uri = "file:"; - for (char c : normalized) { - bool unreserved = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || - (c >= '0' && c <= '9') || c == '-' || c == '.' || - c == '_' || c == '~' || c == '/' || c == ':'; - if (unreserved) { - uri.push_back(c); - } else { - base::StackString<4> escaped("%%%02X", static_cast(c)); - uri.append(escaped.c_str()); - } - } - // Lookup default VFS. - sqlite3_vfs* vfs = sqlite3_vfs_find(nullptr); - PERFETTO_CHECK(vfs); - uri.append("?vfs="); - uri.append(vfs->zName); - return uri; -} - base::Status PrintStatsSection(TraceProcessor* tp, const char* header, const char* color, @@ -205,74 +168,8 @@ base::Status PrintStats(TraceProcessor* tp) { base::Status ExportTraceToDatabase(TraceProcessor* trace_processor, const std::string& output_name) { - PERFETTO_CHECK(output_name.find('\'') == std::string::npos); - { - base::ScopedFile fd(base::OpenFile(output_name, O_CREAT | O_RDWR, 0600)); - if (!fd) - return base::ErrStatus("Failed to create file: %s", output_name.c_str()); - int res = ftruncate(fd.get(), 0); - PERFETTO_CHECK(res == 0); - } - - std::string attach_sql = "ATTACH DATABASE '" + - MakeExportFileUri(output_name) + - "' AS perfetto_export"; - auto attach_it = trace_processor->ExecuteQuery(attach_sql); - bool attach_has_more = attach_it.Next(); - PERFETTO_DCHECK(!attach_has_more); - - RETURN_IF_ERROR(attach_it.Status()); - - // The export database is written once and regenerated from the trace on - // failure, so trade durability for speed and lower I/O. - for (const char* pragma : {"PRAGMA perfetto_export.journal_mode=OFF", - "PRAGMA perfetto_export.synchronous=OFF"}) { - auto pragma_it = trace_processor->ExecuteQuery(pragma); - while (pragma_it.Next()) { - } - RETURN_IF_ERROR(pragma_it.Status()); - } - - // Export real and virtual tables. - auto tables_it = - trace_processor->ExecuteQuery("SELECT name FROM perfetto_tables"); - while (tables_it.Next()) { - std::string table_name = tables_it.Get(0).string_value; - PERFETTO_CHECK(!base::Contains(table_name, '\'')); - std::string export_sql = "CREATE TABLE perfetto_export." + table_name + - " AS SELECT * FROM " + table_name; - - auto export_it = trace_processor->ExecuteQuery(export_sql); - bool export_has_more = export_it.Next(); - PERFETTO_DCHECK(!export_has_more); - RETURN_IF_ERROR(export_it.Status()); - } - RETURN_IF_ERROR(tables_it.Status()); - - // Export views. - auto views_it = trace_processor->ExecuteQuery( - "SELECT sql FROM sqlite_master WHERE type='view'"); - while (views_it.Next()) { - std::string sql = views_it.Get(0).string_value; - // View statements are of the form "CREATE VIEW name AS stmt". We need to - // rewrite name to point to the exported db. - const std::string kPrefix = "CREATE VIEW "; - PERFETTO_CHECK(sql.find(kPrefix) == 0); - sql = sql.substr(0, kPrefix.size()) + "perfetto_export." + - sql.substr(kPrefix.size()); - - auto export_it = trace_processor->ExecuteQuery(sql); - bool export_has_more = export_it.Next(); - PERFETTO_DCHECK(!export_has_more); - RETURN_IF_ERROR(export_it.Status()); - } - RETURN_IF_ERROR(views_it.Status()); - - auto detach_it = - trace_processor->ExecuteQuery("DETACH DATABASE perfetto_export"); - bool detach_has_more = detach_it.Next(); - PERFETTO_DCHECK(!detach_has_more); - return detach_it.Status(); + return ExportTrace(trace_processor, TraceProcessor::ExportFormat::kSqlite, + output_name); } base::Status ExportTrace(TraceProcessor* trace_processor, diff --git a/src/trace_processor/shell/shell_utils_unittest.cc b/src/trace_processor/shell/shell_utils_unittest.cc index 95dce0e2826..a97ae7a33c8 100644 --- a/src/trace_processor/shell/shell_utils_unittest.cc +++ b/src/trace_processor/shell/shell_utils_unittest.cc @@ -29,7 +29,9 @@ #include "perfetto/ext/base/temp_file.h" #include "perfetto/ext/base/utils.h" #include "perfetto/trace_processor/basic_types.h" +#include "perfetto/trace_processor/io.h" #include "perfetto/trace_processor/trace_processor.h" +#include "src/trace_processor/local_file_system.h" // no-include-violation-check #include "test/gtest_and_gmock.h" namespace perfetto::trace_processor { @@ -73,6 +75,13 @@ std::string MakeAttachUri(const std::string& path) { #define DisableFuchsia(x) x #endif +class FileSystemPlatform final : public TraceProcessor::PlatformInterface { + public: + io::FileSystem* GetFileSystem() override { + return io::CreateLocalFileSystem(); + } +}; + // Verifies the export produces an on-disk SQLite database that can be read back // by a standalone SQLite connection and re-attached and queried by a trace // processor. @@ -83,7 +92,8 @@ TEST(ShellUtilsTest, DisableFuchsia(ExportTraceToDatabaseWritesToDisk)) { auto remove_output = base::OnScopeExit([&output] { base::Unlink(output.c_str()); }); - auto tp = TraceProcessor::CreateInstance(Config()); + FileSystemPlatform platform; + auto tp = TraceProcessor::CreateInstance(Config(), &platform); int64_t expected_tables = ScalarCount(tp.get(), "SELECT COUNT(*) FROM " diff --git a/src/trace_processor/shell/subcommand_flags_unittest.cc b/src/trace_processor/shell/subcommand_flags_unittest.cc index 82fb9086a7d..19382220b31 100644 --- a/src/trace_processor/shell/subcommand_flags_unittest.cc +++ b/src/trace_processor/shell/subcommand_flags_unittest.cc @@ -115,8 +115,16 @@ struct OutputPath { class TestFileSystem final : public io::FileSystem { public: base::Status OpenFile(const std::string&, - std::unique_ptr* file) override { - file->reset(); + const io::FileOpenOptions&, + std::unique_ptr*) override { + return base::ErrStatus("not implemented"); + } + + base::Status DeleteFile(const std::string&) override { + return base::ErrStatus("not implemented"); + } + + base::Status FileExists(const std::string&, bool*) override { return base::ErrStatus("not implemented"); } }; diff --git a/src/trace_processor/sqlite/BUILD.gn b/src/trace_processor/sqlite/BUILD.gn index 1643dbe2168..8022b269701 100644 --- a/src/trace_processor/sqlite/BUILD.gn +++ b/src/trace_processor/sqlite/BUILD.gn @@ -19,6 +19,8 @@ assert(enable_perfetto_trace_processor_sqlite) source_set("sqlite") { sources = [ "committed_state_manager.h", + "file_system_vfs.cc", + "file_system_vfs.h", "module_state_manager.cc", "module_state_manager.h", "scoped_db.h", @@ -27,6 +29,9 @@ source_set("sqlite") { "sqlite_connection.cc", "sqlite_connection.h", "sqlite_database.h", + "sqlite_export.cc", + "sqlite_export.h", + "sqlite_tagged_args.h", "sqlite_utils.cc", "sqlite_utils.h", ] @@ -36,6 +41,7 @@ source_set("sqlite") { "../../../gn:sqlite", "../../../include/perfetto/trace_processor", "../../../include/perfetto/trace_processor:basic_types", + "../../../include/perfetto/trace_processor:io", "../../../protos/perfetto/trace/ftrace:zero", "../../../protos/perfetto/trace_processor:zero", "../../base", @@ -53,16 +59,20 @@ source_set("sqlite") { perfetto_unittest_source_set("unittests") { testonly = true sources = [ + "file_system_vfs_unittest.cc", "module_state_manager_unittest.cc", "sql_source_unittest.cc", "sqlite_utils_unittest.cc", ] deps = [ ":sqlite", + "../:local_file_system", "../../../gn:default_deps", "../../../gn:gtest_and_gmock", "../../../gn:sqlite", + "../../../include/perfetto/ext/base", "../../../include/perfetto/trace_processor:basic_types", + "../../../include/perfetto/trace_processor:io", "../../base", "../../base:test_support", "../containers", diff --git a/src/trace_processor/sqlite/file_system_vfs.cc b/src/trace_processor/sqlite/file_system_vfs.cc new file mode 100644 index 00000000000..6000ff65085 --- /dev/null +++ b/src/trace_processor/sqlite/file_system_vfs.cc @@ -0,0 +1,380 @@ +/* + * Copyright (C) 2026 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/sqlite/file_system_vfs.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "perfetto/base/compiler.h" +#include "perfetto/base/status.h" +#include "perfetto/ext/base/status_macros.h" +#include "perfetto/trace_processor/io.h" + +namespace perfetto::trace_processor { +namespace { + +std::atomic g_next_vfs_id{0}; + +struct OpenFile { + sqlite3_file sqlite_file{}; + std::unique_ptr file; + io::FileSystem* file_system = nullptr; + std::string path; + bool delete_on_close = false; +}; + +OpenFile* ToOpenFile(sqlite3_file* file) { + return reinterpret_cast(file); +} + +int Close(sqlite3_file* sqlite_file) { + OpenFile* file = ToOpenFile(sqlite_file); + file->file.reset(); + if (file->delete_on_close) { + base::ignore_result(file->file_system->DeleteFile(file->path)); + } + file->~OpenFile(); + return SQLITE_OK; +} + +int Read(sqlite3_file* sqlite_file, + void* data, + int size, + sqlite3_int64 offset) { + if (size < 0 || offset < 0) { + return SQLITE_IOERR_READ; + } + OpenFile* file = ToOpenFile(sqlite_file); + size_t bytes_read = 0; + if (!file->file + ->ReadAt(static_cast(offset), data, + static_cast(size), &bytes_read) + .ok()) { + return SQLITE_IOERR_READ; + } + if (bytes_read != static_cast(size)) { + auto* bytes = static_cast(data); + std::fill(bytes + bytes_read, bytes + size, 0); + return SQLITE_IOERR_SHORT_READ; + } + return SQLITE_OK; +} + +int Write(sqlite3_file* sqlite_file, + const void* data, + int size, + sqlite3_int64 offset) { + if (size < 0 || offset < 0) { + return SQLITE_IOERR_WRITE; + } + base::Status status = ToOpenFile(sqlite_file) + ->file->WriteAt(static_cast(offset), data, + static_cast(size)); + return status.ok() ? SQLITE_OK : SQLITE_IOERR_WRITE; +} + +int Truncate(sqlite3_file* sqlite_file, sqlite3_int64 size) { + if (size < 0) { + return SQLITE_IOERR_TRUNCATE; + } + base::Status status = + ToOpenFile(sqlite_file)->file->Truncate(static_cast(size)); + return status.ok() ? SQLITE_OK : SQLITE_IOERR_TRUNCATE; +} + +int Sync(sqlite3_file* sqlite_file, int) { + return ToOpenFile(sqlite_file)->file->Flush().ok() ? SQLITE_OK + : SQLITE_IOERR_FSYNC; +} + +int FileSize(sqlite3_file* sqlite_file, sqlite3_int64* size) { + uint64_t result = 0; + if (!ToOpenFile(sqlite_file)->file->GetSize(&result).ok() || + result > + static_cast(std::numeric_limits::max())) { + return SQLITE_IOERR_FSTAT; + } + *size = static_cast(result); + return SQLITE_OK; +} + +int Lock(sqlite3_file*, int) { + return SQLITE_OK; +} + +int Unlock(sqlite3_file*, int) { + return SQLITE_OK; +} + +int CheckReservedLock(sqlite3_file*, int* result) { + *result = 0; + return SQLITE_OK; +} + +int FileControl(sqlite3_file*, int, void*) { + return SQLITE_NOTFOUND; +} + +int SectorSize(sqlite3_file*) { + return 4096; +} + +int DeviceCharacteristics(sqlite3_file*) { + return 0; +} + +const sqlite3_io_methods kIoMethods = { + 1, + &Close, + &Read, + &Write, + &Truncate, + &Sync, + &FileSize, + &Lock, + &Unlock, + &CheckReservedLock, + &FileControl, + &SectorSize, + &DeviceCharacteristics, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, +}; + +} // namespace + +class SqliteFileSystemVfs::Impl { + public: + // |file_system| is borrowed and must outlive this VFS. + explicit Impl(io::FileSystem* file_system) + : file_system_(file_system), + name_("perfetto_file_system_" + + std::to_string(g_next_vfs_id.fetch_add(1))) { + parent_ = sqlite3_vfs_find(nullptr); + vfs_.iVersion = 1; + vfs_.szOsFile = static_cast(sizeof(OpenFile)); + vfs_.mxPathname = parent_ ? parent_->mxPathname : 1024; + vfs_.zName = name_.c_str(); + vfs_.pAppData = this; + vfs_.xOpen = &Open; + vfs_.xDelete = &Delete; + vfs_.xAccess = &Access; + vfs_.xFullPathname = &FullPathname; + vfs_.xDlOpen = &DlOpen; + vfs_.xDlError = &DlError; + vfs_.xDlSym = &DlSym; + vfs_.xDlClose = &DlClose; + vfs_.xRandomness = &Randomness; + vfs_.xSleep = &Sleep; + vfs_.xCurrentTime = &CurrentTime; + vfs_.xGetLastError = &GetLastError; + } + + base::Status Register() { + if (sqlite3_vfs_register(&vfs_, 0) != SQLITE_OK) { + return base::ErrStatus("Failed to register SQLite file system VFS"); + } + registered_ = true; + return base::OkStatus(); + } + + ~Impl() { + if (registered_) { + sqlite3_vfs_unregister(&vfs_); + } + } + + const char* name() const { return name_.c_str(); } + + private: + static Impl* From(sqlite3_vfs* vfs) { + return static_cast(vfs->pAppData); + } + + static int Open(sqlite3_vfs* vfs, + const char* path, + sqlite3_file* sqlite_file, + int flags, + int* out_flags) { + Impl* self = From(vfs); + std::string actual_path = + path ? path + : self->name_ + "_temp_" + std::to_string(self->next_temp_id_++); + + if ((flags & SQLITE_OPEN_EXCLUSIVE) && (flags & SQLITE_OPEN_CREATE)) { + bool exists = false; + if (!self->file_system_->FileExists(actual_path, &exists).ok() || + exists) { + return SQLITE_CANTOPEN; + } + } + + io::FileOpenOptions options; + if (flags & SQLITE_OPEN_READONLY) { + options.access = io::FileAccess::kReadOnly; + } else { + options.access = io::FileAccess::kReadWrite; + } + options.create = (flags & SQLITE_OPEN_CREATE) != 0; + + std::unique_ptr opened; + if (!self->file_system_->OpenFile(actual_path, options, &opened).ok()) { + return SQLITE_CANTOPEN; + } + + auto* file = new (sqlite_file) OpenFile(); + file->file = std::move(opened); + file->file_system = self->file_system_; + file->path = std::move(actual_path); + file->delete_on_close = (flags & SQLITE_OPEN_DELETEONCLOSE) != 0; + file->sqlite_file.pMethods = &kIoMethods; + if (out_flags) { + *out_flags = flags; + } + return SQLITE_OK; + } + + static int Delete(sqlite3_vfs* vfs, const char* path, int) { + if (!path) { + return SQLITE_IOERR_DELETE; + } + return From(vfs)->file_system_->DeleteFile(path).ok() ? SQLITE_OK + : SQLITE_IOERR_DELETE; + } + + static int Access(sqlite3_vfs* vfs, const char* path, int, int* result) { + if (!path) { + return SQLITE_IOERR_ACCESS; + } + bool exists = false; + if (!From(vfs)->file_system_->FileExists(path, &exists).ok()) { + return SQLITE_IOERR_ACCESS; + } + *result = exists ? 1 : 0; + return SQLITE_OK; + } + + static int FullPathname(sqlite3_vfs*, + const char* path, + int output_size, + char* output) { + if (!path || output_size <= 0 || + strlen(path) >= static_cast(output_size)) { + return SQLITE_CANTOPEN; + } + memcpy(output, path, strlen(path) + 1); + return SQLITE_OK; + } + + static void* DlOpen(sqlite3_vfs* vfs, const char* path) { + sqlite3_vfs* parent = From(vfs)->parent_; + return parent && parent->xDlOpen ? parent->xDlOpen(parent, path) : nullptr; + } + + static void DlError(sqlite3_vfs* vfs, int size, char* error) { + sqlite3_vfs* parent = From(vfs)->parent_; + if (parent && parent->xDlError) { + parent->xDlError(parent, size, error); + } else if (size > 0) { + error[0] = '\0'; + } + } + + static void (*DlSym(sqlite3_vfs* vfs, void* handle, const char* symbol))() { + sqlite3_vfs* parent = From(vfs)->parent_; + return parent && parent->xDlSym ? parent->xDlSym(parent, handle, symbol) + : nullptr; + } + + static void DlClose(sqlite3_vfs* vfs, void* handle) { + sqlite3_vfs* parent = From(vfs)->parent_; + if (parent && parent->xDlClose) { + parent->xDlClose(parent, handle); + } + } + + static int Randomness(sqlite3_vfs* vfs, int size, char* output) { + sqlite3_vfs* parent = From(vfs)->parent_; + if (parent && parent->xRandomness) { + return parent->xRandomness(parent, size, output); + } + memset(output, 0, static_cast(size)); + return size; + } + + static int Sleep(sqlite3_vfs* vfs, int microseconds) { + sqlite3_vfs* parent = From(vfs)->parent_; + return parent && parent->xSleep ? parent->xSleep(parent, microseconds) + : microseconds; + } + + static int CurrentTime(sqlite3_vfs* vfs, double* time) { + sqlite3_vfs* parent = From(vfs)->parent_; + return parent && parent->xCurrentTime ? parent->xCurrentTime(parent, time) + : SQLITE_ERROR; + } + + static int GetLastError(sqlite3_vfs* vfs, int size, char* error) { + sqlite3_vfs* parent = From(vfs)->parent_; + return parent && parent->xGetLastError + ? parent->xGetLastError(parent, size, error) + : 0; + } + + // Borrowed; must outlive the VFS (see io.h platform contract). + io::FileSystem* file_system_ = nullptr; + std::string name_; + sqlite3_vfs* parent_ = nullptr; + sqlite3_vfs vfs_{}; + uint64_t next_temp_id_ = 0; + bool registered_ = false; +}; + +base::StatusOr> +SqliteFileSystemVfs::Create(io::FileSystem* file_system) { + if (!file_system) { + return base::ErrStatus("SQLite file system is null"); + } + auto impl = std::make_unique(file_system); + RETURN_IF_ERROR(impl->Register()); + return std::unique_ptr( + new SqliteFileSystemVfs(std::move(impl))); +} + +SqliteFileSystemVfs::SqliteFileSystemVfs(std::unique_ptr impl) + : impl_(std::move(impl)) {} +SqliteFileSystemVfs::~SqliteFileSystemVfs() = default; + +const char* SqliteFileSystemVfs::name() const { + return impl_->name(); +} + +} // namespace perfetto::trace_processor diff --git a/src/trace_processor/sqlite/file_system_vfs.h b/src/trace_processor/sqlite/file_system_vfs.h new file mode 100644 index 00000000000..be914930d72 --- /dev/null +++ b/src/trace_processor/sqlite/file_system_vfs.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2026 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. + */ + +#ifndef SRC_TRACE_PROCESSOR_SQLITE_FILE_SYSTEM_VFS_H_ +#define SRC_TRACE_PROCESSOR_SQLITE_FILE_SYSTEM_VFS_H_ + +#include + +#include "perfetto/base/status.h" +#include "perfetto/ext/base/status_or.h" + +namespace perfetto::trace_processor { + +namespace io { +class FileSystem; +} // namespace io + +// A scoped SQLite VFS backed by a Trace Processor FileSystem. Each instance has +// a unique SQLite VFS name and must outlive every SQLite database opened on it. +class SqliteFileSystemVfs { + public: + static base::StatusOr> Create( + io::FileSystem*); + + ~SqliteFileSystemVfs(); + + SqliteFileSystemVfs(const SqliteFileSystemVfs&) = delete; + SqliteFileSystemVfs& operator=(const SqliteFileSystemVfs&) = delete; + + const char* name() const; + + private: + class Impl; + + explicit SqliteFileSystemVfs(std::unique_ptr); + + std::unique_ptr impl_; +}; + +} // namespace perfetto::trace_processor + +#endif // SRC_TRACE_PROCESSOR_SQLITE_FILE_SYSTEM_VFS_H_ diff --git a/src/trace_processor/sqlite/file_system_vfs_unittest.cc b/src/trace_processor/sqlite/file_system_vfs_unittest.cc new file mode 100644 index 00000000000..f81f018cb5c --- /dev/null +++ b/src/trace_processor/sqlite/file_system_vfs_unittest.cc @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2026 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/sqlite/file_system_vfs.h" + +#include + +#include +#include + +#include "perfetto/ext/base/file_utils.h" +#include "perfetto/ext/base/temp_file.h" +#include "perfetto/trace_processor/io.h" +#include "src/base/test/status_matchers.h" +#include "src/trace_processor/local_file_system.h" +#include "src/trace_processor/sqlite/scoped_db.h" +#include "src/trace_processor/sqlite/sqlite_connection.h" +#include "test/gtest_and_gmock.h" + +namespace perfetto::trace_processor { +namespace { + +TEST(SqliteFileSystemVfsTest, CreatesReadableDatabase) { + // Ensure SQLite is initialized before registering another VFS. + auto initialization_connection = + SqliteConnection::CreateConnectionToNewDatabase(); + ASSERT_NE(initialization_connection, nullptr); + + base::TempDir dir = base::TempDir::Create(); + std::string path = dir.path() + "/database.sqlite"; + auto file_system = io::CreateLocalFileSystem(); + ASSERT_OK_AND_ASSIGN(auto vfs, SqliteFileSystemVfs::Create(file_system)); + + sqlite3* raw_db = nullptr; + ASSERT_EQ( + sqlite3_open_v2(path.c_str(), &raw_db, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, vfs->name()), + SQLITE_OK); + ScopedDb db(raw_db); + ASSERT_EQ(sqlite3_exec(db.get(), + "CREATE TABLE data(value INTEGER);" + "INSERT INTO data VALUES(42);", + nullptr, nullptr, nullptr), + SQLITE_OK); + db.reset(); + vfs.reset(); + + std::string contents; + ASSERT_TRUE(base::ReadFile(path, &contents)); + ASSERT_GE(contents.size(), 16u); + EXPECT_EQ(contents.substr(0, 16), std::string("SQLite format 3\0", 16)); + + ASSERT_OK_AND_ASSIGN(vfs, SqliteFileSystemVfs::Create(file_system)); + raw_db = nullptr; + ASSERT_EQ( + sqlite3_open_v2(path.c_str(), &raw_db, SQLITE_OPEN_READONLY, vfs->name()), + SQLITE_OK); + db.reset(raw_db); + sqlite3_stmt* raw_stmt = nullptr; + ASSERT_EQ(sqlite3_prepare_v2(db.get(), "SELECT value FROM data", -1, + &raw_stmt, nullptr), + SQLITE_OK); + ScopedStmt stmt(raw_stmt); + ASSERT_EQ(sqlite3_step(stmt.get()), SQLITE_ROW); + EXPECT_EQ(sqlite3_column_int64(stmt.get(), 0), 42); + stmt.reset(); + db.reset(); + + ASSERT_OK(file_system->DeleteFile(path)); +} + +TEST(SqliteFileSystemVfsTest, NoopFileSystemCannotOpenDatabase) { + auto initialization_connection = + SqliteConnection::CreateConnectionToNewDatabase(); + ASSERT_NE(initialization_connection, nullptr); + auto noop_file_system = io::CreateNoopFileSystem(); + ASSERT_OK_AND_ASSIGN(auto vfs, SqliteFileSystemVfs::Create(noop_file_system)); + sqlite3* raw_db = nullptr; + EXPECT_NE( + sqlite3_open_v2("database", &raw_db, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, vfs->name()), + SQLITE_OK); + if (raw_db) { + sqlite3_close(raw_db); + } +} + +} // namespace +} // namespace perfetto::trace_processor diff --git a/src/trace_processor/sqlite/sqlite_export.cc b/src/trace_processor/sqlite/sqlite_export.cc new file mode 100644 index 00000000000..68e3c6d8445 --- /dev/null +++ b/src/trace_processor/sqlite/sqlite_export.cc @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2026 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/sqlite/sqlite_export.h" + +#include +#include +#include +#include + +#include "perfetto/base/logging.h" +#include "perfetto/base/status.h" +#include "perfetto/ext/base/status_macros.h" +#include "perfetto/ext/base/string_utils.h" +#include "perfetto/trace_processor/io.h" +#include "perfetto/trace_processor/trace_processor.h" +#include "src/trace_processor/sqlite/file_system_vfs.h" + +namespace perfetto::trace_processor { +namespace { + +constexpr char kExportDbName[] = "perfetto_export"; + +std::string MakeFileUri(const std::string& path, const char* vfs_name) { + std::string uri = "file:"; + for (char c : path) { + bool unreserved = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || + (c >= '0' && c <= '9') || c == '-' || c == '.' || + c == '_' || c == '~' || c == '/' || c == ':'; + if (unreserved) { + uri.push_back(c); + } else { + base::StackString<4> escaped("%%%02X", static_cast(c)); + uri.append(escaped.c_str()); + } + } + uri.append("?vfs="); + uri.append(vfs_name); + return uri; +} + +base::Status ExecuteToCompletion(TraceProcessor* trace_processor, + const std::string& sql) { + auto iterator = trace_processor->ExecuteQuery(sql); + while (iterator.Next()) { + } + return iterator.Status(); +} + +base::Status ExportAttachedDatabase(TraceProcessor* trace_processor) { + // The export database is disposable and regenerated from the trace on + // failure, so trade durability for speed and lower I/O. + RETURN_IF_ERROR(ExecuteToCompletion( + trace_processor, + "PRAGMA " + std::string(kExportDbName) + ".journal_mode=OFF")); + RETURN_IF_ERROR(ExecuteToCompletion( + trace_processor, + "PRAGMA " + std::string(kExportDbName) + ".synchronous=OFF")); + + // Preserve the existing SQLite export contract: materialize all tables + // visible through perfetto_tables, including runtime SQL tables and virtual + // tables. + auto tables = + trace_processor->ExecuteQuery("SELECT name FROM perfetto_tables"); + while (tables.Next()) { + std::string table_name = tables.Get(0).string_value; + PERFETTO_CHECK(!base::Contains(table_name, '\'')); + RETURN_IF_ERROR(ExecuteToCompletion( + trace_processor, "CREATE TABLE " + std::string(kExportDbName) + "." + + table_name + " AS SELECT * FROM " + table_name)); + } + RETURN_IF_ERROR(tables.Status()); + + // Preserve SQL views as views over the exported tables. + auto views = trace_processor->ExecuteQuery( + "SELECT sql FROM sqlite_master WHERE type='view'"); + while (views.Next()) { + std::string sql = views.Get(0).string_value; + const std::string kPrefix = "CREATE VIEW "; + PERFETTO_CHECK(base::StartsWith(sql, kPrefix)); + sql = sql.substr(0, kPrefix.size()) + std::string(kExportDbName) + "." + + sql.substr(kPrefix.size()); + RETURN_IF_ERROR(ExecuteToCompletion(trace_processor, sql)); + } + return views.Status(); +} + +} // namespace + +base::Status ExportSqliteDatabase(TraceProcessor* trace_processor, + io::FileSystem* file_system, + const std::string& path) { + if (!trace_processor) { + return base::ErrStatus("Trace Processor is null"); + } + if (!file_system) { + return base::ErrStatus("SQLite export filesystem is null"); + } + if (path.empty()) { + return base::ErrStatus("SQLite export path is empty"); + } + + io::FileOpenOptions options; + options.access = io::FileAccess::kReadWrite; + options.create = true; + options.truncate = true; + std::unique_ptr output; + RETURN_IF_ERROR(file_system->OpenFile(path, options, &output)); + output.reset(); + + ASSIGN_OR_RETURN(auto vfs, SqliteFileSystemVfs::Create(file_system)); + std::string uri = MakeFileUri(path, vfs->name()); + RETURN_IF_ERROR(ExecuteToCompletion( + trace_processor, "ATTACH DATABASE '" + uri + "' AS " + kExportDbName)); + + base::Status export_status = ExportAttachedDatabase(trace_processor); + base::Status detach_status = ExecuteToCompletion( + trace_processor, "DETACH DATABASE " + std::string(kExportDbName)); + if (!detach_status.ok()) { + // The connection can still hold sqlite3_file objects which reference this + // VFS. Keep the VFS registered rather than leaving dangling callbacks. + base::ignore_result(vfs.release()); + } + if (!export_status.ok()) { + return export_status; + } + return detach_status; +} + +} // namespace perfetto::trace_processor diff --git a/src/trace_processor/sqlite/sqlite_export.h b/src/trace_processor/sqlite/sqlite_export.h new file mode 100644 index 00000000000..83ecd08f4cf --- /dev/null +++ b/src/trace_processor/sqlite/sqlite_export.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2026 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. + */ + +#ifndef SRC_TRACE_PROCESSOR_SQLITE_SQLITE_EXPORT_H_ +#define SRC_TRACE_PROCESSOR_SQLITE_SQLITE_EXPORT_H_ + +#include +#include + +#include "perfetto/base/status.h" + +namespace perfetto::trace_processor { + +namespace io { +class FileSystem; +} // namespace io + +class TraceProcessor; + +// Exports the current SQL-visible tables and views into a SQLite database on +// |file_system|. |file_system| is borrowed and must outlive the call. The +// database at |path| is replaced. +base::Status ExportSqliteDatabase(TraceProcessor*, + io::FileSystem* file_system, + const std::string& path); + +} // namespace perfetto::trace_processor + +#endif // SRC_TRACE_PROCESSOR_SQLITE_SQLITE_EXPORT_H_ diff --git a/src/trace_processor/sqlite/sqlite_tagged_args.h b/src/trace_processor/sqlite/sqlite_tagged_args.h new file mode 100644 index 00000000000..d5a625da9d1 --- /dev/null +++ b/src/trace_processor/sqlite/sqlite_tagged_args.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2026 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. + */ + +#ifndef SRC_TRACE_PROCESSOR_SQLITE_SQLITE_TAGGED_ARGS_H_ +#define SRC_TRACE_PROCESSOR_SQLITE_SQLITE_TAGGED_ARGS_H_ + +#include // IWYU pragma: export + +#include +#include +#include +#include +#include + +#include "perfetto/base/status.h" +#include "perfetto/ext/base/status_macros.h" +#include "perfetto/ext/base/status_or.h" +#include "src/trace_processor/sqlite/bindings/sqlite_type.h" +#include "src/trace_processor/sqlite/bindings/sqlite_value.h" + +namespace perfetto::trace_processor::sqlite { + +// Support for functions taking a flat "tagged token list" argument +// convention: a tag string token followed by a fixed number of value tokens, +// with tags repeatable to express lists of tuples, e.g. +// +// my_fn('view', 'PIVOT', 'filter', 'SHOW_STACK', 'foo.*') +// +// This is the standard convention for passing structured configuration to +// intrinsic functions which back (or will back) PerfettoSQL operators: it +// keeps generated SQL readable and hand-writable while allowing arbitrary +// repeated tuples. Functions using it should parse their arguments eagerly +// and report precise errors so mistakes surface at the call site. + +// One accepted tag: its name, the number of value tokens following it and a +// handler invoked with a pointer to those values. +struct TaggedArgSpec { + const char* tag; + uint32_t arity; + std::function handler; +}; + +// Reads a value token which must be non-null text. |context| is used for +// error messages and should identify the function and tag. +inline base::StatusOr TaggedArgText(const char* context, + sqlite3_value* value) { + if (sqlite::value::Type(value) != sqlite::Type::kText) { + return base::ErrStatus("%s: expected a string value", context); + } + return std::string(sqlite::value::Text(value)); +} + +// Walks |argv| dispatching each tag to the matching spec. Returns an error +// on unknown tags, missing values or handler failure. +inline base::Status ParseTaggedArgs( + const char* fn_name, + int argc, + sqlite3_value** argv, + std::initializer_list specs) { + for (int i = 0; i < argc;) { + if (sqlite::value::Type(argv[i]) != sqlite::Type::kText) { + return base::ErrStatus("%s: expected a tag string at argument %d", + fn_name, i); + } + const char* tag = sqlite::value::Text(argv[i]); + const TaggedArgSpec* match = nullptr; + for (const TaggedArgSpec& spec : specs) { + if (strcmp(spec.tag, tag) == 0) { + match = &spec; + break; + } + } + if (!match) { + return base::ErrStatus("%s: unknown tag '%s' at argument %d", fn_name, + tag, i); + } + if (i + 1 + static_cast(match->arity) > argc) { + return base::ErrStatus("%s: tag '%s' expects %u value(s)", fn_name, tag, + match->arity); + } + RETURN_IF_ERROR(match->handler(argv + i + 1)); + i += 1 + static_cast(match->arity); + } + return base::OkStatus(); +} + +} // namespace perfetto::trace_processor::sqlite + +#endif // SRC_TRACE_PROCESSOR_SQLITE_SQLITE_TAGGED_ARGS_H_ diff --git a/src/trace_processor/storage/stats.h b/src/trace_processor/storage/stats.h index a54d76d4ede..097a9da404b 100644 --- a/src/trace_processor/storage/stats.h +++ b/src/trace_processor/storage/stats.h @@ -678,6 +678,12 @@ namespace perfetto::trace_processor::stats { "uses a `DISCARD` buffer. This configuration is strongly discouraged " \ "and can cause mysterious data loss in the trace. Please use " \ "`RING_BUFFER` buffers instead."), \ + F(long_trace_mode_bytes_overwritten, kIndexed, kDataLoss, kTrace, Scope::kMachineAndTrace, \ + "Number of bytes this buffer overwrote while the trace was collected " \ + "in streaming mode (`write_into_file` with a periodic " \ + "`file_write_period_ms`). The overwritten bytes were never written " \ + "out, so they are missing from the trace file. Consider a larger " \ + "buffer or a shorter `file_write_period_ms`."), \ F(hprof_string_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \ "Number of strings encountered."), \ F(hprof_class_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \ diff --git a/src/trace_processor/trace_database_integrationtest.cc b/src/trace_processor/trace_database_integrationtest.cc index f3d9256f25e..90087d0c6f2 100644 --- a/src/trace_processor/trace_database_integrationtest.cc +++ b/src/trace_processor/trace_database_integrationtest.cc @@ -65,29 +65,68 @@ constexpr size_t kMaxChunkSize = 4ul * 1024 * 1024; class FailingFile final : public io::File { public: - base::Status Write(const void*, size_t) override { + base::Status ReadAt(uint64_t, void*, size_t, size_t*) override { + return base::ErrStatus("injected read failure"); + } + + base::Status WriteAt(uint64_t, const void*, size_t) override { return base::ErrStatus("injected write failure"); } + + base::Status Truncate(uint64_t) override { + return base::ErrStatus("injected truncate failure"); + } + + base::Status GetSize(uint64_t*) override { + return base::ErrStatus("injected size failure"); + } + + base::Status Flush() override { + return base::ErrStatus("injected flush failure"); + } }; class FailingWriteFileSystem final : public io::FileSystem { public: base::Status OpenFile(const std::string&, + const io::FileOpenOptions&, std::unique_ptr* file) override { file->reset(new FailingFile()); return base::OkStatus(); } + + base::Status DeleteFile(const std::string&) override { + return base::ErrStatus("injected delete failure"); + } + + base::Status FileExists(const std::string&, bool*) override { + return base::ErrStatus("injected exists failure"); + } }; class CountingFile final : public io::File { public: explicit CountingFile(size_t* write_count) : write_count_(write_count) {} - base::Status Write(const void*, size_t) override { + base::Status ReadAt(uint64_t, void*, size_t, size_t*) override { + return base::ErrStatus("not supported"); + } + + base::Status WriteAt(uint64_t, const void*, size_t) override { ++*write_count_; return base::OkStatus(); } + base::Status Truncate(uint64_t) override { + return base::ErrStatus("not supported"); + } + + base::Status GetSize(uint64_t*) override { + return base::ErrStatus("not supported"); + } + + base::Status Flush() override { return base::ErrStatus("not supported"); } + private: size_t* write_count_; }; @@ -95,11 +134,20 @@ class CountingFile final : public io::File { class CountingFileSystem final : public io::FileSystem { public: base::Status OpenFile(const std::string&, + const io::FileOpenOptions&, std::unique_ptr* file) override { file->reset(new CountingFile(&write_count_)); return base::OkStatus(); } + base::Status DeleteFile(const std::string&) override { + return base::ErrStatus("not supported"); + } + + base::Status FileExists(const std::string&, bool*) override { + return base::ErrStatus("not supported"); + } + size_t write_count() const { return write_count_; } private: @@ -194,7 +242,7 @@ TEST(TraceProcessorCustomConfigTest, ExportJsonRequiresPlatformFileSystem) { TEST(TraceProcessorCustomConfigTest, ExportJsonRejectsIntegerFileDescriptor) { auto file_system = io::CreateLocalFileSystem(); - FileSystemPlatform platform(file_system.get()); + FileSystemPlatform platform(file_system); Config config; config.enable_sql_file_access = true; auto processor = TraceProcessor::CreateInstance(config, &platform); @@ -212,7 +260,7 @@ TEST(TraceProcessorCustomConfigTest, ExportJsonUsesConfiguredFileSystem) { ASSERT_EQ(path.find('\''), std::string::npos); auto file_system = io::CreateLocalFileSystem(); - FileSystemPlatform platform(file_system.get()); + FileSystemPlatform platform(file_system); Config config; config.enable_sql_file_access = true; auto processor = TraceProcessor::CreateInstance(config, &platform); @@ -231,7 +279,7 @@ TEST(TraceProcessorCustomConfigTest, RpcImplicitResetPreservesSqlFileAccessGrant) { base::TempDir dir = base::TempDir::Create(); auto file_system = io::CreateLocalFileSystem(); - FileSystemPlatform platform(file_system.get()); + FileSystemPlatform platform(file_system); Config config; config.enable_sql_file_access = true; auto processor = TraceProcessor::CreateInstance(config, &platform); @@ -300,7 +348,7 @@ TEST(TraceProcessorCustomConfigTest, ASSERT_EQ(path.find('\''), std::string::npos); auto file_system = io::CreateLocalFileSystem(); - FileSystemPlatform platform(file_system.get()); + FileSystemPlatform platform(file_system); Config config; config.enable_sql_file_access = true; auto processor = TraceProcessor::CreateInstance(config, &platform); @@ -1291,6 +1339,13 @@ std::vector ReadTarMembers(const std::string& tar) { return members; } +TEST_F(TraceProcessorIntegrationTest, ExportSqliteRequiresFilePath) { + StringExportOutput output; + EXPECT_THAT( + Processor()->Export(TraceProcessor::ExportFormat::kSqlite, &output), + IsError()); +} + TEST_F(TraceProcessorIntegrationTest, ExportPerfetto) { ASSERT_OK(LoadTrace("example_android_trace_30s.pb")); diff --git a/src/trace_processor/trace_processor.cc b/src/trace_processor/trace_processor.cc index 491511b28f9..107c38b96c1 100644 --- a/src/trace_processor/trace_processor.cc +++ b/src/trace_processor/trace_processor.cc @@ -29,7 +29,6 @@ namespace perfetto::trace_processor { TraceProcessor::MetatraceConfig::MetatraceConfig() = default; -TraceProcessor_PlatformInterface::~TraceProcessor_PlatformInterface() = default; // static std::unique_ptr TraceProcessor::CreateInstance( diff --git a/src/trace_processor/trace_processor_context.cc b/src/trace_processor/trace_processor_context.cc index 24c205e1080..847ead6a491 100644 --- a/src/trace_processor/trace_processor_context.cc +++ b/src/trace_processor/trace_processor_context.cc @@ -23,6 +23,7 @@ #include "perfetto/base/logging.h" #include "perfetto/trace_processor/basic_types.h" +#include "perfetto/trace_processor/trace_processor.h" #include "src/trace_processor/forwarding_trace_parser.h" #include "src/trace_processor/importers/common/args_translation_table.h" #include "src/trace_processor/importers/common/clock_converter.h" @@ -170,6 +171,7 @@ void InitGlobalState(TraceProcessorContext* context, // Global state. context->config = config; context->platform = platform; + context->file_system = platform ? platform->GetFileSystem() : nullptr; context->storage = Ptr::MakeRoot(config); context->global_stats_tracker = Ptr::MakeRoot(context->storage.get()); @@ -213,6 +215,7 @@ void CopyGlobalState(const TraceProcessorContext* source, // Global state. dest->config = source->config; dest->platform = source->platform; + dest->file_system = source->file_system; dest->storage = source->storage.Fork(); dest->sorter = source->sorter.Fork(); dest->reader_registry = source->reader_registry.Fork(); @@ -311,6 +314,7 @@ void TraceProcessorContext::DestroyParsingState() { // so preserve them while reconstructing the parsing context. Config _config = std::move(config); TraceProcessor_PlatformInterface* _platform = platform; + io::FileSystem* _file_system = file_system; auto _storage = std::move(storage); // TODO(b/309623584): Decouple from storage and remove from here. This @@ -331,6 +335,7 @@ void TraceProcessorContext::DestroyParsingState() { config = std::move(_config); platform = _platform; + file_system = _file_system; storage = std::move(_storage); heap_graph_tracker = std::move(_heap_graph_tracker); clock_converter = std::move(_clock_converter); diff --git a/src/trace_processor/trace_processor_impl.cc b/src/trace_processor/trace_processor_impl.cc index 98cbe724ec9..e44a732ebbb 100644 --- a/src/trace_processor/trace_processor_impl.cc +++ b/src/trace_processor/trace_processor_impl.cc @@ -42,6 +42,7 @@ #include "perfetto/ext/base/string_utils.h" #include "perfetto/protozero/scattered_heap_buffer.h" #include "perfetto/trace_processor/basic_types.h" +#include "perfetto/trace_processor/io.h" #include "perfetto/trace_processor/iterator.h" #include "perfetto/trace_processor/summarizer.h" #include "perfetto/trace_processor/trace_blob.h" @@ -110,6 +111,7 @@ #include "src/trace_processor/plugins/experimental_flamegraph/experimental_flamegraph.h" #include "src/trace_processor/plugins/experimental_flat_slice/experimental_flat_slice.h" #include "src/trace_processor/plugins/experimental_slice_layout/experimental_slice_layout.h" +#include "src/trace_processor/plugins/flamegraph/flamegraph_function.h" #include "src/trace_processor/plugins/graph_scan/graph_scan.h" #include "src/trace_processor/plugins/graph_traversal/graph_traversal.h" #include "src/trace_processor/plugins/import/import.h" @@ -148,6 +150,7 @@ #include "src/trace_processor/sqlite/bindings/sqlite_function.h" #include "src/trace_processor/sqlite/bindings/sqlite_result.h" #include "src/trace_processor/sqlite/sql_source.h" +#include "src/trace_processor/sqlite/sqlite_export.h" #include "src/trace_processor/sqlite_iterator_impl.h" #include "src/trace_processor/storage/trace_storage.h" #include "src/trace_processor/tp_metatrace.h" @@ -358,6 +361,7 @@ TraceProcessorImpl::TraceProcessorImpl( experimental_flamegraph::RegisterPlugin(); experimental_flat_slice::RegisterPlugin(); experimental_slice_layout::RegisterPlugin(); + flamegraph::RegisterPlugin(); graph_scan::RegisterPlugin(); graph_traversal::RegisterPlugin(); import::RegisterPlugin(); @@ -1209,6 +1213,25 @@ base::Status TraceProcessorImpl::CreateSummarizer( base::Status TraceProcessorImpl::Export(ExportFormat format, ExportOutput* output) { + if (!output) { + return base::ErrStatus("Export output is null"); + } + if (format == ExportFormat::kSqlite) { + std::optional path = output->GetFilePath(); + if (!path) { + return base::ErrStatus("SQLite export requires a file path"); + } + // SQLite export is an explicit API call (not reachable from SQL), so it is + // not gated behind Config::enable_sql_file_access. Embedders without a + // filesystem, such as the RPC server and Wasm, fail here cleanly. + // The filesystem is borrowed at construction and must outlive this + // instance. + io::FileSystem* file_system = context()->file_system; + if (!file_system) { + return base::ErrStatus("SQLite export requires a file system"); + } + return ExportSqliteDatabase(this, file_system, *path); + } return trace_export::WriteExport( plugin_dataframes_, context()->storage->string_pool(), format, output); } diff --git a/src/trace_processor/trace_processor_shell.cc b/src/trace_processor/trace_processor_shell.cc index 79e9da52854..9c9eef49995 100644 --- a/src/trace_processor/trace_processor_shell.cc +++ b/src/trace_processor/trace_processor_shell.cc @@ -759,7 +759,7 @@ class DefaultPlatformInterface : public TraceProcessorShell::PlatformInterface { if (!file_system_) { file_system_ = io::CreateLocalFileSystem(); } - return file_system_.get(); + return file_system_; } base::Status OnTraceProcessorCreated(TraceProcessor*) override { @@ -783,7 +783,7 @@ class DefaultPlatformInterface : public TraceProcessorShell::PlatformInterface { } private: - std::unique_ptr file_system_; + io::FileSystem* file_system_ = nullptr; }; DefaultPlatformInterface::~DefaultPlatformInterface() = default; diff --git a/src/trace_processor/types/trace_processor_context.h b/src/trace_processor/types/trace_processor_context.h index 7cb9dd1c415..016938d5f6f 100644 --- a/src/trace_processor/types/trace_processor_context.h +++ b/src/trace_processor/types/trace_processor_context.h @@ -71,6 +71,10 @@ class TraceReaderRegistry; class TraceSorter; class TraceStorage; class TraceProcessor_PlatformInterface; + +namespace io { +class FileSystem; +} class TrackCompressor; class TrackTracker; struct ProtoImporterModuleContext; @@ -171,6 +175,10 @@ class TraceProcessorContext { Config config; TraceProcessor_PlatformInterface* platform = nullptr; + // The filesystem obtained from `platform` at construction. Cached so that + // each Trace Processor instance uses a stable snapshot of its platform's + // filesystem for its whole lifetime. Borrowed; must outlive this instance. + io::FileSystem* file_system = nullptr; GlobalPtr storage; GlobalPtr sorter; GlobalPtr reader_registry; diff --git a/src/trace_processor/util/elf/binary_info.cc b/src/trace_processor/util/elf/binary_info.cc index 2a159cae063..32db181e6b0 100644 --- a/src/trace_processor/util/elf/binary_info.cc +++ b/src/trace_processor/util/elf/binary_info.cc @@ -23,7 +23,6 @@ #include #include -#include "perfetto/base/logging.h" #include "perfetto/ext/base/file_utils.h" #include "perfetto/ext/base/scoped_mmap.h" #include "perfetto/ext/base/utils.h" @@ -47,13 +46,11 @@ template std::optional GetElfLoadBias(const void* mem, size_t size) { const typename E::Ehdr* ehdr = static_cast(mem); if (!InRange(mem, size, ehdr, sizeof(typename E::Ehdr))) { - PERFETTO_ELOG("Corrupted ELF."); return std::nullopt; } for (size_t i = 0; i < ehdr->e_phnum; ++i) { const typename E::Phdr* phdr = GetPhdr(mem, ehdr, i); if (!InRange(mem, size, phdr, sizeof(typename E::Phdr))) { - PERFETTO_ELOG("Corrupted ELF."); return std::nullopt; } if (phdr->p_type == PT_LOAD && phdr->p_flags & PF_X) { @@ -67,13 +64,11 @@ template std::optional GetElfBuildId(const void* mem, size_t size) { const typename E::Ehdr* ehdr = static_cast(mem); if (!InRange(mem, size, ehdr, sizeof(typename E::Ehdr))) { - PERFETTO_ELOG("Corrupted ELF."); return std::nullopt; } for (size_t i = 0; i < ehdr->e_shnum; ++i) { const typename E::Shdr* shdr = GetShdr(mem, ehdr, i); if (!InRange(mem, size, shdr, sizeof(typename E::Shdr))) { - PERFETTO_ELOG("Corrupted ELF."); return std::nullopt; } @@ -86,13 +81,11 @@ std::optional GetElfBuildId(const void* mem, size_t size) { static_cast(mem) + offset); if (!InRange(mem, size, nhdr, sizeof(typename E::Nhdr))) { - PERFETTO_ELOG("Corrupted ELF."); return std::nullopt; } if (nhdr->n_type == NT_GNU_BUILD_ID && nhdr->n_namesz == 4) { const char* name = reinterpret_cast(nhdr) + sizeof(*nhdr); if (!InRange(mem, size, name, 4)) { - PERFETTO_ELOG("Corrupted ELF."); return std::nullopt; } if (memcmp(name, "GNU", 3) == 0) { @@ -100,7 +93,6 @@ std::optional GetElfBuildId(const void* mem, size_t size) { sizeof(*nhdr) + base::AlignUp<4>(nhdr->n_namesz); if (!InRange(mem, size, value, nhdr->n_descsz)) { - PERFETTO_ELOG("Corrupted ELF."); return std::nullopt; } return std::string(value, nhdr->n_descsz); diff --git a/src/trace_processor/util/symbolizer/elf.h b/src/trace_processor/util/symbolizer/elf.h index b9af8e108bd..5e6b926b77b 100644 --- a/src/trace_processor/util/symbolizer/elf.h +++ b/src/trace_processor/util/symbolizer/elf.h @@ -18,9 +18,7 @@ #define SRC_TRACE_PROCESSOR_UTIL_SYMBOLIZER_ELF_H_ #include -#include - -#include "perfetto/base/build_config.h" +#include // We cannot just include elf.h, as that only exists on Linux, and we want to // allow symbolization on other platforms as well. As we only need a small @@ -30,22 +28,18 @@ namespace perfetto { namespace profiling { constexpr auto PT_LOAD = 1; +constexpr auto PT_NOTE = 4; constexpr auto PF_X = 1; constexpr auto SHT_NOTE = 7; constexpr auto NT_GNU_BUILD_ID = 3; constexpr auto ELFCLASS32 = 1; constexpr auto ELFCLASS64 = 2; -constexpr auto ELFMAG0 = 0x7f; -constexpr auto ELFMAG1 = 'E'; -constexpr auto ELFMAG2 = 'L'; -constexpr auto ELFMAG3 = 'F'; +constexpr char kElfMagic[] = + "\x7f" + "ELF"; constexpr auto ELFDATA2LSB = 1; constexpr auto EV_CURRENT = 1; -constexpr auto EI_MAG0 = 0; -constexpr auto EI_MAG1 = 1; -constexpr auto EI_MAG2 = 2; -constexpr auto EI_MAG3 = 3; -constexpr auto EI_CLASS = 4; +constexpr auto EI_CLASS = sizeof(kElfMagic) - 1; constexpr auto EI_DATA = 5; constexpr auto EI_VERSION = 6; diff --git a/src/trace_processor/util/symbolizer/local_symbolizer.cc b/src/trace_processor/util/symbolizer/local_symbolizer.cc index dd092870029..cb1ef3e5581 100644 --- a/src/trace_processor/util/symbolizer/local_symbolizer.cc +++ b/src/trace_processor/util/symbolizer/local_symbolizer.cc @@ -31,7 +31,6 @@ #include #include #include -#include #include #include @@ -39,8 +38,6 @@ #include "perfetto/base/logging.h" #include "perfetto/ext/base/file_utils.h" #include "perfetto/ext/base/scoped_file.h" -#include "perfetto/ext/base/scoped_mmap.h" -#include "perfetto/ext/base/string_splitter.h" #include "perfetto/ext/base/string_utils.h" #include "perfetto/ext/base/utils.h" #include "src/trace_processor/util/symbolizer/elf.h" @@ -77,77 +74,76 @@ std::string GetLine(const std::function& fn_read) { return line; } -bool InRange(const void* base, - size_t total_size, - const void* ptr, - size_t size) { - return ptr >= base && static_cast(ptr) + size <= - static_cast(base) + total_size; +constexpr size_t kMaxNoteSize = 1u << 20; + +// Reads up to |len| bytes at |offset| from |fd| into |buf|. Returns the +// number of bytes actually read (0 on error or EOF); a short read means the +// file is smaller than |len| (e.g. a truncated header). +size_t ReadFileAt(int fd, size_t offset, void* buf, size_t len) { + if (len == 0) + return 0; + if (!base::SeekFile(fd, offset)) + return 0; + ssize_t rd = base::Read(fd, buf, len); + return rd > 0 ? static_cast(rd) : 0; } +// Scans the note data at |data| (a PT_NOTE segment or a SHT_NOTE section) +// for the GNU build-id (an NT_GNU_BUILD_ID note named "GNU"). template -typename E::Phdr* FindFirstExecutableSegment(void* mem, size_t size) { - const typename E::Ehdr* ehdr = static_cast(mem); - if (!InRange(mem, size, ehdr, sizeof(typename E::Ehdr))) { - return nullptr; - } - // Note debug-symbols-only ELF files might not have any program header at all, - // and we would need to do the load_bias adjustment computations using the - // segments instead. Luckily so far we did not run into this situation but - // what happens is that those ELF files have an adjusted p_offest instead - // (that we need to take care of in `ComputeUserSpaceAddressCorrection`). - for (size_t i = 0; i < ehdr->e_phnum; ++i) { - typename E::Phdr* phdr = GetPhdr(mem, ehdr, i); - if (!InRange(mem, size, phdr, sizeof(typename E::Phdr))) { - return nullptr; - } - if (phdr->p_type == PT_LOAD && phdr->p_flags & PF_X) { - return phdr; +std::optional GetBuildIdFromNotes(const char* data, size_t size) { + size_t offset = 0; + while (offset + sizeof(typename E::Nhdr) <= size) { + typename E::Nhdr nhdr; + memcpy(&nhdr, data + offset, sizeof(nhdr)); + const size_t name_size = base::AlignUp<4>(nhdr.n_namesz); + const size_t desc_size = base::AlignUp<4>(nhdr.n_descsz); + if (offset + sizeof(nhdr) + name_size + desc_size > size) + return std::nullopt; // Truncated note. + if (nhdr.n_type == NT_GNU_BUILD_ID && nhdr.n_namesz == 4 && + memcmp(data + offset + sizeof(nhdr), "GNU", 3) == 0) { + return std::string(data + offset + sizeof(nhdr) + name_size, + nhdr.n_descsz); } + offset += sizeof(nhdr) + name_size + desc_size; } - return nullptr; + return std::nullopt; } +// Fallback build-id extraction: walks the section header table (read at +// e_shoff) looking for SHT_NOTE sections. Used only when the fast PT_NOTE +// path found nothing, e.g. files whose build-id note is section-only (some +// ET_REL objects and older linkers). template -std::optional GetElfBuildId(void* mem, size_t size) { - const typename E::Ehdr* ehdr = static_cast(mem); - if (!InRange(mem, size, ehdr, sizeof(typename E::Ehdr))) { +std::optional GetBuildIdFromShdrs(int fd, + const typename E::Ehdr& ehdr) { + if (ehdr.e_shnum == 0 || ehdr.e_shoff == 0) return std::nullopt; - } - for (size_t i = 0; i < ehdr->e_shnum; ++i) { - typename E::Shdr* shdr = GetShdr(mem, ehdr, i); - if (!InRange(mem, size, shdr, sizeof(typename E::Shdr))) { - return std::nullopt; - } - - if (shdr->sh_type != SHT_NOTE) + const size_t shdr_table_size = + static_cast(ehdr.e_shnum) * sizeof(typename E::Shdr); + std::string shdrs; + shdrs.resize(shdr_table_size); + // Tolerate a truncated section header table (declared e_shnum larger than + // the actual table): process only the complete entries. + const size_t num_shdrs = ReadFileAt(fd, static_cast(ehdr.e_shoff), + shdrs.data(), shdr_table_size) / + sizeof(typename E::Shdr); + for (size_t i = 0; i < num_shdrs; i++) { + typename E::Shdr shdr; + memcpy(&shdr, shdrs.data() + i * sizeof(shdr), sizeof(shdr)); + if (shdr.sh_type != SHT_NOTE) continue; - - auto offset = shdr->sh_offset; - while (offset < shdr->sh_offset + shdr->sh_size) { - auto* nhdr = - reinterpret_cast(static_cast(mem) + offset); - - if (!InRange(mem, size, nhdr, sizeof(typename E::Nhdr))) { - return std::nullopt; - } - if (nhdr->n_type == NT_GNU_BUILD_ID && nhdr->n_namesz == 4) { - char* name = reinterpret_cast(nhdr) + sizeof(*nhdr); - if (!InRange(mem, size, name, 4)) { - return std::nullopt; - } - if (memcmp(name, "GNU", 3) == 0) { - const char* value = reinterpret_cast(nhdr) + sizeof(*nhdr) + - base::AlignUp<4>(nhdr->n_namesz); - - if (!InRange(mem, size, value, nhdr->n_descsz)) { - return std::nullopt; - } - return std::string(value, nhdr->n_descsz); - } - } - offset += sizeof(*nhdr) + base::AlignUp<4>(nhdr->n_namesz) + - base::AlignUp<4>(nhdr->n_descsz); + // Build-id notes are tiny; cap the read to avoid huge allocations from + // corrupt headers. + const size_t note_size = static_cast(shdr.sh_size); + if (note_size == 0 || note_size > kMaxNoteSize) + continue; + std::string note; + note.resize(note_size); + if (ReadFileAt(fd, static_cast(shdr.sh_offset), note.data(), + note_size) == note_size) { + if (auto build_id = GetBuildIdFromNotes(note.data(), note.size())) + return build_id; } } return std::nullopt; @@ -164,10 +160,8 @@ std::string SplitBuildID(const std::string& hex_build_id) { } bool IsElf(const char* mem, size_t size) { - if (size <= EI_MAG3) - return false; - return (mem[EI_MAG0] == ELFMAG0 && mem[EI_MAG1] == ELFMAG1 && - mem[EI_MAG2] == ELFMAG2 && mem[EI_MAG3] == ELFMAG3); + constexpr size_t kElfMagicSize = sizeof(kElfMagic) - 1; + return size >= kElfMagicSize && memcmp(mem, kElfMagic, kElfMagicSize) == 0; } constexpr uint32_t kMachO64Magic = 0xfeedfacf; @@ -214,111 +208,171 @@ struct BinaryInfo { BinaryType type; }; -std::optional GetMachOBinaryInfo(char* mem, size_t size) { - if (size < sizeof(mach_header_64)) - return {}; - - mach_header_64 header; - memcpy(&header, mem, sizeof(mach_header_64)); +std::optional GetMachOBinaryInfo(int fd, + size_t size, + const mach_header_64& header) { + if (size < sizeof(header) || header.sizeofcmds > size - sizeof(header)) + return std::nullopt; - if (size < sizeof(mach_header_64) + header.sizeofcmds) - return {}; + std::string commands; + commands.resize(header.sizeofcmds); + if (ReadFileAt(fd, sizeof(header), commands.data(), commands.size()) != + commands.size()) { + return std::nullopt; + } std::optional build_id; uint64_t vaddr = 0; - - char* pcmd = mem + sizeof(mach_header_64); - char* pcmds_end = pcmd + header.sizeofcmds; - while (pcmd < pcmds_end) { - load_command cmd_header; - memcpy(&cmd_header, pcmd, sizeof(load_command)); + size_t offset = 0; + while (offset < commands.size()) { + if (commands.size() - offset < sizeof(load_command)) + return std::nullopt; + load_command command; + memcpy(&command, commands.data() + offset, sizeof(command)); + if (command.cmdsize < sizeof(command) || + command.cmdsize > commands.size() - offset) { + return std::nullopt; + } constexpr uint32_t LC_SEGMENT_64 = 0x19; constexpr uint32_t LC_UUID = 0x1b; - - switch (cmd_header.cmd) { - case LC_UUID: { - build_id = std::string(pcmd + sizeof(load_command), - cmd_header.cmdsize - sizeof(load_command)); + switch (command.cmd) { + case LC_UUID: + build_id = std::string(commands.data() + offset + sizeof(command), + command.cmdsize - sizeof(command)); break; - } case LC_SEGMENT_64: { - segment_64_command seg_cmd; - memcpy(&seg_cmd, pcmd, sizeof(segment_64_command)); - if (strcmp(seg_cmd.segname, "__TEXT") == 0) { - vaddr = seg_cmd.vmaddr; - } + if (command.cmdsize < sizeof(segment_64_command)) + return std::nullopt; + segment_64_command segment; + memcpy(&segment, commands.data() + offset, sizeof(segment)); + constexpr char kTextSegment[] = "__TEXT"; + if (memcmp(segment.segname, kTextSegment, sizeof(kTextSegment)) == 0) + vaddr = segment.vmaddr; break; } default: break; } - - pcmd += cmd_header.cmdsize; + offset += command.cmdsize; } - if (build_id) { - constexpr uint32_t MH_DSYM = 0xa; - BinaryType type = header.filetype == MH_DSYM ? BinaryType::kMachODsym - : BinaryType::kMachO; - return BinaryInfo{build_id, LoadInfo{vaddr, 0, 0}, type}; - } - return {}; + if (!build_id) + return std::nullopt; + constexpr uint32_t MH_DSYM = 0xa; + BinaryType type = + header.filetype == MH_DSYM ? BinaryType::kMachODsym : BinaryType::kMachO; + return BinaryInfo{build_id, LoadInfo{vaddr, 0, 0}, type}; } +// Parses the ELF at |fd| (position 0) and extracts build-id and load info by +// reading only the ELF header, the program header table and the build-id note +// (PT_NOTE). The section header table at the end of large binaries is only +// read as a fallback when the note is not in a program segment. template -std::optional ElfToBinaryInfo(char* mem, size_t size) { - std::optional build_id = GetElfBuildId(mem, size); - typename E::Phdr* phdr = FindFirstExecutableSegment(mem, size); - - if (!phdr) { - return BinaryInfo{ - build_id, - std::nullopt, - BinaryType::kElf, - }; - } - - // p_align can only be 0, 1 (no alignment requirement) or a power of two. - if (phdr->p_align != 0 && !base::IsPowerOfTwo(phdr->p_align)) { - PERFETTO_DLOG("Invalid p_aling value: %" PRIu64, - static_cast(phdr->p_align)); +std::optional GetElfBinaryInfo(int fd, + const char* header, + size_t header_size) { + if (header_size < sizeof(typename E::Ehdr)) return std::nullopt; - } + typename E::Ehdr ehdr; + memcpy(&ehdr, header, sizeof(ehdr)); - return BinaryInfo{ - build_id, - LoadInfo{phdr->p_vaddr, phdr->p_offset, phdr->p_align}, - BinaryType::kElf, - }; -} + std::optional build_id; + std::optional load_info; -std::optional GetBinaryInfo(const char* fname, size_t size) { - static_assert(EI_CLASS > EI_MAG3, "mem[EI_MAG?] accesses are in range."); - if (size <= EI_CLASS) { - return std::nullopt; - } - base::ScopedMmap map = base::ReadMmapFilePart(fname, size); - if (!map.IsValid()) { - return std::nullopt; + // Program header table (e_phnum is 16-bit, so the table is at most a few + // hundred KB). A short read (truncated table) is tolerated: only the + // complete entries are processed, and the build-id section fallback still + // runs. + const size_t phdr_table_size = + static_cast(ehdr.e_phnum) * sizeof(typename E::Phdr); + if (phdr_table_size > 0 && ehdr.e_phoff != 0) { + std::string phdrs; + phdrs.resize(phdr_table_size); + const size_t num_phdrs = ReadFileAt(fd, static_cast(ehdr.e_phoff), + phdrs.data(), phdr_table_size) / + sizeof(typename E::Phdr); + for (size_t i = 0; i < num_phdrs; i++) { + typename E::Phdr phdr; + memcpy(&phdr, phdrs.data() + i * sizeof(phdr), sizeof(phdr)); + if (phdr.p_type == PT_LOAD && phdr.p_flags & PF_X) { + // p_align can only be 0, 1 (no alignment requirement) or a power of + // two. + if (phdr.p_align != 0 && !base::IsPowerOfTwo(phdr.p_align)) { + PERFETTO_DLOG("Invalid p_align value: %" PRIu64, + static_cast(phdr.p_align)); + return std::nullopt; + } + if (!load_info.has_value()) { + load_info = LoadInfo{phdr.p_vaddr, phdr.p_offset, phdr.p_align}; + } + } else if (phdr.p_type == PT_NOTE && !build_id.has_value()) { + // Build-id notes are tiny; cap the read to avoid huge allocations + // from corrupt headers. + const size_t note_size = static_cast(phdr.p_filesz); + if (note_size > 0 && note_size <= kMaxNoteSize) { + std::string note; + note.resize(note_size); + if (ReadFileAt(fd, static_cast(phdr.p_offset), note.data(), + note_size) == note_size) { + build_id = GetBuildIdFromNotes(note.data(), note.size()); + } + } + } + } } - char* mem = static_cast(map.data()); - if (IsElf(mem, size)) { - switch (mem[EI_CLASS]) { + if (!build_id.has_value()) + build_id = GetBuildIdFromShdrs(fd, ehdr); + + return BinaryInfo{build_id, load_info, BinaryType::kElf}; +} + +// Parses an already-open file whose format has not yet been detected. Reads +// the initial header once and dispatches to the ELF (32/64) or Mach-O parser. +// |is_binary| distinguishes non-binary files from malformed binaries. +std::optional GetBinaryInfoFromFd(int fd, + size_t size, + bool* is_binary = nullptr) { + static_assert(sizeof(mach_header_64) <= sizeof(Elf64::Ehdr)); + char header[sizeof(Elf64::Ehdr)]; + const size_t header_size = ReadFileAt(fd, 0, header, sizeof(header)); + const bool is_elf = IsElf(header, header_size); + const bool is_macho = IsMachO64(header, header_size); + if (is_binary) + *is_binary = is_elf || is_macho; + + if (is_elf) { + if (header_size <= EI_CLASS) + return std::nullopt; + switch (header[EI_CLASS]) { case ELFCLASS32: - return ElfToBinaryInfo(mem, size); + return GetElfBinaryInfo(fd, header, header_size); case ELFCLASS64: - return ElfToBinaryInfo(mem, size); + return GetElfBinaryInfo(fd, header, header_size); default: return std::nullopt; } - } else if (IsMachO64(mem, size)) { - return GetMachOBinaryInfo(mem, size); + } + if (is_macho) { + if (header_size < sizeof(mach_header_64)) + return std::nullopt; + mach_header_64 mach_header; + memcpy(&mach_header, header, sizeof(mach_header)); + return GetMachOBinaryInfo(fd, size, mach_header); } return std::nullopt; } +std::optional GetBinaryInfo(const char* fname, size_t size) { + base::ScopedFile fd(base::OpenFile(fname, O_RDONLY)); + if (!fd) { + return std::nullopt; + } + return GetBinaryInfoFromFd(fd.get(), size); +} + // Helper function to process a single binary file and add it to the index. // Increments *corrupt_file_count when a file looks like ELF/Mach-O but cannot // be parsed (corrupt or truncated): callers aggregate this into a single log @@ -327,27 +381,18 @@ void ProcessBinaryFile(const char* fname, size_t size, std::map& result, uint32_t* corrupt_file_count) { - static_assert(EI_MAG3 + 1 == sizeof(kMachO64Magic)); - char magic[EI_MAG3 + 1]; - // Scope file access. On windows OpenFile opens an exclusive lock. - // This lock needs to be released before mapping the file. - // Check if file exists first to avoid noisy errors for speculative paths. - if (!base::FileExists(fname)) { + base::ScopedFile fd(base::OpenFile(fname, O_RDONLY)); + if (!fd) { + // Missing/unreadable file: skip silently (e.g. speculative paths). return; } - { - base::ScopedFile fd(base::OpenFile(fname, O_RDONLY)); - if (!fd) { - return; - } - auto rd = base::Read(*fd, &magic, sizeof(magic)); - if (rd != sizeof(magic) || (!IsElf(magic, static_cast(rd)) && - !IsMachO64(magic, static_cast(rd)))) { - PERFETTO_DLOG("%s not an ELF or Mach-O 64.", fname); - return; - } + bool is_binary = false; + std::optional binary_info = + GetBinaryInfoFromFd(fd.get(), size, &is_binary); + if (!is_binary) { + PERFETTO_DLOG("%s not an ELF or Mach-O 64.", fname); + return; } - std::optional binary_info = GetBinaryInfo(fname, size); if (!binary_info) { // Passed the magic check but failed to parse: corrupt or truncated. ++(*corrupt_file_count); @@ -606,10 +651,13 @@ bool SkipJsonValue(const char*& it, const char* end) { std::optional IsCorrectFile( const std::string& symbol_file, - std::optional build_id) { + std::optional build_id, + BinaryPathError* error) { if (!base::FileExists(symbol_file)) { + *error = BinaryPathError::kFileNotFound; return std::nullopt; } + *error = BinaryPathError::kParseError; // Openfile opens the file with an exclusive lock on windows. std::optional file_size = base::GetFileSize(symbol_file); if (!file_size.has_value()) { @@ -631,8 +679,10 @@ std::optional IsCorrectFile( if (!binary_info->load_info) return std::nullopt; if (build_id && binary_info->build_id != *build_id) { + *error = BinaryPathError::kBuildIdMismatch; return std::nullopt; } + *error = BinaryPathError::kOk; return FoundBinary{symbol_file, *binary_info->load_info, binary_info->type}; } @@ -646,13 +696,14 @@ bool TryPath(const std::string& path, attempts.push_back({path, BinaryPathError::kFileNotFound}); return false; } - std::optional found = IsCorrectFile(path, build_id); + BinaryPathError error; + std::optional found = IsCorrectFile(path, build_id, &error); if (found) { out_binary = std::move(found); attempts.push_back({path, BinaryPathError::kOk}); return true; } - attempts.push_back({path, BinaryPathError::kBuildIdMismatch}); + attempts.push_back({path, error}); return false; } @@ -663,16 +714,20 @@ std::optional FindBinaryInRoot( std::vector& attempts) { constexpr char kApkPrefix[] = "base.apk!"; - std::string filename; - std::string dirname; + std::optional result; + // Try a path relative to the symbol root and record the attempt. + auto try_path_in_root = [&](const std::string& rel_path) { + return TryPath(root_str + "/" + rel_path, build_id, result, attempts); + }; - for (base::StringSplitter sp(abspath, '/'); sp.Next();) { - if (!dirname.empty()) { - dirname += "/"; - } - dirname += filename; - filename = sp.cur_token(); - } + // Strip the leading root (e.g. "/" or "C:\") before searching for the + // mapping under `root_str`. Treat both '/' and '\' as path separators. + std::string_view rel = abspath; + rel.remove_prefix(base::PathRootPrefixLength(abspath)); + size_t last_sep = rel.find_last_of("/\\"); + size_t file_pos = last_sep == std::string_view::npos ? 0 : last_sep + 1; + + std::string filename(rel.substr(file_pos)); // Return the first match for the following options: // * absolute path of library file relative to root. @@ -694,42 +749,35 @@ std::optional FindBinaryInRoot( // * $ROOT/foo.so // * $ROOT/.build-id/ab/cd1234.debug - std::optional result; - std::string symbol_file; + // Directory of the mapping relative to the root, including the trailing '/' + // (empty if the mapping has no directory component). Native separators are + // normalized to '/', which is accepted on all platforms. + std::string dir(rel.substr(0, file_pos)); + std::replace(dir.begin(), dir.end(), '\\', '/'); + + bool has_apk_prefix = base::StartsWith(filename, kApkPrefix); + std::string filename_without_apk_prefix = + has_apk_prefix ? filename.substr(sizeof(kApkPrefix) - 1) : std::string(); - symbol_file = root_str + "/" + dirname + "/" + filename; - if (TryPath(symbol_file, build_id, result, attempts)) { + if (!dir.empty() && try_path_in_root(dir + filename)) { return result; } - - if (base::StartsWith(filename, kApkPrefix)) { - symbol_file = root_str + "/" + dirname + "/" + - filename.substr(sizeof(kApkPrefix) - 1); - if (TryPath(symbol_file, build_id, result, attempts)) { - return result; - } + if (!dir.empty() && has_apk_prefix && + try_path_in_root(dir + filename_without_apk_prefix)) { + return result; } - - symbol_file = root_str + "/" + filename; - if (TryPath(symbol_file, build_id, result, attempts)) { + if (try_path_in_root(filename)) { return result; } - - if (base::StartsWith(filename, kApkPrefix)) { - symbol_file = root_str + "/" + filename.substr(sizeof(kApkPrefix) - 1); - if (TryPath(symbol_file, build_id, result, attempts)) { - return result; - } + if (has_apk_prefix && try_path_in_root(filename_without_apk_prefix)) { + return result; } std::string hex_build_id = base::ToHex(build_id.c_str(), build_id.size()); - std::string split_hex_build_id = SplitBuildID(hex_build_id); - if (!split_hex_build_id.empty()) { - symbol_file = - root_str + "/" + ".build-id" + "/" + split_hex_build_id + ".debug"; - if (TryPath(symbol_file, build_id, result, attempts)) { - return result; - } + if (std::string build_id_path = SplitBuildID(hex_build_id); + !build_id_path.empty() && + try_path_in_root(".build-id/" + build_id_path + ".debug")) { + return result; } return std::nullopt; @@ -749,13 +797,14 @@ std::optional FindKernelBinary( attempts.push_back({path, BinaryPathError::kFileNotFound}); return std::nullopt; } - std::optional found = IsCorrectFile(path, std::nullopt); + BinaryPathError error; + std::optional found = + IsCorrectFile(path, std::nullopt, &error); if (found) { attempts.push_back({path, BinaryPathError::kOk}); return found; } - // File exists but isn't a valid binary. - attempts.push_back({path, BinaryPathError::kBuildIdMismatch}); + attempts.push_back({path, error}); return std::nullopt; }; @@ -895,7 +944,7 @@ BinaryLookupResult LocalBinaryFinder::FindBinary(const std::string& abspath, BinaryLookupResult& result = p.first->second; // Try the absolute path first. - if (base::StartsWith(abspath, "/")) { + if (base::IsAbsolutePath(abspath)) { if (TryPath(abspath, build_id, result.binary, result.attempts)) { return result; } @@ -955,6 +1004,8 @@ SymbolPathError ToSymbolPathError(BinaryPathError error) { return SymbolPathError::kFileNotFound; case BinaryPathError::kBuildIdMismatch: return SymbolPathError::kBuildIdMismatch; + case BinaryPathError::kParseError: + return SymbolPathError::kParseError; case BinaryPathError::kBuildIdNotInIndex: return SymbolPathError::kBuildIdNotInIndex; } diff --git a/src/trace_processor/util/symbolizer/local_symbolizer.h b/src/trace_processor/util/symbolizer/local_symbolizer.h index 1f7566b2bc0..377e1fd7ca0 100644 --- a/src/trace_processor/util/symbolizer/local_symbolizer.h +++ b/src/trace_processor/util/symbolizer/local_symbolizer.h @@ -58,6 +58,8 @@ enum class BinaryPathError : uint8_t { kFileNotFound, // A file was found but had the wrong build ID. kBuildIdMismatch, + // A file was found but its binary metadata could not be parsed. + kParseError, // A directory was indexed but didn't contain a binary with the requested // build ID. kBuildIdNotInIndex, diff --git a/src/trace_processor/util/symbolizer/local_symbolizer_unittest.cc b/src/trace_processor/util/symbolizer/local_symbolizer_unittest.cc index 38c0e85929d..321ad9de042 100644 --- a/src/trace_processor/util/symbolizer/local_symbolizer_unittest.cc +++ b/src/trace_processor/util/symbolizer/local_symbolizer_unittest.cc @@ -71,10 +71,7 @@ std::string CreateElfWithBuildId(const std::string& build_id) { } e; memset(&e, 0, sizeof e); - e.ehdr.e_ident[EI_MAG0] = ELFMAG0; - e.ehdr.e_ident[EI_MAG1] = ELFMAG1; - e.ehdr.e_ident[EI_MAG2] = ELFMAG2; - e.ehdr.e_ident[EI_MAG3] = ELFMAG3; + memcpy(e.ehdr.e_ident, kElfMagic, sizeof(kElfMagic) - 1); e.ehdr.e_ident[EI_CLASS] = ELFCLASS64; e.ehdr.e_ident[EI_DATA] = ELFDATA2LSB; e.ehdr.e_ident[EI_VERSION] = EV_CURRENT; @@ -106,6 +103,99 @@ std::string CreateElfWithBuildId(const std::string& build_id) { return std::string(reinterpret_cast(&e), sizeof e); } +// A valid ELF64 whose build-id lives in a PT_NOTE program segment (as GNU +// ld/lld emit it for executables and shared libraries) rather than in a +// section: exercises the fast build-id path. +std::string CreateElfWithNoteSegmentBuildId(const std::string& build_id) { + struct PtnoteElf { + Elf64::Ehdr ehdr; + Elf64::Phdr phdrs[2]; // PT_LOAD (exec) + PT_NOTE + Elf64::Nhdr nhdr; + char note_name[4]; + char note_desc[20]; + } e; + memset(&e, 0, sizeof e); + + memcpy(e.ehdr.e_ident, kElfMagic, sizeof(kElfMagic) - 1); + e.ehdr.e_ident[EI_CLASS] = ELFCLASS64; + e.ehdr.e_ident[EI_DATA] = ELFDATA2LSB; + e.ehdr.e_ident[EI_VERSION] = EV_CURRENT; + e.ehdr.e_version = EV_CURRENT; + e.ehdr.e_ehsize = sizeof e.ehdr; + e.ehdr.e_phoff = offsetof(PtnoteElf, phdrs); + e.ehdr.e_phnum = 2; + e.ehdr.e_phentsize = sizeof(Elf64::Phdr); + + e.phdrs[0].p_type = PT_LOAD; + e.phdrs[0].p_flags = PF_X; + + e.phdrs[1].p_type = PT_NOTE; + e.phdrs[1].p_offset = offsetof(PtnoteElf, nhdr); + e.phdrs[1].p_filesz = + sizeof(Elf64::Nhdr) + sizeof e.note_name + sizeof e.note_desc; + + e.nhdr.n_type = NT_GNU_BUILD_ID; + e.nhdr.n_namesz = sizeof e.note_name; + e.nhdr.n_descsz = sizeof e.note_desc; + strcpy(e.note_name, "GNU"); + memcpy(e.note_desc, build_id.c_str(), + std::min(build_id.size(), sizeof(e.note_desc))); + + return std::string(reinterpret_cast(&e), sizeof e); +} + +std::string CreateMachOWithBuildId(const std::string& build_id) { + struct MachHeader { + uint32_t magic; + int32_t cputype; + int32_t cpusubtype; + uint32_t filetype; + uint32_t ncmds; + uint32_t sizeofcmds; + uint32_t flags; + uint32_t reserved; + }; + struct LoadCommand { + uint32_t cmd; + uint32_t cmdsize; + }; + struct SegmentCommand { + uint32_t cmd; + uint32_t cmdsize; + char segname[16]; + uint64_t vmaddr; + uint64_t vmsize; + uint64_t fileoff; + uint64_t filesize; + uint32_t maxprot; + uint32_t initprot; + uint32_t nsects; + uint32_t flags; + }; + struct UuidCommand { + LoadCommand header; + char uuid[16]; + }; + struct MachO { + MachHeader header; + SegmentCommand segment; + UuidCommand uuid; + } macho{}; + + macho.header.magic = 0xfeedfacf; + macho.header.ncmds = 2; + macho.header.sizeofcmds = sizeof(macho.segment) + sizeof(macho.uuid); + macho.segment.cmd = 0x19; // LC_SEGMENT_64. + macho.segment.cmdsize = sizeof(macho.segment); + strcpy(macho.segment.segname, "__TEXT"); + macho.segment.vmaddr = 0x1234; + macho.uuid.header.cmd = 0x1b; // LC_UUID. + macho.uuid.header.cmdsize = sizeof(macho.uuid); + memcpy(macho.uuid.uuid, build_id.data(), + std::min(build_id.size(), sizeof(macho.uuid.uuid))); + return std::string(reinterpret_cast(&macho), sizeof(macho)); +} + #if defined(MEMORY_SANITIZER) // fts_read() causes some error under msan. #define NOMSAN_SimpleTree DISABLED_SimpleTree @@ -139,6 +229,42 @@ TEST(LocalBinaryIndexerTest, NOMSAN_SimpleTree) { #endif } +// The fast build-id path: the note lives in a PT_NOTE program segment. +TEST(LocalBinaryIndexerTest, BuildIdFromNoteSegment) { + base::TmpDirTree tmp; + tmp.AddDir("root"); + tmp.AddFile("root/elf1", + CreateElfWithNoteSegmentBuildId("AAAAAAAAAAAAAAAAAAAA")); + + LocalBinaryIndexer indexer({tmp.path() + "/root"}, {}); + + BinaryLookupResult result = indexer.FindBinary("", "AAAAAAAAAAAAAAAAAAAA"); + ASSERT_TRUE(result.ok()); +#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) + EXPECT_EQ(result.binary->file_name, tmp.path() + "/root\\elf1"); +#else + EXPECT_EQ(result.binary->file_name, tmp.path() + "/root/elf1"); +#endif +} + +TEST(LocalBinaryIndexerTest, MachOBuildIdFromLoadCommands) { + base::TmpDirTree tmp; + tmp.AddDir("root"); + const std::string build_id = "ABCDEFGHIJKLMNOP"; + tmp.AddFile("root/macho", CreateMachOWithBuildId(build_id)); + + LocalBinaryIndexer indexer({tmp.path() + "/root"}, {}); + + BinaryLookupResult result = indexer.FindBinary("", build_id); + ASSERT_TRUE(result.ok()); +#if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN) + EXPECT_EQ(result.binary->file_name, tmp.path() + "/root\\macho"); +#else + EXPECT_EQ(result.binary->file_name, tmp.path() + "/root/macho"); +#endif + EXPECT_EQ(result.binary->load_info.p_vaddr, 0x1234u); +} + // A valid ELF passed as an individual file (rather than discovered via a // directory walk) must be indexed. Previously the size passed for such files // was 0, which made GetBinaryInfo bail out and silently dropped them (and, @@ -238,6 +364,20 @@ TEST(LocalBinaryFinderTest, AbsolutePath) { EXPECT_EQ(result.binary->file_name, tmp.path() + "/root/dir/elf1.so"); } +TEST(LocalBinaryFinderTest, InvalidBinaryReportsParseError) { + base::TmpDirTree tmp; + tmp.AddFile("invalid.so", "not an ELF"); + + LocalBinaryFinder finder({}); + BinaryLookupResult result = + finder.FindBinary(tmp.AbsolutePath("invalid.so"), "AAAAAAAAAAAAAAAAAAAA"); + + ASSERT_FALSE(result.ok()); + ASSERT_EQ(result.attempts.size(), 1u); + EXPECT_EQ(result.attempts[0].path, tmp.AbsolutePath("invalid.so")); + EXPECT_EQ(result.attempts[0].error, BinaryPathError::kParseError); +} + TEST(LocalBinaryFinderTest, AbsolutePathWithoutBaseApk) { base::TmpDirTree tmp; tmp.AddDir("root"); diff --git a/src/trace_processor/virtual_destructors.cc b/src/trace_processor/virtual_destructors.cc index c2e44371d3e..7507f39c481 100644 --- a/src/trace_processor/virtual_destructors.cc +++ b/src/trace_processor/virtual_destructors.cc @@ -14,6 +14,7 @@ * limitations under the License. */ +#include "perfetto/trace_processor/trace_processor.h" #include "src/trace_processor/importers/common/chunked_trace_reader.h" namespace perfetto { @@ -21,5 +22,9 @@ namespace trace_processor { ChunkedTraceReader::~ChunkedTraceReader() {} +// Anchored here: embedders linking only "storage_minimal" call +// GetFileSystem() and still need the vtable. +TraceProcessor_PlatformInterface::~TraceProcessor_PlatformInterface() = default; + } // namespace trace_processor } // namespace perfetto diff --git a/src/tracing/test/api_integrationtest.cc b/src/tracing/test/api_integrationtest.cc index f0b05e85879..0aaf7e77aa3 100644 --- a/src/tracing/test/api_integrationtest.cc +++ b/src/tracing/test/api_integrationtest.cc @@ -5371,6 +5371,53 @@ TEST_P(PerfettoApiTest, OnFlushAsync) { Property(&perfetto::protos::gen::TestEvent::str, "on-flush")))); } +TEST_P(PerfettoApiTest, TraceContextDropCount) { + if (GetParam() == perfetto::kSystemBackend) { + GTEST_SKIP(); + } + auto* data_source = &data_sources_["my_data_source"]; + perfetto::TraceConfig cfg; + cfg.add_buffers()->set_size_kb(1024); + auto* ds_cfg = cfg.add_data_sources()->mutable_config(); + ds_cfg->set_name("my_data_source"); + auto* tracing_session = NewTrace(cfg); + tracing_session->get()->StartBlocking(); + + WaitableTestEvent on_flush_started; + WaitableTestEvent on_flush_unblocked; + data_source->on_flush_callback = [&](perfetto::FlushFlags) { + on_flush_started.Notify(); + on_flush_unblocked.Wait(); + }; + + // Block the internal perfetto thread inside the OnFlush callback. The + // in-process tracing service runs on the same thread, so it cannot free + // shared memory buffer chunks while blocked: writing enough data below is + // guaranteed to exhaust the buffer and cause data loss. + tracing_session->get()->Flush([](bool) {}); + on_flush_started.Wait(); + + uint64_t initial_drop_count = 0; + uint64_t final_drop_count = 0; + MockDataSource::Trace([&](MockDataSource::TraceContext ctx) { + initial_drop_count = ctx.drop_count(); + // Write way more data than the shared memory buffer can hold (the default + // shared memory buffer size is 256 KiB). + std::string large_str(1024, 'x'); + for (size_t i = 0; i < 2048; i++) { + ctx.NewTracePacket()->set_for_testing()->set_str(large_str); + } + final_drop_count = ctx.drop_count(); + }); + on_flush_unblocked.Notify(); + + EXPECT_EQ(initial_drop_count, 0u); + EXPECT_GT(final_drop_count, 0u); + + tracing_session->get()->StopBlocking(); + data_source->on_stop.Wait(); +} + // Regression test for b/139110180. Checks that GetDataSourceLocked() can be // called from OnStart() and OnStop() callbacks without deadlocking. TEST_P(PerfettoApiTest, GetDataSourceLockedFromCallbacks) { diff --git a/test/data/slice_double_click_zoom.pb.sha256 b/test/data/slice_double_click_zoom.pb.sha256 new file mode 100644 index 00000000000..3cdc69bc28f --- /dev/null +++ b/test/data/slice_double_click_zoom.pb.sha256 @@ -0,0 +1 @@ +344745f6ee9badb183b0b874a3c5201ae6bdd362e08819d19ce347a1200b4c95 \ No newline at end of file diff --git a/test/data/ui-screenshots/aggregation.test.ts/sched/cpu-by-process.png.sha256 b/test/data/ui-screenshots/aggregation.test.ts/sched/cpu-by-process.png.sha256 index 9d0641314c2..59195096bfb 100644 --- a/test/data/ui-screenshots/aggregation.test.ts/sched/cpu-by-process.png.sha256 +++ b/test/data/ui-screenshots/aggregation.test.ts/sched/cpu-by-process.png.sha256 @@ -1 +1 @@ -c53941bd88246847d11fede668da6cf0cbbaa961983ad9d95ba3ac1f5972ac00 \ No newline at end of file +448beb7e53f98b102f55caf282414de66a93e6cb1959d447259a8975b2d6110d \ No newline at end of file diff --git a/test/data/ui-screenshots/aggregation.test.ts/sched/cpu-by-thread.png.sha256 b/test/data/ui-screenshots/aggregation.test.ts/sched/cpu-by-thread.png.sha256 index 6a7ecb61763..466465d15b1 100644 --- a/test/data/ui-screenshots/aggregation.test.ts/sched/cpu-by-thread.png.sha256 +++ b/test/data/ui-screenshots/aggregation.test.ts/sched/cpu-by-thread.png.sha256 @@ -1 +1 @@ -adaa37b7c0b0a973cab0a8f5f7a65ccd75b96743d35c8f22cb83f597be448e5d \ No newline at end of file +93856baf7c78c6939e40d1d39370d0689b93e507fbe9ecf27f2ac9208ea2e086 \ No newline at end of file diff --git a/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-occurrences.png.sha256 b/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-occurrences.png.sha256 index 442040a969b..1af529f8a1f 100644 --- a/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-occurrences.png.sha256 +++ b/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-occurrences.png.sha256 @@ -1 +1 @@ -c8809da66fde7ece411424c37d780db352301f67da8dcbc48b3fd1aec888ff09 \ No newline at end of file +64096e2ef4cb2fa654d58d5668ef5768cbd92e0da296543f50fd5534a5a895c8 \ No newline at end of file diff --git a/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-wall-duration-desc.png.sha256 b/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-wall-duration-desc.png.sha256 index d9a8fa9cacb..0a722e8656a 100644 --- a/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-wall-duration-desc.png.sha256 +++ b/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-wall-duration-desc.png.sha256 @@ -1 +1 @@ -34fa4b909d8f463fbada20a221c51beb019dc4c34a18cb5eb76d8f740d38cf3a \ No newline at end of file +b48df6ff0ea7980452ca2d247135a537e48eb87ce1c6e429da1b961d7d8f145e \ No newline at end of file diff --git a/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-wall-duration.png.sha256 b/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-wall-duration.png.sha256 index 0b678749478..e21b2fd3602 100644 --- a/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-wall-duration.png.sha256 +++ b/test/data/ui-screenshots/aggregation.test.ts/sched/sort-by-wall-duration.png.sha256 @@ -1 +1 @@ -28b0b336f1f01da2cdbdd93978bf1d2f05589c6cb5f2177a542aebd9f433bbcb \ No newline at end of file +fdaf6fb306b49b40e1315c7dfd94af486e94eeb3de957d218a7822d4a9c5a78e \ No newline at end of file diff --git a/test/data/ui-screenshots/aggregation.test.ts/slices/slice-aggregation.png.sha256 b/test/data/ui-screenshots/aggregation.test.ts/slices/slice-aggregation.png.sha256 index 0864d4be6fa..2ed36173ded 100644 --- a/test/data/ui-screenshots/aggregation.test.ts/slices/slice-aggregation.png.sha256 +++ b/test/data/ui-screenshots/aggregation.test.ts/slices/slice-aggregation.png.sha256 @@ -1 +1 @@ -cb2cedd53d492a306f9f8f465fe902c9e5c4982ac3b0ab1ccc46dbc660f807b7 \ No newline at end of file +a496b5ad7761d71c4ed4e2a802ec2ed1dd50f42d88b7e5d009b111a7e913acf5 \ No newline at end of file diff --git a/test/data/ui-screenshots/load_and_tracks.test.ts/info-and-stats/into-and-stats.png.sha256 b/test/data/ui-screenshots/load_and_tracks.test.ts/info-and-stats/into-and-stats.png.sha256 index e2b080fe76a..f59602a2525 100644 --- a/test/data/ui-screenshots/load_and_tracks.test.ts/info-and-stats/into-and-stats.png.sha256 +++ b/test/data/ui-screenshots/load_and_tracks.test.ts/info-and-stats/into-and-stats.png.sha256 @@ -1 +1 @@ -2398fd7b8d571214a5dc8c8f32daf2deeb9e25869cd878f5398558fd18e25fea \ No newline at end of file +e0c3e484e322621a66b1dc793fe670723e632c6d41851006cd92b847f20e3ddc \ No newline at end of file diff --git a/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/back-to-trace-1.png.sha256 b/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/back-to-trace-1.png.sha256 index 5f86c92f801..4ab9b6b90e5 100644 --- a/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/back-to-trace-1.png.sha256 +++ b/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/back-to-trace-1.png.sha256 @@ -1 +1 @@ -3f44acf568851f95b29f156d3661dee38313b4140de489684570e9bf023146a5 \ No newline at end of file +6bc9fa67089fc3448507d3ef63ec751aaa80db5a8cfb6c8630e8db69c4367825 \ No newline at end of file diff --git a/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/trace-1.png.sha256 b/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/trace-1.png.sha256 index 5f86c92f801..4ab9b6b90e5 100644 --- a/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/trace-1.png.sha256 +++ b/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/trace-1.png.sha256 @@ -1 +1 @@ -3f44acf568851f95b29f156d3661dee38313b4140de489684570e9bf023146a5 \ No newline at end of file +6bc9fa67089fc3448507d3ef63ec751aaa80db5a8cfb6c8630e8db69c4367825 \ No newline at end of file diff --git a/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/trace-2.png.sha256 b/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/trace-2.png.sha256 index 2a6b5622ebb..6cc8dbc946b 100644 --- a/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/trace-2.png.sha256 +++ b/test/data/ui-screenshots/local_cache_key.test.ts/multiple-traces-via-url-and-local-cache-key/trace-2.png.sha256 @@ -1 +1 @@ -7f26583873be86353836da8f1d3e918bd92b201b4c6bbaff57f68c8207364267 \ No newline at end of file +3beabf68a73103f6583214e9c4b203dfde0dd97e443a45255bc9aa0abaad7827 \ No newline at end of file diff --git a/test/data/ui-screenshots/queries.test.ts/omnibox-query/id-click---current-selection.png.sha256 b/test/data/ui-screenshots/queries.test.ts/omnibox-query/id-click---current-selection.png.sha256 index 0a887c48d23..fbb2703e7c7 100644 --- a/test/data/ui-screenshots/queries.test.ts/omnibox-query/id-click---current-selection.png.sha256 +++ b/test/data/ui-screenshots/queries.test.ts/omnibox-query/id-click---current-selection.png.sha256 @@ -1 +1 @@ -a169575435c7a07132e38155681fa6501673f79dbe706f0b04fd921ad2f9930f \ No newline at end of file +310297112d56d30a5335446b977dfdd06626be03c5ebeb2bc53afa3c70a8d857 \ No newline at end of file diff --git a/test/data/ui-screenshots/queries.test.ts/query-page-id-link-navigation/query-page-id-click---current-selection.png.sha256 b/test/data/ui-screenshots/queries.test.ts/query-page-id-link-navigation/query-page-id-click---current-selection.png.sha256 index ec8539b114c..fd7d107da91 100644 --- a/test/data/ui-screenshots/queries.test.ts/query-page-id-link-navigation/query-page-id-click---current-selection.png.sha256 +++ b/test/data/ui-screenshots/queries.test.ts/query-page-id-link-navigation/query-page-id-click---current-selection.png.sha256 @@ -1 +1 @@ -8a3ad911ea05cbb5f71ac1bcc4693e26e649d912c7d5e39e5a2ac1b00f5cd78e \ No newline at end of file +429a4b5026356c410183ab67c21d0ace40b2b57190897db03ad7b652f80716a6 \ No newline at end of file diff --git a/test/data/ui-screenshots/queries.test.ts/query-page-id-link-navigation/query-page-id-click---timeline.png.sha256 b/test/data/ui-screenshots/queries.test.ts/query-page-id-link-navigation/query-page-id-click---timeline.png.sha256 index 8862d90e139..167021ec15c 100644 --- a/test/data/ui-screenshots/queries.test.ts/query-page-id-link-navigation/query-page-id-click---timeline.png.sha256 +++ b/test/data/ui-screenshots/queries.test.ts/query-page-id-link-navigation/query-page-id-click---timeline.png.sha256 @@ -1 +1 @@ -5f582f0df034bdfadb58fd78ef02c570a68eb4e40a4540b7764b0eb73dd1fc4c \ No newline at end of file +881ea05f992981e6c11490ed1096d6c47903c089cd6483553258e2dada5869d9 \ No newline at end of file diff --git a/test/data/ui-screenshots/slice_double_click_zoom.test.ts/double-clicking-a-slice-zooms-into-it/slice-double-click-zoom.png.sha256 b/test/data/ui-screenshots/slice_double_click_zoom.test.ts/double-clicking-a-slice-zooms-into-it/slice-double-click-zoom.png.sha256 new file mode 100644 index 00000000000..0761724db04 --- /dev/null +++ b/test/data/ui-screenshots/slice_double_click_zoom.test.ts/double-clicking-a-slice-zooms-into-it/slice-double-click-zoom.png.sha256 @@ -0,0 +1 @@ +16c639fe7a78503e125f53f44514885369459ed0800203e458fc25784b726f87 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugCounterTrack-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugCounterTrack-command-test/after.png.sha256 index d201d92b43c..78f3ba5c308 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugCounterTrack-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugCounterTrack-command-test/after.png.sha256 @@ -1 +1 @@ -d0765d3ffdb503dba10a5a6bd142693747259465d0c8f706a7a6276917a48831 \ No newline at end of file +f1176562f0603681eacd554e60544646e789857b194f1588bf4902a61b977d99 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugCounterTrackWithPivot-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugCounterTrackWithPivot-command-test/after.png.sha256 index 0d441f81aa6..2e94a1227b6 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugCounterTrackWithPivot-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugCounterTrackWithPivot-command-test/after.png.sha256 @@ -1 +1 @@ -3387724f45ed440809de6f860e42f541c805f0ba02fd627a79ed412854307750 \ No newline at end of file +708c9f6439b49201d55d29d0ba236e1ed6f3173d581451d3bae9c26ef8bacbdc \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugSliceTrack-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugSliceTrack-command-test/after.png.sha256 index b8521461ff2..241df41ae92 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugSliceTrack-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugSliceTrack-command-test/after.png.sha256 @@ -1 +1 @@ -c36410341939e04fa222ba974f9d6ad92d13440a5cc95527f98aef9d09376346 \ No newline at end of file +1bace41f793472572078bbab6a7f32d23d5936c9794d72ddf291eed939184cb5 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugSliceTrackWithPivot-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugSliceTrackWithPivot-command-test/after.png.sha256 index e0cbdce69ae..b7ef0ba7379 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugSliceTrackWithPivot-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddDebugSliceTrackWithPivot-command-test/after.png.sha256 @@ -1 +1 @@ -b7ad5985ac323e7c6dc476622274abf6f172df337dd848e494aaa21378cdabd7 \ No newline at end of file +1735774e92024e926b9f149bc7854621d7e66e063be4adadba83e97fe6ffbd46 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddNoteAtTimestamp-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddNoteAtTimestamp-command-test/after.png.sha256 index 3399f0a4782..84ad98136ca 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddNoteAtTimestamp-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-AddNoteAtTimestamp-command-test/after.png.sha256 @@ -1 +1 @@ -518e19c1e56ea3cbfd9c01f7b13c9d3e2eb4eb18c7fe811fb357cd6fb9e3f7b5 \ No newline at end of file +8c43766884ea57684cb6b83251466a51e329dc8cd93dd6ec070ba68cbe2c217c \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-command-test/after.png.sha256 index 2bc1c6dd9c9..e1325f0bd65 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-command-test/after.png.sha256 @@ -1 +1 @@ -300c682f9f7543ec1ece3c95f71e555ca8487184e79f30cac6493731f465d2c0 \ No newline at end of file +18bd5c147111dbc893d3c2ea4717c4482810ae0e8a3e13f61538476b3c37cd2a \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-with-explicit-name-filtering/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-with-explicit-name-filtering/after.png.sha256 index 2bc1c6dd9c9..e1325f0bd65 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-with-explicit-name-filtering/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-with-explicit-name-filtering/after.png.sha256 @@ -1 +1 @@ -300c682f9f7543ec1ece3c95f71e555ca8487184e79f30cac6493731f465d2c0 \ No newline at end of file +18bd5c147111dbc893d3c2ea4717c4482810ae0e8a3e13f61538476b3c37cd2a \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-with-path-filtering/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-with-path-filtering/after.png.sha256 index 8708ffdf1d0..afec2d296f4 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-with-path-filtering/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CollapseTracksByRegex-with-path-filtering/after.png.sha256 @@ -1 +1 @@ -97f4966eff4bb8beeb19684c8a51cbc3c5796fad8a361f4c4b2a1df25f01be2d \ No newline at end of file +93d8a6148a269567924a7446e31466ce0071aa6decf82f44ff63d70315d9f0a4 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegex-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegex-command-test/after.png.sha256 index c7ed09ffa32..8f94ad1afcc 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegex-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegex-command-test/after.png.sha256 @@ -1 +1 @@ -9ab3249e2534f4e7638fd4c6b744a4a1b6111b4345a784c5df081c2685f518b2 \ No newline at end of file +06e6a067095b3f3c56cd46753646b6c274d427bebf7792bab02b7c3463e18533 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegex-with-path-filtering/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegex-with-path-filtering/after.png.sha256 index 03af2e07e94..640770faedd 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegex-with-path-filtering/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegex-with-path-filtering/after.png.sha256 @@ -1 +1 @@ -3b1aab4ce2b9551ba2cbcbf0c1c684b00fed13a4d4899a473849ad2fb1e30ad4 \ No newline at end of file +c4042b4eb271b702fc9baa429f3f27a4932794d560976d36e60a4fa70039e7ca \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegexWithAncestors-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegexWithAncestors-command-test/after.png.sha256 index a3819297e0d..3088a9b11f8 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegexWithAncestors-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegexWithAncestors-command-test/after.png.sha256 @@ -1 +1 @@ -66b11be349ca4b1e161b524334db1daca714d5399f1d9f95077686935e20f73c \ No newline at end of file +4dd132412f5b514a3e963c159df930ed562849e5c24a6bd34d4e79a4fc6dd518 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegexWithAncestors-with-path-filtering/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegexWithAncestors-with-path-filtering/after.png.sha256 index b2de9e9bbcf..9cad0131a98 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegexWithAncestors-with-path-filtering/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CopyTracksToWorkspaceByRegexWithAncestors-with-path-filtering/after.png.sha256 @@ -1 +1 @@ -36ed536f5013910a92ff2646bff4c4d05dde2841cf98dc4f5d46f62c2bc4053a \ No newline at end of file +9c38e981519f392b87065bef7e8037377eff45057d1b0aa225ff52f0f392bb01 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CreateWorkspace-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CreateWorkspace-command-test/after.png.sha256 index 235ee179e9a..bb1a96d75ae 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CreateWorkspace-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-CreateWorkspace-command-test/after.png.sha256 @@ -1 +1 @@ -0a68623bd145cf41c8940f37b50bf2c2ef72ae4e302089e55b91ce064a970e97 \ No newline at end of file +e0c9bacee458a28714e4500618e309b4ff71284414d11af2296b8dff646c24be \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-command-test/after.png.sha256 index 13f386534d6..4dcdfbec64a 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-command-test/after.png.sha256 @@ -1 +1 @@ -236f3700cc1408d730cf07759197b93990191b76fd3ce8d2a240ec4ff71d069c \ No newline at end of file +a85cc0761ca98c9c4e390633eec4199933d915cc083cceb79ea5b06a69eb412e \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-with-explicit-name-filtering/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-with-explicit-name-filtering/after.png.sha256 index 13f386534d6..4dcdfbec64a 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-with-explicit-name-filtering/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-with-explicit-name-filtering/after.png.sha256 @@ -1 +1 @@ -236f3700cc1408d730cf07759197b93990191b76fd3ce8d2a240ec4ff71d069c \ No newline at end of file +a85cc0761ca98c9c4e390633eec4199933d915cc083cceb79ea5b06a69eb412e \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-with-path-filtering/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-with-path-filtering/after.png.sha256 index 13f386534d6..4dcdfbec64a 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-with-path-filtering/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-ExpandTracksByRegex-with-path-filtering/after.png.sha256 @@ -1 +1 @@ -236f3700cc1408d730cf07759197b93990191b76fd3ce8d2a240ec4ff71d069c \ No newline at end of file +a85cc0761ca98c9c4e390633eec4199933d915cc083cceb79ea5b06a69eb412e \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-command-test/after.png.sha256 index f3f41cc6d2e..ca12dad43cc 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-command-test/after.png.sha256 @@ -1 +1 @@ -84c75030e0931cdb8311baebc69ea2754261a25c148d7294b5b16bed62524e1a \ No newline at end of file +cf809aa627ef3b75b644172c91b162b6d626f3b8ffcd3f5bf3253173c8a09a01 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-with-explicit-name-filtering/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-with-explicit-name-filtering/after.png.sha256 index f3f41cc6d2e..ca12dad43cc 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-with-explicit-name-filtering/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-with-explicit-name-filtering/after.png.sha256 @@ -1 +1 @@ -84c75030e0931cdb8311baebc69ea2754261a25c148d7294b5b16bed62524e1a \ No newline at end of file +cf809aa627ef3b75b644172c91b162b6d626f3b8ffcd3f5bf3253173c8a09a01 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-with-path-filtering/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-with-path-filtering/after.png.sha256 index e51497ad098..6e2039ca53a 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-with-path-filtering/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-PinTracksByRegex-with-path-filtering/after.png.sha256 @@ -1 +1 @@ -a83455ab364d02f2b2a67265c36790e9b214a24bad2457577cfa5a1ab16d72ae \ No newline at end of file +5ed532770eebdea674b1c74cedf85b84ac1098a58577c4e0923ebd78b59523c5 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQuery-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQuery-command-test/after.png.sha256 index f1bc7d5e8c5..b0539d459b3 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQuery-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQuery-command-test/after.png.sha256 @@ -1 +1 @@ -96a808af52a3374b4a0828726988f75e1c42cfa823b1cb4e475feeefe75816c0 \ No newline at end of file +0d3fa6f6e04cd6f92401b5c124f7575ab0ff965dae4acdad45e1f831938c6841 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQueryAndShowTab-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQueryAndShowTab-command-test/after.png.sha256 index 092802214a0..63dc8f9c27a 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQueryAndShowTab-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQueryAndShowTab-command-test/after.png.sha256 @@ -1 +1 @@ -17b95d2aeb16d6583e77e4c3acb334a9f846ce79c9fb66f50a2cd3147beb4082 \ No newline at end of file +57fba10f107b380b0f3a1aa300829167501634a7b0ac47ee80aa92e820d52339 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQueryAndShowTab-with-custom-name/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQueryAndShowTab-with-custom-name/after.png.sha256 index 5f90e3de6a2..fc9649c1298 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQueryAndShowTab-with-custom-name/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-RunQueryAndShowTab-with-custom-name/after.png.sha256 @@ -1 +1 @@ -6c33bf4e8254058799abc5fc30d4af64115f6104b71c318db4d47353f5ec6634 \ No newline at end of file +1056357f80d37a2f2885f4495682f650209f8a4122eb940e9ce1ff1049795243 \ No newline at end of file diff --git a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-SwitchWorkspace-command-test/after.png.sha256 b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-SwitchWorkspace-command-test/after.png.sha256 index 235ee179e9a..bb1a96d75ae 100644 --- a/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-SwitchWorkspace-command-test/after.png.sha256 +++ b/test/data/ui-screenshots/startup_commands_allowlist.test.ts/dev-perfetto-SwitchWorkspace-command-test/after.png.sha256 @@ -1 +1 @@ -0a68623bd145cf41c8940f37b50bf2c2ef72ae4e302089e55b91ce064a970e97 \ No newline at end of file +e0c9bacee458a28714e4500618e309b4ff71284414d11af2296b8dff646c24be \ No newline at end of file diff --git a/test/data/ui-screenshots/table_viewer.test.ts/Go-to-sched/go-to.png.sha256 b/test/data/ui-screenshots/table_viewer.test.ts/Go-to-sched/go-to.png.sha256 index 8e744737046..8cb22ba01d0 100644 --- a/test/data/ui-screenshots/table_viewer.test.ts/Go-to-sched/go-to.png.sha256 +++ b/test/data/ui-screenshots/table_viewer.test.ts/Go-to-sched/go-to.png.sha256 @@ -1 +1 @@ -464ed250f0842ac82f996a19d6d8eaf2d00ef3673d19ba724ec61b95d143c183 \ No newline at end of file +1f469d874b92d4eee0919ed29bd4974d27b3926ccf2dda1e4731c45a363035e5 \ No newline at end of file diff --git a/test/data/ui-screenshots/table_viewer.test.ts/Go-to-slice/go-to.png.sha256 b/test/data/ui-screenshots/table_viewer.test.ts/Go-to-slice/go-to.png.sha256 index d31f4fc330d..7a4e6ca9dff 100644 --- a/test/data/ui-screenshots/table_viewer.test.ts/Go-to-slice/go-to.png.sha256 +++ b/test/data/ui-screenshots/table_viewer.test.ts/Go-to-slice/go-to.png.sha256 @@ -1 +1 @@ -294c45b1c7afc7c433e2871e027644f9d46ec3e3ffaf356891e187ece6710355 \ No newline at end of file +8ef11152072c3fdfa65a60c48e7e38cdbb0ae85d7e94ecc77b3656bc990e50f4 \ No newline at end of file diff --git a/test/data/ui-screenshots/table_viewer.test.ts/Go-to-thread-state/go-to.png.sha256 b/test/data/ui-screenshots/table_viewer.test.ts/Go-to-thread-state/go-to.png.sha256 index b94e4027317..bb3fe97805d 100644 --- a/test/data/ui-screenshots/table_viewer.test.ts/Go-to-thread-state/go-to.png.sha256 +++ b/test/data/ui-screenshots/table_viewer.test.ts/Go-to-thread-state/go-to.png.sha256 @@ -1 +1 @@ -b61f10a0942476d579bd8ed7918c5053257a53d9e4cd771ac7e74d02a1c256c3 \ No newline at end of file +86de2d5ca6cb886301432660b1efd2f3a1436cfe41c7125925cf7b15bb2113ef \ No newline at end of file diff --git a/test/data/ui-screenshots/track_event_callstacks.test.ts/measure-picker-menu/measure-picker.png.sha256 b/test/data/ui-screenshots/track_event_callstacks.test.ts/measure-picker-menu/measure-picker.png.sha256 index 740c957f1f4..f29686b0ae6 100644 --- a/test/data/ui-screenshots/track_event_callstacks.test.ts/measure-picker-menu/measure-picker.png.sha256 +++ b/test/data/ui-screenshots/track_event_callstacks.test.ts/measure-picker-menu/measure-picker.png.sha256 @@ -1 +1 @@ -01a14445e415464e1a6190360318ba358d9fd79f46696026d165bde73909e348 \ No newline at end of file +b39c90028e1df4da4f7dc46ce43d31ea85c5193e83f98b614c0b18f0fd3bf9cf \ No newline at end of file diff --git a/test/data/ui-screenshots/track_event_description.test.ts/Android-log-track-description/android-log-description.png.sha256 b/test/data/ui-screenshots/track_event_description.test.ts/Android-log-track-description/android-log-description.png.sha256 index d3cbf40f05e..c9d3727fb07 100644 --- a/test/data/ui-screenshots/track_event_description.test.ts/Android-log-track-description/android-log-description.png.sha256 +++ b/test/data/ui-screenshots/track_event_description.test.ts/Android-log-track-description/android-log-description.png.sha256 @@ -1 +1 @@ -073029b5a3e3dc33acd36544b30a3dac0074864b5c84a9f30dbe9d6f89e962e2 \ No newline at end of file +2d175e31c2b42fd37cef3445fad3028e289fe075f9aa027b06c4aafdc4e97274 \ No newline at end of file diff --git a/test/data/ui-screenshots/track_event_description.test.ts/Cpu-thread-scheduling-description/cpu-scheduling-description.png.sha256 b/test/data/ui-screenshots/track_event_description.test.ts/Cpu-thread-scheduling-description/cpu-scheduling-description.png.sha256 index cfd74ba8cc4..9d2cd6dd9de 100644 --- a/test/data/ui-screenshots/track_event_description.test.ts/Cpu-thread-scheduling-description/cpu-scheduling-description.png.sha256 +++ b/test/data/ui-screenshots/track_event_description.test.ts/Cpu-thread-scheduling-description/cpu-scheduling-description.png.sha256 @@ -1 +1 @@ -657c97b20a3c874ebd6a6be3f729589d7f1f269e973f8f4176cc02628dbabc9f \ No newline at end of file +d3f9f510f06d78e3d79672827e609d2ad4118dac146f9570ca7027ef1cfa26dc \ No newline at end of file diff --git a/test/data/ui-screenshots/track_event_description.test.ts/Ftrace-track-description/ftrace-description.png.sha256 b/test/data/ui-screenshots/track_event_description.test.ts/Ftrace-track-description/ftrace-description.png.sha256 index d7084a125f6..528f80b7a27 100644 --- a/test/data/ui-screenshots/track_event_description.test.ts/Ftrace-track-description/ftrace-description.png.sha256 +++ b/test/data/ui-screenshots/track_event_description.test.ts/Ftrace-track-description/ftrace-description.png.sha256 @@ -1 +1 @@ -77c6079256f263b019c011abd2df25f0a28bd3f81b7cc55dc6867e497135baea \ No newline at end of file +96c42ffe80f7112977b90e4ee849d283f9b4b433b30205c3b4fe277bf7f96330 \ No newline at end of file diff --git a/test/data/ui-screenshots/track_event_description.test.ts/Thread-state-description/thread-state-description.png.sha256 b/test/data/ui-screenshots/track_event_description.test.ts/Thread-state-description/thread-state-description.png.sha256 index 33efa2538fb..ddf6d19b635 100644 --- a/test/data/ui-screenshots/track_event_description.test.ts/Thread-state-description/thread-state-description.png.sha256 +++ b/test/data/ui-screenshots/track_event_description.test.ts/Thread-state-description/thread-state-description.png.sha256 @@ -1 +1 @@ -afc0b2c4b253f3e07e4327076b84a6edf758097f59458dad053fed5d4f2918ec \ No newline at end of file +a25035eeba9f9083b8b61057f15b1e36c0b9e87d4b3eefe42cd408910d8f8882 \ No newline at end of file diff --git a/test/data/ui-screenshots/track_event_description.test.ts/TrackDescriptor-description/track-descriptor-description.png.sha256 b/test/data/ui-screenshots/track_event_description.test.ts/TrackDescriptor-description/track-descriptor-description.png.sha256 index 64e0fab2c25..d1d4871fa86 100644 --- a/test/data/ui-screenshots/track_event_description.test.ts/TrackDescriptor-description/track-descriptor-description.png.sha256 +++ b/test/data/ui-screenshots/track_event_description.test.ts/TrackDescriptor-description/track-descriptor-description.png.sha256 @@ -1 +1 @@ -bf11bc587860c01e0d98a114dbf8fcff30434c1c420744e00fc8f35853db385a \ No newline at end of file +6f4cb8962136405670abdfe0b3c8fa50f5f8a9661deefbb261abd27dee28f22e \ No newline at end of file diff --git a/test/data/ui-screenshots/wattson.test.ts/sched-aggregations/sched-aggr-process.png.sha256 b/test/data/ui-screenshots/wattson.test.ts/sched-aggregations/sched-aggr-process.png.sha256 index 16d2d963bc2..7b3dd5d6862 100644 --- a/test/data/ui-screenshots/wattson.test.ts/sched-aggregations/sched-aggr-process.png.sha256 +++ b/test/data/ui-screenshots/wattson.test.ts/sched-aggregations/sched-aggr-process.png.sha256 @@ -1 +1 @@ -f1b7c59513ed4592532efc508ba47114ab0e10902c8bffeb91ec49e465e1279e \ No newline at end of file +aa4131b436fd9d849f370ff785997862df09f432c6a7d340067b624bd3b5a5ac \ No newline at end of file diff --git a/test/data/ui-screenshots/wattson.test.ts/sched-aggregations/sched-aggr-thread.png.sha256 b/test/data/ui-screenshots/wattson.test.ts/sched-aggregations/sched-aggr-thread.png.sha256 index 31a44876d60..5209b4af102 100644 --- a/test/data/ui-screenshots/wattson.test.ts/sched-aggregations/sched-aggr-thread.png.sha256 +++ b/test/data/ui-screenshots/wattson.test.ts/sched-aggregations/sched-aggr-thread.png.sha256 @@ -1 +1 @@ -4e83184fd576eea21ec1166e79e7d6d37d4c431033bd7f67f7483640e340393a \ No newline at end of file +0060b7fd6a232d211b15a29e75465f2ffbec1a095e959c3f13e43137376a3330 \ No newline at end of file diff --git a/test/data/ui-screenshots/zoom.test.ts/zoom-in/zoomed-in.png.sha256 b/test/data/ui-screenshots/zoom.test.ts/zoom-in/zoomed-in.png.sha256 index 55e2118b52f..c53b3193ca9 100644 --- a/test/data/ui-screenshots/zoom.test.ts/zoom-in/zoomed-in.png.sha256 +++ b/test/data/ui-screenshots/zoom.test.ts/zoom-in/zoomed-in.png.sha256 @@ -1 +1 @@ -4d766de4c21e98534ee022caf5674946552a4edfc709aeaed5c6bd955dbbb2f9 \ No newline at end of file +7e6c2d38aa717e42f291523cbf6be7c4fe20fb094f1778ac72459a294b08c33b \ No newline at end of file diff --git a/test/data/ui-screenshots/zoom.test.ts/zoom-out/zoomed-out.png.sha256 b/test/data/ui-screenshots/zoom.test.ts/zoom-out/zoomed-out.png.sha256 index 510a513b99a..e9e6e08d941 100644 --- a/test/data/ui-screenshots/zoom.test.ts/zoom-out/zoomed-out.png.sha256 +++ b/test/data/ui-screenshots/zoom.test.ts/zoom-out/zoomed-out.png.sha256 @@ -1 +1 @@ -df64732436a1090f46125bad3b7a745f667a8bbfd64c85763749124c98fe746b \ No newline at end of file +ddc90e02ece0ab8a7cd743922b42e12efdfedaf841fb904339202b04caf4a867 \ No newline at end of file diff --git a/test/trace_processor/diff_tests/include_index.py b/test/trace_processor/diff_tests/include_index.py index 3cff009ce23..3ffb076ef1e 100644 --- a/test/trace_processor/diff_tests/include_index.py +++ b/test/trace_processor/diff_tests/include_index.py @@ -188,6 +188,7 @@ from diff_tests.stdlib.viz.tests import Viz from diff_tests.stdlib.wattson.tests import WattsonStdlib from diff_tests.syntax.filtering_tests import PerfettoFiltering +from diff_tests.syntax.flamegraph_tests import PerfettoFlamegraph from diff_tests.syntax.function_tests import PerfettoFunction from diff_tests.syntax.include_tests import PerfettoInclude from diff_tests.syntax.macro_tests import PerfettoMacro @@ -380,6 +381,7 @@ def fetch_all_diff_tests( syntax_tests = [ PerfettoFiltering, + PerfettoFlamegraph, PerfettoFunction, PerfettoInclude, PerfettoMacro, diff --git a/test/trace_processor/diff_tests/parser/parsing/tests_traced_stats.py b/test/trace_processor/diff_tests/parser/parsing/tests_traced_stats.py index 21a4e89fb14..2d3eb4f30d0 100644 --- a/test/trace_processor/diff_tests/parser/parsing/tests_traced_stats.py +++ b/test/trace_processor/diff_tests/parser/parsing/tests_traced_stats.py @@ -263,3 +263,67 @@ def test_data_loss_cause_breakdown(self): "traced_buf_data_loss_smb_full",0,1 "traced_buf_data_loss_writer_abort",0,1 """)) + + # Check that overwrites in a `write_into_file` trace map to + # `long_trace_mode_bytes_overwritten`, one row per affected buffer with the + # bytes it overwrote. Buffer 1 overwrote nothing, so it gets no row. + def test_long_trace_mode_bytes_overwritten(self): + return DiffTestBlueprint( + trace=TextProto(r""" + packet { + trace_config { + write_into_file: true + file_write_period_ms: 5000 + buffers { size_kb: 1024 } + buffers { size_kb: 1024 fill_policy: RING_BUFFER } + } + } + packet { + trusted_uid: 9999 + trusted_packet_sequence_id: 1 + trace_stats { + buffer_stats { bytes_written: 4096 bytes_overwritten: 2048 } + buffer_stats { bytes_written: 4096 bytes_overwritten: 0 } + } + } + """), + query=""" + SELECT idx, value + FROM stats + WHERE name = 'long_trace_mode_bytes_overwritten' + ORDER BY idx; + """, + out=Csv(""" + "idx","value" + 0,2048 + """)) + + # Check that a 7 day `file_write_period_ms` produces no stat: the client is + # asking for ring-buffer behavior (see RecordLongTraceModeOverwrites). + def test_long_trace_mode_bytes_overwritten_ring_buffer_intent(self): + return DiffTestBlueprint( + trace=TextProto(r""" + packet { + trace_config { + write_into_file: true + file_write_period_ms: 604800000 + buffers { size_kb: 1024 } + } + } + packet { + trusted_uid: 9999 + trusted_packet_sequence_id: 1 + trace_stats { + buffer_stats { bytes_written: 4096 bytes_overwritten: 2048 } + } + } + """), + query=""" + SELECT count(*) AS stat_rows + FROM stats + WHERE name = 'long_trace_mode_bytes_overwritten'; + """, + out=Csv(""" + "stat_rows" + 0 + """)) diff --git a/test/trace_processor/diff_tests/parser/profiling/heap_graph_flamegraph_system-server-heap-graph.out b/test/trace_processor/diff_tests/parser/profiling/heap_graph_flamegraph_system-server-heap-graph.out index d01eaf8b467..420f6a8fc53 100644 --- a/test/trace_processor/diff_tests/parser/profiling/heap_graph_flamegraph_system-server-heap-graph.out +++ b/test/trace_processor/diff_tests/parser/profiling/heap_graph_flamegraph_system-server-heap-graph.out @@ -1,11 +1,11 @@ -"id","depth","name","map_name","count","cumulative_count","size","cumulative_size","parent_id" -0,0,"android.app.LoadedApk$ServiceDispatcher$DeathMonitor [ROOT_JNI_GLOBAL]","JAVA",32,789,640,54860,"[NULL]" -1,1,"android.app.LoadedApk$ServiceDispatcher","JAVA",31,683,1395,51674,0 -2,2,"android.app.ActivityThread$H","JAVA",1,1,32,32,1 -3,2,"android.app.LoadedApk$ServiceDispatcher$InnerConnection","JAVA",31,62,868,1612,1 -4,3,"java.lang.ref.WeakReference","JAVA",31,31,744,744,3 -5,2,"android.util.ArrayMap","JAVA",31,125,775,3519,1 -6,3,"java.lang.Object[]","JAVA",31,63,1364,1876,5 -7,4,"android.app.LoadedApk$ServiceDispatcher$ConnectionInfo","JAVA",32,32,512,512,6 -8,3,"int[]","JAVA",31,31,868,868,5 -9,2,"android.app.ServiceConnectionLeaked","JAVA",31,145,868,22009,1 +"depth","name","map_name","count","cumulative_count","size","cumulative_size" +0,"com.android.server.pm.PackageManagerService [ROOT_JNI_GLOBAL]","JAVA",1,109541,450,5749404 +1,"com.android.server.pm.ComponentResolver","JAVA",1,60095,37,3281092 +0,"java.lang.String [ROOT_INTERNED_STRING]","JAVA",41197,41197,1845640,1845640 +2,"com.android.server.pm.ComponentResolver$ActivityIntentResolver","JAVA",1,31934,52,1768143 +3,"android.util.ArrayMap","JAVA",8,18910,200,1261878 +4,"java.lang.Object[]","JAVA",7,18895,52020,1235626 +1,"com.android.server.pm.Settings","JAVA",1,29766,140,1170047 +0,"java.lang.Class [ROOT_STICKY_CLASS]","JAVA",1,12552,163,1120275 +1,"android.icu.text.TransliteratorRegistry","JAVA",1,12545,20,1119648 +2,"java.util.Collections$SynchronizedMap","JAVA",2,10614,56,1063424 diff --git a/test/trace_processor/diff_tests/parser/profiling/tests_heap_graph.py b/test/trace_processor/diff_tests/parser/profiling/tests_heap_graph.py index 24f6e9db21c..7f70b3d02b6 100644 --- a/test/trace_processor/diff_tests/parser/profiling/tests_heap_graph.py +++ b/test/trace_processor/diff_tests/parser/profiling/tests_heap_graph.py @@ -422,15 +422,13 @@ def test_heap_graph_flamegraph_system_server_heap_graph(self): trace=DataPath('system-server-heap-graph-new.pftrace'), query=""" SELECT - id, depth, name, map_name, count, cumulative_count, size, - cumulative_size, - parent_id + cumulative_size FROM experimental_flamegraph( 'graph', (SELECT max(graph_sample_ts) FROM heap_graph_object), @@ -439,6 +437,7 @@ def test_heap_graph_flamegraph_system_server_heap_graph(self): NULL, NULL ) + ORDER BY cumulative_size DESC, name LIMIT 10; """, out=Path('heap_graph_flamegraph_system-server-heap-graph.out')) @@ -482,7 +481,6 @@ def test_heap_profile_flamegraph_system_server_native_profile(self): trace=DataPath('system-server-native-profile'), query=""" SELECT - id, ts, depth, name, @@ -495,7 +493,6 @@ def test_heap_profile_flamegraph_system_server_native_profile(self): cumulative_alloc_count, alloc_size, cumulative_alloc_size, - parent_id, source_file, line_number FROM experimental_flamegraph( @@ -506,20 +503,21 @@ def test_heap_profile_flamegraph_system_server_native_profile(self): NULL, NULL ) + ORDER BY depth, name, map_name, cumulative_size, cumulative_count LIMIT 10; """, out=Csv(''' - "id","ts","depth","name","map_name","count","cumulative_count","size","cumulative_size","alloc_count","cumulative_alloc_count","alloc_size","cumulative_alloc_size","parent_id","source_file","line_number" - 0,605908369259172,0,"__start_thread","/apex/com.android.runtime/lib64/bionic/libc.so",0,8,0,84848,0,210,0,1084996,"[NULL]","[NULL]","[NULL]" - 1,605908369259172,1,"_ZL15__pthread_startPv","/apex/com.android.runtime/lib64/bionic/libc.so",0,8,0,84848,0,210,0,1084996,0,"[NULL]","[NULL]" - 2,605908369259172,2,"_ZN7android14AndroidRuntime15javaThreadShellEPv","/system/lib64/libandroid_runtime.so",0,5,0,27704,0,77,0,348050,1,"[NULL]","[NULL]" - 3,605908369259172,3,"_ZN7android6Thread11_threadLoopEPv","/system/lib64/libutils.so",0,5,0,27704,0,77,0,348050,2,"[NULL]","[NULL]" - 4,605908369259172,4,"_ZN7android10PoolThread10threadLoopEv","/system/lib64/libbinder.so",0,1,0,4096,0,64,0,279182,3,"[NULL]","[NULL]" - 5,605908369259172,5,"_ZN7android14IPCThreadState14joinThreadPoolEb","/system/lib64/libbinder.so",0,1,0,4096,0,64,0,279182,4,"[NULL]","[NULL]" - 6,605908369259172,6,"_ZN7android14IPCThreadState20getAndExecuteCommandEv","/system/lib64/libbinder.so",0,1,0,4096,0,64,0,279182,5,"[NULL]","[NULL]" - 7,605908369259172,7,"_ZN7android14IPCThreadState14executeCommandEi","/system/lib64/libbinder.so",0,1,0,4096,0,64,0,279182,6,"[NULL]","[NULL]" - 8,605908369259172,8,"_ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j","/system/lib64/libbinder.so",0,1,0,4096,0,64,0,279182,7,"[NULL]","[NULL]" - 9,605908369259172,9,"_ZN11JavaBBinder10onTransactEjRKN7android6ParcelEPS1_j","/system/lib64/libandroid_runtime.so",0,0,0,0,0,60,0,262730,8,"[NULL]","[NULL]" + "ts","depth","name","map_name","count","cumulative_count","size","cumulative_size","alloc_count","cumulative_alloc_count","alloc_size","cumulative_alloc_size","source_file","line_number" + 605908369259172,0,"__libc_init","/apex/com.android.runtime/lib64/bionic/libc.so",0,0,0,0,0,7,0,29012,"[NULL]","[NULL]" + 605908369259172,0,"__start_thread","/apex/com.android.runtime/lib64/bionic/libc.so",0,8,0,84848,0,210,0,1084996,"[NULL]","[NULL]" + 605908369259172,1,"_ZL15__pthread_startPv","/apex/com.android.runtime/lib64/bionic/libc.so",0,8,0,84848,0,210,0,1084996,"[NULL]","[NULL]" + 605908369259172,1,"main","/system/bin/app_process64",0,0,0,0,0,7,0,29012,"[NULL]","[NULL]" + 605908369259172,2,"_ZN3art6Thread14CreateCallbackEPv","/apex/com.android.art/lib64/libart.so",0,3,0,57144,0,133,0,736946,"[NULL]","[NULL]" + 605908369259172,2,"_ZN7android14AndroidRuntime15javaThreadShellEPv","/system/lib64/libandroid_runtime.so",0,5,0,27704,0,77,0,348050,"[NULL]","[NULL]" + 605908369259172,2,"_ZN7android14AndroidRuntime5startEPKcRKNS_6VectorINS_7String8EEEb","/system/lib64/libandroid_runtime.so",0,0,0,0,0,7,0,29012,"[NULL]","[NULL]" + 605908369259172,3,"_ZN3art35InvokeVirtualOrInterfaceWithJValuesIPNS_9ArtMethodEEENS_6JValueERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectT_PK6jvalue","/apex/com.android.art/lib64/libart.so",0,3,0,57144,0,133,0,736946,"[NULL]","[NULL]" + 605908369259172,3,"_ZN7_JNIEnv20CallStaticVoidMethodEP7_jclassP10_jmethodIDz","/system/lib64/libandroid_runtime.so",0,0,0,0,0,7,0,29012,"[NULL]","[NULL]" + 605908369259172,3,"_ZN7android6Thread11_threadLoopEPv","/system/lib64/libutils.so",0,5,0,27704,0,77,0,348050,"[NULL]","[NULL]" ''')) def test_heap_profile_tracker_new_stack(self): diff --git a/test/trace_processor/diff_tests/parser/profiling/tests_llvm_symbolizer.py b/test/trace_processor/diff_tests/parser/profiling/tests_llvm_symbolizer.py index 55dfadd87b2..ac40cdbc846 100644 --- a/test/trace_processor/diff_tests/parser/profiling/tests_llvm_symbolizer.py +++ b/test/trace_processor/diff_tests/parser/profiling/tests_llvm_symbolizer.py @@ -34,7 +34,6 @@ def test_callstack_sampling_flamegraph(self): trace=DataPath('callstack_sampling.pftrace'), query=""" SELECT - ef.id, ef.ts, ef.depth, ef.name, @@ -47,7 +46,6 @@ def test_callstack_sampling_flamegraph(self): cumulative_alloc_count, alloc_size, cumulative_alloc_size, - ef.parent_id, ef.source_file, ef.line_number FROM process @@ -60,20 +58,22 @@ def test_callstack_sampling_flamegraph(self): NULL ) ef WHERE pid = 1728 + ORDER BY ef.depth, ef.name, ef.map_name, ef.cumulative_size, + ef.cumulative_count LIMIT 10; """, out=Csv(''' - "id","ts","depth","name","map_name","count","cumulative_count","size","cumulative_size","alloc_count","cumulative_alloc_count","alloc_size","cumulative_alloc_size","parent_id","source_file","line_number" - 0,7689491063351,0,"__start_thread","/apex/com.android.runtime/lib64/bionic/libc.so",0,560,0,560,0,0,0,0,"[NULL]","[NULL]","[NULL]" - 1,7689491063351,1,"_ZL15__pthread_startPv","/apex/com.android.runtime/lib64/bionic/libc.so",0,560,0,560,0,0,0,0,0,"[NULL]","[NULL]" - 2,7689491063351,2,"_ZN3art6Thread14CreateCallbackEPv","/apex/com.android.art/lib64/libart.so",0,301,0,301,0,0,0,0,1,"[NULL]","[NULL]" - 3,7689491063351,3,"_ZN3art35InvokeVirtualOrInterfaceWithJValuesIPNS_9ArtMethodEEENS_6JValueERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectT_PK6jvalue","/apex/com.android.art/lib64/libart.so",0,301,0,301,0,0,0,0,2,"[NULL]","[NULL]" - 4,7689491063351,4,"_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc","/apex/com.android.art/lib64/libart.so",0,301,0,301,0,0,0,0,3,"[NULL]","[NULL]" - 5,7689491063351,5,"art_quick_invoke_stub","/apex/com.android.art/lib64/libart.so",0,301,0,301,0,0,0,0,4,"[NULL]","[NULL]" - 6,7689491063351,6,"android.os.HandlerThread.run","/system/framework/arm64/boot-framework.oat",0,43,0,43,0,0,0,0,5,"[NULL]","[NULL]" - 7,7689491063351,7,"android.os.Looper.loop","/system/framework/arm64/boot-framework.oat",0,43,0,43,0,0,0,0,6,"[NULL]","[NULL]" - 8,7683950792832,8,"android.os.Looper.loopOnce","/system/framework/arm64/boot-framework.oat",1,43,1,43,0,0,0,0,7,"[NULL]","[NULL]" - 9,7689491063351,9,"android.os.Handler.dispatchMessage","/system/framework/arm64/boot-framework.oat",0,35,0,35,0,0,0,0,8,"[NULL]","[NULL]" + "ts","depth","name","map_name","count","cumulative_count","size","cumulative_size","alloc_count","cumulative_alloc_count","alloc_size","cumulative_alloc_size","source_file","line_number" + 7689491063351,0,"ERROR INVALID_MAP","/ERROR",0,1,0,1,0,0,0,0,"[NULL]","[NULL]" + 7689491063351,0,"__libc_init","/apex/com.android.runtime/lib64/bionic/libc.so",0,10,0,10,0,0,0,0,"[NULL]","[NULL]" + 7689491063351,0,"__start_thread","/apex/com.android.runtime/lib64/bionic/libc.so",0,560,0,560,0,0,0,0,"[NULL]","[NULL]" + 7689491063351,0,"clone","/apex/com.android.runtime/lib64/bionic/libc.so",0,1,0,1,0,0,0,0,"[NULL]","[NULL]" + 7689491063351,1,"","",0,1,0,1,0,0,0,0,"[NULL]","[NULL]" + 7689491063351,1,"_ZL15__pthread_startPv","/apex/com.android.runtime/lib64/bionic/libc.so",0,560,0,560,0,0,0,0,"[NULL]","[NULL]" + 7689491063351,1,"__bionic_clone","/apex/com.android.runtime/lib64/bionic/libc.so",0,1,0,1,0,0,0,0,"[NULL]","[NULL]" + 7689491063351,1,"main","/system/bin/app_process64",0,10,0,10,0,0,0,0,"[NULL]","[NULL]" + 7689491063351,1,"main","/system/bin/surfaceflinger",0,0,0,0,0,0,0,0,"[NULL]","[NULL]" + 7689491063351,2,"_ZN13thread_data_t10trampolineEPKS_","/system/lib64/libutils.so",0,246,0,246,0,0,0,0,"[NULL]","[NULL]" ''')) def test_callstack_sampling_flamegraph_multi_process(self): diff --git a/test/trace_processor/diff_tests/syntax/flamegraph_tests.py b/test/trace_processor/diff_tests/syntax/flamegraph_tests.py new file mode 100644 index 00000000000..e4239b5b7c1 --- /dev/null +++ b/test/trace_processor/diff_tests/syntax/flamegraph_tests.py @@ -0,0 +1,415 @@ +#!/usr/bin/env python3 +# Copyright (C) 2026 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. + +from python.generators.diff_tests.testing import Csv, TextProto +from python.generators.diff_tests.testing import DiffTestBlueprint +from python.generators.diff_tests.testing import ExpectedError +from python.generators.diff_tests.testing import TestSuite + + +class PerfettoFlamegraph(TestSuite): + + def test_top_down(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'main' AS name, 1 AS value + UNION ALL SELECT 2, 1, 'a', 2 + UNION ALL SELECT 3, 1, 'a', 3 + UNION ALL SELECT 4, 2, 'b', 4 + )); + SELECT name, depth, self_value, cumulative_value, + parent_cumulative_value, x_start, x_end + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN')); + """, + out=Csv(""" + "name","depth","self_value","cumulative_value","parent_cumulative_value","x_start","x_end" + "main",1,1,10,"[NULL]",0,10 + "a",2,5,9,10,0,9 + "b",3,4,4,9,0,4 + """)) + + def test_bottom_up(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'main' AS name, 1 AS value + UNION ALL SELECT 2, 1, 'a', 2 + UNION ALL SELECT 3, 2, 'b', 4 + )); + SELECT name, depth, self_value, cumulative_value, x_start, x_end + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'BOTTOM_UP')); + """, + out=Csv(""" + "name","depth","self_value","cumulative_value","x_start","x_end" + "b",-1,4,4,0,4 + "a",-1,2,2,4,6 + "main",-1,1,1,6,7 + "a",-2,0,4,0,4 + "main",-2,0,2,4,6 + "main",-3,0,4,0,4 + """)) + + def test_pivot(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'main' AS name, 1 AS value + UNION ALL SELECT 2, 1, 'a', 2 + UNION ALL SELECT 3, 2, 'b', 4 + UNION ALL SELECT 4, 3, 'c', 8 + )); + SELECT name, depth, self_value, cumulative_value, x_start, x_end + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'PIVOT', + 'view_pattern', '^b$', '')); + """, + out=Csv(""" + "name","depth","self_value","cumulative_value","x_start","x_end" + "b",1,4,12,0,12 + "b",-1,12,12,0,12 + "c",2,8,8,0,8 + "a",-2,0,12,0,12 + "main",-3,0,12,0,12 + """)) + + def test_show_stack_filter(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'main' AS name, 1 AS value + UNION ALL SELECT 2, 1, 'a', 2 + UNION ALL SELECT 3, 2, 'c', 4 + UNION ALL SELECT 4, 1, 'b', 8 + )); + SELECT name, depth, self_value, cumulative_value, x_start, x_end + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', + 'filter', 'SHOW_STACK', 'c', '')); + """, + out=Csv(""" + "name","depth","self_value","cumulative_value","x_start","x_end" + "main",1,0,4,0,4 + "a",2,0,4,0,4 + "c",3,4,4,0,4 + """)) + + def test_case_insensitive_filter(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'Main' AS name, 1 AS value + UNION ALL SELECT 2, 1, 'Child', 2 + )); + SELECT name, depth, self_value, cumulative_value, x_start, x_end + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', + 'filter', 'SHOW_STACK', 'child', 'i')); + """, + out=Csv(""" + "name","depth","self_value","cumulative_value","x_start","x_end" + "Main",1,0,2,0,2 + "Child",2,2,2,0,2 + """)) + + def test_hide_stack_filter(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'main' AS name, 1 AS value + UNION ALL SELECT 2, 1, 'a', 2 + UNION ALL SELECT 3, 2, 'c', 4 + UNION ALL SELECT 4, 1, 'b', 8 + )); + SELECT name, depth, self_value, cumulative_value, x_start, x_end + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', + 'filter', 'HIDE_STACK', 'c', '')); + """, + out=Csv(""" + "name","depth","self_value","cumulative_value","x_start","x_end" + "main",1,1,11,0,11 + "b",2,8,8,0,8 + "a",2,2,2,8,10 + """)) + + def test_from_frame(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'main' AS name, 1 AS value + UNION ALL SELECT 2, 1, 'a', 2 + UNION ALL SELECT 3, 2, 'b', 4 + UNION ALL SELECT 4, 3, 'c', 8 + )); + SELECT name, depth, self_value, cumulative_value, x_start, x_end + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'FROM_FRAME', + 'view_pattern', 'b', '')); + """, + out=Csv(""" + "name","depth","self_value","cumulative_value","x_start","x_end" + "b",1,4,12,0,12 + "c",2,8,8,0,8 + """)) + + def test_hide_frame_filter(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'main' AS name, 1 AS value + UNION ALL SELECT 2, 1, 'skipme', 2 + UNION ALL SELECT 3, 2, 'c', 3 + )); + SELECT name, depth, self_value, cumulative_value, x_start, x_end + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', + 'filter', 'HIDE_FRAME', 'skipme', '')); + """, + out=Csv(""" + "name","depth","self_value","cumulative_value","x_start","x_end" + "main",1,3,6,0,6 + "c",2,3,3,0,3 + """)) + + def test_null_grouping_column_does_not_match_empty_string(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'root' AS name, 4 AS value, + NULL AS g + )); + SELECT name + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', 'grouping', 'g', + 'filter', 'SHOW_STACK', '^$', '')); + """, + out=Csv(""" + "name" + """)) + + def test_filter_matches_numeric_grouping_column(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'root' AS name, 4 AS value, + (-9223372036854775807 - 1) AS g + )); + SELECT name, cumulative_value + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', 'grouping', 'g', + 'filter', 'SHOW_STACK', '^-9223372036854775808$', '')); + """, + out=Csv(""" + "name","cumulative_value" + "root",4 + """)) + + def test_filter_matches_grouping_column(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'root' AS name, 0 AS value, + 'other' AS g + UNION ALL SELECT 2, 1, 'child', 4, 'needle' + )); + SELECT name, self_value, cumulative_value + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', 'grouping', 'g', + 'filter', 'SHOW_STACK', '^needle$', '')); + """, + out=Csv(""" + "name","self_value","cumulative_value" + "root",0,4 + "child",4,4 + """)) + + def test_grouping_column(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'r' AS name, 1 AS value, + NULL AS g + UNION ALL SELECT 2, 1, 'x', 2, 'm1' + UNION ALL SELECT 3, 1, 'x', 3, 'm2' + )); + SELECT name, g, cumulative_value, x_start, x_end + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', 'grouping', 'g')); + """, + out=Csv(""" + "name","g","cumulative_value","x_start","x_end" + "r","[NULL]",6,0,6 + "x","m2",3,0,3 + "x","m1",2,3,5 + """)) + + def test_hide_frame_aggregate_and_operation_order(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'root' AS name, 1 AS value, + 2 AS s + UNION ALL SELECT 2, 1, 'skip', 3, 5 + UNION ALL SELECT 3, 2, 'leaf', 7, 11 + UNION ALL SELECT 4, 1, 'blocked', 13, 17 + )); + SELECT name, self_value, cumulative_value, s + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', + 'filter', 'HIDE_FRAME', '^skip$', '', + 'filter', 'HIDE_STACK', '^(skip|blocked)$', '', + 'aggregate', 'SUM', 's', 's')); + """, + out=Csv(""" + "name","self_value","cumulative_value","s" + "root",4,11,7 + "leaf",7,7,11 + """)) + + def test_bottom_up_hide_frame_aggregate(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'root' AS name, 1 AS value, + 2 AS s + UNION ALL SELECT 2, 1, 'skip', 3, 5 + UNION ALL SELECT 3, 2, 'leaf', 7, 11 + )); + SELECT name, depth, self_value, cumulative_value, s + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'BOTTOM_UP', + 'filter', 'HIDE_FRAME', '^skip$', '', + 'aggregate', 'SUM', 's', 's')); + """, + out=Csv(""" + "name","depth","self_value","cumulative_value","s" + "leaf",-1,7,7,11 + "root",-1,4,4,7 + "root",-2,0,7,7 + """)) + + def test_aggregate_columns(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'r' AS name, 1 AS value, + NULL AS s, 'root' AS summary, 'root' AS concatenated, + 5 AS n, 1.5 AS d + UNION ALL SELECT 2, 1, 'x', 2, 3, 'a', 'a', 7, 2.5 + UNION ALL SELECT 3, 1, 'x', 3, 5, 'b', 'b', 8, 2.5 + )); + SELECT name, s, summary, concatenated, n, d + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', + 'aggregate', 'SUM', 's', 's', + 'aggregate', 'ONE_OR_SUMMARY', 'summary', 'summary', + 'aggregate', 'CONCAT_WITH_COMMA', 'concatenated', 'concatenated', + 'aggregate', 'CONCAT_WITH_COMMA', 'n', 'n', + 'aggregate', 'CONCAT_WITH_COMMA', 'd', 'd')); + """, + out=Csv(""" + "name","s","summary","concatenated","n","d" + "r","[NULL]","root","root","5","1.5" + "x",8,"a and 2 others","a,b","7,8","2.5,2.5" + """)) + + def test_multiple_values(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'r' AS name, 0 AS value, + 1 AS bytes + UNION ALL SELECT 2, 1, 'x', 2, 0 + UNION ALL SELECT 3, 1, 'y', 0, 4 + )); + SELECT name, self_value, cumulative_value, + self_bytes, cumulative_bytes + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', 'value', 'bytes')); + """, + out=Csv(""" + "name","self_value","cumulative_value","self_bytes","cumulative_bytes" + "r",0,2,1,5 + "x",2,2,0,0 + "y",0,0,4,4 + """)) + + def test_super_root(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'r1' AS name, 1 AS value + UNION ALL SELECT 2, NULL, 'r2', 2 + UNION ALL SELECT 3, 1, 'child', 4 + )); + SELECT _tree_parent_id, depth, name, cumulative_value + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN')) + WHERE __intrinsic_flamegraph_find(_tree_id, 'SUPER_ROOT'); + """, + out=Csv(""" + "_tree_parent_id","depth","name","cumulative_value" + "[NULL]",0,"[NULL]",7.000000 + """)) + + def test_empty_input(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 0 AS id, NULL AS parent_id, '' AS name, 0 AS value, + '' AS g + WHERE FALSE + )); + SELECT name, depth, g + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN', 'grouping', 'g')); + """, + out=Csv(""" + "name","depth","g" + """)) + + def test_negative_value(self): + return DiffTestBlueprint( + trace=TextProto(''), + query=""" + CREATE VIRTUAL TABLE fg USING __intrinsic_flamegraph(( + SELECT 1 AS id, NULL AS parent_id, 'main' AS name, -1 AS value + )); + SELECT name, cumulative_value + FROM fg(__intrinsic_flamegraph_config( + 'value', 'value', 'view', 'TOP_DOWN')); + """, + out=ExpectedError('flamegraph: value columns must be non-negative')) diff --git a/ui/package.json b/ui/package.json index 4910346af27..7c773fc4df7 100644 --- a/ui/package.json +++ b/ui/package.json @@ -65,7 +65,7 @@ "source-map": "^0.7.6", "tslib": "^2.6.3", "typescript": "npm:@typescript/typescript6@6.0.2", - "vite": "^8.1.5", + "vite": "^8.2.1", "vitest": "^4.1.10" }, "scripts": { diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index 8153c664e8b..c262617e967 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -178,11 +178,11 @@ importers: specifier: npm:@typescript/typescript6@6.0.2 version: '@typescript/typescript6@6.0.2' vite: - specifier: ^8.1.5 - version: 8.1.5(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0) + specifier: ^8.2.1 + version: 8.2.1(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0) vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@20.19.43)(jsdom@25.0.1)(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0)) + version: 4.1.10(@types/node@20.19.43)(jsdom@25.0.1)(vite@8.2.1(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0)) packages: @@ -272,15 +272,6 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@emnapi/core@1.11.1': - resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} - - '@emnapi/runtime@1.11.1': - resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} - - '@emnapi/wasi-threads@1.2.2': - resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - '@es-joy/jsdoccomment@0.46.0': resolution: {integrity: sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==} engines: {node: '>=16'} @@ -525,14 +516,8 @@ packages: '@marijn/find-cluster-break@1.0.3': resolution: {integrity: sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==} - '@napi-rs/wasm-runtime@1.1.6': - resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 - - '@oxc-project/types@0.139.0': - resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} + '@oxc-project/types@0.143.0': + resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} @@ -661,97 +646,92 @@ packages: '@protobufjs/utf8@1.1.2': resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} - '@rolldown/binding-android-arm64@1.1.5': - resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} + '@rolldown/binding-android-arm64@1.2.3': + resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.1.5': - resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} + '@rolldown/binding-darwin-arm64@1.2.3': + resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.1.5': - resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} + '@rolldown/binding-darwin-x64@1.2.3': + resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.1.5': - resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} + '@rolldown/binding-freebsd-x64@1.2.3': + resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.1.5': - resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.3': + resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.1.5': - resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} + '@rolldown/binding-linux-arm64-gnu@1.2.3': + resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.1.5': - resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} + '@rolldown/binding-linux-arm64-musl@1.2.3': + resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.1.5': - resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} + '@rolldown/binding-linux-ppc64-gnu@1.2.3': + resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.1.5': - resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} + '@rolldown/binding-linux-s390x-gnu@1.2.3': + resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.1.5': - resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} + '@rolldown/binding-linux-x64-gnu@1.2.3': + resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.1.5': - resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} + '@rolldown/binding-linux-x64-musl@1.2.3': + resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.1.5': - resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} + '@rolldown/binding-openharmony-arm64@1.2.3': + resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.1.5': - resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.1.5': - resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} + '@rolldown/binding-win32-arm64-msvc@1.2.3': + resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.1.5': - resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} + '@rolldown/binding-win32-x64-msvc@1.2.3': + resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -766,9 +746,6 @@ packages: resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} - '@tybys/wasm-util@0.10.3': - resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} - '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -1550,78 +1527,78 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} linkify-it@5.0.2: @@ -1710,8 +1687,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.16: - resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + nanoid@3.3.17: + resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1792,8 +1769,8 @@ packages: engines: {node: '>=18'} hasBin: true - postcss@8.5.19: - resolution: {integrity: sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==} + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.1.2: @@ -1846,8 +1823,8 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - rolldown@1.1.5: - resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} + rolldown@1.2.3: + resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2021,13 +1998,13 @@ packages: resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} hasBin: true - vite@8.1.5: - resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} + vite@8.2.1: + resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.3.0 + '@vitejs/devtools': ^0.4.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -2313,22 +2290,6 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} - '@emnapi/core@1.11.1': - dependencies: - '@emnapi/wasi-threads': 1.2.2 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.11.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.2': - dependencies: - tslib: 2.8.1 - optional: true - '@es-joy/jsdoccomment@0.46.0': dependencies: comment-parser: 1.4.1 @@ -2504,14 +2465,7 @@ snapshots: '@marijn/find-cluster-break@1.0.3': {} - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': - dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@oxc-project/types@0.139.0': {} + '@oxc-project/types@0.143.0': {} '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -2602,53 +2556,46 @@ snapshots: '@protobufjs/utf8@1.1.2': {} - '@rolldown/binding-android-arm64@1.1.5': + '@rolldown/binding-android-arm64@1.2.3': optional: true - '@rolldown/binding-darwin-arm64@1.1.5': + '@rolldown/binding-darwin-arm64@1.2.3': optional: true - '@rolldown/binding-darwin-x64@1.1.5': + '@rolldown/binding-darwin-x64@1.2.3': optional: true - '@rolldown/binding-freebsd-x64@1.1.5': + '@rolldown/binding-freebsd-x64@1.2.3': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + '@rolldown/binding-linux-arm-gnueabihf@1.2.3': optional: true - '@rolldown/binding-linux-arm64-gnu@1.1.5': + '@rolldown/binding-linux-arm64-gnu@1.2.3': optional: true - '@rolldown/binding-linux-arm64-musl@1.1.5': + '@rolldown/binding-linux-arm64-musl@1.2.3': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.1.5': + '@rolldown/binding-linux-ppc64-gnu@1.2.3': optional: true - '@rolldown/binding-linux-s390x-gnu@1.1.5': + '@rolldown/binding-linux-s390x-gnu@1.2.3': optional: true - '@rolldown/binding-linux-x64-gnu@1.1.5': + '@rolldown/binding-linux-x64-gnu@1.2.3': optional: true - '@rolldown/binding-linux-x64-musl@1.1.5': + '@rolldown/binding-linux-x64-musl@1.2.3': optional: true - '@rolldown/binding-openharmony-arm64@1.1.5': + '@rolldown/binding-openharmony-arm64@1.2.3': optional: true - '@rolldown/binding-wasm32-wasi@1.1.5': - dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.1.5': + '@rolldown/binding-win32-arm64-msvc@1.2.3': optional: true - '@rolldown/binding-win32-x64-msvc@1.1.5': + '@rolldown/binding-win32-x64-msvc@1.2.3': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -2666,11 +2613,6 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@tybys/wasm-util@0.10.3': - dependencies: - tslib: 2.8.1 - optional: true - '@types/aria-query@5.0.4': {} '@types/chai@5.2.3': @@ -2886,13 +2828,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0))': + '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.5(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0) + vite: 8.2.1(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -3474,54 +3416,54 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lightningcss-android-arm64@1.32.0: + lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.32.0: + lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.32.0: + lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.32.0: + lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.32.0: + lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: + lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.32.0: + lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.32.0: + lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.32.0: + lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.32.0: + lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.32.0: + lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 linkify-it@5.0.2: dependencies: @@ -3593,7 +3535,7 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.16: {} + nanoid@3.3.17: {} natural-compare@1.4.0: {} @@ -3669,9 +3611,9 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - postcss@8.5.19: + postcss@8.5.26: dependencies: - nanoid: 3.3.16 + nanoid: 3.3.17 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -3729,26 +3671,25 @@ snapshots: resolve-from@4.0.0: {} - rolldown@1.1.5: + rolldown@1.2.3: dependencies: - '@oxc-project/types': 0.139.0 + '@oxc-project/types': 0.143.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.1.5 - '@rolldown/binding-darwin-arm64': 1.1.5 - '@rolldown/binding-darwin-x64': 1.1.5 - '@rolldown/binding-freebsd-x64': 1.1.5 - '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 - '@rolldown/binding-linux-arm64-gnu': 1.1.5 - '@rolldown/binding-linux-arm64-musl': 1.1.5 - '@rolldown/binding-linux-ppc64-gnu': 1.1.5 - '@rolldown/binding-linux-s390x-gnu': 1.1.5 - '@rolldown/binding-linux-x64-gnu': 1.1.5 - '@rolldown/binding-linux-x64-musl': 1.1.5 - '@rolldown/binding-openharmony-arm64': 1.1.5 - '@rolldown/binding-wasm32-wasi': 1.1.5 - '@rolldown/binding-win32-arm64-msvc': 1.1.5 - '@rolldown/binding-win32-x64-msvc': 1.1.5 + '@rolldown/binding-android-arm64': 1.2.3 + '@rolldown/binding-darwin-arm64': 1.2.3 + '@rolldown/binding-darwin-x64': 1.2.3 + '@rolldown/binding-freebsd-x64': 1.2.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.3 + '@rolldown/binding-linux-arm64-gnu': 1.2.3 + '@rolldown/binding-linux-arm64-musl': 1.2.3 + '@rolldown/binding-linux-ppc64-gnu': 1.2.3 + '@rolldown/binding-linux-s390x-gnu': 1.2.3 + '@rolldown/binding-linux-x64-gnu': 1.2.3 + '@rolldown/binding-linux-x64-musl': 1.2.3 + '@rolldown/binding-openharmony-arm64': 1.2.3 + '@rolldown/binding-win32-arm64-msvc': 1.2.3 + '@rolldown/binding-win32-x64-msvc': 1.2.3 rrweb-cssom@0.7.1: {} @@ -3899,12 +3840,12 @@ snapshots: uuid@14.0.1: {} - vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0): + vite@8.2.1(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0): dependencies: - lightningcss: 1.32.0 + lightningcss: 1.33.0 picomatch: 4.0.5 - postcss: 8.5.19 - rolldown: 1.1.5 + postcss: 8.5.26 + rolldown: 1.2.3 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 20.19.43 @@ -3912,10 +3853,10 @@ snapshots: fsevents: 2.3.3 sass: 1.101.0 - vitest@4.1.10(@types/node@20.19.43)(jsdom@25.0.1)(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0)): + vitest@4.1.10(@types/node@20.19.43)(jsdom@25.0.1)(vite@8.2.1(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0)) + '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -3932,7 +3873,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.5(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0) + vite: 8.2.1(@types/node@20.19.43)(esbuild@0.28.1)(sass@1.101.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.43 diff --git a/ui/src/components/aggregation_adapter.ts b/ui/src/components/aggregation_adapter.ts index f663c6e5070..c8f8ab0e7ea 100644 --- a/ui/src/components/aggregation_adapter.ts +++ b/ui/src/components/aggregation_adapter.ts @@ -27,7 +27,12 @@ import { import type {Engine} from '../trace_processor/engine'; import {EmptyState} from '../widgets/empty_state'; import {Spinner} from '../widgets/spinner'; +import { + AggregationDrilldownPanel, + type DataGridModel, +} from './aggregation_drilldown_panel'; import {AggregationPanel} from './aggregation_panel'; +import {addEphemeralTab} from './details/add_ephemeral_tab'; import type {Column, Filter, Pivot} from './widgets/datagrid/model'; import {SQLDataSource} from './widgets/datagrid/sql_data_source'; import type {SQLTableSchema} from './widgets/datagrid/sql_schema'; @@ -42,18 +47,37 @@ import {AsyncMemo, AtomicTaskQueue} from '../base/async_memo'; import type {ColumnSchema} from './widgets/datagrid/datagrid_schema'; import {Memo} from '../base/memo'; import {assertExists} from '../base/assert'; +import {Button, ButtonGroup} from '../widgets/button'; +import {SharedAsyncDisposable} from '../base/shared_disposable'; -export interface AggregationData { - readonly tableName: string; +export interface AggregationData extends AsyncDisposable { + readonly sqlTable: SharedAsyncDisposable; readonly barChartData?: ReadonlyArray; } +export function createAggregationData( + table: DisposableSqlEntity, + barChartData?: ReadonlyArray, +): AggregationData { + const sharedTable = SharedAsyncDisposable.wrap(table); + return { + sqlTable: sharedTable, + barChartData, + [Symbol.asyncDispose]: () => sharedTable[Symbol.asyncDispose](), + }; +} + +export interface AggregatorGridPreset { + readonly displayName: string; + readonly config: AggregatorGridConfig; +} + export interface Aggregation { /** * Defines how the datagrid that displays the aggregated data looks, including * what to pivot on and the column definitions. */ - getGridConfig(): AggregatorGridConfig; + getGridConfig(): AggregatorGridConfig | readonly AggregatorGridPreset[]; /** * Creates a view for the aggregated data corresponding to the selected area. @@ -209,10 +233,50 @@ export async function createIITable< }); } -interface DataGridModel { - readonly columns?: readonly Column[]; - readonly pivot?: Pivot; - readonly filters: readonly Filter[]; +export function getPresetDisplayName(preset: AggregatorGridPreset): string { + if ('displayName' in preset && typeof preset.displayName === 'string') { + return preset.displayName; + } + if ('name' in preset && typeof preset.name === 'string') { + return preset.name; + } + if ('title' in preset && typeof preset.title === 'string') { + return preset.title; + } + return 'Preset'; +} + +export function getPresetConfig( + preset: AggregatorGridPreset, +): AggregatorGridConfig { + if ('config' in preset && preset.config !== undefined) { + return preset.config; + } + if ('configuration' in preset && preset.configuration !== undefined) { + return (preset as unknown as {configuration: AggregatorGridConfig}) + .configuration; + } + return preset.config; +} + +export function getActiveGridConfig( + configOrPresets: AggregatorGridConfig | ReadonlyArray, + presetIndex: number = 0, +): AggregatorGridConfig { + if ('schema' in configOrPresets) { + return configOrPresets; + } + if (configOrPresets.length === 0) { + throw new Error('No presets provided'); + } + const idx = Math.min(Math.max(0, presetIndex), configOrPresets.length - 1); + return getPresetConfig(configOrPresets[idx]); +} + +interface PreparedAggregation extends AsyncDisposable { + readonly data: AggregationData; + readonly dataSource: SQLDataSource; + readonly sharedTable: SharedAsyncDisposable; } /** @@ -225,7 +289,6 @@ export function createAggregationTab( priority: number = 0, ): AreaSelectionTab { const queue = new AtomicTaskQueue(); - let data: AggregationData | undefined; let dataGridApi: DataGridApi | undefined; function createInitialState(config: AggregatorGridConfig): DataGridModel { return { @@ -236,12 +299,15 @@ export function createAggregationTab( } const aggregationMemo = new Memo(); - const dataMemo = new AsyncMemo(); + const preparedAggregationSlot = new AsyncMemo< + PreparedAggregation | undefined + >(queue); // Mutable datagrid model state - initialized the first time we get a config, // and only ever modified by the user so that the config is retained over // selection changes. let dataModel: DataGridModel | undefined; + let selectedPresetIndex = 0; return { id: aggregator.id, @@ -259,7 +325,11 @@ export function createAggregationTab( const aggr = aggregator.probe(selection); // Snapshot the grid config if we don't have one yet if (aggr && !dataModel) { - dataModel = createInitialState(aggr.getGridConfig()); + const activeConfig = getActiveGridConfig( + aggr.getGridConfig(), + selectedPresetIndex, + ); + dataModel = createInitialState(activeConfig); } return aggr; }, @@ -270,25 +340,45 @@ export function createAggregationTab( return undefined; } - const {data: datasource} = dataMemo.use({ - key: selectionKey, + const configOrPresets = aggregation.getGridConfig(); + if ( + Array.isArray(configOrPresets) && + selectedPresetIndex >= configOrPresets.length + ) { + selectedPresetIndex = Math.max(0, configOrPresets.length - 1); + } + const activeGridConfig = getActiveGridConfig( + configOrPresets, + selectedPresetIndex, + ); + + const preparedAggregation = preparedAggregationSlot.use({ + key: {...selectionKey, presetIndex: selectedPresetIndex}, compute: async () => { const data = await aggregation.prepareData(trace.engine); - const gridConfig = aggregation.getGridConfig(); - const sqlConfig = gridConfig.sqlConfig?.(data) ?? { - tableOrSubquery: data.tableName, + const sharedTable = data.sqlTable.clone(); + const sqlConfig = activeGridConfig.sqlConfig?.(data) ?? { + tableOrSubquery: sharedTable.get().name, }; - const datasource = new SQLDataSource({ + const dataSource = new SQLDataSource({ queue, engine: trace.engine, ...sqlConfig, }); - return datasource; + return { + data, + dataSource, + sharedTable, + [Symbol.asyncDispose]: async () => { + dataSource.dispose(); + await sharedTable[Symbol.asyncDispose](); + }, + }; }, - }); + }).data; - if (!datasource) { + if (!preparedAggregation) { // Datasource is still loading... return { isLoading: true, @@ -304,7 +394,9 @@ export function createAggregationTab( }; } - // This shouid exist by now... + const {data, dataSource, sharedTable} = preparedAggregation; + + // This should exist by now... assertExists(dataModel); const dataGridState: DataGridState = { @@ -314,21 +406,65 @@ export function createAggregationTab( onColumnsChanged: (c) => { dataModel = {...dataModel!, columns: c}; }, - onPivotChanged: (p) => { - dataModel = {...dataModel!, pivot: p}; + onPivotChanged: (pivot) => { + const isEnteringDrilldown = + dataModel!.pivot?.drillDown === undefined && + pivot?.drillDown !== undefined; + if (isEnteringDrilldown) { + // Keep the source grid in pivot mode and open the requested + // drill-down model in an independent tab. + const initialDataModel: DataGridModel = { + ...dataModel!, + pivot, + }; + addEphemeralTab(trace, `aggregation_drilldown_${aggregator.id}`, { + getTitle: () => `${aggregator.getTabName()} drill-down`, + render: () => + m(AggregationDrilldownPanel, { + trace, + aggregator, + area: selection, + gridConfig: activeGridConfig, + aggregationData: data, + sharedTable, + initialDataModel, + }), + }); + } else { + dataModel = {...dataModel!, pivot}; + } }, onFiltersChanged: (f) => { dataModel = {...dataModel!, filters: f}; }, }; + const presetButtons = + Array.isArray(configOrPresets) && + configOrPresets.length > 0 && + m( + ButtonGroup, + configOrPresets.map((preset, index) => + m(Button, { + label: getPresetDisplayName(preset), + active: index === selectedPresetIndex, + onclick: () => { + if (index !== selectedPresetIndex) { + selectedPresetIndex = index; + dataModel = createInitialState(getPresetConfig(preset)); + } + }, + }), + ), + ); + return { isLoading: false, content: m(AggregationPanel, { - controls: aggregator.renderTopbarControls?.(), + controls: [presetButtons, aggregator.renderTopbarControls?.()], key: aggregator.id, - dataSource: datasource, - gridConfig: aggregation.getGridConfig(), + dataSource, + gridConfig: activeGridConfig, barChartData: data?.barChartData, onReady: (api: DataGridApi) => { dataGridApi = api; @@ -336,7 +472,7 @@ export function createAggregationTab( dataGridState, onClearGridState: () => { // Just wipe out the local data model to reset to initial state - dataModel = createInitialState(aggregation.getGridConfig()); + dataModel = createInitialState(activeGridConfig); }, }), buttons: diff --git a/ui/src/components/aggregation_drilldown_panel.ts b/ui/src/components/aggregation_drilldown_panel.ts new file mode 100644 index 00000000000..aff76b8f8b9 --- /dev/null +++ b/ui/src/components/aggregation_drilldown_panel.ts @@ -0,0 +1,178 @@ +// Copyright (C) 2026 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. + +import m from 'mithril'; +import {AtomicTaskQueue} from '../base/async_memo'; +import {Time} from '../base/time'; +import type {AreaSelection} from '../public/selection'; +import type {Trace} from '../public/trace'; +import {Button} from '../widgets/button'; +import {DetailsShell} from '../widgets/details_shell'; +import {ExportButton} from '../widgets/export_button'; +import {Popup, PopupPosition} from '../widgets/popup'; +import type { + AggregationData, + Aggregator, + AggregatorGridConfig, + DataGridState, +} from './aggregation_adapter'; +import {AggregationPanel} from './aggregation_panel'; +import {AddDebugTrackMenu} from './tracks/add_debug_track_menu'; +import type {DataGridApi} from './widgets/datagrid/datagrid'; +import type {Column, Filter, Pivot} from './widgets/datagrid/model'; +import {SQLDataSource} from './widgets/datagrid/sql_data_source'; +import type {SharedAsyncDisposable} from '../base/shared_disposable'; +import type {DisposableSqlEntity} from '../trace_processor/sql_utils'; +import {DurationWidget} from './widgets/duration'; +import {Timestamp} from './widgets/timestamp'; + +export interface DataGridModel { + readonly columns?: readonly Column[]; + readonly pivot?: Pivot; + readonly filters: readonly Filter[]; +} + +export function createAggregationDataSource( + trace: Trace, + gridConfig: AggregatorGridConfig, + data: AggregationData, + queue: AtomicTaskQueue, +): SQLDataSource { + const sqlConfig = gridConfig.sqlConfig?.(data) ?? { + tableOrSubquery: data.sqlTable.get().name, + }; + return new SQLDataSource({ + queue, + engine: trace.engine, + ...sqlConfig, + }); +} + +interface AggregationDrilldownPanelAttrs { + readonly trace: Trace; + readonly aggregator: Aggregator; + readonly gridConfig: AggregatorGridConfig; + readonly initialDataModel: DataGridModel; + readonly sharedTable: SharedAsyncDisposable; + readonly aggregationData: AggregationData; + readonly area: AreaSelection; +} + +export class AggregationDrilldownPanel implements m.ClassComponent { + private readonly initialDataModel: DataGridModel; + private dataModel: DataGridModel; + private dataGridApi?: DataGridApi; + private table: SharedAsyncDisposable; + private datasource: SQLDataSource; + + constructor({attrs}: m.Vnode) { + this.initialDataModel = attrs.initialDataModel; + this.dataModel = attrs.initialDataModel; + this.table = attrs.sharedTable.clone(); + this.datasource = createAggregationDataSource( + attrs.trace, + attrs.gridConfig, + attrs.aggregationData, + new AtomicTaskQueue(), + ); + } + + view({attrs}: m.Vnode): m.Children { + const {trace, aggregator, gridConfig, area} = attrs; + const dataGridState: DataGridState = { + columns: this.dataModel.columns, + pivot: this.dataModel.pivot, + filters: this.dataModel.filters, + onColumnsChanged: (columns) => { + this.dataModel = {...this.dataModel, columns}; + }, + onPivotChanged: (pivot) => { + this.dataModel = {...this.dataModel, pivot}; + }, + onFiltersChanged: (filters) => { + this.dataModel = {...this.dataModel, filters}; + }, + }; + + return m( + DetailsShell, + { + title: 'Area Selection Drill-down', + description: [ + aggregator.getTabName(), + ': ', + m(Timestamp, {trace, ts: area.start}), + ' - ', + m(Timestamp, {trace, ts: area.end}), + ' (', + m(DurationWidget, { + trace, + dur: Time.durationBetween(area.start, area.end), + }), + ') ', + `${area.tracks.length} tracks`, + ], + buttons: this.renderButtons(trace, this.datasource), + }, + m(AggregationPanel, { + controls: aggregator.renderTopbarControls?.(), + dataSource: this.datasource, + gridConfig, + onReady: (api: DataGridApi) => { + this.dataGridApi = api; + }, + dataGridState, + onClearGridState: () => { + this.dataModel = this.initialDataModel; + }, + }), + ); + } + + private renderButtons(trace: Trace, dataSource: SQLDataSource): m.Children { + const api = this.dataGridApi; + if (!api) return undefined; + + const model = api.getModel(); + let debugTrackButton: m.Children; + if (model.mode === 'flat') { + const availableColumns: string[] = []; + const columnDisplayNames: Record = {}; + for (const {alias, field} of model.columns) { + availableColumns.push(alias); + columnDisplayNames[alias] = field; + } + const query = dataSource.getQuery({...model, pagination: undefined}); + debugTrackButton = m( + Popup, + { + trigger: m(Button, {label: 'Add debug track'}), + position: PopupPosition.Top, + }, + m(AddDebugTrackMenu, { + trace, + query, + availableColumns, + columnDisplayNames, + }), + ); + } + + return [debugTrackButton, m(ExportButton, {onExportData: api.exportData})]; + } + + onremove(): void { + this.table[Symbol.asyncDispose](); + } +} diff --git a/ui/src/components/query_flamegraph.ts b/ui/src/components/query_flamegraph.ts index e9cf33a95e6..019935ce344 100644 --- a/ui/src/components/query_flamegraph.ts +++ b/ui/src/components/query_flamegraph.ts @@ -16,11 +16,10 @@ import m from 'mithril'; import {AsyncLimiter} from '../base/async_limiter'; import {AsyncDisposableStack} from '../base/disposable_stack'; import {ensureExists} from '../base/assert'; -import {uuidv4Sql} from '../base/uuid'; import type {Engine} from '../trace_processor/engine'; import { - createPerfettoIndex, - createPerfettoTable, + createVirtualTable, + type DisposableSqlEntity, } from '../trace_processor/sql_utils'; import { NUM, @@ -35,7 +34,6 @@ import { type FlamegraphPropertyDefinition, type FlamegraphQueryData, type FlamegraphState, - type FlamegraphView, type FlamegraphOptionalAction, type FlamegraphOptionalMarker, } from '../widgets/flamegraph'; @@ -191,6 +189,12 @@ interface QueryFlamegraphAttrs { readonly onStateChange: (state: FlamegraphState) => void; } +interface FlamegraphTable { + readonly metric: QueryFlamegraphMetric; + readonly table: DisposableSqlEntity; + readonly unfilteredCumulativeValue: number; +} + // A Perfetto UI component which wraps the `Flamegraph` widget and fetches the // data for the widget by querying an `Engine`. export class QueryFlamegraph implements AsyncDisposable { @@ -199,6 +203,7 @@ export class QueryFlamegraph implements AsyncDisposable { private readonly dependencies: ReadonlyArray< SharedAsyncDisposable >; + private readonly flamegraphTables: FlamegraphTable[] = []; private lastAttrs?: QueryFlamegraphAttrs; private monitor = new Monitor([ () => this.lastAttrs?.metrics, @@ -213,6 +218,9 @@ export class QueryFlamegraph implements AsyncDisposable { } async [Symbol.asyncDispose](): Promise { + for (const flamegraph of this.flamegraphTables) { + await flamegraph.table[Symbol.asyncDispose](); + } for (const dependency of this.dependencies ?? []) { await dependency[Symbol.asyncDispose]?.(); } @@ -266,254 +274,137 @@ export class QueryFlamegraph implements AsyncDisposable { } trash.use(dependency.clone()); } - this.data = await computeFlamegraphTree(engine, metric, state); + const flamegraph = await this.getFlamegraphTable(metric); + this.data = await computeFlamegraphTree(engine, flamegraph, state); + }); + } + + private async getFlamegraphTable( + metric: QueryFlamegraphMetric, + ): Promise { + const cached = this.flamegraphTables.find( + (entry) => entry.metric === metric, + ); + if (cached) { + return cached; + } + if (metric.dependencySql !== undefined) { + await this.trace.engine.query(metric.dependencySql); + } + const properties = [ + ...(metric.unaggregatableProperties ?? []), + ...(metric.aggregatableProperties ?? []), + ]; + const sourceColumns = [ + 's.id', + 's.parentId as parent_id', + 's.name', + 's.value', + ...properties.map((property) => `s.${property.name}`), + ]; + const table = await createVirtualTable({ + engine: this.trace.engine, + using: `__intrinsic_flamegraph(( + select ${sourceColumns.join(', ')} + from (${metric.statement}) s + ))`, }); + try { + const result = await this.trace.engine.query(` + select cumulative_value + from ${table.name}(__intrinsic_flamegraph_config( + 'value', 'value', + 'view', 'TOP_DOWN' + )) + where __intrinsic_flamegraph_find(_tree_id, 'SUPER_ROOT') + `); + const flamegraph = { + metric, + table, + unfilteredCumulativeValue: result.firstRow({ + cumulative_value: NUM, + }).cumulative_value, + }; + this.flamegraphTables.push(flamegraph); + return flamegraph; + } catch (error) { + await table[Symbol.asyncDispose](); + throw error; + } } } async function computeFlamegraphTree( engine: Engine, - { - dependencySql, - statement, + flamegraph: FlamegraphTable, + {filters, view}: FlamegraphState, +): Promise { + const { unaggregatableProperties, aggregatableProperties, optionalNodeActions, optionalRootActions, optionalMarker, - }: QueryFlamegraphMetric, - {filters, view}: FlamegraphState, -): Promise { - const showStack = filters - .filter((x) => x.kind === 'SHOW_STACK') - .map((x) => x.filter); - const hideStack = filters - .filter((x) => x.kind === 'HIDE_STACK') - .map((x) => x.filter); - const hideFrame = filters - .filter((x) => x.kind === 'HIDE_FRAME') - .map((x) => x.filter); - - // Pivot also essentially acts as a "show stack" filter so treat it like one. - const showStackAndPivot = [...showStack]; - if (view.kind === 'PIVOT') { - showStackAndPivot.push(view.pivot); - } - + } = flamegraph.metric; const agg = aggregatableProperties ?? []; const aggCols = agg.map((x) => x.name); const unagg = unaggregatableProperties ?? []; const unaggCols = unagg.map((x) => x.name); - - const matchingColumns = ['name', ...unaggCols]; - // Bare filters are case-insensitive literals. `/…/` is a case-sensitive - // regex and `/…/i` is a case-insensitive regex. - const matchExpr = (filter: string) => { - const regex = parseUserFilterRegex(filter); - return matchingColumns.map( - (column) => - `regexp(${sqliteString(regex.pattern)}, IFNULL(${column}, ''), ${sqliteString(regex.flags)})`, - ); - }; - - const showStackFilter = - showStackAndPivot.length === 0 - ? '0' - : showStackAndPivot - .map((x, i) => `((${matchExpr(x).join(' OR ')}) << ${i})`) - .join(' | '); - const showStackBits = (1 << showStackAndPivot.length) - 1; - - const hideStackFilter = - hideStack.length === 0 - ? 'false' - : hideStack - .map((x) => matchExpr(x)) - .flat() - .join(' OR '); - - const showFromFrameFilter = - view.kind === 'FROM_FRAME' ? matchExpr(view.pattern).join(' OR ') : 'false'; - const showFromFrameBits = view.kind === 'FROM_FRAME' ? 1 : 0; - - const hideFrameFilter = - hideFrame.length === 0 - ? 'false' - : hideFrame - .map((x) => matchExpr(x)) - .flat() - .join(' OR '); - - const pivotFilter = getPivotFilter(view, matchExpr); - const nodeActions = optionalNodeActions ?? []; const rootActions = optionalRootActions ?? []; - const groupingColumns = `(${(unaggCols.length === 0 ? ['groupingColumn'] : unaggCols).join()})`; - const groupedColumns = `(${(aggCols.length === 0 ? ['groupedColumn'] : aggCols).join()})`; - - if (dependencySql !== undefined) { - await engine.query(dependencySql); + // Convert the UI syntax into finished patterns and explicit flags before + // passing them to the operator. + const configArgs = [`'view', ${sqliteString(view.kind)}`, `'value', 'value'`]; + if (view.kind === 'PIVOT' || view.kind === 'FROM_FRAME') { + const filter = view.kind === 'PIVOT' ? view.pivot : view.pattern; + const regex = parseUserFilterRegex(filter); + configArgs.push( + `'view_pattern', ${sqliteString(regex.pattern)}, ` + + sqliteString(regex.flags), + ); } - await engine.query(`include perfetto module viz.flamegraph;`); - - const uuid = uuidv4Sql(); - await using disposable = new AsyncDisposableStack(); - - disposable.use( - await createPerfettoTable({ - engine, - name: `_flamegraph_materialized_statement_${uuid}`, - as: statement, - }), - ); - disposable.use( - await createPerfettoIndex({ - engine, - name: `_flamegraph_materialized_statement_${uuid}_index`, - on: `_flamegraph_materialized_statement_${uuid}(parentId)`, - }), - ); - - // TODO(lalitm): this doesn't need to be called unless we have - // a non-empty set of filters. - disposable.use( - await createPerfettoTable({ - engine, - name: `_flamegraph_source_${uuid}`, - as: ` - select * - from _viz_flamegraph_prepare_filter!( - ( - select - s.id, - s.parentId, - s.name, - s.value, - ${(unaggCols.length === 0 - ? [`'' as groupingColumn`] - : unaggCols.map((x) => `s.${x}`) - ).join()}, - ${(aggCols.length === 0 - ? [`'' as groupedColumn`] - : aggCols.map((x) => `s.${x}`) - ).join()} - from _flamegraph_materialized_statement_${uuid} s - ), - (${showStackFilter}), - (${hideStackFilter}), - (${showFromFrameFilter}), - (${hideFrameFilter}), - (${pivotFilter}), - ${1 << showStackAndPivot.length}, - ${groupingColumns} - ) - `, - }), - ); - // TODO(lalitm): this doesn't need to be called unless we have - // a non-empty set of filters. - disposable.use( - await createPerfettoTable({ - engine, - name: `_flamegraph_filtered_${uuid}`, - as: ` - select * - from _viz_flamegraph_filter_frames!( - _flamegraph_source_${uuid}, - ${showFromFrameBits} - ) - `, - }), - ); - disposable.use( - await createPerfettoIndex({ - engine, - name: `_flamegraph_filtered_${uuid}_index`, - on: `_flamegraph_filtered_${uuid}(parentId)`, - }), - ); - disposable.use( - await createPerfettoTable({ - engine, - name: `_flamegraph_accumulated_${uuid}`, - as: ` - select * - from _viz_flamegraph_accumulate!( - _flamegraph_filtered_${uuid}, - ${showStackBits} - ) - `, - }), - ); - disposable.use( - await createPerfettoTable({ - engine, - name: `_flamegraph_hash_${uuid}`, - as: ` - select * - from _viz_flamegraph_downwards_hash!( - _flamegraph_source_${uuid}, - _flamegraph_filtered_${uuid}, - _flamegraph_accumulated_${uuid}, - ${groupingColumns}, - ${groupedColumns}, - ${view.kind === 'BOTTOM_UP' ? 'FALSE' : 'TRUE'} - ) - union all - select * - from _viz_flamegraph_upwards_hash!( - _flamegraph_source_${uuid}, - _flamegraph_filtered_${uuid}, - _flamegraph_accumulated_${uuid}, - ${groupingColumns}, - ${groupedColumns} - ) - order by hash - `, - }), - ); - disposable.use( - await createPerfettoTable({ - engine, - name: `_flamegraph_merged_${uuid}`, - as: ` - select * - from _viz_flamegraph_merge_hashes!( - _flamegraph_hash_${uuid}, - ${groupingColumns}, - ${computeGroupedAggExprs(agg)} - ) - `, - }), - ); - disposable.use( - await createPerfettoIndex({ - engine, - name: `_flamegraph_merged_${uuid}_index`, - on: `_flamegraph_merged_${uuid}(parentId)`, - }), - ); - disposable.use( - await createPerfettoTable({ - engine, - name: `_flamegraph_layout_${uuid}`, - as: ` - select * - from _viz_flamegraph_local_layout!( - _flamegraph_merged_${uuid} - ); - `, - }), - ); + for (const filter of filters) { + if (filter.kind !== 'OPTIONS') { + const regex = parseUserFilterRegex(filter.filter); + configArgs.push( + `'filter', ${sqliteString(filter.kind)}, ` + + `${sqliteString(regex.pattern)}, ${sqliteString(regex.flags)}`, + ); + } + } + for (const column of unaggCols) { + configArgs.push(`'grouping', ${sqliteString(column)}`); + } + for (const column of agg) { + configArgs.push( + `'aggregate', ${sqliteString(column.mergeAggregation)}, ` + + `${sqliteString(column.name)}, ${sqliteString(column.name)}`, + ); + } + + const outputColumns = [ + '_tree_id as id', + 'IFNULL(_tree_parent_id, -1) as parentId', + 'depth', + `IIF(IFNULL(name, '') = '', 'unknown', name) as name`, + 'self_value as selfValue', + 'cumulative_value as cumulativeValue', + 'parent_cumulative_value as parentCumulativeValue', + 'x_start as xStart', + 'x_end as xEnd', + ...unaggCols, + ...aggCols, + ]; + + // The operator emits rows pre-ordered for rendering with layout geometry + // attached; nodes with no cumulative value are invisible and skipped. const res = await engine.query(` - select * - from _viz_flamegraph_global_layout!( - _flamegraph_merged_${uuid}, - _flamegraph_layout_${uuid}, - ${groupingColumns}, - ${groupedColumns} + select ${outputColumns.join(', ')} + from ${flamegraph.table.name}( + __intrinsic_flamegraph_config(${configArgs.join(', ')}) ) + where cumulative_value > 0 `); const it = res.iter({ @@ -594,51 +485,14 @@ async function computeFlamegraphTree( minDepth = Math.min(minDepth, it.depth); maxDepth = Math.max(maxDepth, it.depth); } - const sumQuery = await engine.query( - `select sum(value) v from _flamegraph_source_${uuid}`, - ); - const unfilteredCumulativeValue = sumQuery.firstRow({v: NUM_NULL}).v ?? 0; return { nodes, allRootsCumulativeValue: view.kind === 'BOTTOM_UP' ? negativeRootsValue : postiveRootsValue, - unfilteredCumulativeValue, + unfilteredCumulativeValue: flamegraph.unfilteredCumulativeValue, minDepth, maxDepth, nodeActions, rootActions, }; } - -function getPivotFilter( - view: FlamegraphView, - makeFilterExpr: (x: string) => string[], -) { - if (view.kind === 'PIVOT') { - return makeFilterExpr(view.pivot).join(' OR '); - } - if (view.kind === 'BOTTOM_UP') { - return 'value > 0'; - } - return '0'; -} - -function computeGroupedAggExprs(agg: ReadonlyArray) { - const aggFor = (x: AggQueryFlamegraphColumn) => { - switch (x.mergeAggregation) { - case 'ONE_OR_SUMMARY': - return ` - ${x.name} || IIF( - COUNT(DISTINCT ${x.name}) = 1, - '', - ' ' || ' and ' || cast_string!(COUNT(DISTINCT ${x.name})) || ' others' - ) AS ${x.name} - `; - case 'SUM': - return `SUM(${x.name}) AS ${x.name}`; - case 'CONCAT_WITH_COMMA': - return `GROUP_CONCAT(${x.name}, ',') AS ${x.name}`; - } - }; - return `(${agg.length === 0 ? 'groupedColumn' : agg.map((x) => aggFor(x)).join(',')})`; -} diff --git a/ui/src/components/tracks/add_debug_track_menu.ts b/ui/src/components/tracks/add_debug_track_menu.ts index e2339e2ef3c..3c39bd6530c 100644 --- a/ui/src/components/tracks/add_debug_track_menu.ts +++ b/ui/src/components/tracks/add_debug_track_menu.ts @@ -26,6 +26,8 @@ interface AddDebugTrackMenuAttrs { readonly trace: Trace; // Required for adding new tracks and modifying the workspace. // A list of available columns in the query results - used to work out sensible defaults for each field. readonly availableColumns: ReadonlyArray; + // Optional human-readable names keyed by the query result column name. + readonly columnDisplayNames?: Readonly>; // The actual query used to define the debug track. readonly query: string; @@ -38,13 +40,20 @@ const TRACK_NAME_FIELD_REF = 'TRACK_NAME_FIELD'; function chooseDefaultColumn( columns: ReadonlyArray, name: string, + columnDisplayNames: Readonly> = {}, ): string | undefined { + const getName = (column: string) => columnDisplayNames[column] ?? column; + // Search for exact match - const exactMatch = columns.find((col) => col === name); + const exactMatch = columns.find( + (col) => col === name || getName(col) === name, + ); if (exactMatch) return exactMatch; // Search for partial match - const partialMatch = columns.find((col) => col.endsWith(`_${name}`)); + const partialMatch = columns.find( + (col) => col.endsWith(`_${name}`) || getName(col).endsWith(`_${name}`), + ); if (partialMatch) return partialMatch; // Debug tracks support data without dur, in which case it's treated as 0. @@ -71,17 +80,23 @@ export class AddDebugTrackMenu implements m.ClassComponent; + private columnDisplayNames: Readonly>; constructor({attrs}: m.Vnode) { const columns = attrs.availableColumns; + this.columnDisplayNames = attrs.columnDisplayNames ?? {}; // Initialize the settings to some sensible defaults. this.options = { - ts: chooseDefaultColumn(columns, 'ts'), - dur: chooseDefaultColumn(columns, 'dur'), - name: chooseDefaultColumn(columns, 'name'), - value: chooseDefaultColumn(columns, 'value'), - argSetId: chooseDefaultColumn(columns, 'arg_set_id'), + ts: chooseDefaultColumn(columns, 'ts', this.columnDisplayNames), + dur: chooseDefaultColumn(columns, 'dur', this.columnDisplayNames), + name: chooseDefaultColumn(columns, 'name', this.columnDisplayNames), + value: chooseDefaultColumn(columns, 'value', this.columnDisplayNames), + argSetId: chooseDefaultColumn( + columns, + 'arg_set_id', + this.columnDisplayNames, + ), pivot: undefined, color: '', // Empty string means "from slice name" }; @@ -101,6 +116,7 @@ export class AddDebugTrackMenu implements m.ClassComponent) { + this.columnDisplayNames = attrs.columnDisplayNames ?? {}; return m( Form, { @@ -210,7 +226,11 @@ export class AddDebugTrackMenu implements m.ClassComponent - m('option', {selected: this.options.color === col, value: col}, col), + m( + 'option', + {selected: this.options.color === col, value: col}, + this.columnDisplayNames[col] ?? col, + ), ), ), ]; @@ -260,7 +280,7 @@ export class AddDebugTrackMenu implements m.ClassComponent { onSliceOut?(args: OnSliceOutArgs): void; /** - * Called when a slice is clicked. Return false to prevent default selection. + * Called when a slice is clicked. Overrides the default selection behavior. */ onSliceClick?(args: OnSliceClickArgs): void; } @@ -1320,6 +1320,17 @@ export class SliceTrack implements TrackRenderer { return true; } + onMouseDoubleClick(event: TrackMouseEvent): boolean { + const slice = this.findSlice(event); + if (slice === undefined) { + return false; + } + void this.trace.selection + .selectTrackEvent(this.uri, slice.id) + .then(() => this.trace.selection.scrollToSelection('focus')); + return true; + } + getSnapPoint( targetTime: time, thresholdPx: number, diff --git a/ui/src/components/widgets/datagrid/datagrid.ts b/ui/src/components/widgets/datagrid/datagrid.ts index fdd7df563ac..1b2bbc8b225 100644 --- a/ui/src/components/widgets/datagrid/datagrid.ts +++ b/ui/src/components/widgets/datagrid/datagrid.ts @@ -79,6 +79,8 @@ import { type Column, DEFAULT_GROUP_DISPLAY, type Filter, + getPivotDrillDownFilters, + type GroupDisplay, type GroupPath, type IdBasedTree, type Pivot, @@ -113,6 +115,33 @@ function groupPathsEqual(a: GroupPath, b: GroupPath): boolean { return true; } +function getPivotGroupDisplay(pivot: Pivot): GroupDisplay { + // A single grouping level has no hierarchy to display as a tree. + if (pivot.groupBy.length <= 1) return 'flat'; + return pivot.groupDisplay ?? DEFAULT_GROUP_DISPLAY; +} + +function getPivotDrillDownColumns( + pivot: Pivot, + flatColumns: readonly Column[], +): readonly Column[] { + const columns: Column[] = []; + const fields = new Set(); + + const addColumn = ({id, field, sort}: Column) => { + if (fields.has(field)) return; + fields.add(field); + columns.push({id, field, sort}); + }; + + flatColumns.forEach(addColumn); + pivot.groupBy.forEach(addColumn); + for (const aggregate of pivot.aggregates) { + if ('field' in aggregate) addColumn(aggregate); + } + return columns; +} + export interface AggregationCellAttrs extends m.Attributes { readonly symbol?: string; readonly isLoading?: boolean; @@ -731,11 +760,7 @@ export class DataGrid implements m.ClassComponent { if (this.pivot && this.pivot.drillDown) { // DrillDown mode: use FlatModel with drilldown conditions as filters // This shows raw rows filtered to specific group values - const drillDownFilters: Filter[] = this.pivot.drillDown.map((dd) => ({ - field: dd.field, - op: dd.value === null ? 'is null' : '=', - value: dd.value === null ? undefined : dd.value, - })) as Filter[]; + const drillDownFilters = getPivotDrillDownFilters(this.pivot); const flatModel: FlatModel = { ...baseModel, @@ -778,7 +803,7 @@ export class DataGrid implements m.ClassComponent { } }) .sort((a, b) => (a.alias < b.alias ? -1 : a.alias > b.alias ? 1 : 0)), - groupDisplay: this.pivot.groupDisplay ?? DEFAULT_GROUP_DISPLAY, + groupDisplay: getPivotGroupDisplay(this.pivot), expandedGroups: this.pivot.expandedGroups, collapsedGroups: this.pivot.collapsedGroups, }; @@ -989,6 +1014,13 @@ export class DataGrid implements m.ClassComponent { ): void { if (!this.pivot) return; + // Drill-down shows raw rows, so retain the flat columns and add any fields + // introduced by the pivot. Multiple aggregates over the same field map to + // one raw column. + const newColumns = getPivotDrillDownColumns(this.pivot, this.columns); + this.columns = newColumns; + attrs.onColumnsChanged?.(newColumns); + const newPivot: Pivot = {...this.pivot, drillDown}; this.pivot = newPivot; attrs.onPivotChanged?.(newPivot); @@ -1315,12 +1347,14 @@ export class DataGrid implements m.ClassComponent { /** * Renders the pivot toolbar items (expand/collapse buttons and flat/tree toggle). - * Only shown when in pivot mode and not drilling down. + * Only shown for multi-level pivots that are not drilling down. */ private renderPivotToolbarItems(attrs: DataGridAttrs): m.Children { - if (!this.pivot || this.pivot.drillDown) return null; + if (!this.pivot || this.pivot.drillDown || this.pivot.groupBy.length <= 1) { + return null; + } - const mode = this.pivot.groupDisplay ?? DEFAULT_GROUP_DISPLAY; + const mode = getPivotGroupDisplay(this.pivot); const isFlat = mode === 'flat'; return [ @@ -2028,7 +2062,8 @@ export class DataGrid implements m.ClassComponent { const aggregates = pivot.aggregates ?? []; const numGroupBy = pivot.groupBy.length; // In flat mode, don't use multi-level UI (no chevrons, no indent) - const isMultiLevel = numGroupBy > 1 && pivot.groupDisplay === 'tree'; + const isMultiLevel = + numGroupBy > 1 && getPivotGroupDisplay(pivot) === 'tree'; return rowIndices .map((index) => { diff --git a/ui/src/components/widgets/datagrid/model.ts b/ui/src/components/widgets/datagrid/model.ts index 24835dbf032..6ac5b44b293 100644 --- a/ui/src/components/widgets/datagrid/model.ts +++ b/ui/src/components/widgets/datagrid/model.ts @@ -112,6 +112,16 @@ export interface Pivot { readonly collapsedGroups?: readonly GroupPath[]; } +export function getPivotDrillDownFilters( + pivot: Pivot | undefined, +): readonly Filter[] { + return ( + pivot?.drillDown?.map(({field, value}): Filter => { + return value === null ? {field, op: 'is null'} : {field, op: '=', value}; + }) ?? [] + ); +} + // ID-based tree configuration for displaying hierarchical data using // id/parent_id columns. Uses recursive CTE for efficient tree traversal with // sorting. Unlike path-based pivot tree, this expects the data to have explicit diff --git a/ui/src/core/selection_manager.ts b/ui/src/core/selection_manager.ts index a6fc07e5052..01a21348f92 100644 --- a/ui/src/core/selection_manager.ts +++ b/ui/src/core/selection_manager.ts @@ -20,6 +20,8 @@ import type { SelectionManager, TrackEventSelection, AreaSelectionTab, + TrackEventSelectionTab, + SelectionTab, } from '../public/selection'; import {TimeSpan} from '../base/time'; import {raf} from './raf_scheduler'; @@ -58,7 +60,7 @@ export class SelectionManagerImpl implements SelectionManager { Selection, SelectionDetailsPanel >(); - public readonly areaSelectionTabs: AreaSelectionTab[] = []; + public readonly selectionTabs: SelectionTab[] = []; private _currentSelectionSubTab?: string; constructor( @@ -77,8 +79,8 @@ export class SelectionManagerImpl implements SelectionManager { trackUri: string, eventId: number, opts?: SelectionOpts, - ) { - this.selectTrackEventInternal(trackUri, eventId, opts); + ): Promise { + await this.selectTrackEventInternal(trackUri, eventId, opts); } selectTrack(uri: string, opts?: SelectionOpts) { @@ -520,8 +522,28 @@ export class SelectionManagerImpl implements SelectionManager { return undefined; } + registerSelectionTab(tab: SelectionTab): void { + this.selectionTabs.push(tab); + } + registerAreaSelectionTab(tab: AreaSelectionTab): void { - this.areaSelectionTabs.push(tab); + this.registerSelectionTab({ + id: tab.id, + name: tab.name, + priority: tab.priority, + render: (selection) => + selection.kind === 'area' ? tab.render(selection) : undefined, + }); + } + + registerTrackEventSelectionTab(tab: TrackEventSelectionTab): void { + this.registerSelectionTab({ + id: tab.id, + name: tab.name, + priority: tab.priority, + render: (selection) => + selection.kind === 'track_event' ? tab.render(selection) : undefined, + }); } get currentSelectionSubTab(): string | undefined { diff --git a/ui/src/core_plugins/dev.perfetto.Timeline/current_selection_tab.ts b/ui/src/core_plugins/dev.perfetto.Timeline/current_selection_tab.ts index acd976afd13..db359934f96 100644 --- a/ui/src/core_plugins/dev.perfetto.Timeline/current_selection_tab.ts +++ b/ui/src/core_plugins/dev.perfetto.Timeline/current_selection_tab.ts @@ -23,6 +23,9 @@ import {Tree, TreeNode} from '../../widgets/tree'; import type { AreaSelection, NoteSelection, + Selection, + SelectionTab, + TrackEventSelection, TrackSelection, } from '../../public/selection'; import {assertUnreachable} from '../../base/assert'; @@ -30,6 +33,79 @@ import {Button, ButtonBar} from '../../widgets/button'; import {NoteEditor} from './note_editor'; import {Gate} from '../../base/mithril_utils'; +interface TabEntry { + readonly id: string; + readonly name: string; + readonly content: m.Children; + readonly isLoading: boolean; + readonly buttons?: m.Children; +} + +function renderTabs( + tabs: ReadonlyArray, + selection: Selection, +): TabEntry[] { + return tabs + .slice() + .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)) + .flatMap((tab) => { + const content = tab.render(selection); + if (!content) return []; + return [ + { + id: tab.id, + name: tab.name, + content: content.content, + isLoading: content.isLoading, + buttons: content.buttons, + }, + ]; + }); +} + +function renderTabbedDetails( + trace: TraceImpl, + title: string, + tabs: ReadonlyArray, +) { + if (tabs.length === 0) { + return undefined; + } + + // Find the active tab or just pick the first one if that selected tab is + // not available. + const activeTab = + tabs.find((tab) => tab.id === trace.selection.currentSelectionSubTab) ?? + tabs[0]; + + // Determine if any tab content is loading + const isLoading = tabs.some((tab) => tab.isLoading); + + return { + isLoading, + content: m( + DetailsShell, + { + title, + description: m( + ButtonBar, + tabs.map((tab) => + m(Button, { + label: tab.name, + key: tab.id, + active: activeTab === tab, + onclick: () => trace.selection.setCurrentSelectionSubTab(tab.id), + }), + ), + ), + buttons: activeTab.buttons, + }, + // Render all tabs but control visibility with Gate + tabs.map((tab) => m(Gate, {open: activeTab === tab}, tab.content)), + ), + }; +} + export interface CurrentSelectionTabAttrs { readonly trace: TraceImpl; } @@ -56,7 +132,7 @@ export class CurrentSelectionTab implements m.ClassComponent (b.priority ?? 0) - (a.priority ?? 0), + const tabs = renderTabs(trace.selection.selectionTabs, selection); + return ( + renderTabbedDetails(trace, 'Area Selection', tabs) ?? + this.renderEmptySelection('No details available for selection') ); - - const renderedTabs = tabs - .map((tab) => [tab, tab.render(selection)] as const) - .filter(([_, content]) => content !== undefined); - - if (renderedTabs.length === 0) { - return this.renderEmptySelection('No details available for selection'); - } - - // Find the active tab or just pick the first one if that selected tab is - // not available. - const [activeTab, activeTabContent] = - renderedTabs.find( - ([tab]) => tab.id === trace.selection.currentSelectionSubTab, - ) ?? renderedTabs[0]; - - // Determine if any tab content is loading - const isLoading = renderedTabs.some(([_, content]) => content?.isLoading); - - return { - isLoading, - content: m( - DetailsShell, - { - title: 'Area Selection', - description: m( - ButtonBar, - renderedTabs.map(([tab]) => { - return m(Button, { - label: tab.name, - key: tab.id, - active: activeTab === tab, - onclick: () => - trace.selection.setCurrentSelectionSubTab(tab.id), - }); - }), - ), - buttons: activeTabContent?.buttons, - }, - // Render all tabs but control visibility with Gate - renderedTabs.map(([tab, content]) => - m(Gate, {open: activeTab === tab}, content?.content), - ), - ), - }; } private renderNoteSelection(trace: TraceImpl, selection: NoteSelection) { diff --git a/ui/src/core_plugins/dev.perfetto.Timeline/track_view.ts b/ui/src/core_plugins/dev.perfetto.Timeline/track_view.ts index 0fef10e9750..c503e695afd 100644 --- a/ui/src/core_plugins/dev.perfetto.Timeline/track_view.ts +++ b/ui/src/core_plugins/dev.perfetto.Timeline/track_view.ts @@ -235,6 +235,16 @@ export class TrackView { }) ?? false ); }, + onTrackContentDoubleClick: (pos, bounds) => { + const timescale = this.getTimescaleForBounds(bounds); + raf.scheduleCanvasRedraw(); + return ( + renderer?.track.onMouseDoubleClick?.({ + ...pos, + timescale, + }) ?? false + ); + }, onMoveBefore: (nodeId: string) => { // We are the reference node (the one to be moved relative to), nodeId // references the target node (the one to be moved) diff --git a/ui/src/frontend/error_dialog.ts b/ui/src/frontend/error_dialog.ts index 072c7144093..eade8c02c20 100644 --- a/ui/src/frontend/error_dialog.ts +++ b/ui/src/frontend/error_dialog.ts @@ -177,6 +177,8 @@ class ErrorDialogComponent implements m.ClassComponent { this.traceData = traceSource.file; // this.traceSize = this.traceData.size; } else if (traceSource.type === 'ARRAY_BUFFER') { + // Never upload local-only traces (e.g. from postMessage) to GCS. + if (traceSource.localOnly) return; this.traceData = traceSource.buffer; // this.traceSize = this.traceData.byteLength; } else { diff --git a/ui/src/frontend/post_message_handler.ts b/ui/src/frontend/post_message_handler.ts index 280ff63c0d2..000b425b962 100644 --- a/ui/src/frontend/post_message_handler.ts +++ b/ui/src/frontend/post_message_handler.ts @@ -138,6 +138,9 @@ export function parsePostedTrace( } else if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) { return { title: 'External trace', + // A bare buffer gives the sender no way to opt into sharing, so default + // to local-only (matching the wrapped path). + localOnly: true, buffer: toArrayBuffer(data), }; } else { diff --git a/ui/src/frontend/post_message_handler_unittest.ts b/ui/src/frontend/post_message_handler_unittest.ts index 203086fec78..07d9d0c15ab 100644 --- a/ui/src/frontend/post_message_handler_unittest.ts +++ b/ui/src/frontend/post_message_handler_unittest.ts @@ -71,6 +71,11 @@ describe('parsePostedTrace', () => { expect(result?.buffer).toBeInstanceOf(ArrayBuffer); }); + test('is local-only by default (no way to opt into sharing)', () => { + const result = parsePostedTrace(new ArrayBuffer()); + expect(result?.localOnly).toBe(true); + }); + test('view is snipped to the view, not the underlying buffer', () => { // A 10-byte view starting at offset 2 of a 16-byte buffer. const underlying = new Uint8Array(16); diff --git a/ui/src/frontend/trace_share_utils.ts b/ui/src/frontend/trace_share_utils.ts index 4fc14cade5b..577b5ef5253 100644 --- a/ui/src/frontend/trace_share_utils.ts +++ b/ui/src/frontend/trace_share_utils.ts @@ -36,7 +36,26 @@ export async function shareTrace(trace: TraceImpl) { const traceUrl = (traceSource as TraceUrlSource).url ?? ''; const hasPlaceholder = urlHasPlaceholder(traceUrl); - if (isShareable(trace)) { + if (hasPlaceholder) { + // The sender provided a URL carrying a state-hash placeholder. Upload + // only the UI state and inject the hash back into that URL, rather than + // re-uploading the trace to GCS. This takes precedence over the trace + // being shareable, so the sender's URL (which may be authenticated or + // otherwise non-public) is preserved. + const result = confirm( + `Upload UI state and generate a permalink? ` + + `The state (not the trace) will be accessible by anybody with the permalink.`, + ); + + if (result) { + const hash = await createPermalink(trace, undefined); + const urlWithHash = traceUrl.replace(STATE_HASH_PLACEHOLDER, hash); + showModal({ + title: 'Permalink', + content: m(CopyableLink, {url: urlWithHash}), + }); + } + } else if (isShareable(trace)) { // Just upload the trace and create a permalink. const result = confirm( `Upload UI state and generate a permalink? ` + @@ -53,54 +72,31 @@ export async function shareTrace(trace: TraceImpl) { }), }); } - } else { - if (traceUrl) { - if (hasPlaceholder) { - // Trace is not sharable, but has a URL and a placeholder. Upload the - // state and return the URL with the placeholder filled in. - // Trace is not sharable, but has a URL with no placeholder. - // Just upload the trace and create a permalink. - const result = confirm( - `Upload UI state and generate a permalink? ` + - `The state (not the trace) will be accessible by anybody with the permalink.`, - ); - - if (result) { - const hash = await createPermalink(trace, undefined); - const urlWithHash = traceUrl.replace(STATE_HASH_PLACEHOLDER, hash); - showModal({ - title: 'Permalink', - content: m(CopyableLink, {url: urlWithHash}), - }); - } - } else { - // Trace is not sharable, has a URL, but no placeholder. - showModal({ - title: 'Cannot create permalink from external trace', - content: m( - '', - m( - 'p', - 'This trace was opened by an external site and as such cannot ' + - 'be re-shared preserving the UI state. ', - ), - m('p', 'By using the URL below you can open this trace again.'), - m('p', 'Clicking will copy the URL into the clipboard.'), - m(CopyableLink, {url: traceUrl}), - ), - }); - } - } else { - // Trace is not sharable and has no URL. Nothing we can do. Just tell the - // user. - showModal({ - title: 'Cannot create permalink', - content: m( + } else if (traceUrl) { + // Not shareable, has a URL, but no placeholder. + showModal({ + title: 'Cannot create permalink from external trace', + content: m( + '', + m( 'p', 'This trace was opened by an external site and as such cannot ' + 'be re-shared preserving the UI state. ', ), - }); - } + m('p', 'By using the URL below you can open this trace again.'), + m('p', 'Clicking will copy the URL into the clipboard.'), + m(CopyableLink, {url: traceUrl}), + ), + }); + } else { + // Not shareable and has no URL. Nothing we can do. Just tell the user. + showModal({ + title: 'Cannot create permalink', + content: m( + 'p', + 'This trace was opened by an external site and as such cannot ' + + 'be re-shared preserving the UI state. ', + ), + }); } } diff --git a/ui/src/frontend/views/sidebar.scss b/ui/src/frontend/views/sidebar.scss index f18dcc9251a..0b530faa443 100644 --- a/ui/src/frontend/views/sidebar.scss +++ b/ui/src/frontend/views/sidebar.scss @@ -142,6 +142,21 @@ li.pf-sidebar__item { flex-shrink: 0; } +.pf-sidebar__badge { + font-size: var(--pf-font-size-xs); + font-family: var(--pf-font-compact); + font-weight: 500; + text-transform: uppercase; + letter-spacing: 0.5px; + line-height: 1; + padding: 2px 4px; + border-radius: $border-radius; + background: var(--pf-sidebar-surface-secondary); + color: var(--pf-sidebar-on-surface-muted); + border: 1px solid var(--pf-sidebar-border); + user-select: none; +} + .pf-sidebar__external-link-icon { margin-left: auto; font-size: 14px; diff --git a/ui/src/frontend/views/sidebar_item.ts b/ui/src/frontend/views/sidebar_item.ts index d252d874c8b..2aa955e87d5 100644 --- a/ui/src/frontend/views/sidebar_item.ts +++ b/ui/src/frontend/views/sidebar_item.ts @@ -86,6 +86,8 @@ export class SidebarItem implements m.ClassComponent { className: 'pf-sidebar__button-icon', icon: valueOrCallback(item.icon), }); + const badge = valueOrCallback(item.badge); + const badgeEl = badge !== undefined && m('span.pf-sidebar__badge', badge); const spinnerEl = this.pending && m(Spinner, {className: 'pf-sidebar__spinner'}); const cssClass = valueOrCallback(item.cssClass); @@ -109,6 +111,7 @@ export class SidebarItem implements m.ClassComponent { }, iconEl, text, + badgeEl, target === '_blank' && m(Icon, { className: 'pf-sidebar__external-link-icon', @@ -126,6 +129,7 @@ export class SidebarItem implements m.ClassComponent { }, iconEl, text, + badgeEl, spinnerEl, ), ); diff --git a/ui/src/plugins/com.android.AndroidLockContention/android_lock_contention_event_source.ts b/ui/src/plugins/com.android.AndroidLockContention/android_lock_contention_event_source.ts index b7c5778ad51..554f4794b1e 100644 --- a/ui/src/plugins/com.android.AndroidLockContention/android_lock_contention_event_source.ts +++ b/ui/src/plugins/com.android.AndroidLockContention/android_lock_contention_event_source.ts @@ -461,7 +461,7 @@ export class AndroidLockContentionEventSource { ): Promise { const query = await this.trace.engine.query(` SELECT - c.id, c.ts, c.dur, c.name AS lock_name, c.owner_tid, + c.id, c.ts, c.dur, c.lock_name, c.owner_tid, c.blocked_thread_name, c.blocking_thread_name, t.is_main_thread as is_blocking_thread_main, c.lock_type, c.is_monitor diff --git a/ui/src/plugins/com.android.AndroidLockContention/index.ts b/ui/src/plugins/com.android.AndroidLockContention/index.ts index 62a6d55e5da..d1f2ba0973e 100644 --- a/ui/src/plugins/com.android.AndroidLockContention/index.ts +++ b/ui/src/plugins/com.android.AndroidLockContention/index.ts @@ -14,7 +14,7 @@ import './styles.scss'; import {AsyncMemo, AtomicTaskQueue} from '../../base/async_memo'; -import {LockOwnerDetailsPanel} from './lock_owner_details_panel'; +import {LockContentionDetailsTab} from './lock_owner_details_panel'; import {LOCK_CONTENTION_SQL} from './lock_contention_sql'; import type {Selection} from '../../public/selection'; import {Time} from '../../base/time'; @@ -58,48 +58,40 @@ export default class AndroidLockContentionPlugin implements PerfettoPlugin { const selection = trace.selection.selection; if (selection.kind !== 'track_event') return; - const currentEventId = selection.eventId; - const currentTrackUri = selection.trackUri; - - const query = await trace.engine.query(` - SELECT owner_tid, id FROM __android_lock_contention_owner_events WHERE id = ${selection.eventId} LIMIT 1 - `); - if (query.numRows() > 0) { - const row = query.firstRow({owner_tid: NUM, id: NUM}); - const targetUri = `com.android.AndroidLockContention#OwnerEvents_${row.owner_tid}`; - - if (currentEventId === row.id && currentTrackUri === targetUri) { - return; + if ( + selection.trackUri.startsWith( + 'com.android.AndroidLockContention#OwnerEvents', + ) + ) { + if (this.currentBlockedSlice?.trackUri) { + this.selectAndNavigate( + trace, + this.currentBlockedSlice.id, + this.currentBlockedSlice.trackUri, + ); + } else { + this.selectAndNavigate(trace, selection.eventId, undefined, true); } - - this.selectAndNavigate(trace, row.id, targetUri); return; } - const contentionQuery = await trace.engine.query(` - SELECT owner_tid, ts FROM __android_lock_contention_owner_events WHERE id = ${selection.eventId} LIMIT 1 + const query = await trace.engine.query(` + SELECT id, owner_tid + FROM __android_lock_contention_owner_events + WHERE id = ${selection.eventId} + LIMIT 1 `); - if (contentionQuery.numRows() > 0) { - const row = contentionQuery.firstRow({owner_tid: NUM, ts: LONG}); - - const ownerQuery = await trace.engine.query(` - SELECT id FROM __android_lock_contention_owner_events - WHERE owner_tid = ${row.owner_tid} - AND ts <= ${row.ts} - AND ts + dur >= ${row.ts} - LIMIT 1 - `); - if (ownerQuery.numRows() > 0) { - const ownerId = ownerQuery.firstRow({id: NUM}).id; - const targetUri = `com.android.AndroidLockContention#OwnerEvents_${row.owner_tid}`; - - if (currentEventId === ownerId && currentTrackUri === targetUri) { - return; - } - - this.selectAndNavigate(trace, ownerId, targetUri); - return; - } + if (query.numRows() > 0) { + const row = query.firstRow({id: NUM, owner_tid: NUM}); + this.currentBlockedSlice = { + id: selection.eventId, + trackUri: selection.trackUri, + }; + this.selectAndNavigate( + trace, + row.id, + `com.android.AndroidLockContention#OwnerEvents_${row.owner_tid}`, + ); } } public readonly navigation = new LockContentionNavigation(); @@ -132,6 +124,10 @@ export default class AndroidLockContentionPlugin implements PerfettoPlugin { this.pinningManager = new TrackPinningManager(trace); await trace.engine.query(LOCK_CONTENTION_SQL); + trace.selection.registerTrackEventSelectionTab( + new LockContentionDetailsTab(trace, this), + ); + trace.tracks.registerOverlay( new RelatedEventsOverlay(trace, () => this.getConnections(trace)), ); @@ -414,7 +410,6 @@ export default class AndroidLockContentionPlugin implements PerfettoPlugin { sliceHeight: 14, titleSizePx: 10, }, - detailsPanel: (row) => new LockOwnerDetailsPanel(trace, row.id, this), }), }); diff --git a/ui/src/plugins/com.android.AndroidLockContention/lock_owner_details_panel.ts b/ui/src/plugins/com.android.AndroidLockContention/lock_owner_details_panel.ts index ee1ced04b40..c05f3001b2b 100644 --- a/ui/src/plugins/com.android.AndroidLockContention/lock_owner_details_panel.ts +++ b/ui/src/plugins/com.android.AndroidLockContention/lock_owner_details_panel.ts @@ -13,10 +13,15 @@ // limitations under the License. import m from 'mithril'; -import {DetailsShell} from '../../widgets/details_shell'; +import {AsyncLimiter} from '../../base/async_limiter'; +import {NUM} from '../../trace_processor/query_result'; import {DurationWidget} from '../../components/widgets/duration'; import type {Trace} from '../../public/trace'; -import type {TrackEventDetailsPanel} from '../../public/details_panel'; +import type { + ContentWithLoadingFlag, + TrackEventSelection, + TrackEventSelectionTab, +} from '../../public/selection'; import { AndroidLockContentionEventSource, type LockContentionDetails, @@ -38,82 +43,155 @@ import {Callout} from '../../widgets/callout'; import {Intent} from '../../widgets/common'; import {Tooltip} from '../../widgets/tooltip'; -import {Section} from '../../widgets/section'; import {GridLayout, GridLayoutColumn} from '../../widgets/grid_layout'; import {Card, CardStack} from '../../widgets/card'; +import {Section} from '../../widgets/section'; -export class LockOwnerDetailsPanel implements TrackEventDetailsPanel { - private mergedDetails?: LockContentionDetails[]; - private monitorThreadStates = new Map< - number, - ReadonlyArray - >(); - private monitorBlockedFunctions = new Map< +interface ContentionBreakdownData { + readonly rows: LockContentionDetails[]; + readonly threadStates: Map>; + readonly blockedFunctions: Map< number, ReadonlyArray - >(); + >; +} + +export class LockContentionDetailsTab implements TrackEventSelectionTab { + readonly id = 'android_lock_contention'; + readonly name = 'Lock Contention'; + readonly priority = 10; + + private currentSelection?: TrackEventSelection; + private data?: ContentionBreakdownData | null; + private readonly limiter = new AsyncLimiter(); constructor( private readonly trace: Trace, - private readonly eventId: number, private readonly plugin: AndroidLockContentionPlugin, ) {} - async load() { + render(selection: TrackEventSelection): ContentWithLoadingFlag | undefined { + if (this.currentSelection?.eventId !== selection.eventId) { + this.currentSelection = selection; + this.data = undefined; + this.limiter.schedule(async () => { + this.data = await this.loadData(selection); + }); + } + + if (!this.data || this.data.rows.length === 0) { + return undefined; + } + + return { + isLoading: false, + content: m(LockContentionBreakdown, { + trace: this.trace, + plugin: this.plugin, + rows: this.data.rows, + monitorThreadStates: this.data.threadStates, + monitorBlockedFunctions: this.data.blockedFunctions, + }), + }; + } + + private async loadData( + selection: TrackEventSelection, + ): Promise { const source = new AndroidLockContentionEventSource(this.trace); - this.mergedDetails = await source.fetchMergedDetails(this.eventId); - - const selectedRow = this.mergedDetails.find((r) => r.id === this.eventId); - if (selectedRow) { - this.plugin.highlightedTargetIds.add(this.eventId); - this.plugin.currentBlockedSlice = { - id: selectedRow.id, - trackUri: selectedRow.trackUri, + + // Check if this is an owner event or a slice matching an owner event + const query = await this.trace.engine.query(` + SELECT id FROM __android_lock_contention_owner_events WHERE id = ${selection.eventId} + UNION ALL + SELECT oe.id + FROM android_all_lock_contentions c + JOIN __android_lock_contention_owner_events oe + ON oe.owner_tid = c.owner_tid + AND oe.ts <= c.ts + AND oe.ts + oe.dur >= c.ts + WHERE c.id = ${selection.eventId} + LIMIT 1 + `); + + if (query.numRows() > 0) { + const ownerEventId = query.firstRow({id: NUM}).id; + const res = await source.fetchAllDetails(ownerEventId); + return { + rows: res.details, + threadStates: res.threadStates, + blockedFunctions: res.blockedFunctions, }; } - for (const row of this.mergedDetails) { - if (row.isMonitor) { - const states = await source.fetchThreadStates(row.id); - const funcs = await source.fetchBlockedFunctions(row.id); - this.monitorThreadStates.set(row.id, states); - this.monitorBlockedFunctions.set(row.id, funcs); + // If it is a contention slice without an owner event in this window: + const singleDetails = await source.fetchDetails( + selection.eventId, + selection.trackUri, + ); + if (singleDetails !== null) { + const threadStates = new Map>(); + const blockedFunctions = new Map< + number, + ReadonlyArray + >(); + if (singleDetails.isMonitor) { + threadStates.set( + singleDetails.id, + await source.fetchThreadStates(singleDetails.id), + ); + blockedFunctions.set( + singleDetails.id, + await source.fetchBlockedFunctions(singleDetails.id), + ); } + return { + rows: [singleDetails], + threadStates, + blockedFunctions, + }; } + + return null; } +} - render() { - if (this.mergedDetails === undefined) { - return m(DetailsShell, {title: 'Lock Owner', description: 'Loading...'}); - } +export interface LockContentionBreakdownAttrs { + readonly trace: Trace; + readonly plugin: AndroidLockContentionPlugin; + readonly rows: LockContentionDetails[]; + readonly monitorThreadStates: Map>; + readonly monitorBlockedFunctions: Map< + number, + ReadonlyArray + >; +} + +export class LockContentionBreakdown implements m.ClassComponent { + view({attrs}: m.Vnode) { + const {trace, plugin, rows, monitorThreadStates, monitorBlockedFunctions} = + attrs; - const rows = this.mergedDetails; const ownerTid = rows.length > 0 ? rows[0].blockingThreadTid : undefined; const customTrackUri = ownerTid !== undefined && ownerTid !== null ? `com.android.AndroidLockContention#OwnerEvents_${ownerTid}` : undefined; const isCustomPinned = customTrackUri - ? this.plugin.pinningManager.isTrackPinned(customTrackUri) + ? plugin.pinningManager.isTrackPinned(customTrackUri) : false; const threadTrackUri = rows.length > 0 ? rows[0].ownerTrackUri : undefined; const isThreadPinned = threadTrackUri - ? this.plugin.pinningManager.isTrackPinned(threadTrackUri) + ? plugin.pinningManager.isTrackPinned(threadTrackUri) : false; const artRows = rows.filter((r) => !r.isMonitor); const monitorRows = rows.filter((r) => r.isMonitor); - const uniqueBlockedThreads = new Set( - rows.map((r) => r.blockedThreadTid ?? r.blockedThreadName), - ); return m( - DetailsShell, - { - title: 'Lock Owner Contention Breakdown', - description: `Owner is blocking ${uniqueBlockedThreads.size} threads`, - }, + 'div', + {className: 'pf-lock-owner-panel'}, m( 'div', {className: 'pf-lock-owner-panel__note'}, @@ -131,9 +209,9 @@ export class LockOwnerDetailsPanel implements TrackEventDetailsPanel { onchange: () => { if (customTrackUri) { if (isCustomPinned) { - this.plugin.pinningManager.unpinTracks([customTrackUri]); + plugin.pinningManager.unpinTracks([customTrackUri]); } else { - this.plugin.pinningManager.pinTracks([customTrackUri]); + plugin.pinningManager.pinTracks([customTrackUri]); } } }, @@ -148,9 +226,9 @@ export class LockOwnerDetailsPanel implements TrackEventDetailsPanel { onchange: () => { if (threadTrackUri) { if (isThreadPinned) { - this.plugin.pinningManager.unpinTracks([threadTrackUri]); + plugin.pinningManager.unpinTracks([threadTrackUri]); } else { - this.plugin.pinningManager.pinTracks([threadTrackUri]); + plugin.pinningManager.pinTracks([threadTrackUri]); } } }, @@ -166,8 +244,8 @@ export class LockOwnerDetailsPanel implements TrackEventDetailsPanel { {className: 'pf-lock-owner-panel__section'}, m('h3', 'ART Lock Contentions'), m(ArtContentionsGrid, { - trace: this.trace, - plugin: this.plugin, + trace, + plugin, rows: artRows, }), ), @@ -186,12 +264,11 @@ export class LockOwnerDetailsPanel implements TrackEventDetailsPanel { {className: 'pf-lock-owner-panel__card-stack'}, monitorRows.map((row) => m(MonitorContentionCard, { - trace: this.trace, - plugin: this.plugin, + trace, + plugin, row, - threadStates: this.monitorThreadStates.get(row.id) ?? [], - blockedFunctions: - this.monitorBlockedFunctions.get(row.id) ?? [], + threadStates: monitorThreadStates.get(row.id) ?? [], + blockedFunctions: monitorBlockedFunctions.get(row.id) ?? [], }), ), ), diff --git a/ui/src/plugins/com.android.AndroidLog/log_selection_aggregator.ts b/ui/src/plugins/com.android.AndroidLog/log_selection_aggregator.ts index d397700cfb9..7f351d53004 100644 --- a/ui/src/plugins/com.android.AndroidLog/log_selection_aggregator.ts +++ b/ui/src/plugins/com.android.AndroidLog/log_selection_aggregator.ts @@ -14,15 +14,19 @@ import m from 'mithril'; import {Icons} from '../../base/semantic_icons'; -import type { - Aggregation, - Aggregator, - AggregatorGridConfig, +import {Time} from '../../base/time'; +import { + type Aggregation, + type Aggregator, + type AggregatorGridConfig, + createAggregationData, } from '../../components/aggregation_adapter'; +import {Timestamp} from '../../components/widgets/timestamp'; import type {AreaSelection} from '../../public/selection'; import type {Trace} from '../../public/trace'; import {ANDROID_LOGS_TRACK_KIND} from '../../public/track_kinds'; import type {Engine} from '../../trace_processor/engine'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; import {Anchor} from '../../widgets/anchor'; export class AndroidLogSelectionAggregator implements Aggregator { @@ -49,25 +53,27 @@ export class AndroidLogSelectionAggregator implements Aggregator { whereClause += ` AND al.utid IN (${utids.join(', ')})`; } - await engine.query(` - CREATE OR REPLACE PERFETTO TABLE ${this.id} AS - SELECT - al.id, - al.ts, - al.prio, - al.tag, - al.msg, - t.tid, - t.name AS thread_name, - p.pid, - p.name AS process_name - FROM android_logs al - LEFT JOIN thread t ON al.utid = t.utid - LEFT JOIN process p ON t.upid = p.upid - WHERE ${whereClause} - `); + const table = await createPerfettoTable({ + engine, + as: ` + SELECT + al.id, + al.ts, + al.prio, + al.tag, + al.msg, + t.tid, + t.name AS thread_name, + p.pid, + p.name AS process_name + FROM android_logs al + LEFT JOIN thread t ON al.utid = t.utid + LEFT JOIN process p ON t.upid = p.upid + WHERE ${whereClause} + `, + }); - return {tableName: this.id}; + return createAggregationData(table); }, }; } @@ -99,7 +105,16 @@ export class AndroidLogSelectionAggregator implements Aggregator { ); }, }, - ts: {title: 'Timestamp', columnType: 'quantitative'}, + ts: { + title: 'Timestamp', + columnType: 'quantitative', + cellRenderer: (value: unknown) => { + if (typeof value === 'bigint') { + return m(Timestamp, {trace: this.trace, ts: Time.fromRaw(value)}); + } + return String(value ?? ''); + }, + }, prio: {title: 'Priority', columnType: 'quantitative'}, tag: {title: 'Tag', columnType: 'text'}, msg: {title: 'Message', columnType: 'text'}, @@ -108,6 +123,15 @@ export class AndroidLogSelectionAggregator implements Aggregator { pid: {title: 'PID', columnType: 'quantitative'}, process_name: {title: 'Process', columnType: 'text'}, }, + initialColumns: [ + {id: 'id', field: 'id'}, + {id: 'ts', field: 'ts'}, + {id: 'prio', field: 'prio'}, + {id: 'tag', field: 'tag'}, + {id: 'msg', field: 'msg'}, + {id: 'process_name', field: 'process_name'}, + {id: 'thread_name', field: 'thread_name'}, + ], initialPivot: { groupBy: [ {id: 'tag', field: 'tag'}, diff --git a/ui/src/plugins/com.android.ContainedTraces/index.ts b/ui/src/plugins/com.android.ContainedTraces/index.ts index 770af6b18a0..b4d0fea45ae 100644 --- a/ui/src/plugins/com.android.ContainedTraces/index.ts +++ b/ui/src/plugins/com.android.ContainedTraces/index.ts @@ -170,9 +170,25 @@ class ContainedTracesTab implements AreaSelectionTab { rows: ReadonlyArray, selected: Set, ): m.Children { + const allSelected = rows.length > 0 && selected.size === rows.length; return m(Grid, { columns: [ - {key: 'select'}, + { + key: 'select', + header: m( + GridHeaderCell, + m(Checkbox, { + checked: allSelected, + onchange: () => { + if (allSelected) { + selected.clear(); + } else { + rows.forEach((r) => selected.add(r.uuid)); + } + }, + }), + ), + }, {key: 'self', header: m(GridHeaderCell, 'Self')}, {key: 'uuid', header: m(GridHeaderCell, 'Trace')}, {key: 'name', header: m(GridHeaderCell, 'Name')}, diff --git a/ui/src/plugins/com.android.PinAndroidPerfMetrics/handlers/pinBlockingCall.ts b/ui/src/plugins/com.android.PinAndroidPerfMetrics/handlers/pinBlockingCall.ts index a4cbc3773a4..bf02907ded1 100644 --- a/ui/src/plugins/com.android.PinAndroidPerfMetrics/handlers/pinBlockingCall.ts +++ b/ui/src/plugins/com.android.PinAndroidPerfMetrics/handlers/pinBlockingCall.ts @@ -98,14 +98,13 @@ class BlockingCallMetricHandler implements MetricHandler { const processName = metricData.process; const blockingCallName = metricData.blockingCallName; - // TODO: b/296349525 - Migrate jank tables from run metrics to stdlib const blockingCallDuringCujQuery = ` - SELECT name, ts, dur - FROM blocking_call_slices_scoped_to_cujs - WHERE process_name = "${processName}" - AND cuj_name = "${cuj}" - AND name = "${blockingCallName}" - `; + SELECT name, ts, dur + FROM android_cuj_blocking_calls + WHERE process_name = "${processName}" + AND cuj_name = "${cuj}" + AND name = "${blockingCallName}" + `; const trackName = 'Blocking calls in ' + processName; return { diff --git a/ui/src/plugins/com.android.PinAndroidPerfMetrics/handlers/pinCujScoped.ts b/ui/src/plugins/com.android.PinAndroidPerfMetrics/handlers/pinCujScoped.ts index b8ca49951d2..bc1ca459d99 100644 --- a/ui/src/plugins/com.android.PinAndroidPerfMetrics/handlers/pinCujScoped.ts +++ b/ui/src/plugins/com.android.PinAndroidPerfMetrics/handlers/pinCujScoped.ts @@ -98,7 +98,7 @@ class PinCujScopedJank implements MetricHandler { f.ts AS ts, f.dur as dur, f.jank_score as jank_score - FROM android_jank_cuj_frame f LEFT JOIN android_jank_cuj cuj USING (cuj_id) + FROM _android_jank_cuj_frame f LEFT JOIN android_jank_cuj cuj USING (cuj_id) WHERE cuj.process_name = "${processName}" AND cuj_name = "${cuj}" ${jankTypeFilter} `; diff --git a/ui/src/plugins/com.android.PinAndroidPerfMetrics/index.ts b/ui/src/plugins/com.android.PinAndroidPerfMetrics/index.ts index f1609fd4535..21c80087440 100644 --- a/ui/src/plugins/com.android.PinAndroidPerfMetrics/index.ts +++ b/ui/src/plugins/com.android.PinAndroidPerfMetrics/index.ts @@ -20,7 +20,9 @@ import AndroidCujsPlugin from '../com.android.AndroidCujs'; import Wattson from '../org.kernel.Wattson'; const JANK_CUJ_QUERY_PRECONDITIONS = ` - SELECT RUN_METRIC('android/android_blocking_calls_cuj_metric.sql'); + INCLUDE PERFETTO MODULE android.cujs.frames; + INCLUDE PERFETTO MODULE android.cujs.sysui_cujs; + INCLUDE PERFETTO MODULE android.critical_blocking_calls; `; function getMetricsFromHash(): string[] { diff --git a/ui/src/plugins/dev.perfetto.EntityStateResidency/entity_state_residency_selection_aggregator.ts b/ui/src/plugins/dev.perfetto.EntityStateResidency/entity_state_residency_selection_aggregator.ts index bfb424a4603..52b12f9fe78 100644 --- a/ui/src/plugins/dev.perfetto.EntityStateResidency/entity_state_residency_selection_aggregator.ts +++ b/ui/src/plugins/dev.perfetto.EntityStateResidency/entity_state_residency_selection_aggregator.ts @@ -13,13 +13,15 @@ // limitations under the License. import {Duration} from '../../base/time'; -import type { - Aggregator, - AggregatorGridConfig, +import { + type Aggregator, + type AggregatorGridConfig, + createAggregationData, } from '../../components/aggregation_adapter'; import type {AreaSelection} from '../../public/selection'; import {COUNTER_TRACK_KIND} from '../../public/track_kinds'; import type {Engine} from '../../trace_processor/engine'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; import {formatPercentValue} from '../../components/aggregation_panel'; export class EntityStateResidencySelectionAggregator implements Aggregator { @@ -46,9 +48,12 @@ export class EntityStateResidencySelectionAggregator implements Aggregator { const duration = area.end - area.start; const durationSec = Duration.toSeconds(duration); - const query = ` - INCLUDE PERFETTO MODULE android.entity_state_residency; - CREATE OR REPLACE PERFETTO TABLE ${this.id} AS + await engine.query( + `INCLUDE PERFETTO MODULE android.entity_state_residency`, + ); + const table = await createPerfettoTable({ + engine, + as: ` WITH aggregated AS ( SELECT track_id, @@ -70,12 +75,10 @@ export class EntityStateResidencySelectionAggregator implements Aggregator { (last - first)/(${durationSec} * 1e9) AS rate_percent FROM aggregated GROUP BY track_id, entity_name, state_name - `; - await engine.query(query); + `, + }); - return { - tableName: this.id, - }; + return createAggregationData(table); }, }; } diff --git a/ui/src/plugins/dev.perfetto.Frames/frame_selection_aggregator.ts b/ui/src/plugins/dev.perfetto.Frames/frame_selection_aggregator.ts index e8da7097315..9b9d8e07dd2 100644 --- a/ui/src/plugins/dev.perfetto.Frames/frame_selection_aggregator.ts +++ b/ui/src/plugins/dev.perfetto.Frames/frame_selection_aggregator.ts @@ -12,23 +12,33 @@ // See the License for the specific language governing permissions and // limitations under the License. +import m from 'mithril'; +import {Time} from '../../base/time'; import { type Aggregation, type Aggregator, type AggregatorGridConfig, + createAggregationData, createIITable, selectTracksAndGetDataset, } from '../../components/aggregation_adapter'; +import {formatDurationValue} from '../../components/aggregation_panel'; +import type {ColumnSchema} from '../../components/widgets/datagrid/datagrid_schema'; +import type {SQLTableSchema} from '../../components/widgets/datagrid/sql_schema'; +import {Timestamp} from '../../components/widgets/timestamp'; import type {AreaSelection} from '../../public/selection'; +import type {Trace} from '../../public/trace'; import type {Engine} from '../../trace_processor/engine'; import {LONG, NUM, STR} from '../../trace_processor/query_result'; -import {formatDurationValue} from '../../components/aggregation_panel'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; export const ACTUAL_FRAMES_SLICE_TRACK_KIND = 'ActualFramesSliceTrack'; export class FrameSelectionAggregator implements Aggregator { readonly id = 'frame_aggregation'; + constructor(private readonly trace: Trace) {} + probe(area: AreaSelection): Aggregation | undefined { const dataset = selectTracksAndGetDataset( area.tracks, @@ -37,6 +47,7 @@ export class FrameSelectionAggregator implements Aggregator { ts: LONG, dur: LONG, jank_type: STR, + track_id: NUM, }, ACTUAL_FRAMES_SLICE_TRACK_KIND, ); @@ -52,17 +63,23 @@ export class FrameSelectionAggregator implements Aggregator { area.start, area.end, ); - await engine.query(` - create or replace perfetto table ${this.id} as - select - jank_type, - dur - from (${iiTable.name}) - `); + const table = await createPerfettoTable({ + engine, + as: ` + select + f.ts, + f.jank_type, + f.dur, + f.track_id, + process_track.upid, + process.name as process_name + from ${iiTable.name} f + left join process_track on (f.track_id = process_track.id) + left join process on (process_track.upid = process.upid) + `, + }); - return { - tableName: this.id, - }; + return createAggregationData(table); }, }; } @@ -72,15 +89,71 @@ export class FrameSelectionAggregator implements Aggregator { } private getGridConfig(): AggregatorGridConfig { - return { - schema: { - jank_type: {title: 'Jank Type', columnType: 'text'}, - dur: { - title: 'Duration', - columnType: 'quantitative', - cellRenderer: formatDurationValue, + const schema: ColumnSchema = { + jank_type: {title: 'Jank Type', columnType: 'text'}, + ts: { + title: 'Timestamp', + columnType: 'quantitative', + cellRenderer: (value: unknown) => { + if (typeof value === 'bigint') { + return m(Timestamp, {trace: this.trace, ts: Time.fromRaw(value)}); + } + return String(value ?? ''); + }, + }, + dur: { + title: 'Duration', + columnType: 'quantitative', + cellRenderer: formatDurationValue, + }, + process: { + title: 'Process', + schema: { + id: { + title: 'UPID', + columnType: 'identifier', + }, + name: { + title: 'Process Name', + columnType: 'text', + }, + pid: { + title: 'PID', + columnType: 'identifier', + }, + cmdline: { + title: 'Cmdline', + columnType: 'text', + }, }, }, + }; + + return { + schema, + sqlConfig: ({sqlTable}): SQLTableSchema => ({ + tableOrSubquery: sqlTable.get().name, + columns: { + process: { + foreignKey: 'upid', + schema: { + tableOrSubquery: 'process', + columns: { + id: {}, + name: {}, + pid: {}, + cmdline: {}, + }, + }, + }, + }, + }), + initialColumns: [ + {id: 'jank_type', field: 'jank_type'}, + {id: 'ts', field: 'ts'}, + {id: 'dur', field: 'dur'}, + {id: 'process_name', field: 'process_name'}, + ], initialPivot: { groupBy: [{id: 'jank_type', field: 'jank_type'}], aggregates: [ diff --git a/ui/src/plugins/dev.perfetto.Frames/index.ts b/ui/src/plugins/dev.perfetto.Frames/index.ts index f5bd47025df..06a62455dce 100644 --- a/ui/src/plugins/dev.perfetto.Frames/index.ts +++ b/ui/src/plugins/dev.perfetto.Frames/index.ts @@ -54,7 +54,7 @@ export default class FramesPlugin implements PerfettoPlugin { this.addExpectedFrames(ctx); this.addActualFrames(ctx); ctx.selection.registerAreaSelectionTab( - createAggregationTab(ctx, new FrameSelectionAggregator(), 10), + createAggregationTab(ctx, new FrameSelectionAggregator(ctx), 10), ); } diff --git a/ui/src/plugins/dev.perfetto.Memscope/components/preview_banner.scss b/ui/src/plugins/dev.perfetto.Memscope/components/preview_banner.scss new file mode 100644 index 00000000000..ac54e9f4b44 --- /dev/null +++ b/ui/src/plugins/dev.perfetto.Memscope/components/preview_banner.scss @@ -0,0 +1,34 @@ +// Copyright (C) 2026 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. + +.pf-memscope-preview-banner__body { + display: flex; + align-items: center; + flex-wrap: wrap; + justify-content: space-between; + gap: 8px 16px; + width: 100%; +} + +.pf-memscope-preview-banner__message { + flex: 1; + min-width: 280px; +} + +.pf-memscope-preview-banner__actions { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 4px; +} diff --git a/ui/src/plugins/dev.perfetto.Memscope/components/preview_banner.ts b/ui/src/plugins/dev.perfetto.Memscope/components/preview_banner.ts new file mode 100644 index 00000000000..e214c0d5252 --- /dev/null +++ b/ui/src/plugins/dev.perfetto.Memscope/components/preview_banner.ts @@ -0,0 +1,54 @@ +// Copyright (C) 2026 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. + +import './preview_banner.scss'; +import m from 'mithril'; +import type {App} from '../../../public/app'; +import {getBugReportUrl} from '../../../public/utils'; +import {Anchor} from '../../../widgets/anchor'; +import {Callout} from './callout'; + +export interface PreviewBannerAttrs { + readonly app: App; +} + +export class PreviewBanner implements m.ClassComponent { + view({attrs}: m.CVnode) { + return m( + Callout, + { + className: 'pf-memscope-preview-callout', + icon: 'info', + }, + m('.pf-memscope-preview-banner__body', [ + m( + 'span.pf-memscope-preview-banner__message', + 'This feature is in preview.', + ), + m( + '.pf-memscope-preview-banner__actions', + m( + Anchor, + { + href: getBugReportUrl(attrs.app), + target: '_blank', + startIcon: 'bug_report', + }, + 'Provide feedback', + ), + ), + ]), + ); + } +} diff --git a/ui/src/plugins/dev.perfetto.Memscope/index.ts b/ui/src/plugins/dev.perfetto.Memscope/index.ts index 1cf83d67078..ce644bb2883 100644 --- a/ui/src/plugins/dev.perfetto.Memscope/index.ts +++ b/ui/src/plugins/dev.perfetto.Memscope/index.ts @@ -16,7 +16,7 @@ import './styles.scss'; import m from 'mithril'; import {z} from 'zod'; import type {App} from '../../public/app'; -import type {PerfettoPlugin, PluginStatus} from '../../public/plugin'; +import type {PerfettoPlugin} from '../../public/plugin'; import type {Trace} from '../../public/trace'; import RecordPageV2 from '../dev.perfetto.RecordTraceV2'; import {ConnectionPage} from './views/connection'; @@ -29,7 +29,6 @@ export default class implements PerfettoPlugin { static readonly id = 'dev.perfetto.Memscope'; static readonly description = 'Live memory profiler for Android/Linux devices'; - static readonly status: PluginStatus = 'experimental'; static readonly dependencies = [RecordPageV2]; static onActivate(app: App) { @@ -41,6 +40,7 @@ export default class implements PerfettoPlugin { href: '#!/memscope', icon: 'memory', sortOrder: 2.5, + badge: 'preview', }); app.pages.registerPage({ @@ -57,6 +57,7 @@ export default class implements PerfettoPlugin { }); } else { return m(ConnectionPage, { + app, onConnected: (result) => { session = new LiveSession(app, result); session.onSnapshot(() => m.redraw()); @@ -113,6 +114,7 @@ export default class implements PerfettoPlugin { text: 'Memory Overview', href: `#!${pageRoot}`, icon: 'memory', + badge: 'preview', }); if (autoNavigated) { diff --git a/ui/src/plugins/dev.perfetto.Memscope/styles.scss b/ui/src/plugins/dev.perfetto.Memscope/styles.scss index c3aba388006..8e225a27e32 100644 --- a/ui/src/plugins/dev.perfetto.Memscope/styles.scss +++ b/ui/src/plugins/dev.perfetto.Memscope/styles.scss @@ -69,6 +69,10 @@ align-items: stretch; gap: 8px; padding: 8px; + + .pf-text-input { + flex: 1; + } } .pf-memscope-device-list { diff --git a/ui/src/plugins/dev.perfetto.Memscope/views/connection.ts b/ui/src/plugins/dev.perfetto.Memscope/views/connection.ts index ae01a6a6944..7694195770d 100644 --- a/ui/src/plugins/dev.perfetto.Memscope/views/connection.ts +++ b/ui/src/plugins/dev.perfetto.Memscope/views/connection.ts @@ -20,6 +20,7 @@ import {Button, ButtonVariant} from '../../../widgets/button'; import {Intent} from '../../../widgets/common'; import {TextInput} from '../../../widgets/text_input'; import {RadioGroup} from '../../../widgets/radio_group'; +import type {App} from '../../../public/app'; import type {AdbDevice} from '../../dev.perfetto.RecordTraceV2/adb/adb_device'; import { WDP_TRACK_DEVICES_SCHEMA, @@ -37,6 +38,7 @@ import {TracedWebsocketTarget} from '../../dev.perfetto.RecordTraceV2/traced_ove import {AsyncWebsocket} from '../../dev.perfetto.RecordTraceV2/websocket/async_websocket'; import {Page} from '../components/page'; import {Hero} from '../components/hero'; +import {PreviewBanner} from '../components/preview_banner'; export interface ConnectionResult { device?: AdbDevice; @@ -45,7 +47,8 @@ export interface ConnectionResult { } interface ConnectionPageAttrs { - onConnected: (result: ConnectionResult) => void; + readonly app: App; + readonly onConnected: (result: ConnectionResult) => void; } type ConnectionMethod = 'usb' | 'websocket' | 'web_proxy' | 'linux'; @@ -88,6 +91,7 @@ export class ConnectionPage implements m.ClassComponent { return m( Page, m(Page.Title, 'Memscope'), + m(PreviewBanner, {app: attrs.app}), m( Hero, m(Hero.Icon, {icon: 'memory'}), diff --git a/ui/src/plugins/dev.perfetto.Memscope/views/dashboard.ts b/ui/src/plugins/dev.perfetto.Memscope/views/dashboard.ts index 59cc8a01869..adc9401fd46 100644 --- a/ui/src/plugins/dev.perfetto.Memscope/views/dashboard.ts +++ b/ui/src/plugins/dev.perfetto.Memscope/views/dashboard.ts @@ -26,6 +26,7 @@ import {MenuDivider, MenuItem, PopupMenu} from '../../../widgets/menu'; import {PopupPosition} from '../../../widgets/popup'; import {RadioGroup} from '../../../widgets/radio_group'; import {Page} from '../components/page'; +import {PreviewBanner} from '../components/preview_banner'; import type { LiveSession, ProfileView, @@ -125,6 +126,7 @@ export class Dashboard implements m.ClassComponent { // Title bar with status and actions (always shown). this.renderTitleBar(attrs), + m(PreviewBanner, {app: attrs.app}), // Profile page or dashboard content. session.profile !== undefined diff --git a/ui/src/plugins/dev.perfetto.Memscope/views/landing_page/landing_page.ts b/ui/src/plugins/dev.perfetto.Memscope/views/landing_page/landing_page.ts index 736ccd2afdc..471497c17dd 100644 --- a/ui/src/plugins/dev.perfetto.Memscope/views/landing_page/landing_page.ts +++ b/ui/src/plugins/dev.perfetto.Memscope/views/landing_page/landing_page.ts @@ -17,7 +17,6 @@ import {assertIsInstance} from '../../../../base/assert'; import {AsyncMemo} from '../../../../base/async_memo'; import type {Setting} from '../../../../public/settings'; import type {Trace} from '../../../../public/trace'; -import {getBugReportUrl} from '../../../../public/utils'; import type {Engine} from '../../../../trace_processor/engine'; import { materializeRows, @@ -27,11 +26,12 @@ import { import {Button, ButtonGroup, ButtonVariant} from '../../../../widgets/button'; import {Intent} from '../../../../widgets/common'; import {EmptyState} from '../../../../widgets/empty_state'; -import {MenuDivider, MenuItem, PopupMenu} from '../../../../widgets/menu'; +import {MenuItem, PopupMenu} from '../../../../widgets/menu'; import {PopupPosition} from '../../../../widgets/popup'; import {Select} from '../../../../widgets/select'; import {Callout} from '../../components/callout'; import {Page} from '../../components/page'; +import {PreviewBanner} from '../../components/preview_banner'; import './landing_page.scss'; import {ProcessMemDetails} from './proc_mem_overview'; @@ -87,6 +87,7 @@ export class MemoryOverviewPage implements m.Component openByDefault, hideDefaultChangedHint, ), + m(PreviewBanner, {app: trace}), this.renderPageContent(trace, subpage, onSubpageChange), ); } @@ -154,13 +155,6 @@ export class MemoryOverviewPage implements m.Component icon: 'close', onclick: () => hideDefaultChangedHint.set(true), }), - m(MenuDivider), - m(MenuItem, { - label: 'Submit feedback', - icon: 'bug_report', - onclick: () => - window.open(getBugReportUrl(trace), '_blank', 'noopener'), - }), ), ), ), diff --git a/ui/src/plugins/dev.perfetto.Memscope/views/landing_page/summary/java_section.ts b/ui/src/plugins/dev.perfetto.Memscope/views/landing_page/summary/java_section.ts index 093fd50b95e..6f5ba54ab3a 100644 --- a/ui/src/plugins/dev.perfetto.Memscope/views/landing_page/summary/java_section.ts +++ b/ui/src/plugins/dev.perfetto.Memscope/views/landing_page/summary/java_section.ts @@ -194,7 +194,7 @@ async function loadJavaData(trace: Trace, upid: number): Promise { ) SELECT r.graph_sample_ts AS ts, - r.type_name AS type_name, + ifnull(r.type_name, '[unknown]') AS type_name, r.reachable_obj_count AS reachable_obj_count, r.reachable_size_bytes AS reachable_size_bytes, r.reachable_native_size_bytes AS reachable_native_size_bytes, @@ -385,7 +385,8 @@ async function loadRetainers( FROM hits GROUP BY owned_class, retainer ) - SELECT a.owned_class AS type_name, a.retainer AS retainer_name, + SELECT ifnull(a.owned_class, '[unknown]') AS type_name, + ifnull(a.retainer, '[unknown]') AS retainer_name, a.bytes AS bytes FROM agg a WHERE a.rrn <= ${RETAINER_MAX_VIAS} diff --git a/ui/src/plugins/dev.perfetto.PowerRails/power_counter_selection_aggregator.ts b/ui/src/plugins/dev.perfetto.PowerRails/power_counter_selection_aggregator.ts index 786890fba08..6c623478cb7 100644 --- a/ui/src/plugins/dev.perfetto.PowerRails/power_counter_selection_aggregator.ts +++ b/ui/src/plugins/dev.perfetto.PowerRails/power_counter_selection_aggregator.ts @@ -13,15 +13,17 @@ // limitations under the License. import {Duration} from '../../base/time'; -import type { - Aggregation, - Aggregator, - AggregatorGridConfig, +import { + type Aggregation, + type Aggregator, + type AggregatorGridConfig, + createAggregationData, } from '../../components/aggregation_adapter'; import type {AreaSelection} from '../../public/selection'; import {COUNTER_TRACK_KIND} from '../../public/track_kinds'; import type {Engine} from '../../trace_processor/engine'; import {LONG, NUM} from '../../trace_processor/query_result'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; export class PowerCounterSelectionAggregator implements Aggregator { readonly id = 'power_counter_aggregation'; @@ -53,31 +55,31 @@ export class PowerCounterSelectionAggregator implements Aggregator { const duration = area.end - area.start; const durationSec = Duration.toSeconds(duration); - const query = `INCLUDE PERFETTO MODULE android.power_rails; - CREATE OR REPLACE PERFETTO TABLE ${this.id} AS - WITH aggregated AS ( - SELECT track_id, - COUNT(1) AS count, - value_at_max_ts(-ts, value) AS first, - value_at_max_ts(ts, value) AS last - FROM counter - WHERE counter.track_id in (${trackIds}) - AND ts BETWEEN ${area.start} AND ${area.end} + await engine.query(`INCLUDE PERFETTO MODULE android.power_rails`); + const table = await createPerfettoTable({ + engine, + as: ` + WITH aggregated AS ( + SELECT track_id, + COUNT(1) AS count, + value_at_max_ts(-ts, value) AS first, + value_at_max_ts(ts, value) AS last + FROM counter + WHERE counter.track_id in (${trackIds}) + AND ts BETWEEN ${area.start} AND ${area.end} + GROUP BY track_id + ) + SELECT + COALESCE(friendly_name, raw_power_rail_name) AS name, + count, + (last - first) / 1000 AS delta_value, + ROUND((last - first)/${durationSec} / 1000, 2) AS rate + FROM aggregated JOIN android_power_rails_metadata USING (track_id) GROUP BY track_id - ) - SELECT - COALESCE(friendly_name, raw_power_rail_name) AS name, - count, - (last - first) / 1000 AS delta_value, - ROUND((last - first)/${durationSec} / 1000, 2) AS rate - FROM aggregated JOIN android_power_rails_metadata USING (track_id) - GROUP BY track_id - `; - await engine.query(query); + `, + }); - return { - tableName: this.id, - }; + return createAggregationData(table); }, }; } diff --git a/ui/src/plugins/dev.perfetto.Sched/cpu_slice_by_process_selection_aggregator.ts b/ui/src/plugins/dev.perfetto.Sched/cpu_slice_by_process_selection_aggregator.ts deleted file mode 100644 index ae5eba43d93..00000000000 --- a/ui/src/plugins/dev.perfetto.Sched/cpu_slice_by_process_selection_aggregator.ts +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright (C) 2021 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. - -import m from 'mithril'; -import {Icons} from '../../base/semantic_icons'; -import { - type Aggregation, - type Aggregator, - type AggregatorGridConfig, - createIITable, -} from '../../components/aggregation_adapter'; -import type {AreaSelection} from '../../public/selection'; -import type {Trace} from '../../public/trace'; -import type {Track} from '../../public/track'; -import {CPU_SLICE_TRACK_KIND} from '../../public/track_kinds'; -import { - type Dataset, - type DatasetSchema, - SourceDataset, - UnionDatasetWithLineage, -} from '../../trace_processor/dataset'; -import type {Engine} from '../../trace_processor/engine'; -import { - LONG, - NUM, - type SqlValue, - UNKNOWN, -} from '../../trace_processor/query_result'; -import {Anchor} from '../../widgets/anchor'; -import { - formatDurationValue, - formatPercentValue, -} from '../../components/aggregation_panel'; - -const CPU_SLICE_SPEC = { - id: NUM, - dur: LONG, - ts: LONG, - utid: NUM, -}; - -export class CpuSliceByProcessSelectionAggregator implements Aggregator { - readonly id = 'cpu_by_process_aggregation'; - - private readonly trace: Trace; - - constructor(trace: Trace) { - this.trace = trace; - } - - probe(area: AreaSelection): Aggregation | undefined { - // Collect CPU slice tracks - const cpuTracks: Track[] = []; - - for (const track of area.tracks) { - if (!track.tags?.kinds?.includes(CPU_SLICE_TRACK_KIND)) continue; - const dataset = track.renderer.getDataset?.(); - if (!dataset || !(dataset instanceof SourceDataset)) continue; - if (!dataset.implements(CPU_SLICE_SPEC)) continue; - cpuTracks.push(track); - } - - if (cpuTracks.length === 0) return undefined; - - // Build track-to-dataset mapping - const trackDatasetMap = new Map(); - const datasets: Dataset[] = []; - for (const track of cpuTracks) { - const dataset = track.renderer.getDataset?.(); - if (dataset) { - datasets.push(dataset); - trackDatasetMap.set(dataset, track); - } - } - - // Create union dataset with lineage tracking - const unionDataset = UnionDatasetWithLineage.create(datasets); - - return { - getGridConfig: () => { - return this.getGridConfig((groupId, partition) => - this.resolveTrack(groupId, partition, trackDatasetMap, unionDataset), - ); - }, - prepareData: async (engine: Engine) => { - // Query with needed columns for II table - const iiQuerySchema = { - ...CPU_SLICE_SPEC, - __groupid: NUM, - __partition: UNKNOWN, - }; - const sql = unionDataset.query(iiQuerySchema); - - // Create interval-intersect table for time filtering - await using iiTable = await createIITable( - engine, - new SourceDataset({src: `(${sql})`, schema: iiQuerySchema}), - area.start, - area.end, - ); - await engine.query(` - create or replace perfetto table ${this.id} as - select - json_object('id', cpu_slice.id, 'groupid', __groupid, 'partition', __partition) as id_with_lineage, - process.name as process_name, - process.pid, - dur, - dur * 1.0 / sum(dur) OVER () as fraction_of_total, - dur * 1.0 / ${area.end - area.start} as fraction_of_selection - from ${iiTable.name} AS cpu_slice - join thread USING (utid) - join process USING (upid) - `); - - return { - tableName: this.id, - }; - }, - }; - } - - getTabName() { - return 'CPU by process'; - } - - private getGridConfig( - resolveTrack: (groupId: number, partition: SqlValue) => Track | undefined, - ): AggregatorGridConfig { - return { - schema: { - id_with_lineage: { - title: 'ID', - columnType: 'identifier', - cellRenderer: (value: unknown) => { - // Value is a JSON object {id, groupid, partition} - if (typeof value !== 'string') { - return String(value); - } - - const parsed = JSON.parse(value) as { - id: number; - groupid: number; - partition: SqlValue; - }; - const {id, groupid, partition} = parsed; - - // Resolve track from lineage - const track = resolveTrack(groupid, partition); - if (!track) { - return String(id); - } - - return m( - Anchor, - { - title: 'Go to sched slice', - icon: Icons.UpdateSelection, - onclick: () => { - this.trace.selection.selectTrackEvent(track.uri, id, { - scrollToSelection: true, - }); - }, - }, - String(id), - ); - }, - }, - pid: {title: 'PID', columnType: 'identifier'}, - process_name: {title: 'Process Name', columnType: 'text'}, - dur: { - title: 'CPU Time', - columnType: 'quantitative', - cellRenderer: formatDurationValue, - }, - fraction_of_total: { - title: 'CPU Time %', - columnType: 'quantitative', - cellRenderer: formatPercentValue, - }, - fraction_of_selection: { - title: 'CPU Time / Wall Time', - columnType: 'quantitative', - cellRenderer: formatPercentValue, - }, - }, - initialPivot: { - groupBy: [{id: 'process_name', field: 'process_name'}], - aggregates: [ - {id: 'count', function: 'COUNT'}, - {id: 'dur_sum', field: 'dur', function: 'SUM', sort: 'DESC'}, - { - id: 'fraction_of_total_sum', - field: 'fraction_of_total', - function: 'SUM', - }, - {id: 'dur_avg', field: 'dur', function: 'AVG'}, - ], - }, - }; - } - - /** - * Resolve a track from lineage information. - */ - private resolveTrack( - groupId: number, - partition: SqlValue, - trackDatasetMap: Map, - unionDataset?: UnionDatasetWithLineage, - ): Track | undefined { - if (!unionDataset) return undefined; - - // Ensure partition is a valid SqlValue - const partitionValue = - partition === null || - typeof partition === 'number' || - typeof partition === 'bigint' || - typeof partition === 'string' || - partition instanceof Uint8Array - ? partition - : null; - - const datasets = unionDataset.resolveLineage({ - __groupid: groupId, - __partition: partitionValue, - }); - - for (const dataset of datasets) { - const track = trackDatasetMap.get(dataset); - if (track) return track; - } - - return undefined; - } -} diff --git a/ui/src/plugins/dev.perfetto.Sched/cpu_slice_selection_aggregator.ts b/ui/src/plugins/dev.perfetto.Sched/cpu_slice_selection_aggregator.ts index 5eb35bddcc4..7356f60eabf 100644 --- a/ui/src/plugins/dev.perfetto.Sched/cpu_slice_selection_aggregator.ts +++ b/ui/src/plugins/dev.perfetto.Sched/cpu_slice_selection_aggregator.ts @@ -14,10 +14,12 @@ import m from 'mithril'; import {Icons} from '../../base/semantic_icons'; +import {Time} from '../../base/time'; import { type Aggregation, type Aggregator, - type AggregatorGridConfig, + type AggregatorGridPreset, + createAggregationData, createIITable, } from '../../components/aggregation_adapter'; import type {AreaSelection} from '../../public/selection'; @@ -42,6 +44,8 @@ import { formatDurationValue, formatPercentValue, } from '../../components/aggregation_panel'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; +import {Timestamp} from '../../components/widgets/timestamp'; const CPU_SLICE_SPEC = { id: NUM, @@ -110,115 +114,164 @@ export class CpuSliceSelectionAggregator implements Aggregator { area.end, ); - await engine.query(` - create or replace perfetto table ${this.id} as - select - json_object('id', sched.id, 'groupid', __groupid, 'partition', __partition) as id_with_lineage, - utid, - process.name as process_name, - pid, - thread.name as thread_name, - tid, - sched.dur, - sched.dur * 1.0 / sum(sched.dur) OVER () as fraction_of_total, - sched.dur * 1.0 / ${area.end - area.start} as fraction_of_selection, - ucpu - from ${iiTable.name} as sched - join thread using (utid) - left join process using (upid) - `); + const table = await createPerfettoTable({ + engine, + as: ` + select + json_object('id', sched.id, 'groupid', __groupid, 'partition', __partition) as id_with_lineage, + utid, + process.name as process_name, + pid, + thread.name as thread_name, + tid, + sched.ts, + sched.dur, + sched.dur * 1.0 / sum(sched.dur) OVER () as fraction_of_total, + sched.dur * 1.0 / ${area.end - area.start} as fraction_of_selection, + ucpu + from ${iiTable.name} as sched + join thread using (utid) + left join process using (upid) + `, + }); - return { - tableName: this.id, - }; + return createAggregationData(table); }, }; } getTabName() { - return `CPU by thread`; + return 'CPU Slices'; } private getGridConfig( resolveTrack: (groupId: number, partition: SqlValue) => Track | undefined, - ): AggregatorGridConfig { - return { - schema: { - id_with_lineage: { - title: 'ID', - columnType: 'identifier', - cellRenderer: (value: unknown) => { - // Value is a JSON object {id, groupid, partition} - if (typeof value !== 'string') { - return String(value); - } + ): ReadonlyArray { + const schema = { + id_with_lineage: { + title: 'ID', + columnType: 'identifier' as const, + cellRenderer: (value: unknown) => { + // Value is a JSON object {id, groupid, partition} + if (typeof value !== 'string') { + return String(value); + } - const parsed = JSON.parse(value) as { - id: number; - groupid: number; - partition: SqlValue; - }; - const {id, groupid, partition} = parsed; + const parsed = JSON.parse(value) as { + id: number; + groupid: number; + partition: SqlValue; + }; + const {id, groupid, partition} = parsed; - // Resolve track from lineage - const track = resolveTrack(groupid, partition); - if (!track) { - return String(id); - } + // Resolve track from lineage + const track = resolveTrack(groupid, partition); + if (!track) { + return String(id); + } - return m( - Anchor, - { - title: 'Go to sched slice', - icon: Icons.UpdateSelection, - onclick: () => { - this.trace.selection.selectTrackEvent(track.uri, id, { - scrollToSelection: true, - }); - }, + return m( + Anchor, + { + title: 'Go to sched slice', + icon: Icons.UpdateSelection, + onclick: () => { + this.trace.selection.selectTrackEvent(track.uri, id, { + scrollToSelection: true, + switchToCurrentSelectionTab: false, + }); }, - String(id), - ); - }, - }, - pid: {title: 'PID', columnType: 'identifier'}, - process_name: {title: 'Process Name', columnType: 'text'}, - tid: {title: 'TID', columnType: 'identifier'}, - thread_name: {title: 'Thread Name', columnType: 'text'}, - dur: { - title: 'CPU Time', - columnType: 'quantitative', - cellRenderer: formatDurationValue, + }, + String(id), + ); }, - fraction_of_total: { - title: 'CPU Time %', - columnType: 'quantitative', - cellRenderer: formatPercentValue, + }, + pid: {title: 'PID', columnType: 'identifier' as const}, + process_name: {title: 'Process Name', columnType: 'text' as const}, + tid: {title: 'TID', columnType: 'identifier' as const}, + thread_name: {title: 'Thread Name', columnType: 'text' as const}, + ts: { + title: 'Timestamp', + columnType: 'quantitative' as const, + cellRenderer: (value: unknown) => { + if (typeof value === 'bigint') { + return m(Timestamp, {trace: this.trace, ts: Time.fromRaw(value)}); + } + return String(value ?? ''); }, - fraction_of_selection: { - title: 'CPU Time / Wall Time', - columnType: 'quantitative', - cellRenderer: formatPercentValue, + }, + dur: { + title: 'CPU Time', + columnType: 'quantitative' as const, + cellRenderer: formatDurationValue, + }, + fraction_of_total: { + title: 'CPU Time %', + columnType: 'quantitative' as const, + cellRenderer: formatPercentValue, + }, + fraction_of_selection: { + title: 'CPU Time / Wall Time', + columnType: 'quantitative' as const, + cellRenderer: formatPercentValue, + }, + ucpu: {title: 'CPU', columnType: 'quantitative' as const}, + }; + + const aggregates = [ + {id: 'count', function: 'COUNT' as const}, + { + id: 'dur_sum', + field: 'dur', + function: 'SUM' as const, + sort: 'DESC' as const, + }, + { + id: 'fraction_of_total_sum', + field: 'fraction_of_total', + function: 'SUM' as const, + }, + {id: 'dur_avg', field: 'dur', function: 'AVG' as const}, + ]; + + const initialColumns = [ + {id: 'id_with_lineage', field: 'id_with_lineage'}, + {id: 'process_name', field: 'process_name'}, + {id: 'pid', field: 'pid'}, + {id: 'thread_name', field: 'thread_name'}, + {id: 'tid', field: 'tid'}, + {id: 'ts', field: 'ts'}, + {id: 'dur', field: 'dur'}, + {id: 'ucpu', field: 'ucpu'}, + ]; + + return [ + { + displayName: 'By Thread', + config: { + schema, + initialColumns, + initialPivot: { + groupBy: [ + {id: 'process_name', field: 'process_name'}, + {id: 'thread_name', field: 'thread_name'}, + ], + aggregates, + }, }, - ucpu: {title: 'CPU', columnType: 'quantitative'}, }, - initialPivot: { - groupBy: [ - {id: 'process_name', field: 'process_name'}, - {id: 'thread_name', field: 'thread_name'}, - ], - aggregates: [ - {id: 'count', function: 'COUNT'}, - {id: 'dur_sum', field: 'dur', function: 'SUM', sort: 'DESC'}, - { - id: 'fraction_of_total_sum', - field: 'fraction_of_total', - function: 'SUM', + { + displayName: 'By Process', + config: { + schema, + initialColumns, + initialPivot: { + groupBy: [{id: 'process_name', field: 'process_name'}], + aggregates, }, - {id: 'dur_avg', field: 'dur', function: 'AVG'}, - ], + }, }, - }; + ]; } /** diff --git a/ui/src/plugins/dev.perfetto.Sched/index.ts b/ui/src/plugins/dev.perfetto.Sched/index.ts index 0a2de6d2d91..77b22c42c00 100644 --- a/ui/src/plugins/dev.perfetto.Sched/index.ts +++ b/ui/src/plugins/dev.perfetto.Sched/index.ts @@ -46,7 +46,6 @@ import ProcessThreadGroupsPlugin from '../dev.perfetto.ProcessThreadGroups'; import ThreadPlugin from '../dev.perfetto.Thread'; import {ActiveCPUCountTrack, CPUType} from './active_cpu_count'; import {uriForSchedTrack} from './common'; -import {CpuSliceByProcessSelectionAggregator} from './cpu_slice_by_process_selection_aggregator'; import {CpuSliceSelectionAggregator} from './cpu_slice_selection_aggregator'; import {createCpuSliceTrack} from './cpu_slice_track'; import { @@ -57,9 +56,7 @@ import {ThreadStateSelectionAggregator} from './thread_state_selection_aggregato import {createThreadStateTrack} from './thread_state_track'; import {WakerOverlay} from './waker_overlay'; import {Cpu} from '../../components/cpu'; -import {ThreadStateByCpuAggregator} from './thread_state_by_cpu_aggregator'; import type {App} from '../../public/app'; -import type {Flag} from '../../public/feature_flag'; import type {Setting} from '../../public/settings'; import {z} from 'zod'; @@ -79,18 +76,9 @@ function uriForActiveCPUCountTrack(cpuType?: CPUType): string { export default class SchedPlugin implements PerfettoPlugin { static readonly id = 'dev.perfetto.Sched'; static readonly dependencies = [ProcessThreadGroupsPlugin, ThreadPlugin]; - static threadStateByCpuFlag: Flag; static taskColorModeSetting: Setting<'process' | 'priority'>; static onActivate(app: App) { - SchedPlugin.threadStateByCpuFlag = app.featureFlags.register({ - id: 'threadStateByCpu', - name: 'Thread State by CPU Aggregation', - description: - 'Add a new area selection aggregation tab showing thread states broken down by CPU.', - defaultValue: true, - }); - SchedPlugin.taskColorModeSetting = app.settings.register({ id: 'dev.perfetto.Sched#taskColorMode', name: 'Task slice color mode', @@ -185,9 +173,6 @@ export default class SchedPlugin implements PerfettoPlugin { ctx.selection.registerAreaSelectionTab( createAggregationTab(ctx, new CpuSliceSelectionAggregator(ctx)), ); - ctx.selection.registerAreaSelectionTab( - createAggregationTab(ctx, new CpuSliceByProcessSelectionAggregator(ctx)), - ); const cpuToClusterType = await this.getAndroidCpuClusterTypes(ctx.engine); @@ -304,12 +289,6 @@ export default class SchedPlugin implements PerfettoPlugin { createAggregationTab(ctx, new ThreadStateSelectionAggregator(ctx)), ); - if (SchedPlugin.threadStateByCpuFlag.get()) { - ctx.selection.registerAreaSelectionTab( - createAggregationTab(ctx, new ThreadStateByCpuAggregator()), - ); - } - const result = await engine.query(` include perfetto module viz.threads; include perfetto module viz.summary.threads; diff --git a/ui/src/plugins/dev.perfetto.Sched/selection_aggregation_utils.ts b/ui/src/plugins/dev.perfetto.Sched/selection_aggregation_utils.ts new file mode 100644 index 00000000000..7e0a0dc54ab --- /dev/null +++ b/ui/src/plugins/dev.perfetto.Sched/selection_aggregation_utils.ts @@ -0,0 +1,70 @@ +// Copyright (C) 2026 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. + +import type {AggregationData} from '../../components/aggregation_adapter'; +import type {Track} from '../../public/track'; +import { + type Dataset, + type DatasetSchema, + UnionDatasetWithLineage, +} from '../../trace_processor/dataset'; +import type {SqlValue} from '../../trace_processor/query_result'; + +export interface TrackLineageAggregationData extends AggregationData { + readonly trackDatasetMap: ReadonlyMap; + readonly unionDataset: UnionDatasetWithLineage; +} + +export function createTrackLineage( + tracks: readonly Track[], +): Omit { + const datasets: Dataset[] = []; + const trackDatasetMap = new Map(); + for (const track of tracks) { + const dataset = track.renderer.getDataset?.(); + if (dataset) { + datasets.push(dataset); + trackDatasetMap.set(dataset, track); + } + } + return { + trackDatasetMap, + unionDataset: UnionDatasetWithLineage.create(datasets), + }; +} + +export function resolveTrackFromLineage( + data: TrackLineageAggregationData, + groupId: number, + partition: SqlValue, +): Track | undefined { + const partitionValue = + partition === null || + typeof partition === 'number' || + typeof partition === 'bigint' || + typeof partition === 'string' || + partition instanceof Uint8Array + ? partition + : null; + + const datasets = data.unionDataset.resolveLineage({ + __groupid: groupId, + __partition: partitionValue, + }); + for (const dataset of datasets) { + const track = data.trackDatasetMap.get(dataset); + if (track) return track; + } + return undefined; +} diff --git a/ui/src/plugins/dev.perfetto.Sched/thread_state_by_cpu_aggregator.ts b/ui/src/plugins/dev.perfetto.Sched/thread_state_by_cpu_aggregator.ts deleted file mode 100644 index 38b119a93cd..00000000000 --- a/ui/src/plugins/dev.perfetto.Sched/thread_state_by_cpu_aggregator.ts +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (C) 2020 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. - -import {Duration} from '../../base/time'; -import type {BarChartData} from '../../components/aggregation'; -import { - type Aggregation, - type Aggregator, - type AggregatorGridConfig, - createIITable, - selectTracksAndGetDataset, -} from '../../components/aggregation_adapter'; -import type {AreaSelection} from '../../public/selection'; -import {THREAD_STATE_TRACK_KIND} from '../../public/track_kinds'; -import type {Engine} from '../../trace_processor/engine'; -import { - LONG, - NUM, - NUM_NULL, - STR, - STR_NULL, -} from '../../trace_processor/query_result'; -import {colorForThreadState} from './common'; -import { - formatDurationValue, - formatPercentValue, -} from '../../components/aggregation_panel'; - -export class ThreadStateByCpuAggregator implements Aggregator { - readonly id = 'thread_state_by_cpu_aggregation'; - - probe(area: AreaSelection): Aggregation | undefined { - const dataset = selectTracksAndGetDataset( - area.tracks, - { - id: NUM, - ts: LONG, - dur: LONG, - ucpu: NUM_NULL, - state: STR, - utid: NUM, - }, - THREAD_STATE_TRACK_KIND, - ); - - // If we couldn't pick out a dataset, we have nothing to show for this - // selection so just return undefined to indicate that no tab should be - // displayed. - if (!dataset) return undefined; - - return { - getGridConfig: () => this.getGridConfig(), - prepareData: async (engine: Engine) => { - await using iiTable = await createIITable( - engine, - dataset, - area.start, - area.end, - ); - - await engine.query(` - create or replace perfetto table ${this.id} as - select - process.name as process_name, - process.pid, - thread.name as thread_name, - thread.tid, - tstate.state as state, - utid, - ucpu, - dur, - dur * 1.0 / sum(dur) OVER () as fraction_of_total - from (${iiTable.name}) tstate - join thread using (utid) - left join process using (upid) - `); - - const query = ` - select - tstate.state as state, - sum(dur) as totalDur - from (${iiTable.name}) tstate - join thread using (utid) - group by tstate.state - `; - const result = await engine.query(query); - - const it = result.iter({ - state: STR_NULL, - totalDur: LONG, - }); - - const states: BarChartData[] = []; - for (; it.valid(); it.next()) { - const name = it.state ?? 'Unknown'; - states.push({ - title: `${name}: ${Duration.humanise(it.totalDur)}`, - value: Number(it.totalDur), - color: colorForThreadState(name), - }); - } - - return { - tableName: this.id, - barChartData: states, - }; - }, - }; - } - - private getGridConfig(): AggregatorGridConfig { - return { - schema: { - process_name: {title: 'Process', columnType: 'text'}, - pid: {title: 'PID', columnType: 'identifier'}, - thread_name: {title: 'Thread', columnType: 'text'}, - tid: {title: 'TID', columnType: 'identifier'}, - ucpu: {title: 'CPU', columnType: 'quantitative'}, - utid: {title: 'UTID', columnType: 'identifier'}, - state: {title: 'State', columnType: 'text'}, - dur: { - title: 'Wall duration', - columnType: 'quantitative', - cellRenderer: formatDurationValue, - }, - fraction_of_total: { - title: 'Wall duration %', - columnType: 'quantitative', - cellRenderer: formatPercentValue, - }, - }, - initialPivot: { - groupBy: [ - {id: 'thread_name', field: 'thread_name'}, - {id: 'state', field: 'state'}, - {id: 'ucpu', field: 'ucpu'}, - ], - aggregates: [ - {id: 'count', function: 'COUNT'}, - {id: 'process_name_any', field: 'process_name', function: 'ANY'}, - {id: 'pid_any', field: 'pid', function: 'ANY'}, - {id: 'thread_name_any', field: 'thread_name', function: 'ANY'}, - {id: 'tid_any', field: 'tid', function: 'ANY'}, - {id: 'dur_sum', field: 'dur', function: 'SUM', sort: 'DESC'}, - { - id: 'fraction_of_total_sum', - field: 'fraction_of_total', - function: 'SUM', - }, - {id: 'dur_avg', field: 'dur', function: 'AVG'}, - ], - }, - }; - } - - getTabName() { - return 'Thread States by CPU'; - } -} diff --git a/ui/src/plugins/dev.perfetto.Sched/thread_state_selection_aggregator.ts b/ui/src/plugins/dev.perfetto.Sched/thread_state_selection_aggregator.ts index 3cd35c3eedc..28ed4257e97 100644 --- a/ui/src/plugins/dev.perfetto.Sched/thread_state_selection_aggregator.ts +++ b/ui/src/plugins/dev.perfetto.Sched/thread_state_selection_aggregator.ts @@ -14,12 +14,13 @@ import m from 'mithril'; import {Icons} from '../../base/semantic_icons'; -import {Duration} from '../../base/time'; +import {Duration, Time} from '../../base/time'; import type {BarChartData} from '../../components/aggregation'; import { type Aggregation, type Aggregator, - type AggregatorGridConfig, + type AggregatorGridPreset, + createAggregationData, createIITable, } from '../../components/aggregation_adapter'; import type {AreaSelection} from '../../public/selection'; @@ -48,6 +49,8 @@ import { formatDurationValue, formatPercentValue, } from '../../components/aggregation_panel'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; +import {Timestamp} from '../../components/widgets/timestamp'; const THREAD_STATE_SPEC = { id: NUM, @@ -117,27 +120,30 @@ export class ThreadStateSelectionAggregator implements Aggregator { area.end, ); - await engine.query(` - include perfetto module android.cpu.cluster_type; + await engine.query('include perfetto module android.cpu.cluster_type'); - create or replace perfetto table ${this.id} as - select - json_object('id', tstate.id, 'groupid', __groupid, 'partition', __partition) as id_with_lineage, - process.name as process_name, - process.pid as pid, - thread.name as thread_name, - thread.tid as tid, - tstate.state as state, - utid, - ucpu, - dur, - dur * 1.0 / sum(dur) OVER () as fraction_of_total, - android_cpu_cluster_mapping.cluster_type as cluster_type - from ${iiTable.name} tstate - join thread using (utid) - left join process using (upid) - left join android_cpu_cluster_mapping using(ucpu) - `); + const table = await createPerfettoTable({ + engine, + as: ` + select + json_object('id', tstate.id, 'groupid', __groupid, 'partition', __partition) as id_with_lineage, + process.name as process_name, + process.pid as pid, + thread.name as thread_name, + thread.tid as tid, + tstate.state as state, + utid, + ucpu, + tstate.ts, + dur, + dur * 1.0 / sum(dur) OVER () as fraction_of_total, + android_cpu_cluster_mapping.cluster_type as cluster_type + from ${iiTable.name} tstate + join thread using (utid) + left join process using (upid) + left join android_cpu_cluster_mapping using(ucpu) + `, + }); const query = ` select @@ -164,96 +170,146 @@ export class ThreadStateSelectionAggregator implements Aggregator { }); } - return { - tableName: this.id, - barChartData: states, - }; + return createAggregationData(table, states); }, }; } private getGridConfig( resolveTrack: (groupId: number, partition: SqlValue) => Track | undefined, - ): AggregatorGridConfig { - return { - schema: { - id_with_lineage: { - title: 'ID', - columnType: 'identifier', - cellRenderer: (value: unknown) => { - // Value is a JSON object {id, groupid, partition} - if (typeof value !== 'string') { - return String(value); - } + ): ReadonlyArray { + const schema = { + id_with_lineage: { + title: 'ID', + columnType: 'identifier' as const, + cellRenderer: (value: unknown) => { + // Value is a JSON object {id, groupid, partition} + if (typeof value !== 'string') { + return String(value); + } - const parsed = JSON.parse(value) as { - id: number; - groupid: number; - partition: SqlValue; - }; - const {id, groupid, partition} = parsed; + const parsed = JSON.parse(value) as { + id: number; + groupid: number; + partition: SqlValue; + }; + const {id, groupid, partition} = parsed; - // Resolve track from lineage - const track = resolveTrack(groupid, partition); - if (!track) { - return String(id); - } + // Resolve track from lineage + const track = resolveTrack(groupid, partition); + if (!track) { + return String(id); + } - return m( - Anchor, - { - title: 'Go to thread state', - icon: Icons.UpdateSelection, - onclick: () => { - this.trace.selection.selectTrackEvent(track.uri, id, { - scrollToSelection: true, - }); - }, + return m( + Anchor, + { + title: 'Go to thread state', + icon: Icons.UpdateSelection, + onclick: () => { + this.trace.selection.selectTrackEvent(track.uri, id, { + scrollToSelection: true, + switchToCurrentSelectionTab: false, + }); }, - String(id), - ); - }, + }, + String(id), + ); }, - cluster_type: {title: 'Cluster Type', columnType: 'text'}, - process_name: {title: 'Process', columnType: 'text'}, - pid: {title: 'PID', columnType: 'identifier'}, - thread_name: {title: 'Thread', columnType: 'text'}, - tid: {title: 'TID', columnType: 'identifier'}, - ucpu: {title: 'CPU', columnType: 'quantitative'}, - utid: {title: 'UTID', columnType: 'identifier'}, - state: {title: 'State', columnType: 'text'}, - dur: { - title: 'Wall duration', - columnType: 'quantitative', - cellRenderer: formatDurationValue, + }, + cluster_type: {title: 'Cluster Type', columnType: 'text' as const}, + process_name: {title: 'Process', columnType: 'text' as const}, + pid: {title: 'PID', columnType: 'identifier' as const}, + thread_name: {title: 'Thread', columnType: 'text' as const}, + tid: {title: 'TID', columnType: 'identifier' as const}, + ucpu: {title: 'CPU', columnType: 'quantitative' as const}, + utid: {title: 'UTID', columnType: 'identifier' as const}, + state: {title: 'State', columnType: 'text' as const}, + ts: { + title: 'Timestamp', + columnType: 'quantitative' as const, + cellRenderer: (value: unknown) => { + if (typeof value === 'bigint') { + return m(Timestamp, {trace: this.trace, ts: Time.fromRaw(value)}); + } + return String(value ?? ''); }, - fraction_of_total: { - title: 'Wall duration %', - columnType: 'quantitative', - cellRenderer: formatPercentValue, + }, + dur: { + title: 'Wall duration', + columnType: 'quantitative' as const, + cellRenderer: formatDurationValue, + }, + fraction_of_total: { + title: 'Wall duration %', + columnType: 'quantitative' as const, + cellRenderer: formatPercentValue, + }, + }; + + const aggregates = [ + {id: 'count', function: 'COUNT' as const}, + {id: 'process_name_any', field: 'process_name', function: 'ANY' as const}, + {id: 'pid_any', field: 'pid', function: 'ANY' as const}, + {id: 'thread_name_any', field: 'thread_name', function: 'ANY' as const}, + {id: 'tid_any', field: 'tid', function: 'ANY' as const}, + { + id: 'dur_sum', + field: 'dur', + function: 'SUM' as const, + sort: 'DESC' as const, + }, + { + id: 'fraction_of_total_sum', + field: 'fraction_of_total', + function: 'SUM' as const, + }, + {id: 'dur_avg', field: 'dur', function: 'AVG' as const}, + ]; + + const initialColumns = [ + {id: 'id_with_lineage', field: 'id_with_lineage'}, + {id: 'process_name', field: 'process_name'}, + {id: 'pid', field: 'pid'}, + {id: 'thread_name', field: 'thread_name'}, + {id: 'tid', field: 'tid'}, + {id: 'state', field: 'state'}, + {id: 'ts', field: 'ts'}, + {id: 'dur', field: 'dur'}, + {id: 'ucpu', field: 'ucpu'}, + ]; + + return [ + { + displayName: 'By Thread', + config: { + schema, + initialColumns, + initialPivot: { + groupBy: [ + {id: 'thread_name', field: 'thread_name'}, + {id: 'state', field: 'state'}, + ], + aggregates, + }, }, }, - initialPivot: { - groupBy: [ - {id: 'thread_name', field: 'thread_name'}, - {id: 'state', field: 'state'}, - ], - aggregates: [ - {id: 'count', function: 'COUNT'}, - {id: 'process_name_any', field: 'process_name', function: 'ANY'}, - {id: 'pid_any', field: 'pid', function: 'ANY'}, - {id: 'thread_name_any', field: 'thread_name', function: 'ANY'}, - {id: 'tid_any', field: 'tid', function: 'ANY'}, - {id: 'dur_sum', field: 'dur', function: 'SUM', sort: 'DESC'}, - { - id: 'fraction_of_total_sum', - field: 'fraction_of_total', - function: 'SUM', + { + displayName: 'By CPU', + config: { + schema, + initialColumns, + initialPivot: { + groupBy: [ + {id: 'thread_name', field: 'thread_name'}, + {id: 'state', field: 'state'}, + {id: 'ucpu', field: 'ucpu'}, + ], + aggregates, }, - {id: 'dur_avg', field: 'dur', function: 'AVG'}, - ], + }, }, - }; + ]; } getTabName() { diff --git a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/counter_selection_aggregator.ts b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/counter_selection_aggregator.ts index cf7444b157a..1c6c48a7d85 100644 --- a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/counter_selection_aggregator.ts +++ b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/counter_selection_aggregator.ts @@ -13,14 +13,16 @@ // limitations under the License. import {Duration} from '../../base/time'; -import type { - Aggregation, - Aggregator, - AggregatorGridConfig, +import { + type Aggregation, + type Aggregator, + type AggregatorGridConfig, + createAggregationData, } from '../../components/aggregation_adapter'; import type {AreaSelection} from '../../public/selection'; import {COUNTER_TRACK_KIND} from '../../public/track_kinds'; import type {Engine} from '../../trace_processor/engine'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; export class CounterSelectionAggregator implements Aggregator { readonly id = 'counter_aggregation'; @@ -47,7 +49,6 @@ export class CounterSelectionAggregator implements Aggregator { if (trackIds.length === 1) { // Optimized query for the special case where there is only 1 track id. query = ` - CREATE OR REPLACE PERFETTO TABLE ${this.id} AS WITH res AS ( select c.* @@ -81,7 +82,6 @@ export class CounterSelectionAggregator implements Aggregator { } else { // Slower, but general purspose query that can aggregate multiple tracks query = ` - CREATE OR REPLACE PERFETTO TABLE ${this.id} AS WITH res AS ( select c.* @@ -121,11 +121,8 @@ export class CounterSelectionAggregator implements Aggregator { track_id = counter_track.id GROUP BY track_id`; } - await engine.query(query); - - return { - tableName: this.id, - }; + const table = await createPerfettoTable({engine, as: query}); + return createAggregationData(table); }, }; } diff --git a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/index.ts b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/index.ts index b68160dd881..6702adb8371 100644 --- a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/index.ts +++ b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/index.ts @@ -51,7 +51,7 @@ import StandardGroupsPlugin from '../dev.perfetto.StandardGroups'; import {CounterSelectionAggregator} from './counter_selection_aggregator'; import {COUNTER_TRACK_SCHEMAS} from './counter_tracks'; import {PivotTableTab} from './pivot_table_tab'; -import {SliceSelectionAggregator} from './slice_selection_aggregator'; +import {ThreadSliceAggregator} from './thread_slice_aggregator'; import {SLICE_TRACK_SCHEMAS} from './slice_tracks'; import {STATE_TRACK_SCHEMAS} from './state_tracks'; import {TraceProcessorCounterTrack} from './trace_processor_counter_track'; @@ -597,7 +597,7 @@ export default class TraceProcessorTrackPlugin implements PerfettoPlugin { createAggregationTab(ctx, new CounterSelectionAggregator()), ); ctx.selection.registerAreaSelectionTab( - createAggregationTab(ctx, new SliceSelectionAggregator(ctx)), + createAggregationTab(ctx, new ThreadSliceAggregator(ctx)), ); ctx.selection.registerAreaSelectionTab(new PivotTableTab(ctx)); ctx.selection.registerAreaSelectionTab( diff --git a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/slice_selection_aggregator.ts b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/slice_selection_aggregator.ts deleted file mode 100644 index 9a44bf69566..00000000000 --- a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/slice_selection_aggregator.ts +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright (C) 2020 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. - -import m from 'mithril'; -import {AsyncDisposableStack} from '../../base/disposable_stack'; -import {Icons} from '../../base/semantic_icons'; -import { - type Aggregation, - type Aggregator, - type AggregatorGridConfig, - createIITable, -} from '../../components/aggregation_adapter'; -import type {AreaSelection} from '../../public/selection'; -import type {Trace} from '../../public/trace'; -import type {Track} from '../../public/track'; -import { - type Dataset, - type DatasetSchema, - SourceDataset, - UnionDatasetWithLineage, -} from '../../trace_processor/dataset'; -import type {Engine} from '../../trace_processor/engine'; -import { - LONG, - NUM, - NUM_NULL, - type SqlValue, - STR_NULL, - UNKNOWN, -} from '../../trace_processor/query_result'; -import {createPerfettoTable} from '../../trace_processor/sql_utils'; -import type {SQLTableSchema} from '../../components/widgets/datagrid/sql_schema'; -import {Anchor} from '../../widgets/anchor'; -import {formatDurationValue} from '../../components/aggregation_panel'; - -const SLICE_WITH_PARENT_SPEC = { - id: NUM, - name: STR_NULL, - ts: LONG, - dur: LONG, - parent_id: NUM_NULL, - arg_set_id: NUM_NULL, -}; - -const SLICELIKE_SPEC = { - id: NUM, - name: STR_NULL, - ts: LONG, - dur: LONG, - arg_set_id: NUM_NULL, -}; - -export class SliceSelectionAggregator implements Aggregator { - readonly id = 'slice_aggregation'; - - private readonly trace: Trace; - - constructor(trace: Trace) { - this.trace = trace; - } - - probe(area: AreaSelection): Aggregation | undefined { - // Collect tracks with SourceDatasets, sorted by schema type - const sliceTracks: Track[] = []; - const slicelikeTracks: Track[] = []; - - for (const track of area.tracks) { - const dataset = track.renderer.getDataset?.(); - if (!dataset || !(dataset instanceof SourceDataset)) continue; - - if (dataset.implements(SLICE_WITH_PARENT_SPEC)) { - sliceTracks.push(track); - } else if (dataset.implements(SLICELIKE_SPEC)) { - slicelikeTracks.push(track); - } - } - - if (sliceTracks.length === 0 && slicelikeTracks.length === 0) { - return undefined; - } - - const unionQueries: string[] = []; - const trackDatasetMap = new Map(); - - const sliceDatasets: Dataset[] = []; - for (const track of sliceTracks) { - const dataset = track.renderer.getDataset?.(); - if (dataset) { - sliceDatasets.push(dataset); - trackDatasetMap.set(dataset, track); - } - } - const sliceUnionDataset = - sliceDatasets.length > 0 - ? UnionDatasetWithLineage.create(sliceDatasets) - : undefined; - - const slicelikeDatasets: Dataset[] = []; - for (const track of slicelikeTracks) { - const dataset = track.renderer.getDataset?.(); - if (dataset) { - slicelikeDatasets.push(dataset); - trackDatasetMap.set(dataset, track); - } - } - const slicelikeUnionDataset = - slicelikeDatasets.length > 0 - ? UnionDatasetWithLineage.create(slicelikeDatasets) - : undefined; - - return { - getGridConfig: () => - this.getGridConfig((groupId, partition) => - this.resolveTrack( - groupId, - partition, - trackDatasetMap, - sliceUnionDataset, - slicelikeUnionDataset, - ), - ), - prepareData: async (engine: Engine) => { - await using trash = new AsyncDisposableStack(); - - if (sliceUnionDataset) { - const query = await this.buildSliceQuery( - engine, - sliceUnionDataset, - area, - trash, - ); - unionQueries.push(query); - } - - if (slicelikeUnionDataset) { - const query = await this.buildSlicelikeQuery( - engine, - slicelikeUnionDataset, - area, - trash, - ); - // Offset group IDs to avoid collision with slice groups - const groupOffset = sliceTracks.length > 0 ? 1 : 0; - const offsetQuery = query.replace( - /__groupid/g, - `__groupid + ${groupOffset} as __groupid`, - ); - unionQueries.push(offsetQuery); - } - - await engine.query(` - CREATE OR REPLACE PERFETTO TABLE ${this.id} AS - SELECT - json_object('id', id, 'groupid', __groupid, 'partition', __partition) as id_with_lineage, - name, - dur, - self_dur, - arg_set_id - FROM (${unionQueries.join(' UNION ALL ')}) - `); - - return { - tableName: this.id, - }; - }, - }; - } - - private async buildSliceQuery( - engine: Engine, - unionDataset: UnionDatasetWithLineage, - area: AreaSelection, - trash: AsyncDisposableStack, - ): Promise { - // Query with only needed columns for II table (ts, dur, id) - const iiQuerySchema = { - ...SLICE_WITH_PARENT_SPEC, - __groupid: NUM, - __partition: UNKNOWN, - }; - const sql = unionDataset.query(iiQuerySchema); - - // Create interval-intersect table for time filtering - const iiTable = await createIITable( - engine, - new SourceDataset({src: `(${sql})`, schema: iiQuerySchema}), - area.start, - area.end, - ); - trash.use(iiTable); - - // Build child duration aggregation for self-time calculation - const childDurTable = await createPerfettoTable({ - engine, - as: ` - SELECT - parent_id AS id, - SUM(dur) AS child_dur - FROM ${iiTable.name} - WHERE parent_id IS NOT NULL - GROUP BY parent_id - `, - }); - trash.use(childDurTable); - - return ` - SELECT - id, - name, - ts, - dur, - dur - COALESCE(child_dur, 0) AS self_dur, - arg_set_id, - __groupid, - __partition - FROM ${iiTable.name} - LEFT JOIN ${childDurTable.name} USING(id) - `; - } - - private async buildSlicelikeQuery( - engine: Engine, - unionDataset: UnionDatasetWithLineage, - area: AreaSelection, - trash: AsyncDisposableStack, - ): Promise { - // Query with only needed columns for II table (ts, dur, id) - const iiQuerySchema = { - ...SLICELIKE_SPEC, - __groupid: NUM, - __partition: UNKNOWN, - }; - const sql = unionDataset.query(iiQuerySchema); - - // Create interval-intersect table for time filtering - const iiTable = await createIITable( - engine, - new SourceDataset({src: `(${sql})`, schema: iiQuerySchema}), - area.start, - area.end, - ); - trash.use(iiTable); - - return ` - SELECT - id, - name, - ts, - dur, - dur AS self_dur, - arg_set_id, - __groupid, - __partition - FROM ${iiTable.name} - `; - } - - getTabName() { - return 'Slices'; - } - - private getGridConfig( - resolveTrack: (groupId: number, partition: SqlValue) => Track | undefined, - ): AggregatorGridConfig { - return { - schema: { - id_with_lineage: { - title: 'ID', - columnType: 'identifier', - cellRenderer: (value: unknown) => { - // Value is a JSON object {id, groupid, partition} - if (typeof value !== 'string') { - return String(value); - } - - const parsed = JSON.parse(value) as { - id: number; - groupid: number; - partition: SqlValue; - }; - const {id, groupid, partition} = parsed; - - // Resolve track from lineage - const track = resolveTrack(groupid, partition); - if (!track) { - return String(id); - } - - return m( - Anchor, - { - title: 'Go to slice', - icon: Icons.UpdateSelection, - onclick: () => { - this.trace.selection.selectTrackEvent(track.uri, id, { - scrollToSelection: true, - }); - }, - }, - String(id), - ); - }, - }, - name: { - title: 'Name', - columnType: 'text', - }, - dur: { - title: 'Wall Duration', - columnType: 'quantitative', - cellRenderer: formatDurationValue, - }, - self_dur: { - title: 'Self Duration', - columnType: 'quantitative', - cellRenderer: formatDurationValue, - }, - args: { - title: 'Args', - parameterized: true, - }, - }, - // The aggregation table has an `arg_set_id` column, so we can expose a - // parameterized `args.*` column to the datagrid. - sqlConfig: ({tableName}): SQLTableSchema => ({ - tableOrSubquery: tableName, - columns: { - args: { - expression: (alias, key) => - `extract_arg(${alias}.arg_set_id, '${key}')`, - parameterized: true, - parameterKeysQuery: (tableOrSubquery, alias) => ` - SELECT DISTINCT args.key - FROM (${tableOrSubquery}) AS ${alias} - JOIN args ON args.arg_set_id = ${alias}.arg_set_id - WHERE args.key IS NOT NULL - ORDER BY args.key - LIMIT 1000 - `, - }, - }, - }), - initialPivot: { - groupBy: [{id: 'name', field: 'name'}], - aggregates: [ - {id: 'count', function: 'COUNT'}, - {id: 'dur_sum', field: 'dur', function: 'SUM', sort: 'DESC'}, - {id: 'self_dur_sum', field: 'self_dur', function: 'SUM'}, - {id: 'dur_avg', field: 'dur', function: 'AVG'}, - ], - }, - }; - } - - /** - * Resolve a track from lineage information. - */ - private resolveTrack( - groupId: number, - partition: SqlValue, - trackDatasetMap: Map, - sliceUnionDataset?: UnionDatasetWithLineage, - slicelikeUnionDataset?: UnionDatasetWithLineage, - ): Track | undefined { - // Ensure partition is a valid SqlValue - const partitionValue = - partition === null || - typeof partition === 'number' || - typeof partition === 'bigint' || - typeof partition === 'string' || - partition instanceof Uint8Array - ? partition - : null; - - // Try slice union dataset first - if (sliceUnionDataset) { - const datasets = sliceUnionDataset.resolveLineage({ - __groupid: groupId, - __partition: partitionValue, - }); - for (const dataset of datasets) { - const track = trackDatasetMap.get(dataset); - if (track) return track; - } - } - - // Try slicelike union dataset (with group offset) - if (slicelikeUnionDataset) { - const sliceGroupCount = sliceUnionDataset ? 1 : 0; - const adjustedGroupId = groupId - sliceGroupCount; - const datasets = slicelikeUnionDataset.resolveLineage({ - __groupid: adjustedGroupId, - __partition: partitionValue, - }); - for (const dataset of datasets) { - const track = trackDatasetMap.get(dataset); - if (track) return track; - } - } - - return undefined; - } -} diff --git a/ui/src/plugins/dev.perfetto.TraceProcessorTrack/thread_slice_aggregator.ts b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/thread_slice_aggregator.ts new file mode 100644 index 00000000000..c742995835f --- /dev/null +++ b/ui/src/plugins/dev.perfetto.TraceProcessorTrack/thread_slice_aggregator.ts @@ -0,0 +1,400 @@ +// Copyright (C) 2020 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. + +import m from 'mithril'; +import {Icons} from '../../base/semantic_icons'; +import {Time} from '../../base/time'; +import { + type Aggregation, + type Aggregator, + type AggregatorGridConfig, + createAggregationData, + createIITable, +} from '../../components/aggregation_adapter'; +import {Timestamp} from '../../components/widgets/timestamp'; +import type {AreaSelection} from '../../public/selection'; +import type {Trace} from '../../public/trace'; +import type {Track} from '../../public/track'; +import {SourceDataset} from '../../trace_processor/dataset'; +import type {Engine} from '../../trace_processor/engine'; +import {LONG, NUM, STR_NULL} from '../../trace_processor/query_result'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; +import type {SQLTableSchema} from '../../components/widgets/datagrid/sql_schema'; +import type {ColumnSchema} from '../../components/widgets/datagrid/datagrid_schema'; +import {Anchor} from '../../widgets/anchor'; +import {formatDurationValue} from '../../components/aggregation_panel'; +import {getOrCreate} from '../../base/utils'; +import {MenuItem, PopupMenu} from '../../widgets/menu'; +import {SLICE_TRACK_KIND} from '../../public/track_kinds'; + +export class ThreadSliceAggregator implements Aggregator { + readonly id = 'thread_slice_aggregator'; + + private readonly trace: Trace; + + constructor(trace: Trace) { + this.trace = trace; + } + + probe(area: AreaSelection): Aggregation | undefined { + // Collect up all tracks with the slice kind and a trackIds tag, retaining a mapping from trackId -> tag + const trackIdMap = new Map(); + + // Iterate all selected tracks and index tracks by track id + for (const track of area.tracks) { + const tags = track.tags; + const kinds = tags?.kinds; + const trackIds = tags?.trackIds; + + if (kinds?.includes(SLICE_TRACK_KIND) && trackIds) { + for (const trackId of trackIds) { + const bucket = getOrCreate(trackIdMap, trackId, () => []); + bucket.push(track); + } + } + } + + // No matching tracks - return undefined to hide this aggregation + if (trackIdMap.size === 0) { + return undefined; + } + + return { + getGridConfig: () => this.getGridConfig(trackIdMap), + prepareData: async (engine: Engine) => { + await using iiTable = await this.buildSliceQuery( + engine, + Array.from(trackIdMap.keys()), + area, + ); + + const table = await createPerfettoTable({ + engine, + as: ` + SELECT + json_object('id', id, 'trackId', track_id) as id_with_lineage, + name, + ts, + dur, + self_dur, + depth, + parent_id, + arg_set_id, + track_id, + utid, + upid + FROM (${iiTable.name}) + `, + }); + + return createAggregationData(table); + }, + }; + } + + private async buildSliceQuery( + engine: Engine, + trackIds: readonly number[], + area: AreaSelection, + ) { + // Create interval-intersect table for time filtering + await using iiTable = await createIITable( + engine, + new SourceDataset({ + src: ` + SELECT * + FROM slice + WHERE track_id IN (${trackIds.join()}) + `, + schema: { + id: NUM, + ts: LONG, + dur: LONG, + parent_id: NUM, + arg_set_id: NUM, + name: STR_NULL, + track_id: NUM, + depth: NUM, + }, + }), + area.start, + area.end, + ); + + // Build child duration aggregation for self-time calculation + await using childDurTable = await createPerfettoTable({ + engine, + as: ` + SELECT + parent_id AS id, + SUM(dur) AS child_dur + FROM ${iiTable.name} + WHERE parent_id IS NOT NULL + GROUP BY parent_id + `, + }); + + // Create a coalesced table containing + return await createPerfettoTable({ + engine, + as: ` + SELECT + slice.id AS id, + slice.name as name, + ts, + dur, + dur - COALESCE(child_dur, 0) AS self_dur, + slice.depth AS depth, + slice.parent_id AS parent_id, + slice.arg_set_id AS arg_set_id, + track_id, + thread_track.utid AS utid, + COALESCE(thread.upid, process_track.upid) AS upid + FROM ${iiTable.name} AS slice + LEFT JOIN ${childDurTable.name} USING (id) + LEFT JOIN thread_track ON (slice.track_id = thread_track.id) + LEFT JOIN thread USING (utid) + LEFT JOIN process_track ON (slice.track_id = process_track.id) + `, + }); + } + + getTabName() { + return 'Slices'; + } + + private getGridConfig( + trackIdMap: Map, + ): AggregatorGridConfig { + const schema: ColumnSchema = { + id_with_lineage: { + title: 'ID', + columnType: 'identifier', + cellRenderer: (value: unknown) => { + // Value is a JSON object {id, trackId} + if (typeof value !== 'string') { + return String(value); + } + + const parsed = JSON.parse(value) as { + id: number; + trackId: number; + }; + const {id, trackId} = parsed; + + // Resolve track from lineage + const tracks = trackIdMap.get(trackId); + if (!tracks) { + return String(id); + } + + if (tracks.length !== 1) { + return m( + PopupMenu, + { + trigger: m( + Anchor, + { + title: 'Go to slice', + icon: Icons.UpdateSelection, + }, + String(id), + ), + }, + tracks.map((t) => + m(MenuItem, { + label: t.uri, + onclick: () => { + this.trace.selection.selectTrackEvent(t.uri, id, { + scrollToSelection: true, + switchToCurrentSelectionTab: false, + }); + }, + }), + ), + ); + } else { + const track = tracks[0]; + return m( + Anchor, + { + title: 'Go to slice', + icon: Icons.UpdateSelection, + onclick: () => { + this.trace.selection.selectTrackEvent(track.uri, id, { + scrollToSelection: true, + switchToCurrentSelectionTab: false, + }); + }, + }, + String(id), + ); + } + }, + }, + name: { + title: 'Name', + columnType: 'text', + }, + ts: { + title: 'Timestamp', + columnType: 'quantitative', + cellRenderer: (value: unknown) => { + if (typeof value === 'bigint') { + return m(Timestamp, {trace: this.trace, ts: Time.fromRaw(value)}); + } + return String(value ?? ''); + }, + }, + dur: { + title: 'Wall Duration', + columnType: 'quantitative', + cellRenderer: formatDurationValue, + }, + self_dur: { + title: 'Self Duration', + columnType: 'quantitative', + cellRenderer: formatDurationValue, + }, + depth: { + title: 'Depth', + columnType: 'quantitative', + }, + category: { + title: 'Category', + columnType: 'text', + }, + parent_id: { + title: 'Parent ID', + columnType: 'identifier', + }, + args: { + title: 'Args', + parameterized: true, + }, + thread: { + title: 'Thread', + schema: { + id: { + title: 'UTID', + columnType: 'identifier', + }, + name: { + title: 'Name', + columnType: 'text', + }, + tid: { + title: 'TID', + columnType: 'identifier', + }, + upid: { + title: 'UPID', + columnType: 'identifier', + }, + is_main_thread: { + title: 'Is Main Thread', + columnType: 'text', + }, + }, + }, + process: { + title: 'Process', + schema: { + id: { + title: 'UPID', + columnType: 'identifier', + }, + name: { + title: 'Name', + columnType: 'text', + }, + pid: { + title: 'PID', + columnType: 'identifier', + }, + cmdline: { + title: 'Cmdline', + columnType: 'text', + }, + }, + }, + }; + + return { + schema, + // The aggregation table has an `arg_set_id` column, so we can expose a + // parameterized `args.*` column to the datagrid. + sqlConfig: ({sqlTable}): SQLTableSchema => ({ + tableOrSubquery: sqlTable.get().name, + columns: { + thread: { + foreignKey: 'utid', + schema: { + tableOrSubquery: 'thread', + columns: { + id: {}, + name: {}, + tid: {}, + upid: {}, + is_main_thread: {}, + }, + }, + }, + process: { + foreignKey: 'upid', + schema: { + tableOrSubquery: 'process', + columns: { + id: {}, + name: {}, + pid: {}, + cmdline: {}, + }, + }, + }, + args: { + expression: (alias, key) => + `extract_arg(${alias}.arg_set_id, '${key}')`, + parameterized: true, + parameterKeysQuery: (tableOrSubquery, alias) => ` + SELECT DISTINCT args.key + FROM (${tableOrSubquery}) AS ${alias} + JOIN args ON args.arg_set_id = ${alias}.arg_set_id + WHERE args.key IS NOT NULL + ORDER BY args.key + LIMIT 1000 + `, + }, + }, + }), + initialColumns: [ + {id: 'id_with_lineage', field: 'id_with_lineage'}, + {id: 'ts', field: 'ts'}, + {id: 'dur', field: 'dur'}, + {id: 'name', field: 'name'}, + {id: 'self_dur', field: 'self_dur'}, + {id: 'arg_set_id', field: 'arg_set_id'}, + ], + initialPivot: { + groupBy: [{id: 'name', field: 'name'}], + aggregates: [ + {id: 'count', function: 'COUNT'}, + {id: 'dur_sum', field: 'dur', function: 'SUM', sort: 'DESC'}, + {id: 'self_dur_sum', field: 'self_dur', function: 'SUM'}, + {id: 'dur_avg', field: 'dur', function: 'AVG'}, + ], + }, + }; + } +} diff --git a/ui/src/plugins/org.kernel.Wattson/estimate_aggregator.ts b/ui/src/plugins/org.kernel.Wattson/estimate_aggregator.ts index 7a093bbd6c2..e92e8b6944e 100644 --- a/ui/src/plugins/org.kernel.Wattson/estimate_aggregator.ts +++ b/ui/src/plugins/org.kernel.Wattson/estimate_aggregator.ts @@ -14,13 +14,15 @@ import m from 'mithril'; import {exists} from '../../base/utils'; -import type { - Aggregator, - AggregatorGridConfig, +import { + type Aggregator, + type AggregatorGridConfig, + createAggregationData, } from '../../components/aggregation_adapter'; import type {Area, AreaSelection} from '../../public/selection'; import type {Engine} from '../../trace_processor/engine'; import type {SqlValue} from '../../trace_processor/query_result'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; import {RadioGroup} from '../../widgets/radio_group'; import { CPUSS_ESTIMATE_TRACK_KIND, @@ -49,13 +51,12 @@ export class WattsonEstimateSelectionAggregator implements Aggregator { return { getGridConfig: () => this.getGridConfig(), prepareData: async (engine: Engine) => { - await engine.query(`drop view if exists ${this.id};`); - const query = this.getEstimateTracksQuery(area, estimateTracks); - await engine.query(query); - - return { - tableName: this.id, - }; + await engine.query(`INCLUDE PERFETTO MODULE wattson.estimates`); + const table = await createPerfettoTable({ + engine, + as: this.getEstimateTracksQuery(area, estimateTracks), + }); + return createAggregationData(table); }, }; } @@ -66,9 +67,6 @@ export class WattsonEstimateSelectionAggregator implements Aggregator { ): string { const duration = area.end - area.start; let query = ` - INCLUDE PERFETTO MODULE wattson.estimates; - - CREATE PERFETTO VIEW ${this.id} AS WITH window_stats AS ( SELECT * FROM _wattson_base_components_avg_mw!( (SELECT ${area.start} AS ts, ${duration} AS dur, 0 AS period_id) @@ -90,8 +88,6 @@ export class WattsonEstimateSelectionAggregator implements Aggregator { FROM window_stats `; }); - query += `;`; - return query; } diff --git a/ui/src/plugins/org.kernel.Wattson/package_aggregator.ts b/ui/src/plugins/org.kernel.Wattson/package_aggregator.ts index 0329faecbb9..9325dafdf7c 100644 --- a/ui/src/plugins/org.kernel.Wattson/package_aggregator.ts +++ b/ui/src/plugins/org.kernel.Wattson/package_aggregator.ts @@ -14,15 +14,17 @@ import m from 'mithril'; import {exists} from '../../base/utils'; -import type { - Aggregation, - Aggregator, - AggregatorGridConfig, +import { + type Aggregation, + type Aggregator, + type AggregatorGridConfig, + createAggregationData, } from '../../components/aggregation_adapter'; import type {AreaSelection} from '../../public/selection'; import {CPU_SLICE_TRACK_KIND} from '../../public/track_kinds'; import type {Engine} from '../../trace_processor/engine'; import type {SqlValue} from '../../trace_processor/query_result'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; import {RadioGroup} from '../../widgets/radio_group'; import {formatPercentValue} from '../../components/aggregation_panel'; @@ -38,14 +40,16 @@ abstract class WattsonBasePackageSelectionAggregator implements Aggregator { return { getGridConfig: () => this.getGridConfig(), prepareData: async (engine: Engine) => { - await engine.query(`drop view if exists ${this.id};`); const duration = area.end - area.start; - - await engine.query(this.getQuery(area, duration, probeResult)); - - return { - tableName: this.id, - }; + const preamble = this.getPreamble(area, duration, probeResult); + if (preamble !== undefined) { + await engine.query(preamble); + } + const table = await createPerfettoTable({ + engine, + as: this.getDataQuery(area, duration, probeResult), + }); + return createAggregationData(table); }, }; } @@ -53,8 +57,16 @@ abstract class WattsonBasePackageSelectionAggregator implements Aggregator { // Derived classes implement this to check if they should trigger protected abstract doProbe(area: AreaSelection): unknown; - // Derived classes implement this to provide the specific SQL query - protected abstract getQuery( + protected getPreamble( + _area: AreaSelection, + _duration: bigint, + _probeResult: unknown, + ): string | undefined { + return undefined; + } + + // Derived classes implement this to provide the final SQL query. + protected abstract getDataQuery( area: AreaSelection, duration: bigint, probeResult: unknown, @@ -160,7 +172,7 @@ export class WattsonCpuPackageSelectionAggregator extends WattsonBasePackageSele return selectedCpus.length > 0 ? {selectedCpus} : undefined; } - protected getQuery( + protected getDataQuery( _area: AreaSelection, _duration: bigint, _probeResult: unknown, @@ -169,7 +181,6 @@ export class WattsonCpuPackageSelectionAggregator extends WattsonBasePackageSele // but assuming it runs for now as per original code. return ` -- Grouped by UID and made CPU agnostic - CREATE PERFETTO VIEW ${this.id} AS WITH base AS ( SELECT ROUND(SUM(estimated_mw), 3) AS active_mw, @@ -203,7 +214,7 @@ export class WattsonGpuPackageSelectionAggregator extends WattsonBasePackageSele return hasGpuWorkPeriodTrack ? true : undefined; } - protected getQuery( + protected getPreamble( area: AreaSelection, duration: bigint, _probeResult: unknown, @@ -224,9 +235,16 @@ export class WattsonGpuPackageSelectionAggregator extends WattsonBasePackageSele wattson_plugin_gpu_ui_selection_window, _gpu_estimates_w_tasks_attribution ); + `; + } + protected getDataQuery( + _area: AreaSelection, + duration: bigint, + _probeResult: unknown, + ): string { + return ` -- Grouped by UID specifically for GPU data - CREATE PERFETTO VIEW ${this.id} AS WITH base AS ( SELECT ROUND(SUM(estimated_mw * dur) / ${duration}, 3) as active_mw, diff --git a/ui/src/plugins/org.kernel.Wattson/process_aggregator.ts b/ui/src/plugins/org.kernel.Wattson/process_aggregator.ts index 1076b3f3c3a..ce7e75efa64 100644 --- a/ui/src/plugins/org.kernel.Wattson/process_aggregator.ts +++ b/ui/src/plugins/org.kernel.Wattson/process_aggregator.ts @@ -14,14 +14,16 @@ import m from 'mithril'; import {exists} from '../../base/utils'; -import type { - Aggregator, - AggregatorGridConfig, +import { + type Aggregator, + type AggregatorGridConfig, + createAggregationData, } from '../../components/aggregation_adapter'; import type {AreaSelection} from '../../public/selection'; import {CPU_SLICE_TRACK_KIND} from '../../public/track_kinds'; import type {Engine} from '../../trace_processor/engine'; import type {SqlValue} from '../../trace_processor/query_result'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; import {RadioGroup} from '../../widgets/radio_group'; import {formatPercentValue} from '../../components/aggregation_panel'; @@ -41,33 +43,31 @@ export class WattsonProcessSelectionAggregator implements Aggregator { return { getGridConfig: () => this.getGridConfig(), prepareData: async (engine: Engine) => { - await engine.query(`drop view if exists ${this.id};`); - // Prerequisite tables are already generated by Wattson thread aggregation, - // which is run prior to execution of this module - await engine.query(` - CREATE PERFETTO VIEW ${this.id} AS - WITH base AS ( + // which is run prior to execution of this module. + const table = await createPerfettoTable({ + engine, + as: ` + WITH base AS ( + SELECT + ROUND(SUM(estimated_mw), 3) as active_mw, + ROUND(SUM(estimated_mws), 3) as active_mws, + ROUND(SUM(idle_transitions_mws), 3) as idle_cost_mws, + ROUND(SUM(total_mws), 3) as total_mws, + pid, + process_name, + upid + FROM wattson_plugin_thread_summary + GROUP BY upid + ) SELECT - ROUND(SUM(estimated_mw), 3) as active_mw, - ROUND(SUM(estimated_mws), 3) as active_mws, - ROUND(SUM(idle_transitions_mws), 3) as idle_cost_mws, - ROUND(SUM(total_mws), 3) as total_mws, - pid, - process_name, - upid - FROM wattson_plugin_thread_summary - GROUP BY upid - ) - SELECT - *, - total_mws / (SUM(total_mws) OVER()) AS percent_of_total_energy - FROM base; - `); + *, + total_mws / (SUM(total_mws) OVER()) AS percent_of_total_energy + FROM base + `, + }); - return { - tableName: this.id, - }; + return createAggregationData(table); }, }; } diff --git a/ui/src/plugins/org.kernel.Wattson/thread_aggregator.ts b/ui/src/plugins/org.kernel.Wattson/thread_aggregator.ts index 4d09496e0be..e10f3cdcd42 100644 --- a/ui/src/plugins/org.kernel.Wattson/thread_aggregator.ts +++ b/ui/src/plugins/org.kernel.Wattson/thread_aggregator.ts @@ -15,10 +15,11 @@ import m from 'mithril'; import {exists} from '../../base/utils'; import {addWattsonThreadTrack} from './wattson_thread_utils'; -import type { - Aggregation, - Aggregator, - AggregatorGridConfig, +import { + type Aggregation, + type Aggregator, + type AggregatorGridConfig, + createAggregationData, } from '../../components/aggregation_adapter'; import type {AreaSelection} from '../../public/selection'; import {Button, ButtonVariant} from '../../widgets/button'; @@ -26,6 +27,7 @@ import {CPU_SLICE_TRACK_KIND} from '../../public/track_kinds'; import type {Engine} from '../../trace_processor/engine'; import {Intent} from '../../widgets/common'; import type {SqlValue} from '../../trace_processor/query_result'; +import {createPerfettoTable} from '../../trace_processor/sql_utils'; import {RadioGroup} from '../../widgets/radio_group'; import type {Trace} from '../../public/trace'; import {WATTSON_THREAD_TRACK_KIND} from './track_kinds'; @@ -55,7 +57,6 @@ export class WattsonThreadSelectionAggregator implements Aggregator { return { getGridConfig: () => this.getGridConfig(), prepareData: async (engine: Engine) => { - await engine.query(`drop view if exists ${this.id};`); const duration = area.end - area.start; const filters = []; if (selectedCpus.length > 0) { @@ -101,29 +102,31 @@ export class WattsonThreadSelectionAggregator implements Aggregator { wattson_plugin_ui_selection_window, _wattson_ui_selected_cpus ); + `); - CREATE PERFETTO VIEW ${this.id} AS - WITH base AS ( + const table = await createPerfettoTable({ + engine, + as: ` + WITH base AS ( + SELECT + ROUND(estimated_mw, 3) as active_mw, + ROUND(estimated_mws, 3) as active_mws, + ROUND(idle_transitions_mws, 3) as idle_cost_mws, + ROUND(total_mws, 3) as total_mws, + thread_name, + utid, + tid, + pid + FROM wattson_plugin_thread_summary + ) SELECT - ROUND(estimated_mw, 3) as active_mw, - ROUND(estimated_mws, 3) as active_mws, - ROUND(idle_transitions_mws, 3) as idle_cost_mws, - ROUND(total_mws, 3) as total_mws, - thread_name, - utid, - tid, - pid - FROM wattson_plugin_thread_summary - ) - SELECT - *, - total_mws / (SUM(total_mws) OVER()) AS percent_of_total_energy - FROM base; - `); + *, + total_mws / (SUM(total_mws) OVER()) AS percent_of_total_energy + FROM base + `, + }); - return { - tableName: this.id, - }; + return createAggregationData(table); }, }; } diff --git a/ui/src/public/plugin.ts b/ui/src/public/plugin.ts index ad758e9a0f7..d9ec693ae0a 100644 --- a/ui/src/public/plugin.ts +++ b/ui/src/public/plugin.ts @@ -21,8 +21,10 @@ import type {RouteArgs} from './route_schema'; * * - 'experimental': The plugin is in development and may contain unstable or * incomplete features. Users will see a warning when enabling such plugins. + * - 'preview': The plugin is in preview and may contain unstable or + * incomplete features. Users will see a warning when enabling such plugins. */ -export type PluginStatus = 'experimental'; +export type PluginStatus = 'experimental' | 'preview'; /** * This interface defines the shape of the plugins's class constructor (i.e. the @@ -38,8 +40,8 @@ export interface PerfettoPluginStatic { readonly description?: string; /** * Optional status flag indicating the maturity of this plugin. - * When set to 'experimental', users will see a warning that enabling - * this plugin may expose experimental or unstable features. + * When set to 'experimental' or 'preview', users will see a warning that + * enabling this plugin may expose experimental or preview features. * Defaults to stable (no warning) when not specified. */ readonly status?: PluginStatus; diff --git a/ui/src/public/selection.ts b/ui/src/public/selection.ts index f3485d83f83..301c319750a 100644 --- a/ui/src/public/selection.ts +++ b/ui/src/public/selection.ts @@ -35,7 +35,7 @@ export interface ContentWithLoadingFlag { readonly buttons?: m.Children; } -export interface AreaSelectionTab { +export interface SelectionTab { // Unique id for this tab. readonly id: string; @@ -54,13 +54,16 @@ export interface AreaSelectionTab { * has nothing relevant to show. * * The |isLoading| flag is used to avoid flickering. If set to true, we keep - * hold of the the previous vnodes, rendering them instead, for up to 50ms + * hold of the previous vnodes, rendering them instead, for up to 50ms * before switching to the new content. This avoids very fast load times * from causing flickering loading screens, which can be somewhat jarring. */ - render(selection: AreaSelection): ContentWithLoadingFlag | undefined; + render(selection: T): ContentWithLoadingFlag | undefined; } +export type AreaSelectionTab = SelectionTab; +export type TrackEventSelectionTab = SelectionTab; + /** * Compare two area selections for equality. Returns true if the selections are * equivalent, false otherwise. @@ -78,9 +81,9 @@ export interface SelectionManager { readonly selection: Selection; /** - * Provides a list of registered area selection tabs. + * Provides a list of registered selection tabs. */ - readonly areaSelectionTabs: ReadonlyArray; + readonly selectionTabs: ReadonlyArray; /** * Clears the current selection, selects nothing. @@ -98,7 +101,7 @@ export interface SelectionManager { trackUri: string, eventId: number, opts?: SelectionOpts, - ): void; + ): Promise; /** * Select a track. @@ -154,10 +157,20 @@ export interface SelectionManager { */ getTimeSpanOfSelection(): TimeSpan | undefined; + /** + * Register a new tab under the selection details panel. + */ + registerSelectionTab(tab: SelectionTab): void; + /** * Register a new tab under the area selection details panel. */ registerAreaSelectionTab(tab: AreaSelectionTab): void; + + /** + * Register a new tab under the track event selection details panel. + */ + registerTrackEventSelectionTab(tab: TrackEventSelectionTab): void; } export type Selection = diff --git a/ui/src/public/sidebar.ts b/ui/src/public/sidebar.ts index a7d8d928b60..43b53c82b4a 100644 --- a/ui/src/public/sidebar.ts +++ b/ui/src/public/sidebar.ts @@ -70,6 +70,7 @@ export type SidebarMenuItem = { readonly icon?: string | (() => string); readonly tooltip?: string | (() => string); readonly cssClass?: string | (() => string); // Without trailing '.'. + readonly badge?: string | (() => string); // If false or omitted the item works normally. // If true the item is striken through and the action/href will be a no-op. diff --git a/ui/src/public/track.ts b/ui/src/public/track.ts index 7273fa9e777..619de3b720a 100644 --- a/ui/src/public/track.ts +++ b/ui/src/public/track.ts @@ -256,6 +256,7 @@ export interface TrackRenderer { getTrackShellButtons?(): m.Children; onMouseMove?(event: TrackMouseEvent): void; onMouseClick?(event: TrackMouseEvent): boolean; + onMouseDoubleClick?(event: TrackMouseEvent): boolean; onMouseOut?(): void; /** diff --git a/ui/src/test/aggregation.test.ts b/ui/src/test/aggregation.test.ts index f1b773d42dd..0d5f0e7aa65 100644 --- a/ui/src/test/aggregation.test.ts +++ b/ui/src/test/aggregation.test.ts @@ -40,7 +40,7 @@ test('sched', async () => { locator: drawerPanel, }); - await page.click('button[label="CPU by process"]'); + await page.click('button[label="By Process"]'); await pth.waitForIdleAndScreenshot('cpu-by-process.png', { locator: drawerPanel, }); diff --git a/ui/src/test/slice_double_click_zoom.test.ts b/ui/src/test/slice_double_click_zoom.test.ts new file mode 100644 index 00000000000..5418d0c3aba --- /dev/null +++ b/ui/src/test/slice_double_click_zoom.test.ts @@ -0,0 +1,54 @@ +// Copyright (C) 2026 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. + +import {expect, test, type Page} from '@playwright/test'; +import {PerfettoTestHelper} from './perfetto_ui_test_helper'; + +let pth: PerfettoTestHelper; +let page: Page; + +const traceName = 'slice_double_click_zoom.pb'; + +test.beforeAll(async ({browser}) => { + page = await browser.newPage(); + pth = new PerfettoTestHelper(page); + await pth.openTraceFile(traceName); +}); + +test('double-clicking a slice zooms into it', async () => { + const track = pth.locateTrack('Global Track Events/Slices'); + const canvas = track.locator('.pf-track__canvas'); + const box = await canvas.boundingBox(); + if (box === null) throw new Error('Track canvas bounding box is null'); + await canvas.dblclick({position: {x: box.width / 2, y: box.height / 2}}); + await pth.waitForPerfettoIdle(); + + const visibleWindow = await page.evaluate(() => { + const {start, end, duration} = self.app.trace!.timeline.visibleWindow; + return { + start: start.toNumber(), + end: end.toNumber(), + duration, + }; + }); + expect(visibleWindow).toEqual({ + start: 4_937_500_000, + end: 5_062_500_000, + duration: 125_000_000, + }); + + await pth.waitForIdleAndScreenshot('slice_double_click_zoom.png', { + locator: page.locator('.pf-timeline-page__timeline'), + }); +}); diff --git a/ui/src/widgets/track_shell.ts b/ui/src/widgets/track_shell.ts index f9a5d079c91..4a360423c0a 100644 --- a/ui/src/widgets/track_shell.ts +++ b/ui/src/widgets/track_shell.ts @@ -115,6 +115,7 @@ export interface TrackShellAttrs extends HTMLAttrs { onTrackContentMouseMove?(pos: Point2D, contentSize: Bounds2D): void; onTrackContentMouseOut?(): void; onTrackContentClick?(pos: Point2D, contentSize: Bounds2D): boolean; + onTrackContentDoubleClick?(pos: Point2D, contentSize: Bounds2D): boolean; // If reorderable, these functions will be called when track shells are // dragged and dropped. @@ -367,6 +368,7 @@ export class TrackShell implements m.ClassComponent { onTrackContentMouseMove, onTrackContentMouseOut, onTrackContentClick, + onTrackContentDoubleClick, error, } = attrs; @@ -415,6 +417,16 @@ export class TrackShell implements m.ClassComponent { e.stopPropagation(); } }, + ondblclick: (e: MouseEvent) => { + if ( + onTrackContentDoubleClick?.( + currentTargetOffset(e), + getTargetContainerSize(e), + ) + ) { + e.stopPropagation(); + } + }, }, attrs.subtitle && showSubtitleInContent(attrs) &&