Merge changes Ie2704965,Id77b15b7,I0b68e779 into main
* changes:
Rename interned_str_params to str_param_iids
Process stackstrace in ProtoLog trace processor
Update ProtoLog protos to support stacktrace collection
diff --git a/Android.bp b/Android.bp
index 55e3c23..4165586 100644
--- a/Android.bp
+++ b/Android.bp
@@ -2324,6 +2324,7 @@
":perfetto_src_trace_processor_containers_containers",
":perfetto_src_trace_processor_db_column_column",
":perfetto_src_trace_processor_db_db",
+ ":perfetto_src_trace_processor_db_minimal",
":perfetto_src_trace_processor_export_json",
":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
":perfetto_src_trace_processor_importers_common_common",
@@ -10978,10 +10979,17 @@
filegroup {
name: "perfetto_src_trace_processor_db_db",
srcs: [
+ "src/trace_processor/db/runtime_table.cc",
+ ],
+}
+
+// GN: //src/trace_processor/db:minimal
+filegroup {
+ name: "perfetto_src_trace_processor_db_minimal",
+ srcs: [
"src/trace_processor/db/column.cc",
"src/trace_processor/db/column_storage.cc",
"src/trace_processor/db/query_executor.cc",
- "src/trace_processor/db/runtime_table.cc",
"src/trace_processor/db/table.cc",
],
}
@@ -11071,7 +11079,6 @@
"src/trace_processor/importers/common/process_tracker.cc",
"src/trace_processor/importers/common/slice_tracker.cc",
"src/trace_processor/importers/common/slice_translation_table.cc",
- "src/trace_processor/importers/common/stack_profile_tracker.cc",
"src/trace_processor/importers/common/system_info_tracker.cc",
"src/trace_processor/importers/common/trace_parser.cc",
"src/trace_processor/importers/common/track_tracker.cc",
@@ -11391,6 +11398,7 @@
"src/trace_processor/importers/proto/chrome_system_probes_module.cc",
"src/trace_processor/importers/proto/chrome_system_probes_parser.cc",
"src/trace_processor/importers/proto/default_modules.cc",
+ "src/trace_processor/importers/proto/heap_profile_tracker.cc",
"src/trace_processor/importers/proto/memory_tracker_snapshot_module.cc",
"src/trace_processor/importers/proto/memory_tracker_snapshot_parser.cc",
"src/trace_processor/importers/proto/metadata_minimal_module.cc",
@@ -11399,12 +11407,12 @@
"src/trace_processor/importers/proto/packet_sequence_state_generation.cc",
"src/trace_processor/importers/proto/perf_sample_tracker.cc",
"src/trace_processor/importers/proto/profile_module.cc",
- "src/trace_processor/importers/proto/profile_packet_sequence_state.cc",
"src/trace_processor/importers/proto/profile_packet_utils.cc",
+ "src/trace_processor/importers/proto/profiler_util.cc",
"src/trace_processor/importers/proto/proto_trace_parser.cc",
"src/trace_processor/importers/proto/proto_trace_reader.cc",
"src/trace_processor/importers/proto/proto_trace_tokenizer.cc",
- "src/trace_processor/importers/proto/stack_profile_sequence_state.cc",
+ "src/trace_processor/importers/proto/stack_profile_tracker.cc",
"src/trace_processor/importers/proto/track_event_module.cc",
"src/trace_processor/importers/proto/track_event_parser.cc",
"src/trace_processor/importers/proto/track_event_tokenizer.cc",
@@ -11431,9 +11439,9 @@
srcs: [
"src/trace_processor/importers/proto/active_chrome_processes_tracker_unittest.cc",
"src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc",
+ "src/trace_processor/importers/proto/heap_profile_tracker_unittest.cc",
"src/trace_processor/importers/proto/network_trace_module_unittest.cc",
"src/trace_processor/importers/proto/perf_sample_tracker_unittest.cc",
- "src/trace_processor/importers/proto/profile_packet_sequence_state_unittest.cc",
"src/trace_processor/importers/proto/proto_trace_parser_unittest.cc",
"src/trace_processor/importers/proto/string_encoding_utils_unittests.cc",
],
@@ -11968,6 +11976,7 @@
"src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql",
"src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql",
"src/trace_processor/perfetto_sql/stdlib/android/network_packets.sql",
+ "src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql",
"src/trace_processor/perfetto_sql/stdlib/android/process_metadata.sql",
"src/trace_processor/perfetto_sql/stdlib/android/screenshots.sql",
"src/trace_processor/perfetto_sql/stdlib/android/services.sql",
@@ -11990,17 +11999,28 @@
"src/trace_processor/perfetto_sql/stdlib/common/thread_states.sql",
"src/trace_processor/perfetto_sql/stdlib/common/timestamps.sql",
"src/trace_processor/perfetto_sql/stdlib/counters/intervals.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/args.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/counters.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/cpus.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/metadata.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/percentiles.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/thread_states.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/timestamps.sql",
"src/trace_processor/perfetto_sql/stdlib/graphs/dominator_tree.sql",
"src/trace_processor/perfetto_sql/stdlib/graphs/search.sql",
"src/trace_processor/perfetto_sql/stdlib/intervals/overlap.sql",
"src/trace_processor/perfetto_sql/stdlib/linux/cpu_idle.sql",
"src/trace_processor/perfetto_sql/stdlib/pkvm/hypervisor.sql",
"src/trace_processor/perfetto_sql/stdlib/prelude/slices.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql",
"src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql",
"src/trace_processor/perfetto_sql/stdlib/sched/thread_level_parallelism.sql",
"src/trace_processor/perfetto_sql/stdlib/sched/thread_state_flattened.sql",
"src/trace_processor/perfetto_sql/stdlib/slices/flat_slices.sql",
"src/trace_processor/perfetto_sql/stdlib/slices/slices.sql",
+ "src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql",
+ "src/trace_processor/perfetto_sql/stdlib/time/conversion.sql",
],
cmd: "$(location tools/gen_amalgamated_sql.py) --namespace=stdlib --cpp-out=$(out) $(in)",
out: [
@@ -12351,7 +12371,6 @@
filegroup {
name: "perfetto_src_trace_processor_util_stack_traces_util",
srcs: [
- "src/trace_processor/util/profiler_util.cc",
"src/trace_processor/util/stack_traces_util.cc",
],
}
@@ -13779,6 +13798,7 @@
":perfetto_src_trace_processor_db_column_unittests",
":perfetto_src_trace_processor_db_compare",
":perfetto_src_trace_processor_db_db",
+ ":perfetto_src_trace_processor_db_minimal",
":perfetto_src_trace_processor_db_unittests",
":perfetto_src_trace_processor_export_json",
":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
@@ -14495,6 +14515,7 @@
":perfetto_src_trace_processor_containers_containers",
":perfetto_src_trace_processor_db_column_column",
":perfetto_src_trace_processor_db_db",
+ ":perfetto_src_trace_processor_db_minimal",
":perfetto_src_trace_processor_export_json",
":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
":perfetto_src_trace_processor_importers_common_common",
@@ -14729,6 +14750,7 @@
":perfetto_src_trace_processor_containers_containers",
":perfetto_src_trace_processor_db_column_column",
":perfetto_src_trace_processor_db_db",
+ ":perfetto_src_trace_processor_db_minimal",
":perfetto_src_trace_processor_export_json",
":perfetto_src_trace_processor_importers_android_bugreport_android_bugreport",
":perfetto_src_trace_processor_importers_common_common",
diff --git a/BUILD b/BUILD
index f7f2aa6..e6649d9 100644
--- a/BUILD
+++ b/BUILD
@@ -218,6 +218,7 @@
":src_protozero_proto_ring_buffer",
":src_trace_processor_db_column_column",
":src_trace_processor_db_db",
+ ":src_trace_processor_db_minimal",
":src_trace_processor_export_json",
":src_trace_processor_importers_android_bugreport_android_bugreport",
":src_trace_processor_importers_common_common",
@@ -774,6 +775,45 @@
],
)
+# GN target: //include/perfetto/public/abi:public
+perfetto_filegroup(
+ name = "include_perfetto_public_abi_public",
+ srcs = [
+ "include/perfetto/public/abi/backend_type.h",
+ "include/perfetto/public/abi/data_source_abi.h",
+ "include/perfetto/public/abi/heap_buffer.h",
+ "include/perfetto/public/abi/pb_decoder_abi.h",
+ "include/perfetto/public/abi/producer_abi.h",
+ "include/perfetto/public/abi/stream_writer_abi.h",
+ "include/perfetto/public/abi/thread_utils_abi.h",
+ "include/perfetto/public/abi/tracing_session_abi.h",
+ "include/perfetto/public/abi/track_event_abi.h",
+ "include/perfetto/public/abi/track_event_hl_abi.h",
+ "include/perfetto/public/abi/track_event_ll_abi.h",
+ ],
+)
+
+# GN target: //include/perfetto/public/protos:protos
+perfetto_filegroup(
+ name = "include_perfetto_public_protos_protos",
+ srcs = [
+ "include/perfetto/public/protos/common/builtin_clock.pzc.h",
+ "include/perfetto/public/protos/common/data_source_descriptor.pzc.h",
+ "include/perfetto/public/protos/config/data_source_config.pzc.h",
+ "include/perfetto/public/protos/config/trace_config.pzc.h",
+ "include/perfetto/public/protos/config/track_event/track_event_config.pzc.h",
+ "include/perfetto/public/protos/trace/interned_data/interned_data.pzc.h",
+ "include/perfetto/public/protos/trace/test_event.pzc.h",
+ "include/perfetto/public/protos/trace/trace.pzc.h",
+ "include/perfetto/public/protos/trace/trace_packet.pzc.h",
+ "include/perfetto/public/protos/trace/track_event/counter_descriptor.pzc.h",
+ "include/perfetto/public/protos/trace/track_event/debug_annotation.pzc.h",
+ "include/perfetto/public/protos/trace/track_event/track_descriptor.pzc.h",
+ "include/perfetto/public/protos/trace/track_event/track_event.pzc.h",
+ "include/perfetto/public/protos/trace/trigger.pzc.h",
+ ],
+)
+
# GN target: //include/perfetto/public:base
perfetto_filegroup(
name = "include_perfetto_public_base",
@@ -790,6 +830,25 @@
],
)
+# GN target: //include/perfetto/public:public
+perfetto_filegroup(
+ name = "include_perfetto_public_public",
+ srcs = [
+ "include/perfetto/public/data_source.h",
+ "include/perfetto/public/fnv1a.h",
+ "include/perfetto/public/pb_decoder.h",
+ "include/perfetto/public/pb_macros.h",
+ "include/perfetto/public/pb_msg.h",
+ "include/perfetto/public/pb_packed.h",
+ "include/perfetto/public/producer.h",
+ "include/perfetto/public/stream_writer.h",
+ "include/perfetto/public/te_category_macros.h",
+ "include/perfetto/public/te_macros.h",
+ "include/perfetto/public/thread_utils.h",
+ "include/perfetto/public/track_event.h",
+ ],
+)
+
# GN target: //include/perfetto/trace_processor:basic_types
perfetto_filegroup(
name = "include_perfetto_trace_processor_basic_types",
@@ -1254,6 +1313,32 @@
],
)
+# GN target: //src/shared_lib:intern_map
+perfetto_filegroup(
+ name = "src_shared_lib_intern_map",
+ srcs = [
+ "src/shared_lib/intern_map.cc",
+ "src/shared_lib/intern_map.h",
+ ],
+)
+
+# GN target: //src/shared_lib:shared_lib
+perfetto_filegroup(
+ name = "src_shared_lib_shared_lib",
+ srcs = [
+ "src/shared_lib/data_source.cc",
+ "src/shared_lib/heap_buffer.cc",
+ "src/shared_lib/pb_decoder.cc",
+ "src/shared_lib/producer.cc",
+ "src/shared_lib/reset_for_testing.h",
+ "src/shared_lib/stream_writer.cc",
+ "src/shared_lib/stream_writer.h",
+ "src/shared_lib/thread_utils.cc",
+ "src/shared_lib/tracing_session.cc",
+ "src/shared_lib/track_event.cc",
+ ],
+)
+
# GN target: //src/trace_processor/containers:containers
perfetto_cc_library(
name = "src_trace_processor_containers_containers",
@@ -1320,6 +1405,15 @@
perfetto_filegroup(
name = "src_trace_processor_db_db",
srcs = [
+ "src/trace_processor/db/runtime_table.cc",
+ "src/trace_processor/db/runtime_table.h",
+ ],
+)
+
+# GN target: //src/trace_processor/db:minimal
+perfetto_filegroup(
+ name = "src_trace_processor_db_minimal",
+ srcs = [
"src/trace_processor/db/base_id.h",
"src/trace_processor/db/column.cc",
"src/trace_processor/db/column.h",
@@ -1329,8 +1423,6 @@
"src/trace_processor/db/compare.h",
"src/trace_processor/db/query_executor.cc",
"src/trace_processor/db/query_executor.h",
- "src/trace_processor/db/runtime_table.cc",
- "src/trace_processor/db/runtime_table.h",
"src/trace_processor/db/table.cc",
"src/trace_processor/db/table.h",
"src/trace_processor/db/typed_column.h",
@@ -1381,8 +1473,6 @@
"src/trace_processor/importers/common/slice_tracker.h",
"src/trace_processor/importers/common/slice_translation_table.cc",
"src/trace_processor/importers/common/slice_translation_table.h",
- "src/trace_processor/importers/common/stack_profile_tracker.cc",
- "src/trace_processor/importers/common/stack_profile_tracker.h",
"src/trace_processor/importers/common/system_info_tracker.cc",
"src/trace_processor/importers/common/system_info_tracker.h",
"src/trace_processor/importers/common/trace_parser.cc",
@@ -1731,6 +1821,8 @@
"src/trace_processor/importers/proto/chrome_system_probes_parser.h",
"src/trace_processor/importers/proto/default_modules.cc",
"src/trace_processor/importers/proto/default_modules.h",
+ "src/trace_processor/importers/proto/heap_profile_tracker.cc",
+ "src/trace_processor/importers/proto/heap_profile_tracker.h",
"src/trace_processor/importers/proto/memory_tracker_snapshot_module.cc",
"src/trace_processor/importers/proto/memory_tracker_snapshot_module.h",
"src/trace_processor/importers/proto/memory_tracker_snapshot_parser.cc",
@@ -1747,10 +1839,10 @@
"src/trace_processor/importers/proto/perf_sample_tracker.h",
"src/trace_processor/importers/proto/profile_module.cc",
"src/trace_processor/importers/proto/profile_module.h",
- "src/trace_processor/importers/proto/profile_packet_sequence_state.cc",
- "src/trace_processor/importers/proto/profile_packet_sequence_state.h",
"src/trace_processor/importers/proto/profile_packet_utils.cc",
"src/trace_processor/importers/proto/profile_packet_utils.h",
+ "src/trace_processor/importers/proto/profiler_util.cc",
+ "src/trace_processor/importers/proto/profiler_util.h",
"src/trace_processor/importers/proto/proto_incremental_state.h",
"src/trace_processor/importers/proto/proto_trace_parser.cc",
"src/trace_processor/importers/proto/proto_trace_parser.h",
@@ -1758,8 +1850,8 @@
"src/trace_processor/importers/proto/proto_trace_reader.h",
"src/trace_processor/importers/proto/proto_trace_tokenizer.cc",
"src/trace_processor/importers/proto/proto_trace_tokenizer.h",
- "src/trace_processor/importers/proto/stack_profile_sequence_state.cc",
- "src/trace_processor/importers/proto/stack_profile_sequence_state.h",
+ "src/trace_processor/importers/proto/stack_profile_tracker.cc",
+ "src/trace_processor/importers/proto/stack_profile_tracker.h",
"src/trace_processor/importers/proto/track_event_module.cc",
"src/trace_processor/importers/proto/track_event_module.h",
"src/trace_processor/importers/proto/track_event_parser.cc",
@@ -2272,6 +2364,7 @@
"src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql",
"src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql",
"src/trace_processor/perfetto_sql/stdlib/android/network_packets.sql",
+ "src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql",
"src/trace_processor/perfetto_sql/stdlib/android/process_metadata.sql",
"src/trace_processor/perfetto_sql/stdlib/android/screenshots.sql",
"src/trace_processor/perfetto_sql/stdlib/android/services.sql",
@@ -2311,6 +2404,21 @@
],
)
+# GN target: //src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common:common
+perfetto_filegroup(
+ name = "src_trace_processor_perfetto_sql_stdlib_deprecated_v42_common_common",
+ srcs = [
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/args.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/counters.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/cpus.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/metadata.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/percentiles.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/thread_states.sql",
+ "src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/timestamps.sql",
+ ],
+)
+
# GN target: //src/trace_processor/perfetto_sql/stdlib/graphs:graphs
perfetto_filegroup(
name = "src_trace_processor_perfetto_sql_stdlib_graphs_graphs",
@@ -2349,6 +2457,7 @@
name = "src_trace_processor_perfetto_sql_stdlib_prelude_prelude",
srcs = [
"src/trace_processor/perfetto_sql/stdlib/prelude/slices.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql",
],
)
@@ -2368,6 +2477,15 @@
srcs = [
"src/trace_processor/perfetto_sql/stdlib/slices/flat_slices.sql",
"src/trace_processor/perfetto_sql/stdlib/slices/slices.sql",
+ "src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql",
+ ],
+)
+
+# GN target: //src/trace_processor/perfetto_sql/stdlib/time:time
+perfetto_filegroup(
+ name = "src_trace_processor_perfetto_sql_stdlib_time_time",
+ srcs = [
+ "src/trace_processor/perfetto_sql/stdlib/time/conversion.sql",
],
)
@@ -2380,6 +2498,7 @@
":src_trace_processor_perfetto_sql_stdlib_chrome_chrome_sql",
":src_trace_processor_perfetto_sql_stdlib_common_common",
":src_trace_processor_perfetto_sql_stdlib_counters_counters",
+ ":src_trace_processor_perfetto_sql_stdlib_deprecated_v42_common_common",
":src_trace_processor_perfetto_sql_stdlib_graphs_graphs",
":src_trace_processor_perfetto_sql_stdlib_intervals_intervals",
":src_trace_processor_perfetto_sql_stdlib_linux_linux",
@@ -2387,6 +2506,7 @@
":src_trace_processor_perfetto_sql_stdlib_prelude_prelude",
":src_trace_processor_perfetto_sql_stdlib_sched_sched",
":src_trace_processor_perfetto_sql_stdlib_slices_slices",
+ ":src_trace_processor_perfetto_sql_stdlib_time_time",
],
outs = [
"src/trace_processor/perfetto_sql/stdlib/stdlib.h",
@@ -2652,8 +2772,6 @@
perfetto_filegroup(
name = "src_trace_processor_util_stack_traces_util",
srcs = [
- "src/trace_processor/util/profiler_util.cc",
- "src/trace_processor/util/profiler_util.h",
"src/trace_processor/util/stack_traces_util.cc",
"src/trace_processor/util/stack_traces_util.h",
],
@@ -5306,6 +5424,112 @@
],
)
+# GN target: //src/shared_lib:libperfetto_c
+perfetto_cc_library(
+ name = "libperfetto_c",
+ srcs = [
+ ":src_android_stats_android_stats",
+ ":src_android_stats_perfetto_atoms",
+ ":src_protozero_filtering_bytecode_common",
+ ":src_protozero_filtering_bytecode_parser",
+ ":src_protozero_filtering_message_filter",
+ ":src_protozero_filtering_string_filter",
+ ":src_shared_lib_intern_map",
+ ":src_shared_lib_shared_lib",
+ ":src_tracing_client_api_without_backends",
+ ":src_tracing_common",
+ ":src_tracing_core_core",
+ ":src_tracing_in_process_backend",
+ ":src_tracing_ipc_common",
+ ":src_tracing_ipc_consumer_consumer",
+ ":src_tracing_ipc_default_socket",
+ ":src_tracing_ipc_producer_producer",
+ ":src_tracing_ipc_service_service",
+ ":src_tracing_platform_impl",
+ ":src_tracing_service_service",
+ ":src_tracing_system_backend",
+ ],
+ hdrs = [
+ ":include_perfetto_base_base",
+ ":include_perfetto_ext_base_base",
+ ":include_perfetto_ext_ipc_ipc",
+ ":include_perfetto_ext_tracing_core_core",
+ ":include_perfetto_ext_tracing_ipc_ipc",
+ ":include_perfetto_protozero_protozero",
+ ":include_perfetto_public_abi_base",
+ ":include_perfetto_public_abi_public",
+ ":include_perfetto_public_base",
+ ":include_perfetto_public_protos_protos",
+ ":include_perfetto_public_protozero",
+ ":include_perfetto_public_public",
+ ":include_perfetto_tracing_core_core",
+ ":include_perfetto_tracing_core_forward_decls",
+ ":include_perfetto_tracing_tracing",
+ ],
+ defines = [
+ "PERFETTO_SHLIB_SDK_IMPLEMENTATION",
+ ],
+ visibility = [
+ "//visibility:public",
+ ],
+ deps = [
+ ":perfetto_ipc",
+ ":protos_perfetto_common_cpp",
+ ":protos_perfetto_common_zero",
+ ":protos_perfetto_config_android_cpp",
+ ":protos_perfetto_config_android_zero",
+ ":protos_perfetto_config_cpp",
+ ":protos_perfetto_config_ftrace_cpp",
+ ":protos_perfetto_config_ftrace_zero",
+ ":protos_perfetto_config_gpu_cpp",
+ ":protos_perfetto_config_gpu_zero",
+ ":protos_perfetto_config_inode_file_cpp",
+ ":protos_perfetto_config_inode_file_zero",
+ ":protos_perfetto_config_interceptors_cpp",
+ ":protos_perfetto_config_interceptors_zero",
+ ":protos_perfetto_config_power_cpp",
+ ":protos_perfetto_config_power_zero",
+ ":protos_perfetto_config_process_stats_cpp",
+ ":protos_perfetto_config_process_stats_zero",
+ ":protos_perfetto_config_profiling_cpp",
+ ":protos_perfetto_config_profiling_zero",
+ ":protos_perfetto_config_statsd_cpp",
+ ":protos_perfetto_config_statsd_zero",
+ ":protos_perfetto_config_sys_stats_cpp",
+ ":protos_perfetto_config_sys_stats_zero",
+ ":protos_perfetto_config_system_info_cpp",
+ ":protos_perfetto_config_system_info_zero",
+ ":protos_perfetto_config_track_event_cpp",
+ ":protos_perfetto_config_track_event_zero",
+ ":protos_perfetto_config_zero",
+ ":protos_perfetto_ipc_cpp",
+ ":protos_perfetto_ipc_ipc",
+ ":protos_perfetto_trace_android_zero",
+ ":protos_perfetto_trace_chrome_zero",
+ ":protos_perfetto_trace_etw_zero",
+ ":protos_perfetto_trace_filesystem_zero",
+ ":protos_perfetto_trace_ftrace_zero",
+ ":protos_perfetto_trace_gpu_zero",
+ ":protos_perfetto_trace_interned_data_zero",
+ ":protos_perfetto_trace_minimal_zero",
+ ":protos_perfetto_trace_non_minimal_zero",
+ ":protos_perfetto_trace_perfetto_zero",
+ ":protos_perfetto_trace_power_zero",
+ ":protos_perfetto_trace_profiling_zero",
+ ":protos_perfetto_trace_ps_zero",
+ ":protos_perfetto_trace_statsd_zero",
+ ":protos_perfetto_trace_sys_stats_zero",
+ ":protos_perfetto_trace_system_info_zero",
+ ":protos_perfetto_trace_track_event_cpp",
+ ":protos_perfetto_trace_track_event_zero",
+ ":protos_perfetto_trace_translation_zero",
+ ":protozero",
+ ":src_base_base",
+ ":src_base_version",
+ ],
+ linkstatic = True,
+)
+
# GN target: //src/trace_processor:trace_processor
perfetto_cc_library(
name = "trace_processor",
@@ -5313,6 +5537,7 @@
":src_kernel_utils_syscall_table",
":src_trace_processor_db_column_column",
":src_trace_processor_db_db",
+ ":src_trace_processor_db_minimal",
":src_trace_processor_export_json",
":src_trace_processor_importers_android_bugreport_android_bugreport",
":src_trace_processor_importers_common_common",
@@ -5478,6 +5703,7 @@
":src_protozero_proto_ring_buffer",
":src_trace_processor_db_column_column",
":src_trace_processor_db_db",
+ ":src_trace_processor_db_minimal",
":src_trace_processor_export_json",
":src_trace_processor_importers_android_bugreport_android_bugreport",
":src_trace_processor_importers_common_common",
@@ -5617,17 +5843,7 @@
":src_profiling_deobfuscator",
":src_profiling_symbolizer_symbolize_database",
":src_profiling_symbolizer_symbolizer",
- ":src_trace_processor_db_column_column",
- ":src_trace_processor_db_db",
- ":src_trace_processor_metatrace",
- ":src_trace_processor_storage_storage",
- ":src_trace_processor_tables_tables",
- ":src_trace_processor_tables_tables_python",
- ":src_trace_processor_types_types",
- ":src_trace_processor_util_glob",
- ":src_trace_processor_util_regex",
":src_trace_processor_util_stack_traces_util",
- ":src_trace_processor_util_util",
":src_traceconv_pprofbuilder",
":src_traceconv_utils",
],
@@ -5672,7 +5888,6 @@
":protos_perfetto_trace_non_minimal_zero",
":protos_perfetto_trace_perfetto_zero",
":protos_perfetto_trace_power_zero",
- ":protos_perfetto_trace_processor_zero",
":protos_perfetto_trace_profiling_zero",
":protos_perfetto_trace_ps_zero",
":protos_perfetto_trace_statsd_zero",
@@ -5682,7 +5897,6 @@
":protos_perfetto_trace_translation_zero",
":protos_third_party_pprof_zero",
":protozero",
- ":src_base_base",
":src_trace_processor_containers_containers",
] + PERFETTO_CONFIG.deps.zlib,
linkstatic = True,
@@ -5713,6 +5927,7 @@
":src_protozero_proto_ring_buffer",
":src_trace_processor_db_column_column",
":src_trace_processor_db_db",
+ ":src_trace_processor_db_minimal",
":src_trace_processor_export_json",
":src_trace_processor_importers_android_bugreport_android_bugreport",
":src_trace_processor_importers_common_common",
diff --git a/buildtools/BUILD.gn b/buildtools/BUILD.gn
index 6a44fbe..1d6e039 100644
--- a/buildtools/BUILD.gn
+++ b/buildtools/BUILD.gn
@@ -1421,7 +1421,10 @@
]
cflags = [ "-DFAKE_LOG_DEVICE=1" ]
if (!is_win) {
- cflags += [ "-Wno-deprecated-declarations" ]
+ cflags += [
+ "-Wno-deprecated-declarations",
+ "-Wno-vla-cxx-extension",
+ ]
}
public_configs = [ ":libunwindstack_config" ]
}
diff --git a/gn/standalone/BUILD.gn b/gn/standalone/BUILD.gn
index 1fb8196..43c81d0 100644
--- a/gn/standalone/BUILD.gn
+++ b/gn/standalone/BUILD.gn
@@ -65,7 +65,10 @@
# Disable variadic macro warning as we make extensive use of them in trace
# processor and client API.
if (is_clang) {
- if (!is_fuzzer) {
+ # Only enable -Weverything on hermetic clang as system clang might be quite
+ # out of date.
+ if (is_hermetic_clang && current_toolchain == host_toolchain &&
+ !is_fuzzer) {
# Disable Weverything on fuzzers to avoid breakages when new versions of
# clang are rolled into OSS-fuzz.
cflags += [ "-Weverything" ]
@@ -86,6 +89,10 @@
"-Wno-unknown-sanitizers",
"-Wno-unknown-warning-option",
"-Wno-unsafe-buffer-usage",
+
+ # TODO(primiano): -Wswitch-default could be useful but will require a mass
+ # codebase cleanup.
+ "-Wno-switch-default",
]
} else if (!is_clang && !is_win) {
# Use return std::move(...) for compatibility with old GCC compilers.
diff --git a/infra/perfetto.dev/src/gen_stdlib_docs_md.py b/infra/perfetto.dev/src/gen_stdlib_docs_md.py
index 47007a7..6fc5283 100644
--- a/infra/perfetto.dev/src/gen_stdlib_docs_md.py
+++ b/infra/perfetto.dev/src/gen_stdlib_docs_md.py
@@ -224,9 +224,10 @@
modules_dict: Dict[str, ModuleMd] = {}
for module_name, module_files in modules_json_dict.items():
- modules_dict[module_name] = ModuleMd(module_name, module_files)
+ # Remove 'common' when it has been removed from the code.
+ if module_name not in ['deprecated', 'common']:
+ modules_dict[module_name] = ModuleMd(module_name, module_files)
- common_module = modules_dict.pop('common')
prelude_module = modules_dict.pop('prelude')
with open(args.output, 'w') as f:
@@ -274,8 +275,6 @@
summary_objs = [prelude_module.summary_objs
] if prelude_module.summary_objs else []
- summary_objs += [common_module.summary_objs
- ] if common_module.summary_objs else []
summary_objs += [
module.summary_objs
for name, module in modules_dict.items()
@@ -284,8 +283,6 @@
summary_funs = [prelude_module.summary_funs
] if prelude_module.summary_funs else []
- summary_funs += [common_module.summary_funs
- ] if common_module.summary_funs else []
summary_funs += [
module.summary_funs
for name, module in modules_dict.items()
@@ -293,8 +290,6 @@
]
summary_view_funs = [prelude_module.summary_view_funs
] if prelude_module.summary_view_funs else []
- summary_view_funs += [common_module.summary_view_funs
- ] if common_module.summary_view_funs else []
summary_view_funs += [
module.summary_view_funs
for name, module in modules_dict.items()
@@ -302,8 +297,6 @@
]
summary_macros = [prelude_module.summary_macros
] if prelude_module.summary_macros else []
- summary_macros += [common_module.summary_macros
- ] if common_module.summary_macros else []
summary_macros += [
module.summary_macros
for name, module in modules_dict.items()
@@ -341,8 +334,6 @@
f.write('\n\n')
f.write(prelude_module.print_description())
f.write('\n')
- f.write(common_module.print_description())
- f.write('\n')
f.write('\n'.join(
module.print_description() for module in modules_dict.values()))
diff --git a/protos/perfetto/metrics/android/binder_metric.proto b/protos/perfetto/metrics/android/binder_metric.proto
index c7f3516..d16e2ee 100644
--- a/protos/perfetto/metrics/android/binder_metric.proto
+++ b/protos/perfetto/metrics/android/binder_metric.proto
@@ -32,7 +32,7 @@
optional uint32 count = 4;
}
- // Next field id: 28
+ // Next field id: 30
message UnaggregatedTxnBreakdown {
// General
optional string aidl_name = 1;
@@ -47,6 +47,7 @@
optional bool is_main_thread = 5;
optional int64 client_ts = 6;
optional int64 client_dur = 7;
+ optional int64 client_monotonic_dur = 28;
optional int64 client_oom_score = 19;
optional int64 client_package_version_code = 24;
optional bool is_client_package_debuggable = 25;
@@ -57,6 +58,7 @@
optional string server_thread = 10;
optional int64 server_ts = 11;
optional int64 server_dur = 12;
+ optional int64 server_monotonic_dur = 29;
optional int64 server_oom_score = 20;
optional int64 server_package_version_code = 26;
optional bool is_server_package_debuggable = 27;
diff --git a/protos/perfetto/metrics/android/monitor_contention_metric.proto b/protos/perfetto/metrics/android/monitor_contention_metric.proto
index 1973ffb..a13e2ba 100644
--- a/protos/perfetto/metrics/android/monitor_contention_metric.proto
+++ b/protos/perfetto/metrics/android/monitor_contention_metric.proto
@@ -21,7 +21,7 @@
// This metric provides information about the monitor contention graph in a
// trace
message AndroidMonitorContentionMetric {
- // Next field id: 25
+ // Next field id: 26
message Node {
// Global context
optional int64 node_parent_id = 1;
@@ -29,6 +29,7 @@
optional int64 node_id = 2;
optional int64 ts = 3;
optional int64 dur = 4;
+ optional int64 monotonic_dur = 25;
optional string process_name = 14;
optional uint32 pid = 23;
optional uint32 waiter_count = 11;
diff --git a/protos/perfetto/metrics/perfetto_merged_metrics.proto b/protos/perfetto/metrics/perfetto_merged_metrics.proto
index 75e89f0..32640f6 100644
--- a/protos/perfetto/metrics/perfetto_merged_metrics.proto
+++ b/protos/perfetto/metrics/perfetto_merged_metrics.proto
@@ -340,7 +340,7 @@
optional uint32 count = 4;
}
- // Next field id: 28
+ // Next field id: 30
message UnaggregatedTxnBreakdown {
// General
optional string aidl_name = 1;
@@ -355,6 +355,7 @@
optional bool is_main_thread = 5;
optional int64 client_ts = 6;
optional int64 client_dur = 7;
+ optional int64 client_monotonic_dur = 28;
optional int64 client_oom_score = 19;
optional int64 client_package_version_code = 24;
optional bool is_client_package_debuggable = 25;
@@ -365,6 +366,7 @@
optional string server_thread = 10;
optional int64 server_ts = 11;
optional int64 server_dur = 12;
+ optional int64 server_monotonic_dur = 29;
optional int64 server_oom_score = 20;
optional int64 server_package_version_code = 26;
optional bool is_server_package_debuggable = 27;
@@ -1475,7 +1477,7 @@
// This metric provides information about the monitor contention graph in a
// trace
message AndroidMonitorContentionMetric {
- // Next field id: 25
+ // Next field id: 26
message Node {
// Global context
optional int64 node_parent_id = 1;
@@ -1483,6 +1485,7 @@
optional int64 node_id = 2;
optional int64 ts = 3;
optional int64 dur = 4;
+ optional int64 monotonic_dur = 25;
optional string process_name = 14;
optional uint32 pid = 23;
optional uint32 waiter_count = 11;
diff --git a/protos/perfetto/trace/BUILD.gn b/protos/perfetto/trace/BUILD.gn
index c808a93..b131e7d 100644
--- a/protos/perfetto/trace/BUILD.gn
+++ b/protos/perfetto/trace/BUILD.gn
@@ -20,7 +20,7 @@
# 2. Minimal set: :minimal_zero, :minimal_lite. These are mainly for chrome, to
# avoid bloating binary size by pulling unnecessary protos.
#
-# In practice, however, we need to split them in disjoint targets (minmal and
+# In practice, however, we need to split them in disjoint targets (minimal and
# non-minimal) and then use a group() target for the full protos. This is
# because build systems don't like two targets having genrules for the same
# .proto files.
diff --git a/protos/perfetto/trace/ftrace/ftrace_event_bundle.proto b/protos/perfetto/trace/ftrace/ftrace_event_bundle.proto
index 99a6e26..5bfab9dd 100644
--- a/protos/perfetto/trace/ftrace/ftrace_event_bundle.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_event_bundle.proto
@@ -31,10 +31,6 @@
// Set to true if there was data loss between the last time we've read from
// the corresponding per-cpu kernel buffer, and the earliest event recorded
// in this bundle.
- // TODO(rsavitski): consider replicating in the newer FtraceError. This field
- // has been set since the original implementation, but used only for manual
- // debugging. Trace processor instead looks at the FtraceStats totals for the
- // tracing session.
optional bool lost_events = 3;
// Optionally-enabled compact encoding of a batch of scheduling events. Only
diff --git a/protos/perfetto/trace/ftrace/ftrace_stats.proto b/protos/perfetto/trace/ftrace/ftrace_stats.proto
index c5f06b9..f921779 100644
--- a/protos/perfetto/trace/ftrace/ftrace_stats.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_stats.proto
@@ -40,6 +40,8 @@
// Size of entries currently in the kernel buffer (see |entries|) in bytes.
// The field should be named "bytes", but is misnamed for historical reasons.
+ // This value has known inaccuracies before Linux v6.6:
+ // https://github.com/torvalds/linux/commit/45d99ea
optional uint64 bytes_read = 5;
// The timestamp for the oldest event still in the ring buffer.
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index a69110b..f9370cd 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -10450,6 +10450,8 @@
// Size of entries currently in the kernel buffer (see |entries|) in bytes.
// The field should be named "bytes", but is misnamed for historical reasons.
+ // This value has known inaccuracies before Linux v6.6:
+ // https://github.com/torvalds/linux/commit/45d99ea
optional uint64 bytes_read = 5;
// The timestamp for the oldest event still in the ring buffer.
@@ -10561,10 +10563,6 @@
// Set to true if there was data loss between the last time we've read from
// the corresponding per-cpu kernel buffer, and the earliest event recorded
// in this bundle.
- // TODO(rsavitski): consider replicating in the newer FtraceError. This field
- // has been set since the original implementation, but used only for manual
- // debugging. Trace processor instead looks at the FtraceStats totals for the
- // tracing session.
optional bool lost_events = 3;
// Optionally-enabled compact encoding of a batch of scheduling events. Only
diff --git a/python/generators/sql_processing/docs_parse.py b/python/generators/sql_processing/docs_parse.py
index 31cea3c..6e8cd60 100644
--- a/python/generators/sql_processing/docs_parse.py
+++ b/python/generators/sql_processing/docs_parse.py
@@ -20,9 +20,15 @@
from typing import Any, Dict, List, Optional, Set, Tuple, NamedTuple
from python.generators.sql_processing.docs_extractor import DocsExtractor
-from python.generators.sql_processing.utils import ALLOWED_PREFIXES, ANY_PATTERN, ARG_DEFINITION_PATTERN, ObjKind
-from python.generators.sql_processing.utils import ARG_ANNOTATION_PATTERN
+from python.generators.sql_processing.utils import ObjKind
+
+from python.generators.sql_processing.utils import ALLOWED_PREFIXES
+from python.generators.sql_processing.utils import OBJECT_NAME_ALLOWLIST
+
from python.generators.sql_processing.utils import COLUMN_ANNOTATION_PATTERN
+from python.generators.sql_processing.utils import ANY_PATTERN
+from python.generators.sql_processing.utils import ARG_DEFINITION_PATTERN
+from python.generators.sql_processing.utils import ARG_ANNOTATION_PATTERN
def is_internal(name: str) -> bool:
@@ -50,7 +56,7 @@
# Returns: error message if the name is not correct, None otherwise.
def get_module_prefix_error(name: str, path: str, module: str) -> Optional[str]:
prefix = name.lower().split('_')[0]
- if module == "common" or module == "prelude":
+ if module in ["common", "prelude", "deprecated"]:
if prefix == module:
return (f'Names of tables/views/functions in the "{module}" module '
f'should not start with {module}')
@@ -64,6 +70,8 @@
if prefix == allowed_name_prefix:
return None
allowed_prefixes.append(allowed_name_prefix)
+ if path in OBJECT_NAME_ALLOWLIST and name in OBJECT_NAME_ALLOWLIST[path]:
+ return None
return (
f'Names of tables/views/functions at path "{path}" should be prefixed '
f'with one of following names: {", ".join(allowed_prefixes)}')
@@ -426,13 +434,17 @@
# Reads the provided SQL and, if possible, generates a dictionary with data
# from documentation together with errors from validation of the schema.
-def parse_file(path: str, sql: str) -> ParsedFile:
+def parse_file(path: str, sql: str) -> Optional[ParsedFile]:
if sys.platform.startswith('win'):
path = path.replace('\\', '/')
# Get module name
module_name = path.split('/stdlib/')[-1].split('/')[0]
+ # Disable support for `deprecated` module
+ if module_name == "deprecated":
+ return
+
# Extract all the docs from the SQL.
extractor = DocsExtractor(path, module_name, sql)
docs = extractor.extract()
diff --git a/python/generators/sql_processing/utils.py b/python/generators/sql_processing/utils.py
index 49564dd..ba14110 100644
--- a/python/generators/sql_processing/utils.py
+++ b/python/generators/sql_processing/utils.py
@@ -111,6 +111,12 @@
'counters': 'counter',
'chrome/util': 'cr',
'graphs': 'graph',
+ 'slices': 'slice'
+}
+
+# Allows for nonstandard object names.
+OBJECT_NAME_ALLOWLIST = {
+ 'slices/with_context.sql': ['process_slice', 'thread_slice']
}
# Given a regex pattern and a string to match against, returns all the
diff --git a/python/generators/trace_processor_table/serialize.py b/python/generators/trace_processor_table/serialize.py
index 176ecfe..1f92f44 100644
--- a/python/generators/trace_processor_table/serialize.py
+++ b/python/generators/trace_processor_table/serialize.py
@@ -19,6 +19,7 @@
from python.generators.trace_processor_table.public import ColumnFlag
from python.generators.trace_processor_table.util import ParsedTable
from python.generators.trace_processor_table.util import ParsedColumn
+from python.generators.trace_processor_table.util import data_layer_type
from python.generators.trace_processor_table.util import parse_type
from python.generators.trace_processor_table.util import typed_column_type
@@ -32,13 +33,18 @@
self.col = self.parsed_col.column
self.name = self.col.name
self.flags = self.col.flags
+
+ parsed_type = parse_type(table.table, self.col.type)
+
self.typed_column_type = typed_column_type(table.table, self.parsed_col)
- self.cpp_type = parse_type(table.table,
- self.col.type).cpp_type_with_optionality()
+ self.cpp_type = parsed_type.cpp_type_with_optionality()
+ self.data_layer_type = data_layer_type(table.table, self.parsed_col)
self.is_implicit_id = self.parsed_col.is_implicit_id
self.is_implicit_type = self.parsed_col.is_implicit_type
self.is_ancestor = self.parsed_col.is_ancestor
+ self.is_string = parsed_type.cpp_type == 'StringPool::Id'
+ self.is_optional = parsed_type.is_optional
def colindex(self) -> str:
return f' static constexpr uint32_t {self.name} = {self.col_index};'
@@ -63,14 +69,14 @@
return None
if not self.is_ancestor:
return None
- return f'std::move(in_{self.name})'
+ return f'in_{self.name}'
def row_initializer(self) -> Optional[str]:
if self.is_implicit_id or self.is_implicit_type:
return None
if self.is_ancestor:
return None
- return f'{self.name}(std::move(in_{self.name}))'
+ return f'{self.name}(in_{self.name})'
def const_row_ref_getter(self) -> Optional[str]:
return f'''ColumnType::{self.name}::type {self.name}() const {{
@@ -115,8 +121,8 @@
if self.is_ancestor:
return None
return f'''
- columns.emplace_back("{self.name}", &self->{self.name}_, ColumnFlag::{self.name},
- static_cast<uint32_t>(columns.size()), olay_idx);
+ AddColumnToVector(columns, "{self.name}", &self->{self.name}_, ColumnFlag::{self.name},
+ static_cast<uint32_t>(columns.size()), olay_idx);
'''
def shrink_to_fit(self) -> Optional[str]:
@@ -131,7 +137,7 @@
return None
if self.is_ancestor:
return None
- return f' mutable_{self.name}()->Append(std::move(row.{self.name}));'
+ return f' mutable_{self.name}()->Append(row.{self.name});'
def accessor(self) -> Optional[str]:
inner = f'columns()[ColumnIndex::{self.name}]'
@@ -232,6 +238,66 @@
{self.name}_ = std::move({self.name});
'''
+ def storage_layer(self) -> Optional[str]:
+ if self.is_ancestor:
+ return None
+ return f'''
+ RefPtr<column::DataLayer> {self.name}_storage_layer_;
+ '''
+
+ def null_layer(self) -> Optional[str]:
+ if self.is_ancestor:
+ return None
+ if not self.is_optional or self.is_string:
+ return f''
+ return f'''
+ RefPtr<column::DataLayer> {self.name}_null_layer_;
+ '''
+
+ def storage_layer_create(self) -> str:
+ if self.is_ancestor:
+ return f'''const_parent_->storage_layers()[ColumnIndex::{self.name}]'''
+ return f'''{self.name}_storage_layer_'''
+
+ def null_layer_create(self) -> str:
+ if not self.is_optional or self.is_string:
+ return f'{{}}'
+ if self.is_ancestor:
+ return f'''const_parent_->null_layers()[ColumnIndex::{self.name}]'''
+ return f'''{self.name}_null_layer_'''
+
+ def storage_layer_init(self) -> str:
+ if self.is_ancestor:
+ return f''
+ if self.is_implicit_id:
+ return f'{self.name}_storage_layer_(new column::IdStorage())'
+ if self.is_string:
+ return f'''{self.name}_storage_layer_(
+ new column::StringStorage(string_pool(), &{self.name}_.vector()))'''
+ if ColumnFlag.SET_ID in self.flags:
+ return f'''{self.name}_storage_layer_(
+ new column::SetIdStorage(&{self.name}_.vector()))'''
+ if self.is_optional:
+ return f'''{self.name}_storage_layer_(
+ new column::NumericStorage<ColumnType::{self.name}::non_optional_stored_type>(
+ &{self.name}_.non_null_vector(),
+ ColumnTypeHelper<ColumnType::{self.name}::stored_type>::ToColumnType(),
+ {str(ColumnFlag.SORTED in self.flags).lower()}))'''
+ return f'''{self.name}_storage_layer_(
+ new column::NumericStorage<ColumnType::{self.name}::non_optional_stored_type>(
+ &{self.name}_.vector(),
+ ColumnTypeHelper<ColumnType::{self.name}::stored_type>::ToColumnType(),
+ {str(ColumnFlag.SORTED in self.flags).lower()}))'''
+
+ def null_layer_init(self) -> str:
+ if self.is_ancestor:
+ return f''
+ if not self.is_optional or self.is_string:
+ return f''
+ if ColumnFlag.DENSE in self.flags:
+ return f'''{self.name}_null_layer_(new column::DenseNullOverlay({self.name}_.bv()))'''
+ return f'''{self.name}_null_layer_(new column::NullOverlay({self.name}_.bv()))'''
+
class TableSerializer(object):
"""Functions for seralizing a single Table into C++."""
@@ -272,7 +338,7 @@
Id() = default;
explicit constexpr Id(uint32_t v) : BaseId(v) {}
};
- static_assert(std::is_trivially_destructible<Id>::value,
+ static_assert(std::is_trivially_destructible_v<Id>,
"Inheritance used without trivial destruction");
'''
@@ -313,7 +379,7 @@
{row_ref_getters}
}};
- static_assert(std::is_trivially_destructible<ConstRowReference>::value,
+ static_assert(std::is_trivially_destructible_v<ConstRowReference>,
"Inheritance used without trivial destruction");
'''
@@ -333,17 +399,24 @@
return const_cast<{self.table_name}*>(table_);
}}
}};
- static_assert(std::is_trivially_destructible<RowReference>::value,
+ static_assert(std::is_trivially_destructible_v<RowReference>,
"Inheritance used without trivial destruction");
'''
def constructor(self) -> str:
storage_init = self.foreach_col(
ColumnSerializer.storage_init, delimiter=',\n ')
+ storage_layer_init = self.foreach_col(
+ ColumnSerializer.storage_layer_init, delimiter=',\n ')
+ storage_layer_sep = '\n,' if storage_layer_init else ''
+ null_layer_init = self.foreach_col(
+ ColumnSerializer.null_layer_init, delimiter=',\n ')
+ null_layer_sep = '\n,' if null_layer_init else ''
if self.table.parent:
parent_param = f', {self.parent_class_name}* parent'
parent_arg = 'parent'
- parent_init = 'parent_(parent)' + (', ' if storage_init else '')
+ parent_init = 'parent_(parent), const_parent_(parent)' + (
+ ', ' if storage_init else '')
else:
parent_param = ''
parent_arg = 'nullptr'
@@ -353,6 +426,10 @@
olay = 'uint32_t olay_idx = OverlayCount(parent);'
else:
olay = ''
+ storage_layer_create = self.foreach_col(
+ ColumnSerializer.storage_layer_create, delimiter=',')
+ null_layer_create = self.foreach_col(
+ ColumnSerializer.null_layer_create, delimiter=',')
return f'''
static std::vector<ColumnLegacy> GetColumns(
{self.table_name}* self,
@@ -364,11 +441,18 @@
return columns;
}}
- explicit {self.table_name}(StringPool* pool{parent_param})
- : macros_internal::MacroTable(pool, GetColumns(this, {parent_arg}), {parent_arg}),
- {parent_init}{storage_init} {{
+ PERFETTO_NO_INLINE explicit {self.table_name}(StringPool* pool{parent_param})
+ : macros_internal::MacroTable(
+ pool,
+ GetColumns(this, {parent_arg}),
+ {parent_arg}),
+ {parent_init}{storage_init}{storage_layer_sep}
+ {storage_layer_init}{null_layer_sep}
+ {null_layer_init} {{
{self.foreach_col(ColumnSerializer.static_assert_flags)}
- OnConstructionCompleted();
+ OnConstructionCompletedRegularConstructor(
+ {{{storage_layer_create}}},
+ {{{null_layer_create}}});
}}
'''
@@ -376,6 +460,7 @@
if self.table.parent:
return f'''
{self.parent_class_name}* parent_ = nullptr;
+ const {self.parent_class_name}* const_parent_ = nullptr;
'''
return ''
@@ -422,20 +507,20 @@
return f'''
class Iterator : public ConstIterator {{
public:
- {iterator_setters}
+ {iterator_setters}
- RowReference row_reference() const {{
- return RowReference(mutable_table_, CurrentRowNumber());
- }}
+ RowReference row_reference() const {{
+ return RowReference(mutable_table_, CurrentRowNumber());
+ }}
private:
- friend class {self.table_name};
+ friend class {self.table_name};
- explicit Iterator({self.table_name}* table, Table::Iterator iterator)
+ explicit Iterator({self.table_name}* table, Table::Iterator iterator)
: ConstIterator(table, std::move(iterator)),
mutable_table_(table) {{}}
- {self.table_name}* mutable_table_ = nullptr;
+ {self.table_name}* mutable_table_ = nullptr;
}};
'''
@@ -473,24 +558,63 @@
def extend_constructor(self) -> str:
if not self.table.parent:
return ''
+ storage_layer_init = self.foreach_col(
+ ColumnSerializer.storage_layer_init, delimiter=',\n ')
+ storage_layer_sep = '\n,' if storage_layer_init else ''
+ null_layer_init = self.foreach_col(
+ ColumnSerializer.null_layer_init, delimiter=',\n ')
+ null_layer_sep = '\n,' if null_layer_init else ''
params = self.foreach_col(
ColumnSerializer.extend_parent_param, delimiter='\n, ')
+ storage_layer_create = self.foreach_col(
+ ColumnSerializer.storage_layer_create, delimiter=',')
+ null_layer_create = self.foreach_col(
+ ColumnSerializer.null_layer_create, delimiter=',')
return f'''
{self.table_name}(StringPool* pool,
const {self.parent_class_name}& parent,
const RowMap& parent_overlay{',' if params else ''}
{params})
- : macros_internal::MacroTable(pool, GetColumns(this, &parent), parent, parent_overlay) {{
+ : macros_internal::MacroTable(
+ pool,
+ GetColumns(this, &parent),
+ parent,
+ parent_overlay),
+ const_parent_(&parent){storage_layer_sep}
+ {storage_layer_init}{null_layer_sep}
+ {null_layer_init} {{
{self.foreach_col(ColumnSerializer.static_assert_flags)}
{self.foreach_col(ColumnSerializer.extend_nullable_vector)}
- OnConstructionCompleted();
+
+ std::vector<RefPtr<column::DataLayer>> overlay_layers(OverlayCount(&parent) + 1);
+ for (uint32_t i = 0; i < overlay_layers.size(); ++i) {{
+ if (overlays()[i].row_map().IsIndexVector()) {{
+ overlay_layers[i].reset(new column::ArrangementOverlay(
+ overlays()[i].row_map().GetIfIndexVector(),
+ Indices::State::kNonmonotonic));
+ }} else if (overlays()[i].row_map().IsBitVector()) {{
+ overlay_layers[i].reset(new column::SelectorOverlay(
+ overlays()[i].row_map().GetIfBitVector()));
+ }} else if (overlays()[i].row_map().IsRange()) {{
+ overlay_layers[i].reset(new column::RangeOverlay(
+ overlays()[i].row_map().GetIfIRange()));
+ }}
+ }}
+
+ OnConstructionCompleted(
+ {{{storage_layer_create}}}, {{{null_layer_create}}}, std::move(overlay_layers));
}}
'''
+ def column_count(self) -> str:
+ return str(len(self.column_serializers))
+
def serialize(self) -> str:
return f'''
class {self.table_name} : public macros_internal::MacroTable {{
public:
+ static constexpr uint32_t kColumnCount = {self.column_count().strip()};
+
{self.id_defn().lstrip()}
struct ColumnIndex {{
{self.foreach_col(ColumnSerializer.colindex)}
@@ -513,7 +637,7 @@
explicit RowNumber(uint32_t row_number)
: AbstractRowNumber(row_number) {{}}
}};
- static_assert(std::is_trivially_destructible<RowNumber>::value,
+ static_assert(std::is_trivially_destructible_v<RowNumber>,
"Inheritance used without trivial destruction");
{self.const_row_reference_struct().strip()}
@@ -583,7 +707,7 @@
{self.insert_common().strip()}
{self.foreach_col(ColumnSerializer.append)}
UpdateSelfOverlayAfterInsert();
- return IdAndRow{{std::move(id), row_number, RowReference(this, row_number),
+ return IdAndRow{{id, row_number, RowReference(this, row_number),
RowNumber(row_number)}};
}}
@@ -597,6 +721,10 @@
{self.extend_constructor().strip()}
{self.parent_field().strip()}
{self.foreach_col(ColumnSerializer.storage)}
+
+ {self.foreach_col(ColumnSerializer.storage_layer)}
+
+ {self.foreach_col(ColumnSerializer.null_layer)}
}};
'''.strip('\n')
@@ -610,19 +738,45 @@
#ifndef {ifdef_guard}
#define {ifdef_guard}
+#include <array>
+#include <cstddef>
+#include <cstdint>
+#include <memory>
+#include <optional>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+#include "perfetto/base/logging.h"
+#include "perfetto/trace_processor/basic_types.h"
+#include "perfetto/trace_processor/ref_counted.h"
+#include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/containers/row_map.h"
+#include "src/trace_processor/containers/string_pool.h"
+#include "src/trace_processor/db/column/arrangement_overlay.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/dense_null_overlay.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
+#include "src/trace_processor/db/column/id_storage.h"
+#include "src/trace_processor/db/column/null_overlay.h"
+#include "src/trace_processor/db/column/range_overlay.h"
+#include "src/trace_processor/db/column/selector_overlay.h"
+#include "src/trace_processor/db/column/set_id_storage.h"
+#include "src/trace_processor/db/column/string_storage.h"
+#include "src/trace_processor/db/column/types.h"
+#include "src/trace_processor/db/column_storage.h"
+#include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/table.h"
#include "src/trace_processor/db/typed_column.h"
+#include "src/trace_processor/db/typed_column_internal.h"
#include "src/trace_processor/tables/macros_internal.h"
{include_paths_str}
-namespace perfetto {{
-namespace trace_processor {{
-namespace tables {{
+namespace perfetto::trace_processor::tables {{
{tables_str.strip()}
-}} // namespace tables
-}} // namespace trace_processor
}} // namespace perfetto
#endif // {ifdef_guard}
diff --git a/python/generators/trace_processor_table/util.py b/python/generators/trace_processor_table/util.py
index 9d5418a..444ec82 100644
--- a/python/generators/trace_processor_table/util.py
+++ b/python/generators/trace_processor_table/util.py
@@ -147,6 +147,19 @@
return f'TypedColumn<{parsed.cpp_type_with_optionality()}>'
+def data_layer_type(table: Table, col: ParsedColumn) -> str:
+ """Returns the DataLayer C++ type for a given column."""
+
+ parsed = parse_type(table, col.column.type)
+ if col.is_implicit_id:
+ return 'column::IdStorage'
+ if parsed.cpp_type == 'StringPool::Id':
+ return 'column::StringStorage'
+ if ColumnFlag.SET_ID in col.column.flags:
+ return 'column::SetIdStorage'
+ return f'column::NumericStorage<ColumnType::{col.column.name}::non_optional_stored_type>'
+
+
def find_table_deps(table: Table) -> List[Table]:
"""Finds all the other table class names this table depends on.
diff --git a/python/perfetto/trace_processor/metrics.descriptor b/python/perfetto/trace_processor/metrics.descriptor
index ec2847d..f77d217 100644
--- a/python/perfetto/trace_processor/metrics.descriptor
+++ b/python/perfetto/trace_processor/metrics.descriptor
Binary files differ
diff --git a/python/tools/check_ratchet.py b/python/tools/check_ratchet.py
index e8240d3..26e0800 100755
--- a/python/tools/check_ratchet.py
+++ b/python/tools/check_ratchet.py
@@ -36,7 +36,7 @@
from dataclasses import dataclass
-EXPECTED_ANY_COUNT = 73
+EXPECTED_ANY_COUNT = 71
EXPECTED_RUN_METRIC_COUNT = 5
ROOT_DIR = os.path.dirname(
diff --git a/src/base/debug_crash_stack_trace.cc b/src/base/debug_crash_stack_trace.cc
index 4a16f29..9e1ef80 100644
--- a/src/base/debug_crash_stack_trace.cc
+++ b/src/base/debug_crash_stack_trace.cc
@@ -149,7 +149,11 @@
#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \
PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
- auto bt_error = [](void*, const char* msg, int) { Print(msg); };
+ auto bt_error = [](void*, const char* msg, int) {
+ Print("libbacktrace error: ");
+ perfetto::base::WriteAll(STDERR_FILENO, msg, strlen(msg));
+ Print("\n");
+ };
struct backtrace_state* bt_state =
backtrace_create_state(nullptr, 0, bt_error, nullptr);
#endif
diff --git a/src/base/uuid.cc b/src/base/uuid.cc
index 180a651..f335cfd 100644
--- a/src/base/uuid.cc
+++ b/src/base/uuid.cc
@@ -16,9 +16,11 @@
#include "perfetto/ext/base/uuid.h"
+#include <mutex>
#include <random>
#include "perfetto/base/time.h"
+#include "perfetto/ext/base/no_destructor.h"
namespace perfetto {
namespace base {
@@ -51,6 +53,12 @@
Uuid uuid;
auto& data = *uuid.data();
+ // std::random is not thread safe and users of this class might mistakenly
+ // assume Uuidv4() is thread_safe because from the outside looks like a
+ // local object.
+ static base::NoDestructor<std::mutex> rand_mutex;
+ std::unique_lock<std::mutex> rand_lock(rand_mutex.ref());
+
for (size_t i = 0; i < sizeof(data);) {
// Note: the 32-th bit of rng() is always 0 as minstd_rand operates modulo
// 2**31. Fill in blocks of 16b rather than 32b to not lose 1b of entropy.
diff --git a/src/kallsyms/kernel_symbol_map.cc b/src/kallsyms/kernel_symbol_map.cc
index b255213..4ff73d1 100644
--- a/src/kallsyms/kernel_symbol_map.cc
+++ b/src/kallsyms/kernel_symbol_map.cc
@@ -45,13 +45,16 @@
namespace {
using TokenId = KernelSymbolMap::TokenTable::TokenId;
+// TODO(rsavitski): the ToT kernel can supposedly contain symbols >255 bytes in
+// length (in particular due to Rust). Consider bumping this.
+// https://github.com/torvalds/linux/commit/73bbb94
constexpr size_t kSymNameMaxLen = 128;
constexpr size_t kSymMaxSizeBytes = 1024 * 1024;
// Reads a kallsyms file in blocks of 4 pages each and decode its lines using
// a simple FSM. Calls the passed lambda for each valid symbol.
// It skips undefined symbols and other useless stuff.
-template <typename Lambda /* void(uint64_t, const char*) */>
+template <typename Lambda /* void(uint64_t, char, base::StringView) */>
void ForEachSym(const std::string& kallsyms_path, Lambda fn) {
base::ScopedFile fd = base::OpenFile(kallsyms_path.c_str(), O_RDONLY);
if (!fd) {
@@ -119,8 +122,7 @@
sym_name[sym_name_len++] = c;
break;
}
- sym_name[sym_name_len] = '\0';
- fn(sym_addr, sym_type, sym_name);
+ fn(sym_addr, sym_type, base::StringView(sym_name, sym_name_len));
sym_addr = 0;
sym_type = '\0';
state = c == '\n' ? kSymAddr : kEatRestOfLine;
@@ -144,29 +146,26 @@
// __fo_a_b_ -> [_, fo, a, b, ""]
// __fo_a_b____ -> [_, fo, a, b, ___]
template <typename Lambda /* void(base::StringView) */>
-void Tokenize(const char* name, Lambda fn) {
- const char* tok_start = name;
- bool is_start_of_token = true;
- bool tok_is_sep = false;
- for (const char* ptr = name;; ptr++) {
- const char c = *ptr;
- if (is_start_of_token) {
- tok_is_sep = *tok_start == '_'; // Deals with tokens made of '_'s.
- is_start_of_token = false;
- }
- // Scan until either the end of string or the next character (which is a '_'
- // in nominal cases, or anything != '_' for tokens made by 1+ '_').
- if (c == '\0' || (!tok_is_sep && c == '_') || (tok_is_sep && c != '_')) {
- size_t tok_len = static_cast<size_t>(ptr - tok_start);
- if (tok_is_sep && c != '\0')
- --tok_len;
- fn(base::StringView(tok_start, tok_len));
- if (c == '\0')
- return;
- tok_start = tok_is_sep ? ptr : ptr + 1;
- is_start_of_token = true;
+void Tokenize(const base::StringView name, Lambda fn) {
+ size_t tok_start = 0;
+ bool tok_is_sep = !name.empty() && name.at(tok_start) == '_';
+ for (size_t i = 0; i < name.size(); i++) {
+ char c = name.at(i);
+ // Scan until either the end of string or the next character (which is a
+ // '_' in nominal cases, or anything != '_' for tokens made by 1+ '_').
+ if (!tok_is_sep && c == '_') {
+ fn(name.substr(tok_start, i - tok_start));
+ tok_start = i + 1;
+ if (tok_start < name.size()) {
+ tok_is_sep = name.at(tok_start) == '_';
+ }
+ } else if (tok_is_sep && c != '_') {
+ fn(name.substr(tok_start, i - tok_start - 1));
+ tok_start = i;
+ tok_is_sep = false;
}
}
+ fn(name.substr(tok_start)); // last token
}
} // namespace
@@ -264,10 +263,34 @@
// Based on `cat /proc/kallsyms | egrep "\b[tT]\b" | wc -l`.
symbol_tokens.reserve(128 * 1024);
- ForEachSym(kallsyms_path, [&](SymAddr addr, char type, const char* name) {
- if (addr == 0 || (type != 't' && type != 'T') || name[0] == '$') {
+ ForEachSym(kallsyms_path, [&](SymAddr addr, char type,
+ base::StringView name) {
+ // Special cases:
+ //
+ // Skip arm mapping symbols such as $x, $x.123, $d, $d.123. They exist to
+ // delineate interleaved data and text for certain tools, and do not
+ // identify real functions. Should be fine to ignore on non-arm platforms
+ // since '$' isn't a valid C identifier and therefore unlikely to mark a
+ // real function.
+ //
+ // Strip .cfi/.cfi_jt suffixes if the kernel is built with clang control
+ // flow integrity checks (where for "my_func" there will be a
+ // "my_func.cfi_jt"). These can account for a third of the total symbols
+ // after the above filters, and tracing users want to see the unadorned
+ // name anyway. Normally we'd record the full string here and remove the
+ // suffix during trace ingestion, but it makes a nontrivial impact on the
+ // size of the in-memory token table since we tokenize only on underscore
+ // boundaries.
+ if (addr == 0 || (type != 't' && type != 'T') || name.at(0) == '$') {
return;
}
+ const base::StringView cfi = ".cfi";
+ const base::StringView cfi_jt = ".cfi_jt";
+ if (name.EndsWith(cfi)) {
+ name = name.substr(0, name.size() - cfi.size());
+ } else if (name.EndsWith(cfi_jt)) {
+ name = name.substr(0, name.size() - cfi_jt.size());
+ }
// Split each symbol name in tokens, using '_' as a separator (so that
// "foo_bar" -> ["foo", "bar"]). For each token hash:
diff --git a/src/kallsyms/kernel_symbol_map_unittest.cc b/src/kallsyms/kernel_symbol_map_unittest.cc
index 2bdb356..7a00bc0 100644
--- a/src/kallsyms/kernel_symbol_map_unittest.cc
+++ b/src/kallsyms/kernel_symbol_map_unittest.cc
@@ -108,7 +108,6 @@
EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa20ULL), "two_");
EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa30LL), "_three");
EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa40ULL), "_fo_ur_");
- EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa50ULL), "_five__.cfi");
EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa60ULL), "__si__x__");
EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa70ULL), "___se___v_e__n___");
EXPECT_EQ(
@@ -124,7 +123,10 @@
EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa71ULL), "___se___v_e__n___");
EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa91ULL), "NiNe");
EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa99ULL), "NiNe");
- EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2faa0ULL), "tls_get.cfi_jt");
+
+ // We strip arm64 clang control flow integrity suffixes straight away.
+ EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2fa50ULL), "_five__");
+ EXPECT_EQ(kallsyms.Lookup(0xffffff8f73e2faa0ULL), "tls_get");
// This is too far from the last symbol and should fail.
EXPECT_EQ(kallsyms.Lookup(0xffffff8fffffffffULL), "");
diff --git a/src/kernel_utils/syscall_table.cc b/src/kernel_utils/syscall_table.cc
index eae0c4e..40bb835 100644
--- a/src/kernel_utils/syscall_table.cc
+++ b/src/kernel_utils/syscall_table.cc
@@ -28,14 +28,11 @@
SyscallTable::SyscallTable(Architecture arch) {
switch (arch) {
- case Architecture::kArmEabi:
- *this = SyscallTable::Load<SyscallTable_armeabi>();
+ case Architecture::kArm64:
+ *this = SyscallTable::Load<SyscallTable_arm64>();
break;
- case Architecture::kAarch32:
- *this = SyscallTable::Load<SyscallTable_aarch32>();
- break;
- case Architecture::kAarch64:
- *this = SyscallTable::Load<SyscallTable_aarch64>();
+ case Architecture::kArm32:
+ *this = SyscallTable::Load<SyscallTable_arm32>();
break;
case Architecture::kX86_64:
*this = SyscallTable::Load<SyscallTable_x86_64>();
@@ -51,11 +48,10 @@
Architecture SyscallTable::ArchFromString(base::StringView machine) {
if (machine == "aarch64") {
- return Architecture::kAarch64;
- } else if (machine == "armv8l") {
- return Architecture::kArmEabi;
- } else if (machine == "armv7l") {
- return Architecture::kAarch32;
+ return Architecture::kArm64;
+ } else if (machine == "armv8l" || machine == "armv7l") {
+ // armv8l is a 32 bit userspace process on a 64 bit kernel
+ return Architecture::kArm32;
} else if (machine == "x86_64") {
return Architecture::kX86_64;
} else if (machine == "i686") {
diff --git a/src/kernel_utils/syscall_table.h b/src/kernel_utils/syscall_table.h
index c4fffe8..a80bc7b 100644
--- a/src/kernel_utils/syscall_table.h
+++ b/src/kernel_utils/syscall_table.h
@@ -29,9 +29,8 @@
enum class Architecture {
kUnknown = 0,
- kArmEabi, // 32-bit kernel running a 32-bit process (most old devices).
- kAarch32, // 64-bit kernel running a 32-bit process (should be rare).
- kAarch64, // 64-bit kernel running a 64-bit process (most new devices).
+ kArm64,
+ kArm32,
kX86_64,
kX86,
};
diff --git a/src/kernel_utils/syscall_table_generated.h b/src/kernel_utils/syscall_table_generated.h
index ea44edc..d49b2c3 100644
--- a/src/kernel_utils/syscall_table_generated.h
+++ b/src/kernel_utils/syscall_table_generated.h
@@ -30,6 +30,7 @@
"sys_bpf\0"
"sys_break\0"
"sys_brk\0"
+ "sys_cachestat\0"
"sys_capget\0"
"sys_capset\0"
"sys_chdir\0"
@@ -38,12 +39,19 @@
"sys_chown32\0"
"sys_chroot\0"
"sys_clock_adjtime\0"
+ "sys_clock_adjtime64\0"
"sys_clock_getres\0"
+ "sys_clock_getres_time64\0"
"sys_clock_gettime\0"
+ "sys_clock_gettime64\0"
"sys_clock_nanosleep\0"
+ "sys_clock_nanosleep_time64\0"
"sys_clock_settime\0"
+ "sys_clock_settime64\0"
"sys_clone\0"
+ "sys_clone3\0"
"sys_close\0"
+ "sys_close_range\0"
"sys_connect\0"
"sys_copy_file_range\0"
"sys_creat\0"
@@ -57,6 +65,7 @@
"sys_epoll_ctl\0"
"sys_epoll_ctl_old\0"
"sys_epoll_pwait\0"
+ "sys_epoll_pwait2\0"
"sys_epoll_wait\0"
"sys_epoll_wait_old\0"
"sys_eventfd\0"
@@ -66,6 +75,7 @@
"sys_exit\0"
"sys_exit_group\0"
"sys_faccessat\0"
+ "sys_faccessat2\0"
"sys_fadvise64\0"
"sys_fadvise64_64\0"
"sys_fallocate\0"
@@ -74,6 +84,7 @@
"sys_fchdir\0"
"sys_fchmod\0"
"sys_fchmodat\0"
+ "sys_fchmodat2\0"
"sys_fchown\0"
"sys_fchown32\0"
"sys_fchownat\0"
@@ -86,7 +97,11 @@
"sys_flock\0"
"sys_fork\0"
"sys_fremovexattr\0"
+ "sys_fsconfig\0"
"sys_fsetxattr\0"
+ "sys_fsmount\0"
+ "sys_fsopen\0"
+ "sys_fspick\0"
"sys_fstat\0"
"sys_fstat64\0"
"sys_fstatat\0"
@@ -98,6 +113,11 @@
"sys_ftruncate\0"
"sys_ftruncate64\0"
"sys_futex\0"
+ "sys_futex_requeue\0"
+ "sys_futex_time64\0"
+ "sys_futex_wait\0"
+ "sys_futex_waitv\0"
+ "sys_futex_wake\0"
"sys_futimesat\0"
"sys_get_kernel_syms\0"
"sys_get_mempolicy\0"
@@ -149,8 +169,12 @@
"sys_io_destroy\0"
"sys_io_getevents\0"
"sys_io_pgetevents\0"
+ "sys_io_pgetevents_time64\0"
"sys_io_setup\0"
"sys_io_submit\0"
+ "sys_io_uring_enter\0"
+ "sys_io_uring_register\0"
+ "sys_io_uring_setup\0"
"sys_ioctl\0"
"sys_ioperm\0"
"sys_iopl\0"
@@ -162,6 +186,9 @@
"sys_kexec_load\0"
"sys_keyctl\0"
"sys_kill\0"
+ "sys_landlock_add_rule\0"
+ "sys_landlock_create_ruleset\0"
+ "sys_landlock_restrict_self\0"
"sys_lchown\0"
"sys_lchown32\0"
"sys_lgetxattr\0"
@@ -178,9 +205,11 @@
"sys_lstat\0"
"sys_lstat64\0"
"sys_madvise\0"
+ "sys_map_shadow_stack\0"
"sys_mbind\0"
"sys_membarrier\0"
"sys_memfd_create\0"
+ "sys_memfd_secret\0"
"sys_migrate_pages\0"
"sys_mincore\0"
"sys_mkdir\0"
@@ -194,6 +223,8 @@
"sys_mmap2\0"
"sys_modify_ldt\0"
"sys_mount\0"
+ "sys_mount_setattr\0"
+ "sys_move_mount\0"
"sys_move_pages\0"
"sys_mprotect\0"
"sys_mpx\0"
@@ -201,7 +232,9 @@
"sys_mq_notify\0"
"sys_mq_open\0"
"sys_mq_timedreceive\0"
+ "sys_mq_timedreceive_time64\0"
"sys_mq_timedsend\0"
+ "sys_mq_timedsend_time64\0"
"sys_mq_unlink\0"
"sys_mremap\0"
"sys_msgctl\0"
@@ -224,13 +257,18 @@
"sys_olduname\0"
"sys_open\0"
"sys_open_by_handle_at\0"
+ "sys_open_tree\0"
"sys_openat\0"
+ "sys_openat2\0"
"sys_pause\0"
"sys_pciconfig_iobase\0"
"sys_pciconfig_read\0"
"sys_pciconfig_write\0"
"sys_perf_event_open\0"
"sys_personality\0"
+ "sys_pidfd_getfd\0"
+ "sys_pidfd_open\0"
+ "sys_pidfd_send_signal\0"
"sys_pipe\0"
"sys_pipe2\0"
"sys_pivot_root\0"
@@ -239,16 +277,20 @@
"sys_pkey_mprotect\0"
"sys_poll\0"
"sys_ppoll\0"
+ "sys_ppoll_time64\0"
"sys_prctl\0"
"sys_pread64\0"
"sys_preadv\0"
"sys_preadv2\0"
"sys_prlimit64\0"
+ "sys_process_madvise\0"
+ "sys_process_mrelease\0"
"sys_process_vm_readv\0"
"sys_process_vm_writev\0"
"sys_prof\0"
"sys_profil\0"
"sys_pselect6\0"
+ "sys_pselect6_time64\0"
"sys_ptrace\0"
"sys_putpmsg\0"
"sys_pwrite64\0"
@@ -256,6 +298,7 @@
"sys_pwritev2\0"
"sys_query_module\0"
"sys_quotactl\0"
+ "sys_quotactl_fd\0"
"sys_read\0"
"sys_readahead\0"
"sys_readdir\0"
@@ -266,6 +309,7 @@
"sys_recv\0"
"sys_recvfrom\0"
"sys_recvmmsg\0"
+ "sys_recvmmsg_time64\0"
"sys_recvmsg\0"
"sys_remap_file_pages\0"
"sys_removexattr\0"
@@ -283,6 +327,7 @@
"sys_rt_sigreturn\0"
"sys_rt_sigsuspend\0"
"sys_rt_sigtimedwait\0"
+ "sys_rt_sigtimedwait_time64\0"
"sys_rt_tgsigqueueinfo\0"
"sys_sched_get_priority_max\0"
"sys_sched_get_priority_min\0"
@@ -291,6 +336,7 @@
"sys_sched_getparam\0"
"sys_sched_getscheduler\0"
"sys_sched_rr_get_interval\0"
+ "sys_sched_rr_get_interval_time64\0"
"sys_sched_setaffinity\0"
"sys_sched_setattr\0"
"sys_sched_setparam\0"
@@ -303,6 +349,7 @@
"sys_semget\0"
"sys_semop\0"
"sys_semtimedop\0"
+ "sys_semtimedop_time64\0"
"sys_send\0"
"sys_sendfile\0"
"sys_sendfile64\0"
@@ -310,6 +357,7 @@
"sys_sendmsg\0"
"sys_sendto\0"
"sys_set_mempolicy\0"
+ "sys_set_mempolicy_home_node\0"
"sys_set_robust_list\0"
"sys_set_thread_area\0"
"sys_set_tid_address\0"
@@ -375,7 +423,6 @@
"sys_symlinkat\0"
"sys_sync\0"
"sys_sync_file_range\0"
- "sys_sync_file_range2\0"
"sys_syncfs\0"
"sys_syscall\0"
"sys_sysfs\0"
@@ -388,10 +435,14 @@
"sys_timer_delete\0"
"sys_timer_getoverrun\0"
"sys_timer_gettime\0"
+ "sys_timer_gettime64\0"
"sys_timer_settime\0"
+ "sys_timer_settime64\0"
"sys_timerfd_create\0"
"sys_timerfd_gettime\0"
+ "sys_timerfd_gettime64\0"
"sys_timerfd_settime\0"
+ "sys_timerfd_settime64\0"
"sys_times\0"
"sys_tkill\0"
"sys_truncate\0"
@@ -411,6 +462,7 @@
"sys_ustat\0"
"sys_utime\0"
"sys_utimensat\0"
+ "sys_utimensat_time64\0"
"sys_utimes\0"
"sys_vfork\0"
"sys_vhangup\0"
@@ -424,658 +476,253 @@
"sys_write\0"
"sys_writev\0";
-struct SyscallTable_aarch32 {
+struct SyscallTable_arm64 {
static constexpr const char* names = kAllSyscalllNames;
static constexpr SyscallTable::OffT offsets[]{
- 3544, // 0: sys_restart_syscall
- 723, // 1: sys_exit
- 1006, // 2: sys_fork
- 3322, // 3: sys_read
- 5639, // 4: sys_write
- 2848, // 5: sys_open
- 443, // 6: sys_close
- 0, // 7:
- 485, // 8: sys_creat
- 2115, // 9: sys_link
- 5430, // 10: sys_unlink
- 699, // 11: sys_execve
- 289, // 12: sys_chdir
- 0, // 13:
- 2372, // 14: sys_mknod
- 299, // 15: sys_chmod
- 2077, // 16: sys_lchown
- 0, // 17:
- 0, // 18:
- 2220, // 19: sys_lseek
- 1482, // 20: sys_getpid
- 2462, // 21: sys_mount
- 0, // 22:
- 4597, // 23: sys_setuid
- 1705, // 24: sys_getuid
- 0, // 25:
- 3231, // 26: sys_ptrace
- 0, // 27:
- 0, // 28:
- 2890, // 29: sys_pause
- 0, // 30:
- 0, // 31:
- 0, // 32:
- 63, // 33: sys_access
- 2772, // 34: sys_nice
- 0, // 35:
- 5017, // 36: sys_sync
- 2068, // 37: sys_kill
- 3490, // 38: sys_rename
- 2350, // 39: sys_mkdir
- 3564, // 40: sys_rmdir
- 531, // 41: sys_dup
- 2996, // 42: sys_pipe
- 5301, // 43: sys_times
- 0, // 44:
- 259, // 45: sys_brk
- 4302, // 46: sys_setgid
- 1374, // 47: sys_getgid
- 0, // 48:
- 1348, // 49: sys_geteuid
- 1322, // 50: sys_getegid
- 74, // 51: sys_acct
- 5408, // 52: sys_umount2
- 0, // 53:
- 1945, // 54: sys_ioctl
- 914, // 55: sys_fcntl
- 0, // 56:
- 4396, // 57: sys_setpgid
- 0, // 58:
- 0, // 59:
- 5387, // 60: sys_umask
- 331, // 61: sys_chroot
- 5493, // 62: sys_ustat
- 539, // 63: sys_dup2
- 1505, // 64: sys_getppid
- 1470, // 65: sys_getpgrp
- 4554, // 66: sys_setsid
- 4702, // 67: sys_sigaction
- 0, // 68:
- 0, // 69:
- 4512, // 70: sys_setreuid
- 4424, // 71: sys_setregid
- 4815, // 72: sys_sigsuspend
- 4770, // 73: sys_sigpending
- 4356, // 74: sys_sethostname
- 4540, // 75: sys_setrlimit
- 0, // 76:
- 1621, // 77: sys_getrusage
- 1688, // 78: sys_gettimeofday
- 4580, // 79: sys_settimeofday
- 1398, // 80: sys_getgroups
- 4326, // 81: sys_setgroups
- 0, // 82:
- 4991, // 83: sys_symlink
- 0, // 84:
- 3357, // 85: sys_readlink
- 5466, // 86: sys_uselib
- 4980, // 87: sys_swapon
- 3395, // 88: sys_reboot
- 0, // 89:
- 0, // 90:
- 2695, // 91: sys_munmap
- 5321, // 92: sys_truncate
- 1140, // 93: sys_ftruncate
- 853, // 94: sys_fchmod
- 877, // 95: sys_fchown
- 1517, // 96: sys_getpriority
- 4408, // 97: sys_setpriority
- 0, // 98:
- 4915, // 99: sys_statfs
- 1094, // 100: sys_fstatfs
- 0, // 101:
- 0, // 102:
- 5112, // 103: sys_syslog
- 4372, // 104: sys_setitimer
- 1428, // 105: sys_getitimer
- 4895, // 106: sys_stat
- 2244, // 107: sys_lstat
- 1046, // 108: sys_fstat
- 0, // 109:
- 0, // 110:
- 5548, // 111: sys_vhangup
- 0, // 112:
- 0, // 113:
- 5606, // 114: sys_wait4
- 4968, // 115: sys_swapoff
- 5100, // 116: sys_sysinfo
- 0, // 117:
- 1120, // 118: sys_fsync
- 4801, // 119: sys_sigreturn
- 433, // 120: sys_clone
- 4228, // 121: sys_setdomainname
- 5420, // 122: sys_uname
- 0, // 123:
- 95, // 124: sys_adjtimex
- 2487, // 125: sys_mprotect
- 4785, // 126: sys_sigprocmask
- 0, // 127:
- 1760, // 128: sys_init_module
- 513, // 129: sys_delete_module
- 0, // 130:
- 3309, // 131: sys_quotactl
- 1458, // 132: sys_getpgid
- 842, // 133: sys_fchdir
- 220, // 134: sys_bdflush
- 5090, // 135: sys_sysfs
- 2980, // 136: sys_personality
- 0, // 137:
- 4274, // 138: sys_setfsuid
- 4246, // 139: sys_setfsgid
- 1, // 140: sys__llseek
- 1294, // 141: sys_getdents
- 13, // 142: sys__newselect
- 996, // 143: sys_flock
- 2658, // 144: sys_msync
- 3385, // 145: sys_readv
- 5649, // 146: sys_writev
- 1635, // 147: sys_getsid
- 936, // 148: sys_fdatasync
- 28, // 149: sys__sysctl
- 2394, // 150: sys_mlock
- 2668, // 151: sys_munlock
- 2415, // 152: sys_mlockall
- 2680, // 153: sys_munlockall
- 3936, // 154: sys_sched_setparam
- 3828, // 155: sys_sched_getparam
- 3955, // 156: sys_sched_setscheduler
- 3847, // 157: sys_sched_getscheduler
- 3978, // 158: sys_sched_yield
- 3734, // 159: sys_sched_get_priority_max
- 3761, // 160: sys_sched_get_priority_min
- 3870, // 161: sys_sched_rr_get_interval
- 2728, // 162: sys_nanosleep
- 2603, // 163: sys_mremap
- 4482, // 164: sys_setresuid
- 1577, // 165: sys_getresuid
- 0, // 166:
- 0, // 167:
- 3077, // 168: sys_poll
- 2757, // 169: sys_nfsservctl
- 4452, // 170: sys_setresgid
- 1547, // 171: sys_getresgid
- 3096, // 172: sys_prctl
- 3657, // 173: sys_rt_sigreturn
- 3583, // 174: sys_rt_sigaction
- 3618, // 175: sys_rt_sigprocmask
- 3600, // 176: sys_rt_sigpending
- 3692, // 177: sys_rt_sigtimedwait
- 3637, // 178: sys_rt_sigqueueinfo
- 3674, // 179: sys_rt_sigsuspend
- 3106, // 180: sys_pread64
- 3254, // 181: sys_pwrite64
- 309, // 182: sys_chown
- 1283, // 183: sys_getcwd
- 267, // 184: sys_capget
- 278, // 185: sys_capset
- 4716, // 186: sys_sigaltstack
- 4086, // 187: sys_sendfile
- 0, // 188:
- 0, // 189:
- 5538, // 190: sys_vfork
- 0, // 191:
- 2437, // 192: sys_mmap2
- 5334, // 193: sys_truncate64
- 1154, // 194: sys_ftruncate64
- 4904, // 195: sys_stat64
- 2254, // 196: sys_lstat64
- 1056, // 197: sys_fstat64
- 2088, // 198: sys_lchown32
- 1716, // 199: sys_getuid32
- 1385, // 200: sys_getgid32
- 1360, // 201: sys_geteuid32
- 1334, // 202: sys_getegid32
- 4525, // 203: sys_setreuid32
- 4437, // 204: sys_setregid32
- 1412, // 205: sys_getgroups32
- 4340, // 206: sys_setgroups32
- 888, // 207: sys_fchown32
- 4496, // 208: sys_setresuid32
- 1591, // 209: sys_getresuid32
- 4466, // 210: sys_setresgid32
- 1561, // 211: sys_getresgid32
- 319, // 212: sys_chown32
- 4608, // 213: sys_setuid32
- 4313, // 214: sys_setgid32
- 4287, // 215: sys_setfsuid32
- 4259, // 216: sys_setfsgid32
- 1307, // 217: sys_getdents64
- 3015, // 218: sys_pivot_root
- 2338, // 219: sys_mincore
- 2266, // 220: sys_madvise
- 924, // 221: sys_fcntl64
- 0, // 222:
- 0, // 223:
- 1677, // 224: sys_gettid
- 3331, // 225: sys_readahead
- 4621, // 226: sys_setxattr
- 2230, // 227: sys_lsetxattr
- 1032, // 228: sys_fsetxattr
- 1729, // 229: sys_getxattr
- 2101, // 230: sys_lgetxattr
- 950, // 231: sys_fgetxattr
- 2146, // 232: sys_listxattr
- 2160, // 233: sys_llistxattr
- 981, // 234: sys_flistxattr
- 3474, // 235: sys_removexattr
- 2203, // 236: sys_lremovexattr
- 1015, // 237: sys_fremovexattr
- 5311, // 238: sys_tkill
- 4099, // 239: sys_sendfile64
- 1170, // 240: sys_futex
- 3896, // 241: sys_sched_setaffinity
- 3788, // 242: sys_sched_getaffinity
- 1918, // 243: sys_io_setup
- 1868, // 244: sys_io_destroy
- 1883, // 245: sys_io_getevents
- 1931, // 246: sys_io_submit
- 1854, // 247: sys_io_cancel
- 732, // 248: sys_exit_group
- 2184, // 249: sys_lookup_dcookie
- 557, // 250: sys_epoll_create
- 592, // 251: sys_epoll_ctl
- 640, // 252: sys_epoll_wait
- 3453, // 253: sys_remap_file_pages
- 0, // 254:
- 0, // 255:
- 4208, // 256: sys_set_tid_address
- 5151, // 257: sys_timer_create
- 5224, // 258: sys_timer_settime
- 5206, // 259: sys_timer_gettime
- 5185, // 260: sys_timer_getoverrun
- 5168, // 261: sys_timer_delete
- 415, // 262: sys_clock_settime
- 377, // 263: sys_clock_gettime
- 360, // 264: sys_clock_getres
- 395, // 265: sys_clock_nanosleep
- 4926, // 266: sys_statfs64
- 1106, // 267: sys_fstatfs64
- 5131, // 268: sys_tgkill
- 5527, // 269: sys_utimes
- 175, // 270: sys_arm_fadvise64_64
- 2900, // 271: sys_pciconfig_iobase
- 2921, // 272: sys_pciconfig_read
- 2940, // 273: sys_pciconfig_write
- 2540, // 274: sys_mq_open
- 2589, // 275: sys_mq_unlink
- 2572, // 276: sys_mq_timedsend
- 2552, // 277: sys_mq_timedreceive
- 2526, // 278: sys_mq_notify
- 2508, // 279: sys_mq_getsetattr
- 5616, // 280: sys_waitid
- 4830, // 281: sys_socket
- 232, // 282: sys_bind
- 453, // 283: sys_connect
- 2135, // 284: sys_listen
- 40, // 285: sys_accept
- 1646, // 286: sys_getsockname
- 1442, // 287: sys_getpeername
- 4856, // 288: sys_socketpair
- 4077, // 289: sys_send
- 4139, // 290: sys_sendto
- 3406, // 291: sys_recv
- 3415, // 292: sys_recvfrom
- 4689, // 293: sys_shutdown
- 4565, // 294: sys_setsockopt
- 1662, // 295: sys_getsockopt
- 4127, // 296: sys_sendmsg
- 3441, // 297: sys_recvmsg
- 4052, // 298: sys_semop
- 4041, // 299: sys_semget
- 4030, // 300: sys_semctl
- 2647, // 301: sys_msgsnd
- 2636, // 302: sys_msgrcv
- 2625, // 303: sys_msgget
- 2614, // 304: sys_msgctl
- 4647, // 305: sys_shmat
- 4668, // 306: sys_shmdt
- 4678, // 307: sys_shmget
- 4657, // 308: sys_shmctl
- 83, // 309: sys_add_key
- 3528, // 310: sys_request_key
- 2057, // 311: sys_keyctl
- 4062, // 312: sys_semtimedop
- 5594, // 313: sys_vserver
- 1990, // 314: sys_ioprio_set
- 1975, // 315: sys_ioprio_get
- 1798, // 316: sys_inotify_init
- 1776, // 317: sys_inotify_add_watch
- 1833, // 318: sys_inotify_rm_watch
- 2278, // 319: sys_mbind
- 1214, // 320: sys_get_mempolicy
- 4150, // 321: sys_set_mempolicy
- 2879, // 322: sys_openat
- 2360, // 323: sys_mkdirat
- 2382, // 324: sys_mknodat
- 901, // 325: sys_fchownat
- 1180, // 326: sys_futimesat
- 1080, // 327: sys_fstatat64
- 5441, // 328: sys_unlinkat
- 3501, // 329: sys_renameat
- 2124, // 330: sys_linkat
- 5003, // 331: sys_symlinkat
- 3370, // 332: sys_readlinkat
- 864, // 333: sys_fchmodat
- 747, // 334: sys_faccessat
- 3218, // 335: sys_pselect6
- 3086, // 336: sys_ppoll
- 5454, // 337: sys_unshare
- 4168, // 338: sys_set_robust_list
- 1232, // 339: sys_get_robust_list
- 4871, // 340: sys_splice
- 5046, // 341: sys_sync_file_range2
- 5123, // 342: sys_tee
- 5581, // 343: sys_vmsplice
- 2472, // 344: sys_move_pages
- 1272, // 345: sys_getcpu
- 624, // 346: sys_epoll_pwait
- 2042, // 347: sys_kexec_load
- 5513, // 348: sys_utimensat
- 4743, // 349: sys_signalfd
- 5242, // 350: sys_timerfd_create
- 674, // 351: sys_eventfd
- 792, // 352: sys_fallocate
- 5281, // 353: sys_timerfd_settime
- 5261, // 354: sys_timerfd_gettime
- 4756, // 355: sys_signalfd4
- 686, // 356: sys_eventfd2
- 574, // 357: sys_epoll_create1
- 548, // 358: sys_dup3
- 3005, // 359: sys_pipe2
- 1815, // 360: sys_inotify_init1
- 3118, // 361: sys_preadv
- 3267, // 362: sys_pwritev
- 3712, // 363: sys_rt_tgsigqueueinfo
- 2960, // 364: sys_perf_event_open
- 3428, // 365: sys_recvmmsg
- 51, // 366: sys_accept4
- 806, // 367: sys_fanotify_init
- 824, // 368: sys_fanotify_mark
- 3141, // 369: sys_prlimit64
- 2706, // 370: sys_name_to_handle_at
- 2857, // 371: sys_open_by_handle_at
- 342, // 372: sys_clock_adjtime
- 5067, // 373: sys_syncfs
- 4114, // 374: sys_sendmmsg
- 4386, // 375: sys_setns
- 3155, // 376: sys_process_vm_readv
- 3176, // 377: sys_process_vm_writev
- 2013, // 378: sys_kcmp
- 964, // 379: sys_finit_module
- 3918, // 380: sys_sched_setattr
- 3810, // 381: sys_sched_getattr
- 3514, // 382: sys_renameat2
- 3994, // 383: sys_seccomp
- 1533, // 384: sys_getrandom
- 2303, // 385: sys_memfd_create
- 241, // 386: sys_bpf
- 710, // 387: sys_execveat
- 5477, // 388: sys_userfaultfd
- 2288, // 389: sys_membarrier
- 2404, // 390: sys_mlock2
- 465, // 391: sys_copy_file_range
- 3129, // 392: sys_preadv2
- 3279, // 393: sys_pwritev2
- 3059, // 394: sys_pkey_mprotect
- 3030, // 395: sys_pkey_alloc
- 3045, // 396: sys_pkey_free
- 4939, // 397: sys_statx
- 3574, // 398: sys_rseq
- };
-};
-
-struct SyscallTable_aarch64 {
- static constexpr const char* names = kAllSyscalllNames;
- static constexpr SyscallTable::OffT offsets[]{
- 1918, // 0: sys_io_setup
- 1868, // 1: sys_io_destroy
- 1931, // 2: sys_io_submit
- 1854, // 3: sys_io_cancel
- 1883, // 4: sys_io_getevents
- 4621, // 5: sys_setxattr
- 2230, // 6: sys_lsetxattr
- 1032, // 7: sys_fsetxattr
- 1729, // 8: sys_getxattr
- 2101, // 9: sys_lgetxattr
- 950, // 10: sys_fgetxattr
- 2146, // 11: sys_listxattr
- 2160, // 12: sys_llistxattr
- 981, // 13: sys_flistxattr
- 3474, // 14: sys_removexattr
- 2203, // 15: sys_lremovexattr
- 1015, // 16: sys_fremovexattr
- 1283, // 17: sys_getcwd
- 2184, // 18: sys_lookup_dcookie
- 686, // 19: sys_eventfd2
- 574, // 20: sys_epoll_create1
- 592, // 21: sys_epoll_ctl
- 624, // 22: sys_epoll_pwait
- 531, // 23: sys_dup
- 548, // 24: sys_dup3
- 914, // 25: sys_fcntl
- 1815, // 26: sys_inotify_init1
- 1776, // 27: sys_inotify_add_watch
- 1833, // 28: sys_inotify_rm_watch
- 1945, // 29: sys_ioctl
- 1990, // 30: sys_ioprio_set
- 1975, // 31: sys_ioprio_get
- 996, // 32: sys_flock
- 2382, // 33: sys_mknodat
- 2360, // 34: sys_mkdirat
- 5441, // 35: sys_unlinkat
- 5003, // 36: sys_symlinkat
- 2124, // 37: sys_linkat
- 3501, // 38: sys_renameat
- 5408, // 39: sys_umount2
- 2462, // 40: sys_mount
- 3015, // 41: sys_pivot_root
- 2757, // 42: sys_nfsservctl
- 4915, // 43: sys_statfs
- 1094, // 44: sys_fstatfs
- 5321, // 45: sys_truncate
- 1140, // 46: sys_ftruncate
- 792, // 47: sys_fallocate
- 747, // 48: sys_faccessat
- 289, // 49: sys_chdir
- 842, // 50: sys_fchdir
- 331, // 51: sys_chroot
- 853, // 52: sys_fchmod
- 864, // 53: sys_fchmodat
- 901, // 54: sys_fchownat
- 877, // 55: sys_fchown
- 2879, // 56: sys_openat
- 443, // 57: sys_close
- 5548, // 58: sys_vhangup
- 3005, // 59: sys_pipe2
- 3309, // 60: sys_quotactl
- 1307, // 61: sys_getdents64
- 2220, // 62: sys_lseek
- 3322, // 63: sys_read
- 5639, // 64: sys_write
- 3385, // 65: sys_readv
- 5649, // 66: sys_writev
- 3106, // 67: sys_pread64
- 3254, // 68: sys_pwrite64
- 3118, // 69: sys_preadv
- 3267, // 70: sys_pwritev
- 4086, // 71: sys_sendfile
- 3218, // 72: sys_pselect6
- 3086, // 73: sys_ppoll
- 4756, // 74: sys_signalfd4
- 5581, // 75: sys_vmsplice
- 4871, // 76: sys_splice
- 5123, // 77: sys_tee
- 3370, // 78: sys_readlinkat
- 1068, // 79: sys_fstatat
- 1046, // 80: sys_fstat
- 5017, // 81: sys_sync
- 1120, // 82: sys_fsync
- 936, // 83: sys_fdatasync
- 5026, // 84: sys_sync_file_range
- 5242, // 85: sys_timerfd_create
- 5281, // 86: sys_timerfd_settime
- 5261, // 87: sys_timerfd_gettime
- 5513, // 88: sys_utimensat
+ 2269, // 0: sys_io_setup
+ 2194, // 1: sys_io_destroy
+ 2282, // 2: sys_io_submit
+ 2180, // 3: sys_io_cancel
+ 2209, // 4: sys_io_getevents
+ 5534, // 5: sys_setxattr
+ 2718, // 6: sys_lsetxattr
+ 1243, // 7: sys_fsetxattr
+ 2055, // 8: sys_getxattr
+ 2589, // 9: sys_lgetxattr
+ 1148, // 10: sys_fgetxattr
+ 2634, // 11: sys_listxattr
+ 2648, // 12: sys_llistxattr
+ 1179, // 13: sys_flistxattr
+ 4277, // 14: sys_removexattr
+ 2691, // 15: sys_lremovexattr
+ 1213, // 16: sys_fremovexattr
+ 1609, // 17: sys_getcwd
+ 2672, // 18: sys_lookup_dcookie
+ 855, // 19: sys_eventfd2
+ 726, // 20: sys_epoll_create1
+ 744, // 21: sys_epoll_ctl
+ 776, // 22: sys_epoll_pwait
+ 683, // 23: sys_dup
+ 700, // 24: sys_dup3
+ 1112, // 25: sys_fcntl
+ 2141, // 26: sys_inotify_init1
+ 2102, // 27: sys_inotify_add_watch
+ 2159, // 28: sys_inotify_rm_watch
+ 2356, // 29: sys_ioctl
+ 2401, // 30: sys_ioprio_set
+ 2386, // 31: sys_ioprio_get
+ 1194, // 32: sys_flock
+ 2908, // 33: sys_mknodat
+ 2886, // 34: sys_mkdirat
+ 6417, // 35: sys_unlinkat
+ 5916, // 36: sys_symlinkat
+ 2612, // 37: sys_linkat
+ 4304, // 38: sys_renameat
+ 6384, // 39: sys_umount2
+ 2988, // 40: sys_mount
+ 3704, // 41: sys_pivot_root
+ 3367, // 42: sys_nfsservctl
+ 5828, // 43: sys_statfs
+ 1339, // 44: sys_fstatfs
+ 6297, // 45: sys_truncate
+ 1385, // 46: sys_ftruncate
+ 976, // 47: sys_fallocate
+ 916, // 48: sys_faccessat
+ 303, // 49: sys_chdir
+ 1026, // 50: sys_fchdir
+ 345, // 51: sys_chroot
+ 1037, // 52: sys_fchmod
+ 1048, // 53: sys_fchmodat
+ 1099, // 54: sys_fchownat
+ 1075, // 55: sys_fchown
+ 3503, // 56: sys_openat
+ 579, // 57: sys_close
+ 6545, // 58: sys_vhangup
+ 3694, // 59: sys_pipe2
+ 4076, // 60: sys_quotactl
+ 1633, // 61: sys_getdents64
+ 2708, // 62: sys_lseek
+ 4105, // 63: sys_read
+ 6636, // 64: sys_write
+ 4168, // 65: sys_readv
+ 6646, // 66: sys_writev
+ 3812, // 67: sys_pread64
+ 4021, // 68: sys_pwrite64
+ 3824, // 69: sys_preadv
+ 4034, // 70: sys_pwritev
+ 4971, // 71: sys_sendfile
+ 3965, // 72: sys_pselect6
+ 3775, // 73: sys_ppoll
+ 5669, // 74: sys_signalfd4
+ 6578, // 75: sys_vmsplice
+ 5784, // 76: sys_splice
+ 6015, // 77: sys_tee
+ 4153, // 78: sys_readlinkat
+ 1313, // 79: sys_fstatat
+ 1291, // 80: sys_fstat
+ 5930, // 81: sys_sync
+ 1365, // 82: sys_fsync
+ 1134, // 83: sys_fdatasync
+ 5939, // 84: sys_sync_file_range
+ 6174, // 85: sys_timerfd_create
+ 6235, // 86: sys_timerfd_settime
+ 6193, // 87: sys_timerfd_gettime
+ 6489, // 88: sys_utimensat
74, // 89: sys_acct
- 267, // 90: sys_capget
- 278, // 91: sys_capset
- 2980, // 92: sys_personality
- 723, // 93: sys_exit
- 732, // 94: sys_exit_group
- 5616, // 95: sys_waitid
- 4208, // 96: sys_set_tid_address
- 5454, // 97: sys_unshare
- 1170, // 98: sys_futex
- 4168, // 99: sys_set_robust_list
- 1232, // 100: sys_get_robust_list
- 2728, // 101: sys_nanosleep
- 1428, // 102: sys_getitimer
- 4372, // 103: sys_setitimer
- 2042, // 104: sys_kexec_load
- 1760, // 105: sys_init_module
- 513, // 106: sys_delete_module
- 5151, // 107: sys_timer_create
- 5206, // 108: sys_timer_gettime
- 5185, // 109: sys_timer_getoverrun
- 5224, // 110: sys_timer_settime
- 5168, // 111: sys_timer_delete
- 415, // 112: sys_clock_settime
- 377, // 113: sys_clock_gettime
- 360, // 114: sys_clock_getres
- 395, // 115: sys_clock_nanosleep
- 5112, // 116: sys_syslog
- 3231, // 117: sys_ptrace
- 3936, // 118: sys_sched_setparam
- 3955, // 119: sys_sched_setscheduler
- 3847, // 120: sys_sched_getscheduler
- 3828, // 121: sys_sched_getparam
- 3896, // 122: sys_sched_setaffinity
- 3788, // 123: sys_sched_getaffinity
- 3978, // 124: sys_sched_yield
- 3734, // 125: sys_sched_get_priority_max
- 3761, // 126: sys_sched_get_priority_min
- 3870, // 127: sys_sched_rr_get_interval
- 3544, // 128: sys_restart_syscall
- 2068, // 129: sys_kill
- 5311, // 130: sys_tkill
- 5131, // 131: sys_tgkill
- 4716, // 132: sys_sigaltstack
- 3674, // 133: sys_rt_sigsuspend
- 3583, // 134: sys_rt_sigaction
- 3618, // 135: sys_rt_sigprocmask
- 3600, // 136: sys_rt_sigpending
- 3692, // 137: sys_rt_sigtimedwait
- 3637, // 138: sys_rt_sigqueueinfo
- 3657, // 139: sys_rt_sigreturn
- 4408, // 140: sys_setpriority
- 1517, // 141: sys_getpriority
- 3395, // 142: sys_reboot
- 4424, // 143: sys_setregid
- 4302, // 144: sys_setgid
- 4512, // 145: sys_setreuid
- 4597, // 146: sys_setuid
- 4482, // 147: sys_setresuid
- 1577, // 148: sys_getresuid
- 4452, // 149: sys_setresgid
- 1547, // 150: sys_getresgid
- 4274, // 151: sys_setfsuid
- 4246, // 152: sys_setfsgid
- 5301, // 153: sys_times
- 4396, // 154: sys_setpgid
- 1458, // 155: sys_getpgid
- 1635, // 156: sys_getsid
- 4554, // 157: sys_setsid
- 1398, // 158: sys_getgroups
- 4326, // 159: sys_setgroups
- 5420, // 160: sys_uname
- 4356, // 161: sys_sethostname
- 4228, // 162: sys_setdomainname
- 1607, // 163: sys_getrlimit
- 4540, // 164: sys_setrlimit
- 1621, // 165: sys_getrusage
- 5387, // 166: sys_umask
- 3096, // 167: sys_prctl
- 1272, // 168: sys_getcpu
- 1688, // 169: sys_gettimeofday
- 4580, // 170: sys_settimeofday
+ 281, // 90: sys_capget
+ 292, // 91: sys_capset
+ 3616, // 92: sys_personality
+ 892, // 93: sys_exit
+ 901, // 94: sys_exit_group
+ 6613, // 95: sys_waitid
+ 5121, // 96: sys_set_tid_address
+ 6430, // 97: sys_unshare
+ 1415, // 98: sys_futex
+ 5081, // 99: sys_set_robust_list
+ 1558, // 100: sys_get_robust_list
+ 3338, // 101: sys_nanosleep
+ 1754, // 102: sys_getitimer
+ 5285, // 103: sys_setitimer
+ 2453, // 104: sys_kexec_load
+ 2086, // 105: sys_init_module
+ 665, // 106: sys_delete_module
+ 6043, // 107: sys_timer_create
+ 6098, // 108: sys_timer_gettime
+ 6077, // 109: sys_timer_getoverrun
+ 6136, // 110: sys_timer_settime
+ 6060, // 111: sys_timer_delete
+ 520, // 112: sys_clock_settime
+ 435, // 113: sys_clock_gettime
+ 394, // 114: sys_clock_getres
+ 473, // 115: sys_clock_nanosleep
+ 6004, // 116: sys_syslog
+ 3998, // 117: sys_ptrace
+ 4799, // 118: sys_sched_setparam
+ 4818, // 119: sys_sched_setscheduler
+ 4677, // 120: sys_sched_getscheduler
+ 4658, // 121: sys_sched_getparam
+ 4759, // 122: sys_sched_setaffinity
+ 4618, // 123: sys_sched_getaffinity
+ 4841, // 124: sys_sched_yield
+ 4564, // 125: sys_sched_get_priority_max
+ 4591, // 126: sys_sched_get_priority_min
+ 4700, // 127: sys_sched_rr_get_interval
+ 4347, // 128: sys_restart_syscall
+ 2479, // 129: sys_kill
+ 6287, // 130: sys_tkill
+ 6023, // 131: sys_tgkill
+ 5629, // 132: sys_sigaltstack
+ 4477, // 133: sys_rt_sigsuspend
+ 4386, // 134: sys_rt_sigaction
+ 4421, // 135: sys_rt_sigprocmask
+ 4403, // 136: sys_rt_sigpending
+ 4495, // 137: sys_rt_sigtimedwait
+ 4440, // 138: sys_rt_sigqueueinfo
+ 4460, // 139: sys_rt_sigreturn
+ 5321, // 140: sys_setpriority
+ 1843, // 141: sys_getpriority
+ 4178, // 142: sys_reboot
+ 5337, // 143: sys_setregid
+ 5215, // 144: sys_setgid
+ 5425, // 145: sys_setreuid
+ 5510, // 146: sys_setuid
+ 5395, // 147: sys_setresuid
+ 1903, // 148: sys_getresuid
+ 5365, // 149: sys_setresgid
+ 1873, // 150: sys_getresgid
+ 5187, // 151: sys_setfsuid
+ 5159, // 152: sys_setfsgid
+ 6277, // 153: sys_times
+ 5309, // 154: sys_setpgid
+ 1784, // 155: sys_getpgid
+ 1961, // 156: sys_getsid
+ 5467, // 157: sys_setsid
+ 1724, // 158: sys_getgroups
+ 5239, // 159: sys_setgroups
+ 6396, // 160: sys_uname
+ 5269, // 161: sys_sethostname
+ 5141, // 162: sys_setdomainname
+ 1933, // 163: sys_getrlimit
+ 5453, // 164: sys_setrlimit
+ 1947, // 165: sys_getrusage
+ 6363, // 166: sys_umask
+ 3802, // 167: sys_prctl
+ 1598, // 168: sys_getcpu
+ 2014, // 169: sys_gettimeofday
+ 5493, // 170: sys_settimeofday
95, // 171: sys_adjtimex
- 1482, // 172: sys_getpid
- 1505, // 173: sys_getppid
- 1705, // 174: sys_getuid
- 1348, // 175: sys_geteuid
- 1374, // 176: sys_getgid
- 1322, // 177: sys_getegid
- 1677, // 178: sys_gettid
- 5100, // 179: sys_sysinfo
- 2540, // 180: sys_mq_open
- 2589, // 181: sys_mq_unlink
- 2572, // 182: sys_mq_timedsend
- 2552, // 183: sys_mq_timedreceive
- 2526, // 184: sys_mq_notify
- 2508, // 185: sys_mq_getsetattr
- 2625, // 186: sys_msgget
- 2614, // 187: sys_msgctl
- 2636, // 188: sys_msgrcv
- 2647, // 189: sys_msgsnd
- 4041, // 190: sys_semget
- 4030, // 191: sys_semctl
- 4062, // 192: sys_semtimedop
- 4052, // 193: sys_semop
- 4678, // 194: sys_shmget
- 4657, // 195: sys_shmctl
- 4647, // 196: sys_shmat
- 4668, // 197: sys_shmdt
- 4830, // 198: sys_socket
- 4856, // 199: sys_socketpair
+ 1808, // 172: sys_getpid
+ 1831, // 173: sys_getppid
+ 2031, // 174: sys_getuid
+ 1674, // 175: sys_geteuid
+ 1700, // 176: sys_getgid
+ 1648, // 177: sys_getegid
+ 2003, // 178: sys_gettid
+ 5992, // 179: sys_sysinfo
+ 3099, // 180: sys_mq_open
+ 3199, // 181: sys_mq_unlink
+ 3158, // 182: sys_mq_timedsend
+ 3111, // 183: sys_mq_timedreceive
+ 3085, // 184: sys_mq_notify
+ 3067, // 185: sys_mq_getsetattr
+ 3235, // 186: sys_msgget
+ 3224, // 187: sys_msgctl
+ 3246, // 188: sys_msgrcv
+ 3257, // 189: sys_msgsnd
+ 4904, // 190: sys_semget
+ 4893, // 191: sys_semctl
+ 4925, // 192: sys_semtimedop
+ 4915, // 193: sys_semop
+ 5591, // 194: sys_shmget
+ 5570, // 195: sys_shmctl
+ 5560, // 196: sys_shmat
+ 5581, // 197: sys_shmdt
+ 5743, // 198: sys_socket
+ 5769, // 199: sys_socketpair
232, // 200: sys_bind
- 2135, // 201: sys_listen
+ 2623, // 201: sys_listen
40, // 202: sys_accept
- 453, // 203: sys_connect
- 1646, // 204: sys_getsockname
- 1442, // 205: sys_getpeername
- 4139, // 206: sys_sendto
- 3415, // 207: sys_recvfrom
- 4565, // 208: sys_setsockopt
- 1662, // 209: sys_getsockopt
- 4689, // 210: sys_shutdown
- 4127, // 211: sys_sendmsg
- 3441, // 212: sys_recvmsg
- 3331, // 213: sys_readahead
+ 605, // 203: sys_connect
+ 1972, // 204: sys_getsockname
+ 1768, // 205: sys_getpeername
+ 5024, // 206: sys_sendto
+ 4198, // 207: sys_recvfrom
+ 5478, // 208: sys_setsockopt
+ 1988, // 209: sys_getsockopt
+ 5602, // 210: sys_shutdown
+ 5012, // 211: sys_sendmsg
+ 4244, // 212: sys_recvmsg
+ 4114, // 213: sys_readahead
259, // 214: sys_brk
- 2695, // 215: sys_munmap
- 2603, // 216: sys_mremap
+ 3305, // 215: sys_munmap
+ 3213, // 216: sys_mremap
83, // 217: sys_add_key
- 3528, // 218: sys_request_key
- 2057, // 219: sys_keyctl
- 433, // 220: sys_clone
- 699, // 221: sys_execve
- 2428, // 222: sys_mmap
- 761, // 223: sys_fadvise64
- 4980, // 224: sys_swapon
- 4968, // 225: sys_swapoff
- 2487, // 226: sys_mprotect
- 2658, // 227: sys_msync
- 2394, // 228: sys_mlock
- 2668, // 229: sys_munlock
- 2415, // 230: sys_mlockall
- 2680, // 231: sys_munlockall
- 2338, // 232: sys_mincore
- 2266, // 233: sys_madvise
- 3453, // 234: sys_remap_file_pages
- 2278, // 235: sys_mbind
- 1214, // 236: sys_get_mempolicy
- 4150, // 237: sys_set_mempolicy
- 2320, // 238: sys_migrate_pages
- 2472, // 239: sys_move_pages
- 3712, // 240: sys_rt_tgsigqueueinfo
- 2960, // 241: sys_perf_event_open
+ 4331, // 218: sys_request_key
+ 2468, // 219: sys_keyctl
+ 558, // 220: sys_clone
+ 868, // 221: sys_execve
+ 2954, // 222: sys_mmap
+ 945, // 223: sys_fadvise64
+ 5893, // 224: sys_swapon
+ 5881, // 225: sys_swapoff
+ 3046, // 226: sys_mprotect
+ 3268, // 227: sys_msync
+ 2920, // 228: sys_mlock
+ 3278, // 229: sys_munlock
+ 2941, // 230: sys_mlockall
+ 3290, // 231: sys_munlockall
+ 2864, // 232: sys_mincore
+ 2754, // 233: sys_madvise
+ 4256, // 234: sys_remap_file_pages
+ 2787, // 235: sys_mbind
+ 1540, // 236: sys_get_mempolicy
+ 5035, // 237: sys_set_mempolicy
+ 2846, // 238: sys_migrate_pages
+ 3031, // 239: sys_move_pages
+ 4542, // 240: sys_rt_tgsigqueueinfo
+ 3596, // 241: sys_perf_event_open
51, // 242: sys_accept4
- 3428, // 243: sys_recvmmsg
+ 4211, // 243: sys_recvmmsg
149, // 244: sys_arch_specific_syscall
0, // 245:
0, // 246:
@@ -1092,1180 +739,1470 @@
0, // 257:
0, // 258:
0, // 259:
- 5606, // 260: sys_wait4
- 3141, // 261: sys_prlimit64
- 806, // 262: sys_fanotify_init
- 824, // 263: sys_fanotify_mark
- 2706, // 264: sys_name_to_handle_at
- 2857, // 265: sys_open_by_handle_at
- 342, // 266: sys_clock_adjtime
- 5067, // 267: sys_syncfs
- 4386, // 268: sys_setns
- 4114, // 269: sys_sendmmsg
- 3155, // 270: sys_process_vm_readv
- 3176, // 271: sys_process_vm_writev
- 2013, // 272: sys_kcmp
- 964, // 273: sys_finit_module
- 3918, // 274: sys_sched_setattr
- 3810, // 275: sys_sched_getattr
- 3514, // 276: sys_renameat2
- 3994, // 277: sys_seccomp
- 1533, // 278: sys_getrandom
- 2303, // 279: sys_memfd_create
+ 6603, // 260: sys_wait4
+ 3847, // 261: sys_prlimit64
+ 990, // 262: sys_fanotify_init
+ 1008, // 263: sys_fanotify_mark
+ 3316, // 264: sys_name_to_handle_at
+ 3467, // 265: sys_open_by_handle_at
+ 356, // 266: sys_clock_adjtime
+ 5959, // 267: sys_syncfs
+ 5299, // 268: sys_setns
+ 4999, // 269: sys_sendmmsg
+ 3902, // 270: sys_process_vm_readv
+ 3923, // 271: sys_process_vm_writev
+ 2424, // 272: sys_kcmp
+ 1162, // 273: sys_finit_module
+ 4781, // 274: sys_sched_setattr
+ 4640, // 275: sys_sched_getattr
+ 4317, // 276: sys_renameat2
+ 4857, // 277: sys_seccomp
+ 1859, // 278: sys_getrandom
+ 2812, // 279: sys_memfd_create
241, // 280: sys_bpf
- 710, // 281: sys_execveat
- 5477, // 282: sys_userfaultfd
- 2288, // 283: sys_membarrier
- 2404, // 284: sys_mlock2
- 465, // 285: sys_copy_file_range
- 3129, // 286: sys_preadv2
- 3279, // 287: sys_pwritev2
- 3059, // 288: sys_pkey_mprotect
- 3030, // 289: sys_pkey_alloc
- 3045, // 290: sys_pkey_free
- 4939, // 291: sys_statx
- 1900, // 292: sys_io_pgetevents
- 3574, // 293: sys_rseq
+ 879, // 281: sys_execveat
+ 6453, // 282: sys_userfaultfd
+ 2797, // 283: sys_membarrier
+ 2930, // 284: sys_mlock2
+ 617, // 285: sys_copy_file_range
+ 3835, // 286: sys_preadv2
+ 4046, // 287: sys_pwritev2
+ 3748, // 288: sys_pkey_mprotect
+ 3719, // 289: sys_pkey_alloc
+ 3734, // 290: sys_pkey_free
+ 5852, // 291: sys_statx
+ 2226, // 292: sys_io_pgetevents
+ 4377, // 293: sys_rseq
+ 2433, // 294: sys_kexec_file_load
+ 0, // 295:
+ 0, // 296:
+ 0, // 297:
+ 0, // 298:
+ 0, // 299:
+ 0, // 300:
+ 0, // 301:
+ 0, // 302:
+ 0, // 303:
+ 0, // 304:
+ 0, // 305:
+ 0, // 306:
+ 0, // 307:
+ 0, // 308:
+ 0, // 309:
+ 0, // 310:
+ 0, // 311:
+ 0, // 312:
+ 0, // 313:
+ 0, // 314:
+ 0, // 315:
+ 0, // 316:
+ 0, // 317:
+ 0, // 318:
+ 0, // 319:
+ 0, // 320:
+ 0, // 321:
+ 0, // 322:
+ 0, // 323:
+ 0, // 324:
+ 0, // 325:
+ 0, // 326:
+ 0, // 327:
+ 0, // 328:
+ 0, // 329:
+ 0, // 330:
+ 0, // 331:
+ 0, // 332:
+ 0, // 333:
+ 0, // 334:
+ 0, // 335:
+ 0, // 336:
+ 0, // 337:
+ 0, // 338:
+ 0, // 339:
+ 0, // 340:
+ 0, // 341:
+ 0, // 342:
+ 0, // 343:
+ 0, // 344:
+ 0, // 345:
+ 0, // 346:
+ 0, // 347:
+ 0, // 348:
+ 0, // 349:
+ 0, // 350:
+ 0, // 351:
+ 0, // 352:
+ 0, // 353:
+ 0, // 354:
+ 0, // 355:
+ 0, // 356:
+ 0, // 357:
+ 0, // 358:
+ 0, // 359:
+ 0, // 360:
+ 0, // 361:
+ 0, // 362:
+ 0, // 363:
+ 0, // 364:
+ 0, // 365:
+ 0, // 366:
+ 0, // 367:
+ 0, // 368:
+ 0, // 369:
+ 0, // 370:
+ 0, // 371:
+ 0, // 372:
+ 0, // 373:
+ 0, // 374:
+ 0, // 375:
+ 0, // 376:
+ 0, // 377:
+ 0, // 378:
+ 0, // 379:
+ 0, // 380:
+ 0, // 381:
+ 0, // 382:
+ 0, // 383:
+ 0, // 384:
+ 0, // 385:
+ 0, // 386:
+ 0, // 387:
+ 0, // 388:
+ 0, // 389:
+ 0, // 390:
+ 0, // 391:
+ 0, // 392:
+ 0, // 393:
+ 0, // 394:
+ 0, // 395:
+ 0, // 396:
+ 0, // 397:
+ 0, // 398:
+ 0, // 399:
+ 0, // 400:
+ 0, // 401:
+ 0, // 402:
+ 453, // 403: sys_clock_gettime64
+ 538, // 404: sys_clock_settime64
+ 374, // 405: sys_clock_adjtime64
+ 411, // 406: sys_clock_getres_time64
+ 493, // 407: sys_clock_nanosleep_time64
+ 6116, // 408: sys_timer_gettime64
+ 6154, // 409: sys_timer_settime64
+ 6213, // 410: sys_timerfd_gettime64
+ 6255, // 411: sys_timerfd_settime64
+ 6503, // 412: sys_utimensat_time64
+ 3978, // 413: sys_pselect6_time64
+ 3785, // 414: sys_ppoll_time64
+ 0, // 415:
+ 2244, // 416: sys_io_pgetevents_time64
+ 4224, // 417: sys_recvmmsg_time64
+ 3175, // 418: sys_mq_timedsend_time64
+ 3131, // 419: sys_mq_timedreceive_time64
+ 4940, // 420: sys_semtimedop_time64
+ 4515, // 421: sys_rt_sigtimedwait_time64
+ 1443, // 422: sys_futex_time64
+ 4726, // 423: sys_sched_rr_get_interval_time64
+ 3663, // 424: sys_pidfd_send_signal
+ 2337, // 425: sys_io_uring_setup
+ 2296, // 426: sys_io_uring_enter
+ 2315, // 427: sys_io_uring_register
+ 3489, // 428: sys_open_tree
+ 3016, // 429: sys_move_mount
+ 1269, // 430: sys_fsopen
+ 1230, // 431: sys_fsconfig
+ 1257, // 432: sys_fsmount
+ 1280, // 433: sys_fspick
+ 3648, // 434: sys_pidfd_open
+ 568, // 435: sys_clone3
+ 589, // 436: sys_close_range
+ 3514, // 437: sys_openat2
+ 3632, // 438: sys_pidfd_getfd
+ 930, // 439: sys_faccessat2
+ 3861, // 440: sys_process_madvise
+ 792, // 441: sys_epoll_pwait2
+ 2998, // 442: sys_mount_setattr
+ 4089, // 443: sys_quotactl_fd
+ 2510, // 444: sys_landlock_create_ruleset
+ 2488, // 445: sys_landlock_add_rule
+ 2538, // 446: sys_landlock_restrict_self
+ 2829, // 447: sys_memfd_secret
+ 3881, // 448: sys_process_mrelease
+ 1475, // 449: sys_futex_waitv
+ 5053, // 450: sys_set_mempolicy_home_node
+ 267, // 451: sys_cachestat
+ 1061, // 452: sys_fchmodat2
+ 2766, // 453: sys_map_shadow_stack
+ 1491, // 454: sys_futex_wake
+ 1460, // 455: sys_futex_wait
+ 1425, // 456: sys_futex_requeue
};
};
-struct SyscallTable_armeabi {
+struct SyscallTable_arm32 {
static constexpr const char* names = kAllSyscalllNames;
static constexpr SyscallTable::OffT offsets[]{
- 3544, // 0: sys_restart_syscall
- 723, // 1: sys_exit
- 1006, // 2: sys_fork
- 3322, // 3: sys_read
- 5639, // 4: sys_write
- 2848, // 5: sys_open
- 443, // 6: sys_close
+ 4347, // 0: sys_restart_syscall
+ 892, // 1: sys_exit
+ 1204, // 2: sys_fork
+ 4105, // 3: sys_read
+ 6636, // 4: sys_write
+ 3458, // 5: sys_open
+ 579, // 6: sys_close
0, // 7:
- 485, // 8: sys_creat
- 2115, // 9: sys_link
- 5430, // 10: sys_unlink
- 699, // 11: sys_execve
- 289, // 12: sys_chdir
- 5142, // 13: sys_time
- 2372, // 14: sys_mknod
- 299, // 15: sys_chmod
- 2077, // 16: sys_lchown
+ 637, // 8: sys_creat
+ 2603, // 9: sys_link
+ 6406, // 10: sys_unlink
+ 868, // 11: sys_execve
+ 303, // 12: sys_chdir
+ 6034, // 13: sys_time
+ 2898, // 14: sys_mknod
+ 313, // 15: sys_chmod
+ 2565, // 16: sys_lchown
0, // 17:
0, // 18:
- 2220, // 19: sys_lseek
- 1482, // 20: sys_getpid
- 2462, // 21: sys_mount
- 5397, // 22: sys_umount
- 4597, // 23: sys_setuid
- 1705, // 24: sys_getuid
- 4949, // 25: sys_stime
- 3231, // 26: sys_ptrace
+ 2708, // 19: sys_lseek
+ 1808, // 20: sys_getpid
+ 2988, // 21: sys_mount
+ 6373, // 22: sys_umount
+ 5510, // 23: sys_setuid
+ 2031, // 24: sys_getuid
+ 5862, // 25: sys_stime
+ 3998, // 26: sys_ptrace
124, // 27: sys_alarm
0, // 28:
- 2890, // 29: sys_pause
- 5503, // 30: sys_utime
+ 3526, // 29: sys_pause
+ 6479, // 30: sys_utime
0, // 31:
0, // 32:
63, // 33: sys_access
- 2772, // 34: sys_nice
+ 3382, // 34: sys_nice
0, // 35:
- 5017, // 36: sys_sync
- 2068, // 37: sys_kill
- 3490, // 38: sys_rename
- 2350, // 39: sys_mkdir
- 3564, // 40: sys_rmdir
- 531, // 41: sys_dup
- 2996, // 42: sys_pipe
- 5301, // 43: sys_times
+ 5930, // 36: sys_sync
+ 2479, // 37: sys_kill
+ 4293, // 38: sys_rename
+ 2876, // 39: sys_mkdir
+ 4367, // 40: sys_rmdir
+ 683, // 41: sys_dup
+ 3685, // 42: sys_pipe
+ 6277, // 43: sys_times
0, // 44:
259, // 45: sys_brk
- 4302, // 46: sys_setgid
- 1374, // 47: sys_getgid
+ 5215, // 46: sys_setgid
+ 1700, // 47: sys_getgid
0, // 48:
- 1348, // 49: sys_geteuid
- 1322, // 50: sys_getegid
+ 1674, // 49: sys_geteuid
+ 1648, // 50: sys_getegid
74, // 51: sys_acct
- 5408, // 52: sys_umount2
+ 6384, // 52: sys_umount2
0, // 53:
- 1945, // 54: sys_ioctl
- 914, // 55: sys_fcntl
+ 2356, // 54: sys_ioctl
+ 1112, // 55: sys_fcntl
0, // 56:
- 4396, // 57: sys_setpgid
+ 5309, // 57: sys_setpgid
0, // 58:
0, // 59:
- 5387, // 60: sys_umask
- 331, // 61: sys_chroot
- 5493, // 62: sys_ustat
- 539, // 63: sys_dup2
- 1505, // 64: sys_getppid
- 1470, // 65: sys_getpgrp
- 4554, // 66: sys_setsid
- 4702, // 67: sys_sigaction
+ 6363, // 60: sys_umask
+ 345, // 61: sys_chroot
+ 6469, // 62: sys_ustat
+ 691, // 63: sys_dup2
+ 1831, // 64: sys_getppid
+ 1796, // 65: sys_getpgrp
+ 5467, // 66: sys_setsid
+ 5615, // 67: sys_sigaction
0, // 68:
0, // 69:
- 4512, // 70: sys_setreuid
- 4424, // 71: sys_setregid
- 4815, // 72: sys_sigsuspend
- 4770, // 73: sys_sigpending
- 4356, // 74: sys_sethostname
- 4540, // 75: sys_setrlimit
- 1607, // 76: sys_getrlimit
- 1621, // 77: sys_getrusage
- 1688, // 78: sys_gettimeofday
- 4580, // 79: sys_settimeofday
- 1398, // 80: sys_getgroups
- 4326, // 81: sys_setgroups
- 4019, // 82: sys_select
- 4991, // 83: sys_symlink
+ 5425, // 70: sys_setreuid
+ 5337, // 71: sys_setregid
+ 5728, // 72: sys_sigsuspend
+ 5683, // 73: sys_sigpending
+ 5269, // 74: sys_sethostname
+ 5453, // 75: sys_setrlimit
+ 1933, // 76: sys_getrlimit
+ 1947, // 77: sys_getrusage
+ 2014, // 78: sys_gettimeofday
+ 5493, // 79: sys_settimeofday
+ 1724, // 80: sys_getgroups
+ 5239, // 81: sys_setgroups
+ 4882, // 82: sys_select
+ 5904, // 83: sys_symlink
0, // 84:
- 3357, // 85: sys_readlink
- 5466, // 86: sys_uselib
- 4980, // 87: sys_swapon
- 3395, // 88: sys_reboot
- 3345, // 89: sys_readdir
- 2428, // 90: sys_mmap
- 2695, // 91: sys_munmap
- 5321, // 92: sys_truncate
- 1140, // 93: sys_ftruncate
- 853, // 94: sys_fchmod
- 877, // 95: sys_fchown
- 1517, // 96: sys_getpriority
- 4408, // 97: sys_setpriority
+ 4140, // 85: sys_readlink
+ 6442, // 86: sys_uselib
+ 5893, // 87: sys_swapon
+ 4178, // 88: sys_reboot
+ 4128, // 89: sys_readdir
+ 2954, // 90: sys_mmap
+ 3305, // 91: sys_munmap
+ 6297, // 92: sys_truncate
+ 1385, // 93: sys_ftruncate
+ 1037, // 94: sys_fchmod
+ 1075, // 95: sys_fchown
+ 1843, // 96: sys_getpriority
+ 5321, // 97: sys_setpriority
0, // 98:
- 4915, // 99: sys_statfs
- 1094, // 100: sys_fstatfs
+ 5828, // 99: sys_statfs
+ 1339, // 100: sys_fstatfs
0, // 101:
- 4841, // 102: sys_socketcall
- 5112, // 103: sys_syslog
- 4372, // 104: sys_setitimer
- 1428, // 105: sys_getitimer
- 4895, // 106: sys_stat
- 2244, // 107: sys_lstat
- 1046, // 108: sys_fstat
+ 5754, // 102: sys_socketcall
+ 6004, // 103: sys_syslog
+ 5285, // 104: sys_setitimer
+ 1754, // 105: sys_getitimer
+ 5808, // 106: sys_stat
+ 2732, // 107: sys_lstat
+ 1291, // 108: sys_fstat
0, // 109:
0, // 110:
- 5548, // 111: sys_vhangup
+ 6545, // 111: sys_vhangup
0, // 112:
- 5078, // 113: sys_syscall
- 5606, // 114: sys_wait4
- 4968, // 115: sys_swapoff
- 5100, // 116: sys_sysinfo
- 2005, // 117: sys_ipc
- 1120, // 118: sys_fsync
- 4801, // 119: sys_sigreturn
- 433, // 120: sys_clone
- 4228, // 121: sys_setdomainname
- 5420, // 122: sys_uname
+ 5970, // 113: sys_syscall
+ 6603, // 114: sys_wait4
+ 5881, // 115: sys_swapoff
+ 5992, // 116: sys_sysinfo
+ 2416, // 117: sys_ipc
+ 1365, // 118: sys_fsync
+ 5714, // 119: sys_sigreturn
+ 558, // 120: sys_clone
+ 5141, // 121: sys_setdomainname
+ 6396, // 122: sys_uname
0, // 123:
95, // 124: sys_adjtimex
- 2487, // 125: sys_mprotect
- 4785, // 126: sys_sigprocmask
+ 3046, // 125: sys_mprotect
+ 5698, // 126: sys_sigprocmask
0, // 127:
- 1760, // 128: sys_init_module
- 513, // 129: sys_delete_module
+ 2086, // 128: sys_init_module
+ 665, // 129: sys_delete_module
0, // 130:
- 3309, // 131: sys_quotactl
- 1458, // 132: sys_getpgid
- 842, // 133: sys_fchdir
+ 4076, // 131: sys_quotactl
+ 1784, // 132: sys_getpgid
+ 1026, // 133: sys_fchdir
220, // 134: sys_bdflush
- 5090, // 135: sys_sysfs
- 2980, // 136: sys_personality
+ 5982, // 135: sys_sysfs
+ 3616, // 136: sys_personality
0, // 137:
- 4274, // 138: sys_setfsuid
- 4246, // 139: sys_setfsgid
+ 5187, // 138: sys_setfsuid
+ 5159, // 139: sys_setfsgid
1, // 140: sys__llseek
- 1294, // 141: sys_getdents
+ 1620, // 141: sys_getdents
13, // 142: sys__newselect
- 996, // 143: sys_flock
- 2658, // 144: sys_msync
- 3385, // 145: sys_readv
- 5649, // 146: sys_writev
- 1635, // 147: sys_getsid
- 936, // 148: sys_fdatasync
+ 1194, // 143: sys_flock
+ 3268, // 144: sys_msync
+ 4168, // 145: sys_readv
+ 6646, // 146: sys_writev
+ 1961, // 147: sys_getsid
+ 1134, // 148: sys_fdatasync
28, // 149: sys__sysctl
- 2394, // 150: sys_mlock
- 2668, // 151: sys_munlock
- 2415, // 152: sys_mlockall
- 2680, // 153: sys_munlockall
- 3936, // 154: sys_sched_setparam
- 3828, // 155: sys_sched_getparam
- 3955, // 156: sys_sched_setscheduler
- 3847, // 157: sys_sched_getscheduler
- 3978, // 158: sys_sched_yield
- 3734, // 159: sys_sched_get_priority_max
- 3761, // 160: sys_sched_get_priority_min
- 3870, // 161: sys_sched_rr_get_interval
- 2728, // 162: sys_nanosleep
- 2603, // 163: sys_mremap
- 4482, // 164: sys_setresuid
- 1577, // 165: sys_getresuid
+ 2920, // 150: sys_mlock
+ 3278, // 151: sys_munlock
+ 2941, // 152: sys_mlockall
+ 3290, // 153: sys_munlockall
+ 4799, // 154: sys_sched_setparam
+ 4658, // 155: sys_sched_getparam
+ 4818, // 156: sys_sched_setscheduler
+ 4677, // 157: sys_sched_getscheduler
+ 4841, // 158: sys_sched_yield
+ 4564, // 159: sys_sched_get_priority_max
+ 4591, // 160: sys_sched_get_priority_min
+ 4700, // 161: sys_sched_rr_get_interval
+ 3338, // 162: sys_nanosleep
+ 3213, // 163: sys_mremap
+ 5395, // 164: sys_setresuid
+ 1903, // 165: sys_getresuid
0, // 166:
0, // 167:
- 3077, // 168: sys_poll
- 2757, // 169: sys_nfsservctl
- 4452, // 170: sys_setresgid
- 1547, // 171: sys_getresgid
- 3096, // 172: sys_prctl
- 3657, // 173: sys_rt_sigreturn
- 3583, // 174: sys_rt_sigaction
- 3618, // 175: sys_rt_sigprocmask
- 3600, // 176: sys_rt_sigpending
- 3692, // 177: sys_rt_sigtimedwait
- 3637, // 178: sys_rt_sigqueueinfo
- 3674, // 179: sys_rt_sigsuspend
- 3106, // 180: sys_pread64
- 3254, // 181: sys_pwrite64
- 309, // 182: sys_chown
- 1283, // 183: sys_getcwd
- 267, // 184: sys_capget
- 278, // 185: sys_capset
- 4716, // 186: sys_sigaltstack
- 4086, // 187: sys_sendfile
+ 3766, // 168: sys_poll
+ 3367, // 169: sys_nfsservctl
+ 5365, // 170: sys_setresgid
+ 1873, // 171: sys_getresgid
+ 3802, // 172: sys_prctl
+ 4460, // 173: sys_rt_sigreturn
+ 4386, // 174: sys_rt_sigaction
+ 4421, // 175: sys_rt_sigprocmask
+ 4403, // 176: sys_rt_sigpending
+ 4495, // 177: sys_rt_sigtimedwait
+ 4440, // 178: sys_rt_sigqueueinfo
+ 4477, // 179: sys_rt_sigsuspend
+ 3812, // 180: sys_pread64
+ 4021, // 181: sys_pwrite64
+ 323, // 182: sys_chown
+ 1609, // 183: sys_getcwd
+ 281, // 184: sys_capget
+ 292, // 185: sys_capset
+ 5629, // 186: sys_sigaltstack
+ 4971, // 187: sys_sendfile
0, // 188:
0, // 189:
- 5538, // 190: sys_vfork
- 5361, // 191: sys_ugetrlimit
- 2437, // 192: sys_mmap2
- 5334, // 193: sys_truncate64
- 1154, // 194: sys_ftruncate64
- 4904, // 195: sys_stat64
- 2254, // 196: sys_lstat64
- 1056, // 197: sys_fstat64
- 2088, // 198: sys_lchown32
- 1716, // 199: sys_getuid32
- 1385, // 200: sys_getgid32
- 1360, // 201: sys_geteuid32
- 1334, // 202: sys_getegid32
- 4525, // 203: sys_setreuid32
- 4437, // 204: sys_setregid32
- 1412, // 205: sys_getgroups32
- 4340, // 206: sys_setgroups32
- 888, // 207: sys_fchown32
- 4496, // 208: sys_setresuid32
- 1591, // 209: sys_getresuid32
- 4466, // 210: sys_setresgid32
- 1561, // 211: sys_getresgid32
- 319, // 212: sys_chown32
- 4608, // 213: sys_setuid32
- 4313, // 214: sys_setgid32
- 4287, // 215: sys_setfsuid32
- 4259, // 216: sys_setfsgid32
- 1307, // 217: sys_getdents64
- 3015, // 218: sys_pivot_root
- 2338, // 219: sys_mincore
- 2266, // 220: sys_madvise
- 924, // 221: sys_fcntl64
+ 6535, // 190: sys_vfork
+ 6337, // 191: sys_ugetrlimit
+ 2963, // 192: sys_mmap2
+ 6310, // 193: sys_truncate64
+ 1399, // 194: sys_ftruncate64
+ 5817, // 195: sys_stat64
+ 2742, // 196: sys_lstat64
+ 1301, // 197: sys_fstat64
+ 2576, // 198: sys_lchown32
+ 2042, // 199: sys_getuid32
+ 1711, // 200: sys_getgid32
+ 1686, // 201: sys_geteuid32
+ 1660, // 202: sys_getegid32
+ 5438, // 203: sys_setreuid32
+ 5350, // 204: sys_setregid32
+ 1738, // 205: sys_getgroups32
+ 5253, // 206: sys_setgroups32
+ 1086, // 207: sys_fchown32
+ 5409, // 208: sys_setresuid32
+ 1917, // 209: sys_getresuid32
+ 5379, // 210: sys_setresgid32
+ 1887, // 211: sys_getresgid32
+ 333, // 212: sys_chown32
+ 5521, // 213: sys_setuid32
+ 5226, // 214: sys_setgid32
+ 5200, // 215: sys_setfsuid32
+ 5172, // 216: sys_setfsgid32
+ 1633, // 217: sys_getdents64
+ 3704, // 218: sys_pivot_root
+ 2864, // 219: sys_mincore
+ 2754, // 220: sys_madvise
+ 1122, // 221: sys_fcntl64
0, // 222:
0, // 223:
- 1677, // 224: sys_gettid
- 3331, // 225: sys_readahead
- 4621, // 226: sys_setxattr
- 2230, // 227: sys_lsetxattr
- 1032, // 228: sys_fsetxattr
- 1729, // 229: sys_getxattr
- 2101, // 230: sys_lgetxattr
- 950, // 231: sys_fgetxattr
- 2146, // 232: sys_listxattr
- 2160, // 233: sys_llistxattr
- 981, // 234: sys_flistxattr
- 3474, // 235: sys_removexattr
- 2203, // 236: sys_lremovexattr
- 1015, // 237: sys_fremovexattr
- 5311, // 238: sys_tkill
- 4099, // 239: sys_sendfile64
- 1170, // 240: sys_futex
- 3896, // 241: sys_sched_setaffinity
- 3788, // 242: sys_sched_getaffinity
- 1918, // 243: sys_io_setup
- 1868, // 244: sys_io_destroy
- 1883, // 245: sys_io_getevents
- 1931, // 246: sys_io_submit
- 1854, // 247: sys_io_cancel
- 732, // 248: sys_exit_group
- 2184, // 249: sys_lookup_dcookie
- 557, // 250: sys_epoll_create
- 592, // 251: sys_epoll_ctl
- 640, // 252: sys_epoll_wait
- 3453, // 253: sys_remap_file_pages
+ 2003, // 224: sys_gettid
+ 4114, // 225: sys_readahead
+ 5534, // 226: sys_setxattr
+ 2718, // 227: sys_lsetxattr
+ 1243, // 228: sys_fsetxattr
+ 2055, // 229: sys_getxattr
+ 2589, // 230: sys_lgetxattr
+ 1148, // 231: sys_fgetxattr
+ 2634, // 232: sys_listxattr
+ 2648, // 233: sys_llistxattr
+ 1179, // 234: sys_flistxattr
+ 4277, // 235: sys_removexattr
+ 2691, // 236: sys_lremovexattr
+ 1213, // 237: sys_fremovexattr
+ 6287, // 238: sys_tkill
+ 4984, // 239: sys_sendfile64
+ 1415, // 240: sys_futex
+ 4759, // 241: sys_sched_setaffinity
+ 4618, // 242: sys_sched_getaffinity
+ 2269, // 243: sys_io_setup
+ 2194, // 244: sys_io_destroy
+ 2209, // 245: sys_io_getevents
+ 2282, // 246: sys_io_submit
+ 2180, // 247: sys_io_cancel
+ 901, // 248: sys_exit_group
+ 2672, // 249: sys_lookup_dcookie
+ 709, // 250: sys_epoll_create
+ 744, // 251: sys_epoll_ctl
+ 809, // 252: sys_epoll_wait
+ 4256, // 253: sys_remap_file_pages
0, // 254:
0, // 255:
- 4208, // 256: sys_set_tid_address
- 5151, // 257: sys_timer_create
- 5224, // 258: sys_timer_settime
- 5206, // 259: sys_timer_gettime
- 5185, // 260: sys_timer_getoverrun
- 5168, // 261: sys_timer_delete
- 415, // 262: sys_clock_settime
- 377, // 263: sys_clock_gettime
- 360, // 264: sys_clock_getres
- 395, // 265: sys_clock_nanosleep
- 4926, // 266: sys_statfs64
- 1106, // 267: sys_fstatfs64
- 5131, // 268: sys_tgkill
- 5527, // 269: sys_utimes
+ 5121, // 256: sys_set_tid_address
+ 6043, // 257: sys_timer_create
+ 6136, // 258: sys_timer_settime
+ 6098, // 259: sys_timer_gettime
+ 6077, // 260: sys_timer_getoverrun
+ 6060, // 261: sys_timer_delete
+ 520, // 262: sys_clock_settime
+ 435, // 263: sys_clock_gettime
+ 394, // 264: sys_clock_getres
+ 473, // 265: sys_clock_nanosleep
+ 5839, // 266: sys_statfs64
+ 1351, // 267: sys_fstatfs64
+ 6023, // 268: sys_tgkill
+ 6524, // 269: sys_utimes
175, // 270: sys_arm_fadvise64_64
- 2900, // 271: sys_pciconfig_iobase
- 2921, // 272: sys_pciconfig_read
- 2940, // 273: sys_pciconfig_write
- 2540, // 274: sys_mq_open
- 2589, // 275: sys_mq_unlink
- 2572, // 276: sys_mq_timedsend
- 2552, // 277: sys_mq_timedreceive
- 2526, // 278: sys_mq_notify
- 2508, // 279: sys_mq_getsetattr
- 5616, // 280: sys_waitid
- 4830, // 281: sys_socket
+ 3536, // 271: sys_pciconfig_iobase
+ 3557, // 272: sys_pciconfig_read
+ 3576, // 273: sys_pciconfig_write
+ 3099, // 274: sys_mq_open
+ 3199, // 275: sys_mq_unlink
+ 3158, // 276: sys_mq_timedsend
+ 3111, // 277: sys_mq_timedreceive
+ 3085, // 278: sys_mq_notify
+ 3067, // 279: sys_mq_getsetattr
+ 6613, // 280: sys_waitid
+ 5743, // 281: sys_socket
232, // 282: sys_bind
- 453, // 283: sys_connect
- 2135, // 284: sys_listen
+ 605, // 283: sys_connect
+ 2623, // 284: sys_listen
40, // 285: sys_accept
- 1646, // 286: sys_getsockname
- 1442, // 287: sys_getpeername
- 4856, // 288: sys_socketpair
- 4077, // 289: sys_send
- 4139, // 290: sys_sendto
- 3406, // 291: sys_recv
- 3415, // 292: sys_recvfrom
- 4689, // 293: sys_shutdown
- 4565, // 294: sys_setsockopt
- 1662, // 295: sys_getsockopt
- 4127, // 296: sys_sendmsg
- 3441, // 297: sys_recvmsg
- 4052, // 298: sys_semop
- 4041, // 299: sys_semget
- 4030, // 300: sys_semctl
- 2647, // 301: sys_msgsnd
- 2636, // 302: sys_msgrcv
- 2625, // 303: sys_msgget
- 2614, // 304: sys_msgctl
- 4647, // 305: sys_shmat
- 4668, // 306: sys_shmdt
- 4678, // 307: sys_shmget
- 4657, // 308: sys_shmctl
+ 1972, // 286: sys_getsockname
+ 1768, // 287: sys_getpeername
+ 5769, // 288: sys_socketpair
+ 4962, // 289: sys_send
+ 5024, // 290: sys_sendto
+ 4189, // 291: sys_recv
+ 4198, // 292: sys_recvfrom
+ 5602, // 293: sys_shutdown
+ 5478, // 294: sys_setsockopt
+ 1988, // 295: sys_getsockopt
+ 5012, // 296: sys_sendmsg
+ 4244, // 297: sys_recvmsg
+ 4915, // 298: sys_semop
+ 4904, // 299: sys_semget
+ 4893, // 300: sys_semctl
+ 3257, // 301: sys_msgsnd
+ 3246, // 302: sys_msgrcv
+ 3235, // 303: sys_msgget
+ 3224, // 304: sys_msgctl
+ 5560, // 305: sys_shmat
+ 5581, // 306: sys_shmdt
+ 5591, // 307: sys_shmget
+ 5570, // 308: sys_shmctl
83, // 309: sys_add_key
- 3528, // 310: sys_request_key
- 2057, // 311: sys_keyctl
- 4062, // 312: sys_semtimedop
- 5594, // 313: sys_vserver
- 1990, // 314: sys_ioprio_set
- 1975, // 315: sys_ioprio_get
- 1798, // 316: sys_inotify_init
- 1776, // 317: sys_inotify_add_watch
- 1833, // 318: sys_inotify_rm_watch
- 2278, // 319: sys_mbind
- 1214, // 320: sys_get_mempolicy
- 4150, // 321: sys_set_mempolicy
- 2879, // 322: sys_openat
- 2360, // 323: sys_mkdirat
- 2382, // 324: sys_mknodat
- 901, // 325: sys_fchownat
- 1180, // 326: sys_futimesat
- 1080, // 327: sys_fstatat64
- 5441, // 328: sys_unlinkat
- 3501, // 329: sys_renameat
- 2124, // 330: sys_linkat
- 5003, // 331: sys_symlinkat
- 3370, // 332: sys_readlinkat
- 864, // 333: sys_fchmodat
- 747, // 334: sys_faccessat
- 3218, // 335: sys_pselect6
- 3086, // 336: sys_ppoll
- 5454, // 337: sys_unshare
- 4168, // 338: sys_set_robust_list
- 1232, // 339: sys_get_robust_list
- 4871, // 340: sys_splice
+ 4331, // 310: sys_request_key
+ 2468, // 311: sys_keyctl
+ 4925, // 312: sys_semtimedop
+ 6591, // 313: sys_vserver
+ 2401, // 314: sys_ioprio_set
+ 2386, // 315: sys_ioprio_get
+ 2124, // 316: sys_inotify_init
+ 2102, // 317: sys_inotify_add_watch
+ 2159, // 318: sys_inotify_rm_watch
+ 2787, // 319: sys_mbind
+ 1540, // 320: sys_get_mempolicy
+ 5035, // 321: sys_set_mempolicy
+ 3503, // 322: sys_openat
+ 2886, // 323: sys_mkdirat
+ 2908, // 324: sys_mknodat
+ 1099, // 325: sys_fchownat
+ 1506, // 326: sys_futimesat
+ 1325, // 327: sys_fstatat64
+ 6417, // 328: sys_unlinkat
+ 4304, // 329: sys_renameat
+ 2612, // 330: sys_linkat
+ 5916, // 331: sys_symlinkat
+ 4153, // 332: sys_readlinkat
+ 1048, // 333: sys_fchmodat
+ 916, // 334: sys_faccessat
+ 3965, // 335: sys_pselect6
+ 3775, // 336: sys_ppoll
+ 6430, // 337: sys_unshare
+ 5081, // 338: sys_set_robust_list
+ 1558, // 339: sys_get_robust_list
+ 5784, // 340: sys_splice
196, // 341: sys_arm_sync_file_range
- 5123, // 342: sys_tee
- 5581, // 343: sys_vmsplice
- 2472, // 344: sys_move_pages
- 1272, // 345: sys_getcpu
- 624, // 346: sys_epoll_pwait
- 2042, // 347: sys_kexec_load
- 5513, // 348: sys_utimensat
- 4743, // 349: sys_signalfd
- 5242, // 350: sys_timerfd_create
- 674, // 351: sys_eventfd
- 792, // 352: sys_fallocate
- 5281, // 353: sys_timerfd_settime
- 5261, // 354: sys_timerfd_gettime
- 4756, // 355: sys_signalfd4
- 686, // 356: sys_eventfd2
- 574, // 357: sys_epoll_create1
- 548, // 358: sys_dup3
- 3005, // 359: sys_pipe2
- 1815, // 360: sys_inotify_init1
- 3118, // 361: sys_preadv
- 3267, // 362: sys_pwritev
- 3712, // 363: sys_rt_tgsigqueueinfo
- 2960, // 364: sys_perf_event_open
- 3428, // 365: sys_recvmmsg
+ 6015, // 342: sys_tee
+ 6578, // 343: sys_vmsplice
+ 3031, // 344: sys_move_pages
+ 1598, // 345: sys_getcpu
+ 776, // 346: sys_epoll_pwait
+ 2453, // 347: sys_kexec_load
+ 6489, // 348: sys_utimensat
+ 5656, // 349: sys_signalfd
+ 6174, // 350: sys_timerfd_create
+ 843, // 351: sys_eventfd
+ 976, // 352: sys_fallocate
+ 6235, // 353: sys_timerfd_settime
+ 6193, // 354: sys_timerfd_gettime
+ 5669, // 355: sys_signalfd4
+ 855, // 356: sys_eventfd2
+ 726, // 357: sys_epoll_create1
+ 700, // 358: sys_dup3
+ 3694, // 359: sys_pipe2
+ 2141, // 360: sys_inotify_init1
+ 3824, // 361: sys_preadv
+ 4034, // 362: sys_pwritev
+ 4542, // 363: sys_rt_tgsigqueueinfo
+ 3596, // 364: sys_perf_event_open
+ 4211, // 365: sys_recvmmsg
51, // 366: sys_accept4
- 806, // 367: sys_fanotify_init
- 824, // 368: sys_fanotify_mark
- 3141, // 369: sys_prlimit64
- 2706, // 370: sys_name_to_handle_at
- 2857, // 371: sys_open_by_handle_at
- 342, // 372: sys_clock_adjtime
- 5067, // 373: sys_syncfs
- 4114, // 374: sys_sendmmsg
- 4386, // 375: sys_setns
- 3155, // 376: sys_process_vm_readv
- 3176, // 377: sys_process_vm_writev
- 2013, // 378: sys_kcmp
- 964, // 379: sys_finit_module
- 3918, // 380: sys_sched_setattr
- 3810, // 381: sys_sched_getattr
- 3514, // 382: sys_renameat2
- 3994, // 383: sys_seccomp
- 1533, // 384: sys_getrandom
- 2303, // 385: sys_memfd_create
+ 990, // 367: sys_fanotify_init
+ 1008, // 368: sys_fanotify_mark
+ 3847, // 369: sys_prlimit64
+ 3316, // 370: sys_name_to_handle_at
+ 3467, // 371: sys_open_by_handle_at
+ 356, // 372: sys_clock_adjtime
+ 5959, // 373: sys_syncfs
+ 4999, // 374: sys_sendmmsg
+ 5299, // 375: sys_setns
+ 3902, // 376: sys_process_vm_readv
+ 3923, // 377: sys_process_vm_writev
+ 2424, // 378: sys_kcmp
+ 1162, // 379: sys_finit_module
+ 4781, // 380: sys_sched_setattr
+ 4640, // 381: sys_sched_getattr
+ 4317, // 382: sys_renameat2
+ 4857, // 383: sys_seccomp
+ 1859, // 384: sys_getrandom
+ 2812, // 385: sys_memfd_create
241, // 386: sys_bpf
- 710, // 387: sys_execveat
- 5477, // 388: sys_userfaultfd
- 2288, // 389: sys_membarrier
- 2404, // 390: sys_mlock2
- 465, // 391: sys_copy_file_range
- 3129, // 392: sys_preadv2
- 3279, // 393: sys_pwritev2
- 3059, // 394: sys_pkey_mprotect
- 3030, // 395: sys_pkey_alloc
- 3045, // 396: sys_pkey_free
- 4939, // 397: sys_statx
- 3574, // 398: sys_rseq
- 1900, // 399: sys_io_pgetevents
+ 879, // 387: sys_execveat
+ 6453, // 388: sys_userfaultfd
+ 2797, // 389: sys_membarrier
+ 2930, // 390: sys_mlock2
+ 617, // 391: sys_copy_file_range
+ 3835, // 392: sys_preadv2
+ 4046, // 393: sys_pwritev2
+ 3748, // 394: sys_pkey_mprotect
+ 3719, // 395: sys_pkey_alloc
+ 3734, // 396: sys_pkey_free
+ 5852, // 397: sys_statx
+ 4377, // 398: sys_rseq
+ 2226, // 399: sys_io_pgetevents
+ 2846, // 400: sys_migrate_pages
+ 2433, // 401: sys_kexec_file_load
+ 0, // 402:
+ 453, // 403: sys_clock_gettime64
+ 538, // 404: sys_clock_settime64
+ 374, // 405: sys_clock_adjtime64
+ 411, // 406: sys_clock_getres_time64
+ 493, // 407: sys_clock_nanosleep_time64
+ 6116, // 408: sys_timer_gettime64
+ 6154, // 409: sys_timer_settime64
+ 6213, // 410: sys_timerfd_gettime64
+ 6255, // 411: sys_timerfd_settime64
+ 6503, // 412: sys_utimensat_time64
+ 3978, // 413: sys_pselect6_time64
+ 3785, // 414: sys_ppoll_time64
+ 0, // 415:
+ 2244, // 416: sys_io_pgetevents_time64
+ 4224, // 417: sys_recvmmsg_time64
+ 3175, // 418: sys_mq_timedsend_time64
+ 3131, // 419: sys_mq_timedreceive_time64
+ 4940, // 420: sys_semtimedop_time64
+ 4515, // 421: sys_rt_sigtimedwait_time64
+ 1443, // 422: sys_futex_time64
+ 4726, // 423: sys_sched_rr_get_interval_time64
+ 3663, // 424: sys_pidfd_send_signal
+ 2337, // 425: sys_io_uring_setup
+ 2296, // 426: sys_io_uring_enter
+ 2315, // 427: sys_io_uring_register
+ 3489, // 428: sys_open_tree
+ 3016, // 429: sys_move_mount
+ 1269, // 430: sys_fsopen
+ 1230, // 431: sys_fsconfig
+ 1257, // 432: sys_fsmount
+ 1280, // 433: sys_fspick
+ 3648, // 434: sys_pidfd_open
+ 568, // 435: sys_clone3
+ 589, // 436: sys_close_range
+ 3514, // 437: sys_openat2
+ 3632, // 438: sys_pidfd_getfd
+ 930, // 439: sys_faccessat2
+ 3861, // 440: sys_process_madvise
+ 792, // 441: sys_epoll_pwait2
+ 2998, // 442: sys_mount_setattr
+ 4089, // 443: sys_quotactl_fd
+ 2510, // 444: sys_landlock_create_ruleset
+ 2488, // 445: sys_landlock_add_rule
+ 2538, // 446: sys_landlock_restrict_self
+ 0, // 447:
+ 3881, // 448: sys_process_mrelease
+ 1475, // 449: sys_futex_waitv
+ 5053, // 450: sys_set_mempolicy_home_node
+ 267, // 451: sys_cachestat
+ 1061, // 452: sys_fchmodat2
+ 2766, // 453: sys_map_shadow_stack
+ 1491, // 454: sys_futex_wake
+ 1460, // 455: sys_futex_wait
+ 1425, // 456: sys_futex_requeue
};
};
struct SyscallTable_x86 {
static constexpr const char* names = kAllSyscalllNames;
static constexpr SyscallTable::OffT offsets[]{
- 3544, // 0: sys_restart_syscall
- 723, // 1: sys_exit
- 1006, // 2: sys_fork
- 3322, // 3: sys_read
- 5639, // 4: sys_write
- 2848, // 5: sys_open
- 443, // 6: sys_close
- 5627, // 7: sys_waitpid
- 485, // 8: sys_creat
- 2115, // 9: sys_link
- 5430, // 10: sys_unlink
- 699, // 11: sys_execve
- 289, // 12: sys_chdir
- 5142, // 13: sys_time
- 2372, // 14: sys_mknod
- 299, // 15: sys_chmod
- 2077, // 16: sys_lchown
+ 4347, // 0: sys_restart_syscall
+ 892, // 1: sys_exit
+ 1204, // 2: sys_fork
+ 4105, // 3: sys_read
+ 6636, // 4: sys_write
+ 3458, // 5: sys_open
+ 579, // 6: sys_close
+ 6624, // 7: sys_waitpid
+ 637, // 8: sys_creat
+ 2603, // 9: sys_link
+ 6406, // 10: sys_unlink
+ 868, // 11: sys_execve
+ 303, // 12: sys_chdir
+ 6034, // 13: sys_time
+ 2898, // 14: sys_mknod
+ 313, // 15: sys_chmod
+ 2565, // 16: sys_lchown
249, // 17: sys_break
- 2823, // 18: sys_oldstat
- 2220, // 19: sys_lseek
- 1482, // 20: sys_getpid
- 2462, // 21: sys_mount
- 5397, // 22: sys_umount
- 4597, // 23: sys_setuid
- 1705, // 24: sys_getuid
- 4949, // 25: sys_stime
- 3231, // 26: sys_ptrace
+ 3433, // 18: sys_oldstat
+ 2708, // 19: sys_lseek
+ 1808, // 20: sys_getpid
+ 2988, // 21: sys_mount
+ 6373, // 22: sys_umount
+ 5510, // 23: sys_setuid
+ 2031, // 24: sys_getuid
+ 5862, // 25: sys_stime
+ 3998, // 26: sys_ptrace
124, // 27: sys_alarm
- 2781, // 28: sys_oldfstat
- 2890, // 29: sys_pause
- 5503, // 30: sys_utime
- 4959, // 31: sys_stty
- 1742, // 32: sys_gtty
+ 3391, // 28: sys_oldfstat
+ 3526, // 29: sys_pause
+ 6479, // 30: sys_utime
+ 5872, // 31: sys_stty
+ 2068, // 32: sys_gtty
63, // 33: sys_access
- 2772, // 34: sys_nice
- 1130, // 35: sys_ftime
- 5017, // 36: sys_sync
- 2068, // 37: sys_kill
- 3490, // 38: sys_rename
- 2350, // 39: sys_mkdir
- 3564, // 40: sys_rmdir
- 531, // 41: sys_dup
- 2996, // 42: sys_pipe
- 5301, // 43: sys_times
- 3198, // 44: sys_prof
+ 3382, // 34: sys_nice
+ 1375, // 35: sys_ftime
+ 5930, // 36: sys_sync
+ 2479, // 37: sys_kill
+ 4293, // 38: sys_rename
+ 2876, // 39: sys_mkdir
+ 4367, // 40: sys_rmdir
+ 683, // 41: sys_dup
+ 3685, // 42: sys_pipe
+ 6277, // 43: sys_times
+ 3945, // 44: sys_prof
259, // 45: sys_brk
- 4302, // 46: sys_setgid
- 1374, // 47: sys_getgid
- 4732, // 48: sys_signal
- 1348, // 49: sys_geteuid
- 1322, // 50: sys_getegid
+ 5215, // 46: sys_setgid
+ 1700, // 47: sys_getgid
+ 5645, // 48: sys_signal
+ 1674, // 49: sys_geteuid
+ 1648, // 50: sys_getegid
74, // 51: sys_acct
- 5408, // 52: sys_umount2
- 2175, // 53: sys_lock
- 1945, // 54: sys_ioctl
- 914, // 55: sys_fcntl
- 2500, // 56: sys_mpx
- 4396, // 57: sys_setpgid
- 5376, // 58: sys_ulimit
- 2807, // 59: sys_oldolduname
- 5387, // 60: sys_umask
- 331, // 61: sys_chroot
- 5493, // 62: sys_ustat
- 539, // 63: sys_dup2
- 1505, // 64: sys_getppid
- 1470, // 65: sys_getpgrp
- 4554, // 66: sys_setsid
- 4702, // 67: sys_sigaction
- 4634, // 68: sys_sgetmask
- 4882, // 69: sys_ssetmask
- 4512, // 70: sys_setreuid
- 4424, // 71: sys_setregid
- 4815, // 72: sys_sigsuspend
- 4770, // 73: sys_sigpending
- 4356, // 74: sys_sethostname
- 4540, // 75: sys_setrlimit
- 1607, // 76: sys_getrlimit
- 1621, // 77: sys_getrusage
- 1688, // 78: sys_gettimeofday
- 4580, // 79: sys_settimeofday
- 1398, // 80: sys_getgroups
- 4326, // 81: sys_setgroups
- 4019, // 82: sys_select
- 4991, // 83: sys_symlink
- 2794, // 84: sys_oldlstat
- 3357, // 85: sys_readlink
- 5466, // 86: sys_uselib
- 4980, // 87: sys_swapon
- 3395, // 88: sys_reboot
- 3345, // 89: sys_readdir
- 2428, // 90: sys_mmap
- 2695, // 91: sys_munmap
- 5321, // 92: sys_truncate
- 1140, // 93: sys_ftruncate
- 853, // 94: sys_fchmod
- 877, // 95: sys_fchown
- 1517, // 96: sys_getpriority
- 4408, // 97: sys_setpriority
- 3207, // 98: sys_profil
- 4915, // 99: sys_statfs
- 1094, // 100: sys_fstatfs
- 1955, // 101: sys_ioperm
- 4841, // 102: sys_socketcall
- 5112, // 103: sys_syslog
- 4372, // 104: sys_setitimer
- 1428, // 105: sys_getitimer
- 4895, // 106: sys_stat
- 2244, // 107: sys_lstat
- 1046, // 108: sys_fstat
- 2835, // 109: sys_olduname
- 1966, // 110: sys_iopl
- 5548, // 111: sys_vhangup
- 1751, // 112: sys_idle
- 5569, // 113: sys_vm86old
- 5606, // 114: sys_wait4
- 4968, // 115: sys_swapoff
- 5100, // 116: sys_sysinfo
- 2005, // 117: sys_ipc
- 1120, // 118: sys_fsync
- 4801, // 119: sys_sigreturn
- 433, // 120: sys_clone
- 4228, // 121: sys_setdomainname
- 5420, // 122: sys_uname
- 2447, // 123: sys_modify_ldt
+ 6384, // 52: sys_umount2
+ 2663, // 53: sys_lock
+ 2356, // 54: sys_ioctl
+ 1112, // 55: sys_fcntl
+ 3059, // 56: sys_mpx
+ 5309, // 57: sys_setpgid
+ 6352, // 58: sys_ulimit
+ 3417, // 59: sys_oldolduname
+ 6363, // 60: sys_umask
+ 345, // 61: sys_chroot
+ 6469, // 62: sys_ustat
+ 691, // 63: sys_dup2
+ 1831, // 64: sys_getppid
+ 1796, // 65: sys_getpgrp
+ 5467, // 66: sys_setsid
+ 5615, // 67: sys_sigaction
+ 5547, // 68: sys_sgetmask
+ 5795, // 69: sys_ssetmask
+ 5425, // 70: sys_setreuid
+ 5337, // 71: sys_setregid
+ 5728, // 72: sys_sigsuspend
+ 5683, // 73: sys_sigpending
+ 5269, // 74: sys_sethostname
+ 5453, // 75: sys_setrlimit
+ 1933, // 76: sys_getrlimit
+ 1947, // 77: sys_getrusage
+ 2014, // 78: sys_gettimeofday
+ 5493, // 79: sys_settimeofday
+ 1724, // 80: sys_getgroups
+ 5239, // 81: sys_setgroups
+ 4882, // 82: sys_select
+ 5904, // 83: sys_symlink
+ 3404, // 84: sys_oldlstat
+ 4140, // 85: sys_readlink
+ 6442, // 86: sys_uselib
+ 5893, // 87: sys_swapon
+ 4178, // 88: sys_reboot
+ 4128, // 89: sys_readdir
+ 2954, // 90: sys_mmap
+ 3305, // 91: sys_munmap
+ 6297, // 92: sys_truncate
+ 1385, // 93: sys_ftruncate
+ 1037, // 94: sys_fchmod
+ 1075, // 95: sys_fchown
+ 1843, // 96: sys_getpriority
+ 5321, // 97: sys_setpriority
+ 3954, // 98: sys_profil
+ 5828, // 99: sys_statfs
+ 1339, // 100: sys_fstatfs
+ 2366, // 101: sys_ioperm
+ 5754, // 102: sys_socketcall
+ 6004, // 103: sys_syslog
+ 5285, // 104: sys_setitimer
+ 1754, // 105: sys_getitimer
+ 5808, // 106: sys_stat
+ 2732, // 107: sys_lstat
+ 1291, // 108: sys_fstat
+ 3445, // 109: sys_olduname
+ 2377, // 110: sys_iopl
+ 6545, // 111: sys_vhangup
+ 2077, // 112: sys_idle
+ 6566, // 113: sys_vm86old
+ 6603, // 114: sys_wait4
+ 5881, // 115: sys_swapoff
+ 5992, // 116: sys_sysinfo
+ 2416, // 117: sys_ipc
+ 1365, // 118: sys_fsync
+ 5714, // 119: sys_sigreturn
+ 558, // 120: sys_clone
+ 5141, // 121: sys_setdomainname
+ 6396, // 122: sys_uname
+ 2973, // 123: sys_modify_ldt
95, // 124: sys_adjtimex
- 2487, // 125: sys_mprotect
- 4785, // 126: sys_sigprocmask
- 495, // 127: sys_create_module
- 1760, // 128: sys_init_module
- 513, // 129: sys_delete_module
- 1194, // 130: sys_get_kernel_syms
- 3309, // 131: sys_quotactl
- 1458, // 132: sys_getpgid
- 842, // 133: sys_fchdir
+ 3046, // 125: sys_mprotect
+ 5698, // 126: sys_sigprocmask
+ 647, // 127: sys_create_module
+ 2086, // 128: sys_init_module
+ 665, // 129: sys_delete_module
+ 1520, // 130: sys_get_kernel_syms
+ 4076, // 131: sys_quotactl
+ 1784, // 132: sys_getpgid
+ 1026, // 133: sys_fchdir
220, // 134: sys_bdflush
- 5090, // 135: sys_sysfs
- 2980, // 136: sys_personality
+ 5982, // 135: sys_sysfs
+ 3616, // 136: sys_personality
108, // 137: sys_afs_syscall
- 4274, // 138: sys_setfsuid
- 4246, // 139: sys_setfsgid
+ 5187, // 138: sys_setfsuid
+ 5159, // 139: sys_setfsgid
1, // 140: sys__llseek
- 1294, // 141: sys_getdents
+ 1620, // 141: sys_getdents
13, // 142: sys__newselect
- 996, // 143: sys_flock
- 2658, // 144: sys_msync
- 3385, // 145: sys_readv
- 5649, // 146: sys_writev
- 1635, // 147: sys_getsid
- 936, // 148: sys_fdatasync
+ 1194, // 143: sys_flock
+ 3268, // 144: sys_msync
+ 4168, // 145: sys_readv
+ 6646, // 146: sys_writev
+ 1961, // 147: sys_getsid
+ 1134, // 148: sys_fdatasync
28, // 149: sys__sysctl
- 2394, // 150: sys_mlock
- 2668, // 151: sys_munlock
- 2415, // 152: sys_mlockall
- 2680, // 153: sys_munlockall
- 3936, // 154: sys_sched_setparam
- 3828, // 155: sys_sched_getparam
- 3955, // 156: sys_sched_setscheduler
- 3847, // 157: sys_sched_getscheduler
- 3978, // 158: sys_sched_yield
- 3734, // 159: sys_sched_get_priority_max
- 3761, // 160: sys_sched_get_priority_min
- 3870, // 161: sys_sched_rr_get_interval
- 2728, // 162: sys_nanosleep
- 2603, // 163: sys_mremap
- 4482, // 164: sys_setresuid
- 1577, // 165: sys_getresuid
- 5560, // 166: sys_vm86
- 3292, // 167: sys_query_module
- 3077, // 168: sys_poll
- 2757, // 169: sys_nfsservctl
- 4452, // 170: sys_setresgid
- 1547, // 171: sys_getresgid
- 3096, // 172: sys_prctl
- 3657, // 173: sys_rt_sigreturn
- 3583, // 174: sys_rt_sigaction
- 3618, // 175: sys_rt_sigprocmask
- 3600, // 176: sys_rt_sigpending
- 3692, // 177: sys_rt_sigtimedwait
- 3637, // 178: sys_rt_sigqueueinfo
- 3674, // 179: sys_rt_sigsuspend
- 3106, // 180: sys_pread64
- 3254, // 181: sys_pwrite64
- 309, // 182: sys_chown
- 1283, // 183: sys_getcwd
- 267, // 184: sys_capget
- 278, // 185: sys_capset
- 4716, // 186: sys_sigaltstack
- 4086, // 187: sys_sendfile
- 1493, // 188: sys_getpmsg
- 3242, // 189: sys_putpmsg
- 5538, // 190: sys_vfork
- 5361, // 191: sys_ugetrlimit
- 2437, // 192: sys_mmap2
- 5334, // 193: sys_truncate64
- 1154, // 194: sys_ftruncate64
- 4904, // 195: sys_stat64
- 2254, // 196: sys_lstat64
- 1056, // 197: sys_fstat64
- 2088, // 198: sys_lchown32
- 1716, // 199: sys_getuid32
- 1385, // 200: sys_getgid32
- 1360, // 201: sys_geteuid32
- 1334, // 202: sys_getegid32
- 4525, // 203: sys_setreuid32
- 4437, // 204: sys_setregid32
- 1412, // 205: sys_getgroups32
- 4340, // 206: sys_setgroups32
- 888, // 207: sys_fchown32
- 4496, // 208: sys_setresuid32
- 1591, // 209: sys_getresuid32
- 4466, // 210: sys_setresgid32
- 1561, // 211: sys_getresgid32
- 319, // 212: sys_chown32
- 4608, // 213: sys_setuid32
- 4313, // 214: sys_setgid32
- 4287, // 215: sys_setfsuid32
- 4259, // 216: sys_setfsgid32
- 3015, // 217: sys_pivot_root
- 2338, // 218: sys_mincore
- 2266, // 219: sys_madvise
- 1307, // 220: sys_getdents64
- 924, // 221: sys_fcntl64
+ 2920, // 150: sys_mlock
+ 3278, // 151: sys_munlock
+ 2941, // 152: sys_mlockall
+ 3290, // 153: sys_munlockall
+ 4799, // 154: sys_sched_setparam
+ 4658, // 155: sys_sched_getparam
+ 4818, // 156: sys_sched_setscheduler
+ 4677, // 157: sys_sched_getscheduler
+ 4841, // 158: sys_sched_yield
+ 4564, // 159: sys_sched_get_priority_max
+ 4591, // 160: sys_sched_get_priority_min
+ 4700, // 161: sys_sched_rr_get_interval
+ 3338, // 162: sys_nanosleep
+ 3213, // 163: sys_mremap
+ 5395, // 164: sys_setresuid
+ 1903, // 165: sys_getresuid
+ 6557, // 166: sys_vm86
+ 4059, // 167: sys_query_module
+ 3766, // 168: sys_poll
+ 3367, // 169: sys_nfsservctl
+ 5365, // 170: sys_setresgid
+ 1873, // 171: sys_getresgid
+ 3802, // 172: sys_prctl
+ 4460, // 173: sys_rt_sigreturn
+ 4386, // 174: sys_rt_sigaction
+ 4421, // 175: sys_rt_sigprocmask
+ 4403, // 176: sys_rt_sigpending
+ 4495, // 177: sys_rt_sigtimedwait
+ 4440, // 178: sys_rt_sigqueueinfo
+ 4477, // 179: sys_rt_sigsuspend
+ 3812, // 180: sys_pread64
+ 4021, // 181: sys_pwrite64
+ 323, // 182: sys_chown
+ 1609, // 183: sys_getcwd
+ 281, // 184: sys_capget
+ 292, // 185: sys_capset
+ 5629, // 186: sys_sigaltstack
+ 4971, // 187: sys_sendfile
+ 1819, // 188: sys_getpmsg
+ 4009, // 189: sys_putpmsg
+ 6535, // 190: sys_vfork
+ 6337, // 191: sys_ugetrlimit
+ 2963, // 192: sys_mmap2
+ 6310, // 193: sys_truncate64
+ 1399, // 194: sys_ftruncate64
+ 5817, // 195: sys_stat64
+ 2742, // 196: sys_lstat64
+ 1301, // 197: sys_fstat64
+ 2576, // 198: sys_lchown32
+ 2042, // 199: sys_getuid32
+ 1711, // 200: sys_getgid32
+ 1686, // 201: sys_geteuid32
+ 1660, // 202: sys_getegid32
+ 5438, // 203: sys_setreuid32
+ 5350, // 204: sys_setregid32
+ 1738, // 205: sys_getgroups32
+ 5253, // 206: sys_setgroups32
+ 1086, // 207: sys_fchown32
+ 5409, // 208: sys_setresuid32
+ 1917, // 209: sys_getresuid32
+ 5379, // 210: sys_setresgid32
+ 1887, // 211: sys_getresgid32
+ 333, // 212: sys_chown32
+ 5521, // 213: sys_setuid32
+ 5226, // 214: sys_setgid32
+ 5200, // 215: sys_setfsuid32
+ 5172, // 216: sys_setfsgid32
+ 3704, // 217: sys_pivot_root
+ 2864, // 218: sys_mincore
+ 2754, // 219: sys_madvise
+ 1633, // 220: sys_getdents64
+ 1122, // 221: sys_fcntl64
0, // 222:
0, // 223:
- 1677, // 224: sys_gettid
- 3331, // 225: sys_readahead
- 4621, // 226: sys_setxattr
- 2230, // 227: sys_lsetxattr
- 1032, // 228: sys_fsetxattr
- 1729, // 229: sys_getxattr
- 2101, // 230: sys_lgetxattr
- 950, // 231: sys_fgetxattr
- 2146, // 232: sys_listxattr
- 2160, // 233: sys_llistxattr
- 981, // 234: sys_flistxattr
- 3474, // 235: sys_removexattr
- 2203, // 236: sys_lremovexattr
- 1015, // 237: sys_fremovexattr
- 5311, // 238: sys_tkill
- 4099, // 239: sys_sendfile64
- 1170, // 240: sys_futex
- 3896, // 241: sys_sched_setaffinity
- 3788, // 242: sys_sched_getaffinity
- 4188, // 243: sys_set_thread_area
- 1252, // 244: sys_get_thread_area
- 1918, // 245: sys_io_setup
- 1868, // 246: sys_io_destroy
- 1883, // 247: sys_io_getevents
- 1931, // 248: sys_io_submit
- 1854, // 249: sys_io_cancel
- 761, // 250: sys_fadvise64
+ 2003, // 224: sys_gettid
+ 4114, // 225: sys_readahead
+ 5534, // 226: sys_setxattr
+ 2718, // 227: sys_lsetxattr
+ 1243, // 228: sys_fsetxattr
+ 2055, // 229: sys_getxattr
+ 2589, // 230: sys_lgetxattr
+ 1148, // 231: sys_fgetxattr
+ 2634, // 232: sys_listxattr
+ 2648, // 233: sys_llistxattr
+ 1179, // 234: sys_flistxattr
+ 4277, // 235: sys_removexattr
+ 2691, // 236: sys_lremovexattr
+ 1213, // 237: sys_fremovexattr
+ 6287, // 238: sys_tkill
+ 4984, // 239: sys_sendfile64
+ 1415, // 240: sys_futex
+ 4759, // 241: sys_sched_setaffinity
+ 4618, // 242: sys_sched_getaffinity
+ 5101, // 243: sys_set_thread_area
+ 1578, // 244: sys_get_thread_area
+ 2269, // 245: sys_io_setup
+ 2194, // 246: sys_io_destroy
+ 2209, // 247: sys_io_getevents
+ 2282, // 248: sys_io_submit
+ 2180, // 249: sys_io_cancel
+ 945, // 250: sys_fadvise64
0, // 251:
- 732, // 252: sys_exit_group
- 2184, // 253: sys_lookup_dcookie
- 557, // 254: sys_epoll_create
- 592, // 255: sys_epoll_ctl
- 640, // 256: sys_epoll_wait
- 3453, // 257: sys_remap_file_pages
- 4208, // 258: sys_set_tid_address
- 5151, // 259: sys_timer_create
- 5224, // 260: sys_timer_settime
- 5206, // 261: sys_timer_gettime
- 5185, // 262: sys_timer_getoverrun
- 5168, // 263: sys_timer_delete
- 415, // 264: sys_clock_settime
- 377, // 265: sys_clock_gettime
- 360, // 266: sys_clock_getres
- 395, // 267: sys_clock_nanosleep
- 4926, // 268: sys_statfs64
- 1106, // 269: sys_fstatfs64
- 5131, // 270: sys_tgkill
- 5527, // 271: sys_utimes
- 775, // 272: sys_fadvise64_64
- 5594, // 273: sys_vserver
- 2278, // 274: sys_mbind
- 1214, // 275: sys_get_mempolicy
- 4150, // 276: sys_set_mempolicy
- 2540, // 277: sys_mq_open
- 2589, // 278: sys_mq_unlink
- 2572, // 279: sys_mq_timedsend
- 2552, // 280: sys_mq_timedreceive
- 2526, // 281: sys_mq_notify
- 2508, // 282: sys_mq_getsetattr
- 2042, // 283: sys_kexec_load
- 5616, // 284: sys_waitid
+ 901, // 252: sys_exit_group
+ 2672, // 253: sys_lookup_dcookie
+ 709, // 254: sys_epoll_create
+ 744, // 255: sys_epoll_ctl
+ 809, // 256: sys_epoll_wait
+ 4256, // 257: sys_remap_file_pages
+ 5121, // 258: sys_set_tid_address
+ 6043, // 259: sys_timer_create
+ 6136, // 260: sys_timer_settime
+ 6098, // 261: sys_timer_gettime
+ 6077, // 262: sys_timer_getoverrun
+ 6060, // 263: sys_timer_delete
+ 520, // 264: sys_clock_settime
+ 435, // 265: sys_clock_gettime
+ 394, // 266: sys_clock_getres
+ 473, // 267: sys_clock_nanosleep
+ 5839, // 268: sys_statfs64
+ 1351, // 269: sys_fstatfs64
+ 6023, // 270: sys_tgkill
+ 6524, // 271: sys_utimes
+ 959, // 272: sys_fadvise64_64
+ 6591, // 273: sys_vserver
+ 2787, // 274: sys_mbind
+ 1540, // 275: sys_get_mempolicy
+ 5035, // 276: sys_set_mempolicy
+ 3099, // 277: sys_mq_open
+ 3199, // 278: sys_mq_unlink
+ 3158, // 279: sys_mq_timedsend
+ 3111, // 280: sys_mq_timedreceive
+ 3085, // 281: sys_mq_notify
+ 3067, // 282: sys_mq_getsetattr
+ 2453, // 283: sys_kexec_load
+ 6613, // 284: sys_waitid
0, // 285:
83, // 286: sys_add_key
- 3528, // 287: sys_request_key
- 2057, // 288: sys_keyctl
- 1990, // 289: sys_ioprio_set
- 1975, // 290: sys_ioprio_get
- 1798, // 291: sys_inotify_init
- 1776, // 292: sys_inotify_add_watch
- 1833, // 293: sys_inotify_rm_watch
- 2320, // 294: sys_migrate_pages
- 2879, // 295: sys_openat
- 2360, // 296: sys_mkdirat
- 2382, // 297: sys_mknodat
- 901, // 298: sys_fchownat
- 1180, // 299: sys_futimesat
- 1080, // 300: sys_fstatat64
- 5441, // 301: sys_unlinkat
- 3501, // 302: sys_renameat
- 2124, // 303: sys_linkat
- 5003, // 304: sys_symlinkat
- 3370, // 305: sys_readlinkat
- 864, // 306: sys_fchmodat
- 747, // 307: sys_faccessat
- 3218, // 308: sys_pselect6
- 3086, // 309: sys_ppoll
- 5454, // 310: sys_unshare
- 4168, // 311: sys_set_robust_list
- 1232, // 312: sys_get_robust_list
- 4871, // 313: sys_splice
- 5026, // 314: sys_sync_file_range
- 5123, // 315: sys_tee
- 5581, // 316: sys_vmsplice
- 2472, // 317: sys_move_pages
- 1272, // 318: sys_getcpu
- 624, // 319: sys_epoll_pwait
- 5513, // 320: sys_utimensat
- 4743, // 321: sys_signalfd
- 5242, // 322: sys_timerfd_create
- 674, // 323: sys_eventfd
- 792, // 324: sys_fallocate
- 5281, // 325: sys_timerfd_settime
- 5261, // 326: sys_timerfd_gettime
- 4756, // 327: sys_signalfd4
- 686, // 328: sys_eventfd2
- 574, // 329: sys_epoll_create1
- 548, // 330: sys_dup3
- 3005, // 331: sys_pipe2
- 1815, // 332: sys_inotify_init1
- 3118, // 333: sys_preadv
- 3267, // 334: sys_pwritev
- 3712, // 335: sys_rt_tgsigqueueinfo
- 2960, // 336: sys_perf_event_open
- 3428, // 337: sys_recvmmsg
- 806, // 338: sys_fanotify_init
- 824, // 339: sys_fanotify_mark
- 3141, // 340: sys_prlimit64
- 2706, // 341: sys_name_to_handle_at
- 2857, // 342: sys_open_by_handle_at
- 342, // 343: sys_clock_adjtime
- 5067, // 344: sys_syncfs
- 4114, // 345: sys_sendmmsg
- 4386, // 346: sys_setns
- 3155, // 347: sys_process_vm_readv
- 3176, // 348: sys_process_vm_writev
- 2013, // 349: sys_kcmp
- 964, // 350: sys_finit_module
- 3918, // 351: sys_sched_setattr
- 3810, // 352: sys_sched_getattr
- 3514, // 353: sys_renameat2
- 3994, // 354: sys_seccomp
- 1533, // 355: sys_getrandom
- 2303, // 356: sys_memfd_create
+ 4331, // 287: sys_request_key
+ 2468, // 288: sys_keyctl
+ 2401, // 289: sys_ioprio_set
+ 2386, // 290: sys_ioprio_get
+ 2124, // 291: sys_inotify_init
+ 2102, // 292: sys_inotify_add_watch
+ 2159, // 293: sys_inotify_rm_watch
+ 2846, // 294: sys_migrate_pages
+ 3503, // 295: sys_openat
+ 2886, // 296: sys_mkdirat
+ 2908, // 297: sys_mknodat
+ 1099, // 298: sys_fchownat
+ 1506, // 299: sys_futimesat
+ 1325, // 300: sys_fstatat64
+ 6417, // 301: sys_unlinkat
+ 4304, // 302: sys_renameat
+ 2612, // 303: sys_linkat
+ 5916, // 304: sys_symlinkat
+ 4153, // 305: sys_readlinkat
+ 1048, // 306: sys_fchmodat
+ 916, // 307: sys_faccessat
+ 3965, // 308: sys_pselect6
+ 3775, // 309: sys_ppoll
+ 6430, // 310: sys_unshare
+ 5081, // 311: sys_set_robust_list
+ 1558, // 312: sys_get_robust_list
+ 5784, // 313: sys_splice
+ 5939, // 314: sys_sync_file_range
+ 6015, // 315: sys_tee
+ 6578, // 316: sys_vmsplice
+ 3031, // 317: sys_move_pages
+ 1598, // 318: sys_getcpu
+ 776, // 319: sys_epoll_pwait
+ 6489, // 320: sys_utimensat
+ 5656, // 321: sys_signalfd
+ 6174, // 322: sys_timerfd_create
+ 843, // 323: sys_eventfd
+ 976, // 324: sys_fallocate
+ 6235, // 325: sys_timerfd_settime
+ 6193, // 326: sys_timerfd_gettime
+ 5669, // 327: sys_signalfd4
+ 855, // 328: sys_eventfd2
+ 726, // 329: sys_epoll_create1
+ 700, // 330: sys_dup3
+ 3694, // 331: sys_pipe2
+ 2141, // 332: sys_inotify_init1
+ 3824, // 333: sys_preadv
+ 4034, // 334: sys_pwritev
+ 4542, // 335: sys_rt_tgsigqueueinfo
+ 3596, // 336: sys_perf_event_open
+ 4211, // 337: sys_recvmmsg
+ 990, // 338: sys_fanotify_init
+ 1008, // 339: sys_fanotify_mark
+ 3847, // 340: sys_prlimit64
+ 3316, // 341: sys_name_to_handle_at
+ 3467, // 342: sys_open_by_handle_at
+ 356, // 343: sys_clock_adjtime
+ 5959, // 344: sys_syncfs
+ 4999, // 345: sys_sendmmsg
+ 5299, // 346: sys_setns
+ 3902, // 347: sys_process_vm_readv
+ 3923, // 348: sys_process_vm_writev
+ 2424, // 349: sys_kcmp
+ 1162, // 350: sys_finit_module
+ 4781, // 351: sys_sched_setattr
+ 4640, // 352: sys_sched_getattr
+ 4317, // 353: sys_renameat2
+ 4857, // 354: sys_seccomp
+ 1859, // 355: sys_getrandom
+ 2812, // 356: sys_memfd_create
241, // 357: sys_bpf
- 710, // 358: sys_execveat
- 4830, // 359: sys_socket
- 4856, // 360: sys_socketpair
+ 879, // 358: sys_execveat
+ 5743, // 359: sys_socket
+ 5769, // 360: sys_socketpair
232, // 361: sys_bind
- 453, // 362: sys_connect
- 2135, // 363: sys_listen
+ 605, // 362: sys_connect
+ 2623, // 363: sys_listen
51, // 364: sys_accept4
- 1662, // 365: sys_getsockopt
- 4565, // 366: sys_setsockopt
- 1646, // 367: sys_getsockname
- 1442, // 368: sys_getpeername
- 4139, // 369: sys_sendto
- 4127, // 370: sys_sendmsg
- 3415, // 371: sys_recvfrom
- 3441, // 372: sys_recvmsg
- 4689, // 373: sys_shutdown
- 5477, // 374: sys_userfaultfd
- 2288, // 375: sys_membarrier
- 2404, // 376: sys_mlock2
- 465, // 377: sys_copy_file_range
- 3129, // 378: sys_preadv2
- 3279, // 379: sys_pwritev2
- 3059, // 380: sys_pkey_mprotect
- 3030, // 381: sys_pkey_alloc
- 3045, // 382: sys_pkey_free
- 4939, // 383: sys_statx
+ 1988, // 365: sys_getsockopt
+ 5478, // 366: sys_setsockopt
+ 1972, // 367: sys_getsockname
+ 1768, // 368: sys_getpeername
+ 5024, // 369: sys_sendto
+ 5012, // 370: sys_sendmsg
+ 4198, // 371: sys_recvfrom
+ 4244, // 372: sys_recvmsg
+ 5602, // 373: sys_shutdown
+ 6453, // 374: sys_userfaultfd
+ 2797, // 375: sys_membarrier
+ 2930, // 376: sys_mlock2
+ 617, // 377: sys_copy_file_range
+ 3835, // 378: sys_preadv2
+ 4046, // 379: sys_pwritev2
+ 3748, // 380: sys_pkey_mprotect
+ 3719, // 381: sys_pkey_alloc
+ 3734, // 382: sys_pkey_free
+ 5852, // 383: sys_statx
134, // 384: sys_arch_prctl
- 1900, // 385: sys_io_pgetevents
- 3574, // 386: sys_rseq
+ 2226, // 385: sys_io_pgetevents
+ 4377, // 386: sys_rseq
+ 0, // 387:
+ 0, // 388:
+ 0, // 389:
+ 0, // 390:
+ 0, // 391:
+ 0, // 392:
+ 4904, // 393: sys_semget
+ 4893, // 394: sys_semctl
+ 5591, // 395: sys_shmget
+ 5570, // 396: sys_shmctl
+ 5560, // 397: sys_shmat
+ 5581, // 398: sys_shmdt
+ 3235, // 399: sys_msgget
+ 3257, // 400: sys_msgsnd
+ 3246, // 401: sys_msgrcv
+ 3224, // 402: sys_msgctl
+ 453, // 403: sys_clock_gettime64
+ 538, // 404: sys_clock_settime64
+ 374, // 405: sys_clock_adjtime64
+ 411, // 406: sys_clock_getres_time64
+ 493, // 407: sys_clock_nanosleep_time64
+ 6116, // 408: sys_timer_gettime64
+ 6154, // 409: sys_timer_settime64
+ 6213, // 410: sys_timerfd_gettime64
+ 6255, // 411: sys_timerfd_settime64
+ 6503, // 412: sys_utimensat_time64
+ 3978, // 413: sys_pselect6_time64
+ 3785, // 414: sys_ppoll_time64
+ 0, // 415:
+ 2244, // 416: sys_io_pgetevents_time64
+ 4224, // 417: sys_recvmmsg_time64
+ 3175, // 418: sys_mq_timedsend_time64
+ 3131, // 419: sys_mq_timedreceive_time64
+ 4940, // 420: sys_semtimedop_time64
+ 4515, // 421: sys_rt_sigtimedwait_time64
+ 1443, // 422: sys_futex_time64
+ 4726, // 423: sys_sched_rr_get_interval_time64
+ 3663, // 424: sys_pidfd_send_signal
+ 2337, // 425: sys_io_uring_setup
+ 2296, // 426: sys_io_uring_enter
+ 2315, // 427: sys_io_uring_register
+ 3489, // 428: sys_open_tree
+ 3016, // 429: sys_move_mount
+ 1269, // 430: sys_fsopen
+ 1230, // 431: sys_fsconfig
+ 1257, // 432: sys_fsmount
+ 1280, // 433: sys_fspick
+ 3648, // 434: sys_pidfd_open
+ 568, // 435: sys_clone3
+ 589, // 436: sys_close_range
+ 3514, // 437: sys_openat2
+ 3632, // 438: sys_pidfd_getfd
+ 930, // 439: sys_faccessat2
+ 3861, // 440: sys_process_madvise
+ 792, // 441: sys_epoll_pwait2
+ 2998, // 442: sys_mount_setattr
+ 4089, // 443: sys_quotactl_fd
+ 2510, // 444: sys_landlock_create_ruleset
+ 2488, // 445: sys_landlock_add_rule
+ 2538, // 446: sys_landlock_restrict_self
+ 2829, // 447: sys_memfd_secret
+ 3881, // 448: sys_process_mrelease
+ 1475, // 449: sys_futex_waitv
+ 5053, // 450: sys_set_mempolicy_home_node
+ 267, // 451: sys_cachestat
+ 1061, // 452: sys_fchmodat2
+ 2766, // 453: sys_map_shadow_stack
+ 1491, // 454: sys_futex_wake
+ 1460, // 455: sys_futex_wait
+ 1425, // 456: sys_futex_requeue
};
};
struct SyscallTable_x86_64 {
static constexpr const char* names = kAllSyscalllNames;
static constexpr SyscallTable::OffT offsets[]{
- 3322, // 0: sys_read
- 5639, // 1: sys_write
- 2848, // 2: sys_open
- 443, // 3: sys_close
- 4895, // 4: sys_stat
- 1046, // 5: sys_fstat
- 2244, // 6: sys_lstat
- 3077, // 7: sys_poll
- 2220, // 8: sys_lseek
- 2428, // 9: sys_mmap
- 2487, // 10: sys_mprotect
- 2695, // 11: sys_munmap
+ 4105, // 0: sys_read
+ 6636, // 1: sys_write
+ 3458, // 2: sys_open
+ 579, // 3: sys_close
+ 5808, // 4: sys_stat
+ 1291, // 5: sys_fstat
+ 2732, // 6: sys_lstat
+ 3766, // 7: sys_poll
+ 2708, // 8: sys_lseek
+ 2954, // 9: sys_mmap
+ 3046, // 10: sys_mprotect
+ 3305, // 11: sys_munmap
259, // 12: sys_brk
- 3583, // 13: sys_rt_sigaction
- 3618, // 14: sys_rt_sigprocmask
- 3657, // 15: sys_rt_sigreturn
- 1945, // 16: sys_ioctl
- 3106, // 17: sys_pread64
- 3254, // 18: sys_pwrite64
- 3385, // 19: sys_readv
- 5649, // 20: sys_writev
+ 4386, // 13: sys_rt_sigaction
+ 4421, // 14: sys_rt_sigprocmask
+ 4460, // 15: sys_rt_sigreturn
+ 2356, // 16: sys_ioctl
+ 3812, // 17: sys_pread64
+ 4021, // 18: sys_pwrite64
+ 4168, // 19: sys_readv
+ 6646, // 20: sys_writev
63, // 21: sys_access
- 2996, // 22: sys_pipe
- 4019, // 23: sys_select
- 3978, // 24: sys_sched_yield
- 2603, // 25: sys_mremap
- 2658, // 26: sys_msync
- 2338, // 27: sys_mincore
- 2266, // 28: sys_madvise
- 4678, // 29: sys_shmget
- 4647, // 30: sys_shmat
- 4657, // 31: sys_shmctl
- 531, // 32: sys_dup
- 539, // 33: sys_dup2
- 2890, // 34: sys_pause
- 2728, // 35: sys_nanosleep
- 1428, // 36: sys_getitimer
+ 3685, // 22: sys_pipe
+ 4882, // 23: sys_select
+ 4841, // 24: sys_sched_yield
+ 3213, // 25: sys_mremap
+ 3268, // 26: sys_msync
+ 2864, // 27: sys_mincore
+ 2754, // 28: sys_madvise
+ 5591, // 29: sys_shmget
+ 5560, // 30: sys_shmat
+ 5570, // 31: sys_shmctl
+ 683, // 32: sys_dup
+ 691, // 33: sys_dup2
+ 3526, // 34: sys_pause
+ 3338, // 35: sys_nanosleep
+ 1754, // 36: sys_getitimer
124, // 37: sys_alarm
- 4372, // 38: sys_setitimer
- 1482, // 39: sys_getpid
- 4086, // 40: sys_sendfile
- 4830, // 41: sys_socket
- 453, // 42: sys_connect
+ 5285, // 38: sys_setitimer
+ 1808, // 39: sys_getpid
+ 4971, // 40: sys_sendfile
+ 5743, // 41: sys_socket
+ 605, // 42: sys_connect
40, // 43: sys_accept
- 4139, // 44: sys_sendto
- 3415, // 45: sys_recvfrom
- 4127, // 46: sys_sendmsg
- 3441, // 47: sys_recvmsg
- 4689, // 48: sys_shutdown
+ 5024, // 44: sys_sendto
+ 4198, // 45: sys_recvfrom
+ 5012, // 46: sys_sendmsg
+ 4244, // 47: sys_recvmsg
+ 5602, // 48: sys_shutdown
232, // 49: sys_bind
- 2135, // 50: sys_listen
- 1646, // 51: sys_getsockname
- 1442, // 52: sys_getpeername
- 4856, // 53: sys_socketpair
- 4565, // 54: sys_setsockopt
- 1662, // 55: sys_getsockopt
- 433, // 56: sys_clone
- 1006, // 57: sys_fork
- 5538, // 58: sys_vfork
- 699, // 59: sys_execve
- 723, // 60: sys_exit
- 5606, // 61: sys_wait4
- 2068, // 62: sys_kill
- 5420, // 63: sys_uname
- 4041, // 64: sys_semget
- 4052, // 65: sys_semop
- 4030, // 66: sys_semctl
- 4668, // 67: sys_shmdt
- 2625, // 68: sys_msgget
- 2647, // 69: sys_msgsnd
- 2636, // 70: sys_msgrcv
- 2614, // 71: sys_msgctl
- 914, // 72: sys_fcntl
- 996, // 73: sys_flock
- 1120, // 74: sys_fsync
- 936, // 75: sys_fdatasync
- 5321, // 76: sys_truncate
- 1140, // 77: sys_ftruncate
- 1294, // 78: sys_getdents
- 1283, // 79: sys_getcwd
- 289, // 80: sys_chdir
- 842, // 81: sys_fchdir
- 3490, // 82: sys_rename
- 2350, // 83: sys_mkdir
- 3564, // 84: sys_rmdir
- 485, // 85: sys_creat
- 2115, // 86: sys_link
- 5430, // 87: sys_unlink
- 4991, // 88: sys_symlink
- 3357, // 89: sys_readlink
- 299, // 90: sys_chmod
- 853, // 91: sys_fchmod
- 309, // 92: sys_chown
- 877, // 93: sys_fchown
- 2077, // 94: sys_lchown
- 5387, // 95: sys_umask
- 1688, // 96: sys_gettimeofday
- 1607, // 97: sys_getrlimit
- 1621, // 98: sys_getrusage
- 5100, // 99: sys_sysinfo
- 5301, // 100: sys_times
- 3231, // 101: sys_ptrace
- 1705, // 102: sys_getuid
- 5112, // 103: sys_syslog
- 1374, // 104: sys_getgid
- 4597, // 105: sys_setuid
- 4302, // 106: sys_setgid
- 1348, // 107: sys_geteuid
- 1322, // 108: sys_getegid
- 4396, // 109: sys_setpgid
- 1505, // 110: sys_getppid
- 1470, // 111: sys_getpgrp
- 4554, // 112: sys_setsid
- 4512, // 113: sys_setreuid
- 4424, // 114: sys_setregid
- 1398, // 115: sys_getgroups
- 4326, // 116: sys_setgroups
- 4482, // 117: sys_setresuid
- 1577, // 118: sys_getresuid
- 4452, // 119: sys_setresgid
- 1547, // 120: sys_getresgid
- 1458, // 121: sys_getpgid
- 4274, // 122: sys_setfsuid
- 4246, // 123: sys_setfsgid
- 1635, // 124: sys_getsid
- 267, // 125: sys_capget
- 278, // 126: sys_capset
- 3600, // 127: sys_rt_sigpending
- 3692, // 128: sys_rt_sigtimedwait
- 3637, // 129: sys_rt_sigqueueinfo
- 3674, // 130: sys_rt_sigsuspend
- 4716, // 131: sys_sigaltstack
- 5503, // 132: sys_utime
- 2372, // 133: sys_mknod
- 5466, // 134: sys_uselib
- 2980, // 135: sys_personality
- 5493, // 136: sys_ustat
- 4915, // 137: sys_statfs
- 1094, // 138: sys_fstatfs
- 5090, // 139: sys_sysfs
- 1517, // 140: sys_getpriority
- 4408, // 141: sys_setpriority
- 3936, // 142: sys_sched_setparam
- 3828, // 143: sys_sched_getparam
- 3955, // 144: sys_sched_setscheduler
- 3847, // 145: sys_sched_getscheduler
- 3734, // 146: sys_sched_get_priority_max
- 3761, // 147: sys_sched_get_priority_min
- 3870, // 148: sys_sched_rr_get_interval
- 2394, // 149: sys_mlock
- 2668, // 150: sys_munlock
- 2415, // 151: sys_mlockall
- 2680, // 152: sys_munlockall
- 5548, // 153: sys_vhangup
- 2447, // 154: sys_modify_ldt
- 3015, // 155: sys_pivot_root
+ 2623, // 50: sys_listen
+ 1972, // 51: sys_getsockname
+ 1768, // 52: sys_getpeername
+ 5769, // 53: sys_socketpair
+ 5478, // 54: sys_setsockopt
+ 1988, // 55: sys_getsockopt
+ 558, // 56: sys_clone
+ 1204, // 57: sys_fork
+ 6535, // 58: sys_vfork
+ 868, // 59: sys_execve
+ 892, // 60: sys_exit
+ 6603, // 61: sys_wait4
+ 2479, // 62: sys_kill
+ 6396, // 63: sys_uname
+ 4904, // 64: sys_semget
+ 4915, // 65: sys_semop
+ 4893, // 66: sys_semctl
+ 5581, // 67: sys_shmdt
+ 3235, // 68: sys_msgget
+ 3257, // 69: sys_msgsnd
+ 3246, // 70: sys_msgrcv
+ 3224, // 71: sys_msgctl
+ 1112, // 72: sys_fcntl
+ 1194, // 73: sys_flock
+ 1365, // 74: sys_fsync
+ 1134, // 75: sys_fdatasync
+ 6297, // 76: sys_truncate
+ 1385, // 77: sys_ftruncate
+ 1620, // 78: sys_getdents
+ 1609, // 79: sys_getcwd
+ 303, // 80: sys_chdir
+ 1026, // 81: sys_fchdir
+ 4293, // 82: sys_rename
+ 2876, // 83: sys_mkdir
+ 4367, // 84: sys_rmdir
+ 637, // 85: sys_creat
+ 2603, // 86: sys_link
+ 6406, // 87: sys_unlink
+ 5904, // 88: sys_symlink
+ 4140, // 89: sys_readlink
+ 313, // 90: sys_chmod
+ 1037, // 91: sys_fchmod
+ 323, // 92: sys_chown
+ 1075, // 93: sys_fchown
+ 2565, // 94: sys_lchown
+ 6363, // 95: sys_umask
+ 2014, // 96: sys_gettimeofday
+ 1933, // 97: sys_getrlimit
+ 1947, // 98: sys_getrusage
+ 5992, // 99: sys_sysinfo
+ 6277, // 100: sys_times
+ 3998, // 101: sys_ptrace
+ 2031, // 102: sys_getuid
+ 6004, // 103: sys_syslog
+ 1700, // 104: sys_getgid
+ 5510, // 105: sys_setuid
+ 5215, // 106: sys_setgid
+ 1674, // 107: sys_geteuid
+ 1648, // 108: sys_getegid
+ 5309, // 109: sys_setpgid
+ 1831, // 110: sys_getppid
+ 1796, // 111: sys_getpgrp
+ 5467, // 112: sys_setsid
+ 5425, // 113: sys_setreuid
+ 5337, // 114: sys_setregid
+ 1724, // 115: sys_getgroups
+ 5239, // 116: sys_setgroups
+ 5395, // 117: sys_setresuid
+ 1903, // 118: sys_getresuid
+ 5365, // 119: sys_setresgid
+ 1873, // 120: sys_getresgid
+ 1784, // 121: sys_getpgid
+ 5187, // 122: sys_setfsuid
+ 5159, // 123: sys_setfsgid
+ 1961, // 124: sys_getsid
+ 281, // 125: sys_capget
+ 292, // 126: sys_capset
+ 4403, // 127: sys_rt_sigpending
+ 4495, // 128: sys_rt_sigtimedwait
+ 4440, // 129: sys_rt_sigqueueinfo
+ 4477, // 130: sys_rt_sigsuspend
+ 5629, // 131: sys_sigaltstack
+ 6479, // 132: sys_utime
+ 2898, // 133: sys_mknod
+ 6442, // 134: sys_uselib
+ 3616, // 135: sys_personality
+ 6469, // 136: sys_ustat
+ 5828, // 137: sys_statfs
+ 1339, // 138: sys_fstatfs
+ 5982, // 139: sys_sysfs
+ 1843, // 140: sys_getpriority
+ 5321, // 141: sys_setpriority
+ 4799, // 142: sys_sched_setparam
+ 4658, // 143: sys_sched_getparam
+ 4818, // 144: sys_sched_setscheduler
+ 4677, // 145: sys_sched_getscheduler
+ 4564, // 146: sys_sched_get_priority_max
+ 4591, // 147: sys_sched_get_priority_min
+ 4700, // 148: sys_sched_rr_get_interval
+ 2920, // 149: sys_mlock
+ 3278, // 150: sys_munlock
+ 2941, // 151: sys_mlockall
+ 3290, // 152: sys_munlockall
+ 6545, // 153: sys_vhangup
+ 2973, // 154: sys_modify_ldt
+ 3704, // 155: sys_pivot_root
28, // 156: sys__sysctl
- 3096, // 157: sys_prctl
+ 3802, // 157: sys_prctl
134, // 158: sys_arch_prctl
95, // 159: sys_adjtimex
- 4540, // 160: sys_setrlimit
- 331, // 161: sys_chroot
- 5017, // 162: sys_sync
+ 5453, // 160: sys_setrlimit
+ 345, // 161: sys_chroot
+ 5930, // 162: sys_sync
74, // 163: sys_acct
- 4580, // 164: sys_settimeofday
- 2462, // 165: sys_mount
- 5408, // 166: sys_umount2
- 4980, // 167: sys_swapon
- 4968, // 168: sys_swapoff
- 3395, // 169: sys_reboot
- 4356, // 170: sys_sethostname
- 4228, // 171: sys_setdomainname
- 1966, // 172: sys_iopl
- 1955, // 173: sys_ioperm
- 495, // 174: sys_create_module
- 1760, // 175: sys_init_module
- 513, // 176: sys_delete_module
- 1194, // 177: sys_get_kernel_syms
- 3292, // 178: sys_query_module
- 3309, // 179: sys_quotactl
- 2757, // 180: sys_nfsservctl
- 1493, // 181: sys_getpmsg
- 3242, // 182: sys_putpmsg
+ 5493, // 164: sys_settimeofday
+ 2988, // 165: sys_mount
+ 6384, // 166: sys_umount2
+ 5893, // 167: sys_swapon
+ 5881, // 168: sys_swapoff
+ 4178, // 169: sys_reboot
+ 5269, // 170: sys_sethostname
+ 5141, // 171: sys_setdomainname
+ 2377, // 172: sys_iopl
+ 2366, // 173: sys_ioperm
+ 647, // 174: sys_create_module
+ 2086, // 175: sys_init_module
+ 665, // 176: sys_delete_module
+ 1520, // 177: sys_get_kernel_syms
+ 4059, // 178: sys_query_module
+ 4076, // 179: sys_quotactl
+ 3367, // 180: sys_nfsservctl
+ 1819, // 181: sys_getpmsg
+ 4009, // 182: sys_putpmsg
108, // 183: sys_afs_syscall
- 5349, // 184: sys_tuxcall
- 4006, // 185: sys_security
- 1677, // 186: sys_gettid
- 3331, // 187: sys_readahead
- 4621, // 188: sys_setxattr
- 2230, // 189: sys_lsetxattr
- 1032, // 190: sys_fsetxattr
- 1729, // 191: sys_getxattr
- 2101, // 192: sys_lgetxattr
- 950, // 193: sys_fgetxattr
- 2146, // 194: sys_listxattr
- 2160, // 195: sys_llistxattr
- 981, // 196: sys_flistxattr
- 3474, // 197: sys_removexattr
- 2203, // 198: sys_lremovexattr
- 1015, // 199: sys_fremovexattr
- 5311, // 200: sys_tkill
- 5142, // 201: sys_time
- 1170, // 202: sys_futex
- 3896, // 203: sys_sched_setaffinity
- 3788, // 204: sys_sched_getaffinity
- 4188, // 205: sys_set_thread_area
- 1918, // 206: sys_io_setup
- 1868, // 207: sys_io_destroy
- 1883, // 208: sys_io_getevents
- 1931, // 209: sys_io_submit
- 1854, // 210: sys_io_cancel
- 1252, // 211: sys_get_thread_area
- 2184, // 212: sys_lookup_dcookie
- 557, // 213: sys_epoll_create
- 606, // 214: sys_epoll_ctl_old
- 655, // 215: sys_epoll_wait_old
- 3453, // 216: sys_remap_file_pages
- 1307, // 217: sys_getdents64
- 4208, // 218: sys_set_tid_address
- 3544, // 219: sys_restart_syscall
- 4062, // 220: sys_semtimedop
- 761, // 221: sys_fadvise64
- 5151, // 222: sys_timer_create
- 5224, // 223: sys_timer_settime
- 5206, // 224: sys_timer_gettime
- 5185, // 225: sys_timer_getoverrun
- 5168, // 226: sys_timer_delete
- 415, // 227: sys_clock_settime
- 377, // 228: sys_clock_gettime
- 360, // 229: sys_clock_getres
- 395, // 230: sys_clock_nanosleep
- 732, // 231: sys_exit_group
- 640, // 232: sys_epoll_wait
- 592, // 233: sys_epoll_ctl
- 5131, // 234: sys_tgkill
- 5527, // 235: sys_utimes
- 5594, // 236: sys_vserver
- 2278, // 237: sys_mbind
- 4150, // 238: sys_set_mempolicy
- 1214, // 239: sys_get_mempolicy
- 2540, // 240: sys_mq_open
- 2589, // 241: sys_mq_unlink
- 2572, // 242: sys_mq_timedsend
- 2552, // 243: sys_mq_timedreceive
- 2526, // 244: sys_mq_notify
- 2508, // 245: sys_mq_getsetattr
- 2042, // 246: sys_kexec_load
- 5616, // 247: sys_waitid
+ 6325, // 184: sys_tuxcall
+ 4869, // 185: sys_security
+ 2003, // 186: sys_gettid
+ 4114, // 187: sys_readahead
+ 5534, // 188: sys_setxattr
+ 2718, // 189: sys_lsetxattr
+ 1243, // 190: sys_fsetxattr
+ 2055, // 191: sys_getxattr
+ 2589, // 192: sys_lgetxattr
+ 1148, // 193: sys_fgetxattr
+ 2634, // 194: sys_listxattr
+ 2648, // 195: sys_llistxattr
+ 1179, // 196: sys_flistxattr
+ 4277, // 197: sys_removexattr
+ 2691, // 198: sys_lremovexattr
+ 1213, // 199: sys_fremovexattr
+ 6287, // 200: sys_tkill
+ 6034, // 201: sys_time
+ 1415, // 202: sys_futex
+ 4759, // 203: sys_sched_setaffinity
+ 4618, // 204: sys_sched_getaffinity
+ 5101, // 205: sys_set_thread_area
+ 2269, // 206: sys_io_setup
+ 2194, // 207: sys_io_destroy
+ 2209, // 208: sys_io_getevents
+ 2282, // 209: sys_io_submit
+ 2180, // 210: sys_io_cancel
+ 1578, // 211: sys_get_thread_area
+ 2672, // 212: sys_lookup_dcookie
+ 709, // 213: sys_epoll_create
+ 758, // 214: sys_epoll_ctl_old
+ 824, // 215: sys_epoll_wait_old
+ 4256, // 216: sys_remap_file_pages
+ 1633, // 217: sys_getdents64
+ 5121, // 218: sys_set_tid_address
+ 4347, // 219: sys_restart_syscall
+ 4925, // 220: sys_semtimedop
+ 945, // 221: sys_fadvise64
+ 6043, // 222: sys_timer_create
+ 6136, // 223: sys_timer_settime
+ 6098, // 224: sys_timer_gettime
+ 6077, // 225: sys_timer_getoverrun
+ 6060, // 226: sys_timer_delete
+ 520, // 227: sys_clock_settime
+ 435, // 228: sys_clock_gettime
+ 394, // 229: sys_clock_getres
+ 473, // 230: sys_clock_nanosleep
+ 901, // 231: sys_exit_group
+ 809, // 232: sys_epoll_wait
+ 744, // 233: sys_epoll_ctl
+ 6023, // 234: sys_tgkill
+ 6524, // 235: sys_utimes
+ 6591, // 236: sys_vserver
+ 2787, // 237: sys_mbind
+ 5035, // 238: sys_set_mempolicy
+ 1540, // 239: sys_get_mempolicy
+ 3099, // 240: sys_mq_open
+ 3199, // 241: sys_mq_unlink
+ 3158, // 242: sys_mq_timedsend
+ 3111, // 243: sys_mq_timedreceive
+ 3085, // 244: sys_mq_notify
+ 3067, // 245: sys_mq_getsetattr
+ 2453, // 246: sys_kexec_load
+ 6613, // 247: sys_waitid
83, // 248: sys_add_key
- 3528, // 249: sys_request_key
- 2057, // 250: sys_keyctl
- 1990, // 251: sys_ioprio_set
- 1975, // 252: sys_ioprio_get
- 1798, // 253: sys_inotify_init
- 1776, // 254: sys_inotify_add_watch
- 1833, // 255: sys_inotify_rm_watch
- 2320, // 256: sys_migrate_pages
- 2879, // 257: sys_openat
- 2360, // 258: sys_mkdirat
- 2382, // 259: sys_mknodat
- 901, // 260: sys_fchownat
- 1180, // 261: sys_futimesat
- 2742, // 262: sys_newfstatat
- 5441, // 263: sys_unlinkat
- 3501, // 264: sys_renameat
- 2124, // 265: sys_linkat
- 5003, // 266: sys_symlinkat
- 3370, // 267: sys_readlinkat
- 864, // 268: sys_fchmodat
- 747, // 269: sys_faccessat
- 3218, // 270: sys_pselect6
- 3086, // 271: sys_ppoll
- 5454, // 272: sys_unshare
- 4168, // 273: sys_set_robust_list
- 1232, // 274: sys_get_robust_list
- 4871, // 275: sys_splice
- 5123, // 276: sys_tee
- 5026, // 277: sys_sync_file_range
- 5581, // 278: sys_vmsplice
- 2472, // 279: sys_move_pages
- 5513, // 280: sys_utimensat
- 624, // 281: sys_epoll_pwait
- 4743, // 282: sys_signalfd
- 5242, // 283: sys_timerfd_create
- 674, // 284: sys_eventfd
- 792, // 285: sys_fallocate
- 5281, // 286: sys_timerfd_settime
- 5261, // 287: sys_timerfd_gettime
+ 4331, // 249: sys_request_key
+ 2468, // 250: sys_keyctl
+ 2401, // 251: sys_ioprio_set
+ 2386, // 252: sys_ioprio_get
+ 2124, // 253: sys_inotify_init
+ 2102, // 254: sys_inotify_add_watch
+ 2159, // 255: sys_inotify_rm_watch
+ 2846, // 256: sys_migrate_pages
+ 3503, // 257: sys_openat
+ 2886, // 258: sys_mkdirat
+ 2908, // 259: sys_mknodat
+ 1099, // 260: sys_fchownat
+ 1506, // 261: sys_futimesat
+ 3352, // 262: sys_newfstatat
+ 6417, // 263: sys_unlinkat
+ 4304, // 264: sys_renameat
+ 2612, // 265: sys_linkat
+ 5916, // 266: sys_symlinkat
+ 4153, // 267: sys_readlinkat
+ 1048, // 268: sys_fchmodat
+ 916, // 269: sys_faccessat
+ 3965, // 270: sys_pselect6
+ 3775, // 271: sys_ppoll
+ 6430, // 272: sys_unshare
+ 5081, // 273: sys_set_robust_list
+ 1558, // 274: sys_get_robust_list
+ 5784, // 275: sys_splice
+ 6015, // 276: sys_tee
+ 5939, // 277: sys_sync_file_range
+ 6578, // 278: sys_vmsplice
+ 3031, // 279: sys_move_pages
+ 6489, // 280: sys_utimensat
+ 776, // 281: sys_epoll_pwait
+ 5656, // 282: sys_signalfd
+ 6174, // 283: sys_timerfd_create
+ 843, // 284: sys_eventfd
+ 976, // 285: sys_fallocate
+ 6235, // 286: sys_timerfd_settime
+ 6193, // 287: sys_timerfd_gettime
51, // 288: sys_accept4
- 4756, // 289: sys_signalfd4
- 686, // 290: sys_eventfd2
- 574, // 291: sys_epoll_create1
- 548, // 292: sys_dup3
- 3005, // 293: sys_pipe2
- 1815, // 294: sys_inotify_init1
- 3118, // 295: sys_preadv
- 3267, // 296: sys_pwritev
- 3712, // 297: sys_rt_tgsigqueueinfo
- 2960, // 298: sys_perf_event_open
- 3428, // 299: sys_recvmmsg
- 806, // 300: sys_fanotify_init
- 824, // 301: sys_fanotify_mark
- 3141, // 302: sys_prlimit64
- 2706, // 303: sys_name_to_handle_at
- 2857, // 304: sys_open_by_handle_at
- 342, // 305: sys_clock_adjtime
- 5067, // 306: sys_syncfs
- 4114, // 307: sys_sendmmsg
- 4386, // 308: sys_setns
- 1272, // 309: sys_getcpu
- 3155, // 310: sys_process_vm_readv
- 3176, // 311: sys_process_vm_writev
- 2013, // 312: sys_kcmp
- 964, // 313: sys_finit_module
- 3918, // 314: sys_sched_setattr
- 3810, // 315: sys_sched_getattr
- 3514, // 316: sys_renameat2
- 3994, // 317: sys_seccomp
- 1533, // 318: sys_getrandom
- 2303, // 319: sys_memfd_create
- 2022, // 320: sys_kexec_file_load
+ 5669, // 289: sys_signalfd4
+ 855, // 290: sys_eventfd2
+ 726, // 291: sys_epoll_create1
+ 700, // 292: sys_dup3
+ 3694, // 293: sys_pipe2
+ 2141, // 294: sys_inotify_init1
+ 3824, // 295: sys_preadv
+ 4034, // 296: sys_pwritev
+ 4542, // 297: sys_rt_tgsigqueueinfo
+ 3596, // 298: sys_perf_event_open
+ 4211, // 299: sys_recvmmsg
+ 990, // 300: sys_fanotify_init
+ 1008, // 301: sys_fanotify_mark
+ 3847, // 302: sys_prlimit64
+ 3316, // 303: sys_name_to_handle_at
+ 3467, // 304: sys_open_by_handle_at
+ 356, // 305: sys_clock_adjtime
+ 5959, // 306: sys_syncfs
+ 4999, // 307: sys_sendmmsg
+ 5299, // 308: sys_setns
+ 1598, // 309: sys_getcpu
+ 3902, // 310: sys_process_vm_readv
+ 3923, // 311: sys_process_vm_writev
+ 2424, // 312: sys_kcmp
+ 1162, // 313: sys_finit_module
+ 4781, // 314: sys_sched_setattr
+ 4640, // 315: sys_sched_getattr
+ 4317, // 316: sys_renameat2
+ 4857, // 317: sys_seccomp
+ 1859, // 318: sys_getrandom
+ 2812, // 319: sys_memfd_create
+ 2433, // 320: sys_kexec_file_load
241, // 321: sys_bpf
- 710, // 322: sys_execveat
- 5477, // 323: sys_userfaultfd
- 2288, // 324: sys_membarrier
- 2404, // 325: sys_mlock2
- 465, // 326: sys_copy_file_range
- 3129, // 327: sys_preadv2
- 3279, // 328: sys_pwritev2
- 3059, // 329: sys_pkey_mprotect
- 3030, // 330: sys_pkey_alloc
- 3045, // 331: sys_pkey_free
- 4939, // 332: sys_statx
- 1900, // 333: sys_io_pgetevents
- 3574, // 334: sys_rseq
+ 879, // 322: sys_execveat
+ 6453, // 323: sys_userfaultfd
+ 2797, // 324: sys_membarrier
+ 2930, // 325: sys_mlock2
+ 617, // 326: sys_copy_file_range
+ 3835, // 327: sys_preadv2
+ 4046, // 328: sys_pwritev2
+ 3748, // 329: sys_pkey_mprotect
+ 3719, // 330: sys_pkey_alloc
+ 3734, // 331: sys_pkey_free
+ 5852, // 332: sys_statx
+ 2226, // 333: sys_io_pgetevents
+ 4377, // 334: sys_rseq
0, // 335:
0, // 336:
0, // 337:
@@ -2355,39 +2292,39 @@
0, // 421:
0, // 422:
0, // 423:
- 0, // 424:
- 0, // 425:
- 0, // 426:
- 0, // 427:
- 0, // 428:
- 0, // 429:
- 0, // 430:
- 0, // 431:
- 0, // 432:
- 0, // 433:
- 0, // 434:
- 0, // 435:
- 0, // 436:
- 0, // 437:
- 0, // 438:
- 0, // 439:
- 0, // 440:
- 0, // 441:
- 0, // 442:
- 0, // 443:
- 0, // 444:
- 0, // 445:
- 0, // 446:
- 0, // 447:
- 0, // 448:
- 0, // 449:
- 0, // 450:
- 0, // 451:
- 0, // 452:
- 0, // 453:
- 0, // 454:
- 0, // 455:
- 0, // 456:
+ 3663, // 424: sys_pidfd_send_signal
+ 2337, // 425: sys_io_uring_setup
+ 2296, // 426: sys_io_uring_enter
+ 2315, // 427: sys_io_uring_register
+ 3489, // 428: sys_open_tree
+ 3016, // 429: sys_move_mount
+ 1269, // 430: sys_fsopen
+ 1230, // 431: sys_fsconfig
+ 1257, // 432: sys_fsmount
+ 1280, // 433: sys_fspick
+ 3648, // 434: sys_pidfd_open
+ 568, // 435: sys_clone3
+ 589, // 436: sys_close_range
+ 3514, // 437: sys_openat2
+ 3632, // 438: sys_pidfd_getfd
+ 930, // 439: sys_faccessat2
+ 3861, // 440: sys_process_madvise
+ 792, // 441: sys_epoll_pwait2
+ 2998, // 442: sys_mount_setattr
+ 4089, // 443: sys_quotactl_fd
+ 2510, // 444: sys_landlock_create_ruleset
+ 2488, // 445: sys_landlock_add_rule
+ 2538, // 446: sys_landlock_restrict_self
+ 2829, // 447: sys_memfd_secret
+ 3881, // 448: sys_process_mrelease
+ 1475, // 449: sys_futex_waitv
+ 5053, // 450: sys_set_mempolicy_home_node
+ 267, // 451: sys_cachestat
+ 1061, // 452: sys_fchmodat2
+ 2766, // 453: sys_map_shadow_stack
+ 1491, // 454: sys_futex_wake
+ 1460, // 455: sys_futex_wait
+ 1425, // 456: sys_futex_requeue
0, // 457:
0, // 458:
0, // 459:
@@ -2443,42 +2380,42 @@
0, // 509:
0, // 510:
0, // 511:
- 3583, // 512: sys_rt_sigaction
- 3657, // 513: sys_rt_sigreturn
- 1945, // 514: sys_ioctl
- 3385, // 515: sys_readv
- 5649, // 516: sys_writev
- 3415, // 517: sys_recvfrom
- 4127, // 518: sys_sendmsg
- 3441, // 519: sys_recvmsg
- 699, // 520: sys_execve
- 3231, // 521: sys_ptrace
- 3600, // 522: sys_rt_sigpending
- 3692, // 523: sys_rt_sigtimedwait
- 3637, // 524: sys_rt_sigqueueinfo
- 4716, // 525: sys_sigaltstack
- 5151, // 526: sys_timer_create
- 2526, // 527: sys_mq_notify
- 2042, // 528: sys_kexec_load
- 5616, // 529: sys_waitid
- 4168, // 530: sys_set_robust_list
- 1232, // 531: sys_get_robust_list
- 5581, // 532: sys_vmsplice
- 2472, // 533: sys_move_pages
- 3118, // 534: sys_preadv
- 3267, // 535: sys_pwritev
- 3712, // 536: sys_rt_tgsigqueueinfo
- 3428, // 537: sys_recvmmsg
- 4114, // 538: sys_sendmmsg
- 3155, // 539: sys_process_vm_readv
- 3176, // 540: sys_process_vm_writev
- 4565, // 541: sys_setsockopt
- 1662, // 542: sys_getsockopt
- 1918, // 543: sys_io_setup
- 1931, // 544: sys_io_submit
- 710, // 545: sys_execveat
- 3129, // 546: sys_preadv2
- 3279, // 547: sys_pwritev2
+ 4386, // 512: sys_rt_sigaction
+ 4460, // 513: sys_rt_sigreturn
+ 2356, // 514: sys_ioctl
+ 4168, // 515: sys_readv
+ 6646, // 516: sys_writev
+ 4198, // 517: sys_recvfrom
+ 5012, // 518: sys_sendmsg
+ 4244, // 519: sys_recvmsg
+ 868, // 520: sys_execve
+ 3998, // 521: sys_ptrace
+ 4403, // 522: sys_rt_sigpending
+ 4495, // 523: sys_rt_sigtimedwait
+ 4440, // 524: sys_rt_sigqueueinfo
+ 5629, // 525: sys_sigaltstack
+ 6043, // 526: sys_timer_create
+ 3085, // 527: sys_mq_notify
+ 2453, // 528: sys_kexec_load
+ 6613, // 529: sys_waitid
+ 5081, // 530: sys_set_robust_list
+ 1558, // 531: sys_get_robust_list
+ 6578, // 532: sys_vmsplice
+ 3031, // 533: sys_move_pages
+ 3824, // 534: sys_preadv
+ 4034, // 535: sys_pwritev
+ 4542, // 536: sys_rt_tgsigqueueinfo
+ 4211, // 537: sys_recvmmsg
+ 4999, // 538: sys_sendmmsg
+ 3902, // 539: sys_process_vm_readv
+ 3923, // 540: sys_process_vm_writev
+ 5478, // 541: sys_setsockopt
+ 1988, // 542: sys_getsockopt
+ 2269, // 543: sys_io_setup
+ 2282, // 544: sys_io_submit
+ 879, // 545: sys_execveat
+ 3835, // 546: sys_preadv2
+ 4046, // 547: sys_pwritev2
};
};
diff --git a/src/kernel_utils/syscall_table_unittest.cc b/src/kernel_utils/syscall_table_unittest.cc
index 30390f3..c5bcc11 100644
--- a/src/kernel_utils/syscall_table_unittest.cc
+++ b/src/kernel_utils/syscall_table_unittest.cc
@@ -21,8 +21,8 @@
namespace perfetto {
namespace {
-TEST(SyscallTableTest, Aarch64) {
- SyscallTable t(Architecture::kAarch64);
+TEST(SyscallTableTest, Arm64) {
+ SyscallTable t(Architecture::kArm64);
EXPECT_STREQ(t.GetById(0), "sys_io_setup");
EXPECT_EQ(t.GetByName("sys_io_setup"), 0u);
@@ -35,14 +35,14 @@
EXPECT_STREQ(t.GetById(293), "sys_rseq");
EXPECT_EQ(t.GetByName("sys_rseq"), 293u);
- EXPECT_STREQ(t.GetById(294), nullptr);
+ EXPECT_STREQ(t.GetById(457), nullptr);
EXPECT_STREQ(t.GetById(kMaxSyscalls), nullptr);
EXPECT_EQ(t.GetByName("sys_non_existent"), std::nullopt);
}
-TEST(SyscallTableTest, ArmEabi) {
- SyscallTable t(Architecture::kArmEabi);
+TEST(SyscallTableTest, Arm32) {
+ SyscallTable t(Architecture::kArm32);
EXPECT_STREQ(t.GetById(0), "sys_restart_syscall");
EXPECT_EQ(t.GetByName("sys_restart_syscall"), 0u);
@@ -55,7 +55,7 @@
EXPECT_STREQ(t.GetById(399), "sys_io_pgetevents");
EXPECT_EQ(t.GetByName("sys_io_pgetevents"), 399u);
- EXPECT_STREQ(t.GetById(400), nullptr);
+ EXPECT_STREQ(t.GetById(457), nullptr);
EXPECT_STREQ(t.GetById(kMaxSyscalls), nullptr);
EXPECT_EQ(t.GetByName("sys_non_existent"), std::nullopt);
@@ -100,7 +100,7 @@
EXPECT_STREQ(t.GetById(386), "sys_rseq");
EXPECT_EQ(t.GetByName("sys_rseq"), 386);
- EXPECT_STREQ(t.GetById(387), nullptr);
+ EXPECT_STREQ(t.GetById(457), nullptr);
EXPECT_STREQ(t.GetById(kMaxSyscalls), nullptr);
EXPECT_EQ(t.GetByName("sys_non_existent"), std::nullopt);
}
diff --git a/src/perfetto_cmd/perfetto_cmd.cc b/src/perfetto_cmd/perfetto_cmd.cc
index 37918c6..9d77c4b 100644
--- a/src/perfetto_cmd/perfetto_cmd.cc
+++ b/src/perfetto_cmd/perfetto_cmd.cc
@@ -39,6 +39,7 @@
#include <fstream>
#include <iostream>
#include <iterator>
+#include <mutex>
#include <random>
#include <sstream>
#include <thread>
@@ -50,6 +51,7 @@
#include "perfetto/ext/base/ctrl_c_handler.h"
#include "perfetto/ext/base/file_utils.h"
#include "perfetto/ext/base/getopt.h"
+#include "perfetto/ext/base/no_destructor.h"
#include "perfetto/ext/base/pipe.h"
#include "perfetto/ext/base/string_view.h"
#include "perfetto/ext/base/temp_file.h"
@@ -356,6 +358,11 @@
return 1;
}
+ // getopt is not thread safe and cmdline parsing requires a mutex for the case
+ // of concurrent cmdline parsing for bugreport snapshots.
+ static base::NoDestructor<std::mutex> getopt_mutex;
+ std::unique_lock<std::mutex> getopt_lock(getopt_mutex.ref());
+
optind = 1; // Reset getopt state. It's reused by the snapshot thread.
for (;;) {
int option =
@@ -565,6 +572,7 @@
has_config_options = true;
config_options.categories.push_back(argv[i]);
}
+ getopt_lock.unlock();
if (query_service_ && (is_detach() || is_attach() || background_)) {
PERFETTO_ELOG("--query cannot be combined with any other argument");
diff --git a/src/trace_processor/BUILD.gn b/src/trace_processor/BUILD.gn
index c20ba5e..694b515 100644
--- a/src/trace_processor/BUILD.gn
+++ b/src/trace_processor/BUILD.gn
@@ -43,6 +43,26 @@
}
}
+# Depended upon by Chrome to do proto -> JSON conversion of traces.
+# Must be small binary size as all code here needs to be shipped in
+# Chrome.
+source_set("export_json") {
+ sources = [
+ "export_json.cc",
+ "export_json.h",
+ ]
+ deps = [
+ ":storage_minimal",
+ "../../gn:default_deps",
+ "../../include/perfetto/ext/trace_processor:export_json",
+ "../base",
+ "importers/json:minimal",
+ "storage",
+ "types",
+ ]
+ public_deps = [ "../../include/perfetto/ext/trace_processor:export_json" ]
+}
+
source_set("metatrace") {
sources = [
"tp_metatrace.cc",
@@ -117,22 +137,6 @@
public_deps = [ "../../include/perfetto/trace_processor:storage" ]
}
-source_set("export_json") {
- sources = [
- "export_json.cc",
- "export_json.h",
- ]
- deps = [
- ":storage_minimal",
- "../../gn:default_deps",
- "../base",
- "importers/json:minimal",
- "storage",
- "types",
- ]
- public_deps = [ "../../include/perfetto/ext/trace_processor:export_json" ]
-}
-
if (enable_perfetto_trace_processor_sqlite) {
source_set("lib") {
sources = [
@@ -251,6 +255,7 @@
deps += [
":export_json",
"../../gn:jsoncpp",
+ "../../include/perfetto/ext/trace_processor:export_json",
"containers",
"importers/common",
"importers/proto:minimal",
diff --git a/src/trace_processor/db/BUILD.gn b/src/trace_processor/db/BUILD.gn
index d602e28..cbd4304 100644
--- a/src/trace_processor/db/BUILD.gn
+++ b/src/trace_processor/db/BUILD.gn
@@ -15,7 +15,7 @@
import("../../../gn/perfetto_tp_tables.gni")
import("../../../gn/test.gni")
-source_set("db") {
+source_set("minimal") {
sources = [
"base_id.h",
"column.cc",
@@ -26,8 +26,6 @@
"compare.h",
"query_executor.cc",
"query_executor.h",
- "runtime_table.cc",
- "runtime_table.h",
"table.cc",
"table.h",
"typed_column.h",
@@ -35,9 +33,8 @@
]
deps = [
"../../../gn:default_deps",
- "../../../include/perfetto/base",
- "../../../include/perfetto/ext/base",
"../../../include/perfetto/trace_processor",
+ "../../base",
"../containers",
"../util:glob",
"../util:regex",
@@ -46,6 +43,21 @@
]
}
+source_set("db") {
+ sources = [
+ "runtime_table.cc",
+ "runtime_table.h",
+ ]
+ deps = [
+ "../../../gn:default_deps",
+ "../../../include/perfetto/trace_processor",
+ "../../base",
+ "../containers",
+ "column",
+ ]
+ public_deps = [ ":minimal" ]
+}
+
source_set("compare") {
sources = [ "compare.h" ]
deps = [
@@ -89,6 +101,7 @@
"../../base:test_support",
"../containers",
"../tables:tables_python",
+ "column",
]
sources = [
"column_storage_overlay_benchmark.cc",
diff --git a/src/trace_processor/db/column/BUILD.gn b/src/trace_processor/db/column/BUILD.gn
index daf9bbf..74d1611 100644
--- a/src/trace_processor/db/column/BUILD.gn
+++ b/src/trace_processor/db/column/BUILD.gn
@@ -45,8 +45,8 @@
deps = [
"../..:metatrace",
"../../../../gn:default_deps",
+ "../../../../include/perfetto/trace_processor",
"../../../../include/perfetto/trace_processor:basic_types",
- "../../../../include/perfetto/trace_processor:trace_processor",
"../../../../protos/perfetto/trace_processor:zero",
"../../../base",
"../../containers",
diff --git a/src/trace_processor/db/column/arrangement_overlay.cc b/src/trace_processor/db/column/arrangement_overlay.cc
index 65979ae..b9e3000 100644
--- a/src/trace_processor/db/column/arrangement_overlay.cc
+++ b/src/trace_processor/db/column/arrangement_overlay.cc
@@ -34,20 +34,6 @@
namespace perfetto::trace_processor::column {
-ArrangementOverlay::ArrangementOverlay(const std::vector<uint32_t>* arrangement,
- Indices::State arrangement_state,
- bool does_arrangement_order_storage)
- : arrangement_(arrangement),
- arrangement_state_(arrangement_state),
- does_arrangement_order_storage_(does_arrangement_order_storage) {}
-
-std::unique_ptr<DataLayerChain> ArrangementOverlay::MakeChain(
- std::unique_ptr<DataLayerChain> inner) {
- return std::make_unique<ChainImpl>(std::move(inner), arrangement_,
- arrangement_state_,
- does_arrangement_order_storage_);
-}
-
ArrangementOverlay::ChainImpl::ChainImpl(
std::unique_ptr<DataLayerChain> inner,
const std::vector<uint32_t>* arrangement,
@@ -61,6 +47,13 @@
inner_->size());
}
+SingleSearchResult ArrangementOverlay::ChainImpl::SingleSearch(
+ FilterOp op,
+ SqlValue sql_val,
+ uint32_t index) const {
+ return inner_->SingleSearch(op, sql_val, (*arrangement_)[index]);
+}
+
SearchValidationResult ArrangementOverlay::ChainImpl::ValidateSearchConstraints(
FilterOp op,
SqlValue value) const {
@@ -156,14 +149,13 @@
Indices::State::kNonmonotonic});
}
-void ArrangementOverlay::ChainImpl::StableSort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
-}
-
-void ArrangementOverlay::ChainImpl::Sort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
+void ArrangementOverlay::ChainImpl::StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const {
+ for (SortToken* it = start; it != end; ++it) {
+ it->index = (*arrangement_)[it->index];
+ }
+ inner_->StableSort(start, end, direction);
}
void ArrangementOverlay::ChainImpl::Serialize(StorageProto* storage) const {
diff --git a/src/trace_processor/db/column/arrangement_overlay.h b/src/trace_processor/db/column/arrangement_overlay.h
index b3064d0..bca884f 100644
--- a/src/trace_processor/db/column/arrangement_overlay.h
+++ b/src/trace_processor/db/column/arrangement_overlay.h
@@ -35,11 +35,12 @@
class ArrangementOverlay final : public DataLayer {
public:
ArrangementOverlay(const std::vector<uint32_t>* arrangement,
- Indices::State arrangement_state,
- bool does_arrangement_order_storage);
+ Indices::State arrangement_state);
+ ~ArrangementOverlay() override;
std::unique_ptr<DataLayerChain> MakeChain(
- std::unique_ptr<DataLayerChain>) override;
+ std::unique_ptr<DataLayerChain>,
+ ChainCreationArgs = ChainCreationArgs());
private:
class ChainImpl : public DataLayerChain {
@@ -49,6 +50,10 @@
Indices::State arrangement_state,
bool does_arrangement_order_storage);
+ SingleSearchResult SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t) const override;
+
SearchValidationResult ValidateSearchConstraints(FilterOp,
SqlValue) const override;
@@ -65,9 +70,9 @@
"OrderedIndexSearch can't be called on ArrangementOverlay");
}
- void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
- void Sort(uint32_t* rows, uint32_t rows_size) const override;
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection) const override;
void Serialize(StorageProto*) const override;
@@ -87,7 +92,6 @@
std::unique_ptr<DataLayerChain> inner_;
const std::vector<uint32_t>* arrangement_;
const Indices::State arrangement_state_;
- const bool does_arrangement_order_storage_;
};
} // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/arrangement_overlay_unittest.cc b/src/trace_processor/db/column/arrangement_overlay_unittest.cc
index 5da3c07..07f13c0 100644
--- a/src/trace_processor/db/column/arrangement_overlay_unittest.cc
+++ b/src/trace_processor/db/column/arrangement_overlay_unittest.cc
@@ -16,12 +16,15 @@
#include "src/trace_processor/db/column/arrangement_overlay.h"
+#include <array>
#include <cstdint>
#include <vector>
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/db/column/data_layer.h"
#include "src/trace_processor/db/column/fake_storage.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column/utils.h"
#include "test/gtest_and_gmock.h"
@@ -32,63 +35,70 @@
using testing::ElementsAre;
using testing::IsEmpty;
+TEST(ArrangementOverlay, SingleSearch) {
+ std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
+ auto fake = FakeStorageChain::SearchSubset(5, std::vector<uint32_t>{1, 2});
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+ auto chain = storage.MakeChain(std::move(fake));
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 8),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 4),
+ SingleSearchResult::kNoMatch);
+}
+
TEST(ArrangementOverlay, SearchAll) {
std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
- auto fake = FakeStorage::SearchAll(5);
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
- false);
- auto queriable = storage.MakeChain(fake->MakeChain());
+ auto fake = FakeStorageChain::SearchAll(5);
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+ auto chain = storage.MakeChain(std::move(fake));
- auto res = queriable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 4));
+ auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 4));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2u, 3u));
}
TEST(ArrangementOverlay, SearchNone) {
std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
- auto fake = FakeStorage::SearchNone(5);
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
- false);
- auto queriable = storage.MakeChain(fake->MakeChain());
+ auto fake = FakeStorageChain::SearchNone(5);
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+ auto chain = storage.MakeChain(std::move(fake));
- auto res = queriable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 4));
+ auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 4));
ASSERT_THAT(utils::ToIndexVectorForTests(res), IsEmpty());
}
TEST(ArrangementOverlay, DISABLED_SearchLimited) {
std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
- auto fake = FakeStorage::SearchSubset(5, Range(4, 5));
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
- false);
- auto queriable = storage.MakeChain(fake->MakeChain());
+ auto fake = FakeStorageChain::SearchSubset(5, Range(4, 5));
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+ auto chain = storage.MakeChain(std::move(fake));
- auto res = queriable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 7));
+ auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(2, 7));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(6u));
}
TEST(ArrangementOverlay, SearchBitVector) {
std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
- auto fake = FakeStorage::SearchSubset(
+ auto fake = FakeStorageChain::SearchSubset(
5, BitVector({false, true, false, true, false}));
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
- false);
- auto queriable = storage.MakeChain(fake->MakeChain());
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+ auto chain = storage.MakeChain(std::move(fake));
// Table bv:
// 1, 1, 0, 0, 1, 1, 0, 0, 1, 1
- auto res = queriable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 10));
+ auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 10));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 4, 5, 8, 9));
}
TEST(ArrangementOverlay, IndexSearch) {
std::vector<uint32_t> arrangement{1, 1, 2, 2, 3, 3, 4, 4, 1, 1};
- auto fake = FakeStorage::SearchSubset(
+ auto fake = FakeStorageChain::SearchSubset(
5, BitVector({false, true, false, true, false}));
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
- false);
- auto queriable = storage.MakeChain(fake->MakeChain());
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> table_idx{7u, 1u, 3u};
- RangeOrBitVector res = queriable->IndexSearch(
+ RangeOrBitVector res = chain->IndexSearch(
FilterOp::kGe, SqlValue::Long(0u),
Indices{table_idx.data(), static_cast<uint32_t>(table_idx.size()),
Indices::State::kNonmonotonic});
@@ -98,16 +108,38 @@
TEST(ArrangementOverlay, OrderingSearch) {
std::vector<uint32_t> arrangement{0, 2, 4, 1, 3};
- auto fake = FakeStorage::SearchSubset(
+ auto fake = FakeStorageChain::SearchSubset(
5, BitVector({false, true, false, true, false}));
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic, true);
- auto queriable = storage.MakeChain(fake->MakeChain());
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+ auto chain =
+ storage.MakeChain(std::move(fake), DataLayer::ChainCreationArgs(true));
RangeOrBitVector res =
- queriable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 5));
+ chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 5));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3, 4));
}
+TEST(ArrangementOverlay, StableSort) {
+ std::vector<uint32_t> numeric_data{0, 1, 2, 3, 4};
+ NumericStorage<uint32_t> numeric(&numeric_data, ColumnType::kUint32, false);
+
+ std::vector<uint32_t> arrangement{0, 2, 4, 1, 3};
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+ auto chain = storage.MakeChain(numeric.MakeChain());
+
+ std::vector tokens{
+ column::DataLayerChain::SortToken{0, 0},
+ column::DataLayerChain::SortToken{1, 1},
+ column::DataLayerChain::SortToken{2, 2},
+ column::DataLayerChain::SortToken{3, 3},
+ column::DataLayerChain::SortToken{4, 4},
+ };
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kAscending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(0, 3, 1, 4, 2));
+}
+
} // namespace
} // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/data_layer.cc b/src/trace_processor/db/column/data_layer.cc
index d4bbcba..c8f8b68 100644
--- a/src/trace_processor/db/column/data_layer.cc
+++ b/src/trace_processor/db/column/data_layer.cc
@@ -16,9 +16,213 @@
#include "src/trace_processor/db/column/data_layer.h"
+#include <cstdint>
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "perfetto/base/logging.h"
+#include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/containers/string_pool.h"
+#include "src/trace_processor/db/column/arrangement_overlay.h"
+#include "src/trace_processor/db/column/dense_null_overlay.h"
+#include "src/trace_processor/db/column/dummy_storage.h"
+#include "src/trace_processor/db/column/id_storage.h"
+#include "src/trace_processor/db/column/null_overlay.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
+#include "src/trace_processor/db/column/range_overlay.h"
+#include "src/trace_processor/db/column/selector_overlay.h"
+#include "src/trace_processor/db/column/set_id_storage.h"
+#include "src/trace_processor/db/column/string_storage.h"
+#include "src/trace_processor/db/column/types.h"
+
namespace perfetto::trace_processor::column {
DataLayer::~DataLayer() = default;
DataLayerChain::~DataLayerChain() = default;
+// All the below code exists as machinery to allow dead-code-elimination
+// and linker symbol stripping to work for trace processor built into Chrome. It
+// is ugly and hacky but is the only way we could come up with to actually meet
+// both performance constraints and saving binary size in Chrome.
+//
+// TODO(b/325583551): investigate whether we can improve this at some point,
+// potentially removing this if Chrome no longer relies on trace processor for
+// JSON export.
+
+std::unique_ptr<DataLayerChain> DataLayer::MakeChain() {
+ switch (impl_) {
+ case Impl::kDummy:
+ return static_cast<DummyStorage*>(this)->MakeChain();
+ case Impl::kId:
+ return static_cast<IdStorage*>(this)->MakeChain();
+ case Impl::kNumericDouble:
+ return static_cast<NumericStorage<double>*>(this)->MakeChain();
+ case Impl::kNumericUint32:
+ return static_cast<NumericStorage<uint32_t>*>(this)->MakeChain();
+ case Impl::kNumericInt32:
+ return static_cast<NumericStorage<int32_t>*>(this)->MakeChain();
+ case Impl::kNumericInt64:
+ return static_cast<NumericStorage<int64_t>*>(this)->MakeChain();
+ case Impl::kSetId:
+ return static_cast<SetIdStorage*>(this)->MakeChain();
+ case Impl::kString:
+ return static_cast<StringStorage*>(this)->MakeChain();
+ case Impl::kArrangement:
+ case Impl::kDenseNull:
+ case Impl::kNull:
+ case Impl::kRange:
+ case Impl::kSelector:
+ PERFETTO_FATAL(
+ "Unexpected call to MakeChain(). MakeChain(DataLayerChain) should be "
+ "called instead");
+ }
+ PERFETTO_FATAL("For GCC");
+}
+
+std::unique_ptr<DataLayerChain> DataLayer::MakeChain(
+ std::unique_ptr<DataLayerChain> inner,
+ ChainCreationArgs args) {
+ switch (impl_) {
+ case Impl::kArrangement:
+ return static_cast<ArrangementOverlay*>(this)->MakeChain(std::move(inner),
+ args);
+ case Impl::kDenseNull:
+ return static_cast<DenseNullOverlay*>(this)->MakeChain(std::move(inner),
+ args);
+ case Impl::kNull:
+ return static_cast<NullOverlay*>(this)->MakeChain(std::move(inner), args);
+ case Impl::kRange:
+ return static_cast<RangeOverlay*>(this)->MakeChain(std::move(inner),
+ args);
+ case Impl::kSelector:
+ return static_cast<SelectorOverlay*>(this)->MakeChain(std::move(inner),
+ args);
+ case Impl::kDummy:
+ case Impl::kId:
+ case Impl::kNumericDouble:
+ case Impl::kNumericUint32:
+ case Impl::kNumericInt32:
+ case Impl::kNumericInt64:
+ case Impl::kSetId:
+ case Impl::kString:
+ PERFETTO_FATAL(
+ "Unexpected call to MakeChain(DataLayerChain). MakeChain() should be "
+ "called instead");
+ }
+ PERFETTO_FATAL("For GCC");
+}
+
+ArrangementOverlay::ArrangementOverlay(const std::vector<uint32_t>* arrangement,
+ Indices::State arrangement_state)
+ : DataLayer(Impl::kArrangement),
+ arrangement_(arrangement),
+ arrangement_state_(arrangement_state) {}
+ArrangementOverlay::~ArrangementOverlay() = default;
+
+std::unique_ptr<DataLayerChain> ArrangementOverlay::MakeChain(
+ std::unique_ptr<DataLayerChain> inner,
+ ChainCreationArgs args) {
+ return std::make_unique<ChainImpl>(std::move(inner), arrangement_,
+ arrangement_state_,
+ args.does_layer_order_chain_contents);
+}
+
+DenseNullOverlay::DenseNullOverlay(const BitVector* non_null)
+ : DataLayer(Impl::kDenseNull), non_null_(non_null) {}
+DenseNullOverlay::~DenseNullOverlay() = default;
+
+std::unique_ptr<DataLayerChain> DenseNullOverlay::MakeChain(
+ std::unique_ptr<DataLayerChain> inner,
+ ChainCreationArgs) {
+ return std::make_unique<ChainImpl>(std::move(inner), non_null_);
+}
+
+std::unique_ptr<DataLayerChain> DummyStorage::MakeChain() {
+ return std::make_unique<ChainImpl>();
+}
+
+IdStorage::IdStorage() : DataLayer(Impl::kId) {}
+IdStorage::~IdStorage() = default;
+
+std::unique_ptr<DataLayerChain> IdStorage::MakeChain() {
+ return std::make_unique<ChainImpl>();
+}
+
+NullOverlay::NullOverlay(const BitVector* non_null)
+ : DataLayer(Impl::kNull), non_null_(non_null) {}
+NullOverlay::~NullOverlay() = default;
+
+std::unique_ptr<DataLayerChain> NullOverlay::MakeChain(
+ std::unique_ptr<DataLayerChain> inner,
+ ChainCreationArgs) {
+ return std::make_unique<ChainImpl>(std::move(inner), non_null_);
+}
+
+NumericStorageBase::NumericStorageBase(ColumnType type,
+ bool is_sorted,
+ Impl impl)
+ : DataLayer(impl), storage_type_(type), is_sorted_(is_sorted) {}
+
+NumericStorageBase::~NumericStorageBase() = default;
+
+template <typename T>
+std::unique_ptr<DataLayerChain> NumericStorage<T>::MakeChain() {
+ return std::make_unique<ChainImpl>(vector_, storage_type_, is_sorted_);
+}
+
+template <typename T>
+NumericStorage<T>::NumericStorage(const std::vector<T>* vec,
+ ColumnType type,
+ bool is_sorted)
+ : NumericStorageBase(type, is_sorted, GetImpl()), vector_(vec) {}
+
+// Define explicit instantiation of the necessary templates here to reduce
+// binary size bloat.
+template class NumericStorage<double>;
+template class NumericStorage<uint32_t>;
+template class NumericStorage<int32_t>;
+template class NumericStorage<int64_t>;
+
+RangeOverlay::RangeOverlay(const Range* range)
+ : DataLayer(Impl::kRange), range_(range) {}
+RangeOverlay::~RangeOverlay() = default;
+
+std::unique_ptr<DataLayerChain> RangeOverlay::MakeChain(
+ std::unique_ptr<DataLayerChain> inner,
+ ChainCreationArgs) {
+ return std::make_unique<ChainImpl>(std::move(inner), range_);
+}
+
+SelectorOverlay::SelectorOverlay(const BitVector* selector)
+ : DataLayer(Impl::kSelector), selector_(selector) {}
+SelectorOverlay::~SelectorOverlay() = default;
+
+std::unique_ptr<DataLayerChain> SelectorOverlay::MakeChain(
+ std::unique_ptr<DataLayerChain> inner,
+ ChainCreationArgs) {
+ return std::make_unique<ChainImpl>(std::move(inner), selector_);
+}
+
+SetIdStorage::SetIdStorage(const std::vector<uint32_t>* values)
+ : DataLayer(Impl::kSetId), values_(values) {}
+SetIdStorage::~SetIdStorage() = default;
+
+std::unique_ptr<DataLayerChain> SetIdStorage::MakeChain() {
+ return std::make_unique<ChainImpl>(values_);
+}
+
+StringStorage::StringStorage(StringPool* string_pool,
+ const std::vector<StringPool::Id>* data,
+ bool is_sorted)
+ : DataLayer(Impl::kString),
+ data_(data),
+ string_pool_(string_pool),
+ is_sorted_(is_sorted) {}
+StringStorage::~StringStorage() = default;
+
+std::unique_ptr<DataLayerChain> StringStorage::MakeChain() {
+ return std::make_unique<ChainImpl>(string_pool_, data_, is_sorted_);
+}
+
} // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/data_layer.h b/src/trace_processor/db/column/data_layer.h
index 2419722..e069148 100644
--- a/src/trace_processor/db/column/data_layer.h
+++ b/src/trace_processor/db/column/data_layer.h
@@ -39,32 +39,85 @@
// table.
class DataLayer : public RefCounted {
public:
+ // Arguments for MakeChain on how the inner chain should be interpreted.
+ struct ChainCreationArgs {
+ constexpr explicit ChainCreationArgs(
+ bool _does_layer_order_chain_contents = false)
+ : does_layer_order_chain_contents(_does_layer_order_chain_contents) {}
+
+ // Indicates whether the current data layer orders the inner chain.
+ // Currently used by ArrangementOverlay to decide whether the arrangement
+ // orders a given chain.
+ bool does_layer_order_chain_contents;
+ };
virtual ~DataLayer();
// Creates a DataLayerChain for a terminal DataLayer. This means the
// DataLayer directly should return the data it contains inside.
- virtual std::unique_ptr<DataLayerChain> MakeChain() {
- PERFETTO_FATAL("Unimplemented");
- }
+ std::unique_ptr<DataLayerChain> MakeChain();
// Creates a DataLayerChain for a non-terminal DataLayer. This means
// the DataLayer should transform the contents of the inner chain.
- virtual std::unique_ptr<DataLayerChain> MakeChain(
- std::unique_ptr<DataLayerChain>) {
- PERFETTO_FATAL("Unimplemented");
- }
+ std::unique_ptr<DataLayerChain> MakeChain(
+ std::unique_ptr<DataLayerChain>,
+ ChainCreationArgs = ChainCreationArgs());
+
+ protected:
+ // TODO(b/325583551): remove this when possible.
+ enum class Impl {
+ kArrangement,
+ kDenseNull,
+ kDummy,
+ kId,
+ kNull,
+ kNumericDouble,
+ kNumericUint32,
+ kNumericInt32,
+ kNumericInt64,
+ kRange,
+ kSelector,
+ kSetId,
+ kString,
+ };
+ explicit DataLayer(Impl impl) : impl_(impl) {}
+
+ private:
+ Impl impl_;
};
// Corresponds to a series of DataLayer chained together. Provides
// functionality for querying the transformed data of the entire chain.
class DataLayerChain {
public:
+ // Indicates the direction of the sort on a single chain.
+ enum class SortDirection {
+ kAscending,
+ kDescending,
+ };
+ // Struct wrapping indices to elements of this chain. Passed to sorting
+ // functions.
+ struct SortToken {
+ // An index pointing to an element in this chain. Indicates the element
+ // at this index should be compared.
+ uint32_t index;
+
+ // An opaque value which can be set to some value meaningful to the
+ // caller. Implementations *should not* read at this value.
+ uint32_t payload;
+ };
using StorageProto = protos::pbzero::SerializedColumn_Storage;
virtual ~DataLayerChain();
// Start of public API.
+ // Checks whether element at the the provided index match |op| and |value|.
+ //
+ // Returns true if the element matches, false otherwise.
+ virtual SingleSearchResult SingleSearch(FilterOp op,
+ SqlValue value,
+ uint32_t row) const = 0;
+
// Searches for elements which match |op| and |value| between |range.start|
// and |range.end|.
//
@@ -151,13 +204,21 @@
PERFETTO_FATAL("For GCC");
}
- // Sorts |rows| in ascending order with the comparator:
- // data[rows[a]] < data[rows[b]].
- virtual void Sort(uint32_t* rows, uint32_t rows_size) const = 0;
-
- // Stable sorts |rows| in ascending order with the comparator:
- // data[rows[a]] < data[rows[b]].
- virtual void StableSort(uint32_t* rows, uint32_t rows_size) const = 0;
+ // Stable sorts an array of SortToken elements between |start| and |end|
+ // using a comparator defined by looking up the elements in this chain using
+ // the index given by SortToken::index. |direction| indicates the direction of
+ // the sort (ascending or descending).
+ //
+ // In simple terms the expectation is for implementations do something like:
+ // ```
+ // std::stable_sort(start, index, [](const SortToken& a, const SortToken& b) {
+ // return Get(a.index) < Get(b.index);
+ // });
+ // ```
+ // with |Get| being a function to lookup the element in this chain.
+ virtual void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const = 0;
// Serializes storage data to proto format.
virtual void Serialize(StorageProto*) const = 0;
diff --git a/src/trace_processor/db/column/dense_null_overlay.cc b/src/trace_processor/db/column/dense_null_overlay.cc
index 7d37413..7dff76f 100644
--- a/src/trace_processor/db/column/dense_null_overlay.cc
+++ b/src/trace_processor/db/column/dense_null_overlay.cc
@@ -34,25 +34,39 @@
namespace perfetto::trace_processor::column {
-DenseNullOverlay::DenseNullOverlay(const BitVector* non_null)
- : non_null_(non_null) {}
-
-std::unique_ptr<DataLayerChain> DenseNullOverlay::MakeChain(
- std::unique_ptr<DataLayerChain> inner) {
- return std::make_unique<ChainImpl>(std::move(inner), non_null_);
-}
-
DenseNullOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> inner,
const BitVector* non_null)
: inner_(std::move(inner)), non_null_(non_null) {}
+SingleSearchResult DenseNullOverlay::ChainImpl::SingleSearch(
+ FilterOp op,
+ SqlValue sql_val,
+ uint32_t index) const {
+ switch (op) {
+ case FilterOp::kIsNull:
+ return non_null_->IsSet(index) ? inner_->SingleSearch(op, sql_val, index)
+ : SingleSearchResult::kMatch;
+ case FilterOp::kIsNotNull:
+ case FilterOp::kEq:
+ case FilterOp::kGe:
+ case FilterOp::kGt:
+ case FilterOp::kLt:
+ case FilterOp::kLe:
+ case FilterOp::kNe:
+ case FilterOp::kGlob:
+ case FilterOp::kRegex:
+ return non_null_->IsSet(index) ? inner_->SingleSearch(op, sql_val, index)
+ : SingleSearchResult::kNoMatch;
+ }
+ PERFETTO_FATAL("For GCC");
+}
+
SearchValidationResult DenseNullOverlay::ChainImpl::ValidateSearchConstraints(
FilterOp op,
SqlValue sql_val) const {
if (op == FilterOp::kIsNull) {
return SearchValidationResult::kOk;
}
-
return inner_->ValidateSearchConstraints(op, sql_val);
}
@@ -212,14 +226,16 @@
inner_range.end + non_null_offset};
}
-void DenseNullOverlay::ChainImpl::StableSort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
-}
-
-void DenseNullOverlay::ChainImpl::Sort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
+void DenseNullOverlay::ChainImpl::StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const {
+ SortToken* it = std::stable_partition(
+ start, end,
+ [this](const SortToken& idx) { return !non_null_->IsSet(idx.index); });
+ inner_->StableSort(it, end, direction);
+ if (direction == SortDirection::kDescending) {
+ std::rotate(start, it, end);
+ }
}
void DenseNullOverlay::ChainImpl::Serialize(StorageProto* storage) const {
diff --git a/src/trace_processor/db/column/dense_null_overlay.h b/src/trace_processor/db/column/dense_null_overlay.h
index d55f076..0f881fb 100644
--- a/src/trace_processor/db/column/dense_null_overlay.h
+++ b/src/trace_processor/db/column/dense_null_overlay.h
@@ -34,15 +34,21 @@
class DenseNullOverlay final : public DataLayer {
public:
explicit DenseNullOverlay(const BitVector* non_null);
+ ~DenseNullOverlay() override;
std::unique_ptr<DataLayerChain> MakeChain(
- std::unique_ptr<DataLayerChain>) override;
+ std::unique_ptr<DataLayerChain>,
+ ChainCreationArgs = ChainCreationArgs());
private:
class ChainImpl : public DataLayerChain {
public:
ChainImpl(std::unique_ptr<DataLayerChain> inner, const BitVector* non_null);
+ SingleSearchResult SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t) const override;
+
SearchValidationResult ValidateSearchConstraints(FilterOp,
SqlValue) const override;
@@ -56,9 +62,9 @@
SqlValue,
Indices) const override;
- void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
- void Sort(uint32_t* rows, uint32_t rows_size) const override;
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection) const override;
void Serialize(StorageProto*) const override;
diff --git a/src/trace_processor/db/column/dense_null_overlay_unittest.cc b/src/trace_processor/db/column/dense_null_overlay_unittest.cc
index 9838a34..0cf6276 100644
--- a/src/trace_processor/db/column/dense_null_overlay_unittest.cc
+++ b/src/trace_processor/db/column/dense_null_overlay_unittest.cc
@@ -18,20 +18,18 @@
#include <cstdint>
#include <memory>
-#include <utility>
#include <vector>
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/db/column/data_layer.h"
#include "src/trace_processor/db/column/fake_storage.h"
#include "src/trace_processor/db/column/numeric_storage.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column/utils.h"
#include "test/gtest_and_gmock.h"
-namespace perfetto {
-namespace trace_processor {
-namespace column {
+namespace perfetto::trace_processor::column {
namespace {
using testing::ElementsAre;
@@ -39,8 +37,8 @@
TEST(DenseNullOverlay, NoFilteringSearch) {
std::vector<uint32_t> data{0, 1, 0, 1, 0};
- auto numeric =
- std::make_unique<NumericStorage<uint32_t>>(&data, ColumnType::kUint32);
+ auto numeric = std::make_unique<NumericStorage<uint32_t>>(
+ &data, ColumnType::kUint32, false);
BitVector bv{0, 1, 0, 1, 0};
DenseNullOverlay storage(&bv);
@@ -52,8 +50,8 @@
TEST(DenseNullOverlay, RestrictInputSearch) {
std::vector<uint32_t> data{0, 1, 0, 1, 0};
- auto numeric =
- std::make_unique<NumericStorage<uint32_t>>(&data, ColumnType::kUint32);
+ auto numeric = std::make_unique<NumericStorage<uint32_t>>(
+ &data, ColumnType::kUint32, false);
BitVector bv{0, 1, 0, 1, 0};
DenseNullOverlay storage(&bv);
@@ -64,33 +62,33 @@
}
TEST(DenseNullOverlay, RangeFilterSearch) {
- auto fake = FakeStorage::SearchSubset(5, Range(1, 3));
+ auto fake = FakeStorageChain::SearchSubset(5, Range(1, 3));
BitVector bv{0, 1, 0, 1, 0};
DenseNullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0), Range(0, 5));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1));
}
TEST(DenseNullOverlay, BitvectorFilterSearch) {
- auto fake = FakeStorage::SearchSubset(5, BitVector({0, 1, 1, 0, 0}));
+ auto fake = FakeStorageChain::SearchSubset(5, BitVector({0, 1, 1, 0, 0}));
BitVector bv{0, 1, 0, 1, 0};
DenseNullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0), Range(0, 5));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1));
}
TEST(DenseNullOverlay, IsNullSearch) {
- auto fake = FakeStorage::SearchSubset(5, BitVector({1, 1, 0, 0, 1}));
+ auto fake = FakeStorageChain::SearchSubset(5, BitVector({1, 1, 0, 0, 1}));
BitVector bv{1, 0, 0, 1, 1};
DenseNullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kIsNull, SqlValue(), Range(0, 5));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2, 4));
@@ -98,8 +96,8 @@
TEST(DenseNullOverlay, IndexSearch) {
std::vector<uint32_t> data{1, 0, 0, 1, 1, 1};
- auto numeric =
- std::make_unique<NumericStorage<uint32_t>>(&data, ColumnType::kUint32);
+ auto numeric = std::make_unique<NumericStorage<uint32_t>>(
+ &data, ColumnType::kUint32, false);
BitVector bv{1, 0, 0, 1, 1, 1};
DenseNullOverlay storage(&bv);
@@ -114,11 +112,11 @@
}
TEST(DenseNullOverlay, IsNullIndexSearch) {
- auto fake = FakeStorage::SearchSubset(6, BitVector({0, 0, 0, 1, 1, 1}));
+ auto fake = FakeStorageChain::SearchSubset(6, BitVector({0, 0, 0, 1, 1, 1}));
BitVector bv{0, 1, 0, 1, 1, 1};
DenseNullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> index({5, 2, 3, 4, 1});
auto res = chain->IndexSearch(
@@ -129,11 +127,11 @@
}
TEST(DenseNullOverlay, OrderedIndexSearch) {
- auto fake = FakeStorage::SearchSubset(6, BitVector({0, 1, 0, 1, 0, 1}));
+ auto fake = FakeStorageChain::SearchSubset(6, BitVector({0, 1, 0, 1, 0, 1}));
BitVector bv{0, 1, 0, 1, 0, 1};
DenseNullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> indices_vec({0, 2, 4, 1, 3, 5});
Indices indices{indices_vec.data(), 6, Indices::State::kNonmonotonic};
@@ -167,7 +165,76 @@
ASSERT_EQ(res.end, 6u);
}
+TEST(DenseNullOverlay, SingleSearch) {
+ BitVector bv{0, 1, 0, 1, 1, 1};
+ DenseNullOverlay storage(&bv);
+ auto fake = FakeStorageChain::SearchSubset(5, std::vector<uint32_t>{1, 2});
+ auto chain = storage.MakeChain(std::move(fake));
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 1),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 2),
+ SingleSearchResult::kNoMatch);
+}
+
+TEST(DenseNullOverlay, SingleSearchIsNull) {
+ BitVector bv{0, 1, 0, 1, 1, 1};
+ DenseNullOverlay storage(&bv);
+ auto fake = FakeStorageChain::SearchNone(5);
+ auto chain = storage.MakeChain(std::move(fake));
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 0),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 1),
+ SingleSearchResult::kNoMatch);
+}
+
+TEST(DenseNullOverlay, SingleSearchIsNotNull) {
+ BitVector bv{0, 1, 0, 1, 1, 1};
+ DenseNullOverlay storage(&bv);
+ auto fake = FakeStorageChain::SearchAll(5);
+ auto chain = storage.MakeChain(std::move(fake));
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 0),
+ SingleSearchResult::kNoMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 1),
+ SingleSearchResult::kMatch);
+}
+
+TEST(DenseNullOverlay, StableSort) {
+ std::vector<uint32_t> numeric_data{0, 3, 0, 1, 0, 2, 4};
+ NumericStorage<uint32_t> numeric(&numeric_data, ColumnType::kUint32, false);
+
+ BitVector null{0, 1, 0, 1, 1, 1, 1};
+ DenseNullOverlay overlay(&null);
+ auto chain = overlay.MakeChain(numeric.MakeChain());
+
+ auto make_tokens = []() {
+ return std::vector{
+ column::DataLayerChain::SortToken{0, 0},
+ column::DataLayerChain::SortToken{1, 1},
+ column::DataLayerChain::SortToken{2, 2},
+ column::DataLayerChain::SortToken{3, 3},
+ column::DataLayerChain::SortToken{4, 4},
+ column::DataLayerChain::SortToken{5, 5},
+ column::DataLayerChain::SortToken{6, 6},
+ };
+ };
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kAscending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(0, 2, 4, 3, 5, 1, 6));
+ }
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kDescending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(6, 1, 5, 3, 4, 0, 2));
+ }
+}
+
} // namespace
-} // namespace column
-} // namespace trace_processor
-} // namespace perfetto
+} // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/dummy_storage.cc b/src/trace_processor/db/column/dummy_storage.cc
index c82f767..54d7c61 100644
--- a/src/trace_processor/db/column/dummy_storage.cc
+++ b/src/trace_processor/db/column/dummy_storage.cc
@@ -17,7 +17,6 @@
#include "src/trace_processor/db/column/dummy_storage.h"
#include <cstdint>
-#include <memory>
#include "perfetto/base/logging.h"
#include "perfetto/trace_processor/basic_types.h"
@@ -26,8 +25,10 @@
namespace perfetto::trace_processor::column {
-std::unique_ptr<DataLayerChain> DummyStorage::MakeChain() {
- return std::make_unique<ChainImpl>();
+SingleSearchResult DummyStorage::ChainImpl::SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t) const {
+ PERFETTO_FATAL("Shouldn't be called");
}
SearchValidationResult DummyStorage::ChainImpl::ValidateSearchConstraints(
@@ -54,11 +55,9 @@
PERFETTO_FATAL("Shouldn't be called");
}
-void DummyStorage::ChainImpl::StableSort(uint32_t*, uint32_t) const {
- PERFETTO_FATAL("Shouldn't be called");
-}
-
-void DummyStorage::ChainImpl::Sort(uint32_t*, uint32_t) const {
+void DummyStorage::ChainImpl::StableSort(SortToken*,
+ SortToken*,
+ SortDirection) const {
PERFETTO_FATAL("Shouldn't be called");
}
diff --git a/src/trace_processor/db/column/dummy_storage.h b/src/trace_processor/db/column/dummy_storage.h
index a86cf6e..ced41a9 100644
--- a/src/trace_processor/db/column/dummy_storage.h
+++ b/src/trace_processor/db/column/dummy_storage.h
@@ -30,13 +30,14 @@
// on them.
class DummyStorage final : public DataLayer {
public:
- std::unique_ptr<DataLayerChain> MakeChain() override;
-
- private:
class ChainImpl : public DataLayerChain {
public:
ChainImpl() = default;
+ SingleSearchResult SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t) const override;
+
SearchValidationResult ValidateSearchConstraints(FilterOp,
SqlValue) const override;
@@ -50,9 +51,9 @@
SqlValue,
Indices) const override;
- void StableSort(uint32_t*, uint32_t) const override;
-
- void Sort(uint32_t*, uint32_t) const override;
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection) const override;
void Serialize(StorageProto*) const override;
@@ -60,6 +61,7 @@
std::string DebugString() const override { return "DummyStorage"; }
};
+ std::unique_ptr<DataLayerChain> MakeChain();
};
} // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/fake_storage.cc b/src/trace_processor/db/column/fake_storage.cc
index 30ac3b8..9fbc3ae 100644
--- a/src/trace_processor/db/column/fake_storage.cc
+++ b/src/trace_processor/db/column/fake_storage.cc
@@ -19,7 +19,6 @@
#include <algorithm>
#include <cstdint>
#include <iterator>
-#include <memory>
#include <utility>
#include "perfetto/base/logging.h"
@@ -30,32 +29,42 @@
namespace perfetto::trace_processor::column {
-FakeStorage::FakeStorage(uint32_t size, SearchStrategy strategy)
- : size_(size), strategy_(strategy) {}
-
-std::unique_ptr<DataLayerChain> FakeStorage::MakeChain() {
- return std::make_unique<ChainImpl>(size_, strategy_, range_,
- bit_vector_.Copy());
-}
-
-FakeStorage::ChainImpl::ChainImpl(uint32_t size,
- SearchStrategy strategy,
- Range range,
- BitVector bv)
+FakeStorageChain::FakeStorageChain(uint32_t size,
+ SearchStrategy strategy,
+ Range range,
+ BitVector bv)
: size_(size),
strategy_(strategy),
range_(range),
bit_vector_(std::move(bv)) {}
-SearchValidationResult FakeStorage::ChainImpl::ValidateSearchConstraints(
+SingleSearchResult FakeStorageChain::SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t i) const {
+ switch (strategy_) {
+ case kAll:
+ return SingleSearchResult::kMatch;
+ case kNone:
+ return SingleSearchResult::kNoMatch;
+ case kBitVector:
+ return bit_vector_.IsSet(i) ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case kRange:
+ return range_.Contains(i) ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ }
+ PERFETTO_FATAL("For GCC");
+}
+
+SearchValidationResult FakeStorageChain::ValidateSearchConstraints(
FilterOp,
SqlValue) const {
return SearchValidationResult::kOk;
}
-RangeOrBitVector FakeStorage::ChainImpl::SearchValidated(FilterOp,
- SqlValue,
- Range in) const {
+RangeOrBitVector FakeStorageChain::SearchValidated(FilterOp,
+ SqlValue,
+ Range in) const {
switch (strategy_) {
case kAll:
return RangeOrBitVector(in);
@@ -73,10 +82,9 @@
PERFETTO_FATAL("For GCC");
}
-RangeOrBitVector FakeStorage::ChainImpl::IndexSearchValidated(
- FilterOp,
- SqlValue,
- Indices indices) const {
+RangeOrBitVector FakeStorageChain::IndexSearchValidated(FilterOp,
+ SqlValue,
+ Indices indices) const {
switch (strategy_) {
case kAll:
return RangeOrBitVector(Range(0, indices.size));
@@ -97,10 +105,9 @@
PERFETTO_FATAL("For GCC");
}
-Range FakeStorage::ChainImpl::OrderedIndexSearchValidated(
- FilterOp,
- SqlValue,
- Indices indices) const {
+Range FakeStorageChain::OrderedIndexSearchValidated(FilterOp,
+ SqlValue,
+ Indices indices) const {
if (strategy_ == kAll) {
return {0, indices.size};
}
@@ -134,17 +141,11 @@
static_cast<uint32_t>(std::distance(indices.data, first_non_set))};
}
-void FakeStorage::ChainImpl::StableSort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
+void FakeStorageChain::StableSort(SortToken*, SortToken*, SortDirection) const {
PERFETTO_FATAL("Not implemented");
}
-void FakeStorage::ChainImpl::Sort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
-}
-
-void FakeStorage::ChainImpl::Serialize(StorageProto*) const {
+void FakeStorageChain::Serialize(StorageProto*) const {
// FakeStorage doesn't really make sense to serialize.
PERFETTO_FATAL("Not implemented");
}
diff --git a/src/trace_processor/db/column/fake_storage.h b/src/trace_processor/db/column/fake_storage.h
index 6cd124a..aca6890 100644
--- a/src/trace_processor/db/column/fake_storage.h
+++ b/src/trace_processor/db/column/fake_storage.h
@@ -30,86 +30,78 @@
namespace perfetto::trace_processor::column {
-// Fake implementation of Storage for use in tests.
-class FakeStorage final : public DataLayer {
+// Fake implementation of DataLayerChain which can be used in unittests.
+class FakeStorageChain : public DataLayerChain {
public:
- std::unique_ptr<DataLayerChain> MakeChain() override;
-
- static std::unique_ptr<DataLayer> SearchAll(uint32_t size) {
- return std::unique_ptr<DataLayer>(
- new FakeStorage(size, SearchStrategy::kAll));
+ // Factory function for creating a DataLayerChain which matches all rows from
+ // [0, size).
+ static std::unique_ptr<DataLayerChain> SearchAll(uint32_t size) {
+ return std::unique_ptr<DataLayerChain>(
+ new FakeStorageChain(size, SearchStrategy::kAll, Range(), BitVector()));
}
- static std::unique_ptr<DataLayer> SearchNone(uint32_t size) {
- return std::unique_ptr<DataLayer>(
- new FakeStorage(size, SearchStrategy::kNone));
+ // Factory function for creating a DataLayerChain which matches zero rows.
+ static std::unique_ptr<DataLayerChain> SearchNone(uint32_t size) {
+ return std::unique_ptr<DataLayerChain>(new FakeStorageChain(
+ size, SearchStrategy::kNone, Range(), BitVector()));
}
- static std::unique_ptr<DataLayer> SearchSubset(uint32_t size, Range r) {
- std::unique_ptr<FakeStorage> storage(
- new FakeStorage(size, SearchStrategy::kRange));
- storage->range_ = r;
- return std::move(storage);
+ // Factory function for creating a DataLayerChain which matches rows [r.start,
+ // r.end).
+ static std::unique_ptr<DataLayerChain> SearchSubset(uint32_t size, Range r) {
+ return std::unique_ptr<DataLayerChain>(
+ new FakeStorageChain(size, SearchStrategy::kRange, r, BitVector()));
}
- static std::unique_ptr<DataLayer> SearchSubset(uint32_t size, BitVector bv) {
- std::unique_ptr<FakeStorage> storage(
- new FakeStorage(size, SearchStrategy::kBitVector));
- storage->bit_vector_ = std::move(bv);
- return std::move(storage);
+ // Factory function for creating a DataLayerChain which matches rows of the
+ // set bit positions of |bv|.
+ static std::unique_ptr<DataLayerChain> SearchSubset(uint32_t size,
+ BitVector bv) {
+ return std::unique_ptr<DataLayerChain>(new FakeStorageChain(
+ size, SearchStrategy::kBitVector, Range(), std::move(bv)));
}
- static std::unique_ptr<DataLayer> SearchSubset(
+ // Factory function for creating a DataLayerChain which matches rows specified
+ // by |index_vec|.
+ static std::unique_ptr<DataLayerChain> SearchSubset(
uint32_t size,
const std::vector<uint32_t>& index_vec) {
- std::unique_ptr<FakeStorage> storage(
- new FakeStorage(size, SearchStrategy::kBitVector));
BitVector bv(size);
- for (const uint32_t& i : index_vec) {
+ for (uint32_t i : index_vec) {
bv.Set(i);
}
- storage->bit_vector_ = std::move(bv);
- return std::move(storage);
+ return std::unique_ptr<DataLayerChain>(new FakeStorageChain(
+ size, SearchStrategy::kBitVector, Range(), std::move(bv)));
}
+ // Implementation of DataLayerChain.
+ SingleSearchResult SingleSearch(FilterOp, SqlValue, uint32_t) const override;
+
+ SearchValidationResult ValidateSearchConstraints(FilterOp,
+ SqlValue) const override;
+
+ RangeOrBitVector SearchValidated(FilterOp, SqlValue, Range) const override;
+
+ RangeOrBitVector IndexSearchValidated(FilterOp,
+ SqlValue,
+ Indices) const override;
+
+ Range OrderedIndexSearchValidated(FilterOp, SqlValue, Indices) const override;
+
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection) const override;
+
+ void Serialize(StorageProto*) const override;
+
+ uint32_t size() const override { return size_; }
+
+ std::string DebugString() const override { return "FakeStorage"; }
+
private:
enum SearchStrategy { kNone, kAll, kRange, kBitVector };
- class ChainImpl : public DataLayerChain {
- public:
- ChainImpl(uint32_t, SearchStrategy, Range, BitVector);
-
- SearchValidationResult ValidateSearchConstraints(FilterOp,
- SqlValue) const override;
-
- RangeOrBitVector SearchValidated(FilterOp, SqlValue, Range) const override;
-
- RangeOrBitVector IndexSearchValidated(FilterOp,
- SqlValue,
- Indices) const override;
-
- Range OrderedIndexSearchValidated(FilterOp,
- SqlValue,
- Indices) const override;
-
- void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
- void Sort(uint32_t* rows, uint32_t rows_size) const override;
-
- void Serialize(StorageProto*) const override;
-
- uint32_t size() const override { return size_; }
-
- std::string DebugString() const override { return "FakeStorage"; }
-
- private:
- uint32_t size_ = 0;
- SearchStrategy strategy_ = SearchStrategy::kNone;
- Range range_;
- BitVector bit_vector_;
- };
-
- FakeStorage(uint32_t size, SearchStrategy strategy);
+ FakeStorageChain(uint32_t, SearchStrategy, Range, BitVector);
uint32_t size_ = 0;
SearchStrategy strategy_ = SearchStrategy::kNone;
diff --git a/src/trace_processor/db/column/id_storage.cc b/src/trace_processor/db/column/id_storage.cc
index 948ca12..6fdb800 100644
--- a/src/trace_processor/db/column/id_storage.cc
+++ b/src/trace_processor/db/column/id_storage.cc
@@ -38,7 +38,6 @@
#include "protos/perfetto/trace_processor/serialization.pbzero.h"
namespace perfetto::trace_processor::column {
-
namespace {
template <typename Comparator>
@@ -152,8 +151,44 @@
return SearchValidationResult::kOk;
}
-std::unique_ptr<DataLayerChain> IdStorage::MakeChain() {
- return std::make_unique<ChainImpl>();
+SingleSearchResult IdStorage::ChainImpl::SingleSearch(FilterOp op,
+ SqlValue sql_val,
+ uint32_t index) const {
+ if (sql_val.type != SqlValue::kLong ||
+ sql_val.long_value > std::numeric_limits<uint32_t>::max() ||
+ sql_val.long_value < std::numeric_limits<uint32_t>::min()) {
+ // Because of the large amount of code needing for handling comparisions
+ // with doubles or out of range values, just defer to the full search.
+ return SingleSearchResult::kNeedsFullSearch;
+ }
+ auto val = static_cast<uint32_t>(sql_val.long_value);
+ switch (op) {
+ case FilterOp::kEq:
+ return index == val ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kNe:
+ return index != val ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kGe:
+ return index >= val ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kGt:
+ return index > val ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kLe:
+ return index <= val ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kLt:
+ return index < val ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kIsNotNull:
+ return SingleSearchResult::kMatch;
+ case FilterOp::kIsNull:
+ case FilterOp::kGlob:
+ case FilterOp::kRegex:
+ return SingleSearchResult::kNoMatch;
+ }
+ PERFETTO_FATAL("For GCC");
}
RangeOrBitVector IdStorage::ChainImpl::SearchValidated(
@@ -309,15 +344,22 @@
PERFETTO_FATAL("FilterOp not matched");
}
-void IdStorage::ChainImpl::StableSort(uint32_t* indices,
- uint32_t indices_size) const {
- // We can use sort, as |indices| will not have duplicates.
- Sort(indices, indices_size);
-}
-
-void IdStorage::ChainImpl::Sort(uint32_t* indices,
- uint32_t indices_size) const {
- std::sort(indices, indices + indices_size);
+void IdStorage::ChainImpl::StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const {
+ switch (direction) {
+ case SortDirection::kAscending:
+ std::stable_sort(start, end, [](const SortToken& a, const SortToken& b) {
+ return a.index < b.index;
+ });
+ return;
+ case SortDirection::kDescending:
+ std::stable_sort(start, end, [](const SortToken& a, const SortToken& b) {
+ return a.index > b.index;
+ });
+ return;
+ }
+ PERFETTO_FATAL("For GCC");
}
void IdStorage::ChainImpl::Serialize(StorageProto* storage) const {
diff --git a/src/trace_processor/db/column/id_storage.h b/src/trace_processor/db/column/id_storage.h
index 56115a9..e6e25ab 100644
--- a/src/trace_processor/db/column/id_storage.h
+++ b/src/trace_processor/db/column/id_storage.h
@@ -36,11 +36,18 @@
// included in the column.
class IdStorage final : public DataLayer {
public:
- std::unique_ptr<DataLayerChain> MakeChain() override;
+ IdStorage();
+ ~IdStorage() override;
+
+ std::unique_ptr<DataLayerChain> MakeChain();
private:
class ChainImpl : public DataLayerChain {
public:
+ SingleSearchResult SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t) const override;
+
SearchValidationResult ValidateSearchConstraints(FilterOp,
SqlValue) const override;
@@ -54,9 +61,9 @@
SqlValue,
Indices) const override;
- void StableSort(uint32_t*, uint32_t) const override;
-
- void Sort(uint32_t*, uint32_t) const override;
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection) const override;
void Serialize(StorageProto*) const override;
diff --git a/src/trace_processor/db/column/id_storage_unittest.cc b/src/trace_processor/db/column/id_storage_unittest.cc
index 7b94cc0..48ce18e 100644
--- a/src/trace_processor/db/column/id_storage_unittest.cc
+++ b/src/trace_processor/db/column/id_storage_unittest.cc
@@ -14,6 +14,7 @@
* limitations under the License.
*/
#include "src/trace_processor/db/column/id_storage.h"
+
#include <cstdint>
#include <limits>
#include <vector>
@@ -25,8 +26,7 @@
#include "src/trace_processor/db/column/utils.h"
#include "test/gtest_and_gmock.h"
-namespace perfetto {
-namespace trace_processor {
+namespace perfetto::trace_processor {
inline bool operator==(const Range& a, const Range& b) {
return std::tie(a.start, a.end) == std::tie(b.start, b.end);
@@ -103,6 +103,48 @@
SearchValidationResult::kNoData);
}
+TEST(IdStorage, SinglSearch) {
+ IdStorage storage;
+ auto chain = storage.MakeChain();
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(5), 5),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(5), 3),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(5), 3),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(5), 5),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(5), 5),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(5), 6),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(5), 4),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(5), 6),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(5), 5),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(5), 4),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(5), 6),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(5), 4),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Double(5), 4),
+ SingleSearchResult::kNeedsFullSearch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::String(""), 4),
+ SingleSearchResult::kNeedsFullSearch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGlob, SqlValue::Long(5), 4),
+ SingleSearchResult::kNoMatch);
+}
+
TEST(IdStorage, SearchEqSimple) {
IdStorage storage;
auto chain = storage.MakeChain();
@@ -310,17 +352,27 @@
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(16, 17, 18, 19));
}
-TEST(IdStorage, Sort) {
- std::vector<uint32_t> order{4, 3, 6, 1, 5};
+TEST(IdStorage, StableSort) {
IdStorage storage;
auto chain = storage.MakeChain();
- chain->Sort(order.data(), 5);
+ std::vector tokens{
+ column::DataLayerChain::SortToken{0, 0},
+ column::DataLayerChain::SortToken{1, 1},
+ column::DataLayerChain::SortToken{2, 2},
+ column::DataLayerChain::SortToken{3, 3},
+ column::DataLayerChain::SortToken{4, 4},
+ };
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kAscending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(0, 1, 2, 3, 4));
- std::vector<uint32_t> sorted_order{1, 3, 4, 5, 6};
- ASSERT_EQ(order, sorted_order);
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kDescending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(4, 3, 2, 1, 0));
}
} // namespace
} // namespace column
-} // namespace trace_processor
-} // namespace perfetto
+} // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/column/null_overlay.cc b/src/trace_processor/db/column/null_overlay.cc
index 2d27f63..af31ac5 100644
--- a/src/trace_processor/db/column/null_overlay.cc
+++ b/src/trace_processor/db/column/null_overlay.cc
@@ -78,11 +78,30 @@
} // namespace
-NullOverlay::NullOverlay(const BitVector* non_null) : non_null_(non_null) {}
-
-std::unique_ptr<DataLayerChain> NullOverlay::MakeChain(
- std::unique_ptr<DataLayerChain> inner) {
- return std::make_unique<ChainImpl>(std::move(inner), non_null_);
+SingleSearchResult NullOverlay::ChainImpl::SingleSearch(FilterOp op,
+ SqlValue sql_val,
+ uint32_t index) const {
+ switch (op) {
+ case FilterOp::kIsNull:
+ return non_null_->IsSet(index)
+ ? inner_->SingleSearch(op, sql_val,
+ non_null_->CountSetBits(index))
+ : SingleSearchResult::kMatch;
+ case FilterOp::kIsNotNull:
+ case FilterOp::kEq:
+ case FilterOp::kGe:
+ case FilterOp::kGt:
+ case FilterOp::kLt:
+ case FilterOp::kLe:
+ case FilterOp::kNe:
+ case FilterOp::kGlob:
+ case FilterOp::kRegex:
+ return non_null_->IsSet(index)
+ ? inner_->SingleSearch(op, sql_val,
+ non_null_->CountSetBits(index))
+ : SingleSearchResult::kNoMatch;
+ }
+ PERFETTO_FATAL("For GCC");
}
NullOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> innner,
@@ -97,7 +116,6 @@
if (op == FilterOp::kIsNull) {
return SearchValidationResult::kOk;
}
-
return inner_->ValidateSearchConstraints(op, sql_val);
}
@@ -233,14 +251,19 @@
inner_range.end + non_null_offset};
}
-void NullOverlay::ChainImpl::StableSort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
-}
-
-void NullOverlay::ChainImpl::Sort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
+void NullOverlay::ChainImpl::StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const {
+ SortToken* middle = std::stable_partition(
+ start, end,
+ [this](const SortToken& idx) { return !non_null_->IsSet(idx.index); });
+ for (SortToken* it = middle; it != end; ++it) {
+ it->index = non_null_->CountSetBits(it->index);
+ }
+ inner_->StableSort(middle, end, direction);
+ if (direction == SortDirection::kDescending) {
+ std::rotate(start, middle, end);
+ }
}
void NullOverlay::ChainImpl::Serialize(StorageProto* storage) const {
diff --git a/src/trace_processor/db/column/null_overlay.h b/src/trace_processor/db/column/null_overlay.h
index 263d0f7..99f6256 100644
--- a/src/trace_processor/db/column/null_overlay.h
+++ b/src/trace_processor/db/column/null_overlay.h
@@ -33,15 +33,21 @@
class NullOverlay final : public DataLayer {
public:
explicit NullOverlay(const BitVector* non_null);
+ ~NullOverlay() override;
std::unique_ptr<DataLayerChain> MakeChain(
- std::unique_ptr<DataLayerChain>) override;
+ std::unique_ptr<DataLayerChain>,
+ ChainCreationArgs = ChainCreationArgs());
private:
class ChainImpl : public DataLayerChain {
public:
ChainImpl(std::unique_ptr<DataLayerChain>, const BitVector* non_null);
+ SingleSearchResult SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t) const override;
+
SearchValidationResult ValidateSearchConstraints(FilterOp,
SqlValue) const override;
@@ -55,9 +61,9 @@
SqlValue,
Indices) const override;
- void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
- void Sort(uint32_t* rows, uint32_t rows_size) const override;
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection) const override;
void Serialize(StorageProto*) const override;
diff --git a/src/trace_processor/db/column/null_overlay_unittest.cc b/src/trace_processor/db/column/null_overlay_unittest.cc
index 41d1e5a..ceb6c9f 100644
--- a/src/trace_processor/db/column/null_overlay_unittest.cc
+++ b/src/trace_processor/db/column/null_overlay_unittest.cc
@@ -22,7 +22,9 @@
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/db/column/data_layer.h"
#include "src/trace_processor/db/column/fake_storage.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column/utils.h"
#include "test/gtest_and_gmock.h"
@@ -33,11 +35,49 @@
using testing::ElementsAre;
using testing::IsEmpty;
+TEST(NullOverlay, SingleSearch) {
+ BitVector bv{0, 1, 0, 1, 1, 1};
+ auto fake = FakeStorageChain::SearchSubset(4, std::vector<uint32_t>{1, 2});
+ NullOverlay storage(&bv);
+ auto chain = storage.MakeChain(std::move(fake));
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 3),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 1),
+ SingleSearchResult::kNoMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 2),
+ SingleSearchResult::kNoMatch);
+}
+
+TEST(NullOverlay, SingleSearchIsNull) {
+ BitVector bv{0, 1, 0, 1, 1, 1};
+ auto fake = FakeStorageChain::SearchNone(4);
+ NullOverlay storage(&bv);
+ auto chain = storage.MakeChain(std::move(fake));
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 0),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 1),
+ SingleSearchResult::kNoMatch);
+}
+
+TEST(NullOverlay, SingleSearchIsNotNull) {
+ BitVector bv{0, 1, 0, 1, 1, 1};
+ auto fake = FakeStorageChain::SearchAll(4);
+ NullOverlay storage(&bv);
+ auto chain = storage.MakeChain(std::move(fake));
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 1),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 0),
+ SingleSearchResult::kNoMatch);
+}
+
TEST(NullOverlay, SearchInputInsideBoundary) {
BitVector bv{0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0};
- auto fake = FakeStorage::SearchAll(4u);
+ auto fake = FakeStorageChain::SearchAll(4u);
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGt, SqlValue::Long(0), Range(1, 6));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3, 4));
@@ -45,9 +85,9 @@
TEST(NullOverlay, SearchInputOutsideBoundary) {
BitVector bv{0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0};
- auto fake = FakeStorage::SearchAll(5u);
+ auto fake = FakeStorageChain::SearchAll(5u);
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGt, SqlValue::Long(0), Range(3, 8));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3, 4, 7));
@@ -55,9 +95,9 @@
TEST(NullOverlay, SubsetResultOutsideBoundary) {
BitVector bv{0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0};
- auto fake = FakeStorage::SearchSubset(5u, Range(1, 3));
+ auto fake = FakeStorageChain::SearchSubset(5u, Range(1, 3));
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGt, SqlValue::Long(0), Range(0, 11));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3, 4));
@@ -65,9 +105,9 @@
TEST(NullOverlay, SubsetResultOnBoundary) {
BitVector bv{0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0};
- auto fake = FakeStorage::SearchAll(5u);
+ auto fake = FakeStorageChain::SearchAll(5u);
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGt, SqlValue::Long(0), Range(0, 11));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1, 3, 4, 7, 8));
@@ -75,9 +115,9 @@
TEST(NullOverlay, BitVectorSubset) {
BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
- auto fake = FakeStorage::SearchSubset(4u, BitVector{0, 1, 0, 1});
+ auto fake = FakeStorageChain::SearchSubset(4u, BitVector{0, 1, 0, 1});
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGt, SqlValue::Long(0), Range(0, 8));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 6));
@@ -85,9 +125,9 @@
TEST(NullOverlay, BitVectorSubsetIsNull) {
BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
- auto fake = FakeStorage::SearchSubset(4u, BitVector{0, 1, 0, 1});
+ auto fake = FakeStorageChain::SearchSubset(4u, BitVector{0, 1, 0, 1});
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kIsNull, SqlValue(), Range(0, 8));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 2, 3, 4, 6, 7));
@@ -95,9 +135,9 @@
TEST(NullOverlay, IndexSearchAllElements) {
BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
- auto fake = FakeStorage::SearchAll(4u);
+ auto fake = FakeStorageChain::SearchAll(4u);
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> table_idx{1, 5, 2};
auto res =
@@ -109,9 +149,9 @@
TEST(NullOverlay, IndexSearchPartialElements) {
BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
- auto fake = FakeStorage::SearchAll(4u);
+ auto fake = FakeStorageChain::SearchAll(4u);
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> table_idx{1, 4, 2};
auto res =
@@ -123,9 +163,9 @@
TEST(NullOverlay, IndexSearchIsNullOpEmptyRes) {
BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
- auto fake = FakeStorage::SearchNone(4u);
+ auto fake = FakeStorageChain::SearchNone(4u);
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> table_idx{0, 3, 5, 4, 2};
auto res =
@@ -137,9 +177,9 @@
TEST(NullOverlay, IndexSearchIsNullOp) {
BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
- auto fake = FakeStorage::SearchSubset(4u, Range(2, 3));
+ auto fake = FakeStorageChain::SearchSubset(4u, Range(2, 3));
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> table_idx{0, 3, 2, 4, 5};
auto res =
@@ -151,9 +191,9 @@
TEST(NullOverlay, IndexSearchIsNotNullOp) {
BitVector bv{0, 1, 1, 0, 0, 1, 1, 0};
- auto fake = FakeStorage::SearchAll(4u);
+ auto fake = FakeStorageChain::SearchAll(4u);
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> table_idx{0, 3, 4};
auto res =
@@ -167,9 +207,9 @@
BitVector bv{0, 1, 1, 1, 0, 1};
// Passing values in final storage (on normal operations)
// 0, 1, 0, 1, 0, 0
- auto fake = FakeStorage::SearchSubset(4, BitVector{1, 0, 1, 0});
+ auto fake = FakeStorageChain::SearchSubset(4, BitVector{1, 0, 1, 0});
NullOverlay storage(&bv);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
// Passing values on final data
// NULL, NULL, 0, 1, 1
@@ -206,5 +246,40 @@
ASSERT_EQ(res.end, 5u);
}
+TEST(NullOverlay, StableSort) {
+ std::vector<uint32_t> numeric_data{3, 1, 0, 2, 4};
+ NumericStorage<uint32_t> numeric(&numeric_data, ColumnType::kUint32, false);
+
+ BitVector null{0, 1, 0, 1, 1, 1, 1};
+ NullOverlay overlay(&null);
+ auto chain = overlay.MakeChain(numeric.MakeChain());
+
+ auto make_tokens = []() {
+ return std::vector{
+ column::DataLayerChain::SortToken{0, 0},
+ column::DataLayerChain::SortToken{1, 1},
+ column::DataLayerChain::SortToken{2, 2},
+ column::DataLayerChain::SortToken{3, 3},
+ column::DataLayerChain::SortToken{4, 4},
+ column::DataLayerChain::SortToken{5, 5},
+ column::DataLayerChain::SortToken{6, 6},
+ };
+ };
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kAscending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(0, 2, 4, 3, 5, 1, 6));
+ }
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kDescending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(6, 1, 5, 3, 4, 0, 2));
+ }
+}
+
} // namespace
} // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/numeric_storage.cc b/src/trace_processor/db/column/numeric_storage.cc
index ca73ea1..529e93d 100644
--- a/src/trace_processor/db/column/numeric_storage.cc
+++ b/src/trace_processor/db/column/numeric_storage.cc
@@ -22,11 +22,11 @@
#include <cstdint>
#include <functional>
#include <limits>
+#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <variant>
-#include <vector>
#include "perfetto/base/logging.h"
#include "perfetto/public/compiler.h"
@@ -293,11 +293,6 @@
} // namespace
-NumericStorageBase::NumericStorageBase(ColumnType type, bool is_sorted)
- : storage_type_(type), is_sorted_(is_sorted) {}
-
-NumericStorageBase::~NumericStorageBase() = default;
-
NumericStorageBase::ChainImpl::ChainImpl(const void* vector_ptr,
ColumnType type,
bool is_sorted)
@@ -357,9 +352,9 @@
enum ExtremeVal { kTooBig, kTooSmall, kOk };
ExtremeVal extreme_validator = kOk;
- double_t num_val = val.type == SqlValue::kLong
- ? static_cast<double_t>(val.AsLong())
- : val.AsDouble();
+ double num_val = val.type == SqlValue::kLong
+ ? static_cast<double>(val.AsLong())
+ : val.AsDouble();
switch (storage_type_) {
case ColumnType::kDouble:
@@ -638,10 +633,9 @@
case FilterOp::kEq:
return {LowerBoundIntrinsic(vector_ptr_, val, search_range),
UpperBoundIntrinsic(vector_ptr_, val, search_range)};
- case FilterOp::kLe: {
+ case FilterOp::kLe:
return {search_range.start,
UpperBoundIntrinsic(vector_ptr_, val, search_range)};
- }
case FilterOp::kLt:
return {search_range.start,
LowerBoundIntrinsic(vector_ptr_, val, search_range)};
@@ -661,28 +655,6 @@
return {};
}
-void NumericStorageBase::ChainImpl::StableSort(uint32_t* rows,
- uint32_t rows_size) const {
- std::visit(
- [this, &rows, rows_size](auto val_data) {
- using T = decltype(val_data);
- const T* typed_start =
- static_cast<const std::vector<T>*>(vector_ptr_)->data();
- std::stable_sort(rows, rows + rows_size,
- [typed_start](uint32_t a_idx, uint32_t b_idx) {
- T first_val = typed_start[a_idx];
- T second_val = typed_start[b_idx];
- return first_val < second_val;
- });
- },
- GetNumericTypeVariant(storage_type_, SqlValue::Long(0)));
-}
-
-void NumericStorageBase::ChainImpl::Sort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_ELOG("Not implemented");
-}
-
void NumericStorageBase::ChainImpl::Serialize(StorageProto* msg) const {
auto* numeric_storage_msg = msg->set_numeric_storage();
numeric_storage_msg->set_is_sorted(is_sorted_);
diff --git a/src/trace_processor/db/column/numeric_storage.h b/src/trace_processor/db/column/numeric_storage.h
index 63d20ee..2dfafc6 100644
--- a/src/trace_processor/db/column/numeric_storage.h
+++ b/src/trace_processor/db/column/numeric_storage.h
@@ -17,15 +17,18 @@
#define SRC_TRACE_PROCESSOR_DB_COLUMN_NUMERIC_STORAGE_H_
#include <cstdint>
+#include <limits>
#include <memory>
#include <string>
#include <variant>
#include <vector>
+#include "perfetto/base/compiler.h"
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/containers/bit_vector.h"
#include "src/trace_processor/db/column/data_layer.h"
#include "src/trace_processor/db/column/types.h"
+#include "src/trace_processor/db/column/utils.h"
namespace perfetto::trace_processor::column {
@@ -47,10 +50,6 @@
SqlValue,
Indices) const override;
- void StableSort(uint32_t*, uint32_t) const override;
-
- void Sort(uint32_t*, uint32_t) const override;
-
void Serialize(StorageProto*) const override;
std::string DebugString() const override { return "NumericStorage"; }
@@ -78,7 +77,7 @@
const bool is_sorted_ = false;
};
- NumericStorageBase(ColumnType type, bool is_sorted);
+ NumericStorageBase(ColumnType type, bool is_sorted, Impl impl);
~NumericStorageBase() override;
const ColumnType storage_type_ = ColumnType::kDummy;
@@ -89,14 +88,14 @@
template <typename T>
class NumericStorage final : public NumericStorageBase {
public:
- NumericStorage(const std::vector<T>* vec,
- ColumnType type,
- bool is_sorted = false)
- : NumericStorageBase(type, is_sorted), vector_(vec) {}
+ PERFETTO_NO_INLINE NumericStorage(const std::vector<T>* vec,
+ ColumnType type,
+ bool is_sorted);
- std::unique_ptr<DataLayerChain> MakeChain() override {
- return std::make_unique<ChainImpl>(vector_, storage_type_, is_sorted_);
- }
+ // The implementation of this function is given by
+ // make_chain.cc/make_chain_minimal.cc depending on whether this is a minimal
+ // or full build of trace processor.
+ std::unique_ptr<DataLayerChain> MakeChain();
private:
class ChainImpl : public NumericStorageBase::ChainImpl {
@@ -105,6 +104,46 @@
: NumericStorageBase::ChainImpl(vector, type, is_sorted),
vector_(vector) {}
+ SingleSearchResult SingleSearch(FilterOp op,
+ SqlValue sql_val,
+ uint32_t i) const override {
+ if constexpr (std::is_same_v<T, double>) {
+ if (sql_val.type != SqlValue::kDouble) {
+ return SingleSearchResult::kNeedsFullSearch;
+ }
+ return utils::SingleSearchNumeric(op, (*vector_)[i],
+ sql_val.double_value);
+ } else {
+ if (sql_val.type != SqlValue::kLong ||
+ sql_val.long_value > std::numeric_limits<T>::max() ||
+ sql_val.long_value < std::numeric_limits<T>::min()) {
+ return SingleSearchResult::kNeedsFullSearch;
+ }
+ return utils::SingleSearchNumeric(op, (*vector_)[i],
+ static_cast<T>(sql_val.long_value));
+ }
+ }
+
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const override {
+ const T* base = vector_->data();
+ switch (direction) {
+ case SortDirection::kAscending:
+ std::stable_sort(start, end,
+ [base](const SortToken& a, const SortToken& b) {
+ return base[a.index] < base[b.index];
+ });
+ break;
+ case SortDirection::kDescending:
+ std::stable_sort(start, end,
+ [base](const SortToken& a, const SortToken& b) {
+ return base[a.index] > base[b.index];
+ });
+ break;
+ }
+ }
+
uint32_t size() const override {
return static_cast<uint32_t>(vector_->size());
}
@@ -112,10 +151,41 @@
private:
const std::vector<T>* vector_;
};
+ Impl GetImpl() {
+ if constexpr (std::is_same_v<T, double>) {
+ return Impl::kNumericDouble;
+ } else if constexpr (std::is_same_v<T, uint32_t>) {
+ return Impl::kNumericUint32;
+ } else if constexpr (std::is_same_v<T, int32_t>) {
+ return Impl::kNumericInt32;
+ } else if constexpr (std::is_same_v<T, int64_t>) {
+ return Impl::kNumericInt64;
+ } else {
+ // false doesn't work as expression has to depend on the template
+ // parameter
+ static_assert(sizeof(T*) == 0, "T is not supported");
+ }
+ }
const std::vector<T>* vector_;
};
+// Define external templates to reduce binary size bloat.
+extern template class NumericStorage<double>;
+extern template class NumericStorage<uint32_t>;
+extern template class NumericStorage<int32_t>;
+extern template class NumericStorage<int64_t>;
+
+// Define external templates to allow splitting minimal vs full targets.
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<double>::MakeChain();
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<uint32_t>::MakeChain();
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<int32_t>::MakeChain();
+extern template std::unique_ptr<DataLayerChain>
+NumericStorage<int64_t>::MakeChain();
+
} // namespace perfetto::trace_processor::column
#endif // SRC_TRACE_PROCESSOR_DB_COLUMN_NUMERIC_STORAGE_H_
diff --git a/src/trace_processor/db/column/numeric_storage_unittest.cc b/src/trace_processor/db/column/numeric_storage_unittest.cc
index 256f57d..534338c 100644
--- a/src/trace_processor/db/column/numeric_storage_unittest.cc
+++ b/src/trace_processor/db/column/numeric_storage_unittest.cc
@@ -24,13 +24,13 @@
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/containers/row_map.h"
+#include "src/trace_processor/db/column/data_layer.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column/utils.h"
#include "src/trace_processor/db/compare.h"
#include "test/gtest_and_gmock.h"
-namespace perfetto {
-namespace trace_processor {
+namespace perfetto::trace_processor {
inline bool operator==(const Range& a, const Range& b) {
return std::tie(a.start, a.end) == std::tie(b.start, b.end);
@@ -45,7 +45,7 @@
TEST(NumericStorage, InvalidSearchConstraintsGeneralChecks) {
std::vector<uint32_t> data_vec(128);
std::iota(data_vec.begin(), data_vec.end(), 0);
- NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
+ NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32, false);
auto chain = storage.MakeChain();
Range test_range(20, 100);
@@ -75,7 +75,7 @@
TEST(NumericStorage, InvalidValueBoundsUint32) {
std::vector<uint32_t> data_vec(128);
std::iota(data_vec.begin(), data_vec.end(), 0);
- NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
+ NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32, false);
auto chain = storage.MakeChain();
SqlValue max_val = SqlValue::Long(
@@ -114,7 +114,7 @@
TEST(NumericStorage, InvalidValueBoundsInt32) {
std::vector<int32_t> data_vec(128);
std::iota(data_vec.begin(), data_vec.end(), 0);
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
SqlValue max_val = SqlValue::Long(
@@ -150,35 +150,45 @@
SearchValidationResult::kNoData);
}
-TEST(NumericStorage, StableSortTrivial) {
- std::vector<uint32_t> data_vec{0, 1, 2, 0, 1, 2, 0, 1, 2};
- std::vector<uint32_t> out = {0, 1, 2, 3, 4, 5, 6, 7, 8};
-
- NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
+TEST(NumericStorage, SingleSearch) {
+ std::vector<int32_t> data_vec{0, 1, 2, 3, 0, -1, -2, -3};
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
- RowMap rm(0, 9);
- chain->StableSort(out.data(), 9);
- std::vector<uint32_t> stable_out{0, 3, 6, 1, 4, 7, 2, 5, 8};
- ASSERT_EQ(out, stable_out);
-}
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(1), 1),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(1), 5),
+ SingleSearchResult::kNoMatch);
-TEST(NumericStorage, StableSort) {
- std::vector<uint32_t> data_vec{0, 1, 2, 0, 1, 2, 0, 1, 2};
- std::vector<uint32_t> out = {1, 7, 4, 0, 6, 3, 2, 5, 8};
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(1), 0),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(-2), 6),
+ SingleSearchResult::kNoMatch);
- NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
- auto chain = storage.MakeChain();
- RowMap rm(0, 9);
- chain->StableSort(out.data(), 9);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(3), 2),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(-2), 5),
+ SingleSearchResult::kNoMatch);
- std::vector<uint32_t> stable_out{0, 6, 3, 1, 7, 4, 2, 5, 8};
- ASSERT_EQ(out, stable_out);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(4), 4),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(0), 3),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(0), 3),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(0), 5),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0), 0),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0), 5),
+ SingleSearchResult::kNoMatch);
}
TEST(NumericStorage, Search) {
std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
Range test_range(1, 5);
SqlValue val = SqlValue::Long(4);
@@ -204,7 +214,7 @@
TEST(NumericStorage, SearchCompareWithNegative) {
std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
Range test_range(1, 5);
SqlValue val = SqlValue::Long(-3);
@@ -230,7 +240,7 @@
TEST(NumericStorage, IndexSearch) {
std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
// -5, -3, -3, 3, 5, 0
@@ -259,7 +269,7 @@
TEST(NumericStorage, IndexSearchCompareWithNegative) {
std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
// -5, -3, -3, 3, 5, 0
@@ -289,7 +299,7 @@
TEST(NumericStorage, SearchFast) {
std::vector<uint32_t> data_vec(128);
std::iota(data_vec.begin(), data_vec.end(), 0);
- NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
+ NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32, false);
auto chain = storage.MakeChain();
RangeOrBitVector range_or_bv =
chain->Search(FilterOp::kGe, SqlValue::Long(100), Range(0, 128));
@@ -341,7 +351,7 @@
Indices sorted_order{sorted_order_vec.data(), 10,
Indices::State::kNonmonotonic};
- NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32);
+ NumericStorage<uint32_t> storage(&data_vec, ColumnType::kUint32, false);
auto chain = storage.MakeChain();
Range range = chain->OrderedIndexSearch(FilterOp::kEq, SqlValue::Long(60),
@@ -377,7 +387,7 @@
TEST(NumericStorage, SearchWithIntAsDouble) {
std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
Range test_range(1, 5);
SqlValue val = SqlValue::Double(4);
@@ -403,7 +413,7 @@
TEST(NumericStorage, IndexSearchWithIntAsDouble) {
std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
// -5, -3, -3, 3, 5, 0
@@ -432,7 +442,7 @@
TEST(NumericStorage, SearchInt32WithDouble) {
std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
Range test_range(1, 5);
SqlValue val = SqlValue::Double(3.5);
@@ -458,7 +468,7 @@
TEST(NumericStorage, SearchInt32WithNegDouble) {
std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
Range test_range(1, 5);
SqlValue val = SqlValue::Double(-3.5);
@@ -484,7 +494,7 @@
TEST(NumericStorage, IndexSearchInt32WithDouble) {
std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
// -5, -3, -3, 3, 5, 0
@@ -513,7 +523,7 @@
TEST(NumericStorage, IndexSearchInt32WithNegDouble) {
std::vector<int32_t> data_vec{-5, 5, -4, 4, -3, 3, 0};
- NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<int32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
// -5, -3, -3, 3, 5, 0
@@ -542,7 +552,7 @@
TEST(NumericStorage, SearchUint32WithNegDouble) {
std::vector<uint32_t> data_vec{0, 1, 2, 3, 4, 5};
- NumericStorage<uint32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<uint32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
Range test_range(1, 5);
SqlValue val = SqlValue::Double(-3.5);
@@ -568,7 +578,7 @@
TEST(NumericStorage, IndexSearchUint32WithNegDouble) {
std::vector<uint32_t> data_vec{0, 1, 2, 3, 4, 5, 6};
- NumericStorage<uint32_t> storage(&data_vec, ColumnType::kInt32);
+ NumericStorage<uint32_t> storage(&data_vec, ColumnType::kInt32, false);
auto chain = storage.MakeChain();
std::vector<uint32_t> indices_vec{0, 4, 4, 5, 1, 6};
@@ -607,7 +617,7 @@
ASSERT_TRUE(compare::LongToDouble(not_rep_i, data_vec[0]) > 0);
ASSERT_TRUE(compare::LongToDouble(not_rep_i, data_vec[1]) < 0);
- NumericStorage<double> storage(&data_vec, ColumnType::kDouble);
+ NumericStorage<double> storage(&data_vec, ColumnType::kDouble, false);
auto chain = storage.MakeChain();
Range test_range(0, 2);
@@ -643,7 +653,7 @@
ASSERT_TRUE(compare::LongToDouble(not_rep_i, data_vec[0]) < 0);
ASSERT_TRUE(compare::LongToDouble(not_rep_i, data_vec[1]) > 0);
- NumericStorage<double> storage(&data_vec, ColumnType::kDouble);
+ NumericStorage<double> storage(&data_vec, ColumnType::kDouble, false);
auto chain = storage.MakeChain();
Range test_range(0, 2);
@@ -666,7 +676,37 @@
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0));
}
+TEST(NumericStorage, StableSort) {
+ std::vector<int64_t> data{
+ -1, -100, 2, 100, 2,
+ };
+ NumericStorage<int64_t> storage(&data, ColumnType::kInt64, false);
+ auto chain = storage.MakeChain();
+ auto make_tokens = []() {
+ return std::vector{
+ column::DataLayerChain::SortToken{0, 0},
+ column::DataLayerChain::SortToken{1, 1},
+ column::DataLayerChain::SortToken{2, 2},
+ column::DataLayerChain::SortToken{3, 3},
+ column::DataLayerChain::SortToken{4, 4},
+ };
+ };
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kAscending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(1, 0, 2, 4, 3));
+ }
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kDescending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(3, 2, 4, 0, 1));
+ }
+}
+
} // namespace
} // namespace column
-} // namespace trace_processor
-} // namespace perfetto
+} // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/column/range_overlay.cc b/src/trace_processor/db/column/range_overlay.cc
index 6455174..0b8275b 100644
--- a/src/trace_processor/db/column/range_overlay.cc
+++ b/src/trace_processor/db/column/range_overlay.cc
@@ -34,19 +34,19 @@
using Range = Range;
-RangeOverlay::RangeOverlay(const Range* range) : range_(range) {}
-
-std::unique_ptr<DataLayerChain> RangeOverlay::MakeChain(
- std::unique_ptr<DataLayerChain> inner) {
- return std::make_unique<ChainImpl>(std::move(inner), range_);
-}
-
RangeOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> inner,
const Range* range)
: inner_(std::move(inner)), range_(range) {
PERFETTO_CHECK(range->end <= inner_->size());
}
+SingleSearchResult RangeOverlay::ChainImpl::SingleSearch(FilterOp op,
+ SqlValue sql_val,
+ uint32_t i) const {
+ PERFETTO_DCHECK(i < range_->size());
+ return inner_->SingleSearch(op, sql_val, i + range_->start);
+}
+
SearchValidationResult RangeOverlay::ChainImpl::ValidateSearchConstraints(
FilterOp op,
SqlValue sql_val) const {
@@ -135,14 +135,13 @@
op, sql_val, Indices{storage_iv.data(), indices.size, indices.state});
}
-void RangeOverlay::ChainImpl::StableSort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
-}
-
-void RangeOverlay::ChainImpl::Sort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
+void RangeOverlay::ChainImpl::StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const {
+ for (SortToken* it = start; it != end; ++it) {
+ it->index += range_->start;
+ }
+ inner_->StableSort(start, end, direction);
}
void RangeOverlay::ChainImpl::Serialize(StorageProto*) const {
diff --git a/src/trace_processor/db/column/range_overlay.h b/src/trace_processor/db/column/range_overlay.h
index 4ba5875..200d5d4 100644
--- a/src/trace_processor/db/column/range_overlay.h
+++ b/src/trace_processor/db/column/range_overlay.h
@@ -30,15 +30,21 @@
class RangeOverlay final : public DataLayer {
public:
explicit RangeOverlay(const Range*);
+ ~RangeOverlay() override;
std::unique_ptr<DataLayerChain> MakeChain(
- std::unique_ptr<DataLayerChain>) override;
+ std::unique_ptr<DataLayerChain>,
+ ChainCreationArgs = ChainCreationArgs());
private:
class ChainImpl : public DataLayerChain {
public:
ChainImpl(std::unique_ptr<DataLayerChain>, const Range*);
+ SingleSearchResult SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t) const override;
+
SearchValidationResult ValidateSearchConstraints(FilterOp,
SqlValue) const override;
@@ -52,9 +58,9 @@
SqlValue,
Indices) const override;
- void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
- void Sort(uint32_t* rows, uint32_t rows_size) const override;
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection) const override;
void Serialize(StorageProto*) const override;
diff --git a/src/trace_processor/db/column/range_overlay_unittest.cc b/src/trace_processor/db/column/range_overlay_unittest.cc
index 74864e8..f4ec491 100644
--- a/src/trace_processor/db/column/range_overlay_unittest.cc
+++ b/src/trace_processor/db/column/range_overlay_unittest.cc
@@ -20,7 +20,10 @@
#include <vector>
#include "perfetto/trace_processor/basic_types.h"
+#include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/db/column/data_layer.h"
#include "src/trace_processor/db/column/fake_storage.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column/utils.h"
#include "test/gtest_and_gmock.h"
@@ -32,59 +35,92 @@
using testing::IsEmpty;
using Range = Range;
+TEST(SelectorOverlay, SearchSingle) {
+ Range range(3, 8);
+ RangeOverlay storage(&range);
+ auto fake = FakeStorageChain::SearchSubset(
+ 8, BitVector{false, false, false, true, false, false, false, false});
+ auto chain = storage.MakeChain(std::move(fake));
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(0u), 0),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(0u), 1),
+ SingleSearchResult::kNoMatch);
+}
+
TEST(RangeOverlay, SearchAll) {
Range range(3, 8);
RangeOverlay storage(&range);
- auto fake = FakeStorage::SearchAll(10);
- auto queryable = storage.MakeChain(fake->MakeChain());
+ auto fake = FakeStorageChain::SearchAll(10);
+ auto chain = storage.MakeChain(std::move(fake));
- auto res = queryable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
+ auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1u, 2u, 3u));
}
TEST(RangeOverlay, SearchNone) {
Range range(3, 8);
RangeOverlay storage(&range);
- auto fake = FakeStorage::SearchNone(10);
- auto queryable = storage.MakeChain(fake->MakeChain());
+ auto fake = FakeStorageChain::SearchNone(10);
+ auto chain = storage.MakeChain(std::move(fake));
- auto res = queryable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
+ auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
ASSERT_THAT(utils::ToIndexVectorForTests(res), IsEmpty());
}
TEST(RangeOverlay, SearchLimited) {
- auto fake = FakeStorage::SearchSubset(10, std::vector<uint32_t>{4});
+ auto fake = FakeStorageChain::SearchSubset(10, std::vector<uint32_t>{4});
Range range(3, 5);
RangeOverlay storage(&range);
- auto queryable = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
- auto res = queryable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 2));
+ auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 2));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1u));
}
TEST(RangeOverlay, SearchBitVector) {
- auto fake = FakeStorage::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
+ auto fake =
+ FakeStorageChain::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
Range range(3, 6);
RangeOverlay storage(&range);
- auto queryable = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
- auto res = queryable->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 3));
+ auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 3));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 2));
}
TEST(RangeOverlay, IndexSearch) {
- auto fake = FakeStorage::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
+ auto fake =
+ FakeStorageChain::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
Range range(3, 5);
RangeOverlay storage(&range);
- auto queryable = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> table_idx{1u, 0u, 3u};
- RangeOrBitVector res = queryable->IndexSearch(
+ RangeOrBitVector res = chain->IndexSearch(
FilterOp::kGe, SqlValue::Long(0u),
Indices{table_idx.data(), static_cast<uint32_t>(table_idx.size()),
Indices::State::kNonmonotonic});
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1u));
}
+TEST(RangeOverlay, StableSort) {
+ std::vector<uint32_t> numeric_data{100, 99, 2, 0, 1};
+ NumericStorage<uint32_t> numeric(&numeric_data, ColumnType::kUint32, false);
+
+ Range range(2, 4);
+ RangeOverlay storage(&range);
+ auto chain = storage.MakeChain(numeric.MakeChain());
+
+ std::vector tokens{
+ column::DataLayerChain::SortToken{0, 0},
+ column::DataLayerChain::SortToken{1, 1},
+ column::DataLayerChain::SortToken{2, 2},
+ };
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kAscending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens), ElementsAre(1, 2, 0));
+}
+
} // namespace
} // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/selector_overlay.cc b/src/trace_processor/db/column/selector_overlay.cc
index 835c6dc..ff1e463 100644
--- a/src/trace_processor/db/column/selector_overlay.cc
+++ b/src/trace_processor/db/column/selector_overlay.cc
@@ -34,18 +34,16 @@
namespace perfetto::trace_processor::column {
-SelectorOverlay::SelectorOverlay(const BitVector* selector)
- : selector_(selector) {}
-
-std::unique_ptr<DataLayerChain> SelectorOverlay::MakeChain(
- std::unique_ptr<DataLayerChain> inner) {
- return std::make_unique<ChainImpl>(std::move(inner), selector_);
-}
-
SelectorOverlay::ChainImpl::ChainImpl(std::unique_ptr<DataLayerChain> inner,
const BitVector* selector)
: inner_(std::move(inner)), selector_(selector) {}
+SingleSearchResult SelectorOverlay::ChainImpl::SingleSearch(FilterOp op,
+ SqlValue sql_val,
+ uint32_t i) const {
+ return inner_->SingleSearch(op, sql_val, selector_->IndexOfNthSet(i));
+}
+
SearchValidationResult SelectorOverlay::ChainImpl::ValidateSearchConstraints(
FilterOp op,
SqlValue sql_val) const {
@@ -126,14 +124,13 @@
indices.state});
}
-void SelectorOverlay::ChainImpl::StableSort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
-}
-
-void SelectorOverlay::ChainImpl::Sort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_FATAL("Not implemented");
+void SelectorOverlay::ChainImpl::StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const {
+ for (SortToken* it = start; it != end; ++it) {
+ it->index = selector_->IndexOfNthSet(it->index);
+ }
+ inner_->StableSort(start, end, direction);
}
void SelectorOverlay::ChainImpl::Serialize(StorageProto* storage) const {
diff --git a/src/trace_processor/db/column/selector_overlay.h b/src/trace_processor/db/column/selector_overlay.h
index ae50540..04f178a 100644
--- a/src/trace_processor/db/column/selector_overlay.h
+++ b/src/trace_processor/db/column/selector_overlay.h
@@ -34,15 +34,21 @@
class SelectorOverlay final : public DataLayer {
public:
explicit SelectorOverlay(const BitVector*);
+ ~SelectorOverlay() override;
std::unique_ptr<DataLayerChain> MakeChain(
- std::unique_ptr<DataLayerChain>) override;
+ std::unique_ptr<DataLayerChain>,
+ ChainCreationArgs = ChainCreationArgs());
private:
class ChainImpl : public DataLayerChain {
public:
ChainImpl(std::unique_ptr<DataLayerChain>, const BitVector*);
+ SingleSearchResult SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t) const override;
+
SearchValidationResult ValidateSearchConstraints(FilterOp,
SqlValue) const override;
@@ -56,9 +62,9 @@
SqlValue,
Indices) const override;
- void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
- void Sort(uint32_t* rows, uint32_t rows_size) const override;
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection) const override;
void Serialize(StorageProto*) const override;
diff --git a/src/trace_processor/db/column/selector_overlay_unittest.cc b/src/trace_processor/db/column/selector_overlay_unittest.cc
index e4991eb..11d20f2 100644
--- a/src/trace_processor/db/column/selector_overlay_unittest.cc
+++ b/src/trace_processor/db/column/selector_overlay_unittest.cc
@@ -19,9 +19,11 @@
#include <cstdint>
#include <vector>
+#include "data_layer.h"
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/containers/bit_vector.h"
#include "src/trace_processor/db/column/fake_storage.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column/utils.h"
#include "test/gtest_and_gmock.h"
@@ -32,11 +34,23 @@
using testing::ElementsAre;
using testing::IsEmpty;
+TEST(SelectorOverlay, SingleSearch) {
+ BitVector selector{0, 1, 1, 0, 0, 1, 1, 0};
+ auto fake = FakeStorageChain::SearchSubset(8, Range(2, 5));
+ SelectorOverlay storage(&selector);
+ auto chain = storage.MakeChain(std::move(fake));
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 1),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(0u), 0),
+ SingleSearchResult::kNoMatch);
+}
+
TEST(SelectorOverlay, SearchAll) {
BitVector selector{0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1};
- auto fake = FakeStorage::SearchAll(10);
+ auto fake = FakeStorageChain::SearchAll(10);
SelectorOverlay storage(&selector);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1u, 2u, 3u));
@@ -44,9 +58,9 @@
TEST(SelectorOverlay, SearchNone) {
BitVector selector{0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1};
- auto fake = FakeStorage::SearchNone(10);
+ auto fake = FakeStorageChain::SearchNone(10);
SelectorOverlay storage(&selector);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 4));
ASSERT_THAT(utils::ToIndexVectorForTests(res), IsEmpty());
@@ -54,9 +68,9 @@
TEST(SelectorOverlay, SearchLimited) {
BitVector selector{0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1};
- auto fake = FakeStorage::SearchSubset(10, Range(4, 5));
+ auto fake = FakeStorageChain::SearchSubset(10, Range(4, 5));
SelectorOverlay storage(&selector);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(1, 5));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2u));
@@ -64,9 +78,10 @@
TEST(SelectorOverlay, SearchBitVector) {
BitVector selector{0, 1, 1, 0, 0, 1, 1, 0};
- auto fake = FakeStorage::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
+ auto fake =
+ FakeStorageChain::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
SelectorOverlay storage(&selector);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
auto res = chain->Search(FilterOp::kGe, SqlValue::Long(0u), Range(0, 4));
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 2));
@@ -74,9 +89,10 @@
TEST(SelectorOverlay, IndexSearch) {
BitVector selector{0, 1, 1, 0, 0, 1, 1, 0};
- auto fake = FakeStorage::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
+ auto fake =
+ FakeStorageChain::SearchSubset(8, BitVector({0, 1, 0, 1, 0, 1, 0, 0}));
SelectorOverlay storage(&selector);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> table_idx{1u, 0u, 3u};
RangeOrBitVector res = chain->IndexSearch(
@@ -88,9 +104,9 @@
TEST(SelectorOverlay, OrderedIndexSearchTrivial) {
BitVector selector{1, 0, 1, 0, 1};
- auto fake = FakeStorage::SearchAll(5);
+ auto fake = FakeStorageChain::SearchAll(5);
SelectorOverlay storage(&selector);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> table_idx{1u, 0u, 2u};
Range res = chain->OrderedIndexSearch(
@@ -103,9 +119,9 @@
TEST(SelectorOverlay, OrderedIndexSearchNone) {
BitVector selector{1, 0, 1, 0, 1};
- auto fake = FakeStorage::SearchNone(5);
+ auto fake = FakeStorageChain::SearchNone(5);
SelectorOverlay storage(&selector);
- auto chain = storage.MakeChain(fake->MakeChain());
+ auto chain = storage.MakeChain(std::move(fake));
std::vector<uint32_t> table_idx{1u, 0u, 2u};
Range res = chain->OrderedIndexSearch(
@@ -115,5 +131,39 @@
ASSERT_EQ(res.size(), 0u);
}
+TEST(SelectorOverlay, StableSort) {
+ std::vector<uint32_t> numeric_data{3, 1, 0, 0, 2, 4, 3, 4};
+ NumericStorage<uint32_t> numeric(&numeric_data, ColumnType::kUint32, false);
+
+ BitVector selector{0, 1, 0, 1, 1, 1, 1, 1};
+ SelectorOverlay overlay(&selector);
+ auto chain = overlay.MakeChain(numeric.MakeChain());
+
+ auto make_tokens = []() {
+ return std::vector{
+ column::DataLayerChain::SortToken{0, 0},
+ column::DataLayerChain::SortToken{1, 1},
+ column::DataLayerChain::SortToken{2, 2},
+ column::DataLayerChain::SortToken{3, 3},
+ column::DataLayerChain::SortToken{4, 4},
+ column::DataLayerChain::SortToken{5, 5},
+ };
+ };
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kAscending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(1, 0, 2, 4, 3, 5));
+ }
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kDescending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(3, 5, 4, 2, 0, 1));
+ }
+}
+
} // namespace
} // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/set_id_storage.cc b/src/trace_processor/db/column/set_id_storage.cc
index aa05165..780761c 100644
--- a/src/trace_processor/db/column/set_id_storage.cc
+++ b/src/trace_processor/db/column/set_id_storage.cc
@@ -39,7 +39,6 @@
#include "protos/perfetto/trace_processor/serialization.pbzero.h"
namespace perfetto::trace_processor::column {
-
namespace {
using SetId = SetIdStorage::SetId;
@@ -67,16 +66,23 @@
} // namespace
-SetIdStorage::SetIdStorage(const std::vector<uint32_t>* values)
- : values_(values) {}
-
-std::unique_ptr<DataLayerChain> SetIdStorage::MakeChain() {
- return std::make_unique<ChainImpl>(values_);
-}
-
SetIdStorage::ChainImpl::ChainImpl(const std::vector<uint32_t>* values)
: values_(values) {}
+SingleSearchResult SetIdStorage::ChainImpl::SingleSearch(FilterOp op,
+ SqlValue sql_val,
+ uint32_t i) const {
+ if (sql_val.type != SqlValue::kLong ||
+ sql_val.long_value > std::numeric_limits<uint32_t>::max() ||
+ sql_val.long_value < std::numeric_limits<uint32_t>::min()) {
+ // Because of the large amount of code needing for handling comparisions
+ // with doubles or out of range values, just defer to the full search.
+ return SingleSearchResult::kNeedsFullSearch;
+ }
+ return utils::SingleSearchNumeric(op, (*values_)[i],
+ static_cast<uint32_t>(sql_val.long_value));
+}
+
SearchValidationResult SetIdStorage::ChainImpl::ValidateSearchConstraints(
FilterOp op,
SqlValue val) const {
@@ -300,14 +306,23 @@
return {};
}
-void SetIdStorage::ChainImpl::StableSort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_ELOG("Not implemented");
-}
-
-void SetIdStorage::ChainImpl::Sort(uint32_t*, uint32_t) const {
- // TODO(b/307482437): Implement.
- PERFETTO_ELOG("Not implemented");
+void SetIdStorage::ChainImpl::StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const {
+ switch (direction) {
+ case SortDirection::kAscending:
+ std::stable_sort(start, end,
+ [this](const SortToken& a, const SortToken& b) {
+ return (*values_)[a.index] < (*values_)[b.index];
+ });
+ break;
+ case SortDirection::kDescending:
+ std::stable_sort(start, end,
+ [this](const SortToken& a, const SortToken& b) {
+ return (*values_)[a.index] > (*values_)[b.index];
+ });
+ break;
+ }
}
void SetIdStorage::ChainImpl::Serialize(StorageProto* msg) const {
diff --git a/src/trace_processor/db/column/set_id_storage.h b/src/trace_processor/db/column/set_id_storage.h
index 1555751..64f14a3 100644
--- a/src/trace_processor/db/column/set_id_storage.h
+++ b/src/trace_processor/db/column/set_id_storage.h
@@ -34,14 +34,19 @@
using SetId = uint32_t;
explicit SetIdStorage(const std::vector<uint32_t>*);
+ ~SetIdStorage() override;
- std::unique_ptr<DataLayerChain> MakeChain() override;
+ std::unique_ptr<DataLayerChain> MakeChain();
private:
class ChainImpl : public DataLayerChain {
public:
explicit ChainImpl(const std::vector<uint32_t>*);
+ SingleSearchResult SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t) const override;
+
SearchValidationResult ValidateSearchConstraints(FilterOp,
SqlValue) const override;
@@ -55,9 +60,9 @@
SqlValue,
Indices) const override;
- void StableSort(uint32_t*, uint32_t) const override;
-
- void Sort(uint32_t*, uint32_t) const override;
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const override;
void Serialize(StorageProto*) const override;
diff --git a/src/trace_processor/db/column/set_id_storage_unittest.cc b/src/trace_processor/db/column/set_id_storage_unittest.cc
index cd8403f..99371dc 100644
--- a/src/trace_processor/db/column/set_id_storage_unittest.cc
+++ b/src/trace_processor/db/column/set_id_storage_unittest.cc
@@ -22,6 +22,8 @@
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/containers/bit_vector.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column/utils.h"
#include "test/gtest_and_gmock.h"
@@ -42,6 +44,42 @@
using testing::ElementsAre;
using testing::IsEmpty;
+TEST(SetIdStorage, SearchSingle) {
+ std::vector<uint32_t> storage_data{0, 0, 2, 2, 4, 4, 6, 6};
+ SetIdStorage storage(&storage_data);
+ auto chain = storage.MakeChain();
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(4), 4),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::Long(4), 3),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(4), 3),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::Long(4), 4),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(4), 4),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::Long(4), 1),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(4), 6),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::Long(4), 4),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(4), 4),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::Long(4), 6),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(4), 3),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::Long(4), 4),
+ SingleSearchResult::kNoMatch);
+}
+
TEST(SetIdStorage, InvalidSearchConstraints) {
std::vector<uint32_t> storage_data{0, 0, 0, 3, 3, 3, 6, 6, 6, 9, 9, 9};
SetIdStorage storage(&storage_data);
@@ -326,6 +364,35 @@
ASSERT_EQ(res, Range(9, 10));
}
+TEST(SetIdStorage, StableSort) {
+ std::vector<uint32_t> storage_data{0, 0, 0, 3, 3};
+ SetIdStorage storage(&storage_data);
+ auto chain = storage.MakeChain();
+ auto make_tokens = []() {
+ return std::vector{
+ column::DataLayerChain::SortToken{3, 3},
+ column::DataLayerChain::SortToken{2, 2},
+ column::DataLayerChain::SortToken{1, 1},
+ column::DataLayerChain::SortToken{0, 0},
+ column::DataLayerChain::SortToken{4, 4},
+ };
+ };
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kAscending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(2, 1, 0, 3, 4));
+ }
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kDescending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(3, 4, 2, 1, 0));
+ }
+}
+
} // namespace
} // namespace column
} // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/column/string_storage.cc b/src/trace_processor/db/column/string_storage.cc
index 9476c85..05f5932 100644
--- a/src/trace_processor/db/column/string_storage.cc
+++ b/src/trace_processor/db/column/string_storage.cc
@@ -21,6 +21,7 @@
#include <functional>
#include <iterator>
#include <memory>
+#include <optional>
#include <string>
#include <utility>
#include <vector>
@@ -196,20 +197,89 @@
} // namespace
-StringStorage::StringStorage(StringPool* string_pool,
- const std::vector<StringPool::Id>* data,
- bool is_sorted)
- : data_(data), string_pool_(string_pool), is_sorted_(is_sorted) {}
-
-std::unique_ptr<DataLayerChain> StringStorage::MakeChain() {
- return std::make_unique<ChainImpl>(string_pool_, data_, is_sorted_);
-}
-
StringStorage::ChainImpl::ChainImpl(StringPool* string_pool,
const std::vector<StringPool::Id>* data,
bool is_sorted)
: data_(data), string_pool_(string_pool), is_sorted_(is_sorted) {}
+SingleSearchResult StringStorage::ChainImpl::SingleSearch(FilterOp op,
+ SqlValue sql_val,
+ uint32_t i) const {
+ if (sql_val.type == SqlValue::kNull) {
+ if (op == FilterOp::kIsNull) {
+ return IsNull()((*data_)[i], StringPool::Id::Null())
+ ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ }
+ if (op == FilterOp::kIsNotNull) {
+ return IsNotNull()((*data_)[i], StringPool::Id::Null())
+ ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ }
+ return SingleSearchResult::kNeedsFullSearch;
+ }
+
+ if (sql_val.type != SqlValue::kString) {
+ return SingleSearchResult::kNeedsFullSearch;
+ }
+
+ switch (op) {
+ case FilterOp::kEq: {
+ std::optional<StringPool::Id> id =
+ string_pool_->GetId(base::StringView(sql_val.string_value));
+ return id && std::equal_to<>()((*data_)[i], *id)
+ ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ }
+ case FilterOp::kNe: {
+ std::optional<StringPool::Id> id =
+ string_pool_->GetId(base::StringView(sql_val.string_value));
+ return !id || NotEqual()((*data_)[i], *id) ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ }
+ case FilterOp::kGe:
+ return GreaterEqual{string_pool_}(
+ (*data_)[i], NullTermStringView(sql_val.string_value))
+ ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kGt:
+ return Greater{string_pool_}((*data_)[i],
+ NullTermStringView(sql_val.string_value))
+ ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kLe:
+ return LessEqual{string_pool_}((*data_)[i],
+ NullTermStringView(sql_val.string_value))
+ ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kLt:
+ return Less{string_pool_}((*data_)[i],
+ NullTermStringView(sql_val.string_value))
+ ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kGlob: {
+ util::GlobMatcher matcher =
+ util::GlobMatcher::FromPattern(sql_val.string_value);
+ return Glob{string_pool_}((*data_)[i], matcher)
+ ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ }
+ case FilterOp::kRegex: {
+ // Caller should ensure that the regex is valid.
+ base::StatusOr<regex::Regex> regex =
+ regex::Regex::Create(sql_val.AsString());
+ PERFETTO_CHECK(regex.status().ok());
+ return Regex{string_pool_}((*data_)[i], regex.value())
+ ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ }
+ case FilterOp::kIsNull:
+ case FilterOp::kIsNotNull:
+ PERFETTO_FATAL("Already handled above");
+ }
+ PERFETTO_FATAL("For GCC");
+}
+
SearchValidationResult StringStorage::ChainImpl::ValidateSearchConstraints(
FilterOp op,
SqlValue val) const {
@@ -547,25 +617,29 @@
case FilterOp::kRegex:
PERFETTO_FATAL("Shouldn't be called");
}
- PERFETTO_FATAL("For gcc");
+ PERFETTO_FATAL("For GCC");
}
-void StringStorage::ChainImpl::StableSort(uint32_t* indices,
- uint32_t indices_size) const {
- std::stable_sort(indices, indices + indices_size,
- [this](uint32_t a_idx, uint32_t b_idx) {
- return string_pool_->Get((*data_)[a_idx]) <
- string_pool_->Get((*data_)[b_idx]);
- });
-}
-
-void StringStorage::ChainImpl::Sort(uint32_t* indices,
- uint32_t indices_size) const {
- std::sort(indices, indices + indices_size,
- [this](uint32_t a_idx, uint32_t b_idx) {
- return string_pool_->Get((*data_)[a_idx]) <
- string_pool_->Get((*data_)[b_idx]);
- });
+void StringStorage::ChainImpl::StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const {
+ switch (direction) {
+ case SortDirection::kAscending:
+ std::stable_sort(start, end,
+ [this](const SortToken& a, const SortToken& b) {
+ return string_pool_->Get((*data_)[a.index]) <
+ string_pool_->Get((*data_)[b.index]);
+ });
+ return;
+ case SortDirection::kDescending:
+ std::stable_sort(start, end,
+ [this](const SortToken& a, const SortToken& b) {
+ return string_pool_->Get((*data_)[a.index]) >
+ string_pool_->Get((*data_)[b.index]);
+ });
+ return;
+ }
+ PERFETTO_FATAL("For GCC");
}
void StringStorage::ChainImpl::Serialize(StorageProto* msg) const {
diff --git a/src/trace_processor/db/column/string_storage.h b/src/trace_processor/db/column/string_storage.h
index b8fee2d..d61aef5 100644
--- a/src/trace_processor/db/column/string_storage.h
+++ b/src/trace_processor/db/column/string_storage.h
@@ -35,8 +35,9 @@
StringStorage(StringPool* string_pool,
const std::vector<StringPool::Id>* data,
bool is_sorted = false);
+ ~StringStorage() override;
- std::unique_ptr<DataLayerChain> MakeChain() override;
+ std::unique_ptr<DataLayerChain> MakeChain();
private:
class ChainImpl : public DataLayerChain {
@@ -45,6 +46,10 @@
const std::vector<StringPool::Id>* data,
bool is_sorted);
+ SingleSearchResult SingleSearch(FilterOp,
+ SqlValue,
+ uint32_t) const override;
+
SearchValidationResult ValidateSearchConstraints(FilterOp,
SqlValue) const override;
@@ -58,9 +63,9 @@
SqlValue,
Indices) const override;
- void StableSort(uint32_t* rows, uint32_t rows_size) const override;
-
- void Sort(uint32_t* rows, uint32_t rows_size) const override;
+ void StableSort(SortToken* start,
+ SortToken* end,
+ SortDirection direction) const override;
void Serialize(StorageProto*) const override;
diff --git a/src/trace_processor/db/column/string_storage_unittest.cc b/src/trace_processor/db/column/string_storage_unittest.cc
index 4df8795..303ab66 100644
--- a/src/trace_processor/db/column/string_storage_unittest.cc
+++ b/src/trace_processor/db/column/string_storage_unittest.cc
@@ -24,6 +24,7 @@
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/containers/bit_vector.h"
#include "src/trace_processor/containers/string_pool.h"
+#include "src/trace_processor/db/column/data_layer.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column/utils.h"
#include "test/gtest_and_gmock.h"
@@ -34,7 +35,7 @@
using testing::ElementsAre;
using testing::IsEmpty;
-TEST(StringStorage, Search) {
+TEST(StringStorage, SearchOneElement) {
std::vector<std::string> strings{"cheese", "pasta", "pizza",
"pierogi", "onion", "fries"};
std::vector<StringPool::Id> ids;
@@ -43,45 +44,107 @@
ids.push_back(pool.InternString(base::StringView(string)));
}
ids.insert(ids.begin() + 3, StringPool::Id::Null());
+ // 0:"cheese", 1:"pasta", 2:"pizza", 3:NULL, 4:"pierogi", 5:"onion", 6:"fries"
StringStorage storage(&pool, &ids);
- auto queriable = storage.MakeChain();
+ auto chain = storage.MakeChain();
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::String("pierogi"), 4),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kEq, SqlValue::String("pierogi"), 3),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::String("foo"), 0),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::String("pierogi"), 0),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kNe, SqlValue::String("pierogi"), 4),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::String("pierogi"), 4),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGe, SqlValue::String("pierogi"), 1),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::String("pierogi"), 2),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGt, SqlValue::String("pierogi"), 5),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::String("pierogi"), 4),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLe, SqlValue::String("pierogi"), 2),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::String("pierogi"), 0),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kLt, SqlValue::String("pierogi"), 4),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 3),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNull, SqlValue(), 4),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 4),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kIsNotNull, SqlValue(), 3),
+ SingleSearchResult::kNoMatch);
+
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGlob, SqlValue::String("p*"), 1),
+ SingleSearchResult::kMatch);
+ ASSERT_EQ(chain->SingleSearch(FilterOp::kGlob, SqlValue::String("p*"), 0),
+ SingleSearchResult::kNoMatch);
+}
+
+TEST(StringStorage, Search) {
+ std::vector<std::string> strings{"cheese", "pasta", "pizza",
+ "pierogi", "onion", "fries"};
+ std::vector<StringPool::Id> ids;
+ StringPool pool;
+ ids.reserve(strings.size());
+ for (const auto& string : strings) {
+ ids.push_back(pool.InternString(base::StringView(string)));
+ }
+ ids.insert(ids.begin() + 3, StringPool::Id::Null());
+ StringStorage storage(&pool, &ids);
+ auto chain = storage.MakeChain();
SqlValue val = SqlValue::String("pierogi");
Range filter_range(0, 7);
FilterOp op = FilterOp::kEq;
- auto res = queriable->Search(op, val, filter_range);
+ auto res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(4));
op = FilterOp::kNe;
- res = queriable->Search(op, val, filter_range);
+ res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2, 5, 6));
op = FilterOp::kLt;
- res = queriable->Search(op, val, filter_range);
+ res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 5, 6));
op = FilterOp::kLe;
- res = queriable->Search(op, val, filter_range);
+ res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 4, 5, 6));
op = FilterOp::kGt;
- res = queriable->Search(op, val, filter_range);
+ res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2));
op = FilterOp::kGe;
- res = queriable->Search(op, val, filter_range);
+ res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 4));
op = FilterOp::kIsNull;
- res = queriable->Search(op, SqlValue(), filter_range);
+ res = chain->Search(op, SqlValue(), filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3));
op = FilterOp::kIsNotNull;
- res = queriable->Search(op, SqlValue(), filter_range);
+ res = chain->Search(op, SqlValue(), filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2, 4, 5, 6));
op = FilterOp::kGlob;
- res = queriable->Search(op, SqlValue::String("p*"), filter_range);
+ res = chain->Search(op, SqlValue::String("p*"), filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(1, 2, 4));
}
@@ -95,46 +158,46 @@
}
ids.insert(ids.begin() + 3, StringPool::Id::Null());
StringStorage storage(&pool, &ids);
- auto queriable = storage.MakeChain();
+ auto chain = storage.MakeChain();
SqlValue val = SqlValue::String("pierogi");
// "fries", "onion", "pierogi", NULL, "pizza", "pasta", "cheese"
std::vector<uint32_t> indices_vec{6, 5, 4, 3, 2, 1, 0};
Indices indices{indices_vec.data(), 7, Indices::State::kNonmonotonic};
FilterOp op = FilterOp::kEq;
- auto res = queriable->IndexSearch(op, val, indices);
+ auto res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2));
op = FilterOp::kNe;
- res = queriable->IndexSearch(op, val, indices);
+ res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 4, 5, 6));
op = FilterOp::kLt;
- res = queriable->IndexSearch(op, val, indices);
+ res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 5, 6));
op = FilterOp::kLe;
- res = queriable->IndexSearch(op, val, indices);
+ res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2, 5, 6));
op = FilterOp::kGt;
- res = queriable->IndexSearch(op, val, indices);
+ res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(4));
op = FilterOp::kGe;
- res = queriable->IndexSearch(op, val, indices);
+ res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 4));
op = FilterOp::kIsNull;
- res = queriable->IndexSearch(op, SqlValue(), indices);
+ res = chain->IndexSearch(op, SqlValue(), indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3));
op = FilterOp::kIsNotNull;
- res = queriable->IndexSearch(op, SqlValue(), indices);
+ res = chain->IndexSearch(op, SqlValue(), indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2, 4, 5, 6));
op = FilterOp::kGlob;
- res = queriable->IndexSearch(op, SqlValue::String("p*"), indices);
+ res = chain->IndexSearch(op, SqlValue::String("p*"), indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 4, 5));
}
@@ -150,10 +213,9 @@
ids.insert(ids.begin() + 3, StringPool::Id::Null());
StringStorage storage(&pool, &ids);
- auto queriable = storage.MakeChain();
+ auto chain = storage.MakeChain();
BitVector bv =
- queriable
- ->Search(FilterOp::kRegex, SqlValue::String(".*zz.*"), Range(0, 7))
+ chain->Search(FilterOp::kRegex, SqlValue::String(".*zz.*"), Range(0, 7))
.TakeIfBitVector();
ASSERT_EQ(bv.CountSetBits(), 1u);
@@ -170,9 +232,9 @@
ids.insert(ids.begin() + 3, StringPool::Id::Null());
StringStorage storage(&pool, &ids);
- auto queriable = storage.MakeChain();
+ auto chain = storage.MakeChain();
BitVector bv =
- queriable->Search(FilterOp::kRegex, SqlValue::String("*"), Range(0, 7))
+ chain->Search(FilterOp::kRegex, SqlValue::String("*"), Range(0, 7))
.TakeIfBitVector();
ASSERT_EQ(bv.CountSetBits(), 0u);
@@ -188,36 +250,36 @@
ids.push_back(pool.InternString(base::StringView(string)));
}
StringStorage storage(&pool, &ids, true);
- auto queriable = storage.MakeChain();
+ auto chain = storage.MakeChain();
SqlValue val = SqlValue::String("cheese");
Range filter_range(0, 6);
FilterOp op = FilterOp::kEq;
- auto res = queriable->Search(op, val, filter_range);
+ auto res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2));
op = FilterOp::kNe;
- res = queriable->Search(op, val, filter_range);
+ res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 3, 4, 5));
op = FilterOp::kLt;
- res = queriable->Search(op, val, filter_range);
+ res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1));
op = FilterOp::kLe;
- res = queriable->Search(op, val, filter_range);
+ res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2));
op = FilterOp::kGt;
- res = queriable->Search(op, val, filter_range);
+ res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3, 4, 5));
op = FilterOp::kGe;
- res = queriable->Search(op, val, filter_range);
+ res = chain->Search(op, val, filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 3, 4, 5));
op = FilterOp::kGlob;
- res = queriable->Search(op, SqlValue::String("*e"), filter_range);
+ res = chain->Search(op, SqlValue::String("*e"), filter_range);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 2));
}
@@ -230,38 +292,38 @@
ids.push_back(pool.InternString(base::StringView(string)));
}
StringStorage storage(&pool, &ids, true);
- auto queriable = storage.MakeChain();
+ auto chain = storage.MakeChain();
SqlValue val = SqlValue::String("cheese");
// fries, eggplant, cheese, burger
std::vector<uint32_t> indices_vec{5, 4, 2, 1};
Indices indices{indices_vec.data(), 4, Indices::State::kNonmonotonic};
FilterOp op = FilterOp::kEq;
- auto res = queriable->IndexSearch(op, val, indices);
+ auto res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2));
op = FilterOp::kNe;
- res = queriable->IndexSearch(op, val, indices);
+ res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 3));
op = FilterOp::kLt;
- res = queriable->IndexSearch(op, val, indices);
+ res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(3));
op = FilterOp::kLe;
- res = queriable->IndexSearch(op, val, indices);
+ res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2, 3));
op = FilterOp::kGt;
- res = queriable->IndexSearch(op, val, indices);
+ res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1));
op = FilterOp::kGe;
- res = queriable->IndexSearch(op, val, indices);
+ res = chain->IndexSearch(op, val, indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(0, 1, 2));
op = FilterOp::kGlob;
- res = queriable->IndexSearch(op, SqlValue::String("*e"), indices);
+ res = chain->IndexSearch(op, SqlValue::String("*e"), indices);
ASSERT_THAT(utils::ToIndexVectorForTests(res), ElementsAre(2));
}
@@ -274,34 +336,34 @@
ids.push_back(pool.InternString(base::StringView(string)));
}
StringStorage storage(&pool, &ids);
- auto queriable = storage.MakeChain();
+ auto chain = storage.MakeChain();
SqlValue val = SqlValue::String("pierogi");
// cheese, fries, onion, pasta, pierogi, pizza
std::vector<uint32_t> indices_vec{0, 5, 4, 1, 3, 2};
Indices indices{indices_vec.data(), 6, Indices::State::kNonmonotonic};
FilterOp op = FilterOp::kEq;
- Range res = queriable->OrderedIndexSearch(op, val, indices);
+ Range res = chain->OrderedIndexSearch(op, val, indices);
ASSERT_EQ(res.start, 4u);
ASSERT_EQ(res.end, 5u);
op = FilterOp::kLt;
- res = queriable->OrderedIndexSearch(op, val, indices);
+ res = chain->OrderedIndexSearch(op, val, indices);
ASSERT_EQ(res.start, 0u);
ASSERT_EQ(res.end, 4u);
op = FilterOp::kLe;
- res = queriable->OrderedIndexSearch(op, val, indices);
+ res = chain->OrderedIndexSearch(op, val, indices);
ASSERT_EQ(res.start, 0u);
ASSERT_EQ(res.end, 5u);
op = FilterOp::kGt;
- res = queriable->OrderedIndexSearch(op, val, indices);
+ res = chain->OrderedIndexSearch(op, val, indices);
ASSERT_EQ(res.start, 5u);
ASSERT_EQ(res.end, 6u);
op = FilterOp::kGe;
- res = queriable->OrderedIndexSearch(op, val, indices);
+ res = chain->OrderedIndexSearch(op, val, indices);
ASSERT_EQ(res.start, 4u);
ASSERT_EQ(res.end, 6u);
}
@@ -315,12 +377,11 @@
ids.push_back(pool.InternString(base::StringView(string)));
}
StringStorage storage(&pool, &ids);
- auto queriable = storage.MakeChain();
+ auto chain = storage.MakeChain();
std::vector<uint32_t> indices_vec{0, 2, 5, 7};
Indices indices{indices_vec.data(), 4, Indices::State::kNonmonotonic};
- auto res =
- queriable->OrderedIndexSearch(FilterOp::kIsNull, SqlValue(), indices);
+ auto res = chain->OrderedIndexSearch(FilterOp::kIsNull, SqlValue(), indices);
ASSERT_EQ(res.start, 0u);
ASSERT_EQ(res.end, 2u);
}
@@ -334,15 +395,54 @@
ids.push_back(pool.InternString(base::StringView(string)));
}
StringStorage storage(&pool, &ids);
- auto queriable = storage.MakeChain();
+ auto chain = storage.MakeChain();
std::vector<uint32_t> indices_vec{0, 2, 5, 7};
Indices indices{indices_vec.data(), 4, Indices::State::kNonmonotonic};
auto res =
- queriable->OrderedIndexSearch(FilterOp::kIsNotNull, SqlValue(), indices);
+ chain->OrderedIndexSearch(FilterOp::kIsNotNull, SqlValue(), indices);
ASSERT_EQ(res.start, 2u);
ASSERT_EQ(res.end, 4u);
}
+TEST(StringStorage, StableSort) {
+ std::vector<std::string> strings{"cheese", "pasta", "pizza",
+ "pierogi", "onion", "fries"};
+ std::vector<StringPool::Id> ids(3, StringPool::Id::Null());
+ StringPool pool;
+ for (const auto& string : strings) {
+ ids.push_back(pool.InternString(base::StringView(string)));
+ }
+ StringStorage storage(&pool, &ids);
+ auto chain = storage.MakeChain();
+ auto make_tokens = []() {
+ return std::vector{
+ column::DataLayerChain::SortToken{0, 0},
+ column::DataLayerChain::SortToken{1, 1},
+ column::DataLayerChain::SortToken{2, 2},
+ column::DataLayerChain::SortToken{3, 3},
+ column::DataLayerChain::SortToken{4, 4},
+ column::DataLayerChain::SortToken{5, 5},
+ column::DataLayerChain::SortToken{6, 6},
+ column::DataLayerChain::SortToken{7, 7},
+ column::DataLayerChain::SortToken{8, 8},
+ };
+ };
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kAscending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(0, 1, 2, 3, 8, 7, 4, 6, 5));
+ }
+ {
+ auto tokens = make_tokens();
+ chain->StableSort(tokens.data(), tokens.data() + tokens.size(),
+ column::DataLayerChain::SortDirection::kDescending);
+ ASSERT_THAT(utils::ExtractPayloadForTesting(tokens),
+ ElementsAre(5, 6, 4, 7, 8, 3, 0, 1, 2));
+ }
+}
+
} // namespace
} // namespace perfetto::trace_processor::column
diff --git a/src/trace_processor/db/column/types.h b/src/trace_processor/db/column/types.h
index 274ac90..803c6ce 100644
--- a/src/trace_processor/db/column/types.h
+++ b/src/trace_processor/db/column/types.h
@@ -29,6 +29,14 @@
using Range = RowMap::Range;
+// Result of calling Storage::SingleSearch function.
+enum class SingleSearchResult {
+ kMatch, // The specified row matches the constraint.
+ kNoMatch, // The specified row does not matches the constraint.
+ kNeedsFullSearch, // SingleSearch was unable to determine if the row meets
+ // the crtiteria, a call to *Search is required.
+};
+
// Result of calling Storage::ValidateSearchResult function.
enum class SearchValidationResult {
kOk, // It makes sense to run search
diff --git a/src/trace_processor/db/column/utils.cc b/src/trace_processor/db/column/utils.cc
index 6b83ae7..efec000 100644
--- a/src/trace_processor/db/column/utils.cc
+++ b/src/trace_processor/db/column/utils.cc
@@ -15,18 +15,26 @@
*/
#include "src/trace_processor/db/column/utils.h"
-#include <optional>
-#include "perfetto/base/logging.h"
-namespace perfetto {
-namespace trace_processor {
-namespace column {
-namespace utils {
+#include <cmath>
+#include <cstdint>
+#include <functional>
+#include <optional>
+#include <utility>
+#include <vector>
+
+#include "perfetto/base/logging.h"
+#include "perfetto/trace_processor/basic_types.h"
+#include "src/trace_processor/containers/row_map.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/types.h"
+
+namespace perfetto::trace_processor::column::utils {
SearchValidationResult CompareIntColumnWithDouble(FilterOp op,
SqlValue* sql_val) {
double double_val = sql_val->AsDouble();
- if (std::equal_to<double>()(
+ if (std::equal_to<>()(
double_val, static_cast<double>(static_cast<uint32_t>(double_val)))) {
// If double is the same as uint32_t, we should just "cast" the |sql_val|
// to be treated as long.
@@ -70,6 +78,16 @@
return rm.GetAllIndices();
}
+std::vector<uint32_t> ExtractPayloadForTesting(
+ std::vector<column::DataLayerChain::SortToken>& tokens) {
+ std::vector<uint32_t> payload;
+ payload.reserve(tokens.size());
+ for (const auto& token : tokens) {
+ payload.push_back(token.payload);
+ }
+ return payload;
+}
+
std::optional<Range> CanReturnEarly(SearchValidationResult res, Range range) {
switch (res) {
case SearchValidationResult::kOk:
@@ -94,8 +112,5 @@
}
PERFETTO_FATAL("For GCC");
}
-} // namespace utils
-} // namespace column
-} // namespace trace_processor
-} // namespace perfetto
+} // namespace perfetto::trace_processor::column::utils
diff --git a/src/trace_processor/db/column/utils.h b/src/trace_processor/db/column/utils.h
index 4f48254..b1c71a3 100644
--- a/src/trace_processor/db/column/utils.h
+++ b/src/trace_processor/db/column/utils.h
@@ -16,17 +16,18 @@
#ifndef SRC_TRACE_PROCESSOR_DB_COLUMN_UTILS_H_
#define SRC_TRACE_PROCESSOR_DB_COLUMN_UTILS_H_
+#include <cstdint>
+#include <functional>
#include <optional>
+#include <vector>
+
#include "perfetto/base/logging.h"
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/containers/bit_vector.h"
-#include "src/trace_processor/containers/row_map.h"
+#include "src/trace_processor/db/column/data_layer.h"
#include "src/trace_processor/db/column/types.h"
-namespace perfetto {
-namespace trace_processor {
-namespace column {
-namespace utils {
+namespace perfetto::trace_processor::column::utils {
template <typename Comparator, typename ValType, typename DataType>
void LinearSearchWithComparator(ValType val,
@@ -88,6 +89,38 @@
}
}
+template <typename T>
+SingleSearchResult SingleSearchNumeric(FilterOp op, T left, T right) {
+ switch (op) {
+ case FilterOp::kEq:
+ return std::equal_to<T>()(left, right) ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kNe:
+ return std::not_equal_to<T>()(left, right) ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kGe:
+ return std::greater_equal<T>()(left, right)
+ ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kGt:
+ return std::greater<T>()(left, right) ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kLe:
+ return std::less_equal<T>()(left, right) ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kLt:
+ return std::less<T>()(left, right) ? SingleSearchResult::kMatch
+ : SingleSearchResult::kNoMatch;
+ case FilterOp::kIsNotNull:
+ return SingleSearchResult::kMatch;
+ case FilterOp::kGlob:
+ case FilterOp::kRegex:
+ case FilterOp::kIsNull:
+ return SingleSearchResult::kNoMatch;
+ }
+ PERFETTO_FATAL("For GCC");
+}
+
// Used for comparing the integer column ({u|}int{32|64}) with a double value.
// If further search is required it would return kOk and change the SqlValue to
// a `SqlLong` which would return real results.
@@ -103,11 +136,11 @@
std::optional<Range> CanReturnEarly(SearchValidationResult,
uint32_t indices_size);
+std::vector<uint32_t> ExtractPayloadForTesting(
+ std::vector<column::DataLayerChain::SortToken>&);
+
std::vector<uint32_t> ToIndexVectorForTests(RangeOrBitVector&);
-} // namespace utils
+} // namespace perfetto::trace_processor::column::utils
-} // namespace column
-} // namespace trace_processor
-} // namespace perfetto
#endif // SRC_TRACE_PROCESSOR_DB_COLUMN_UTILS_H_
diff --git a/src/trace_processor/db/column_storage.h b/src/trace_processor/db/column_storage.h
index 294c1cf..bc30a0d 100644
--- a/src/trace_processor/db/column_storage.h
+++ b/src/trace_processor/db/column_storage.h
@@ -22,6 +22,7 @@
#include <optional>
#include <vector>
+#include "perfetto/base/compiler.h"
#include "perfetto/base/logging.h"
#include "perfetto/public/compiler.h"
#include "src/trace_processor/containers/bit_vector.h"
@@ -62,7 +63,7 @@
T Get(uint32_t idx) const { return vector_[idx]; }
void Append(T val) { vector_.emplace_back(val); }
void Set(uint32_t idx, T val) { vector_[idx] = val; }
- void ShrinkToFit() { vector_.shrink_to_fit(); }
+ PERFETTO_NO_INLINE void ShrinkToFit() { vector_.shrink_to_fit(); }
const std::vector<T>& vector() const { return vector_; }
const void* data() const final { return vector_.data(); }
@@ -137,7 +138,7 @@
}
}
bool IsDense() const { return mode_ == Mode::kDense; }
- void ShrinkToFit() {
+ PERFETTO_NO_INLINE void ShrinkToFit() {
data_.shrink_to_fit();
valid_.ShrinkToFit();
}
diff --git a/src/trace_processor/db/query_executor.cc b/src/trace_processor/db/query_executor.cc
index 82ddb10..bd15245 100644
--- a/src/trace_processor/db/query_executor.cc
+++ b/src/trace_processor/db/query_executor.cc
@@ -16,30 +16,14 @@
#include <algorithm>
#include <cstdint>
-#include <memory>
-#include <optional>
#include <utility>
#include <vector>
-#include "perfetto/base/compiler.h"
#include "perfetto/base/logging.h"
-#include "perfetto/ext/base/small_vector.h"
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/containers/bit_vector.h"
#include "src/trace_processor/containers/row_map.h"
-#include "src/trace_processor/containers/string_pool.h"
-#include "src/trace_processor/db/column.h"
-#include "src/trace_processor/db/column/arrangement_overlay.h"
#include "src/trace_processor/db/column/data_layer.h"
-#include "src/trace_processor/db/column/dense_null_overlay.h"
-#include "src/trace_processor/db/column/dummy_storage.h"
-#include "src/trace_processor/db/column/id_storage.h"
-#include "src/trace_processor/db/column/null_overlay.h"
-#include "src/trace_processor/db/column/numeric_storage.h"
-#include "src/trace_processor/db/column/range_overlay.h"
-#include "src/trace_processor/db/column/selector_overlay.h"
-#include "src/trace_processor/db/column/set_id_storage.h"
-#include "src/trace_processor/db/column/string_storage.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/query_executor.h"
#include "src/trace_processor/db/table.h"
@@ -56,9 +40,23 @@
const column::DataLayerChain& chain,
RowMap* rm) {
// Shortcut of empty row map.
- if (rm->empty())
+ uint32_t rm_size = rm->size();
+ if (rm_size == 0)
return;
+ uint32_t rm_first = rm->Get(0);
+ if (rm_size == 1) {
+ switch (chain.SingleSearch(c.op, c.value, rm_first)) {
+ case SingleSearchResult::kMatch:
+ return;
+ case SingleSearchResult::kNoMatch:
+ rm->Clear();
+ return;
+ case SingleSearchResult::kNeedsFullSearch:
+ break;
+ }
+ }
+
// Comparison of NULL with any operation apart from |IS_NULL| and
// |IS_NOT_NULL| should return no rows.
if (c.value.is_null() && c.op != FilterOp::kIsNull &&
@@ -67,13 +65,11 @@
return;
}
- uint32_t rm_size = rm->size();
- uint32_t rm_first = rm->Get(0);
uint32_t rm_last = rm->Get(rm_size - 1);
uint32_t range_size = rm_last - rm_first;
- // If the number of elements in the rowmap is small or the number of elements
- // is less than 1/10th of the range, use indexed filtering.
+ // If the number of elements in the rowmap is small or the number of
+ // elements is less than 1/10th of the range, use indexed filtering.
// TODO(b/283763282): use Overlay estimations.
bool disallows_index_search = rm->IsRange();
bool prefers_index_search =
@@ -99,8 +95,8 @@
Range range = std::move(res).TakeIfRange();
*rm = RowMap(range.start, range.end);
} else {
- // The BitVector was already limited on the RowMap when created, so we can
- // take it as it is.
+ // The BitVector was already limited on the RowMap when created, so we
+ // can take it as it is.
*rm = RowMap(std::move(res).TakeIfBitVector());
}
return;
@@ -156,152 +152,70 @@
const std::vector<Constraint>& c_vec) {
RowMap rm(0, table->row_count());
for (const auto& c : c_vec) {
- if (rm.empty()) {
- return rm;
- }
-
- const ColumnLegacy& col = table->columns()[c.col_idx];
- uint32_t column_size =
- col.IsId() ? col.overlay().row_map().Max() : col.storage_base().size();
-
- // RowMap size is 1.
- bool use_legacy = rm.size() == 1;
-
- if (use_legacy) {
- col.FilterInto(c.op, c.value, &rm);
- continue;
- }
-
- // Create storage
- base::SmallVector<std::unique_ptr<column::DataLayer>, 4> data_layers;
- std::unique_ptr<column::DataLayerChain> chain;
- if (col.IsSetId()) {
- if (col.IsNullable()) {
- data_layers.emplace_back(std::make_unique<column::SetIdStorage>(
- &col.storage<std::optional<uint32_t>>().non_null_vector()));
- chain = data_layers.back()->MakeChain();
- } else {
- data_layers.emplace_back(std::make_unique<column::SetIdStorage>(
- &col.storage<uint32_t>().vector()));
- chain = data_layers.back()->MakeChain();
- }
- } else {
- switch (col.col_type()) {
- case ColumnType::kDummy:
- data_layers.emplace_back(std::make_unique<column::DummyStorage>());
- chain = data_layers.back()->MakeChain();
- break;
- case ColumnType::kId:
- data_layers.emplace_back(std::make_unique<column::IdStorage>());
- chain = data_layers.back()->MakeChain();
- break;
- case ColumnType::kString:
- data_layers.emplace_back(std::make_unique<column::StringStorage>(
- table->string_pool(), &col.storage<StringPool::Id>().vector(),
- col.IsSorted()));
- chain = data_layers.back()->MakeChain();
- break;
- case ColumnType::kInt64:
- if (col.IsNullable()) {
- data_layers.emplace_back(
- std::make_unique<column::NumericStorage<int64_t>>(
- &col.storage<std::optional<int64_t>>().non_null_vector(),
- col.col_type(), col.IsSorted()));
- chain = data_layers.back()->MakeChain();
-
- } else {
- data_layers.emplace_back(
- std::make_unique<column::NumericStorage<int64_t>>(
- &col.storage<int64_t>().vector(), col.col_type(),
- col.IsSorted()));
- chain = data_layers.back()->MakeChain();
- }
- break;
- case ColumnType::kUint32:
- if (col.IsNullable()) {
- data_layers.emplace_back(
- std::make_unique<column::NumericStorage<uint32_t>>(
- &col.storage<std::optional<uint32_t>>().non_null_vector(),
- col.col_type(), col.IsSorted()));
- chain = data_layers.back()->MakeChain();
- } else {
- data_layers.emplace_back(
- std::make_unique<column::NumericStorage<uint32_t>>(
- &col.storage<uint32_t>().vector(), col.col_type(),
- col.IsSorted()));
- chain = data_layers.back()->MakeChain();
- }
- break;
- case ColumnType::kInt32:
- if (col.IsNullable()) {
- data_layers.emplace_back(
- std::make_unique<column::NumericStorage<int32_t>>(
- &col.storage<std::optional<int32_t>>().non_null_vector(),
- col.col_type(), col.IsSorted()));
- chain = data_layers.back()->MakeChain();
- } else {
- data_layers.emplace_back(
- std::make_unique<column::NumericStorage<int32_t>>(
- &col.storage<int32_t>().vector(), col.col_type(),
- col.IsSorted()));
- chain = data_layers.back()->MakeChain();
- }
- break;
- case ColumnType::kDouble:
- if (col.IsNullable()) {
- data_layers.emplace_back(
- std::make_unique<column::NumericStorage<double>>(
- &col.storage<std::optional<double>>().non_null_vector(),
- col.col_type(), col.IsSorted()));
- chain = data_layers.back()->MakeChain();
- } else {
- data_layers.emplace_back(
- std::make_unique<column::NumericStorage<double>>(
- &col.storage<double>().vector(), col.col_type(),
- col.IsSorted()));
- chain = data_layers.back()->MakeChain();
- }
- }
- }
-
- if (col.IsNullable()) {
- // String columns are inherently nullable: null values are signified
- // with Id::Null().
- PERFETTO_CHECK(col.col_type() != ColumnType::kString);
- if (col.IsDense()) {
- data_layers.emplace_back(std::make_unique<column::DenseNullOverlay>(
- col.storage_base().bv()));
- chain = data_layers.back()->MakeChain(std::move(chain));
- } else {
- data_layers.emplace_back(
- std::make_unique<column::NullOverlay>(col.storage_base().bv()));
- chain = data_layers.back()->MakeChain(std::move(chain));
- }
- }
- if (col.overlay().row_map().IsIndexVector()) {
- data_layers.emplace_back(std::make_unique<column::ArrangementOverlay>(
- col.overlay().row_map().GetIfIndexVector(),
- Indices::State::kNonmonotonic, col.IsSorted()));
- chain = data_layers.back()->MakeChain(std::move(chain));
- }
- if (col.overlay().row_map().IsBitVector()) {
- data_layers.emplace_back(std::make_unique<column::SelectorOverlay>(
- col.overlay().row_map().GetIfBitVector()));
- chain = data_layers.back()->MakeChain(std::move(chain));
- }
- if (col.overlay().row_map().IsRange() &&
- col.overlay().size() != column_size) {
- data_layers.emplace_back(std::make_unique<column::RangeOverlay>(
- col.overlay().row_map().GetIfIRange()));
- chain = data_layers.back()->MakeChain(std::move(chain));
- }
- uint32_t pre_count = rm.size();
- FilterColumn(c, *chain, &rm);
- PERFETTO_DCHECK(rm.size() <= pre_count);
+ FilterColumn(c, table->ChainForColumn(c.col_idx), &rm);
}
return rm;
}
+void QueryExecutor::SortLegacy(const Table* table,
+ const std::vector<Order>& ob,
+ std::vector<uint32_t>& out) {
+ // Setup the sort token payload to match the input vector of indices. The
+ // value of the payload will be untouched by the algorithm even while the
+ // order changes to match the ordering defined by the input constraint set.
+ std::vector<column::DataLayerChain::SortToken> rows(out.size());
+ for (uint32_t i = 0; i < out.size(); ++i) {
+ rows[i].payload = out[i];
+ }
+
+ // As our data is columnar, it's always more efficient to sort one column
+ // at a time rather than try and sort lexiographically all at once.
+ // To preserve correctness, we need to stably sort the index vector once
+ // for each order by in *reverse* order. Reverse order is important as it
+ // preserves the lexiographical property.
+ //
+ // For example, suppose we have the following:
+ // Table {
+ // Column x;
+ // Column y
+ // Column z;
+ // }
+ //
+ // Then, to sort "y asc, x desc", we could do one of two things:
+ // 1) sort the index vector all at once and on each index, we compare
+ // y then z. This is slow as the data is columnar and we need to
+ // repeatedly branch inside each column.
+ // 2) we can stably sort first on x desc and then sort on y asc. This will
+ // first put all the x in the correct order such that when we sort on
+ // y asc, we will have the correct order of x where y is the same (since
+ // the sort is stable).
+ //
+ // TODO(lalitm): it is possible that we could sort the last constraint (i.e.
+ // the first constraint in the below loop) in a non-stable way. However, this
+ // is more subtle than it appears as we would then need special handling where
+ // there are order bys on a column which is already sorted (e.g. ts, id).
+ // Investigate whether the performance gains from this are worthwhile. This
+ // also needs changes to the constraint modification logic in DbSqliteTable
+ // which currently eliminates constraints on sorted columns.
+ for (auto it = ob.rbegin(); it != ob.rend(); ++it) {
+ // Reset the index to the payload at the start of each iote
+ for (uint32_t i = 0; i < out.size(); ++i) {
+ rows[i].index = rows[i].payload;
+ }
+ table->ChainForColumn(it->col_idx)
+ .StableSort(rows.data(), rows.data() + rows.size(),
+ it->desc
+ ? column::DataLayerChain::SortDirection::kDescending
+ : column::DataLayerChain::SortDirection::kAscending);
+ }
+
+ // Recapture the payload from each of the sort tokens whose order now
+ // indicates the order
+ for (uint32_t i = 0; i < out.size(); ++i) {
+ out[i] = rows[i].payload;
+ }
+}
+
void QueryExecutor::BoundedColumnFilterForTesting(
const Constraint& c,
const column::DataLayerChain& col,
diff --git a/src/trace_processor/db/query_executor.h b/src/trace_processor/db/query_executor.h
index 348c9b3..1887f1a 100644
--- a/src/trace_processor/db/query_executor.h
+++ b/src/trace_processor/db/query_executor.h
@@ -17,6 +17,7 @@
#define SRC_TRACE_PROCESSOR_DB_QUERY_EXECUTOR_H_
#include <cstdint>
+#include <utility>
#include <vector>
#include "src/trace_processor/containers/row_map.h"
@@ -49,6 +50,11 @@
// Enables QueryExecutor::Filter on Table columns.
static RowMap FilterLegacy(const Table*, const std::vector<Constraint>&);
+ // Enables QueryExecutor::Sort on Table columns.
+ static void SortLegacy(const Table*,
+ const std::vector<Order>&,
+ std::vector<uint32_t>&);
+
// Used only in unittests. Exposes private function.
static void BoundedColumnFilterForTesting(const Constraint&,
const column::DataLayerChain&,
diff --git a/src/trace_processor/db/query_executor_benchmark.cc b/src/trace_processor/db/query_executor_benchmark.cc
index ea66137..fa79206 100644
--- a/src/trace_processor/db/query_executor_benchmark.cc
+++ b/src/trace_processor/db/query_executor_benchmark.cc
@@ -21,6 +21,7 @@
#include <initializer_list>
#include <optional>
#include <string>
+#include <string_view>
#include <vector>
#include "perfetto/base/logging.h"
@@ -30,6 +31,7 @@
#include "perfetto/trace_processor/basic_types.h"
#include "src/base/test/utils.h"
#include "src/trace_processor/containers/string_pool.h"
+#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/table.h"
#include "src/trace_processor/tables/metadata_tables_py.h"
#include "src/trace_processor/tables/profiler_tables_py.h"
@@ -47,21 +49,22 @@
using HeapGraphObjectTable = tables::HeapGraphObjectTable;
// `SELECT * FROM SLICE` on android_monitor_contention_trace.at
-static char kSliceTable[] = "test/data/slice_table_for_benchmarks.csv";
+constexpr std::string_view kSliceTable =
+ "test/data/slice_table_for_benchmarks.csv";
// `SELECT * FROM SLICE` on android_monitor_contention_trace.at
-static char kExpectedFrameTimelineTable[] =
+constexpr std::string_view kExpectedFrameTimelineTable =
"test/data/expected_frame_timeline_for_benchmarks.csv";
// `SELECT id, cpu FROM raw` on chrome_android_systrace.pftrace.
-static char kRawTable[] = "test/data/raw_cpu_for_benchmarks.csv";
+constexpr std::string_view kRawTable = "test/data/raw_cpu_for_benchmarks.csv";
// `SELECT id, cpu FROM ftrace_event` on chrome_android_systrace.pftrace.
-static char kFtraceEventTable[] =
+constexpr std::string_view kFtraceEventTable =
"test/data/ftrace_event_cpu_for_benchmarks.csv";
// `SELECT id, upid, reference_set_id FROM heap_graph_object` on
-static char kHeapGraphObjectTable[] =
+constexpr std::string_view kHeapGraphObjectTable =
"test/data/heap_pgraph_object_for_benchmarks_query.csv";
enum DB { V1, V2 };
@@ -88,10 +91,10 @@
}
std::vector<std::string> ReadCSV(benchmark::State& state,
- std::string file_name) {
+ std::string_view file_name) {
std::string table_csv;
- perfetto::base::ReadFile(perfetto::base::GetTestDataPath(file_name),
- &table_csv);
+ perfetto::base::ReadFile(
+ perfetto::base::GetTestDataPath(std::string(file_name)), &table_csv);
if (table_csv.empty()) {
state.SkipWithError(
"Test strings missing. Googlers: download "
@@ -225,34 +228,8 @@
HeapGraphObjectTable table_{&pool_};
};
-void BenchmarkSliceTable(benchmark::State& state,
- SliceTableForBenchmark& table,
- std::initializer_list<Constraint> c) {
- Table::kUseFilterV2 = state.range(0) == 1;
- for (auto _ : state) {
- benchmark::DoNotOptimize(table.table_.QueryToRowMap(c, {}));
- }
- state.counters["s/row"] =
- benchmark::Counter(static_cast<double>(table.table_.row_count()),
- benchmark::Counter::kIsIterationInvariantRate |
- benchmark::Counter::kInvert);
-}
-
-void BenchmarkExpectedFrameTable(benchmark::State& state,
- ExpectedFrameTimelineTableForBenchmark& table,
- Constraint c) {
- Table::kUseFilterV2 = state.range(0) == 1;
- for (auto _ : state) {
- benchmark::DoNotOptimize(table.table_.QueryToRowMap({c}, {}));
- }
- state.counters["s/row"] =
- benchmark::Counter(static_cast<double>(table.table_.row_count()),
- benchmark::Counter::kIsIterationInvariantRate |
- benchmark::Counter::kInvert);
-}
-
-void BenchmarkFtraceEventTable(benchmark::State& state,
- FtraceEventTableForBenchmark& table,
+void BenchmarkSliceTableFilter(benchmark::State& state,
+ SliceTableForBenchmark& table,
std::initializer_list<Constraint> c) {
Table::kUseFilterV2 = state.range(0) == 1;
for (auto _ : state) {
@@ -264,93 +241,150 @@
benchmark::Counter::kInvert);
}
+void BenchmarkSliceTableSort(benchmark::State& state,
+ SliceTableForBenchmark& table,
+ std::initializer_list<Order> ob) {
+ Table::kUseSortV2 = state.range(0) == 1;
+ for (auto _ : state) {
+ benchmark::DoNotOptimize(table.table_.Sort(ob));
+ }
+ state.counters["s/row"] =
+ benchmark::Counter(static_cast<double>(table.table_.row_count()),
+ benchmark::Counter::kIsIterationInvariantRate |
+ benchmark::Counter::kInvert);
+}
+
+void BenchmarkExpectedFrameTableFilter(
+ benchmark::State& state,
+ ExpectedFrameTimelineTableForBenchmark& table,
+ Constraint c) {
+ Table::kUseFilterV2 = state.range(0) == 1;
+ for (auto _ : state) {
+ benchmark::DoNotOptimize(table.table_.QueryToRowMap({c}, {}));
+ }
+ state.counters["s/row"] =
+ benchmark::Counter(static_cast<double>(table.table_.row_count()),
+ benchmark::Counter::kIsIterationInvariantRate |
+ benchmark::Counter::kInvert);
+}
+
+void BenchmarkFtraceEventTableFilter(benchmark::State& state,
+ FtraceEventTableForBenchmark& table,
+ std::initializer_list<Constraint> c) {
+ Table::kUseFilterV2 = state.range(0) == 1;
+ for (auto _ : state) {
+ benchmark::DoNotOptimize(table.table_.QueryToRowMap(c, {}));
+ }
+ state.counters["s/row"] =
+ benchmark::Counter(static_cast<double>(table.table_.row_count()),
+ benchmark::Counter::kIsIterationInvariantRate |
+ benchmark::Counter::kInvert);
+}
+
+void BenchmarkFtraceEventTableSort(benchmark::State& state,
+ FtraceEventTableForBenchmark& table,
+ std::initializer_list<Order> ob) {
+ Table::kUseSortV2 = state.range(0) == 1;
+ for (auto _ : state) {
+ benchmark::DoNotOptimize(table.table_.Sort(ob));
+ }
+ state.counters["s/row"] =
+ benchmark::Counter(static_cast<double>(table.table_.row_count()),
+ benchmark::Counter::kIsIterationInvariantRate |
+ benchmark::Counter::kInvert);
+}
+
void BM_QESliceTableTrackIdEq(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(state, table, {table.table_.track_id().eq(100)});
+ BenchmarkSliceTableFilter(state, table, {table.table_.track_id().eq(100)});
}
BENCHMARK(BM_QESliceTableTrackIdEq)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QESliceTableParentIdIsNotNull(benchmark::State& state) {
+void BM_QESliceTableParentIdIsNotNull(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(state, table, {table.table_.parent_id().is_not_null()});
+ BenchmarkSliceTableFilter(state, table,
+ {table.table_.parent_id().is_not_null()});
}
BENCHMARK(BM_QESliceTableParentIdIsNotNull)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QESliceTableParentIdEq(benchmark::State& state) {
+void BM_QESliceTableParentIdEq(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(state, table, {table.table_.parent_id().eq(88)});
+ BenchmarkSliceTableFilter(state, table, {table.table_.parent_id().eq(88)});
}
BENCHMARK(BM_QESliceTableParentIdEq)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QESliceTableNameEq(benchmark::State& state) {
+void BM_QESliceTableNameEq(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(state, table, {table.table_.name().eq("cheese")});
+ BenchmarkSliceTableFilter(state, table, {table.table_.name().eq("cheese")});
}
BENCHMARK(BM_QESliceTableNameEq)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QESliceTableNameGlobNoStars(benchmark::State& state) {
+void BM_QESliceTableNameGlobNoStars(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(state, table, {table.table_.name().glob("cheese")});
+ BenchmarkSliceTableFilter(state, table, {table.table_.name().glob("cheese")});
}
BENCHMARK(BM_QESliceTableNameGlobNoStars)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QESliceTableNameGlob(benchmark::State& state) {
+void BM_QESliceTableNameGlob(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(state, table, {table.table_.name().glob("chee*se")});
+ BenchmarkSliceTableFilter(state, table,
+ {table.table_.name().glob("chee*se")});
}
BENCHMARK(BM_QESliceTableNameGlob)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QESliceTableNameRegex(benchmark::State& state) {
+void BM_QESliceTableNameRegex(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(state, table, {table.table_.name().regex(".*Pool.*")});
+ BenchmarkSliceTableFilter(state, table,
+ {table.table_.name().regex(".*Pool.*")});
}
BENCHMARK(BM_QESliceTableNameRegex)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QESliceTableSorted(benchmark::State& state) {
+void BM_QESliceTableSorted(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(state, table, {table.table_.ts().gt(1000)});
+ BenchmarkSliceTableFilter(state, table, {table.table_.ts().gt(1000)});
}
BENCHMARK(BM_QESliceTableSorted)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QEFilterWithSparseSelector(benchmark::State& state) {
+void BM_QEFilterWithSparseSelector(benchmark::State& state) {
ExpectedFrameTimelineTableForBenchmark table(state);
- BenchmarkExpectedFrameTable(state, table, table.table_.track_id().eq(88));
+ BenchmarkExpectedFrameTableFilter(state, table,
+ table.table_.track_id().eq(88));
}
BENCHMARK(BM_QEFilterWithSparseSelector)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QEFilterWithDenseSelector(benchmark::State& state) {
+void BM_QEFilterWithDenseSelector(benchmark::State& state) {
FtraceEventTableForBenchmark table(state);
- BenchmarkFtraceEventTable(state, table, {table.table_.cpu().eq(4)});
+ BenchmarkFtraceEventTableFilter(state, table, {table.table_.cpu().eq(4)});
}
BENCHMARK(BM_QEFilterWithDenseSelector)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QESliceEventFilterId(benchmark::State& state) {
+void BM_QESliceEventFilterId(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(state, table, {table.table_.id().eq(500)});
+ BenchmarkSliceTableFilter(state, table, {table.table_.id().eq(500)});
}
BENCHMARK(BM_QESliceEventFilterId)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QEFtraceEventFilterId(benchmark::State& state) {
+void BM_QEFtraceEventFilterId(benchmark::State& state) {
FtraceEventTableForBenchmark table(state);
- BenchmarkFtraceEventTable(state, table, {table.table_.id().eq(500)});
+ BenchmarkFtraceEventTableFilter(state, table, {table.table_.id().eq(500)});
}
BENCHMARK(BM_QEFtraceEventFilterId)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QESliceTableTsAndTrackId(benchmark::State& state) {
+void BM_QESliceTableTsAndTrackId(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(
+ BenchmarkSliceTableFilter(
state, table,
{table.table_.ts().ge(1740530419866), table.table_.ts().le(1740530474097),
table.table_.track_id().eq(100)});
@@ -358,15 +392,15 @@
BENCHMARK(BM_QESliceTableTsAndTrackId)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QEFilterOneElement(benchmark::State& state) {
+void BM_QEFilterOneElement(benchmark::State& state) {
SliceTableForBenchmark table(state);
- BenchmarkSliceTable(state, table,
- {table.table_.id().eq(10), table.table_.dur().eq(100)});
+ BenchmarkSliceTableFilter(
+ state, table, {table.table_.id().eq(10), table.table_.dur().eq(100)});
}
BENCHMARK(BM_QEFilterOneElement)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QEFilterWithArrangement(benchmark::State& state) {
+void BM_QEFilterWithArrangement(benchmark::State& state) {
Table::kUseFilterV2 = state.range(0) == 1;
SliceTableForBenchmark table(state);
@@ -386,7 +420,7 @@
BENCHMARK(BM_QEFilterWithArrangement)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QEDenseNullFilter(benchmark::State& state) {
+void BM_QEDenseNullFilter(benchmark::State& state) {
Table::kUseFilterV2 = state.range(0) == 1;
HeapGraphObjectTableForBenchmark table(state);
@@ -402,7 +436,7 @@
}
BENCHMARK(BM_QEDenseNullFilter)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QEDenseNullFilterIsNull(benchmark::State& state) {
+void BM_QEDenseNullFilterIsNull(benchmark::State& state) {
Table::kUseFilterV2 = state.range(0) == 1;
HeapGraphObjectTableForBenchmark table(state);
@@ -418,25 +452,25 @@
}
BENCHMARK(BM_QEDenseNullFilterIsNull)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QEIdColumnWithIntAsDouble(benchmark::State& state) {
+void BM_QEIdColumnWithIntAsDouble(benchmark::State& state) {
SliceTableForBenchmark table(state);
Constraint c{table.table_.track_id().index_in_table(), FilterOp::kEq,
SqlValue::Double(100)};
- BenchmarkSliceTable(state, table, {c});
+ BenchmarkSliceTableFilter(state, table, {c});
}
BENCHMARK(BM_QEIdColumnWithIntAsDouble)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QEIdColumnWithDouble(benchmark::State& state) {
+void BM_QEIdColumnWithDouble(benchmark::State& state) {
SliceTableForBenchmark table(state);
Constraint c{table.table_.track_id().index_in_table(), FilterOp::kEq,
SqlValue::Double(100.5)};
- BenchmarkSliceTable(state, table, {c});
+ BenchmarkSliceTableFilter(state, table, {c});
}
BENCHMARK(BM_QEIdColumnWithDouble)->ArgsProduct({{DB::V1, DB::V2}});
-static void BM_QEFilterOrderedArrangement(benchmark::State& state) {
+void BM_QEFilterOrderedArrangement(benchmark::State& state) {
Table::kUseFilterV2 = state.range(0) == 1;
SliceTableForBenchmark table(state);
@@ -456,5 +490,36 @@
BENCHMARK(BM_QEFilterOrderedArrangement)->ArgsProduct({{DB::V1, DB::V2}});
+void BM_QESliceSortNumericAsc(benchmark::State& state) {
+ SliceTableForBenchmark table(state);
+ BenchmarkSliceTableSort(state, table, {table.table_.track_id().ascending()});
+}
+
+BENCHMARK(BM_QESliceSortNumericAsc)->ArgsProduct({{DB::V1, DB::V2}});
+
+void BM_QESliceSortNullNumericAsc(benchmark::State& state) {
+ SliceTableForBenchmark table(state);
+ BenchmarkSliceTableSort(state, table, {table.table_.parent_id().ascending()});
+}
+
+BENCHMARK(BM_QESliceSortNullNumericAsc)->ArgsProduct({{DB::V1, DB::V2}});
+
+void BM_QEFtraceEventSortSelectorNumericAsc(benchmark::State& state) {
+ FtraceEventTableForBenchmark table(state);
+ BenchmarkFtraceEventTableSort(state, table, {table.table_.cpu().ascending()});
+}
+
+BENCHMARK(BM_QEFtraceEventSortSelectorNumericAsc)
+ ->ArgsProduct({{DB::V1, DB::V2}});
+
+void BM_QEFtraceEventSortSelectorNumericDesc(benchmark::State& state) {
+ FtraceEventTableForBenchmark table(state);
+ BenchmarkFtraceEventTableSort(state, table,
+ {table.table_.cpu().descending()});
+}
+
+BENCHMARK(BM_QEFtraceEventSortSelectorNumericDesc)
+ ->ArgsProduct({{DB::V1, DB::V2}});
+
} // namespace
} // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/query_executor_unittest.cc b/src/trace_processor/db/query_executor_unittest.cc
index 79adb06..f0d8f03 100644
--- a/src/trace_processor/db/query_executor_unittest.cc
+++ b/src/trace_processor/db/query_executor_unittest.cc
@@ -54,7 +54,8 @@
TEST(QueryExecutor, OnlyStorageRange) {
std::vector<int64_t> storage_data{1, 2, 3, 4, 5};
- column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64);
+ column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64,
+ false);
auto chain = storage.MakeChain();
Constraint c{0, FilterOp::kGe, SqlValue::Long(3)};
@@ -67,7 +68,8 @@
TEST(QueryExecutor, OnlyStorageRangeIsNull) {
std::vector<int64_t> storage_data{1, 2, 3, 4, 5};
- column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64);
+ column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64,
+ false);
auto chain = storage.MakeChain();
Constraint c{0, FilterOp::kIsNull, SqlValue()};
@@ -83,7 +85,8 @@
std::iota(storage_data.begin(), storage_data.end(), 0);
std::transform(storage_data.begin(), storage_data.end(), storage_data.begin(),
[](int64_t n) { return n % 5; });
- column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64);
+ column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64,
+ false);
auto chain = storage.MakeChain();
Constraint c{0, FilterOp::kLt, SqlValue::Long(2)};
@@ -99,7 +102,8 @@
TEST(QueryExecutor, OnlyStorageIndexIsNull) {
std::vector<int64_t> storage_data{1, 2, 3, 4, 5};
- column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64);
+ column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64,
+ false);
auto chain = storage.MakeChain();
Constraint c{0, FilterOp::kIsNull, SqlValue()};
@@ -113,7 +117,7 @@
std::vector<int64_t> storage_data(5);
std::iota(storage_data.begin(), storage_data.end(), 0);
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
BitVector bv{1, 1, 0, 1, 1, 0, 0, 0, 1, 0};
column::NullOverlay storage(&bv);
auto chain = storage.MakeChain(numeric->MakeChain());
@@ -131,7 +135,7 @@
std::vector<int64_t> storage_data(5);
std::iota(storage_data.begin(), storage_data.end(), 0);
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
BitVector bv{1, 1, 0, 1, 1, 0, 0, 0, 1, 0};
column::NullOverlay storage(&bv);
@@ -155,7 +159,7 @@
std::transform(storage_data.begin(), storage_data.end(), storage_data.begin(),
[](int64_t n) { return n % 3; });
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
BitVector bv{1, 1, 0, 1, 1, 0, 1, 0, 0, 1};
column::NullOverlay storage(&bv);
@@ -176,7 +180,7 @@
std::vector<int64_t> storage_data(5);
std::iota(storage_data.begin(), storage_data.end(), 0);
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
BitVector bv{1, 1, 0, 1, 1, 0, 0, 0, 1, 0};
column::NullOverlay storage(&bv);
@@ -198,7 +202,7 @@
std::vector<int64_t> storage_data(5);
std::iota(storage_data.begin(), storage_data.end(), 0);
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
BitVector bv{1, 1, 0, 0, 1};
SelectorOverlay storage(&bv);
@@ -217,7 +221,7 @@
std::transform(storage_data.begin(), storage_data.end(), storage_data.begin(),
[](int64_t n) { return n % 5; });
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
BitVector bv{1, 1, 0, 1, 1, 0, 1, 0, 0, 1};
SelectorOverlay storage(&bv);
@@ -234,11 +238,10 @@
std::vector<int64_t> storage_data(5);
std::iota(storage_data.begin(), storage_data.end(), 0);
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
std::vector<uint32_t> arrangement{4, 1, 2, 2, 3};
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
- false);
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
auto chain = storage.MakeChain(numeric->MakeChain());
Constraint c{0, FilterOp::kGe, SqlValue::Long(3)};
@@ -249,12 +252,11 @@
}
TEST(QueryExecutor, ArrangementOverlaySubsetInputRange) {
- auto fake = column::FakeStorage::SearchSubset(5u, RowMap::Range(2u, 4u));
+ auto fake = column::FakeStorageChain::SearchSubset(5u, RowMap::Range(2u, 4u));
std::vector<uint32_t> arrangement{4, 1, 2, 2, 3};
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
- false);
- auto chain = storage.MakeChain(fake->MakeChain());
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+ auto chain = storage.MakeChain(std::move(fake));
Constraint c{0, FilterOp::kGe, SqlValue::Long(0u)};
RowMap rm(1, 3);
@@ -264,12 +266,12 @@
}
TEST(QueryExecutor, ArrangementOverlaySubsetInputBitvector) {
- auto fake = column::FakeStorage::SearchSubset(5u, BitVector({0, 0, 1, 1, 0}));
+ auto fake =
+ column::FakeStorageChain::SearchSubset(5u, BitVector({0, 0, 1, 1, 0}));
std::vector<uint32_t> arrangement{4, 1, 2, 2, 3};
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
- false);
- auto chain = storage.MakeChain(fake->MakeChain());
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
+ auto chain = storage.MakeChain(std::move(fake));
Constraint c{0, FilterOp::kGe, SqlValue::Long(0u)};
RowMap rm(1, 3);
@@ -282,11 +284,10 @@
std::vector<int64_t> storage_data(5);
std::iota(storage_data.begin(), storage_data.end(), 0);
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
std::vector<uint32_t> arrangement{4, 1, 2, 2, 3};
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
- false);
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
auto chain = storage.MakeChain(numeric->MakeChain());
Constraint c{0, FilterOp::kGe, SqlValue::Long(3)};
@@ -298,7 +299,8 @@
TEST(QueryExecutor, MismatchedTypeNullWithOtherOperations) {
std::vector<int64_t> storage_data{0, 1, 2, 3, 0, 1, 2, 3};
- column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64);
+ column::NumericStorage<int64_t> storage(&storage_data, ColumnType::kInt64,
+ false);
auto chain = storage.MakeChain();
// Filter.
@@ -312,7 +314,7 @@
TEST(QueryExecutor, SingleConstraintWithNullAndSelector) {
std::vector<int64_t> storage_data{0, 1, 2, 3, 0, 1, 2, 3};
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
// Current vector
// 0, 1, NULL, 2, 3, 0, NULL, NULL, 1, 2, 3, NULL
@@ -338,7 +340,7 @@
TEST(QueryExecutor, SingleConstraintWithNullAndArrangement) {
std::vector<int64_t> storage_data{0, 1, 2, 3, 0, 1, 2, 3};
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
// Current vector
// 0, 1, NULL, 2, 3, 0, NULL, NULL, 1, 2, 3, NULL
@@ -348,8 +350,7 @@
// Final vector
// NULL, 3, NULL, NULL, 3, NULL
std::vector<uint32_t> arrangement{2, 4, 6, 2, 4, 6};
- ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic,
- false);
+ ArrangementOverlay storage(&arrangement, Indices::State::kNonmonotonic);
auto chain = storage.MakeChain(null->MakeChain(numeric->MakeChain()));
// Filter.
@@ -365,7 +366,7 @@
TEST(QueryExecutor, IsNullWithSelector) {
std::vector<int64_t> storage_data{0, 1, 2, 3, 0, 1, 2, 3};
auto numeric = std::make_unique<column::NumericStorage<int64_t>>(
- &storage_data, ColumnType::kInt64);
+ &storage_data, ColumnType::kInt64, false);
// Current vector
// 0, 1, NULL, 2, 3, 0, NULL, NULL, 1, 2, 3, NULL
diff --git a/src/trace_processor/db/runtime_table.cc b/src/trace_processor/db/runtime_table.cc
index 123cc16..38938b8 100644
--- a/src/trace_processor/db/runtime_table.cc
+++ b/src/trace_processor/db/runtime_table.cc
@@ -29,8 +29,15 @@
#include "perfetto/base/logging.h"
#include "perfetto/base/status.h"
#include "perfetto/ext/base/status_or.h"
+#include "perfetto/trace_processor/ref_counted.h"
#include "src/trace_processor/containers/string_pool.h"
#include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/id_storage.h"
+#include "src/trace_processor/db/column/null_overlay.h"
+#include "src/trace_processor/db/column/numeric_storage.h"
+#include "src/trace_processor/db/column/string_storage.h"
+#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column_storage_overlay.h"
namespace perfetto::trace_processor {
@@ -57,12 +64,17 @@
} // namespace
-RuntimeTable::RuntimeTable(StringPool* pool,
- uint32_t row_count,
- std::vector<ColumnLegacy> columns,
- std::vector<ColumnStorageOverlay> overlays)
+RuntimeTable::RuntimeTable(
+ StringPool* pool,
+ uint32_t row_count,
+ std::vector<ColumnLegacy> columns,
+ std::vector<ColumnStorageOverlay> overlays,
+ std::vector<RefPtr<column::DataLayer>> storage_layers,
+ std::vector<RefPtr<column::DataLayer>> null_layers,
+ std::vector<RefPtr<column::DataLayer>> overlay_layers)
: Table(pool, row_count, std::move(columns), std::move(overlays)) {
- OnConstructionCompleted();
+ OnConstructionCompleted(std::move(storage_layers), std::move(null_layers),
+ std::move(overlay_layers));
}
RuntimeTable::~RuntimeTable() = default;
@@ -165,9 +177,12 @@
base::StatusOr<std::unique_ptr<RuntimeTable>> RuntimeTable::Builder::Build(
uint32_t rows) && {
+ std::vector<RefPtr<column::DataLayer>> storage_layers(col_names_.size() + 1);
+ std::vector<RefPtr<column::DataLayer>> null_layers(col_names_.size() + 1);
std::vector<ColumnLegacy> columns;
for (uint32_t i = 0; i < col_names_.size(); ++i) {
auto* col = storage_[i].get();
+ std::unique_ptr<column::DataLayerChain> chain;
PERFETTO_DCHECK(IsStorageNotIntNorDouble(*col));
if (auto* leading_nulls = std::get_if<uint32_t>(col)) {
PERFETTO_CHECK(*leading_nulls == rows);
@@ -185,14 +200,22 @@
ColumnLegacy::Flag::kSorted
: ColumnLegacy::Flag::kNonNull;
columns.emplace_back(col_names_[i].c_str(), non_null_ints, flags, i, 0);
+ storage_layers[i].reset(new column::NumericStorage<int64_t>(
+ &non_null_ints->vector(), ColumnType::kInt64, is_sorted));
} else {
columns.emplace_back(col_names_[i].c_str(), ints,
ColumnLegacy::Flag::kNoFlag, i, 0);
+ storage_layers[i].reset(new column::NumericStorage<int64_t>(
+ &ints->non_null_vector(), ColumnType::kInt64, false));
+ null_layers[i].reset(
+ new column::NullOverlay(&ints->non_null_bit_vector()));
}
} else if (auto* strings = std::get_if<StringStorage>(col)) {
PERFETTO_CHECK(strings->size() == rows);
columns.emplace_back(col_names_[i].c_str(), strings,
ColumnLegacy::Flag::kNonNull, i, 0);
+ storage_layers[i].reset(
+ new column::StringStorage(string_pool_, &strings->vector()));
} else if (auto* doubles = std::get_if<NullDoubleStorage>(col)) {
PERFETTO_CHECK(doubles->size() == rows);
// Check if the column is nullable.
@@ -207,9 +230,15 @@
: ColumnLegacy::Flag::kNonNull;
columns.emplace_back(col_names_[i].c_str(), non_null_doubles, flags, i,
0);
+ storage_layers[i].reset(new column::NumericStorage<double>(
+ &non_null_doubles->vector(), ColumnType::kDouble, is_sorted));
} else {
columns.emplace_back(col_names_[i].c_str(), doubles,
ColumnLegacy::Flag::kNoFlag, i, 0);
+ storage_layers[i].reset(new column::NumericStorage<double>(
+ &doubles->non_null_vector(), ColumnType::kDouble, false));
+ null_layers[i].reset(
+ new column::NullOverlay(&doubles->non_null_bit_vector()));
}
} else {
PERFETTO_FATAL("Unexpected column type");
@@ -218,12 +247,17 @@
columns.push_back(ColumnLegacy::IdColumn(
static_cast<uint32_t>(columns.size()), 0, "_auto_id",
ColumnLegacy::kIdFlags | ColumnLegacy::Flag::kHidden));
+ storage_layers.back().reset(new column::IdStorage());
std::vector<ColumnStorageOverlay> overlays;
overlays.emplace_back(rows);
+ std::vector<RefPtr<column::DataLayer>> overlay_layers(1);
+
auto table = std::make_unique<RuntimeTable>(
- string_pool_, rows, std::move(columns), std::move(overlays));
+ string_pool_, rows, std::move(columns), std::move(overlays),
+ std::move(storage_layers), std::move(null_layers),
+ std::move(overlay_layers));
table->storage_ = std::move(storage_);
table->col_names_ = std::move(col_names_);
diff --git a/src/trace_processor/db/runtime_table.h b/src/trace_processor/db/runtime_table.h
index c6fe87e..9fea3d9 100644
--- a/src/trace_processor/db/runtime_table.h
+++ b/src/trace_processor/db/runtime_table.h
@@ -26,8 +26,10 @@
#include "perfetto/base/status.h"
#include "perfetto/ext/base/status_or.h"
+#include "perfetto/trace_processor/ref_counted.h"
#include "src/trace_processor/containers/string_pool.h"
#include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/column/data_layer.h"
#include "src/trace_processor/db/column_storage.h"
#include "src/trace_processor/db/column_storage_overlay.h"
#include "src/trace_processor/db/table.h"
@@ -69,7 +71,10 @@
explicit RuntimeTable(StringPool*,
uint32_t row_count,
std::vector<ColumnLegacy>,
- std::vector<ColumnStorageOverlay>);
+ std::vector<ColumnStorageOverlay>,
+ std::vector<RefPtr<column::DataLayer>> storage_layers,
+ std::vector<RefPtr<column::DataLayer>> null_layers,
+ std::vector<RefPtr<column::DataLayer>> overlay_layers);
~RuntimeTable() override;
RuntimeTable(RuntimeTable&&) = default;
diff --git a/src/trace_processor/db/table.cc b/src/trace_processor/db/table.cc
index 9171bcc..964e567 100644
--- a/src/trace_processor/db/table.cc
+++ b/src/trace_processor/db/table.cc
@@ -18,19 +18,28 @@
#include <algorithm>
#include <cstdint>
+#include <memory>
#include <utility>
#include <vector>
#include "perfetto/base/logging.h"
+#include "perfetto/public/compiler.h"
+#include "perfetto/trace_processor/ref_counted.h"
#include "src/trace_processor/containers/row_map.h"
#include "src/trace_processor/containers/string_pool.h"
#include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/column/arrangement_overlay.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/range_overlay.h"
+#include "src/trace_processor/db/column/selector_overlay.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column_storage_overlay.h"
+#include "src/trace_processor/db/query_executor.h"
namespace perfetto::trace_processor {
bool Table::kUseFilterV2 = true;
+bool Table::kUseSortV2 = false;
Table::Table(StringPool* pool,
uint32_t row_count,
@@ -51,6 +60,12 @@
overlays_ = std::move(other.overlays_);
columns_ = std::move(other.columns_);
+
+ storage_layers_ = std::move(other.storage_layers_);
+ null_layers_ = std::move(other.null_layers_);
+ overlay_layers_ = std::move(other.overlay_layers_);
+ chains_ = std::move(other.chains_);
+
for (ColumnLegacy& col : columns_) {
col.table_ = this;
}
@@ -62,7 +77,7 @@
for (const ColumnStorageOverlay& overlay : overlays_) {
table.overlays_.emplace_back(overlay.Copy());
}
- table.OnConstructionCompleted();
+ table.OnConstructionCompleted(storage_layers_, null_layers_, overlay_layers_);
return table;
}
@@ -78,6 +93,18 @@
RowMap Table::QueryToRowMap(const std::vector<Constraint>& cs,
const std::vector<Order>& ob,
RowMap::OptimizeFor optimize_for) const {
+ // We need to delay creation of the chains to this point because of Chrome
+ // does not want the binary size overhead of including the chain
+ // implementations. As they also don't query tables (instead just iterating)
+ // over them), using a combination of dead code elimination and linker
+ // stripping all chain related code be removed.
+ //
+ // From rough benchmarking, this has a negligible impact on peformance as this
+ // branch is almost never taken.
+ if (PERFETTO_UNLIKELY(chains_.size() != columns_.size())) {
+ CreateChains();
+ }
+
RowMap rm = FilterToRowMap(cs, optimize_for);
if (ob.empty())
return rm;
@@ -128,8 +155,12 @@
// worthwhile. This also needs changes to the constraint modification logic
// in DbSqliteTable which currently eliminates constraints on sorted
// columns.
- for (auto it = ob.rbegin(); it != ob.rend(); ++it) {
- columns_[it->col_idx].StableSort(it->desc, &idx);
+ if (Table::kUseSortV2) {
+ QueryExecutor::SortLegacy(this, ob, idx);
+ } else {
+ for (auto it = ob.rbegin(); it != ob.rend(); ++it) {
+ columns_[it->col_idx].StableSort(it->desc, &idx);
+ }
}
}
return RowMap(std::move(idx));
@@ -148,7 +179,6 @@
table.overlays_.emplace_back(overlay.SelectRows(rm));
PERFETTO_DCHECK(table.overlays_.back().size() == table.row_count());
}
- table.OnConstructionCompleted();
// Remove the sorted and row set flags from all the columns.
for (auto& col : table.columns_) {
@@ -161,7 +191,55 @@
if (!ob.front().desc) {
table.columns_[ob.front().col_idx].flags_ |= ColumnLegacy::Flag::kSorted;
}
+
+ std::vector<RefPtr<column::DataLayer>> overlay_layers(table.overlays_.size());
+ for (uint32_t i = 0; i < table.overlays_.size(); ++i) {
+ if (table.overlays_[i].row_map().IsIndexVector()) {
+ overlay_layers[i].reset(new column::ArrangementOverlay(
+ table.overlays_[i].row_map().GetIfIndexVector(),
+ Indices::State::kNonmonotonic));
+ } else if (table.overlays_[i].row_map().IsBitVector()) {
+ overlay_layers[i].reset(new column::SelectorOverlay(
+ table.overlays_[i].row_map().GetIfBitVector()));
+ } else if (table.overlays_[i].row_map().IsRange()) {
+ overlay_layers[i].reset(
+ new column::RangeOverlay(table.overlays_[i].row_map().GetIfIRange()));
+ }
+ }
+ table.OnConstructionCompleted(storage_layers_, null_layers_,
+ std::move(overlay_layers));
return table;
}
+void Table::OnConstructionCompleted(
+ std::vector<RefPtr<column::DataLayer>> storage_layers,
+ std::vector<RefPtr<column::DataLayer>> null_layers,
+ std::vector<RefPtr<column::DataLayer>> overlay_layers) {
+ for (ColumnLegacy& col : columns_) {
+ col.BindToTable(this, string_pool_);
+ }
+ PERFETTO_CHECK(storage_layers.size() == columns_.size());
+ PERFETTO_CHECK(null_layers.size() == columns_.size());
+ PERFETTO_CHECK(overlay_layers.size() == overlays_.size());
+ storage_layers_ = std::move(storage_layers);
+ null_layers_ = std::move(null_layers);
+ overlay_layers_ = std::move(overlay_layers);
+}
+
+void Table::CreateChains() const {
+ chains_.resize(columns_.size());
+ for (uint32_t i = 0; i < columns_.size(); ++i) {
+ chains_[i] = storage_layers_[i]->MakeChain();
+ if (const auto& null_overlay = null_layers_[i]; null_overlay.get()) {
+ chains_[i] = null_overlay->MakeChain(std::move(chains_[i]));
+ }
+ const auto& oly_idx = columns_[i].overlay_index();
+ if (const auto& overlay = overlay_layers_[oly_idx]; overlay.get()) {
+ chains_[i] = overlay->MakeChain(
+ std::move(chains_[i]),
+ column::DataLayer::ChainCreationArgs{columns_[i].IsSorted()});
+ }
+ }
+}
+
} // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/table.h b/src/trace_processor/db/table.h
index dc59644..5e8a583 100644
--- a/src/trace_processor/db/table.h
+++ b/src/trace_processor/db/table.h
@@ -18,15 +18,19 @@
#define SRC_TRACE_PROCESSOR_DB_TABLE_H_
#include <cstdint>
+#include <memory>
#include <string>
#include <utility>
#include <vector>
+#include "perfetto/base/compiler.h"
#include "perfetto/base/logging.h"
#include "perfetto/trace_processor/basic_types.h"
+#include "perfetto/trace_processor/ref_counted.h"
#include "src/trace_processor/containers/row_map.h"
#include "src/trace_processor/containers/string_pool.h"
#include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/column/data_layer.h"
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/column_storage_overlay.h"
#include "src/trace_processor/db/query_executor.h"
@@ -115,6 +119,7 @@
};
static bool kUseFilterV2;
+ static bool kUseSortV2;
virtual ~Table();
@@ -123,6 +128,11 @@
Table(Table&& other) noexcept { *this = std::move(other); }
Table& operator=(Table&& other) noexcept;
+ // Return a chain corresponding to a given column.
+ const column::DataLayerChain& ChainForColumn(uint32_t col_idx) const {
+ return *chains_[col_idx];
+ }
+
// Filters and sorts the tables with the arguments specified, returning the
// result as a RowMap.
RowMap QueryToRowMap(
@@ -148,6 +158,12 @@
uint32_t row_count() const { return row_count_; }
StringPool* string_pool() const { return string_pool_; }
const std::vector<ColumnLegacy>& columns() const { return columns_; }
+ const std::vector<RefPtr<column::DataLayer>>& storage_layers() const {
+ return storage_layers_;
+ }
+ const std::vector<RefPtr<column::DataLayer>>& null_layers() const {
+ return null_layers_;
+ }
protected:
Table(StringPool*,
@@ -172,11 +188,10 @@
overlays_.back().Insert(row_count_++);
}
- void OnConstructionCompleted() {
- for (ColumnLegacy& col : columns_) {
- col.BindToTable(this, string_pool_);
- }
- }
+ void OnConstructionCompleted(
+ std::vector<RefPtr<column::DataLayer>> storage_layers,
+ std::vector<RefPtr<column::DataLayer>> null_layers,
+ std::vector<RefPtr<column::DataLayer>> overlay_layers);
ColumnLegacy* GetColumn(uint32_t index) { return &columns_[index]; }
@@ -187,7 +202,7 @@
private:
friend class ColumnLegacy;
- RowMap FilterToRowMap(
+ PERFETTO_ALWAYS_INLINE RowMap FilterToRowMap(
const std::vector<Constraint>& cs,
RowMap::OptimizeFor optimize_for = RowMap::OptimizeFor::kMemory) const {
if (cs.empty()) {
@@ -207,12 +222,19 @@
return rm;
}
+ void CreateChains() const;
+
Table CopyExceptOverlays() const;
StringPool* string_pool_ = nullptr;
uint32_t row_count_ = 0;
std::vector<ColumnStorageOverlay> overlays_;
std::vector<ColumnLegacy> columns_;
+
+ std::vector<RefPtr<column::DataLayer>> storage_layers_;
+ std::vector<RefPtr<column::DataLayer>> null_layers_;
+ std::vector<RefPtr<column::DataLayer>> overlay_layers_;
+ mutable std::vector<std::unique_ptr<column::DataLayerChain>> chains_;
};
} // namespace perfetto::trace_processor
diff --git a/src/trace_processor/db/typed_column.h b/src/trace_processor/db/typed_column.h
index 3afcc38..1f6c280 100644
--- a/src/trace_processor/db/typed_column.h
+++ b/src/trace_processor/db/typed_column.h
@@ -67,6 +67,8 @@
// (handling ids would add an extra type to consider when filtering for no
// benefit.
using stored_type = typename TH::stored_type;
+ using non_optional_stored_type =
+ typename tc_internal::TypeHandler<non_optional_type>::stored_type;
private:
using Serializer = tc_internal::Serializer<non_optional_type>;
@@ -123,7 +125,7 @@
}
// Converts the static type T into the dynamic SqlValue type of this column.
- static SqlValue::Type SqlValueType() {
+ static constexpr SqlValue::Type SqlValueType() {
return ColumnLegacy::ToSqlValueType<stored_type>();
}
diff --git a/src/trace_processor/importers/common/BUILD.gn b/src/trace_processor/importers/common/BUILD.gn
index 2804a0b..dac6e41 100644
--- a/src/trace_processor/importers/common/BUILD.gn
+++ b/src/trace_processor/importers/common/BUILD.gn
@@ -44,8 +44,6 @@
"slice_tracker.h",
"slice_translation_table.cc",
"slice_translation_table.h",
- "stack_profile_tracker.cc",
- "stack_profile_tracker.h",
"system_info_tracker.cc",
"system_info_tracker.h",
"trace_parser.cc",
@@ -66,11 +64,9 @@
"../../../../protos/perfetto/trace:zero",
"../../../../protos/perfetto/trace/profiling:zero",
"../../../base",
- "../../db",
+ "../../db:minimal",
"../../storage",
- "../../tables:tables",
"../../types",
- "../../util:stack_traces_util",
"../fuchsia:fuchsia_record",
"../systrace:systrace_line",
]
diff --git a/src/trace_processor/importers/common/stack_profile_tracker.cc b/src/trace_processor/importers/common/stack_profile_tracker.cc
deleted file mode 100644
index ad57523..0000000
--- a/src/trace_processor/importers/common/stack_profile_tracker.cc
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2019 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/importers/common/stack_profile_tracker.h"
-
-#include "perfetto/ext/base/string_utils.h"
-#include "perfetto/ext/base/string_view.h"
-#include "src/trace_processor/storage/trace_storage.h"
-#include "src/trace_processor/tables/profiler_tables_py.h"
-#include "src/trace_processor/types/trace_processor_context.h"
-#include "src/trace_processor/util/profiler_util.h"
-#include "src/trace_processor/util/stack_traces_util.h"
-
-namespace perfetto {
-namespace trace_processor {
-
-namespace {
-std::string CleanBuildId(base::StringView build_id) {
- if (build_id.empty()) {
- return build_id.ToStdString();
- }
- // If the build_id is 33 characters long, we assume it's a Breakpad debug
- // identifier which is already in Hex and doesn't need conversion.
- // TODO(b/148109467): Remove workaround once all active Chrome versions
- // write raw bytes instead of a string as build_id.
- if (util::IsHexModuleId(build_id)) {
- return build_id.ToStdString();
- }
-
- return base::ToHex(build_id.data(), build_id.size());
-}
-
-} // namespace
-
-std::vector<FrameId> StackProfileTracker::JavaFramesForName(
- NameInPackage name) const {
- if (const auto* frames = java_frames_for_name_.Find(name); frames) {
- return *frames;
- }
- return {};
-}
-
-std::vector<MappingId> StackProfileTracker::FindMappingRow(
- StringId name,
- StringId build_id) const {
- if (const auto* mappings =
- mappings_by_name_and_build_id_.Find(std::make_pair(name, build_id));
- mappings) {
- return *mappings;
- }
- return {};
-}
-
-std::vector<FrameId> StackProfileTracker::FindFrameIds(MappingId mapping_id,
- uint64_t rel_pc) const {
- if (const auto* frames =
- frame_by_mapping_and_rel_pc_.Find(std::make_pair(mapping_id, rel_pc));
- frames) {
- return *frames;
- }
- return {};
-}
-
-MappingId StackProfileTracker::InternMapping(
- const CreateMappingParams& params) {
- tables::StackProfileMappingTable::Row row;
- row.build_id = InternBuildId(params.build_id);
- row.exact_offset = static_cast<int64_t>(params.exact_offset);
- row.start_offset = static_cast<int64_t>(params.start_offset);
- row.start = static_cast<int64_t>(params.start);
- row.end = static_cast<int64_t>(params.end);
- row.load_bias = static_cast<int64_t>(params.load_bias);
- row.name = context_->storage->InternString(params.name);
-
- if (MappingId* id = mapping_unique_row_index_.Find(row); id) {
- return *id;
- }
-
- MappingId mapping_id =
- context_->storage->mutable_stack_profile_mapping_table()->Insert(row).id;
- mapping_unique_row_index_.Insert(row, mapping_id);
- mappings_by_name_and_build_id_[{row.name, row.build_id}].push_back(
- mapping_id);
- return mapping_id;
-}
-
-CallsiteId StackProfileTracker::InternCallsite(
- std::optional<CallsiteId> parent_callsite_id,
- FrameId frame_id,
- uint32_t depth) {
- tables::StackProfileCallsiteTable::Row row{depth, parent_callsite_id,
- frame_id};
- if (CallsiteId* id = callsite_unique_row_index_.Find(row); id) {
- return *id;
- }
-
- CallsiteId callsite_id =
- context_->storage->mutable_stack_profile_callsite_table()->Insert(row).id;
- callsite_unique_row_index_.Insert(row, callsite_id);
- return callsite_id;
-}
-
-FrameId StackProfileTracker::InternFrame(MappingId mapping_id,
- uint64_t rel_pc,
- base::StringView function_name) {
- tables::StackProfileFrameTable::Row row;
- row.mapping = mapping_id;
- row.rel_pc = static_cast<int64_t>(rel_pc);
- row.name = context_->storage->InternString(function_name);
-
- if (FrameId* id = frame_unique_row_index_.Find(row); id) {
- return *id;
- }
-
- FrameId frame_id =
- context_->storage->mutable_stack_profile_frame_table()->Insert(row).id;
- frame_unique_row_index_.Insert(row, frame_id);
- frame_by_mapping_and_rel_pc_[{mapping_id, rel_pc}].push_back(frame_id);
-
- if (function_name.find('.') != base::StringView::npos) {
- // Java frames always contain a '.'
- base::StringView mapping_name = context_->storage->GetString(
- context_->storage->stack_profile_mapping_table()
- .FindById(mapping_id)
- ->name());
- std::optional<std::string> package =
- PackageFromLocation(context_->storage.get(), mapping_name);
- if (package) {
- NameInPackage nip{row.name, context_->storage->InternString(
- base::StringView(*package))};
- java_frames_for_name_[nip].push_back(frame_id);
- } else if (mapping_name.find("/memfd:") == 0) {
- NameInPackage nip{row.name, context_->storage->InternString("memfd")};
- java_frames_for_name_[nip].push_back(frame_id);
- }
- }
-
- return frame_id;
-}
-
-StringId StackProfileTracker::InternBuildId(base::StringView build_id) {
- return context_->storage->InternString(
- base::StringView(CleanBuildId(build_id)));
-}
-
-} // namespace trace_processor
-} // namespace perfetto
diff --git a/src/trace_processor/importers/common/stack_profile_tracker.h b/src/trace_processor/importers/common/stack_profile_tracker.h
deleted file mode 100644
index a1067b8..0000000
--- a/src/trace_processor/importers/common/stack_profile_tracker.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2019 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_IMPORTERS_COMMON_STACK_PROFILE_TRACKER_H_
-#define SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_STACK_PROFILE_TRACKER_H_
-
-#include <cstdint>
-#include <optional>
-#include <tuple>
-#include <utility>
-#include <vector>
-
-#include "perfetto/ext/base/flat_hash_map.h"
-#include "perfetto/ext/base/hash.h"
-#include "perfetto/ext/base/string_view.h"
-#include "src/trace_processor/storage/trace_storage.h"
-#include "src/trace_processor/tables/profiler_tables_py.h"
-
-namespace perfetto {
-namespace trace_processor {
-
-struct NameInPackage {
- StringId name;
- StringId package;
-
- bool operator==(const NameInPackage& b) const {
- return std::tie(name, package) == std::tie(b.name, b.package);
- }
-
- struct Hasher {
- size_t operator()(const NameInPackage& o) const {
- return static_cast<size_t>(
- base::Hasher::Combine(o.name.raw_id(), o.package.raw_id()));
- }
- };
-};
-
-class TraceProcessorContext;
-
-class StackProfileTracker {
- public:
- struct CreateMappingParams {
- base::StringView build_id;
- uint64_t exact_offset;
- uint64_t start_offset;
- uint64_t start;
- uint64_t end;
- uint64_t load_bias;
- base::StringView name;
- };
-
- explicit StackProfileTracker(TraceProcessorContext* context)
- : context_(context) {}
-
- std::vector<FrameId> JavaFramesForName(NameInPackage name) const;
- std::vector<MappingId> FindMappingRow(StringId name, StringId build_id) const;
- std::vector<FrameId> FindFrameIds(MappingId mapping_id,
- uint64_t rel_pc) const;
-
- MappingId InternMapping(const CreateMappingParams& params);
- CallsiteId InternCallsite(std::optional<CallsiteId> parent_callsite_id,
- FrameId frame_id,
- uint32_t depth);
- FrameId InternFrame(MappingId mapping_id,
- uint64_t rel_pc,
- base::StringView function_name);
-
- private:
- StringId InternBuildId(base::StringView build_id);
-
- TraceProcessorContext* const context_;
- base::FlatHashMap<tables::StackProfileMappingTable::Row, MappingId>
- mapping_unique_row_index_;
- base::FlatHashMap<tables::StackProfileCallsiteTable::Row, CallsiteId>
- callsite_unique_row_index_;
- base::FlatHashMap<tables::StackProfileFrameTable::Row, FrameId>
- frame_unique_row_index_;
-
- struct MappingHasher {
- size_t operator()(const std::pair<StringId, StringId>& o) const {
- return static_cast<size_t>(
- base::Hasher::Combine(o.first.raw_id(), o.second.raw_id()));
- }
- };
- base::FlatHashMap<std::pair<StringId, StringId>,
- std::vector<MappingId>,
- MappingHasher>
- mappings_by_name_and_build_id_;
-
- struct FrameHasher {
- size_t operator()(const std::pair<MappingId, uint64_t>& o) const {
- return static_cast<size_t>(
- base::Hasher::Combine(o.first.value, o.second));
- }
- };
- base::FlatHashMap<std::pair<MappingId, uint64_t>,
- std::vector<FrameId>,
- FrameHasher>
- frame_by_mapping_and_rel_pc_;
-
- base::FlatHashMap<NameInPackage, std::vector<FrameId>, NameInPackage::Hasher>
- java_frames_for_name_;
-};
-
-} // namespace trace_processor
-} // namespace perfetto
-
-#endif // SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_STACK_PROFILE_TRACKER_H_
diff --git a/src/trace_processor/importers/ftrace/BUILD.gn b/src/trace_processor/importers/ftrace/BUILD.gn
index c618978..8065a41 100644
--- a/src/trace_processor/importers/ftrace/BUILD.gn
+++ b/src/trace_processor/importers/ftrace/BUILD.gn
@@ -68,7 +68,6 @@
"../../../../protos/perfetto/trace:zero",
"../../../../protos/perfetto/trace/ftrace:zero",
"../../../../protos/perfetto/trace/interned_data:zero",
- "../../../../protos/perfetto/trace/profiling:zero",
"../../../protozero",
"../../sorter",
"../../storage",
@@ -77,7 +76,6 @@
"../common:parser_types",
"../i2c:full",
"../proto:minimal",
- "../proto:packet_sequence_state_generation_hdr",
"../syscalls:full",
"../systrace:systrace_parser",
]
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.cc b/src/trace_processor/importers/ftrace/ftrace_parser.cc
index 951c03d..cfed1d1 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.cc
@@ -32,7 +32,7 @@
#include "src/trace_processor/importers/ftrace/v4l2_tracker.h"
#include "src/trace_processor/importers/ftrace/virtio_video_tracker.h"
#include "src/trace_processor/importers/i2c/i2c_tracker.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
+#include "src/trace_processor/importers/proto/packet_sequence_state.h"
#include "src/trace_processor/importers/syscalls/syscall_tracker.h"
#include "src/trace_processor/importers/systrace/systrace_parser.h"
#include "src/trace_processor/storage/stats.h"
@@ -85,7 +85,6 @@
#include "protos/perfetto/trace/ftrace/vmscan.pbzero.h"
#include "protos/perfetto/trace/ftrace/workqueue.pbzero.h"
#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
-#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
namespace perfetto {
namespace trace_processor {
diff --git a/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc b/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc
index 8e72751..429cfce 100644
--- a/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_tokenizer.cc
@@ -120,6 +120,13 @@
cpu, kMaxCpuCount);
}
+ if (PERFETTO_UNLIKELY(decoder.lost_events())) {
+ // If set, it means that the kernel overwrote an unspecified number of
+ // events since our last read from the per-cpu buffer.
+ context_->storage->SetIndexedStats(stats::ftrace_cpu_has_data_loss,
+ static_cast<int>(cpu), 1);
+ }
+
ClockTracker::ClockId clock_id;
switch (decoder.ftrace_clock()) {
case FtraceClock::FTRACE_CLOCK_UNSPECIFIED:
diff --git a/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc b/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc
index d644742..e61a137 100644
--- a/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc
+++ b/src/trace_processor/importers/fuchsia/fuchsia_parser_unittest.cc
@@ -29,12 +29,12 @@
#include "src/trace_processor/importers/common/metadata_tracker.h"
#include "src/trace_processor/importers/common/process_tracker.h"
#include "src/trace_processor/importers/common/slice_tracker.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
#include "src/trace_processor/importers/common/track_tracker.h"
#include "src/trace_processor/importers/ftrace/sched_event_tracker.h"
#include "src/trace_processor/importers/proto/additional_modules.h"
#include "src/trace_processor/importers/proto/default_modules.h"
#include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/storage/metadata.h"
#include "src/trace_processor/storage/trace_storage.h"
@@ -236,7 +236,8 @@
context_.track_tracker.reset(new TrackTracker(&context_));
context_.global_args_tracker.reset(
new GlobalArgsTracker(context_.storage.get()));
- context_.stack_profile_tracker.reset(new StackProfileTracker(&context_));
+ context_.global_stack_profile_tracker.reset(
+ new GlobalStackProfileTracker());
context_.args_tracker.reset(new ArgsTracker(&context_));
context_.args_translation_table.reset(new ArgsTranslationTable(storage_));
context_.metadata_tracker.reset(
diff --git a/src/trace_processor/importers/proto/BUILD.gn b/src/trace_processor/importers/proto/BUILD.gn
index 891e1de..a901ae1 100644
--- a/src/trace_processor/importers/proto/BUILD.gn
+++ b/src/trace_processor/importers/proto/BUILD.gn
@@ -26,6 +26,8 @@
"chrome_system_probes_parser.h",
"default_modules.cc",
"default_modules.h",
+ "heap_profile_tracker.cc",
+ "heap_profile_tracker.h",
"memory_tracker_snapshot_module.cc",
"memory_tracker_snapshot_module.h",
"memory_tracker_snapshot_parser.cc",
@@ -42,10 +44,10 @@
"perf_sample_tracker.h",
"profile_module.cc",
"profile_module.h",
- "profile_packet_sequence_state.cc",
- "profile_packet_sequence_state.h",
"profile_packet_utils.cc",
"profile_packet_utils.h",
+ "profiler_util.cc",
+ "profiler_util.h",
"proto_incremental_state.h",
"proto_trace_parser.cc",
"proto_trace_parser.h",
@@ -53,8 +55,8 @@
"proto_trace_reader.h",
"proto_trace_tokenizer.cc",
"proto_trace_tokenizer.h",
- "stack_profile_sequence_state.cc",
- "stack_profile_sequence_state.h",
+ "stack_profile_tracker.cc",
+ "stack_profile_tracker.h",
"track_event_module.cc",
"track_event_module.h",
"track_event_parser.cc",
@@ -153,7 +155,6 @@
":gen_cc_statsd_atoms_descriptor",
":gen_cc_trace_descriptor",
":minimal",
- ":packet_sequence_state_generation_hdr",
"../../../../gn:default_deps",
"../../../../include/perfetto/ext/traced:sys_stats_counters",
"../../../../protos/perfetto/common:zero",
@@ -179,7 +180,6 @@
"../../util:descriptors",
"../../util:proto_profiler",
"../../util:proto_to_args_parser",
- "../../util:stack_traces_util",
"../common",
"../common:parser_types",
"../etw:full",
@@ -243,9 +243,9 @@
sources = [
"active_chrome_processes_tracker_unittest.cc",
"heap_graph_tracker_unittest.cc",
+ "heap_profile_tracker_unittest.cc",
"network_trace_module_unittest.cc",
"perf_sample_tracker_unittest.cc",
- "profile_packet_sequence_state_unittest.cc",
"proto_trace_parser_unittest.cc",
"string_encoding_utils_unittests.cc",
]
@@ -273,7 +273,6 @@
"../../storage",
"../../types",
"../../util:descriptors",
- "../../util:stack_traces_util",
"../common",
"../ftrace:full",
]
diff --git a/src/trace_processor/importers/proto/heap_graph_module.cc b/src/trace_processor/importers/proto/heap_graph_module.cc
index 93fd468..cc1d7ad 100644
--- a/src/trace_processor/importers/proto/heap_graph_module.cc
+++ b/src/trace_processor/importers/proto/heap_graph_module.cc
@@ -19,9 +19,9 @@
#include "src/trace_processor/importers/common/parser_types.h"
#include "src/trace_processor/importers/common/process_tracker.h"
#include "src/trace_processor/importers/proto/heap_graph_tracker.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
#include "src/trace_processor/storage/trace_storage.h"
#include "src/trace_processor/types/trace_processor_context.h"
-#include "src/trace_processor/util/profiler_util.h"
#include "protos/perfetto/trace/profiling/deobfuscation.pbzero.h"
#include "protos/perfetto/trace/profiling/heap_graph.pbzero.h"
diff --git a/src/trace_processor/importers/proto/heap_graph_tracker.cc b/src/trace_processor/importers/proto/heap_graph_tracker.cc
index 2e95889..fcbd054 100644
--- a/src/trace_processor/importers/proto/heap_graph_tracker.cc
+++ b/src/trace_processor/importers/proto/heap_graph_tracker.cc
@@ -22,8 +22,8 @@
#include "perfetto/ext/base/string_splitter.h"
#include "perfetto/ext/base/string_utils.h"
#include "protos/perfetto/trace/profiling/heap_graph.pbzero.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
#include "src/trace_processor/tables/profiler_tables_py.h"
-#include "src/trace_processor/util/profiler_util.h"
namespace perfetto {
namespace trace_processor {
diff --git a/src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc b/src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc
index ebc2a5e..70c7398 100644
--- a/src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc
+++ b/src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc
@@ -18,7 +18,7 @@
#include "perfetto/base/logging.h"
#include "src/trace_processor/importers/common/process_tracker.h"
-#include "src/trace_processor/util/profiler_util.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
#include "test/gtest_and_gmock.h"
namespace perfetto {
diff --git a/src/trace_processor/importers/proto/heap_profile_tracker.cc b/src/trace_processor/importers/proto/heap_profile_tracker.cc
new file mode 100644
index 0000000..ea20108
--- /dev/null
+++ b/src/trace_processor/importers/proto/heap_profile_tracker.cc
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2019 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/importers/proto/heap_profile_tracker.h"
+
+#include "perfetto/base/logging.h"
+#include "src/trace_processor/importers/common/process_tracker.h"
+#include "src/trace_processor/types/trace_processor_context.h"
+
+#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
+#include "protos/perfetto/trace/profiling/profile_packet.pbzero.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+HeapProfileTracker::HeapProfileTracker(TraceProcessorContext* context)
+ : context_(context),
+ empty_(context_->storage->InternString({"", 0})),
+ art_heap_(context_->storage->InternString("com.android.art")) {}
+
+HeapProfileTracker::~HeapProfileTracker() = default;
+
+void HeapProfileTracker::SetProfilePacketIndex(uint32_t seq_id,
+ uint64_t index) {
+ SequenceState& sequence_state = sequence_state_[seq_id];
+ bool dropped_packet = false;
+ // heapprofd starts counting at index = 0.
+ if (!sequence_state.prev_index && index != 0) {
+ dropped_packet = true;
+ }
+
+ if (sequence_state.prev_index && *sequence_state.prev_index + 1 != index) {
+ dropped_packet = true;
+ }
+
+ if (dropped_packet) {
+ if (sequence_state.prev_index) {
+ PERFETTO_ELOG("Missing packets between %" PRIu64 " and %" PRIu64,
+ *sequence_state.prev_index, index);
+ } else {
+ PERFETTO_ELOG("Invalid first packet index %" PRIu64 " (!= 0)", index);
+ }
+
+ context_->storage->IncrementStats(stats::heapprofd_missing_packet);
+ }
+ sequence_state.prev_index = index;
+}
+
+void HeapProfileTracker::AddAllocation(
+ uint32_t seq_id,
+ SequenceStackProfileTracker* sequence_stack_profile_tracker,
+ const SourceAllocation& alloc,
+ const SequenceStackProfileTracker::InternLookup* intern_lookup) {
+ SequenceState& sequence_state = sequence_state_[seq_id];
+
+ auto opt_callstack_id = sequence_stack_profile_tracker->FindOrInsertCallstack(
+ alloc.callstack_id, intern_lookup);
+ if (!opt_callstack_id)
+ return;
+
+ CallsiteId callstack_id = *opt_callstack_id;
+
+ UniquePid upid = context_->process_tracker->GetOrCreateProcess(
+ static_cast<uint32_t>(alloc.pid));
+
+ tables::HeapProfileAllocationTable::Row alloc_row{
+ alloc.timestamp,
+ upid,
+ alloc.heap_name,
+ callstack_id,
+ static_cast<int64_t>(alloc.alloc_count),
+ static_cast<int64_t>(alloc.self_allocated)};
+
+ tables::HeapProfileAllocationTable::Row free_row{
+ alloc.timestamp,
+ upid,
+ alloc.heap_name,
+ callstack_id,
+ -static_cast<int64_t>(alloc.free_count),
+ -static_cast<int64_t>(alloc.self_freed)};
+
+ auto prev_alloc_it = sequence_state.prev_alloc.find({upid, callstack_id});
+ if (prev_alloc_it == sequence_state.prev_alloc.end()) {
+ std::tie(prev_alloc_it, std::ignore) = sequence_state.prev_alloc.emplace(
+ std::make_pair(upid, callstack_id),
+ tables::HeapProfileAllocationTable::Row{});
+ }
+
+ tables::HeapProfileAllocationTable::Row& prev_alloc = prev_alloc_it->second;
+
+ auto prev_free_it = sequence_state.prev_free.find({upid, callstack_id});
+ if (prev_free_it == sequence_state.prev_free.end()) {
+ std::tie(prev_free_it, std::ignore) = sequence_state.prev_free.emplace(
+ std::make_pair(upid, callstack_id),
+ tables::HeapProfileAllocationTable::Row{});
+ }
+
+ tables::HeapProfileAllocationTable::Row& prev_free = prev_free_it->second;
+
+ std::set<CallsiteId>& callstacks_for_source_callstack_id =
+ sequence_state.seen_callstacks[SourceAllocationIndex{
+ upid, alloc.callstack_id, alloc.heap_name}];
+ bool new_callstack;
+ std::tie(std::ignore, new_callstack) =
+ callstacks_for_source_callstack_id.emplace(callstack_id);
+
+ if (new_callstack) {
+ sequence_state.alloc_correction[alloc.callstack_id] = prev_alloc;
+ sequence_state.free_correction[alloc.callstack_id] = prev_free;
+ }
+
+ auto alloc_correction_it =
+ sequence_state.alloc_correction.find(alloc.callstack_id);
+ if (alloc_correction_it != sequence_state.alloc_correction.end()) {
+ const auto& alloc_correction = alloc_correction_it->second;
+ alloc_row.count += alloc_correction.count;
+ alloc_row.size += alloc_correction.size;
+ }
+
+ auto free_correction_it =
+ sequence_state.free_correction.find(alloc.callstack_id);
+ if (free_correction_it != sequence_state.free_correction.end()) {
+ const auto& free_correction = free_correction_it->second;
+ free_row.count += free_correction.count;
+ free_row.size += free_correction.size;
+ }
+
+ tables::HeapProfileAllocationTable::Row alloc_delta = alloc_row;
+ tables::HeapProfileAllocationTable::Row free_delta = free_row;
+
+ alloc_delta.count -= prev_alloc.count;
+ alloc_delta.size -= prev_alloc.size;
+
+ free_delta.count -= prev_free.count;
+ free_delta.size -= prev_free.size;
+
+ if (alloc_delta.count < 0 || alloc_delta.size < 0 || free_delta.count > 0 ||
+ free_delta.size > 0) {
+ PERFETTO_DLOG("Non-monotonous allocation.");
+ context_->storage->IncrementIndexedStats(stats::heapprofd_malformed_packet,
+ static_cast<int>(upid));
+ return;
+ }
+
+ // Dump at max profiles do not have .count set.
+ if (alloc_delta.count || alloc_delta.size) {
+ context_->storage->mutable_heap_profile_allocation_table()->Insert(
+ alloc_delta);
+ }
+
+ // ART only reports allocations, and not frees. This throws off our logic
+ // that assumes that if a new object was allocated with the same address,
+ // the old one has to have been freed in the meantime.
+ // See HeapTracker::RecordMalloc in bookkeeping.cc.
+ if (alloc.heap_name != art_heap_ && (free_delta.count || free_delta.size)) {
+ context_->storage->mutable_heap_profile_allocation_table()->Insert(
+ free_delta);
+ }
+
+ prev_alloc = alloc_row;
+ prev_free = free_row;
+}
+
+void HeapProfileTracker::StoreAllocation(uint32_t seq_id,
+ SourceAllocation alloc) {
+ SequenceState& sequence_state = sequence_state_[seq_id];
+ sequence_state.pending_allocs.emplace_back(std::move(alloc));
+}
+
+void HeapProfileTracker::CommitAllocations(
+ uint32_t seq_id,
+ SequenceStackProfileTracker* sequence_stack_profile_tracker,
+ const SequenceStackProfileTracker::InternLookup* intern_lookup) {
+ SequenceState& sequence_state = sequence_state_[seq_id];
+ for (const auto& p : sequence_state.pending_allocs)
+ AddAllocation(seq_id, sequence_stack_profile_tracker, p, intern_lookup);
+ sequence_state.pending_allocs.clear();
+}
+
+void HeapProfileTracker::FinalizeProfile(
+ uint32_t seq_id,
+ SequenceStackProfileTracker* sequence_stack_profile_tracker,
+ const SequenceStackProfileTracker::InternLookup* intern_lookup) {
+ CommitAllocations(seq_id, sequence_stack_profile_tracker, intern_lookup);
+ sequence_stack_profile_tracker->ClearIndices();
+}
+
+void HeapProfileTracker::NotifyEndOfFile() {
+ for (const auto& key_and_sequence_state : sequence_state_) {
+ const SequenceState& sequence_state = key_and_sequence_state.second;
+ if (!sequence_state.pending_allocs.empty()) {
+ context_->storage->IncrementStats(stats::heapprofd_non_finalized_profile);
+ }
+ }
+}
+
+} // namespace trace_processor
+} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/heap_profile_tracker.h b/src/trace_processor/importers/proto/heap_profile_tracker.h
new file mode 100644
index 0000000..5ed5394
--- /dev/null
+++ b/src/trace_processor/importers/proto/heap_profile_tracker.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2019 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_IMPORTERS_PROTO_HEAP_PROFILE_TRACKER_H_
+#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_HEAP_PROFILE_TRACKER_H_
+
+#include <optional>
+#include <set>
+#include <unordered_map>
+
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
+#include "src/trace_processor/storage/trace_storage.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+class TraceProcessorContext;
+
+class HeapProfileTracker {
+ public:
+ struct SourceAllocation {
+ uint64_t pid = 0;
+ // This is int64_t, because we get this from the TraceSorter which also
+ // converts this for us.
+ int64_t timestamp = 0;
+ StringPool::Id heap_name;
+ SequenceStackProfileTracker::SourceCallstackId callstack_id = 0;
+ uint64_t self_allocated = 0;
+ uint64_t self_freed = 0;
+ uint64_t alloc_count = 0;
+ uint64_t free_count = 0;
+ };
+
+ void SetProfilePacketIndex(uint32_t seq_id, uint64_t id);
+
+ explicit HeapProfileTracker(TraceProcessorContext* context);
+
+ void StoreAllocation(uint32_t seq_id, SourceAllocation);
+
+ // Call after the last profile packet of a dump to commit the allocations
+ // that had been stored using StoreAllocation and clear internal indices
+ // for that dump.
+ void FinalizeProfile(
+ uint32_t seq_id,
+ SequenceStackProfileTracker* sequence_stack_profile_tracker,
+ const SequenceStackProfileTracker::InternLookup* lookup);
+
+ // Only commit the allocations that had been stored using StoreAllocations.
+ // This is only needed in tests, use FinalizeProfile instead.
+ void CommitAllocations(
+ uint32_t seq_id,
+ SequenceStackProfileTracker* sequence_stack_profile_tracker,
+ const SequenceStackProfileTracker::InternLookup* lookup);
+
+ void NotifyEndOfFile();
+
+ ~HeapProfileTracker();
+
+ private:
+ void AddAllocation(
+ uint32_t seq_id,
+ SequenceStackProfileTracker* sequence_stack_profile_tracker,
+ const SourceAllocation&,
+ const SequenceStackProfileTracker::InternLookup* intern_lookup = nullptr);
+ struct SourceAllocationIndex {
+ UniquePid upid;
+ SequenceStackProfileTracker::SourceCallstackId src_callstack_id;
+ StringPool::Id heap_name;
+ bool operator<(const SourceAllocationIndex& o) const {
+ return std::tie(upid, src_callstack_id, heap_name) <
+ std::tie(o.upid, o.src_callstack_id, o.heap_name);
+ }
+ };
+ struct SequenceState {
+ std::vector<SourceAllocation> pending_allocs;
+
+ std::unordered_map<std::pair<UniquePid, CallsiteId>,
+ tables::HeapProfileAllocationTable::Row>
+ prev_alloc;
+ std::unordered_map<std::pair<UniquePid, CallsiteId>,
+ tables::HeapProfileAllocationTable::Row>
+ prev_free;
+
+ // For continuous dumps, we only store the delta in the data-base. To do
+ // this, we subtract the previous dump's value. Sometimes, we should not
+ // do that subtraction, because heapprofd garbage collects stacks that
+ // have no unfreed allocations. If the application then allocations again
+ // at that stack, it gets recreated and initialized to zero.
+ //
+ // To correct for this, we add the previous' stacks value to the current
+ // one, and then handle it as normal. If it is the first time we see a
+ // SourceCallstackId for a CallsiteId, we put the previous value into
+ // the correction maps below.
+ std::map<SourceAllocationIndex, std::set<CallsiteId>> seen_callstacks;
+ std::map<SequenceStackProfileTracker::SourceCallstackId,
+ tables::HeapProfileAllocationTable::Row>
+ alloc_correction;
+ std::map<SequenceStackProfileTracker::SourceCallstackId,
+ tables::HeapProfileAllocationTable::Row>
+ free_correction;
+
+ std::optional<uint64_t> prev_index;
+ };
+ std::map<uint32_t, SequenceState> sequence_state_;
+ TraceProcessorContext* const context_;
+ const StringId empty_;
+ const StringId art_heap_;
+};
+
+} // namespace trace_processor
+} // namespace perfetto
+
+#endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_HEAP_PROFILE_TRACKER_H_
diff --git a/src/trace_processor/importers/proto/profile_packet_sequence_state_unittest.cc b/src/trace_processor/importers/proto/heap_profile_tracker_unittest.cc
similarity index 74%
rename from src/trace_processor/importers/proto/profile_packet_sequence_state_unittest.cc
rename to src/trace_processor/importers/proto/heap_profile_tracker_unittest.cc
index ab947fa..558ad91 100644
--- a/src/trace_processor/importers/proto/profile_packet_sequence_state_unittest.cc
+++ b/src/trace_processor/importers/proto/heap_profile_tracker_unittest.cc
@@ -14,12 +14,9 @@
* limitations under the License.
*/
-#include "src/trace_processor/importers/proto/profile_packet_sequence_state.h"
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
-#include <memory>
-
-#include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
#include "src/trace_processor/types/trace_processor_context.h"
#include "test/gtest_and_gmock.h"
@@ -43,6 +40,7 @@
constexpr auto kMappingStart = 234;
constexpr auto kMappingEnd = 345;
constexpr auto kMappingLoadBias = 456;
+constexpr auto kDefaultSequence = 1;
// heapprofd on Android Q has large callstack ideas, explicitly test large
// values.
@@ -58,8 +56,10 @@
public:
HeapProfileTrackerDupTest() {
context.storage.reset(new TraceStorage());
- context.stack_profile_tracker.reset(new StackProfileTracker(&context));
- packet_sequence_state.reset(new PacketSequenceState(&context));
+ context.global_stack_profile_tracker.reset(new GlobalStackProfileTracker());
+ sequence_stack_profile_tracker.reset(
+ new SequenceStackProfileTracker(&context));
+ context.heap_profile_tracker.reset(new HeapProfileTracker(&context));
mapping_name = context.storage->InternString("[mapping]");
fully_qualified_mapping_name = context.storage->InternString("/[mapping]");
@@ -68,17 +68,13 @@
}
protected:
- ProfilePacketSequenceState& profile_packet_sequence_state() {
- return *packet_sequence_state->current_generation()
- ->GetOrCreate<ProfilePacketSequenceState>();
- }
void InsertMapping(const Packet& packet) {
- profile_packet_sequence_state().AddString(packet.mapping_name_id,
+ sequence_stack_profile_tracker->AddString(packet.mapping_name_id,
"[mapping]");
- profile_packet_sequence_state().AddString(packet.build_id, kBuildIDName);
+ sequence_stack_profile_tracker->AddString(packet.build_id, kBuildIDName);
- ProfilePacketSequenceState::SourceMapping first_frame;
+ SequenceStackProfileTracker::SourceMapping first_frame;
first_frame.build_id = packet.build_id;
first_frame.exact_offset = kMappingExactOffset;
first_frame.start_offset = kMappingStartOffset;
@@ -87,27 +83,27 @@
first_frame.load_bias = kMappingLoadBias;
first_frame.name_ids = {packet.mapping_name_id};
- profile_packet_sequence_state().AddMapping(packet.mapping_id, first_frame);
+ sequence_stack_profile_tracker->AddMapping(packet.mapping_id, first_frame);
}
void InsertFrame(const Packet& packet) {
InsertMapping(packet);
- profile_packet_sequence_state().AddString(packet.frame_name_id, "[frame]");
+ sequence_stack_profile_tracker->AddString(packet.frame_name_id, "[frame]");
- ProfilePacketSequenceState::SourceFrame first_frame;
+ SequenceStackProfileTracker::SourceFrame first_frame;
first_frame.name_id = packet.frame_name_id;
first_frame.mapping_id = packet.mapping_id;
first_frame.rel_pc = kFrameRelPc;
- profile_packet_sequence_state().AddFrame(packet.frame_id, first_frame);
+ sequence_stack_profile_tracker->AddFrame(packet.frame_id, first_frame);
}
void InsertCallsite(const Packet& packet) {
InsertFrame(packet);
- ProfilePacketSequenceState::SourceCallstack first_callsite = {
+ SequenceStackProfileTracker::SourceCallstack first_callsite = {
packet.frame_id, packet.frame_id};
- profile_packet_sequence_state().AddCallstack(kCallstackId, first_callsite);
+ sequence_stack_profile_tracker->AddCallstack(kCallstackId, first_callsite);
}
StringId mapping_name;
@@ -115,16 +111,18 @@
StringId build;
StringId frame_name;
TraceProcessorContext context;
- std::unique_ptr<PacketSequenceState> packet_sequence_state;
+ std::unique_ptr<SequenceStackProfileTracker> sequence_stack_profile_tracker;
};
// Insert the same mapping from two different packets, with different strings
// interned, and assert we only store one.
TEST_F(HeapProfileTrackerDupTest, Mapping) {
InsertMapping(kFirstPacket);
- profile_packet_sequence_state().FinalizeProfile();
+ context.heap_profile_tracker->FinalizeProfile(
+ kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
InsertMapping(kSecondPacket);
- profile_packet_sequence_state().FinalizeProfile();
+ context.heap_profile_tracker->FinalizeProfile(
+ kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
EXPECT_THAT(context.storage->stack_profile_mapping_table().build_id()[0],
context.storage->InternString({kBuildIDHexName}));
@@ -146,9 +144,11 @@
// interned, and assert we only store one.
TEST_F(HeapProfileTrackerDupTest, Frame) {
InsertFrame(kFirstPacket);
- profile_packet_sequence_state().FinalizeProfile();
+ context.heap_profile_tracker->FinalizeProfile(
+ kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
InsertFrame(kSecondPacket);
- profile_packet_sequence_state().FinalizeProfile();
+ context.heap_profile_tracker->FinalizeProfile(
+ kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
const auto& frames = context.storage->stack_profile_frame_table();
EXPECT_THAT(frames.name()[0], frame_name);
@@ -160,9 +160,11 @@
// stored once.
TEST_F(HeapProfileTrackerDupTest, Callstack) {
InsertCallsite(kFirstPacket);
- profile_packet_sequence_state().FinalizeProfile();
+ context.heap_profile_tracker->FinalizeProfile(
+ kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
InsertCallsite(kSecondPacket);
- profile_packet_sequence_state().FinalizeProfile();
+ context.heap_profile_tracker->FinalizeProfile(
+ kDefaultSequence, sequence_stack_profile_tracker.get(), nullptr);
const auto& callsite_table = context.storage->stack_profile_callsite_table();
const auto& depth = callsite_table.depth();
@@ -196,20 +198,22 @@
TEST(HeapProfileTrackerTest, SourceMappingPath) {
TraceProcessorContext context;
context.storage.reset(new TraceStorage());
- context.stack_profile_tracker.reset(new StackProfileTracker(&context));
- PacketSequenceState pss(&context);
- ProfilePacketSequenceState& ppss =
- *pss.current_generation()->GetOrCreate<ProfilePacketSequenceState>();
+ context.global_stack_profile_tracker.reset(new GlobalStackProfileTracker());
+ context.heap_profile_tracker.reset(new HeapProfileTracker(&context));
+
+ HeapProfileTracker* hpt = context.heap_profile_tracker.get();
+ std::unique_ptr<SequenceStackProfileTracker> spt(
+ new SequenceStackProfileTracker(&context));
constexpr auto kBuildId = 1u;
constexpr auto kMappingNameId1 = 2u;
constexpr auto kMappingNameId2 = 3u;
- ppss.AddString(kBuildId, "buildid");
- ppss.AddString(kMappingNameId1, "foo");
- ppss.AddString(kMappingNameId2, "bar");
+ spt->AddString(kBuildId, "buildid");
+ spt->AddString(kMappingNameId1, "foo");
+ spt->AddString(kMappingNameId2, "bar");
- ProfilePacketSequenceState::SourceMapping mapping;
+ SequenceStackProfileTracker::SourceMapping mapping;
mapping.build_id = kBuildId;
mapping.exact_offset = 1;
mapping.start_offset = 1;
@@ -217,8 +221,8 @@
mapping.end = 3;
mapping.load_bias = 0;
mapping.name_ids = {kMappingNameId1, kMappingNameId2};
- ppss.AddMapping(0, mapping);
- ppss.CommitAllocations();
+ spt->AddMapping(0, mapping);
+ hpt->CommitAllocations(kDefaultSequence, spt.get(), nullptr);
auto foo_bar_id = context.storage->string_pool().GetId("/foo/bar");
ASSERT_NE(foo_bar_id, std::nullopt);
EXPECT_THAT(context.storage->stack_profile_mapping_table().name()[0],
@@ -229,11 +233,12 @@
TEST(HeapProfileTrackerTest, Functional) {
TraceProcessorContext context;
context.storage.reset(new TraceStorage());
- context.stack_profile_tracker.reset(new StackProfileTracker(&context));
+ context.global_stack_profile_tracker.reset(new GlobalStackProfileTracker());
+ context.heap_profile_tracker.reset(new HeapProfileTracker(&context));
- PacketSequenceState pss(&context);
- ProfilePacketSequenceState& ppss =
- *pss.current_generation()->GetOrCreate<ProfilePacketSequenceState>();
+ HeapProfileTracker* hpt = context.heap_profile_tracker.get();
+ std::unique_ptr<SequenceStackProfileTracker> spt(
+ new SequenceStackProfileTracker(&context));
uint32_t next_string_intern_id = 1;
@@ -247,7 +252,7 @@
for (size_t i = 0; i < base::ArraySize(mapping_names); ++i)
mapping_name_ids[i] = next_string_intern_id++;
- ProfilePacketSequenceState::SourceMapping
+ SequenceStackProfileTracker::SourceMapping
mappings[base::ArraySize(mapping_names)] = {};
mappings[0].build_id = build_id_ids[0];
mappings[0].exact_offset = 1;
@@ -278,7 +283,7 @@
for (size_t i = 0; i < base::ArraySize(function_names); ++i)
function_name_ids[i] = next_string_intern_id++;
- ProfilePacketSequenceState::SourceFrame
+ SequenceStackProfileTracker::SourceFrame
frames[base::ArraySize(function_names)];
frames[0].name_id = function_name_ids[0];
frames[0].mapping_id = 0;
@@ -296,41 +301,41 @@
frames[3].mapping_id = 2;
frames[3].rel_pc = 123;
- ProfilePacketSequenceState::SourceCallstack callstacks[3];
+ SequenceStackProfileTracker::SourceCallstack callstacks[3];
callstacks[0] = {2, 1, 0};
callstacks[1] = {2, 1, 0, 1, 0};
callstacks[2] = {0, 2, 0, 1, 2};
for (size_t i = 0; i < base::ArraySize(build_ids); ++i) {
auto interned = base::StringView(build_ids[i].data(), build_ids[i].size());
- ppss.AddString(build_id_ids[i], interned);
+ spt->AddString(build_id_ids[i], interned);
}
for (size_t i = 0; i < base::ArraySize(mapping_names); ++i) {
auto interned =
base::StringView(mapping_names[i].data(), mapping_names[i].size());
- ppss.AddString(mapping_name_ids[i], interned);
+ spt->AddString(mapping_name_ids[i], interned);
}
for (size_t i = 0; i < base::ArraySize(function_names); ++i) {
auto interned =
base::StringView(function_names[i].data(), function_names[i].size());
- ppss.AddString(function_name_ids[i], interned);
+ spt->AddString(function_name_ids[i], interned);
}
for (uint32_t i = 0; i < base::ArraySize(mappings); ++i)
- ppss.AddMapping(i, mappings[i]);
+ spt->AddMapping(i, mappings[i]);
for (uint32_t i = 0; i < base::ArraySize(frames); ++i)
- ppss.AddFrame(i, frames[i]);
+ spt->AddFrame(i, frames[i]);
for (uint32_t i = 0; i < base::ArraySize(callstacks); ++i)
- ppss.AddCallstack(i, callstacks[i]);
+ spt->AddCallstack(i, callstacks[i]);
- ppss.CommitAllocations();
+ hpt->CommitAllocations(kDefaultSequence, spt.get(), nullptr);
for (size_t i = 0; i < base::ArraySize(callstacks); ++i) {
std::optional<CallsiteId> parent;
- const ProfilePacketSequenceState::SourceCallstack& callstack =
+ const SequenceStackProfileTracker::SourceCallstack& callstack =
callstacks[i];
for (size_t depth = 0; depth < callstack.size(); ++depth) {
- auto frame_id = ppss.GetDatabaseFrameIdForTesting(callstack[depth]);
+ auto frame_id = spt->GetDatabaseFrameIdForTesting(callstack[depth]);
std::optional<CallsiteId> self = FindCallstack(
*context.storage, static_cast<int64_t>(depth), parent, frame_id);
ASSERT_TRUE(self.has_value());
@@ -338,7 +343,7 @@
}
}
- ppss.FinalizeProfile();
+ hpt->FinalizeProfile(kDefaultSequence, spt.get(), nullptr);
}
} // namespace
diff --git a/src/trace_processor/importers/proto/packet_sequence_state.h b/src/trace_processor/importers/proto/packet_sequence_state.h
index 2ad0c7b..8c29222 100644
--- a/src/trace_processor/importers/proto/packet_sequence_state.h
+++ b/src/trace_processor/importers/proto/packet_sequence_state.h
@@ -19,12 +19,13 @@
#include <stdint.h>
-#include <memory>
-#include <type_traits>
+#include <unordered_map>
#include <vector>
#include "perfetto/base/compiler.h"
#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
+#include "src/trace_processor/storage/trace_storage.h"
#include "src/trace_processor/types/trace_processor_context.h"
#include "src/trace_processor/util/interned_message_view.h"
@@ -33,8 +34,19 @@
class PacketSequenceState {
public:
+ // Helper to keep per sequence state. These are not reset when the generation
+ // changes.
+ // Trackers or parsers can add their custom per sequence state here instead of
+ // keeping a map from seq_id to some internal state.
+ // TODO(carlscab): We should come up with a nicer API that allows extensions
+ // to be notified of generation changes.
+ // TODO(carlscab): There is some existing code that could use this. Migrate.
+ struct ExtensibleSequenceState {
+ std::unique_ptr<Destructible> v8_sequence_state;
+ };
+
explicit PacketSequenceState(TraceProcessorContext* context)
- : context_(context) {
+ : context_(context), sequence_stack_profile_tracker_(context) {
current_generation_.reset(
new PacketSequenceStateGeneration(this, generation_index_++));
}
@@ -75,7 +87,7 @@
// sequence. Add a new generation with the updated defaults but the
// current generation's interned data state.
current_generation_.reset(new PacketSequenceStateGeneration(
- this, generation_index_++, current_generation_.get(),
+ this, generation_index_++, current_generation_->interned_data_,
std::move(defaults)));
}
@@ -107,6 +119,14 @@
bool IsIncrementalStateValid() const { return !packet_loss_; }
+ SequenceStackProfileTracker& sequence_stack_profile_tracker() {
+ return sequence_stack_profile_tracker_;
+ }
+
+ ExtensibleSequenceState& extensible_sequence_state() {
+ return extensible_sequence_state_;
+ }
+
// Returns a ref-counted ptr to the current generation.
RefPtr<PacketSequenceStateGeneration> current_generation() const {
return current_generation_;
@@ -154,8 +174,20 @@
int64_t track_event_thread_instruction_count_ = 0;
RefPtr<PacketSequenceStateGeneration> current_generation_;
+ SequenceStackProfileTracker sequence_stack_profile_tracker_;
+ ExtensibleSequenceState extensible_sequence_state_;
};
+template <uint32_t FieldId, typename MessageType>
+typename MessageType::Decoder*
+PacketSequenceStateGeneration::LookupInternedMessage(uint64_t iid) {
+ auto* interned_message_view = GetInternedMessageView(FieldId, iid);
+ if (!interned_message_view)
+ return nullptr;
+
+ return interned_message_view->template GetOrCreateDecoder<MessageType>();
+}
+
} // namespace trace_processor
} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/packet_sequence_state_generation.cc b/src/trace_processor/importers/proto/packet_sequence_state_generation.cc
index 1e89096..6e8e98d 100644
--- a/src/trace_processor/importers/proto/packet_sequence_state_generation.cc
+++ b/src/trace_processor/importers/proto/packet_sequence_state_generation.cc
@@ -15,38 +15,12 @@
*/
#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
-#include <cstddef>
#include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/storage/trace_storage.h"
namespace perfetto {
namespace trace_processor {
-PacketSequenceStateGeneration::PacketSequenceStateGeneration(
- PacketSequenceState* state,
- size_t generation_index,
- PacketSequenceStateGeneration* prev_gen,
- TraceBlobView defaults)
- : state_(state),
- generation_index_(generation_index),
- interned_data_(prev_gen->interned_data_),
- trace_packet_defaults_(InternedMessageView(std::move(defaults))),
- trackers_(prev_gen->trackers_) {
- for (auto& t : trackers_) {
- if (t.get() != nullptr) {
- t->set_generation(this);
- }
- }
-}
-
-PacketSequenceStateGeneration::InternedDataTracker::~InternedDataTracker() =
- default;
-
-TraceProcessorContext* PacketSequenceStateGeneration::GetContext() const {
- return state_->context();
-}
-
void PacketSequenceStateGeneration::InternMessage(uint32_t field_id,
TraceBlobView message) {
constexpr auto kIidFieldNumber = 1;
diff --git a/src/trace_processor/importers/proto/packet_sequence_state_generation.h b/src/trace_processor/importers/proto/packet_sequence_state_generation.h
index 1f05d5c..9c7aa5a 100644
--- a/src/trace_processor/importers/proto/packet_sequence_state_generation.h
+++ b/src/trace_processor/importers/proto/packet_sequence_state_generation.h
@@ -17,17 +17,10 @@
#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PACKET_SEQUENCE_STATE_GENERATION_H_
#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PACKET_SEQUENCE_STATE_GENERATION_H_
-#include <array>
-#include <cstddef>
-#include <memory>
#include <optional>
-#include <tuple>
-#include <type_traits>
#include <unordered_map>
-#include "perfetto/public/compiler.h"
#include "perfetto/trace_processor/ref_counted.h"
-#include "perfetto/trace_processor/trace_blob_view.h"
#include "src/trace_processor/util/interned_message_view.h"
#include "protos/perfetto/trace/trace_packet_defaults.pbzero.h"
@@ -42,65 +35,9 @@
std::unordered_map<uint32_t /*field_id*/, InternedMessageMap>;
class PacketSequenceState;
-class TraceProcessorContext;
-
-class StackProfileSequenceState;
-class ProfilePacketSequenceState;
-class V8SequenceState;
-
-using InternedDataTrackers = std::tuple<StackProfileSequenceState,
- ProfilePacketSequenceState,
- V8SequenceState>;
class PacketSequenceStateGeneration : public RefCounted {
public:
- // Base class to add custom sequence state. This state is keep per sequence
- // and per incremental state interval, that is, each time incremental state is
- // reset a new instance is created but not each time `TracePacketDefaults` are
- // updated. Note that this means that different
- // `PacketSequenceStateGeneration` instances might point to the same
- // `InternedDataTracker` (because they only differ in their
- // `TracePacketDefaults`).
- //
- // ATTENTION: You should not create instances of these classes yourself but
- // use the `PacketSequenceStateGeneration::GetOrCreate<>' method instead.
- class InternedDataTracker : public RefCounted {
- public:
- virtual ~InternedDataTracker();
-
- protected:
- template <uint32_t FieldId, typename MessageType>
- typename MessageType::Decoder* LookupInternedMessage(uint64_t iid) {
- return generation_->LookupInternedMessage<FieldId, MessageType>(iid);
- }
-
- InternedMessageView* GetInternedMessageView(uint32_t field_id,
- uint64_t iid) {
- return generation_->GetInternedMessageView(field_id, iid);
- }
-
- template <typename T>
- std::remove_cv_t<T>* GetOrCreate() {
- return generation_->GetOrCreate<T>();
- }
-
- private:
- friend PacketSequenceStateGeneration;
- // Called when the a new generation is created as a result of
- // `TracePacketDefaults` being updated.
- void set_generation(PacketSequenceStateGeneration* generation) {
- generation_ = generation;
- }
-
- // Note: A `InternedDataTracker` instance can be linked to multiple
- // `PacketSequenceStateGeneration` instances (when there are multiple
- // `TracePacketDefaults` in the same interning context). `generation_` will
- // point to the latest one. We keep this member private to prevent misuse /
- // confusion around this fact. Instead subclasses should access the public
- // methods of this class to get any interned data.
- PacketSequenceStateGeneration* generation_ = nullptr;
- };
-
// Returns |nullptr| if the message with the given |iid| was not found (also
// records a stat in this case).
template <uint32_t FieldId, typename MessageType>
@@ -142,47 +79,21 @@
PacketSequenceState* state() const { return state_; }
size_t generation_index() const { return generation_index_; }
- // Extension point for custom sequence state. To add new per sequence state
- // just subclass ´PacketSequenceStateGeneration´ and get your sequence bound
- // instance by calling this method.
- template <typename T>
- std::remove_cv_t<T>* GetOrCreate();
-
private:
friend class PacketSequenceState;
- // Helper to find the index in a tuple of a given type. Lookups are done
- // ignoring cv qualifiers. If no index is found size of the tuple is returned.
- //
- // ATTENTION: Duplicate types in the tuple will trigger a compiler error.
- template <typename Tuple, typename Type, size_t index = 0>
- static constexpr size_t FindUniqueType() {
- constexpr size_t kSize = std::tuple_size_v<Tuple>;
- if constexpr (index < kSize) {
- using TypeAtIndex = typename std::tuple_element<index, Tuple>::type;
- if constexpr (std::is_same_v<std::remove_cv_t<Type>,
- std::remove_cv_t<TypeAtIndex>>) {
- static_assert(FindUniqueType<Tuple, Type, index + 1>() == kSize,
- "Duplicate types.");
- return index;
- } else {
- return FindUniqueType<Tuple, Type, index + 1>();
- }
- } else {
- return kSize;
- }
- }
-
PacketSequenceStateGeneration(PacketSequenceState* state,
size_t generation_index)
: state_(state), generation_index_(generation_index) {}
PacketSequenceStateGeneration(PacketSequenceState* state,
size_t generation_index,
- PacketSequenceStateGeneration* prev_gen,
- TraceBlobView defaults);
-
- TraceProcessorContext* GetContext() const;
+ InternedFieldMap interned_data,
+ TraceBlobView defaults)
+ : state_(state),
+ generation_index_(generation_index),
+ interned_data_(interned_data),
+ trace_packet_defaults_(InternedMessageView(std::move(defaults))) {}
void InternMessage(uint32_t field_id, TraceBlobView message);
@@ -196,34 +107,8 @@
size_t generation_index_;
InternedFieldMap interned_data_;
std::optional<InternedMessageView> trace_packet_defaults_;
- std::array<RefPtr<InternedDataTracker>,
- std::tuple_size_v<InternedDataTrackers>>
- trackers_;
};
-template <typename T>
-std::remove_cv_t<T>* PacketSequenceStateGeneration::GetOrCreate() {
- constexpr size_t index = FindUniqueType<InternedDataTrackers, T>();
- static_assert(index < std::tuple_size_v<InternedDataTrackers>, "Not found");
- auto& ptr = trackers_[index];
- if (PERFETTO_UNLIKELY(ptr.get() == nullptr)) {
- ptr.reset(new T(GetContext()));
- ptr->set_generation(this);
- }
-
- return static_cast<std::remove_cv_t<T>*>(ptr.get());
-}
-
-template <uint32_t FieldId, typename MessageType>
-typename MessageType::Decoder*
-PacketSequenceStateGeneration::LookupInternedMessage(uint64_t iid) {
- auto* interned_message_view = GetInternedMessageView(FieldId, iid);
- if (!interned_message_view)
- return nullptr;
-
- return interned_message_view->template GetOrCreateDecoder<MessageType>();
-}
-
} // namespace trace_processor
} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/profile_module.cc b/src/trace_processor/importers/proto/profile_module.cc
index 61596d3..c337869 100644
--- a/src/trace_processor/importers/proto/profile_module.cc
+++ b/src/trace_processor/importers/proto/profile_module.cc
@@ -25,18 +25,17 @@
#include "src/trace_processor/importers/common/deobfuscation_mapping_table.h"
#include "src/trace_processor/importers/common/event_tracker.h"
#include "src/trace_processor/importers/common/process_tracker.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
#include "src/trace_processor/importers/proto/packet_sequence_state.h"
#include "src/trace_processor/importers/proto/perf_sample_tracker.h"
-#include "src/trace_processor/importers/proto/profile_packet_sequence_state.h"
#include "src/trace_processor/importers/proto/profile_packet_utils.h"
-#include "src/trace_processor/importers/proto/stack_profile_sequence_state.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/storage/stats.h"
#include "src/trace_processor/storage/trace_storage.h"
#include "src/trace_processor/tables/profiler_tables_py.h"
#include "src/trace_processor/types/trace_processor_context.h"
-#include "src/trace_processor/util/profiler_util.h"
#include "src/trace_processor/util/stack_traces_util.h"
#include "protos/perfetto/common/builtin_clock.pbzero.h"
@@ -92,7 +91,8 @@
ParsePerfSample(ts, data.sequence_state.get(), decoder);
return;
case TracePacket::kProfilePacketFieldNumber:
- ParseProfilePacket(ts, data.sequence_state->state(),
+ ParseProfilePacket(ts, data.sequence_state.get(),
+ decoder.trusted_packet_sequence_id(),
decoder.profile_packet());
return;
case TracePacket::kModuleSymbolsFieldNumber:
@@ -152,8 +152,9 @@
ProcessTracker* procs = context_->process_tracker.get();
TraceStorage* storage = context_->storage.get();
- StackProfileSequenceState& stack_profile_sequence_state =
- *sequence_state->GetOrCreate<StackProfileSequenceState>();
+ SequenceStackProfileTracker& sequence_stack_profile_tracker =
+ sequence_state->state()->sequence_stack_profile_tracker();
+ ProfilePacketInternLookup intern_lookup(sequence_state);
uint32_t pid = static_cast<uint32_t>(sequence_state->state()->pid());
uint32_t tid = static_cast<uint32_t>(sequence_state->state()->tid());
@@ -170,8 +171,8 @@
break;
}
- auto opt_cs_id =
- stack_profile_sequence_state.FindOrInsertCallstack(*callstack_it);
+ auto opt_cs_id = sequence_stack_profile_tracker.FindOrInsertCallstack(
+ *callstack_it, &intern_lookup);
if (!opt_cs_id) {
context_->storage->IncrementStats(stats::stackprofile_parser_error);
continue;
@@ -246,11 +247,12 @@
ts, static_cast<double>(sample.timebase_count()),
sampling_stream.timebase_track_id);
- StackProfileSequenceState& stack_profile_sequence_state =
- *sequence_state->GetOrCreate<StackProfileSequenceState>();
+ SequenceStackProfileTracker& stack_tracker =
+ sequence_state->state()->sequence_stack_profile_tracker();
+ ProfilePacketInternLookup intern_lookup(sequence_state);
uint64_t callstack_iid = sample.callstack_iid();
std::optional<CallsiteId> cs_id =
- stack_profile_sequence_state.FindOrInsertCallstack(callstack_iid);
+ stack_tracker.FindOrInsertCallstack(callstack_iid, &intern_lookup);
// A failed lookup of the interned callstack can mean either:
// (a) This is a counter-only profile without callstacks. Due to an
@@ -296,38 +298,45 @@
context_->storage->mutable_perf_sample_table()->Insert(sample_row);
}
-void ProfileModule::ParseProfilePacket(int64_t ts,
- PacketSequenceState* sequence_state,
- ConstBytes blob) {
- ProfilePacketSequenceState& profile_packet_sequence_state =
- *sequence_state->current_generation()
- ->GetOrCreate<ProfilePacketSequenceState>();
+void ProfileModule::ParseProfilePacket(
+ int64_t ts,
+ PacketSequenceStateGeneration* sequence_state,
+ uint32_t seq_id,
+ ConstBytes blob) {
protos::pbzero::ProfilePacket::Decoder packet(blob.data, blob.size);
- profile_packet_sequence_state.SetProfilePacketIndex(packet.index());
+ context_->heap_profile_tracker->SetProfilePacketIndex(seq_id, packet.index());
for (auto it = packet.strings(); it; ++it) {
protos::pbzero::InternedString::Decoder entry(*it);
+
const char* str = reinterpret_cast<const char*>(entry.str().data);
auto str_view = base::StringView(str, entry.str().size);
- profile_packet_sequence_state.AddString(entry.iid(), str_view);
+ sequence_state->state()->sequence_stack_profile_tracker().AddString(
+ entry.iid(), str_view);
}
for (auto it = packet.mappings(); it; ++it) {
protos::pbzero::Mapping::Decoder entry(*it);
- profile_packet_sequence_state.AddMapping(
- entry.iid(), ProfilePacketUtils::MakeSourceMapping(entry));
+ SequenceStackProfileTracker::SourceMapping src_mapping =
+ ProfilePacketUtils::MakeSourceMapping(entry);
+ sequence_state->state()->sequence_stack_profile_tracker().AddMapping(
+ entry.iid(), src_mapping);
}
for (auto it = packet.frames(); it; ++it) {
protos::pbzero::Frame::Decoder entry(*it);
- profile_packet_sequence_state.AddFrame(
- entry.iid(), ProfilePacketUtils::MakeSourceFrame(entry));
+ SequenceStackProfileTracker::SourceFrame src_frame =
+ ProfilePacketUtils::MakeSourceFrame(entry);
+ sequence_state->state()->sequence_stack_profile_tracker().AddFrame(
+ entry.iid(), src_frame);
}
for (auto it = packet.callstacks(); it; ++it) {
protos::pbzero::Callstack::Decoder entry(*it);
- profile_packet_sequence_state.AddCallstack(
- entry.iid(), ProfilePacketUtils::MakeSourceCallstack(entry));
+ SequenceStackProfileTracker::SourceCallstack src_callstack =
+ ProfilePacketUtils::MakeSourceCallstack(entry);
+ sequence_state->state()->sequence_stack_profile_tracker().AddCallstack(
+ entry.iid(), src_callstack);
}
for (auto it = packet.process_dumps(); it; ++it) {
@@ -397,7 +406,7 @@
for (auto sample_it = entry.samples(); sample_it; ++sample_it) {
protos::pbzero::ProfilePacket::HeapSample::Decoder sample(*sample_it);
- ProfilePacketSequenceState::SourceAllocation src_allocation;
+ HeapProfileTracker::SourceAllocation src_allocation;
src_allocation.pid = entry.pid();
if (entry.heap_name().size != 0) {
src_allocation.heap_name =
@@ -418,11 +427,15 @@
src_allocation.free_count = sample.free_count();
}
- profile_packet_sequence_state.StoreAllocation(src_allocation);
+ context_->heap_profile_tracker->StoreAllocation(seq_id, src_allocation);
}
}
if (!packet.continued()) {
- profile_packet_sequence_state.FinalizeProfile();
+ PERFETTO_CHECK(sequence_state);
+ ProfilePacketInternLookup intern_lookup(sequence_state);
+ context_->heap_profile_tracker->FinalizeProfile(
+ seq_id, &sequence_state->state()->sequence_stack_profile_tracker(),
+ &intern_lookup);
}
}
@@ -438,7 +451,7 @@
module_symbols.build_id().data, module_symbols.build_id().size)));
}
- auto mapping_ids = context_->stack_profile_tracker->FindMappingRow(
+ auto mapping_ids = context_->global_stack_profile_tracker->FindMappingRow(
context_->storage->InternString(module_symbols.path()), build_id);
if (mapping_ids.empty()) {
context_->storage->IncrementStats(stats::stackprofile_invalid_mapping_id);
@@ -471,7 +484,7 @@
context_->args_translation_table->AddNativeSymbolTranslationRule(
mapping_id, address_symbols.address(), last_location);
std::vector<FrameId> frame_ids =
- context_->stack_profile_tracker->FindFrameIds(
+ context_->global_stack_profile_tracker->FindFrameIds(
mapping_id, address_symbols.address());
for (const FrameId frame_id : frame_ids) {
@@ -523,16 +536,21 @@
std::vector<tables::StackProfileFrameTable::Id> frames;
if (opt_package_name_id) {
- const std::vector<tables::StackProfileFrameTable::Id> pkg_frames =
- context_->stack_profile_tracker->JavaFramesForName(
+ const std::vector<tables::StackProfileFrameTable::Id>* pkg_frames =
+ context_->global_stack_profile_tracker->JavaFramesForName(
{*merged_obfuscated_id, *opt_package_name_id});
- frames.insert(frames.end(), pkg_frames.begin(), pkg_frames.end());
+ if (pkg_frames) {
+ frames.insert(frames.end(), pkg_frames->begin(), pkg_frames->end());
+ }
}
if (opt_memfd_id) {
- const std::vector<tables::StackProfileFrameTable::Id> memfd_frames =
- context_->stack_profile_tracker->JavaFramesForName(
+ const std::vector<tables::StackProfileFrameTable::Id>* memfd_frames =
+ context_->global_stack_profile_tracker->JavaFramesForName(
{*merged_obfuscated_id, *opt_memfd_id});
- frames.insert(frames.end(), memfd_frames.begin(), memfd_frames.end());
+ if (memfd_frames) {
+ frames.insert(frames.end(), memfd_frames->begin(),
+ memfd_frames->end());
+ }
}
for (tables::StackProfileFrameTable::Id frame_id : frames) {
diff --git a/src/trace_processor/importers/proto/profile_module.h b/src/trace_processor/importers/proto/profile_module.h
index 883fb7a..e6674d7 100644
--- a/src/trace_processor/importers/proto/profile_module.h
+++ b/src/trace_processor/importers/proto/profile_module.h
@@ -65,7 +65,8 @@
// heap profiling:
void ParseProfilePacket(int64_t ts,
- PacketSequenceState*,
+ PacketSequenceStateGeneration*,
+ uint32_t seq_id,
protozero::ConstBytes);
void ParseDeobfuscationMapping(int64_t ts,
PacketSequenceStateGeneration*,
diff --git a/src/trace_processor/importers/proto/profile_packet_sequence_state.cc b/src/trace_processor/importers/proto/profile_packet_sequence_state.cc
deleted file mode 100644
index 71a4b13..0000000
--- a/src/trace_processor/importers/proto/profile_packet_sequence_state.cc
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright (C) 2019 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/importers/proto/profile_packet_sequence_state.h"
-
-#include "perfetto/base/flat_set.h"
-#include "perfetto/ext/base/string_view.h"
-#include "src/trace_processor/importers/common/process_tracker.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
-#include "src/trace_processor/importers/proto/profile_packet_utils.h"
-#include "src/trace_processor/importers/proto/stack_profile_sequence_state.h"
-#include "src/trace_processor/storage/stats.h"
-#include "src/trace_processor/storage/trace_storage.h"
-#include "src/trace_processor/types/trace_processor_context.h"
-
-namespace perfetto {
-namespace trace_processor {
-namespace {
-const char kArtHeapName[] = "com.android.art";
-}
-
-ProfilePacketSequenceState::ProfilePacketSequenceState(
- TraceProcessorContext* context)
- : context_(context) {}
-
-ProfilePacketSequenceState::~ProfilePacketSequenceState() = default;
-
-void ProfilePacketSequenceState::SetProfilePacketIndex(uint64_t index) {
- bool dropped_packet = false;
- // heapprofd starts counting at index = 0.
- if (!prev_index.has_value() && index != 0) {
- dropped_packet = true;
- }
-
- if (prev_index.has_value() && *prev_index + 1 != index) {
- dropped_packet = true;
- }
-
- if (dropped_packet) {
- context_->storage->IncrementStats(stats::heapprofd_missing_packet);
- }
- prev_index = index;
-}
-
-void ProfilePacketSequenceState::AddString(SourceStringId id,
- base::StringView str) {
- strings_.Insert(id, str.ToStdString());
-}
-
-void ProfilePacketSequenceState::AddMapping(SourceMappingId id,
- const SourceMapping& mapping) {
- StackProfileTracker::CreateMappingParams params;
- if (std::string* str = strings_.Find(mapping.build_id); str) {
- params.build_id = base::StringView(*str);
- } else {
- context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
- return;
- }
- params.exact_offset = mapping.exact_offset;
- params.start_offset = mapping.start_offset;
- params.start = mapping.start;
- params.end = mapping.end;
- params.load_bias = mapping.load_bias;
-
- std::vector<base::StringView> path_components;
- path_components.reserve(mapping.name_ids.size());
- for (SourceStringId string_id : mapping.name_ids) {
- if (std::string* str = strings_.Find(string_id); str) {
- path_components.push_back(base::StringView(*str));
- } else {
- context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
- return;
- }
- }
- std::string path = ProfilePacketUtils::MakeMappingName(path_components);
- params.name = base::StringView(path);
- MappingId mapping_id = context_->stack_profile_tracker->InternMapping(params);
- mappings_.Insert(id, mapping_id);
-}
-
-void ProfilePacketSequenceState::AddFrame(SourceFrameId id,
- const SourceFrame& frame) {
- MappingId* mapping_id = mappings_.Find(frame.mapping_id);
- if (!mapping_id) {
- context_->storage->IncrementStats(stats::stackprofile_invalid_mapping_id);
- return;
- }
-
- std::string* function_name = strings_.Find(frame.name_id);
- if (!function_name) {
- context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
- return;
- }
-
- FrameId frame_id = context_->stack_profile_tracker->InternFrame(
- *mapping_id, frame.rel_pc, base::StringView(*function_name));
-
- frames_.Insert(id, frame_id);
-}
-
-void ProfilePacketSequenceState::AddCallstack(
- SourceCallstackId id,
- const SourceCallstack& callstack) {
- std::optional<CallsiteId> parent_callsite_id;
- uint32_t depth = 0;
- for (SourceFrameId source_frame_id : callstack) {
- FrameId* frame_id = frames_.Find(source_frame_id);
- if (!frame_id) {
- context_->storage->IncrementStats(stats::stackprofile_invalid_frame_id);
- return;
- }
- parent_callsite_id = context_->stack_profile_tracker->InternCallsite(
- parent_callsite_id, *frame_id, depth);
- ++depth;
- }
-
- if (!parent_callsite_id) {
- context_->storage->IncrementStats(stats::stackprofile_empty_callstack);
- return;
- }
-
- callstacks_.Insert(id, *parent_callsite_id);
-}
-
-void ProfilePacketSequenceState::StoreAllocation(
- const SourceAllocation& alloc) {
- pending_allocs_.push_back(std::move(alloc));
-}
-
-void ProfilePacketSequenceState::CommitAllocations() {
- for (const SourceAllocation& alloc : pending_allocs_)
- AddAllocation(alloc);
- pending_allocs_.clear();
-}
-
-void ProfilePacketSequenceState::FinalizeProfile() {
- CommitAllocations();
- strings_.Clear();
- mappings_.Clear();
- frames_.Clear();
- callstacks_.Clear();
-}
-
-FrameId ProfilePacketSequenceState::GetDatabaseFrameIdForTesting(
- SourceFrameId source_frame_id) {
- FrameId* frame_id = frames_.Find(source_frame_id);
- if (!frame_id) {
- PERFETTO_DLOG("Invalid frame.");
- return {};
- }
- return *frame_id;
-}
-
-void ProfilePacketSequenceState::AddAllocation(const SourceAllocation& alloc) {
- auto opt_callstack_id = FindOrInsertCallstack(alloc.callstack_id);
- if (!opt_callstack_id)
- return;
-
- CallsiteId callstack_id = *opt_callstack_id;
-
- UniquePid upid = context_->process_tracker->GetOrCreateProcess(
- static_cast<uint32_t>(alloc.pid));
-
- tables::HeapProfileAllocationTable::Row alloc_row{
- alloc.timestamp,
- upid,
- alloc.heap_name,
- callstack_id,
- static_cast<int64_t>(alloc.alloc_count),
- static_cast<int64_t>(alloc.self_allocated)};
-
- tables::HeapProfileAllocationTable::Row free_row{
- alloc.timestamp,
- upid,
- alloc.heap_name,
- callstack_id,
- -static_cast<int64_t>(alloc.free_count),
- -static_cast<int64_t>(alloc.self_freed)};
-
- auto* prev_alloc = prev_alloc_.Find({upid, callstack_id});
- if (!prev_alloc) {
- prev_alloc = prev_alloc_
- .Insert(std::make_pair(upid, callstack_id),
- tables::HeapProfileAllocationTable::Row{})
- .first;
- }
-
- auto* prev_free = prev_free_.Find({upid, callstack_id});
- if (!prev_free) {
- prev_free = prev_free_
- .Insert(std::make_pair(upid, callstack_id),
- tables::HeapProfileAllocationTable::Row{})
- .first;
- }
-
- base::FlatSet<CallsiteId>& callstacks_for_source_callstack_id =
- seen_callstacks_[SourceAllocationIndex{upid, alloc.callstack_id,
- alloc.heap_name}];
- bool new_callstack;
- std::tie(std::ignore, new_callstack) =
- callstacks_for_source_callstack_id.insert(callstack_id);
-
- if (new_callstack) {
- alloc_correction_[alloc.callstack_id] = *prev_alloc;
- free_correction_[alloc.callstack_id] = *prev_free;
- }
-
- const auto* alloc_correction = alloc_correction_.Find(alloc.callstack_id);
- if (alloc_correction) {
- alloc_row.count += alloc_correction->count;
- alloc_row.size += alloc_correction->size;
- }
-
- const auto* free_correction = free_correction_.Find(alloc.callstack_id);
- if (free_correction) {
- free_row.count += free_correction->count;
- free_row.size += free_correction->size;
- }
-
- tables::HeapProfileAllocationTable::Row alloc_delta = alloc_row;
- tables::HeapProfileAllocationTable::Row free_delta = free_row;
-
- alloc_delta.count -= prev_alloc->count;
- alloc_delta.size -= prev_alloc->size;
-
- free_delta.count -= prev_free->count;
- free_delta.size -= prev_free->size;
-
- if (alloc_delta.count < 0 || alloc_delta.size < 0 || free_delta.count > 0 ||
- free_delta.size > 0) {
- PERFETTO_DLOG("Non-monotonous allocation.");
- context_->storage->IncrementIndexedStats(stats::heapprofd_malformed_packet,
- static_cast<int>(upid));
- return;
- }
-
- // Dump at max profiles do not have .count set.
- if (alloc_delta.count || alloc_delta.size) {
- context_->storage->mutable_heap_profile_allocation_table()->Insert(
- alloc_delta);
- }
-
- // ART only reports allocations, and not frees. This throws off our logic
- // that assumes that if a new object was allocated with the same address,
- // the old one has to have been freed in the meantime.
- // See HeapTracker::RecordMalloc in bookkeeping.cc.
- if (context_->storage->GetString(alloc.heap_name) != kArtHeapName &&
- (free_delta.count || free_delta.size)) {
- context_->storage->mutable_heap_profile_allocation_table()->Insert(
- free_delta);
- }
-
- *prev_alloc = alloc_row;
- *prev_free = free_row;
-}
-
-std::optional<CallsiteId> ProfilePacketSequenceState::FindOrInsertCallstack(
- uint64_t iid) {
- if (CallsiteId* id = callstacks_.Find(iid); id) {
- return *id;
- }
- return GetOrCreate<StackProfileSequenceState>()->FindOrInsertCallstack(iid);
-}
-
-} // namespace trace_processor
-} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/profile_packet_sequence_state.h b/src/trace_processor/importers/proto/profile_packet_sequence_state.h
deleted file mode 100644
index 678aab2..0000000
--- a/src/trace_processor/importers/proto/profile_packet_sequence_state.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2019 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_IMPORTERS_PROTO_PROFILE_PACKET_SEQUENCE_STATE_H_
-#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILE_PACKET_SEQUENCE_STATE_H_
-
-#include <cstdint>
-#include "perfetto/base/flat_set.h"
-#include "perfetto/ext/base/flat_hash_map.h"
-
-#include "perfetto/ext/base/hash.h"
-#include "perfetto/ext/base/string_view.h"
-#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
-#include "src/trace_processor/importers/proto/stack_profile_sequence_state.h"
-#include "src/trace_processor/storage/trace_storage.h"
-
-namespace perfetto {
-namespace trace_processor {
-
-// Keeps sequence specific state for profile packets.
-class ProfilePacketSequenceState final
- : public PacketSequenceStateGeneration::InternedDataTracker {
- public:
- using SourceStringId = uint64_t;
-
- struct SourceMapping {
- SourceStringId build_id = 0;
- uint64_t exact_offset = 0;
- uint64_t start_offset = 0;
- uint64_t start = 0;
- uint64_t end = 0;
- uint64_t load_bias = 0;
- std::vector<SourceStringId> name_ids;
- };
- using SourceMappingId = uint64_t;
-
- struct SourceFrame {
- SourceStringId name_id = 0;
- SourceMappingId mapping_id = 0;
- uint64_t rel_pc = 0;
- };
- using SourceFrameId = uint64_t;
-
- using SourceCallstack = std::vector<SourceFrameId>;
- using SourceCallstackId = uint64_t;
- struct SourceAllocation {
- uint64_t pid = 0;
- // This is int64_t, because we get this from the TraceSorter which also
- // converts this for us.
- int64_t timestamp = 0;
- StringId heap_name;
- uint64_t callstack_id = 0;
- uint64_t self_allocated = 0;
- uint64_t self_freed = 0;
- uint64_t alloc_count = 0;
- uint64_t free_count = 0;
- };
-
- explicit ProfilePacketSequenceState(TraceProcessorContext* context);
- virtual ~ProfilePacketSequenceState() override;
-
- // Profile packets keep track of a index to detect packet loss. Call this
- // method to update this index with the latest seen value.
- void SetProfilePacketIndex(uint64_t index);
-
- // In Android version Q we did not intern Mappings, Frames nor Callstacks,
- // instead the profile packed "interned these". The following methods are used
- // to support this old use case. They add the given object to a sequence local
- // index for them to be retrieved later (see Find* Lookup* methods).
- void AddString(SourceStringId id, base::StringView str);
- void AddMapping(SourceMappingId id, const SourceMapping& mapping);
- void AddFrame(SourceFrameId id, const SourceFrame& frame);
- void AddCallstack(SourceCallstackId id, const SourceCallstack& callstack);
-
- void StoreAllocation(const SourceAllocation& allocation);
- void FinalizeProfile();
- void CommitAllocations();
-
- FrameId GetDatabaseFrameIdForTesting(SourceFrameId);
-
- private:
- struct SourceAllocationIndex {
- UniquePid upid;
- SourceCallstackId src_callstack_id;
- StringPool::Id heap_name;
- bool operator==(const SourceAllocationIndex& o) const {
- return std::tie(upid, src_callstack_id, heap_name) ==
- std::tie(o.upid, o.src_callstack_id, o.heap_name);
- }
- struct Hasher {
- size_t operator()(const SourceAllocationIndex& o) const {
- return static_cast<size_t>(base::Hasher::Combine(
- o.upid, o.src_callstack_id, o.heap_name.raw_id()));
- }
- };
- };
-
- void AddAllocation(const SourceAllocation& alloc);
-
- // The following methods deal with interned data. In Android version Q we did
- // not intern Mappings, Frames nor Callstacks, instead the profile packed
- // "interned these" and this class keeps those ina sequence local index. In
- // newer versions, these objects are in InternedData (see
- // protos/perfetto/trace/interned_data) and are shared across multiple
- // ProfilePackets. For backwards compatibility, the following methods first
- // look up interned data in the private sequence local index (for values added
- // via the Add* methods), and then, if this lookup fails, in the InternedData
- // instead.
- std::optional<MappingId> FindOrInsertMapping(uint64_t iid);
- std::optional<CallsiteId> FindOrInsertCallstack(uint64_t iid);
-
- TraceProcessorContext* const context_;
-
- base::FlatHashMap<SourceStringId, std::string> strings_;
- base::FlatHashMap<SourceMappingId, MappingId> mappings_;
- base::FlatHashMap<SourceFrameId, FrameId> frames_;
- base::FlatHashMap<SourceCallstackId, CallsiteId> callstacks_;
-
- std::vector<SourceAllocation> pending_allocs_;
-
- struct Hasher {
- size_t operator()(const std::pair<UniquePid, CallsiteId>& p) const {
- return static_cast<size_t>(
- base::Hasher::Combine(p.first, p.second.value));
- }
- };
- base::FlatHashMap<std::pair<UniquePid, CallsiteId>,
- tables::HeapProfileAllocationTable::Row,
- Hasher>
- prev_alloc_;
- base::FlatHashMap<std::pair<UniquePid, CallsiteId>,
- tables::HeapProfileAllocationTable::Row,
- Hasher>
- prev_free_;
-
- // For continuous dumps, we only store the delta in the data-base. To do
- // this, we subtract the previous dump's value. Sometimes, we should not
- // do that subtraction, because heapprofd garbage collects stacks that
- // have no unfreed allocations. If the application then allocations again
- // at that stack, it gets recreated and initialized to zero.
- //
- // To correct for this, we add the previous' stacks value to the current
- // one, and then handle it as normal. If it is the first time we see a
- // SourceCallstackId for a CallsiteId, we put the previous value into
- // the correction maps below.
- base::FlatHashMap<SourceAllocationIndex,
- base::FlatSet<CallsiteId>,
- SourceAllocationIndex::Hasher>
- seen_callstacks_;
- base::FlatHashMap<SourceCallstackId, tables::HeapProfileAllocationTable::Row>
- alloc_correction_;
- base::FlatHashMap<SourceCallstackId, tables::HeapProfileAllocationTable::Row>
- free_correction_;
-
- std::optional<uint64_t> prev_index;
-};
-
-} // namespace trace_processor
-} // namespace perfetto
-
-#endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILE_PACKET_SEQUENCE_STATE_H_
diff --git a/src/trace_processor/importers/proto/profile_packet_utils.cc b/src/trace_processor/importers/proto/profile_packet_utils.cc
index 3cc5dc1..9478db9 100644
--- a/src/trace_processor/importers/proto/profile_packet_utils.cc
+++ b/src/trace_processor/importers/proto/profile_packet_utils.cc
@@ -15,27 +15,11 @@
*/
#include "src/trace_processor/importers/proto/profile_packet_utils.h"
-#include "perfetto/ext/base/string_utils.h"
namespace perfetto {
namespace trace_processor {
-// static
-std::string ProfilePacketUtils::MakeMappingName(
- const std::vector<base::StringView>& path_components) {
- std::string name;
- for (base::StringView p : path_components) {
- name.push_back('/');
- name.append(p.data(), p.size());
- }
-
- // When path strings just have single full path(like Chrome does), the mapping
- // path gets an extra '/' prepended, strip the extra '/'.
- if (base::StartsWith(name, "//")) {
- name = name.substr(1);
- }
- return name;
-}
+ProfilePacketInternLookup::~ProfilePacketInternLookup() = default;
} // namespace trace_processor
} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/profile_packet_utils.h b/src/trace_processor/importers/proto/profile_packet_utils.h
index a9ea0e6..64b2c50 100644
--- a/src/trace_processor/importers/proto/profile_packet_utils.h
+++ b/src/trace_processor/importers/proto/profile_packet_utils.h
@@ -20,7 +20,7 @@
#include "perfetto/ext/base/string_view.h"
#include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/importers/proto/profile_packet_sequence_state.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
@@ -31,12 +31,9 @@
class ProfilePacketUtils {
public:
- static std::string MakeMappingName(
- const std::vector<base::StringView>& path_components);
-
- static ProfilePacketSequenceState::SourceMapping MakeSourceMapping(
+ static SequenceStackProfileTracker::SourceMapping MakeSourceMapping(
const protos::pbzero::Mapping::Decoder& entry) {
- ProfilePacketSequenceState::SourceMapping src_mapping{};
+ SequenceStackProfileTracker::SourceMapping src_mapping{};
src_mapping.build_id = entry.build_id();
src_mapping.exact_offset = entry.exact_offset();
src_mapping.start_offset = entry.start_offset();
@@ -50,18 +47,18 @@
return src_mapping;
}
- static ProfilePacketSequenceState::SourceFrame MakeSourceFrame(
+ static SequenceStackProfileTracker::SourceFrame MakeSourceFrame(
const protos::pbzero::Frame::Decoder& entry) {
- ProfilePacketSequenceState::SourceFrame src_frame;
+ SequenceStackProfileTracker::SourceFrame src_frame;
src_frame.name_id = entry.function_name_id();
src_frame.mapping_id = entry.mapping_id();
src_frame.rel_pc = entry.rel_pc();
return src_frame;
}
- static ProfilePacketSequenceState::SourceCallstack MakeSourceCallstack(
+ static SequenceStackProfileTracker::SourceCallstack MakeSourceCallstack(
const protos::pbzero::Callstack::Decoder& entry) {
- ProfilePacketSequenceState::SourceCallstack src_callstack;
+ SequenceStackProfileTracker::SourceCallstack src_callstack;
for (auto frame_it = entry.frame_ids(); frame_it; ++frame_it)
src_callstack.emplace_back(*frame_it);
return src_callstack;
@@ -129,6 +126,76 @@
}
};
+class ProfilePacketInternLookup
+ : public SequenceStackProfileTracker::InternLookup {
+ public:
+ explicit ProfilePacketInternLookup(PacketSequenceStateGeneration* seq_state)
+ : seq_state_(seq_state) {}
+ ~ProfilePacketInternLookup() override;
+
+ std::optional<base::StringView> GetString(
+ SequenceStackProfileTracker::SourceStringId iid,
+ SequenceStackProfileTracker::InternedStringType type) const override {
+ protos::pbzero::InternedString::Decoder* decoder = nullptr;
+ switch (type) {
+ case SequenceStackProfileTracker::InternedStringType::kBuildId:
+ decoder = seq_state_->LookupInternedMessage<
+ protos::pbzero::InternedData::kBuildIdsFieldNumber,
+ protos::pbzero::InternedString>(iid);
+ break;
+ case SequenceStackProfileTracker::InternedStringType::kFunctionName:
+ decoder = seq_state_->LookupInternedMessage<
+ protos::pbzero::InternedData::kFunctionNamesFieldNumber,
+ protos::pbzero::InternedString>(iid);
+ break;
+ case SequenceStackProfileTracker::InternedStringType::kMappingPath:
+ decoder = seq_state_->LookupInternedMessage<
+ protos::pbzero::InternedData::kMappingPathsFieldNumber,
+ protos::pbzero::InternedString>(iid);
+ break;
+ }
+ if (!decoder)
+ return std::nullopt;
+ return base::StringView(reinterpret_cast<const char*>(decoder->str().data),
+ decoder->str().size);
+ }
+
+ std::optional<SequenceStackProfileTracker::SourceMapping> GetMapping(
+ SequenceStackProfileTracker::SourceMappingId iid) const override {
+ auto* decoder = seq_state_->LookupInternedMessage<
+ protos::pbzero::InternedData::kMappingsFieldNumber,
+ protos::pbzero::Mapping>(iid);
+ if (!decoder)
+ return std::nullopt;
+ return ProfilePacketUtils::MakeSourceMapping(*decoder);
+ }
+
+ std::optional<SequenceStackProfileTracker::SourceFrame> GetFrame(
+ SequenceStackProfileTracker::SourceFrameId iid) const override {
+ auto* decoder = seq_state_->LookupInternedMessage<
+ protos::pbzero::InternedData::kFramesFieldNumber,
+ protos::pbzero::Frame>(iid);
+ if (!decoder)
+ return std::nullopt;
+ return ProfilePacketUtils::MakeSourceFrame(*decoder);
+ }
+
+ std::optional<SequenceStackProfileTracker::SourceCallstack> GetCallstack(
+ SequenceStackProfileTracker::SourceCallstackId iid) const override {
+ auto* interned_message_view = seq_state_->GetInternedMessageView(
+ protos::pbzero::InternedData::kCallstacksFieldNumber, iid);
+ if (!interned_message_view)
+ return std::nullopt;
+ protos::pbzero::Callstack::Decoder decoder(
+ interned_message_view->message().data(),
+ interned_message_view->message().length());
+ return ProfilePacketUtils::MakeSourceCallstack(std::move(decoder));
+ }
+
+ private:
+ PacketSequenceStateGeneration* seq_state_;
+};
+
} // namespace trace_processor
} // namespace perfetto
diff --git a/src/trace_processor/util/profiler_util.cc b/src/trace_processor/importers/proto/profiler_util.cc
similarity index 98%
rename from src/trace_processor/util/profiler_util.cc
rename to src/trace_processor/importers/proto/profiler_util.cc
index 71c3c25..79a5448 100644
--- a/src/trace_processor/util/profiler_util.cc
+++ b/src/trace_processor/importers/proto/profiler_util.cc
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "src/trace_processor/util/profiler_util.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
#include <optional>
#include "perfetto/ext/base/string_utils.h"
diff --git a/src/trace_processor/util/profiler_util.h b/src/trace_processor/importers/proto/profiler_util.h
similarity index 86%
rename from src/trace_processor/util/profiler_util.h
rename to src/trace_processor/importers/proto/profiler_util.h
index 3af3606..cbf8ad1 100644
--- a/src/trace_processor/util/profiler_util.h
+++ b/src/trace_processor/importers/proto/profiler_util.h
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#ifndef SRC_TRACE_PROCESSOR_UTIL_PROFILER_UTIL_H_
-#define SRC_TRACE_PROCESSOR_UTIL_PROFILER_UTIL_H_
+#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILER_UTIL_H_
+#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILER_UTIL_H_
#include <optional>
#include <string>
@@ -38,4 +38,4 @@
} // namespace trace_processor
} // namespace perfetto
-#endif // SRC_TRACE_PROCESSOR_UTIL_PROFILER_UTIL_H_
+#endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_PROFILER_UTIL_H_
diff --git a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
index 148bf60..af96d34 100644
--- a/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
+++ b/src/trace_processor/importers/proto/proto_trace_parser_unittest.cc
@@ -28,12 +28,12 @@
#include "src/trace_processor/importers/common/metadata_tracker.h"
#include "src/trace_processor/importers/common/process_tracker.h"
#include "src/trace_processor/importers/common/slice_tracker.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
#include "src/trace_processor/importers/common/track_tracker.h"
#include "src/trace_processor/importers/ftrace/sched_event_tracker.h"
#include "src/trace_processor/importers/proto/additional_modules.h"
#include "src/trace_processor/importers/proto/default_modules.h"
#include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/storage/metadata.h"
#include "src/trace_processor/storage/trace_storage.h"
@@ -55,7 +55,6 @@
#include "protos/perfetto/trace/ftrace/sched.pbzero.h"
#include "protos/perfetto/trace/ftrace/task.pbzero.h"
#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
-#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
#include "protos/perfetto/trace/profiling/profile_packet.pbzero.h"
#include "protos/perfetto/trace/ps/process_tree.pbzero.h"
#include "protos/perfetto/trace/sys_stats/sys_stats.pbzero.h"
@@ -252,7 +251,8 @@
context_.track_tracker.reset(new TrackTracker(&context_));
context_.global_args_tracker.reset(
new GlobalArgsTracker(context_.storage.get()));
- context_.stack_profile_tracker.reset(new StackProfileTracker(&context_));
+ context_.global_stack_profile_tracker.reset(
+ new GlobalStackProfileTracker());
context_.args_tracker.reset(new ArgsTracker(&context_));
context_.args_translation_table.reset(new ArgsTranslationTable(storage_));
context_.metadata_tracker.reset(
diff --git a/src/trace_processor/importers/proto/proto_trace_reader.h b/src/trace_processor/importers/proto/proto_trace_reader.h
index 8afc40c..1c554a6 100644
--- a/src/trace_processor/importers/proto/proto_trace_reader.h
+++ b/src/trace_processor/importers/proto/proto_trace_reader.h
@@ -24,7 +24,6 @@
#include "src/trace_processor/importers/common/chunked_trace_reader.h"
#include "src/trace_processor/importers/proto/proto_incremental_state.h"
#include "src/trace_processor/importers/proto/proto_trace_tokenizer.h"
-#include "src/trace_processor/storage/trace_storage.h"
namespace protozero {
struct ConstBytes;
diff --git a/src/trace_processor/importers/proto/stack_profile_sequence_state.cc b/src/trace_processor/importers/proto/stack_profile_sequence_state.cc
deleted file mode 100644
index 693a1ed..0000000
--- a/src/trace_processor/importers/proto/stack_profile_sequence_state.cc
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2019 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/importers/proto/stack_profile_sequence_state.h"
-
-#include <optional>
-#include <vector>
-
-#include "perfetto/base/logging.h"
-#include "perfetto/ext/base/string_view.h"
-#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
-#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
-#include "src/trace_processor/importers/proto/profile_packet_utils.h"
-#include "src/trace_processor/storage/stats.h"
-#include "src/trace_processor/storage/trace_storage.h"
-#include "src/trace_processor/types/trace_processor_context.h"
-
-namespace perfetto {
-namespace trace_processor {
-namespace {
-base::StringView ToStringView(protozero::ConstBytes bytes) {
- return base::StringView(reinterpret_cast<const char*>(bytes.data),
- bytes.size);
-}
-} // namespace
-
-StackProfileSequenceState::StackProfileSequenceState(
- TraceProcessorContext* context)
- : context_(context) {}
-
-StackProfileSequenceState::~StackProfileSequenceState() = default;
-
-std::optional<MappingId> StackProfileSequenceState::FindOrInsertMapping(
- uint64_t iid) {
- if (MappingId* id = cached_mappings_.Find(iid); id) {
- return *id;
- }
- auto* decoder =
- LookupInternedMessage<protos::pbzero::InternedData::kMappingsFieldNumber,
- protos::pbzero::Mapping>(iid);
- if (!decoder) {
- context_->storage->IncrementStats(stats::stackprofile_invalid_mapping_id);
- return std::nullopt;
- }
-
- base::StringView build_id;
- if (decoder->has_build_id()) {
- std::optional<base::StringView> maybe_build_id =
- LookupInternedBuildId(decoder->build_id());
- if (!maybe_build_id) {
- return std::nullopt;
- }
- build_id = *maybe_build_id;
- }
-
- std::vector<base::StringView> path_components;
- for (auto it = decoder->path_string_ids(); it; ++it) {
- std::optional<base::StringView> str = LookupInternedMappingPath(*it);
- if (!str) {
- return std::nullopt;
- }
- path_components.push_back(*str);
- }
- std::string path = ProfilePacketUtils::MakeMappingName(path_components);
-
- StackProfileTracker::CreateMappingParams params;
- params.build_id = build_id;
- params.exact_offset = decoder->exact_offset();
- params.start_offset = decoder->start_offset();
- params.start = decoder->start();
- params.end = decoder->end();
- params.load_bias = decoder->load_bias();
- params.name = base::StringView(path);
- MappingId mapping_id = context_->stack_profile_tracker->InternMapping(params);
- cached_mappings_.Insert(iid, mapping_id);
- return mapping_id;
-}
-
-std::optional<base::StringView>
-StackProfileSequenceState::LookupInternedBuildId(uint64_t iid) {
- auto* decoder =
- LookupInternedMessage<protos::pbzero::InternedData::kBuildIdsFieldNumber,
- protos::pbzero::InternedString>(iid);
- if (!decoder) {
- context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
- return std::nullopt;
- }
-
- return ToStringView(decoder->str());
-}
-
-std::optional<base::StringView>
-StackProfileSequenceState::LookupInternedMappingPath(uint64_t iid) {
- auto* decoder =
-
- LookupInternedMessage<
- protos::pbzero::InternedData::kMappingPathsFieldNumber,
- protos::pbzero::InternedString>(iid);
- if (!decoder) {
- context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
- return std::nullopt;
- }
-
- return ToStringView(decoder->str());
-}
-
-std::optional<CallsiteId> StackProfileSequenceState::FindOrInsertCallstack(
- uint64_t iid) {
- if (CallsiteId* id = cached_callstacks_.Find(iid); id) {
- return *id;
- }
- auto* decoder = LookupInternedMessage<
- protos::pbzero::InternedData::kCallstacksFieldNumber,
- protos::pbzero::Callstack>(iid);
- if (!decoder) {
- context_->storage->IncrementStats(stats::stackprofile_invalid_callstack_id);
- return std::nullopt;
- }
-
- std::optional<CallsiteId> parent_callsite_id;
- uint32_t depth = 0;
- for (auto it = decoder->frame_ids(); it; ++it) {
- std::optional<FrameId> frame_id = FindOrInsertFrame(*it);
- if (!frame_id) {
- return std::nullopt;
- }
- parent_callsite_id = context_->stack_profile_tracker->InternCallsite(
- parent_callsite_id, *frame_id, depth);
- ++depth;
- }
-
- if (!parent_callsite_id) {
- context_->storage->IncrementStats(stats::stackprofile_empty_callstack);
- return std::nullopt;
- }
-
- cached_callstacks_.Insert(iid, *parent_callsite_id);
-
- return *parent_callsite_id;
-}
-
-std::optional<FrameId> StackProfileSequenceState::FindOrInsertFrame(
- uint64_t iid) {
- if (FrameId* id = cached_frames_.Find(iid); id) {
- return *id;
- }
- auto* decoder =
- LookupInternedMessage<protos::pbzero::InternedData::kFramesFieldNumber,
- protos::pbzero::Frame>(iid);
- if (!decoder) {
- context_->storage->IncrementStats(stats::stackprofile_invalid_frame_id);
- return std::nullopt;
- }
-
- std::optional<MappingId> mapping_id =
- FindOrInsertMapping(decoder->mapping_id());
- if (!mapping_id) {
- return std::nullopt;
- }
-
- base::StringView function_name;
- if (decoder->function_name_id() != 0) {
- std::optional<base::StringView> func =
- LookupInternedFunctionName(decoder->function_name_id());
- if (!func) {
- return std::nullopt;
- }
- function_name = *func;
- }
-
- FrameId frame_id = context_->stack_profile_tracker->InternFrame(
- *mapping_id, decoder->rel_pc(), function_name);
-
- cached_frames_.Insert(iid, frame_id);
-
- return frame_id;
-}
-
-std::optional<base::StringView>
-StackProfileSequenceState::LookupInternedFunctionName(uint64_t iid) {
- auto* decoder = LookupInternedMessage<
- protos::pbzero::InternedData::kFunctionNamesFieldNumber,
- protos::pbzero::InternedString>(iid);
- if (!decoder) {
- context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
- return std::nullopt;
- }
-
- return ToStringView(decoder->str());
-}
-
-} // namespace trace_processor
-} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/stack_profile_sequence_state.h b/src/trace_processor/importers/proto/stack_profile_sequence_state.h
deleted file mode 100644
index 7a7879a..0000000
--- a/src/trace_processor/importers/proto/stack_profile_sequence_state.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2019 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_IMPORTERS_PROTO_STACK_PROFILE_SEQUENCE_STATE_H_
-#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_SEQUENCE_STATE_H_
-
-#include <cstdint>
-#include <optional>
-
-#include "perfetto/ext/base/flat_hash_map.h"
-#include "perfetto/ext/base/string_view.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
-#include "src/trace_processor/storage/trace_storage.h"
-#include "src/trace_processor/types/trace_processor_context.h"
-
-namespace perfetto {
-namespace trace_processor {
-
-class TraceProcessorContext;
-
-class StackProfileSequenceState final
- : public PacketSequenceStateGeneration::InternedDataTracker {
- public:
- explicit StackProfileSequenceState(TraceProcessorContext* context);
-
- StackProfileSequenceState(const StackProfileSequenceState&);
-
- virtual ~StackProfileSequenceState() override;
-
- std::optional<MappingId> FindOrInsertMapping(uint64_t iid);
- std::optional<CallsiteId> FindOrInsertCallstack(uint64_t iid);
-
- private:
- std::optional<base::StringView> LookupInternedBuildId(uint64_t iid);
- std::optional<base::StringView> LookupInternedMappingPath(uint64_t iid);
- std::optional<base::StringView> LookupInternedFunctionName(uint64_t iid);
- std::optional<FrameId> FindOrInsertFrame(uint64_t iid);
-
- TraceProcessorContext* const context_;
- base::FlatHashMap<uint64_t, MappingId> cached_mappings_;
- base::FlatHashMap<uint64_t, CallsiteId> cached_callstacks_;
- base::FlatHashMap<uint64_t, FrameId> cached_frames_;
-};
-
-} // namespace trace_processor
-} // namespace perfetto
-
-#endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_SEQUENCE_STATE_H_
diff --git a/src/trace_processor/importers/proto/stack_profile_tracker.cc b/src/trace_processor/importers/proto/stack_profile_tracker.cc
new file mode 100644
index 0000000..d00f287
--- /dev/null
+++ b/src/trace_processor/importers/proto/stack_profile_tracker.cc
@@ -0,0 +1,368 @@
+/*
+ * Copyright (C) 2019 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/importers/proto/stack_profile_tracker.h"
+
+#include "perfetto/base/logging.h"
+#include "perfetto/ext/base/string_utils.h"
+#include "src/trace_processor/importers/proto/profiler_util.h"
+#include "src/trace_processor/types/trace_processor_context.h"
+#include "src/trace_processor/util/stack_traces_util.h"
+
+namespace perfetto {
+namespace trace_processor {
+
+SequenceStackProfileTracker::InternLookup::~InternLookup() = default;
+
+SequenceStackProfileTracker::SequenceStackProfileTracker(
+ TraceProcessorContext* context)
+ : context_(context), empty_(kNullStringId) {}
+
+SequenceStackProfileTracker::~SequenceStackProfileTracker() = default;
+
+StringId SequenceStackProfileTracker::GetEmptyStringId() {
+ if (empty_ == kNullStringId) {
+ empty_ = context_->storage->InternString({"", 0});
+ }
+
+ return empty_;
+}
+
+void SequenceStackProfileTracker::AddString(SourceStringId id,
+ base::StringView str) {
+ string_map_.emplace(id, str.ToStdString());
+}
+
+std::optional<MappingId> SequenceStackProfileTracker::AddMapping(
+ SourceMappingId id,
+ const SourceMapping& mapping,
+ const InternLookup* intern_lookup) {
+ std::string path;
+ for (SourceStringId str_id : mapping.name_ids) {
+ auto opt_str = FindOrInsertString(str_id, intern_lookup,
+ InternedStringType::kMappingPath);
+ if (!opt_str)
+ break;
+ path += "/" + *opt_str;
+ }
+ // When path strings just have single full path(like Chrome does), the mapping
+ // path gets an extra '/' prepended, strip the extra '/'.
+ if (base::StartsWith(path, "//")) {
+ path = path.substr(1);
+ }
+
+ auto opt_build_id = FindAndInternString(mapping.build_id, intern_lookup,
+ InternedStringType::kBuildId);
+ if (!opt_build_id) {
+ context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
+ PERFETTO_DLOG("Invalid string.");
+ return std::nullopt;
+ }
+ const StringId raw_build_id = opt_build_id.value();
+ NullTermStringView raw_build_id_str =
+ context_->storage->GetString(raw_build_id);
+ StringId build_id = GetEmptyStringId();
+ if (!raw_build_id_str.empty()) {
+ // If the build_id is 33 characters long, we assume it's a Breakpad debug
+ // identifier which is already in Hex and doesn't need conversion.
+ // TODO(b/148109467): Remove workaround once all active Chrome versions
+ // write raw bytes instead of a string as build_id.
+ if (util::IsHexModuleId(raw_build_id_str)) {
+ build_id = raw_build_id;
+ } else {
+ std::string hex_build_id =
+ base::ToHex(raw_build_id_str.c_str(), raw_build_id_str.size());
+ build_id =
+ context_->storage->InternString(base::StringView(hex_build_id));
+ }
+ }
+
+ tables::StackProfileMappingTable::Row row{
+ build_id,
+ static_cast<int64_t>(mapping.exact_offset),
+ static_cast<int64_t>(mapping.start_offset),
+ static_cast<int64_t>(mapping.start),
+ static_cast<int64_t>(mapping.end),
+ static_cast<int64_t>(mapping.load_bias),
+ context_->storage->InternString(base::StringView(path))};
+
+ tables::StackProfileMappingTable* mappings =
+ context_->storage->mutable_stack_profile_mapping_table();
+ std::optional<MappingId> cur_id;
+ auto it = mapping_idx_.find(row);
+ if (it != mapping_idx_.end()) {
+ cur_id = it->second;
+ } else {
+ std::vector<MappingId> db_mappings =
+ context_->global_stack_profile_tracker->FindMappingRow(row.name,
+ row.build_id);
+ for (const MappingId preexisting_mapping : db_mappings) {
+ uint32_t preexisting_row = *mappings->id().IndexOf(preexisting_mapping);
+ tables::StackProfileMappingTable::Row preexisting_data{
+ mappings->build_id()[preexisting_row],
+ mappings->exact_offset()[preexisting_row],
+ mappings->start_offset()[preexisting_row],
+ mappings->start()[preexisting_row],
+ mappings->end()[preexisting_row],
+ mappings->load_bias()[preexisting_row],
+ mappings->name()[preexisting_row]};
+
+ if (row == preexisting_data) {
+ cur_id = preexisting_mapping;
+ }
+ }
+ if (!cur_id) {
+ MappingId mapping_id = mappings->Insert(row).id;
+ context_->global_stack_profile_tracker->InsertMappingId(
+ row.name, row.build_id, mapping_id);
+ cur_id = mapping_id;
+ }
+ mapping_idx_.emplace(row, *cur_id);
+ }
+ mapping_ids_.emplace(id, *cur_id);
+ return cur_id;
+}
+
+std::optional<FrameId> SequenceStackProfileTracker::AddFrame(
+ SourceFrameId id,
+ const SourceFrame& frame,
+ const InternLookup* intern_lookup) {
+ std::optional<std::string> opt_name = FindOrInsertString(
+ frame.name_id, intern_lookup, InternedStringType::kFunctionName);
+ if (!opt_name) {
+ context_->storage->IncrementStats(stats::stackprofile_invalid_string_id);
+ PERFETTO_DLOG("Invalid string.");
+ return std::nullopt;
+ }
+ const std::string& name = *opt_name;
+ const StringId str_id =
+ context_->storage->InternString(base::StringView(name));
+
+ auto opt_mapping = FindOrInsertMapping(frame.mapping_id, intern_lookup);
+ if (!opt_mapping) {
+ context_->storage->IncrementStats(stats::stackprofile_invalid_mapping_id);
+ return std::nullopt;
+ }
+ MappingId mapping_id = *opt_mapping;
+ const auto& mappings = context_->storage->stack_profile_mapping_table();
+ StringId mapping_name_id =
+ mappings.name()[*mappings.id().IndexOf(mapping_id)];
+ auto mapping_name = context_->storage->GetString(mapping_name_id);
+
+ tables::StackProfileFrameTable::Row row{str_id, mapping_id,
+ static_cast<int64_t>(frame.rel_pc)};
+
+ auto* frames = context_->storage->mutable_stack_profile_frame_table();
+
+ std::optional<FrameId> cur_id;
+ auto it = frame_idx_.find(row);
+ if (it != frame_idx_.end()) {
+ cur_id = it->second;
+ } else {
+ std::vector<FrameId> db_frames =
+ context_->global_stack_profile_tracker->FindFrameIds(mapping_id,
+ frame.rel_pc);
+ for (const FrameId preexisting_frame : db_frames) {
+ uint32_t preexisting_row_id = *frames->id().IndexOf(preexisting_frame);
+ tables::StackProfileFrameTable::Row preexisting_row{
+ frames->name()[preexisting_row_id],
+ frames->mapping()[preexisting_row_id],
+ frames->rel_pc()[preexisting_row_id]};
+
+ if (row == preexisting_row) {
+ cur_id = preexisting_frame;
+ }
+ }
+ if (!cur_id) {
+ cur_id = frames->Insert(row).id;
+ context_->global_stack_profile_tracker->InsertFrameRow(
+ mapping_id, static_cast<uint64_t>(row.rel_pc), *cur_id);
+ if (base::Contains(name, '.')) {
+ // Java frames always contain a '.'
+ std::optional<std::string> package =
+ PackageFromLocation(context_->storage.get(), mapping_name);
+ if (package) {
+ NameInPackage nip{str_id, context_->storage->InternString(
+ base::StringView(*package))};
+ context_->global_stack_profile_tracker->InsertJavaFrameForName(
+ nip, *cur_id);
+ } else if (mapping_name.find("/memfd:") == 0) {
+ NameInPackage nip{str_id, context_->storage->InternString("memfd")};
+ context_->global_stack_profile_tracker->InsertJavaFrameForName(
+ nip, *cur_id);
+ }
+ }
+ }
+ frame_idx_.emplace(row, *cur_id);
+ }
+ frame_ids_.emplace(id, *cur_id);
+ return cur_id;
+}
+
+std::optional<CallsiteId> SequenceStackProfileTracker::AddCallstack(
+ SourceCallstackId id,
+ const SourceCallstack& frame_ids,
+ const InternLookup* intern_lookup) {
+ if (frame_ids.empty())
+ return std::nullopt;
+
+ std::optional<CallsiteId> parent_id;
+ for (uint32_t depth = 0; depth < frame_ids.size(); ++depth) {
+ auto opt_frame_id = FindOrInsertFrame(frame_ids[depth], intern_lookup);
+ if (!opt_frame_id) {
+ context_->storage->IncrementStats(stats::stackprofile_invalid_frame_id);
+ return std::nullopt;
+ }
+ FrameId frame_id = *opt_frame_id;
+
+ tables::StackProfileCallsiteTable::Row row{depth, parent_id, frame_id};
+ CallsiteId self_id;
+ auto callsite_it = callsite_idx_.find(row);
+ if (callsite_it != callsite_idx_.end()) {
+ self_id = callsite_it->second;
+ } else {
+ auto* callsite =
+ context_->storage->mutable_stack_profile_callsite_table();
+ self_id = callsite->Insert(row).id;
+ callsite_idx_.emplace(row, self_id);
+ }
+ parent_id = self_id;
+ }
+ PERFETTO_DCHECK(parent_id); // The loop ran at least once.
+ callstack_ids_.emplace(id, *parent_id);
+ return parent_id;
+}
+
+FrameId SequenceStackProfileTracker::GetDatabaseFrameIdForTesting(
+ SourceFrameId frame_id) {
+ auto it = frame_ids_.find(frame_id);
+ if (it == frame_ids_.end()) {
+ PERFETTO_DLOG("Invalid frame.");
+ return {};
+ }
+ return it->second;
+}
+
+std::optional<StringId> SequenceStackProfileTracker::FindAndInternString(
+ SourceStringId id,
+ const InternLookup* intern_lookup,
+ SequenceStackProfileTracker::InternedStringType type) {
+ if (id == 0)
+ return GetEmptyStringId();
+
+ auto opt_str = FindOrInsertString(id, intern_lookup, type);
+ if (!opt_str)
+ return GetEmptyStringId();
+
+ return context_->storage->InternString(base::StringView(*opt_str));
+}
+
+std::optional<std::string> SequenceStackProfileTracker::FindOrInsertString(
+ SourceStringId id,
+ const InternLookup* intern_lookup,
+ SequenceStackProfileTracker::InternedStringType type) {
+ if (id == 0)
+ return "";
+
+ auto it = string_map_.find(id);
+ if (it == string_map_.end()) {
+ if (intern_lookup) {
+ auto str = intern_lookup->GetString(id, type);
+ if (!str) {
+ context_->storage->IncrementStats(
+ stats::stackprofile_invalid_string_id);
+ PERFETTO_DLOG("Invalid string.");
+ return std::nullopt;
+ }
+ return str->ToStdString();
+ }
+ return std::nullopt;
+ }
+
+ return it->second;
+}
+
+std::optional<MappingId> SequenceStackProfileTracker::FindOrInsertMapping(
+ SourceMappingId mapping_id,
+ const InternLookup* intern_lookup) {
+ std::optional<MappingId> res;
+ auto it = mapping_ids_.find(mapping_id);
+ if (it == mapping_ids_.end()) {
+ if (intern_lookup) {
+ auto interned_mapping = intern_lookup->GetMapping(mapping_id);
+ if (interned_mapping) {
+ res = AddMapping(mapping_id, *interned_mapping, intern_lookup);
+ return res;
+ }
+ }
+ context_->storage->IncrementStats(stats::stackprofile_invalid_mapping_id);
+ return res;
+ }
+ res = it->second;
+ return res;
+}
+
+std::optional<FrameId> SequenceStackProfileTracker::FindOrInsertFrame(
+ SourceFrameId frame_id,
+ const InternLookup* intern_lookup) {
+ std::optional<FrameId> res;
+ auto it = frame_ids_.find(frame_id);
+ if (it == frame_ids_.end()) {
+ if (intern_lookup) {
+ auto interned_frame = intern_lookup->GetFrame(frame_id);
+ if (interned_frame) {
+ res = AddFrame(frame_id, *interned_frame, intern_lookup);
+ return res;
+ }
+ }
+ context_->storage->IncrementStats(stats::stackprofile_invalid_frame_id);
+ PERFETTO_DLOG("Unknown frame %" PRIu64 " : %zu", frame_id,
+ frame_ids_.size());
+ return res;
+ }
+ res = it->second;
+ return res;
+}
+
+std::optional<CallsiteId> SequenceStackProfileTracker::FindOrInsertCallstack(
+ SourceCallstackId callstack_id,
+ const InternLookup* intern_lookup) {
+ std::optional<CallsiteId> res;
+ auto it = callstack_ids_.find(callstack_id);
+ if (it == callstack_ids_.end()) {
+ auto interned_callstack = intern_lookup->GetCallstack(callstack_id);
+ if (interned_callstack) {
+ res = AddCallstack(callstack_id, *interned_callstack, intern_lookup);
+ return res;
+ }
+ context_->storage->IncrementStats(stats::stackprofile_invalid_callstack_id);
+ PERFETTO_DLOG("Unknown callstack %" PRIu64 " : %zu", callstack_id,
+ callstack_ids_.size());
+ return res;
+ }
+ res = it->second;
+ return res;
+}
+
+void SequenceStackProfileTracker::ClearIndices() {
+ string_map_.clear();
+ mapping_ids_.clear();
+ callstack_ids_.clear();
+ frame_ids_.clear();
+}
+
+} // namespace trace_processor
+} // namespace perfetto
diff --git a/src/trace_processor/importers/proto/stack_profile_tracker.h b/src/trace_processor/importers/proto/stack_profile_tracker.h
new file mode 100644
index 0000000..a29d3c1
--- /dev/null
+++ b/src/trace_processor/importers/proto/stack_profile_tracker.h
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2019 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_IMPORTERS_PROTO_STACK_PROFILE_TRACKER_H_
+#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_TRACKER_H_
+
+#include <deque>
+#include <optional>
+#include <unordered_map>
+
+#include "src/trace_processor/storage/trace_storage.h"
+#include "src/trace_processor/tables/profiler_tables_py.h"
+
+#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
+#include "protos/perfetto/trace/profiling/profile_packet.pbzero.h"
+
+template <>
+struct std::hash<std::pair<uint32_t, int64_t>> {
+ using argument_type = std::pair<uint32_t, int64_t>;
+ using result_type = size_t;
+
+ result_type operator()(const argument_type& p) const {
+ return std::hash<uint32_t>{}(p.first) ^ std::hash<int64_t>{}(p.second);
+ }
+};
+
+template <>
+struct std::hash<std::pair<uint32_t, perfetto::trace_processor::CallsiteId>> {
+ using argument_type =
+ std::pair<uint32_t, perfetto::trace_processor::CallsiteId>;
+ using result_type = size_t;
+
+ result_type operator()(const argument_type& p) const {
+ return std::hash<uint32_t>{}(p.first) ^
+ std::hash<uint32_t>{}(p.second.value);
+ }
+};
+
+template <>
+struct std::hash<std::pair<uint32_t, perfetto::trace_processor::MappingId>> {
+ using argument_type =
+ std::pair<uint32_t, perfetto::trace_processor::MappingId>;
+ using result_type = size_t;
+
+ result_type operator()(const argument_type& p) const {
+ return std::hash<uint32_t>{}(p.first) ^
+ std::hash<uint32_t>{}(p.second.value);
+ }
+};
+
+template <>
+struct std::hash<std::pair<uint32_t, perfetto::trace_processor::FrameId>> {
+ using argument_type = std::pair<uint32_t, perfetto::trace_processor::FrameId>;
+ using result_type = size_t;
+
+ result_type operator()(const argument_type& p) const {
+ return std::hash<uint32_t>{}(p.first) ^
+ std::hash<uint32_t>{}(p.second.value);
+ }
+};
+
+template <>
+struct std::hash<std::vector<uint64_t>> {
+ using argument_type = std::vector<uint64_t>;
+ using result_type = size_t;
+
+ result_type operator()(const argument_type& p) const {
+ size_t h = 0u;
+ for (auto v : p)
+ h = h ^ std::hash<uint64_t>{}(v);
+ return h;
+ }
+};
+
+namespace perfetto {
+namespace trace_processor {
+
+struct NameInPackage {
+ StringId name;
+ StringId package;
+
+ bool operator<(const NameInPackage& b) const {
+ return std::tie(name, package) < std::tie(b.name, b.package);
+ }
+};
+
+class TraceProcessorContext;
+
+class GlobalStackProfileTracker {
+ public:
+ std::vector<MappingId> FindMappingRow(StringId name,
+ StringId build_id) const {
+ auto it = stack_profile_mapping_index_.find(std::make_pair(name, build_id));
+ if (it == stack_profile_mapping_index_.end())
+ return {};
+ return it->second;
+ }
+
+ void InsertMappingId(StringId name, StringId build_id, MappingId row) {
+ auto pair = std::make_pair(name, build_id);
+ stack_profile_mapping_index_[pair].emplace_back(row);
+ }
+
+ std::vector<FrameId> FindFrameIds(MappingId mapping_row,
+ uint64_t rel_pc) const {
+ auto it =
+ stack_profile_frame_index_.find(std::make_pair(mapping_row, rel_pc));
+ if (it == stack_profile_frame_index_.end())
+ return {};
+ return it->second;
+ }
+
+ void InsertFrameRow(MappingId mapping_row, uint64_t rel_pc, FrameId row) {
+ auto pair = std::make_pair(mapping_row, rel_pc);
+ stack_profile_frame_index_[pair].emplace_back(row);
+ }
+
+ const std::vector<tables::StackProfileFrameTable::Id>* JavaFramesForName(
+ NameInPackage name) {
+ auto it = java_frames_for_name_.find(name);
+ if (it == java_frames_for_name_.end())
+ return nullptr;
+ return &it->second;
+ }
+
+ void InsertJavaFrameForName(NameInPackage name,
+ tables::StackProfileFrameTable::Id id) {
+ java_frames_for_name_[name].push_back(id);
+ }
+
+ private:
+ using MappingKey = std::pair<StringId /* name */, StringId /* build id */>;
+ std::map<MappingKey, std::vector<MappingId>> stack_profile_mapping_index_;
+
+ using FrameKey = std::pair<MappingId, uint64_t /* rel_pc */>;
+ std::map<FrameKey, std::vector<FrameId>> stack_profile_frame_index_;
+
+ std::map<NameInPackage, std::vector<tables::StackProfileFrameTable::Id>>
+ java_frames_for_name_;
+};
+
+// TODO(lalitm): Overhaul this class to make row vs id consistent and use
+// base::Optional instead of int64_t.
+class SequenceStackProfileTracker {
+ public:
+ using SourceStringId = uint64_t;
+
+ enum class InternedStringType {
+ kMappingPath,
+ kBuildId,
+ kFunctionName,
+ };
+
+ struct SourceMapping {
+ SourceStringId build_id = 0;
+ uint64_t exact_offset = 0;
+ uint64_t start_offset = 0;
+ uint64_t start = 0;
+ uint64_t end = 0;
+ uint64_t load_bias = 0;
+ std::vector<SourceStringId> name_ids;
+ };
+ using SourceMappingId = uint64_t;
+
+ struct SourceFrame {
+ SourceStringId name_id = 0;
+ SourceMappingId mapping_id = 0;
+ uint64_t rel_pc = 0;
+ };
+ using SourceFrameId = uint64_t;
+
+ using SourceCallstack = std::vector<SourceFrameId>;
+ using SourceCallstackId = uint64_t;
+
+ struct SourceAllocation {
+ uint64_t pid = 0;
+ // This is int64_t, because we get this from the TraceSorter which also
+ // converts this for us.
+ int64_t timestamp = 0;
+ SourceCallstackId callstack_id = 0;
+ uint64_t self_allocated = 0;
+ uint64_t self_freed = 0;
+ uint64_t alloc_count = 0;
+ uint64_t free_count = 0;
+ };
+
+ class InternLookup {
+ public:
+ virtual ~InternLookup();
+
+ virtual std::optional<base::StringView> GetString(
+ SourceStringId,
+ InternedStringType) const = 0;
+ virtual std::optional<SourceMapping> GetMapping(SourceMappingId) const = 0;
+ virtual std::optional<SourceFrame> GetFrame(SourceFrameId) const = 0;
+ virtual std::optional<SourceCallstack> GetCallstack(
+ SourceCallstackId) const = 0;
+ };
+
+ explicit SequenceStackProfileTracker(TraceProcessorContext* context);
+ ~SequenceStackProfileTracker();
+
+ void AddString(SourceStringId, base::StringView);
+ std::optional<MappingId> AddMapping(
+ SourceMappingId,
+ const SourceMapping&,
+ const InternLookup* intern_lookup = nullptr);
+ std::optional<FrameId> AddFrame(SourceFrameId,
+ const SourceFrame&,
+ const InternLookup* intern_lookup = nullptr);
+ std::optional<CallsiteId> AddCallstack(
+ SourceCallstackId,
+ const SourceCallstack&,
+ const InternLookup* intern_lookup = nullptr);
+
+ FrameId GetDatabaseFrameIdForTesting(SourceFrameId);
+
+ // Gets the row number of string / mapping / frame / callstack previously
+ // added through AddString / AddMapping/ AddFrame / AddCallstack.
+ //
+ // If it is not found, look up the string / mapping / frame / callstack in
+ // the global InternedData state, and if found, add to the database, if not
+ // already added before.
+ //
+ // This is to support both ProfilePackets that contain the interned data
+ // (for Android Q) and where the interned data is kept globally in
+ // InternedData (for versions newer than Q).
+ std::optional<StringId> FindAndInternString(SourceStringId,
+ const InternLookup* intern_lookup,
+ InternedStringType type);
+ std::optional<std::string> FindOrInsertString(
+ SourceStringId,
+ const InternLookup* intern_lookup,
+ InternedStringType type);
+ std::optional<MappingId> FindOrInsertMapping(
+ SourceMappingId,
+ const InternLookup* intern_lookup);
+ std::optional<FrameId> FindOrInsertFrame(SourceFrameId,
+ const InternLookup* intern_lookup);
+
+ std::optional<CallsiteId> FindOrInsertCallstack(
+ SourceCallstackId,
+ const InternLookup* intern_lookup);
+
+ // Clear indices when they're no longer needed.
+ void ClearIndices();
+
+ private:
+ StringId GetEmptyStringId();
+
+ std::unordered_map<SourceStringId, std::string> string_map_;
+
+ // Mapping from ID of mapping / frame / callstack in original trace and the
+ // index in the respective table it was inserted into.
+ std::unordered_map<SourceMappingId, MappingId> mapping_ids_;
+ std::unordered_map<SourceFrameId, FrameId> frame_ids_;
+ std::unordered_map<SourceCallstackId, CallsiteId> callstack_ids_;
+
+ // TODO(oysteine): Share these indices between the StackProfileTrackers,
+ // since they're not sequence-specific.
+ //
+ // Mapping from content of database row to the index of the raw.
+ std::unordered_map<tables::StackProfileMappingTable::Row, MappingId>
+ mapping_idx_;
+ std::unordered_map<tables::StackProfileFrameTable::Row, FrameId> frame_idx_;
+ std::unordered_map<tables::StackProfileCallsiteTable::Row, CallsiteId>
+ callsite_idx_;
+
+ TraceProcessorContext* const context_;
+ StringId empty_;
+};
+
+} // namespace trace_processor
+} // namespace perfetto
+
+#endif // SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_STACK_PROFILE_TRACKER_H_
diff --git a/src/trace_processor/importers/proto/track_event_parser.cc b/src/trace_processor/importers/proto/track_event_parser.cc
index 00bf52e..06e5c39 100644
--- a/src/trace_processor/importers/proto/track_event_parser.cc
+++ b/src/trace_processor/importers/proto/track_event_parser.cc
@@ -34,7 +34,6 @@
#include "src/trace_processor/importers/proto/packet_analyzer.h"
#include "src/trace_processor/importers/proto/packet_sequence_state.h"
#include "src/trace_processor/importers/proto/profile_packet_utils.h"
-#include "src/trace_processor/importers/proto/stack_profile_sequence_state.h"
#include "src/trace_processor/importers/proto/track_event_tracker.h"
#include "src/trace_processor/util/debug_annotation_parser.h"
#include "src/trace_processor/util/proto_to_args_parser.h"
@@ -196,9 +195,12 @@
}
// Interned mapping_id loses it's meaning when the sequence ends. So we need
// to get an id from stack_profile_mapping table.
- auto mapping_id = delegate.seq_state()
- ->GetOrCreate<StackProfileSequenceState>()
- ->FindOrInsertMapping(decoder->mapping_id());
+ ProfilePacketInternLookup intern_lookup(delegate.seq_state());
+ auto mapping_id =
+ delegate.seq_state()
+ ->state()
+ ->sequence_stack_profile_tracker()
+ .FindOrInsertMapping(decoder->mapping_id(), &intern_lookup);
if (!mapping_id) {
return std::nullopt;
}
diff --git a/src/trace_processor/importers/proto/v8_module.cc b/src/trace_processor/importers/proto/v8_module.cc
index 94684e3..ac2086a 100644
--- a/src/trace_processor/importers/proto/v8_module.cc
+++ b/src/trace_processor/importers/proto/v8_module.cc
@@ -88,7 +88,8 @@
void V8Module::ParseV8JsCode(protozero::ConstBytes bytes,
int64_t ts,
const TracePacketData& data) {
- V8SequenceState& state = *data.sequence_state->GetOrCreate<V8SequenceState>();
+ V8SequenceState& state =
+ *V8SequenceState::GetOrCreate(data.sequence_state->state());
V8JsCode::Decoder code(bytes);
@@ -109,7 +110,8 @@
void V8Module::ParseV8InternalCode(protozero::ConstBytes bytes,
int64_t ts,
const TracePacketData& data) {
- V8SequenceState& state = *data.sequence_state->GetOrCreate<V8SequenceState>();
+ V8SequenceState& state =
+ *V8SequenceState::GetOrCreate(data.sequence_state->state());
V8InternalCode::Decoder code(bytes);
@@ -124,7 +126,8 @@
void V8Module::ParseV8WasmCode(protozero::ConstBytes bytes,
int64_t ts,
const TracePacketData& data) {
- V8SequenceState& state = *data.sequence_state->GetOrCreate<V8SequenceState>();
+ V8SequenceState& state =
+ *V8SequenceState::GetOrCreate(data.sequence_state->state());
V8WasmCode::Decoder code(bytes);
@@ -145,7 +148,8 @@
void V8Module::ParseV8RegExpCode(protozero::ConstBytes bytes,
int64_t ts,
const TracePacketData& data) {
- V8SequenceState& state = *data.sequence_state->GetOrCreate<V8SequenceState>();
+ V8SequenceState& state =
+ *V8SequenceState::GetOrCreate(data.sequence_state->state());
V8RegExpCode::Decoder code(bytes);
@@ -160,7 +164,8 @@
void V8Module::ParseV8CodeMove(protozero::ConstBytes bytes,
int64_t,
const TracePacketData& data) {
- V8SequenceState& state = *data.sequence_state->GetOrCreate<V8SequenceState>();
+ V8SequenceState& state =
+ *V8SequenceState::GetOrCreate(data.sequence_state->state());
protos::pbzero::V8CodeMove::Decoder v8_code_move(bytes);
std::optional<tables::V8IsolateTable::Id> isolate_id =
diff --git a/src/trace_processor/importers/proto/v8_sequence_state.cc b/src/trace_processor/importers/proto/v8_sequence_state.cc
index 33abb24..946ab22 100644
--- a/src/trace_processor/importers/proto/v8_sequence_state.cc
+++ b/src/trace_processor/importers/proto/v8_sequence_state.cc
@@ -17,10 +17,10 @@
#include "src/trace_processor/importers/proto/v8_sequence_state.h"
#include <optional>
+#include "perfetto/ext/base/string_utils.h"
#include "protos/perfetto/trace/chrome/v8.pbzero.h"
#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
#include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
#include "src/trace_processor/importers/proto/string_encoding_utils.h"
#include "src/trace_processor/importers/proto/v8_tracker.h"
#include "src/trace_processor/storage/stats.h"
@@ -41,8 +41,9 @@
} // namespace
-V8SequenceState::V8SequenceState(TraceProcessorContext* context)
- : context_(context), v8_tracker_(V8Tracker::GetOrCreate(context_)) {}
+V8SequenceState::V8SequenceState(PacketSequenceState* sequence_state)
+ : sequence_state_(sequence_state),
+ v8_tracker_(V8Tracker::GetOrCreate(sequence_state->context())) {}
V8SequenceState::~V8SequenceState() = default;
@@ -52,9 +53,11 @@
return *id;
}
- auto* view = GetInternedMessageView(InternedData::kV8IsolateFieldNumber, iid);
+ auto* view = sequence_state_->current_generation()->GetInternedMessageView(
+ InternedData::kV8IsolateFieldNumber, iid);
if (!view) {
- context_->storage->IncrementStats(stats::v8_intern_errors);
+ sequence_state_->context()->storage->IncrementStats(
+ stats::v8_intern_errors);
return std::nullopt;
}
@@ -70,10 +73,11 @@
return *id;
}
- auto* view =
- GetInternedMessageView(InternedData::kV8JsFunctionFieldNumber, iid);
+ auto* view = sequence_state_->current_generation()->GetInternedMessageView(
+ InternedData::kV8JsFunctionFieldNumber, iid);
if (!view) {
- context_->storage->IncrementStats(stats::v8_intern_errors);
+ sequence_state_->context()->storage->IncrementStats(
+ stats::v8_intern_errors);
return std::nullopt;
}
@@ -103,10 +107,11 @@
if (auto* id = wasm_scripts_.Find(iid); id != nullptr) {
return *id;
}
- auto* view =
- GetInternedMessageView(InternedData::kV8WasmScriptFieldNumber, iid);
+ auto* view = sequence_state_->current_generation()->GetInternedMessageView(
+ InternedData::kV8WasmScriptFieldNumber, iid);
if (!view) {
- context_->storage->IncrementStats(stats::v8_intern_errors);
+ sequence_state_->context()->storage->IncrementStats(
+ stats::v8_intern_errors);
return std::nullopt;
}
@@ -122,10 +127,11 @@
if (auto* id = js_scripts_.Find(iid); id != nullptr) {
return *id;
}
- auto* view =
- GetInternedMessageView(InternedData::kV8JsScriptFieldNumber, iid);
+ auto* view = sequence_state_->current_generation()->GetInternedMessageView(
+ InternedData::kV8JsScriptFieldNumber, iid);
if (!view) {
- context_->storage->IncrementStats(stats::v8_intern_errors);
+ sequence_state_->context()->storage->IncrementStats(
+ stats::v8_intern_errors);
return std::nullopt;
}
@@ -141,16 +147,17 @@
return *id;
}
- auto* view =
- GetInternedMessageView(InternedData::kV8JsFunctionNameFieldNumber, iid);
+ auto* view = sequence_state_->current_generation()->GetInternedMessageView(
+ InternedData::kV8JsFunctionNameFieldNumber, iid);
if (!view) {
- context_->storage->IncrementStats(stats::v8_intern_errors);
+ sequence_state_->context()->storage->IncrementStats(
+ stats::v8_intern_errors);
return std::nullopt;
}
InternedV8String::Decoder function_name(ToConstBytes(view->message()));
- auto& storage = *context_->storage;
+ auto& storage = *sequence_state_->context()->storage;
StringId id;
if (function_name.has_latin1()) {
id = storage.InternString(
diff --git a/src/trace_processor/importers/proto/v8_sequence_state.h b/src/trace_processor/importers/proto/v8_sequence_state.h
index d2e008a..781960d 100644
--- a/src/trace_processor/importers/proto/v8_sequence_state.h
+++ b/src/trace_processor/importers/proto/v8_sequence_state.h
@@ -21,7 +21,7 @@
#include <optional>
#include "perfetto/ext/base/flat_hash_map.h"
-#include "src/trace_processor/importers/proto/packet_sequence_state_generation.h"
+#include "src/trace_processor/importers/proto/packet_sequence_state.h"
#include "src/trace_processor/storage/trace_storage.h"
#include "src/trace_processor/tables/v8_tables_py.h"
#include "src/trace_processor/types/destructible.h"
@@ -29,14 +29,19 @@
namespace perfetto {
namespace trace_processor {
-class TraceProcessorContext;
class V8Tracker;
// Helper class to deal with V8 related interned data.
-class V8SequenceState final
- : public PacketSequenceStateGeneration::InternedDataTracker {
+class V8SequenceState : public Destructible {
public:
- explicit V8SequenceState(TraceProcessorContext* context);
+ static V8SequenceState* GetOrCreate(PacketSequenceState* sequence_state) {
+ auto& v8_sequence_state =
+ sequence_state->extensible_sequence_state().v8_sequence_state;
+ if (!v8_sequence_state) {
+ v8_sequence_state.reset(new V8SequenceState(sequence_state));
+ }
+ return static_cast<V8SequenceState*>(v8_sequence_state.get());
+ }
~V8SequenceState() override;
@@ -49,12 +54,13 @@
tables::V8IsolateTable::Id isolate_id);
private:
+ explicit V8SequenceState(PacketSequenceState* sequence_state);
std::optional<tables::V8JsScriptTable::Id> GetOrInsertJsScript(
uint64_t iid,
tables::V8IsolateTable::Id isolate_id);
std::optional<StringId> GetOrInsertJsFunctionName(uint64_t iid);
- TraceProcessorContext* const context_;
+ PacketSequenceState* const sequence_state_;
V8Tracker* const v8_tracker_;
using InterningId = uint64_t;
diff --git a/src/trace_processor/importers/proto/vulkan_memory_tracker.h b/src/trace_processor/importers/proto/vulkan_memory_tracker.h
index 9d1afc5..1457923 100644
--- a/src/trace_processor/importers/proto/vulkan_memory_tracker.h
+++ b/src/trace_processor/importers/proto/vulkan_memory_tracker.h
@@ -17,7 +17,6 @@
#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_VULKAN_MEMORY_TRACKER_H_
#define SRC_TRACE_PROCESSOR_IMPORTERS_PROTO_VULKAN_MEMORY_TRACKER_H_
-#include "protos/perfetto/trace/profiling/profile_common.pbzero.h"
#include "src/trace_processor/importers/proto/proto_incremental_state.h"
#include "src/trace_processor/storage/trace_storage.h"
diff --git a/src/trace_processor/importers/proto/winscope/protolog_parser.h b/src/trace_processor/importers/proto/winscope/protolog_parser.h
index 97d9183..fbcf9d9 100644
--- a/src/trace_processor/importers/proto/winscope/protolog_parser.h
+++ b/src/trace_processor/importers/proto/winscope/protolog_parser.h
@@ -19,7 +19,6 @@
#include "protos/perfetto/trace/android/protolog.pbzero.h"
#include "src/trace_processor/importers/proto/packet_sequence_state.h"
-#include "src/trace_processor/storage/trace_storage.h"
#include "src/trace_processor/util/descriptors.h"
#include "src/trace_processor/util/proto_to_args_parser.h"
diff --git a/src/trace_processor/importers/syscalls/syscall_tracker_unittest.cc b/src/trace_processor/importers/syscalls/syscall_tracker_unittest.cc
index d57d6de..f424a75 100644
--- a/src/trace_processor/importers/syscalls/syscall_tracker_unittest.cc
+++ b/src/trace_processor/importers/syscalls/syscall_tracker_unittest.cc
@@ -83,7 +83,7 @@
EXPECT_EQ(context.storage->GetString(end_name), "sys_57");
}
-TEST_F(SyscallTrackerTest, Aarch64) {
+TEST_F(SyscallTrackerTest, Arm64) {
constexpr TrackId track{0u};
StringId begin_name = kNullStringId;
StringId end_name = kNullStringId;
@@ -93,7 +93,7 @@
.WillOnce(DoAll(SaveArg<3>(&end_name), Return(std::nullopt)));
SyscallTracker* syscall_tracker = SyscallTracker::GetOrCreate(&context);
- syscall_tracker->SetArchitecture(Architecture::kAarch64);
+ syscall_tracker->SetArchitecture(Architecture::kArm64);
syscall_tracker->Enter(100 /*ts*/, 42 /*utid*/, 63 /*sys_read*/);
syscall_tracker->Exit(110 /*ts*/, 42 /*utid*/, 63 /*sys_read*/);
EXPECT_EQ(context.storage->GetString(begin_name), "sys_read");
@@ -122,7 +122,7 @@
EXPECT_CALL(*slice_tracker, End(_, _, _, _, _)).Times(0);
SyscallTracker* syscall_tracker = SyscallTracker::GetOrCreate(&context);
- syscall_tracker->SetArchitecture(Architecture::kAarch64);
+ syscall_tracker->SetArchitecture(Architecture::kArm64);
syscall_tracker->Enter(100 /*ts*/, 42 /*utid*/, 9999);
syscall_tracker->Exit(110 /*ts*/, 42 /*utid*/, 9999);
}
diff --git a/src/trace_processor/metrics/sql/android/android_batt.sql b/src/trace_processor/metrics/sql/android/android_batt.sql
index 4ec27b3..a6cc552 100644
--- a/src/trace_processor/metrics/sql/android/android_batt.sql
+++ b/src/trace_processor/metrics/sql/android/android_batt.sql
@@ -60,7 +60,7 @@
DROP TABLE IF EXISTS screen_state_span;
CREATE PERFETTO TABLE screen_state_span AS
WITH screen_state AS (
- SELECT *
+ SELECT counter.id, ts, 0 AS track_id, value
FROM counter
JOIN counter_track ON counter_track.id = counter.track_id
WHERE name = 'ScreenState'
diff --git a/src/trace_processor/metrics/sql/android/android_binder.sql b/src/trace_processor/metrics/sql/android/android_binder.sql
index a1b8661..1c41e60 100644
--- a/src/trace_processor/metrics/sql/android/android_binder.sql
+++ b/src/trace_processor/metrics/sql/android/android_binder.sql
@@ -57,6 +57,8 @@
'server_pid', server_pid,
'server_oom_score', server_oom_score,
'is_sync', is_sync,
+ 'client_monotonic_dur', client_monotonic_dur,
+ 'server_monotonic_dur', server_monotonic_dur,
'client_package_version_code', client_package_version_code,
'server_package_version_code', server_package_version_code,
'is_client_package_debuggable', is_client_package_debuggable,
diff --git a/src/trace_processor/metrics/sql/android/android_cpu_agg.sql b/src/trace_processor/metrics/sql/android/android_cpu_agg.sql
index 71d3847..619d560 100644
--- a/src/trace_processor/metrics/sql/android/android_cpu_agg.sql
+++ b/src/trace_processor/metrics/sql/android/android_cpu_agg.sql
@@ -21,7 +21,7 @@
SELECT
cpu,
ts,
- LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
+ LEAD(ts, 1, trace_end())
OVER (PARTITION BY cpu ORDER BY ts) - ts AS dur,
CAST(value AS INT) AS freq_khz
FROM counter
diff --git a/src/trace_processor/metrics/sql/android/android_dma_heap.sql b/src/trace_processor/metrics/sql/android/android_dma_heap.sql
index ae80ac5..03813f7 100644
--- a/src/trace_processor/metrics/sql/android/android_dma_heap.sql
+++ b/src/trace_processor/metrics/sql/android/android_dma_heap.sql
@@ -18,7 +18,7 @@
CREATE PERFETTO VIEW dma_heap_timeline AS
SELECT
ts,
- LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
+ LEAD(ts, 1, trace_end())
OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
track_id,
value
diff --git a/src/trace_processor/metrics/sql/android/android_dvfs.sql b/src/trace_processor/metrics/sql/android/android_dvfs.sql
index 6ec1bb2..6366256 100644
--- a/src/trace_processor/metrics/sql/android/android_dvfs.sql
+++ b/src/trace_processor/metrics/sql/android/android_dvfs.sql
@@ -21,8 +21,7 @@
track.name AS freq_name,
ts,
value AS freq_value,
- LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
- OVER (PARTITION BY track.id ORDER BY ts) - ts AS duration
+ LEAD(ts, 1, trace_end()) OVER (PARTITION BY track.id ORDER BY ts) - ts AS duration
FROM counter
LEFT JOIN track ON counter.track_id = track.id
WHERE track.name GLOB "* Frequency"
diff --git a/src/trace_processor/metrics/sql/android/android_fastrpc.sql b/src/trace_processor/metrics/sql/android/android_fastrpc.sql
index d895b42..6d174de 100644
--- a/src/trace_processor/metrics/sql/android/android_fastrpc.sql
+++ b/src/trace_processor/metrics/sql/android/android_fastrpc.sql
@@ -2,7 +2,7 @@
CREATE PERFETTO VIEW fastrpc_timeline AS
SELECT
ts,
- LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
+ LEAD(ts, 1, trace_end())
OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
RTRIM(SUBSTR(name, 13), ']') AS subsystem_name,
track_id,
diff --git a/src/trace_processor/metrics/sql/android/android_ion.sql b/src/trace_processor/metrics/sql/android/android_ion.sql
index a6bdf07..1071eef 100644
--- a/src/trace_processor/metrics/sql/android/android_ion.sql
+++ b/src/trace_processor/metrics/sql/android/android_ion.sql
@@ -18,7 +18,7 @@
CREATE PERFETTO VIEW ion_timeline AS
SELECT
ts,
- LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
+ LEAD(ts, 1, trace_end())
OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
CASE name
WHEN 'mem.ion' THEN 'all'
diff --git a/src/trace_processor/metrics/sql/android/android_monitor_contention.sql b/src/trace_processor/metrics/sql/android/android_monitor_contention.sql
index 9008520..5c78590 100644
--- a/src/trace_processor/metrics/sql/android/android_monitor_contention.sql
+++ b/src/trace_processor/metrics/sql/android/android_monitor_contention.sql
@@ -27,6 +27,7 @@
'node_id', id,
'ts', ts,
'dur', dur,
+ 'monotonic_dur', monotonic_dur,
'blocking_method', blocking_method,
'blocked_method', blocked_method,
'short_blocking_method', short_blocking_method,
diff --git a/src/trace_processor/metrics/sql/android/android_netperf.sql b/src/trace_processor/metrics/sql/android/android_netperf.sql
index f7192b9..2676eb0 100644
--- a/src/trace_processor/metrics/sql/android/android_netperf.sql
+++ b/src/trace_processor/metrics/sql/android/android_netperf.sql
@@ -236,7 +236,7 @@
SELECT
cpu,
ts,
- LEAD(ts, 1, (SELECT end_ts FROM trace_bounds))
+ LEAD(ts, 1, trace_end())
OVER (PARTITION BY cpu ORDER BY ts) - ts AS dur,
CAST(value AS INT) AS freq_khz
FROM counter
diff --git a/src/trace_processor/metrics/sql/android/android_startup.sql b/src/trace_processor/metrics/sql/android/android_startup.sql
index 10fa253..18f9fbf 100644
--- a/src/trace_processor/metrics/sql/android/android_startup.sql
+++ b/src/trace_processor/metrics/sql/android/android_startup.sql
@@ -23,7 +23,7 @@
-- Define the helper functions which will be used throught the remainder
-- of the metric.
SELECT RUN_METRIC('android/startup/slice_functions.sql');
-INCLUDE PERFETTO MODULE common.timestamps;
+INCLUDE PERFETTO MODULE intervals.overlap;
-- Define helper functions related to slow start reasons
SELECT RUN_METRIC('android/startup/slow_start_reasons.sql');
@@ -45,6 +45,15 @@
-- Define helper functions for system state.
SELECT RUN_METRIC('android/startup/system_state.sql');
+CREATE OR REPLACE PERFETTO FUNCTION _is_spans_overlapping(
+ ts1 LONG,
+ ts_end1 LONG,
+ ts2 LONG,
+ ts_end2 LONG)
+RETURNS BOOL AS
+SELECT (IIF($ts1 < $ts2, $ts2, $ts1)
+ < IIF($ts_end1 < $ts_end2, $ts_end1, $ts_end2));
+
-- Returns the slices for forked processes. Never present in hot starts.
-- Prefer this over process start_ts, since the process might have
-- been preforked.
@@ -318,7 +327,7 @@
SELECT RepeatedField(package)
FROM android_startups l
WHERE l.startup_id != launches.startup_id
- AND is_spans_overlapping(l.ts, l.ts_end, launches.ts, launches.ts_end)
+ AND _is_spans_overlapping(l.ts, l.ts_end, launches.ts, launches.ts_end)
),
'dlopen_file', (
SELECT RepeatedField(STR_SPLIT(slice_name, "dlopen: ", 1))
@@ -479,7 +488,7 @@
SELECT package
FROM android_startups l
WHERE l.startup_id != launches.startup_id
- AND is_spans_overlapping(l.ts, l.ts_end, launches.ts, launches.ts_end)
+ AND _is_spans_overlapping(l.ts, l.ts_end, launches.ts, launches.ts_end)
)
UNION ALL
diff --git a/src/trace_processor/metrics/sql/android/counter_span_view_merged.sql b/src/trace_processor/metrics/sql/android/counter_span_view_merged.sql
index 4caaf88..eff2fbb 100644
--- a/src/trace_processor/metrics/sql/android/counter_span_view_merged.sql
+++ b/src/trace_processor/metrics/sql/android/counter_span_view_merged.sql
@@ -28,8 +28,7 @@
CREATE PERFETTO VIEW {{table_name}}_span AS
SELECT
ts,
- LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
- OVER(ORDER BY ts) - ts AS dur,
+ LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur,
CAST(value AS INT) AS {{table_name}}_val
FROM (
SELECT ts, value, LAG(value) OVER (ORDER BY ts) AS lag_value
diff --git a/src/trace_processor/metrics/sql/android/global_counter_span_view.sql b/src/trace_processor/metrics/sql/android/global_counter_span_view.sql
index 4db10d3..61c7b99 100644
--- a/src/trace_processor/metrics/sql/android/global_counter_span_view.sql
+++ b/src/trace_processor/metrics/sql/android/global_counter_span_view.sql
@@ -18,8 +18,7 @@
CREATE PERFETTO VIEW {{table_name}}_span AS
SELECT
ts,
- LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
- OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
+ LEAD(ts, 1, trace_end()) OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
value AS {{table_name}}_val
FROM counter c JOIN counter_track t
ON t.id = c.track_id
diff --git a/src/trace_processor/metrics/sql/android/gpu_counter_span_view.sql b/src/trace_processor/metrics/sql/android/gpu_counter_span_view.sql
index 9c902a3..7017e9e 100644
--- a/src/trace_processor/metrics/sql/android/gpu_counter_span_view.sql
+++ b/src/trace_processor/metrics/sql/android/gpu_counter_span_view.sql
@@ -18,8 +18,7 @@
CREATE PERFETTO VIEW {{table_name}}_span AS
SELECT
ts,
- LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
- OVER (PARTITION BY track_id ORDER BY ts) - ts AS dur,
+ LEAD(ts, 1, trace_end()) OVER (PARTITION BY track_id ORDER BY ts) - ts AS dur,
gpu_id,
value AS {{table_name}}_val
FROM counter c JOIN gpu_counter_track t
diff --git a/src/trace_processor/metrics/sql/android/process_counter_span_view.sql b/src/trace_processor/metrics/sql/android/process_counter_span_view.sql
index 0ab4088..89919c9 100644
--- a/src/trace_processor/metrics/sql/android/process_counter_span_view.sql
+++ b/src/trace_processor/metrics/sql/android/process_counter_span_view.sql
@@ -21,7 +21,7 @@
LEAD(ts, 1, (
SELECT IFNULL(
end_ts,
- (SELECT end_ts FROM trace_bounds)
+ trace_end()
)
FROM process p WHERE p.upid = pct.upid) + 1
) OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
diff --git a/src/trace_processor/metrics/sql/android/process_oom_score.sql b/src/trace_processor/metrics/sql/android/process_oom_score.sql
index 84a1657..df72398 100644
--- a/src/trace_processor/metrics/sql/android/process_oom_score.sql
+++ b/src/trace_processor/metrics/sql/android/process_oom_score.sql
@@ -19,7 +19,7 @@
CREATE PERFETTO VIEW oom_score_span AS
SELECT
ts,
- LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
+ LEAD(ts, 1, trace_end() + 1)
OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
upid,
CAST(value AS INT) AS oom_score_val
diff --git a/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql b/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql
index eae7d59..00faead 100644
--- a/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql
+++ b/src/trace_processor/metrics/sql/android/startup/launches_minsdk29.sql
@@ -32,7 +32,7 @@
ROW_NUMBER()
OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS id,
ts,
- LEAD(ts, 1, (SELECT end_ts FROM trace_bounds)) OVER(ORDER BY ts) - ts AS dur
+ LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur
FROM activity_intent_received
ORDER BY ts;
diff --git a/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql b/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql
index 4d361f4..2a673c0 100644
--- a/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql
+++ b/src/trace_processor/metrics/sql/android/startup/slow_start_reasons.sql
@@ -20,6 +20,15 @@
SELECT RUN_METRIC('android/startup/system_state.sql');
SELECT RUN_METRIC('android/startup/mcycles_per_launch.sql');
+CREATE OR REPLACE PERFETTO FUNCTION _is_spans_overlapping(
+ ts1 LONG,
+ ts_end1 LONG,
+ ts2 LONG,
+ ts_end2 LONG)
+RETURNS BOOL AS
+SELECT (IIF($ts1 < $ts2, $ts2, $ts1)
+ < IIF($ts_end1 < $ts_end2, $ts_end1, $ts_end2));
+
CREATE OR REPLACE PERFETTO FUNCTION get_percent(num LONG, total LONG)
RETURNS STRING AS
SELECT SUBSTRING(CAST(($num * 100 + 0.0) / $total AS STRING), 1, 5);
@@ -376,7 +385,7 @@
SELECT package
FROM android_startups l
WHERE l.startup_id != launch.startup_id
- AND is_spans_overlapping(l.ts, l.ts_end, launch.ts, launch.ts_end)
+ AND _is_spans_overlapping(l.ts, l.ts_end, launch.ts, launch.ts_end)
)
UNION ALL
diff --git a/src/trace_processor/metrics/sql/android/startup/thread_state_breakdown.sql b/src/trace_processor/metrics/sql/android/startup/thread_state_breakdown.sql
index 7bd3dee..92103f1 100644
--- a/src/trace_processor/metrics/sql/android/startup/thread_state_breakdown.sql
+++ b/src/trace_processor/metrics/sql/android/startup/thread_state_breakdown.sql
@@ -20,7 +20,7 @@
CREATE PERFETTO VIEW thread_state_extended AS
SELECT
ts,
- IIF(dur = -1, (SELECT end_ts FROM trace_bounds), dur) AS dur,
+ IIF(dur = -1, trace_end(), dur) AS dur,
utid,
state,
io_wait
diff --git a/src/trace_processor/metrics/sql/android/thread_counter_span_view.sql b/src/trace_processor/metrics/sql/android/thread_counter_span_view.sql
index 21961a9..6e7bba7 100644
--- a/src/trace_processor/metrics/sql/android/thread_counter_span_view.sql
+++ b/src/trace_processor/metrics/sql/android/thread_counter_span_view.sql
@@ -21,7 +21,7 @@
LEAD(ts, 1, (
SELECT IFNULL(
end_ts,
- (SELECT end_ts FROM trace_bounds)
+ trace_end()
)
FROM thread th WHERE th.utid = t.utid) + 1
) OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
diff --git a/src/trace_processor/metrics/sql/chrome/rail_modes.sql b/src/trace_processor/metrics/sql/chrome/rail_modes.sql
index 38c095b..c0da0fb 100644
--- a/src/trace_processor/metrics/sql/chrome/rail_modes.sql
+++ b/src/trace_processor/metrics/sql/chrome/rail_modes.sql
@@ -97,8 +97,7 @@
-- metrics that use the trace.
DROP VIEW IF EXISTS trace_has_realistic_length;
CREATE PERFETTO VIEW trace_has_realistic_length AS
-SELECT (end_ts - start_ts) < 1e9 * 60 * 10 AS value
-FROM trace_bounds;
+SELECT trace_dur() < 1e9 * 60 * 10 AS value;
-- RAIL_MODE_LOAD seems to get stuck which makes it not very useful so remap it
-- to RAIL_MODE_ANIMATION so it doesn't dominate the overall RAIL mode.
@@ -214,11 +213,12 @@
dur,
1
FROM (SELECT start_ts AS ts,
- COALESCE((
+ COALESCE(
+ (
SELECT MIN(ts)
FROM slice
WHERE name = "VSync"
- ) - start_ts - const.vsync_padding,
+) - start_ts - const.vsync_padding,
end_ts - start_ts
) AS dur
FROM trace_bounds, const)
diff --git a/src/trace_processor/metrics/sql/common/parent_slice.sql b/src/trace_processor/metrics/sql/common/parent_slice.sql
index 1f24720..d5c6f24 100644
--- a/src/trace_processor/metrics/sql/common/parent_slice.sql
+++ b/src/trace_processor/metrics/sql/common/parent_slice.sql
@@ -14,4 +14,4 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
diff --git a/src/trace_processor/metrics/sql/trace_metadata.sql b/src/trace_processor/metrics/sql/trace_metadata.sql
index cee4e2d..b963ff2 100644
--- a/src/trace_processor/metrics/sql/trace_metadata.sql
+++ b/src/trace_processor/metrics/sql/trace_metadata.sql
@@ -29,7 +29,7 @@
DROP VIEW IF EXISTS trace_metadata_output;
CREATE PERFETTO VIEW trace_metadata_output AS
SELECT TraceMetadata(
- 'trace_duration_ns', CAST((SELECT end_ts - start_ts FROM trace_bounds) AS INT),
+ 'trace_duration_ns', CAST(trace_dur() AS INT),
'trace_uuid', (SELECT str_value FROM metadata WHERE name = 'trace_uuid'),
'android_build_fingerprint', (
SELECT str_value FROM metadata WHERE name = 'android_build_fingerprint'
diff --git a/src/trace_processor/perfetto_sql/engine/perfetto_sql_engine.cc b/src/trace_processor/perfetto_sql/engine/perfetto_sql_engine.cc
index 60122a0..e29933b 100644
--- a/src/trace_processor/perfetto_sql/engine/perfetto_sql_engine.cc
+++ b/src/trace_processor/perfetto_sql/engine/perfetto_sql_engine.cc
@@ -409,6 +409,11 @@
base::Status PerfettoSqlEngine::ExecuteCreateTable(
const PerfettoSqlParser::CreateTable& create_table) {
+ PERFETTO_TP_TRACE(metatrace::Category::QUERY_TIMELINE,
+ "CREATE_PERFETTO_TABLE",
+ [&create_table](metatrace::Record* record) {
+ record->AddArg("Table", create_table.name);
+ });
auto stmt_or = engine_->PrepareStatement(create_table.sql);
RETURN_IF_ERROR(stmt_or.status());
SqliteEngine::PreparedStatement stmt = std::move(stmt_or);
diff --git a/src/trace_processor/perfetto_sql/engine/perfetto_sql_parser.cc b/src/trace_processor/perfetto_sql/engine/perfetto_sql_parser.cc
index a864b6d..a246c6a 100644
--- a/src/trace_processor/perfetto_sql/engine/perfetto_sql_parser.cc
+++ b/src/trace_processor/perfetto_sql/engine/perfetto_sql_parser.cc
@@ -230,7 +230,7 @@
if (!ValidateModuleName(key)) {
base::StackString<1024> err(
- "Include key should be a dot-separated list of module names, with the"
+ "Include key should be a dot-separated list of module names, with the "
"last name optionally being a wildcard: '%s'",
key.c_str());
return ErrorAtToken(tok, err.c_str());
diff --git a/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_flamegraph.cc b/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_flamegraph.cc
index b4d76cf..fde9046 100644
--- a/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_flamegraph.cc
+++ b/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_flamegraph.cc
@@ -31,8 +31,8 @@
#include "src/trace_processor/db/column/types.h"
#include "src/trace_processor/db/table.h"
#include "src/trace_processor/importers/proto/heap_graph_tracker.h"
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
#include "src/trace_processor/perfetto_sql/intrinsics/table_functions/flamegraph_construction_algorithms.h"
-#include "src/trace_processor/sqlite/sqlite_utils.h"
#include "src/trace_processor/storage/trace_storage.h"
#include "src/trace_processor/tables/profiler_tables_py.h"
#include "src/trace_processor/types/trace_processor_context.h"
diff --git a/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_slice_layout.cc b/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_slice_layout.cc
index 32237bf..51adc4a 100644
--- a/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_slice_layout.cc
+++ b/src/trace_processor/perfetto_sql/intrinsics/table_functions/experimental_slice_layout.cc
@@ -233,10 +233,24 @@
}
}
+ uint32_t layout_depth = 0;
+
+ // In a pathological case you can end up stacking up slices forever
+ // triggering n^2 behaviour below. In those cases we want to give
+ // up on trying to find a pretty (height minimizing ) layout and
+ // just find *some* layout. To do that we start looking for
+ // a layout depth below the maximum open group which should
+ // immediately succeed.
+ if (still_open.size() > 500) {
+ for (const auto& open : still_open) {
+ layout_depth =
+ std::max(layout_depth, open->layout_depth + open->max_depth);
+ }
+ }
+
// Find a start layout depth for this group s.t. our start depth +
// our max depth will not intersect with the start depth + max depth for
// any of the open groups:
- uint32_t layout_depth = 0;
bool done = false;
while (!done) {
done = true;
diff --git a/src/trace_processor/perfetto_sql/prelude/tables.sql b/src/trace_processor/perfetto_sql/prelude/tables.sql
index 9ba3b11..bc01757 100644
--- a/src/trace_processor/perfetto_sql/prelude/tables.sql
+++ b/src/trace_processor/perfetto_sql/prelude/tables.sql
@@ -1,6 +1,3 @@
-CREATE TABLE trace_bounds AS
-SELECT 0 AS start_ts, 0 AS end_ts;
-
CREATE TABLE power_profile(
device STRING,
cpu INT,
diff --git a/src/trace_processor/perfetto_sql/stdlib/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/BUILD.gn
index eab54f3..fa871e6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/BUILD.gn
@@ -23,6 +23,7 @@
"chrome:chrome_sql",
"common",
"counters",
+ "deprecated/v42/common",
"graphs",
"intervals",
"linux",
@@ -30,6 +31,7 @@
"prelude",
"sched",
"slices",
+ "time",
]
generated_header = "stdlib.h"
namespace = "stdlib"
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
index be50773..29c4b89 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/android/BUILD.gn
@@ -31,6 +31,7 @@
"job_scheduler.sql",
"monitor_contention.sql",
"network_packets.sql",
+ "oom_adjuster.sql",
"process_metadata.sql",
"screenshots.sql",
"services.sql",
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql b/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
index 45c6e93..2e68b5f 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql
@@ -13,7 +13,7 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
-- All process starts.
CREATE PERFETTO VIEW _proc_start
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql b/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql
index 828400e..ff69029 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/battery_stats.sql
@@ -13,8 +13,6 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE common.timestamps;
-
-- Converts a battery_stats counter value to human readable string.
CREATE PERFETTO FUNCTION android_battery_stats_counter_to_string(
-- The counter track name (e.g. 'battery_stats.audio').
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/binder.sql b/src/trace_processor/perfetto_sql/stdlib/android/binder.sql
index 7ee6dfb..e168970 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/binder.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/binder.sql
@@ -14,8 +14,8 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.timestamps;
INCLUDE PERFETTO MODULE android.process_metadata;
+INCLUDE PERFETTO MODULE android.suspend;
-- Count Binder transactions per process.
CREATE PERFETTO VIEW android_binder_metrics_by_process(
@@ -163,8 +163,8 @@
process.upid,
CAST(c.value AS INT) AS value,
c.ts,
- IFNULL(LEAD(ts) OVER (PARTITION BY upid ORDER BY ts), trace_bounds.end_ts) AS end_ts
- FROM counter c, trace_bounds
+ IFNULL(LEAD(ts) OVER (PARTITION BY upid ORDER BY ts), trace_end()) AS end_ts
+ FROM counter c
JOIN process_counter_track t ON c.track_id = t.id
JOIN process USING (upid)
WHERE t.name = 'oom_score_adj';
@@ -423,7 +423,7 @@
is_main_thread BOOL,
-- timestamp of the client txn.
client_ts INT,
- -- dur of the client txn.
+ -- wall clock dur of the client txn.
client_dur INT,
-- slice id of the binder reply.
binder_reply_id INT,
@@ -441,7 +441,7 @@
server_pid INT,
-- timestamp of the server txn.
server_ts INT,
- -- dur of the server txn.
+ -- wall clock dur of the server txn.
server_dur INT,
-- oom score of the client process at the start of the txn.
client_oom_score INT,
@@ -449,6 +449,10 @@
server_oom_score INT,
-- whether the txn is synchronous or async (oneway).
is_sync BOOL,
+ -- monotonic clock dur of the client txn.
+ client_monotonic_dur INT,
+ -- monotonic clock dur of the server txn.
+ server_monotonic_dur INT,
-- Client package version_code.
client_package_version_code INT,
-- Server package version_code.
@@ -463,6 +467,8 @@
SELECT *, 0 AS is_sync FROM _async_binder_metrics_by_txn
) SELECT
all_binder.*,
+ _extract_duration_without_suspend(client_ts, client_dur) AS client_monotonic_dur,
+ _extract_duration_without_suspend(server_ts, server_dur) AS server_monotonic_dur,
client_process_metadata.version_code AS client_package_version_code,
server_process_metadata.version_code AS server_package_version_code,
client_process_metadata.debuggable AS is_client_package_debuggable,
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/dvfs.sql b/src/trace_processor/perfetto_sql/stdlib/android/dvfs.sql
index 22fe345..d6a43d6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/dvfs.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/dvfs.sql
@@ -28,8 +28,7 @@
counter_track.name,
counter.ts,
counter.value,
- LEAD(counter.ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
- OVER (PARTITION BY counter_track.id ORDER BY counter.ts) - counter.ts AS dur
+ LEAD(counter.ts, 1, trace_end()) OVER (PARTITION BY counter_track.id ORDER BY counter.ts) - counter.ts AS dur
FROM counter
JOIN counter_track
ON counter.track_id = counter_track.id
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql b/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
index 264fa78..9ccdca9 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/freezer.sql
@@ -14,8 +14,6 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.timestamps;
-
CREATE PERFETTO FUNCTION _extract_freezer_pid(name STRING)
RETURNS INT
AS
@@ -50,6 +48,45 @@
ORDER BY upid DESC
LIMIT 1;
+-- Translate unfreeze reason from INT to STRING.
+-- See: frameworks/proto_logging/stats/atoms.proto
+CREATE PERFETTO FUNCTION _translate_unfreeze_reason(reason INT)
+RETURNS STRING
+AS
+SELECT
+ CASE
+ WHEN $reason = 0 THEN 'none'
+ WHEN $reason = 1 THEN 'activity'
+ WHEN $reason = 2 THEN 'finish_receiver'
+ WHEN $reason = 3 THEN 'start_receiver'
+ WHEN $reason = 4 THEN 'bind_service'
+ WHEN $reason = 5 THEN 'unbind_service'
+ WHEN $reason = 6 THEN 'start_service'
+ WHEN $reason = 7 THEN 'get_provider'
+ WHEN $reason = 8 THEN 'remove_provider'
+ WHEN $reason = 9 THEN 'ui_visibility'
+ WHEN $reason = 10 THEN 'allowlist'
+ WHEN $reason = 11 THEN 'process_begin'
+ WHEN $reason = 12 THEN 'process_end'
+ WHEN $reason = 13 THEN 'trim_memory'
+ WHEN $reason = 15 THEN 'ping'
+ WHEN $reason = 16 THEN 'file_locks'
+ WHEN $reason = 17 THEN 'file_lock_check_failure'
+ WHEN $reason = 18 THEN 'binder_txns'
+ WHEN $reason = 19 THEN 'feature_flags'
+ WHEN $reason = 20 THEN 'short_fgs_timeout'
+ WHEN $reason = 21 THEN 'system_init'
+ WHEN $reason = 22 THEN 'backup'
+ WHEN $reason = 23 THEN 'shell'
+ WHEN $reason = 24 THEN 'remove_task'
+ WHEN $reason = 25 THEN 'uid_idle'
+ WHEN $reason = 26 THEN 'stop_service'
+ WHEN $reason = 27 THEN 'executing_service'
+ WHEN $reason = 28 THEN 'restriction_change'
+ WHEN $reason = 29 THEN 'component_disabled'
+ ELSE NULL
+ END;
+
-- All frozen processes and their frozen duration.
CREATE PERFETTO TABLE android_freezer_events (
-- Upid of frozen process
@@ -59,19 +96,25 @@
-- Timestamp process was frozen.
ts INT,
-- Duration process was frozen for.
- dur INT
+ dur INT,
+ -- Unfreeze reason Integer.
+ unfreeze_reason_int INT,
+ -- Unfreeze reason String.
+ unfreeze_reason_str INT
)
AS
WITH
freeze AS (
SELECT ts, _extract_freezer_pid(name) AS pid,
- _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'freeze' AS type
+ _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'freeze' AS type,
+ NULL AS unfreeze_reason
FROM slice
WHERE name GLOB 'Freeze *:*'
),
unfreeze AS (
SELECT ts, _extract_freezer_pid(name) AS pid,
- _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'unfreeze' AS type
+ _pid_to_upid(_extract_freezer_pid(name), ts) AS upid, 'unfreeze' AS type,
+ str_split(name, ' ', 2) AS unfreeze_reason
FROM slice
WHERE name GLOB 'Unfreeze *:*'
),
@@ -86,9 +129,16 @@
upid,
pid,
ts,
- ifnull(lead(ts) OVER (PARTITION BY upid ORDER BY ts), trace_end()) - ts AS dur
+ ifnull(lead(ts) OVER (PARTITION BY upid ORDER BY ts), trace_end()) - ts AS dur,
+ CAST(lead(unfreeze_reason) OVER (PARTITION BY upid ORDER BY ts) AS INT) AS unfreeze_reason
FROM merged
)
-SELECT upid, pid, ts, dur
+SELECT
+ upid,
+ pid,
+ ts,
+ dur,
+ unfreeze_reason AS unfreeze_reason_int,
+ _translate_unfreeze_reason(unfreeze_reason) AS unfreeze_reason_str
FROM starts
WHERE starts.type = 'freeze' AND upid IS NOT NULL;
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql b/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
index 3baf612..8481657 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/garbage_collection.sql
@@ -14,8 +14,7 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.slices;
-INCLUDE PERFETTO MODULE common.timestamps;
+INCLUDE PERFETTO MODULE slices.with_context;
-- Collect all GC slices. There's typically one enclosing slice but sometimes the
-- CompactionPhase is outside the nesting and we need to include that.
@@ -44,8 +43,14 @@
gc_name,
ts AS gc_ts,
ts,
- gc_dur + IIF(compact_name = 'CompactionPhase', compact_dur, 0) AS gc_dur,
- gc_dur + IIF(compact_name = 'CompactionPhase', compact_dur, 0) AS dur,
+ gc_dur + IIF(
+ compact_name = 'CompactionPhase' OR compact_name = 'Background concurrent copying GC',
+ compact_dur,
+ 0) AS gc_dur,
+ gc_dur + IIF(
+ compact_name = 'CompactionPhase' OR compact_name = 'Background concurrent copying GC',
+ compact_dur,
+ 0) AS dur,
utid,
tid,
upid,
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/input.sql b/src/trace_processor/perfetto_sql/stdlib/android/input.sql
index f344c20..a1d7b11 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/input.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/input.sql
@@ -13,8 +13,6 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE common.timestamps;
-
CREATE PERFETTO TABLE _input_message_sent
AS
SELECT
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql b/src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql
index 71920e5..dc222bf 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/job_scheduler.sql
@@ -14,8 +14,6 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.timestamps;
-
-- All scheduled jobs and their latencies.
CREATE PERFETTO TABLE android_job_scheduler_events (
-- Id of the scheduled job assigned by the app developer.
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql b/src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql
index 32e02bc..34a9b97 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql
@@ -14,6 +14,8 @@
-- limitations under the License.
--
+INCLUDE PERFETTO MODULE android.suspend;
+
-- Extracts the blocking thread from a slice name
CREATE PERFETTO FUNCTION android_extract_android_monitor_contention_blocking_thread(
-- Name of slice
@@ -133,7 +135,8 @@
-- @column process_name Process name of process experiencing lock contention.
-- @column id Slice id of lock contention.
-- @column ts Timestamp of lock contention start.
--- @column dur Duration of lock contention.
+-- @column dur Wall clock duration of lock contention.
+-- @column monotonic_dur Monotonic clock duration of lock contention.
-- @column track_id Thread track id of blocked thread.
-- @column is_blocked_main_thread Whether the blocked thread is the main thread.
-- @column is_blocking_main_thread Whether the blocking thread is the main thread.
@@ -159,6 +162,7 @@
slice.id,
slice.ts,
slice.dur,
+ _extract_duration_without_suspend(slice.ts, slice.dur) AS monotonic_dur,
slice.track_id,
thread.is_main_thread AS is_blocked_thread_main,
thread.tid AS blocked_thread_tid,
@@ -236,7 +240,8 @@
-- @column process_name Process name of process experiencing lock contention.
-- @column id Slice id of lock contention.
-- @column ts Timestamp of lock contention start.
--- @column dur Duration of lock contention.
+-- @column dur Wall clock duration of lock contention.
+-- @column monotonic_dur Monotonic clock duration of lock contention.
-- @column track_id Thread track id of blocked thread.
-- @column is_blocked_main_thread Whether the blocked thread is the main thread.
-- @column is_blocking_main_thread Whether the blocking thread is the main thread.
@@ -299,7 +304,8 @@
-- @column process_name Process name of process experiencing lock contention.
-- @column id Slice id of lock contention.
-- @column ts Timestamp of lock contention start.
--- @column dur Duration of lock contention.
+-- @column dur Wall clock duration of lock contention.
+-- @column monotonic_dur Monotonic clock duration of lock contention.
-- @column track_id Thread track id of blocked thread.
-- @column is_blocked_main_thread Whether the blocked thread is the main thread.
-- @column is_blocking_main_thread Whether the blocking thread is the main thread.
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql b/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql
new file mode 100644
index 0000000..9b7fba8
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/android/oom_adjuster.sql
@@ -0,0 +1,129 @@
+--
+-- 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.
+--
+
+INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE counters.intervals;
+
+-- Converts an oom_adj score Integer to String bucket name.
+CREATE PERFETTO FUNCTION android_oom_adj_score_to_bucket_name(
+ -- oom_adj score.
+ value INT,
+ -- android_app id of the process.
+ android_appid INT)
+-- Returns the oom_adj bucket.
+RETURNS STRING
+AS
+SELECT
+ CASE
+ WHEN $value = -1000 THEN 'native'
+ WHEN $value = -900 THEN 'system'
+ WHEN $value = -800 THEN 'persistent'
+ WHEN $value = -700 THEN 'persistent'
+ WHEN $value = -600 THEN 'logcat'
+ WHEN $value = 0 THEN 'foreground_app'
+ WHEN $value = 50 THEN 'perceptible_foreground_app'
+ WHEN $value BETWEEN 100 AND 199 THEN 'visible_app'
+ WHEN $value BETWEEN 200 AND 224 THEN 'perceptible_app'
+ WHEN $value BETWEEN 225 AND 249 THEN 'perceptible_medium_app'
+ WHEN $value BETWEEN 250 AND 299 THEN 'perceptible_low_app'
+ WHEN $value BETWEEN 300 AND 399 THEN 'backup'
+ WHEN $value BETWEEN 400 AND 499 THEN 'heavy_weight_app'
+ WHEN $value BETWEEN 500 AND 599 THEN 'service'
+ WHEN $value BETWEEN 600 AND 699 THEN 'home_app'
+ WHEN $value BETWEEN 700 AND 799 THEN 'previous_app'
+ WHEN $value BETWEEN 800 AND 899 THEN 'service_b'
+ WHEN $value BETWEEN 900 AND 949 THEN 'cached_app'
+ WHEN $value >= 950 THEN 'cached_app_lmk_first'
+ WHEN $android_appid IS NULL THEN 'unknown'
+ WHEN $android_appid < 10000 THEN 'unknown_native'
+ ELSE 'unknown_app'
+ END;
+
+-- All oom adj state intervals across all processes along with the reason for the state update.
+CREATE PERFETTO TABLE android_oom_adj_intervals (
+ -- Timestamp the oom_adj score of the process changed
+ ts INT,
+ -- Duration until the next oom_adj score change of the process.
+ dur INT,
+ -- oom_adj score of the process.
+ score INT,
+ -- oom_adj bucket of the process.
+ bucket STRING,
+ -- Upid of the process having an oom_adj update.
+ upid INT,
+ -- Name of the process having an oom_adj update.
+ process_name STRING,
+ -- Slice id of the latest oom_adj update in the system_server.
+ oom_adj_id INT,
+ -- Timestamp of the latest oom_adj update in the system_server.
+ oom_adj_ts INT,
+ -- Duration of the latest oom_adj update in the system_server.
+ oom_adj_dur INT,
+ -- Track id of the latest oom_adj update in the system_server
+ oom_adj_track_id INT,
+ -- Thread name of the latest oom_adj update in the system_server.
+ oom_adj_thread_name STRING,
+ -- Reason for the latest oom_adj update in the system_server.
+ oom_adj_reason STRING,
+ -- Trigger for the latest oom_adj update in the system_server.
+ oom_adj_trigger STRING
+ ) AS
+WITH
+ reason AS (
+ SELECT
+ thread_slice.id AS oom_adj_id,
+ thread_slice.ts AS oom_adj_ts,
+ thread_slice.dur AS oom_adj_dur,
+ thread_slice.track_id AS oom_adj_track_id,
+ thread_name AS oom_adj_thread_name,
+ str_split(thread_slice.name, '_', 1) AS oom_adj_reason,
+ slice.name AS oom_adj_trigger,
+ LEAD(thread_slice.ts) OVER (ORDER BY thread_slice.ts) AS oom_adj_next_ts
+ FROM thread_slice
+ LEFT JOIN slice ON slice.id = thread_slice.parent_id AND slice.dur != -1
+ WHERE thread_slice.name GLOB 'updateOomAdj_*' AND process_name = 'system_server'
+ )
+SELECT
+ ts,
+ dur,
+ value AS score,
+ android_oom_adj_score_to_bucket_name(value, android_appid) AS bucket,
+ process.upid,
+ process.name AS process_name,
+ reason.oom_adj_id,
+ reason.oom_adj_ts,
+ reason.oom_adj_dur,
+ reason.oom_adj_track_id,
+ reason.oom_adj_thread_name,
+ reason.oom_adj_reason,
+ reason.oom_adj_trigger
+FROM
+ counter_leading_intervals
+ !(
+ (
+ SELECT counter.*
+ FROM counter
+ JOIN counter_track track
+ ON track.id = counter.track_id AND track.name = 'oom_score_adj'
+ ))
+ counter
+JOIN process_counter_track track
+ ON counter.track_id = track.id
+JOIN process
+ USING (upid)
+LEFT JOIN reason
+ ON counter.ts BETWEEN oom_adj_ts AND COALESCE(oom_adj_next_ts, trace_end())
+WHERE track.name = 'oom_score_adj';
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/services.sql b/src/trace_processor/perfetto_sql/stdlib/android/services.sql
index e9c1c56..f0e854a 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/services.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/services.sql
@@ -14,7 +14,7 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
INCLUDE PERFETTO MODULE android.binder;
INCLUDE PERFETTO MODULE graphs.search;
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
index a38c487..e496e7c 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups.sql
@@ -13,12 +13,18 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE common.slices;
INCLUDE PERFETTO MODULE android.process_metadata;
INCLUDE PERFETTO MODULE android.startup.startups_maxsdk28;
INCLUDE PERFETTO MODULE android.startup.startups_minsdk29;
INCLUDE PERFETTO MODULE android.startup.startups_minsdk33;
+CREATE PERFETTO FUNCTION _slice_count(
+ -- Name of the slices to counted.
+ slice_glob STRING)
+-- Number of slices with the name.
+RETURNS INT AS
+SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;
+
-- Gather all startup data. Populate by different sdks.
CREATE PERFETTO TABLE _all_startups AS
SELECT sdk, startup_id, ts, ts_end, dur, package, startup_type FROM _startups_maxsdk28
@@ -45,9 +51,9 @@
) AS
SELECT startup_id, ts, ts_end, dur, package, startup_type FROM
_all_startups WHERE ( CASE
- WHEN slice_count('launchingActivity#*:*') > 0
+ WHEN _slice_count('launchingActivity#*:*') > 0
THEN sdk = "minsdk33"
- WHEN slice_count('MetricsLogger:*') > 0
+ WHEN _slice_count('MetricsLogger:*') > 0
THEN sdk = "minsdk29"
ELSE sdk = "maxsdk28"
END);
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups_minsdk29.sql b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups_minsdk29.sql
index e10244b..fcc1fa9 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/startup/startups_minsdk29.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/startup/startups_minsdk29.sql
@@ -29,7 +29,7 @@
ROW_NUMBER()
OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS startup_id,
ts,
- LEAD(ts, 1, (SELECT end_ts FROM trace_bounds)) OVER(ORDER BY ts) - ts AS dur
+ LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur
FROM _activity_intent_received
ORDER BY ts;
diff --git a/src/trace_processor/perfetto_sql/stdlib/android/suspend.sql b/src/trace_processor/perfetto_sql/stdlib/android/suspend.sql
index 60236b1..9e604b5 100644
--- a/src/trace_processor/perfetto_sql/stdlib/android/suspend.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/android/suspend.sql
@@ -14,6 +14,8 @@
-- limitations under the License.
--
+INCLUDE PERFETTO MODULE common.timestamps;
+
-- Table of suspended and awake slices.
--
-- Selects either the minimal or full ftrace source depending on what's
@@ -51,21 +53,21 @@
awake_slice AS (
-- If we don't have any rows, use the trace bounds.
SELECT
- (SELECT start_ts FROM trace_bounds) AS ts,
- (SELECT end_ts - start_ts FROM trace_bounds) AS dur
+ trace_start() AS ts,
+ trace_dur() AS dur
WHERE (SELECT COUNT(*) FROM suspend_slice) = 0
UNION ALL
-- If we do have rows, create one slice from the trace start to the first suspend.
SELECT
- (SELECT start_ts FROM trace_bounds) AS ts,
- (SELECT min(ts) FROM suspend_slice) - (SELECT start_ts FROM trace_bounds) AS dur
+ trace_start() AS ts,
+ (SELECT min(ts) FROM suspend_slice) - trace_start() AS dur
WHERE (SELECT COUNT(*) FROM suspend_slice) != 0
UNION ALL
-- And then one slice for each suspend, from the end of the suspend to the
-- start of the next one (or the end of the trace if there is no next one).
SELECT
ts + dur AS ts,
- ifnull(lead(ts) OVER (ORDER BY ts), (SELECT end_ts FROM trace_bounds)) - ts - dur
+ ifnull(lead(ts) OVER (ORDER BY ts), trace_end()) - ts - dur
AS dur
FROM suspend_slice
)
@@ -74,3 +76,15 @@
UNION ALL
SELECT ts, dur, 'suspended' AS power_state
FROM suspend_slice;
+
+-- Extracts the duration without counting CPU suspended time from an event.
+-- This is the same as converting an event duration from wall clock to monotonic clock.
+-- If there was no CPU suspend, the result is same as |dur|.
+CREATE PERFETTO FUNCTION _extract_duration_without_suspend(
+ -- Timestamp of event.
+ ts INT,
+ -- Duration of event.
+ dur INT)
+RETURNS INT
+AS
+SELECT to_monotonic($ts + $dur) - to_monotonic($ts);
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
index c8d1443..4b00170 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/page_loads.sql
@@ -7,7 +7,7 @@
-- chrome instance. Chrome instance id needs to be recorded, and used here in
-- combination with navigation id to uniquely identify page load metrics.
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
CREATE PERFETTO VIEW _fcp_metrics AS
SELECT
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
index 7cad697..dbe0cca 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_cause_utils.sql
@@ -2,6 +2,8 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
+INCLUDE PERFETTO MODULE slices.with_context;
+
-- Function to retrieve the upid for a surfaceflinger, as these are attributed
-- to the GPU but are recorded on a different data source (and track group).
CREATE PERFETTO FUNCTION _get_process_id_for_surfaceflinger()
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
index d85d7c6..5fb66d6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_intervals.sql
@@ -4,7 +4,6 @@
INCLUDE PERFETTO MODULE chrome.chrome_scrolls;
INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
-INCLUDE PERFETTO MODULE common.slices;
-- Selects EventLatency slices that correspond with janks in a scroll. This is
-- based on the V3 version of scroll jank metrics.
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
index ce20041..4bc9513 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3.sql
@@ -2,13 +2,63 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
-- Hardware info is useful when using sql metrics for analysis
-- in BTP.
INCLUDE PERFETTO MODULE chrome.metadata;
INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3_cause;
+-- Checks if slice has a descendant with provided name.
+CREATE PERFETTO FUNCTION _has_descendant_slice_with_name(
+ -- Id of the slice to check descendants of.
+ id INT,
+ -- Name of potential descendant slice.
+ descendant_name STRING
+)
+-- Whether `descendant_name` is a name of an descendant slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+ SELECT 1
+ FROM descendant_slice($id)
+ WHERE name = $descendant_name
+ LIMIT 1
+);
+
+-- Finds the end timestamp for a given slice's descendant with a given name.
+-- If there are multiple descendants with a given name, the function will return the
+-- first one, so it's most useful when working with a timeline broken down into phases,
+-- where each subphase can happen only once.
+CREATE PERFETTO FUNCTION _descendant_slice_end(
+ -- Id of the parent slice.
+ parent_id INT,
+ -- Name of the child with the desired end TS.
+ child_name STRING
+)
+-- End timestamp of the child or NULL if it doesn't exist.
+RETURNS INT AS
+SELECT
+ CASE WHEN s.dur
+ IS NOT -1 THEN s.ts + s.dur
+ ELSE NULL
+ END
+FROM descendant_slice($parent_id) s
+WHERE s.name = $child_name
+LIMIT 1;
+
+-- Given a slice id, returns the name of the slice.
+CREATE PERFETTO FUNCTION _slice_name_from_id(
+ -- The slice id which we need the name for.
+ id LONG
+)
+-- The name of slice with the given id.
+RETURNS STRING AS
+SELECT
+ name
+FROM slice
+WHERE $id = id;
+
+
-- Grabs all gesture updates with respective scroll ids and start/end
-- timestamps, regardless of being coalesced.
CREATE PERFETTO TABLE chrome_gesture_scroll_updates(
@@ -135,8 +185,8 @@
slice.ts,
slice.id AS event_latency_id,
slice.dur AS dur,
- descendant_slice_end(slice.id, "LatchToSwapEnd") AS input_latency_end_ts,
- descendant_slice_end(slice.id, "SwapEndToPresentationCompositorFrame") AS presentation_timestamp,
+ _descendant_slice_end(slice.id, "LatchToSwapEnd") AS input_latency_end_ts,
+ _descendant_slice_end(slice.id, "SwapEndToPresentationCompositorFrame") AS presentation_timestamp,
EXTRACT_ARG(arg_set_id, 'event_latency.event_type') AS event_type
FROM slice
WHERE name = "EventLatency"
@@ -144,7 +194,7 @@
"GESTURE_SCROLL_UPDATE",
"FIRST_GESTURE_SCROLL_UPDATE",
"INERTIAL_GESTURE_SCROLL_UPDATE")
- AND has_descendant_slice_with_name(slice.id, "SwapEndToPresentationCompositorFrame");
+ AND _has_descendant_slice_with_name(slice.id, "SwapEndToPresentationCompositorFrame");
-- Join presented gesture scrolls with their respective event
-- latencies based on |LatchToSwapEnd| timestamp, as it's the
@@ -384,8 +434,8 @@
scroll_id INT
) AS
SELECT
- slice_name_from_id(cause_id) AS cause_of_jank,
- slice_name_from_id(
+ _slice_name_from_id(cause_id) AS cause_of_jank,
+ _slice_name_from_id(
-- Getting sub-cause
chrome_get_v3_jank_cause_id(
-- Here the cause itself is the parent.
@@ -394,7 +444,7 @@
(SELECT
id
FROM slice
- WHERE name = slice_name_from_id(cause_id)
+ WHERE name = _slice_name_from_id(cause_id)
AND parent_id = prev_event_latency_id)
)) AS sub_cause_of_jank,
delay_since_last_frame,
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
index d746457..16a5246 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/scroll_jank/scroll_jank_v3_cause.sql
@@ -2,10 +2,51 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
--- Helper functions for scroll_jank_v3 metric computation.
-
-INCLUDE PERFETTO MODULE common.slices;
-
+-- Finds all slices with a direct parent with the given parent_id.
+CREATE PERFETTO FUNCTION _direct_children_slice(
+ -- Id of the parent slice.
+ parent_id LONG)
+RETURNS TABLE(
+ -- Alias for `slice.id`.
+ id LONG,
+ -- Alias for `slice.type`.
+ type STRING,
+ -- Alias for `slice.ts`.
+ ts LONG,
+ -- Alias for `slice.dur`.
+ dur LONG,
+ -- Alias for `slice.category`.
+ category LONG,
+ -- Alias for `slice.name`.
+ name STRING,
+ -- Alias for `slice.track_id`.
+ track_id LONG,
+ -- Alias for `slice.depth`.
+ depth LONG,
+ -- Alias for `slice.parent_id`.
+ parent_id LONG,
+ -- Alias for `slice.arg_set_id`.
+ arg_set_id LONG,
+ -- Alias for `slice.thread_ts`.
+ thread_ts LONG,
+ -- Alias for `slice.thread_dur`.
+ thread_dur LONG
+) AS
+SELECT
+ slice.id,
+ slice.type,
+ slice.ts,
+ slice.dur,
+ slice.category,
+ slice.name,
+ slice.track_id,
+ slice.depth,
+ slice.parent_id,
+ slice.arg_set_id,
+ slice.thread_ts,
+ slice.thread_dur
+FROM slice
+WHERE parent_id = $parent_id;
-- Given two slice Ids A and B, find the maximum difference
-- between the durations of it's direct children with matching names
@@ -26,12 +67,12 @@
current_breakdowns AS (
SELECT
*
- FROM direct_children_slice($janky_slice_id)
+ FROM _direct_children_slice($janky_slice_id)
),
prev_breakdowns AS (
SELECT
*
- FROM direct_children_slice($prev_slice_id)
+ FROM _direct_children_slice($prev_slice_id)
),
joint_breakdowns AS (
SELECT
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
index f1e852b..7e45848 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/startups.sql
@@ -2,7 +2,7 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
-- Access all startups, including those that don't lead to any visible content.
-- If TimeToFirstVisibleContent is available, then this event will be the
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
index 420ef6b..a177cba 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql
@@ -2,7 +2,20 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
-INCLUDE PERFETTO MODULE common.slices;
+-- Checks if slice has an ancestor with provided name.
+CREATE PERFETTO FUNCTION _has_parent_slice_with_name(
+ -- Id of the slice to check parents of.
+ id INT,
+ -- Name of potential ancestor slice.
+ parent_name STRING)
+-- Whether `parent_name` is a name of an ancestor slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+ SELECT 1
+ FROM ancestor_slice($id)
+ WHERE name = $parent_name
+ LIMIT 1
+);
-- Returns the mojo ipc hash for a given task, looking it up from the
-- argument of descendant ScopedSetIpcHash slice.
@@ -229,11 +242,11 @@
s1.*,
-- While the parent slices are too generic to be used by themselves,
-- they can provide some useful metadata.
- has_parent_slice_with_name(
+ _has_parent_slice_with_name(
s1.id,
"ViewResourceAdapter:captureWithSoftwareDraw"
) AS is_software_screenshot,
- has_parent_slice_with_name(
+ _has_parent_slice_with_name(
s1.id,
"ViewResourceAdapter:captureWithHardwareDraw"
) AS is_hardware_screenshot
diff --git a/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql b/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
index d60992f..76ada01 100644
--- a/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/chrome/web_content_interactions.sql
@@ -2,7 +2,7 @@
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
-INCLUDE PERFETTO MODULE common.slices;
+INCLUDE PERFETTO MODULE slices.with_context;
-- Chrome web content interactions (InteractionToFirstPaint), including
-- associated high-level metrics and properties.
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/args.sql b/src/trace_processor/perfetto_sql/stdlib/common/args.sql
index df0615a..3d1e793 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/args.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/args.sql
@@ -13,19 +13,8 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
--- Returns the formatted value of a given argument.
--- Similar to EXTRACT_ARG, but instead of returning the raw value, it returns
--- the value formatted according to the 'value_type' column (e.g. for booleans,
--- EXTRACT_ARG will return 0 or 1, while FORMATTED_ARG will return 'true' or
--- 'false').
-CREATE PERFETTO FUNCTION formatted_arg(
- -- Id of the arg set.
- arg_set_id INT,
- -- Key of the argument.
- arg_key STRING
-)
--- Formatted value of the argument.
-RETURNS STRING AS
-SELECT display_value
-FROM args
-WHERE arg_set_id = $arg_set_id AND key = $arg_key;
\ No newline at end of file
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/counters.sql b/src/trace_processor/perfetto_sql/stdlib/common/counters.sql
index 57429a2..f0c1ce6 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/counters.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/counters.sql
@@ -13,89 +13,9 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE common.timestamps;
-
--- Timestamp of first counter value in a counter.
-CREATE PERFETTO FUNCTION earliest_timestamp_for_counter_track(
- -- Id of a counter track with a counter.
- counter_track_id INT)
--- Timestamp of first counter value. Null if doesn't exist.
-RETURNS LONG AS
-SELECT MIN(ts) FROM counter WHERE counter.track_id = $counter_track_id;
-
--- Counter values with details of counter track with calculated duration of each counter value.
--- Duration is calculated as time from counter to the next counter.
-CREATE PERFETTO FUNCTION counter_with_dur_for_track(
- -- Id of track counter track.
- counter_track_id INT)
-RETURNS TABLE(
- -- Timestamp of the counter value.
- ts LONG,
- -- Duration of the counter value.
- dur LONG,
- -- Counter value.
- value DOUBLE,
- -- Id of the counter track.
- track_id INT,
- -- Name of the counter track.
- track_name STRING,
- -- Counter track set id.
- track_arg_set_id INT,
- -- Counter arg set id.
- arg_set_id INT
-) AS
-SELECT
- ts,
- LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur,
- value,
- track.id AS track_id,
- track.name AS track_name,
- track.source_arg_set_id AS track_arg_set_id,
- counter.arg_set_id AS arg_set_id
-FROM counter
-JOIN counter_track track ON track.id = counter.track_id
-WHERE track.id = $counter_track_id;
-
--- COUNTER_WITH_DUR_FOR_TRACK but in a specified time.
--- Does calculation over the table ends - creates an artificial counter value at
--- the start if needed and chops the duration of the last timestamps in range.
-CREATE PERFETTO FUNCTION counter_for_time_range(
- -- Id of track counter track.
- counter_track_id INT,
- -- Timestamp of the timerange start.
- -- Can be earlier than the first counter value.
- start_ts LONG,
- -- Timestamp of the timerange end.
- end_ts LONG)
-RETURNS TABLE(
- -- Timestamp of the counter value.
- ts LONG,
- -- Duration of the counter value.
- dur LONG,
- -- Counter value.
- value DOUBLE,
- -- If of the counter track.
- track_id INT,
- -- Name of the counter track.
- track_name STRING,
- -- Counter track set id.
- track_arg_set_id INT,
- -- Counter arg set id.
- arg_set_id INT
-) AS
-SELECT
- IIF(ts < $start_ts, $start_ts, ts) AS ts,
- IIF(
- ts < $start_ts,
- dur - ($start_ts - ts),
- IIF(ts + dur > $end_ts, $end_ts - ts, dur)) AS dur,
- value,
- track_id,
- track_name,
- track_arg_set_id,
- arg_set_id
-FROM counter_with_dur_for_track($counter_track_id)
-WHERE TRUE
- AND ts + dur >= $start_ts
- AND ts < $end_ts
-ORDER BY ts ASC;
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.counters;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/cpus.sql b/src/trace_processor/perfetto_sql/stdlib/common/cpus.sql
index d897503..7923e86 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/cpus.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/cpus.sql
@@ -13,57 +13,9 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-
-CREATE PERFETTO TABLE _cpu_sizes AS
-SELECT 0 AS n, 'little' AS size
-UNION
-SELECT 1 AS n, 'mid' AS size
-UNION
-SELECT 2 AS n, 'big' AS size;
-
-CREATE PERFETTO TABLE _ranked_cpus AS
-SELECT
- (DENSE_RANK() OVER win) - 1 AS n,
- cpu
-FROM (
- SELECT
- track.cpu AS cpu,
- MAX(counter.value) AS maxfreq
- FROM counter
- JOIN cpu_counter_track AS track
- ON (counter.track_id = track.id)
- WHERE track.name = "cpufreq"
- GROUP BY track.cpu
-)
-WINDOW win AS (ORDER BY maxfreq);
-
--- Guess size of CPU.
--- On some multicore devices the cores are heterogeneous and divided
--- into two or more 'sizes'. In a typical case a device might have 8
--- cores of which 4 are 'little' (low power & low performance) and 4
--- are 'big' (high power & high performance). This functions attempts
--- to map a given CPU index onto the relevant descriptor. For
--- homogeneous systems this returns NULL.
-CREATE PERFETTO FUNCTION guess_cpu_size(
- -- Index of the CPU whose size we will guess.
- cpu_index INT)
--- A descriptive size ('little', 'mid', 'big', etc) or NULL if we have insufficient information.
-RETURNS STRING AS
-SELECT
- IIF((SELECT COUNT(DISTINCT n) FROM _ranked_cpus) >= 2, size, null) as size
-FROM _ranked_cpus
-LEFT JOIN _cpu_sizes USING(n)
-WHERE cpu = $cpu_index;
-
-
--- A list of CPUs with their sizes.
-CREATE PERFETTO TABLE cpus(
- -- Index of the CPU.
- cpu_index INT,
- -- A descriptive size ('little', 'mid', 'big', etc) or NULL if we have insufficient information.
- size STRING
-) AS
-SELECT
- cpu as cpu_index,
- guess_cpu_size(cpu) AS size
-FROM _ranked_cpus;
\ No newline at end of file
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.cpus;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/metadata.sql b/src/trace_processor/perfetto_sql/stdlib/common/metadata.sql
index e667477..bd1a0fd 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/metadata.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/metadata.sql
@@ -13,10 +13,9 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
--- Extracts an int value with the given name from the metadata table.
-CREATE PERFETTO FUNCTION extract_int_metadata(
- -- The name of the metadata entry.
- name STRING)
--- int_value for the given name. NULL if there's no such entry.
-RETURNS LONG AS
-SELECT int_value FROM metadata WHERE name = ($name);
\ No newline at end of file
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.metadata;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/percentiles.sql b/src/trace_processor/perfetto_sql/stdlib/common/percentiles.sql
index 47ecde0..525c95c 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/percentiles.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/percentiles.sql
@@ -13,106 +13,9 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE common.counters;
-INCLUDE PERFETTO MODULE common.timestamps;
-
-CREATE PERFETTO FUNCTION _number_generator(upper_limit INT)
-RETURNS TABLE(num INT) AS
-WITH nums AS
- (SELECT 1 num UNION SELECT num + 1
- from NUMS
- WHERE num < $upper_limit)
-SELECT num FROM nums;
-
+-- No new changes allowed. Will be removed after v45 of Perfetto.
--
--- Get durations for percentile
---
-
--- All percentiles (range 1-100) for counter track ID in a given time range.
---
--- Percentiles are calculated by:
--- 1. Dividing the sum of duration in time range for each value in the counter
--- by duration of the counter in range. This gives us `percentile_for)value` (DOUBLE).
--- 2. Fetching each percentile by taking floor of each `percentile_for_value`, grouping by
--- resulting `percentile` and MIN from value for each grouping. As we are rounding down,
--- taking MIN assures most reliable data.
--- 3. Filling the possible gaps in percentiles by getting the minimal value from higher
--- percentiles for each gap.
-CREATE PERFETTO FUNCTION counter_percentiles_for_time_range(
- -- Id of the counter track.
- counter_track_id INT,
- -- Timestamp of start of time range.
- start_ts LONG,
- -- Timestamp of end of time range.
- end_ts LONG)
-RETURNS TABLE(
- -- All of the numbers from 1 to 100.
- percentile INT,
- -- Value for the percentile.
- value DOUBLE
-) AS
-WITH percentiles_for_value AS (
- SELECT
- value,
- (CAST(SUM(dur) OVER(ORDER BY value ASC) AS DOUBLE) /
- ($end_ts - MAX($start_ts, earliest_timestamp_for_counter_track($counter_track_id)))) * 100
- AS percentile_for_value
- FROM COUNTER_FOR_TIME_RANGE($counter_track_id, $start_ts, $end_ts)
- ORDER BY value ASC
-),
-with_gaps AS (
- SELECT
- CAST(percentile_for_value AS INT) AS percentile,
- MIN(value) AS value
- FROM percentiles_for_value
- GROUP BY percentile
- ORDER BY percentile ASC)
-SELECT
- num AS percentile,
- IFNULL(value, MIN(value) OVER (ORDER BY percentile DESC)) AS value
-FROM _NUMBER_GENERATOR(100) AS nums
-LEFT JOIN with_gaps ON with_gaps.percentile = nums.num
-ORDER BY percentile DESC;
-
--- All percentiles (range 1-100) for counter track ID.
-CREATE PERFETTO FUNCTION counter_percentiles_for_track(
- -- Id of the counter track.
- counter_track_id INT)
-RETURNS TABLE(
- -- All of the numbers from 1 to 100.
- percentile INT,
- -- Value for the percentile.
- value DOUBLE
-) AS
-SELECT *
-FROM counter_percentiles_for_time_range(
- $counter_track_id, trace_start(), trace_end());
-
--- Value for specific percentile (range 1-100) for counter track ID in time range.
-CREATE PERFETTO FUNCTION counter_track_percentile_for_time(
- -- Id of the counter track.
- counter_track_id INT,
- -- Any of the numbers from 1 to 100.
- percentile INT,
- -- Timestamp of start of time range.
- start_ts LONG,
- -- Timestamp of end of time range.
- end_ts LONG)
--- Value for the percentile.
-RETURNS DOUBLE AS
-SELECT value
-FROM counter_percentiles_for_time_range($counter_track_id, $start_ts, $end_ts)
-WHERE percentile = $percentile;
-
--- Value for specific percentile (range 1-100) for counter track ID.
-CREATE PERFETTO FUNCTION counter_track_percentile(
- -- Id of the counter track.
- counter_track_id INT,
- -- Any of the numbers from 1 to 100.
- percentile INT)
--- Value for the percentile.
-RETURNS DOUBLE AS
-SELECT counter_track_percentile_for_time($counter_track_id,
- $percentile,
- trace_start(),
- trace_end());
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.percentiles;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/slices.sql b/src/trace_processor/perfetto_sql/stdlib/common/slices.sql
index 84badb6..d5d70c9 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/slices.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/slices.sql
@@ -13,244 +13,9 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
--- All thread slices with data about thread, thread track and process.
--- Where possible, use available view functions which filter this view.
-CREATE PERFETTO VIEW thread_slice(
- -- Alias for `slice.id`.
- id INT,
- -- Alias for `slice.type`.
- type STRING,
- -- Alias for `slice.ts`.
- ts INT,
- -- Alias for `slice.dur`.
- dur INT,
- -- Alias for `slice.category`.
- category STRING,
- -- Alias for `slice.name`.
- name STRING,
- -- Alias for `slice.track_id`.
- track_id INT,
- -- Alias for `thread_track.name`.
- track_name STRING,
- -- Alias for `thread.name`.
- thread_name STRING,
- -- Alias for `thread.utid`.
- utid INT,
- -- Alias for `thread.tid`
- tid INT,
- -- Alias for `process.name`.
- process_name STRING,
- -- Alias for `process.upid`.
- upid INT,
- -- Alias for `process.pid`.
- pid INT,
- -- Alias for `slice.depth`.
- depth INT,
- -- Alias for `slice.parent_id`.
- parent_id INT,
- -- Alias for `slice.arg_set_id`.
- arg_set_id INT,
- -- Alias for `slice.thread_ts`.
- thread_ts INT,
- -- Alias for `slice.thread_dur`.
- thread_dur INT
-) AS
-SELECT
- slice.id,
- slice.type,
- slice.ts,
- slice.dur,
- slice.category,
- slice.name,
- slice.track_id,
- thread_track.name AS track_name,
- thread.name AS thread_name,
- thread.utid,
- thread.tid,
- process.name AS process_name,
- process.upid,
- process.pid,
- slice.depth,
- slice.parent_id,
- slice.arg_set_id,
- slice.thread_ts,
- slice.thread_dur
-FROM slice
-JOIN thread_track ON slice.track_id = thread_track.id
-JOIN thread USING (utid)
-LEFT JOIN process USING (upid);
-
--- All process slices with data about process track and process.
--- Where possible, use available view functions which filter this view.
-CREATE PERFETTO VIEW process_slice(
- -- Alias for `slice.id`.
- id INT,
- -- Alias for `slice.type`.
- type STRING,
- -- Alias for `slice.ts`.
- ts INT,
- -- Alias for `slice.dur`.
- dur INT,
- -- Alias for `slice.category`.
- category STRING,
- -- Alias for `slice.name`.
- name STRING,
- -- Alias for `slice.track_id`.
- track_id INT,
- -- Alias for `process_track.name`.
- track_name STRING,
- -- Alias for `process.name`.
- process_name STRING,
- -- Alias for `process.upid`.
- upid INT,
- -- Alias for `process.pid`.
- pid INT,
- -- Alias for `slice.depth`.
- depth INT,
- -- Alias for `slice.parent_id`.
- parent_id INT,
- -- Alias for `slice.arg_set_id`.
- arg_set_id INT,
- -- Alias for `slice.thread_ts`.
- thread_ts INT,
- -- Alias for `slice.thread_dur`.
- thread_dur INT
-) AS
-SELECT
- slice.id,
- slice.type,
- slice.ts,
- slice.dur,
- slice.category,
- slice.name,
- slice.track_id,
- process_track.name AS track_name,
- process.name AS process_name,
- process.upid,
- process.pid,
- slice.depth,
- slice.parent_id,
- slice.arg_set_id,
- slice.thread_ts,
- slice.thread_dur
-FROM slice
-JOIN process_track ON slice.track_id = process_track.id
-JOIN process USING (upid);
-
--- Checks if slice has an ancestor with provided name.
-CREATE PERFETTO FUNCTION has_parent_slice_with_name(
- -- Id of the slice to check parents of.
- id INT,
- -- Name of potential ancestor slice.
- parent_name STRING)
--- Whether `parent_name` is a name of an ancestor slice.
-RETURNS BOOL AS
-SELECT EXISTS(
- SELECT 1
- FROM ancestor_slice($id)
- WHERE name = $parent_name
- LIMIT 1
-);
-
--- Checks if slice has a descendant with provided name.
-CREATE PERFETTO FUNCTION has_descendant_slice_with_name(
- -- Id of the slice to check descendants of.
- id INT,
- -- Name of potential descendant slice.
- descendant_name STRING
-)
--- Whether `descendant_name` is a name of an descendant slice.
-RETURNS BOOL AS
-SELECT EXISTS(
- SELECT 1
- FROM descendant_slice($id)
- WHERE name = $descendant_name
- LIMIT 1
-);
-
--- Count slices with specified name.
-CREATE PERFETTO FUNCTION slice_count(
- -- Name of the slices to counted.
- slice_glob STRING)
--- Number of slices with the name.
-RETURNS INT AS
-SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;;
-
--- Finds the end timestamp for a given slice's descendant with a given name.
--- If there are multiple descendants with a given name, the function will return the
--- first one, so it's most useful when working with a timeline broken down into phases,
--- where each subphase can happen only once.
-CREATE PERFETTO FUNCTION descendant_slice_end(
- -- Id of the parent slice.
- parent_id INT,
- -- Name of the child with the desired end TS.
- child_name STRING
-)
--- End timestamp of the child or NULL if it doesn't exist.
-RETURNS INT AS
-SELECT
- CASE WHEN s.dur
- IS NOT -1 THEN s.ts + s.dur
- ELSE NULL
- END
-FROM descendant_slice($parent_id) s
-WHERE s.name = $child_name
-LIMIT 1;
-
--- Finds all slices with a direct parent with the given parent_id.
-CREATE PERFETTO FUNCTION direct_children_slice(
- -- Id of the parent slice.
- parent_id LONG)
-RETURNS TABLE(
- -- Alias for `slice.id`.
- id LONG,
- -- Alias for `slice.type`.
- type STRING,
- -- Alias for `slice.ts`.
- ts LONG,
- -- Alias for `slice.dur`.
- dur LONG,
- -- Alias for `slice.category`.
- category LONG,
- -- Alias for `slice.name`.
- name STRING,
- -- Alias for `slice.track_id`.
- track_id LONG,
- -- Alias for `slice.depth`.
- depth LONG,
- -- Alias for `slice.parent_id`.
- parent_id LONG,
- -- Alias for `slice.arg_set_id`.
- arg_set_id LONG,
- -- Alias for `slice.thread_ts`.
- thread_ts LONG,
- -- Alias for `slice.thread_dur`.
- thread_dur LONG
-) AS
-SELECT
- slice.id,
- slice.type,
- slice.ts,
- slice.dur,
- slice.category,
- slice.name,
- slice.track_id,
- slice.depth,
- slice.parent_id,
- slice.arg_set_id,
- slice.thread_ts,
- slice.thread_dur
-FROM slice
-WHERE parent_id = $parent_id;
-
--- Given a slice id, returns the name of the slice.
-CREATE PERFETTO FUNCTION slice_name_from_id(
- -- The slice id which we need the name for.
- id LONG
-)
--- The name of slice with the given id.
-RETURNS STRING AS
-SELECT
- name
-FROM slice
-WHERE $id = id;
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/thread_states.sql b/src/trace_processor/perfetto_sql/stdlib/common/thread_states.sql
index d43d6a1..a21e9da 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/thread_states.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/thread_states.sql
@@ -13,107 +13,9 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE common.timestamps;
-INCLUDE PERFETTO MODULE common.cpus;
-
--- TODO(altimin): this doesn't handle some corner cases which thread_state.ts
--- handles (as complex strings manipulations in SQL are pretty painful),
--- but they are pretty niche.
--- Translates the thread state name from a single-letter shorthard to
--- a human-readable name.
-CREATE PERFETTO FUNCTION _translate_thread_state_name(name STRING)
-RETURNS STRING AS
-SELECT CASE $name
-WHEN 'Running' THEN 'Running'
-WHEN 'R' THEN 'Runnable'
-WHEN 'R+' THEN 'Runnable (Preempted)'
-WHEN 'S' THEN 'Sleeping'
-WHEN 'D' THEN 'Uninterruptible Sleep'
-WHEN 'T' THEN 'Stopped'
-WHEN 't' THEN 'Traced'
-WHEN 'X' THEN 'Exit (Dead)'
-WHEN 'Z' THEN 'Exit (Zombie)'
-WHEN 'x' THEN 'Task Dead'
-WHEN 'I' THEN 'Idle'
-WHEN 'K' THEN 'Wakekill'
-WHEN 'W' THEN 'Waking'
-WHEN 'P' THEN 'Parked'
-WHEN 'N' THEN 'No Load'
-ELSE $name
-END;
-
--- Returns a human-readable name for a thread state.
-CREATE PERFETTO FUNCTION human_readable_thread_state_name(
- -- Thread state id.
- id INT)
--- Human-readable name for the thread state.
-RETURNS STRING AS
-WITH data AS (
- SELECT
- _translate_thread_state_name(state) AS state,
- (CASE io_wait
- WHEN 1 THEN ' (IO)'
- WHEN 0 THEN ' (non-IO)'
- ELSE ''
- END) AS io_wait
- FROM thread_state
- WHERE id = $id
-)
-SELECT
- printf('%s%s', state, io_wait)
-FROM data;
-
--- Returns an aggregation of thread states (by state and cpu) for a given
--- interval of time for a given thread.
-CREATE PERFETTO FUNCTION thread_state_summary_for_interval(
- -- The start of the interval.
- ts INT,
- -- The duration of the interval.
- dur INT,
- -- The utid of the thread.
- utid INT)
-RETURNS TABLE(
- -- Human-readable thread state name.
- state STRING,
- -- Raw thread state name, alias of `thread_state.state`.
- raw_state STRING,
- -- The type of CPU if available (e.g. "big" / "mid" / "little").
- cpu_type STRING,
- -- The CPU index.
- cpu INT,
- -- The name of the kernel function execution is blocked in.
- blocked_function STRING,
- -- The total duration.
- dur INT
-) AS
-WITH
-states_starting_inside AS (
- SELECT id
- FROM thread_state
- WHERE $ts <= ts
- AND ts <= $ts + $dur
- AND utid = $utid
-),
-first_state_starting_before AS (
- SELECT id
- FROM thread_state
- WHERE ts < $ts AND utid = $utid
- ORDER BY ts DESC
- LIMIT 1
-),
-relevant_states AS (
- SELECT * FROM states_starting_inside
- UNION ALL
- SELECT * FROM first_state_starting_before
-)
-SELECT
- human_readable_thread_state_name(id) as state,
- state as raw_state,
- guess_cpu_size(cpu) as cpu_type,
- cpu,
- blocked_function,
- sum(spans_overlapping_dur($ts, $dur, ts, dur)) as dur
-FROM thread_state
-JOIN relevant_states USING (id)
-GROUP BY state, raw_state, cpu_type, cpu, blocked_function
-ORDER BY dur desc;
\ No newline at end of file
+-- No new changes allowed. Will be removed after v45 of Perfetto.
+--
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.thread_states;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/common/timestamps.sql b/src/trace_processor/perfetto_sql/stdlib/common/timestamps.sql
index 81b89a4..8f91d3b 100644
--- a/src/trace_processor/perfetto_sql/stdlib/common/timestamps.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/common/timestamps.sql
@@ -13,137 +13,9 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
+-- No new changes allowed. Will be removed after v45 of Perfetto.
--
--- Trace bounds
---
-
--- Fetch start of the trace.
-CREATE PERFETTO FUNCTION trace_start()
--- Start of the trace in nanoseconds.
-RETURNS LONG AS
-SELECT start_ts FROM trace_bounds;
-
--- Fetch end of the trace.
-CREATE PERFETTO FUNCTION trace_end()
--- End of the trace in nanoseconds.
-RETURNS LONG AS
-SELECT end_ts FROM trace_bounds;
-
--- Fetch duration of the trace.
-CREATE PERFETTO FUNCTION trace_dur()
--- Duration of the trace in nanoseconds.
-RETURNS LONG AS
-SELECT trace_end() - trace_start();
-
--- Checks whether two spans are overlapping.
-CREATE PERFETTO FUNCTION is_spans_overlapping(
- -- Start of first span.
- ts1 LONG,
- -- End of first span.
- ts_end1 LONG,
- -- Start of second span.
- ts2 LONG,
- -- End of second span.
- ts_end2 LONG)
--- Whether two spans are overlapping.
-RETURNS BOOL AS
-SELECT (IIF($ts1 < $ts2, $ts2, $ts1)
- < IIF($ts_end1 < $ts_end2, $ts_end1, $ts_end2));
-
---Return the overlapping duration between two spans.
---If either duration is less than 0 or there's no intersection, 0 is returned
-CREATE PERFETTO FUNCTION spans_overlapping_dur(
- -- Timestamp of first slice start.
- ts1 LONG,
- -- Duration of first slice.
- dur1 LONG,
- -- Timestamp of second slice start.
- ts2 LONG,
- -- Duration of second slice.
- dur2 LONG
-)
--- Overlapping duration
-RETURNS INT AS
-SELECT
- CASE
- WHEN $dur1 = -1 OR $dur2 = -1 THEN 0
- WHEN $ts1 + $dur1 < $ts2 OR $ts2 + $dur2 < $ts1 THEN 0
- WHEN ($ts1 >= $ts2) AND ($ts1 + $dur1 <= $ts2 + $dur2) THEN $dur1
- WHEN ($ts1 < $ts2) AND ($ts1 + $dur1 < $ts2 + $dur2) THEN $ts1 + $dur1 - $ts2
- WHEN ($ts1 > $ts2) AND ($ts1 + $dur1 > $ts2 + $dur2) THEN $ts2 + $dur2 - $ts1
- ELSE $dur2
- END;
-
---
--- Helpers for defining time durations.
---
-
--- Converts a duration in seconds to nanoseconds, which is the default representation
--- of time durations in trace processor. Provided for consisensy with other functions.
-CREATE PERFETTO FUNCTION ns(
- -- Time duration in nanoseconds.
- nanos INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $nanos;
-
--- Converts a duration in microseconds to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION us(
- -- Time duration in microseconds.
- micros INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $micros * 1000;
-
--- Converts a duration in millseconds to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION ms(
- -- Time duration in milliseconds.
- millis INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $millis * 1000 * 1000;
-
--- Converts a duration in seconds to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION seconds(
- -- Time duration in seconds.
- seconds INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $seconds * 1000 * 1000 * 1000;
-
--- Converts a duration in minutes to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION minutes(
- -- Time duration in minutes.
- minutes INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $minutes * 60 * 1000 * 1000 * 1000;
-
--- Converts a duration in hours to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION hours(
- -- Time duration in hours.
- hours INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $hours * 60 * 60 * 1000 * 1000 * 1000;
-
--- Converts a duration in days to nanoseconds, which is the default
--- representation of time durations in trace processor.
-CREATE PERFETTO FUNCTION days(
- -- Time duration in days.
- days INT
-)
--- Time duration in nanoseconds.
-RETURNS INT AS
-SELECT $days * 24 * 60 * 60 * 1000 * 1000 * 1000;
+-- We decided to move away from the generalised `common` module and migrate the
+-- most useful functionality into specialised modules.
+INCLUDE PERFETTO MODULE deprecated.v42.common.args;
+INCLUDE PERFETTO MODULE deprecated.v42.common.timestamps;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/counters/intervals.sql b/src/trace_processor/perfetto_sql/stdlib/counters/intervals.sql
index 4bc69ce..4b11c7c 100644
--- a/src/trace_processor/perfetto_sql/stdlib/counters/intervals.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/counters/intervals.sql
@@ -14,8 +14,6 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.timestamps;
-
-- For a given counter timeline (e.g. a single counter track), returns
-- intervals of time where the counter has the same value.
--
@@ -27,33 +25,38 @@
--
-- For example, suppose we have the following data:
-- ```
--- ts=0, value=10
--- ts=10, value=10
--- ts=20, value=30
+-- ts=0, value=10, track_id=1
+-- ts=0, value=10, track_id=2
+-- ts=10, value=10, track_id=1
+-- ts=10, value=20, track_id=2
+-- ts=20, value=30, track_id=1
-- [end of trace at ts = 40]
-- ```
--
-- Then this macro will generate the following intervals:
-- ```
--- ts=0, dur=20, value=10
--- ts=20, dur=10, value=30
+-- ts=0, dur=20, value=10, track_id=1
+-- ts=20, dur=10, value=30, track_id=1
+-- ts=0, dur=10, value=10, track_id=2
+-- ts=10, dur=30, value=20, track_id=2
-- ```
CREATE PERFETTO MACRO counter_leading_intervals(
-- A table/view/subquery corresponding to a "counter-like" table.
- -- This table must have the columns "id" and "ts" and "value" corresponding
- -- to an id, timestamp and associated counter value.
+ -- This table must have the columns "id" and "ts" and "track_id" and "value" corresponding
+ -- to an id, timestamp, counter track_id and associated counter value.
counter_table TableOrSubquery)
--- Table with the schema (id UINT32, ts UINT64, value DOUBLE, dur INT).
+-- Table with the schema (id UINT32, ts UINT64, track_id UINT64, value DOUBLE, dur INT).
RETURNS TableOrSubquery AS
(
WITH base AS (
- SELECT id, ts, value, LAG(value) OVER (ORDER BY ts) AS lag_value
+ SELECT id, ts, track_id, value, LAG(value) OVER (PARTITION BY track_id ORDER BY ts) AS lag_value
FROM $counter_table
)
SELECT
id,
ts,
- LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur,
+ track_id,
+ LEAD(ts, 1, trace_end()) OVER(PARTITION BY track_id ORDER BY ts) - ts AS dur,
CAST(value AS INT) AS value
FROM base
WHERE value != lag_value OR lag_value IS NULL
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/deprecated/BUILD.gn
new file mode 100644
index 0000000..1e92f31
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright (C) 2024 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("../../../../../gn/perfetto_sql.gni")
+
+perfetto_sql_source_set("deprecated") {
+ sources = [ "v42/common" ]
+}
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/BUILD.gn
new file mode 100644
index 0000000..08597bb
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/BUILD.gn
@@ -0,0 +1,28 @@
+# Copyright (C) 2022 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("../../../../../../../gn/perfetto_sql.gni")
+
+perfetto_sql_source_set("common") {
+ sources = [
+ "args.sql",
+ "counters.sql",
+ "cpus.sql",
+ "metadata.sql",
+ "percentiles.sql",
+ "slices.sql",
+ "thread_states.sql",
+ "timestamps.sql",
+ ]
+}
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/args.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/args.sql
new file mode 100644
index 0000000..df0615a
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/args.sql
@@ -0,0 +1,31 @@
+--
+-- Copyright 2023 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.
+
+-- Returns the formatted value of a given argument.
+-- Similar to EXTRACT_ARG, but instead of returning the raw value, it returns
+-- the value formatted according to the 'value_type' column (e.g. for booleans,
+-- EXTRACT_ARG will return 0 or 1, while FORMATTED_ARG will return 'true' or
+-- 'false').
+CREATE PERFETTO FUNCTION formatted_arg(
+ -- Id of the arg set.
+ arg_set_id INT,
+ -- Key of the argument.
+ arg_key STRING
+)
+-- Formatted value of the argument.
+RETURNS STRING AS
+SELECT display_value
+FROM args
+WHERE arg_set_id = $arg_set_id AND key = $arg_key;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/counters.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/counters.sql
new file mode 100644
index 0000000..7923c52
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/counters.sql
@@ -0,0 +1,101 @@
+--
+-- Copyright 2023 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.
+
+INCLUDE PERFETTO MODULE deprecated.v42.common.timestamps;
+
+-- Timestamp of first counter value in a counter.
+CREATE PERFETTO FUNCTION earliest_timestamp_for_counter_track(
+ -- Id of a counter track with a counter.
+ counter_track_id INT)
+-- Timestamp of first counter value. Null if doesn't exist.
+RETURNS LONG AS
+SELECT MIN(ts) FROM counter WHERE counter.track_id = $counter_track_id;
+
+-- Counter values with details of counter track with calculated duration of each counter value.
+-- Duration is calculated as time from counter to the next counter.
+CREATE PERFETTO FUNCTION counter_with_dur_for_track(
+ -- Id of track counter track.
+ counter_track_id INT)
+RETURNS TABLE(
+ -- Timestamp of the counter value.
+ ts LONG,
+ -- Duration of the counter value.
+ dur LONG,
+ -- Counter value.
+ value DOUBLE,
+ -- Id of the counter track.
+ track_id INT,
+ -- Name of the counter track.
+ track_name STRING,
+ -- Counter track set id.
+ track_arg_set_id INT,
+ -- Counter arg set id.
+ arg_set_id INT
+) AS
+SELECT
+ ts,
+ LEAD(ts, 1, trace_end()) OVER(ORDER BY ts) - ts AS dur,
+ value,
+ track.id AS track_id,
+ track.name AS track_name,
+ track.source_arg_set_id AS track_arg_set_id,
+ counter.arg_set_id AS arg_set_id
+FROM counter
+JOIN counter_track track ON track.id = counter.track_id
+WHERE track.id = $counter_track_id;
+
+-- COUNTER_WITH_DUR_FOR_TRACK but in a specified time.
+-- Does calculation over the table ends - creates an artificial counter value at
+-- the start if needed and chops the duration of the last timestamps in range.
+CREATE PERFETTO FUNCTION counter_for_time_range(
+ -- Id of track counter track.
+ counter_track_id INT,
+ -- Timestamp of the timerange start.
+ -- Can be earlier than the first counter value.
+ start_ts LONG,
+ -- Timestamp of the timerange end.
+ end_ts LONG)
+RETURNS TABLE(
+ -- Timestamp of the counter value.
+ ts LONG,
+ -- Duration of the counter value.
+ dur LONG,
+ -- Counter value.
+ value DOUBLE,
+ -- If of the counter track.
+ track_id INT,
+ -- Name of the counter track.
+ track_name STRING,
+ -- Counter track set id.
+ track_arg_set_id INT,
+ -- Counter arg set id.
+ arg_set_id INT
+) AS
+SELECT
+ IIF(ts < $start_ts, $start_ts, ts) AS ts,
+ IIF(
+ ts < $start_ts,
+ dur - ($start_ts - ts),
+ IIF(ts + dur > $end_ts, $end_ts - ts, dur)) AS dur,
+ value,
+ track_id,
+ track_name,
+ track_arg_set_id,
+ arg_set_id
+FROM counter_with_dur_for_track($counter_track_id)
+WHERE TRUE
+ AND ts + dur >= $start_ts
+ AND ts < $end_ts
+ORDER BY ts ASC;
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/cpus.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/cpus.sql
new file mode 100644
index 0000000..d897503
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/cpus.sql
@@ -0,0 +1,69 @@
+--
+-- Copyright 2023 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.
+
+
+CREATE PERFETTO TABLE _cpu_sizes AS
+SELECT 0 AS n, 'little' AS size
+UNION
+SELECT 1 AS n, 'mid' AS size
+UNION
+SELECT 2 AS n, 'big' AS size;
+
+CREATE PERFETTO TABLE _ranked_cpus AS
+SELECT
+ (DENSE_RANK() OVER win) - 1 AS n,
+ cpu
+FROM (
+ SELECT
+ track.cpu AS cpu,
+ MAX(counter.value) AS maxfreq
+ FROM counter
+ JOIN cpu_counter_track AS track
+ ON (counter.track_id = track.id)
+ WHERE track.name = "cpufreq"
+ GROUP BY track.cpu
+)
+WINDOW win AS (ORDER BY maxfreq);
+
+-- Guess size of CPU.
+-- On some multicore devices the cores are heterogeneous and divided
+-- into two or more 'sizes'. In a typical case a device might have 8
+-- cores of which 4 are 'little' (low power & low performance) and 4
+-- are 'big' (high power & high performance). This functions attempts
+-- to map a given CPU index onto the relevant descriptor. For
+-- homogeneous systems this returns NULL.
+CREATE PERFETTO FUNCTION guess_cpu_size(
+ -- Index of the CPU whose size we will guess.
+ cpu_index INT)
+-- A descriptive size ('little', 'mid', 'big', etc) or NULL if we have insufficient information.
+RETURNS STRING AS
+SELECT
+ IIF((SELECT COUNT(DISTINCT n) FROM _ranked_cpus) >= 2, size, null) as size
+FROM _ranked_cpus
+LEFT JOIN _cpu_sizes USING(n)
+WHERE cpu = $cpu_index;
+
+
+-- A list of CPUs with their sizes.
+CREATE PERFETTO TABLE cpus(
+ -- Index of the CPU.
+ cpu_index INT,
+ -- A descriptive size ('little', 'mid', 'big', etc) or NULL if we have insufficient information.
+ size STRING
+) AS
+SELECT
+ cpu as cpu_index,
+ guess_cpu_size(cpu) AS size
+FROM _ranked_cpus;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/metadata.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/metadata.sql
new file mode 100644
index 0000000..e667477
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/metadata.sql
@@ -0,0 +1,22 @@
+--
+-- Copyright 2022 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.
+
+-- Extracts an int value with the given name from the metadata table.
+CREATE PERFETTO FUNCTION extract_int_metadata(
+ -- The name of the metadata entry.
+ name STRING)
+-- int_value for the given name. NULL if there's no such entry.
+RETURNS LONG AS
+SELECT int_value FROM metadata WHERE name = ($name);
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/percentiles.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/percentiles.sql
new file mode 100644
index 0000000..78e1ed1
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/percentiles.sql
@@ -0,0 +1,118 @@
+--
+-- Copyright 2023 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.
+
+INCLUDE PERFETTO MODULE deprecated.v42.common.counters;
+INCLUDE PERFETTO MODULE deprecated.v42.common.timestamps;
+
+CREATE PERFETTO FUNCTION _number_generator(upper_limit INT)
+RETURNS TABLE(num INT) AS
+WITH nums AS
+ (SELECT 1 num UNION SELECT num + 1
+ from NUMS
+ WHERE num < $upper_limit)
+SELECT num FROM nums;
+
+--
+-- Get durations for percentile
+--
+
+-- All percentiles (range 1-100) for counter track ID in a given time range.
+--
+-- Percentiles are calculated by:
+-- 1. Dividing the sum of duration in time range for each value in the counter
+-- by duration of the counter in range. This gives us `percentile_for)value` (DOUBLE).
+-- 2. Fetching each percentile by taking floor of each `percentile_for_value`, grouping by
+-- resulting `percentile` and MIN from value for each grouping. As we are rounding down,
+-- taking MIN assures most reliable data.
+-- 3. Filling the possible gaps in percentiles by getting the minimal value from higher
+-- percentiles for each gap.
+CREATE PERFETTO FUNCTION counter_percentiles_for_time_range(
+ -- Id of the counter track.
+ counter_track_id INT,
+ -- Timestamp of start of time range.
+ start_ts LONG,
+ -- Timestamp of end of time range.
+ end_ts LONG)
+RETURNS TABLE(
+ -- All of the numbers from 1 to 100.
+ percentile INT,
+ -- Value for the percentile.
+ value DOUBLE
+) AS
+WITH percentiles_for_value AS (
+ SELECT
+ value,
+ (CAST(SUM(dur) OVER(ORDER BY value ASC) AS DOUBLE) /
+ ($end_ts - MAX($start_ts, earliest_timestamp_for_counter_track($counter_track_id)))) * 100
+ AS percentile_for_value
+ FROM COUNTER_FOR_TIME_RANGE($counter_track_id, $start_ts, $end_ts)
+ ORDER BY value ASC
+),
+with_gaps AS (
+ SELECT
+ CAST(percentile_for_value AS INT) AS percentile,
+ MIN(value) AS value
+ FROM percentiles_for_value
+ GROUP BY percentile
+ ORDER BY percentile ASC)
+SELECT
+ num AS percentile,
+ IFNULL(value, MIN(value) OVER (ORDER BY percentile DESC)) AS value
+FROM _NUMBER_GENERATOR(100) AS nums
+LEFT JOIN with_gaps ON with_gaps.percentile = nums.num
+ORDER BY percentile DESC;
+
+-- All percentiles (range 1-100) for counter track ID.
+CREATE PERFETTO FUNCTION counter_percentiles_for_track(
+ -- Id of the counter track.
+ counter_track_id INT)
+RETURNS TABLE(
+ -- All of the numbers from 1 to 100.
+ percentile INT,
+ -- Value for the percentile.
+ value DOUBLE
+) AS
+SELECT *
+FROM counter_percentiles_for_time_range(
+ $counter_track_id, trace_start(), trace_end());
+
+-- Value for specific percentile (range 1-100) for counter track ID in time range.
+CREATE PERFETTO FUNCTION counter_track_percentile_for_time(
+ -- Id of the counter track.
+ counter_track_id INT,
+ -- Any of the numbers from 1 to 100.
+ percentile INT,
+ -- Timestamp of start of time range.
+ start_ts LONG,
+ -- Timestamp of end of time range.
+ end_ts LONG)
+-- Value for the percentile.
+RETURNS DOUBLE AS
+SELECT value
+FROM counter_percentiles_for_time_range($counter_track_id, $start_ts, $end_ts)
+WHERE percentile = $percentile;
+
+-- Value for specific percentile (range 1-100) for counter track ID.
+CREATE PERFETTO FUNCTION counter_track_percentile(
+ -- Id of the counter track.
+ counter_track_id INT,
+ -- Any of the numbers from 1 to 100.
+ percentile INT)
+-- Value for the percentile.
+RETURNS DOUBLE AS
+SELECT counter_track_percentile_for_time($counter_track_id,
+ $percentile,
+ trace_start(),
+ trace_end());
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql
new file mode 100644
index 0000000..05b6b21
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/slices.sql
@@ -0,0 +1,133 @@
+--
+-- Copyright 2022 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.
+
+INCLUDE PERFETTO MODULE slices.with_context;
+
+-- Checks if slice has an ancestor with provided name.
+CREATE PERFETTO FUNCTION has_parent_slice_with_name(
+ -- Id of the slice to check parents of.
+ id INT,
+ -- Name of potential ancestor slice.
+ parent_name STRING)
+-- Whether `parent_name` is a name of an ancestor slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+ SELECT 1
+ FROM ancestor_slice($id)
+ WHERE name = $parent_name
+ LIMIT 1
+);
+
+-- Checks if slice has a descendant with provided name.
+CREATE PERFETTO FUNCTION has_descendant_slice_with_name(
+ -- Id of the slice to check descendants of.
+ id INT,
+ -- Name of potential descendant slice.
+ descendant_name STRING
+)
+-- Whether `descendant_name` is a name of an descendant slice.
+RETURNS BOOL AS
+SELECT EXISTS(
+ SELECT 1
+ FROM descendant_slice($id)
+ WHERE name = $descendant_name
+ LIMIT 1
+);
+
+-- Finds the end timestamp for a given slice's descendant with a given name.
+-- If there are multiple descendants with a given name, the function will return the
+-- first one, so it's most useful when working with a timeline broken down into phases,
+-- where each subphase can happen only once.
+CREATE PERFETTO FUNCTION descendant_slice_end(
+ -- Id of the parent slice.
+ parent_id INT,
+ -- Name of the child with the desired end TS.
+ child_name STRING
+)
+-- End timestamp of the child or NULL if it doesn't exist.
+RETURNS INT AS
+SELECT
+ CASE WHEN s.dur
+ IS NOT -1 THEN s.ts + s.dur
+ ELSE NULL
+ END
+FROM descendant_slice($parent_id) s
+WHERE s.name = $child_name
+LIMIT 1;
+
+-- Finds all slices with a direct parent with the given parent_id.
+CREATE PERFETTO FUNCTION direct_children_slice(
+ -- Id of the parent slice.
+ parent_id LONG)
+RETURNS TABLE(
+ -- Alias for `slice.id`.
+ id LONG,
+ -- Alias for `slice.type`.
+ type STRING,
+ -- Alias for `slice.ts`.
+ ts LONG,
+ -- Alias for `slice.dur`.
+ dur LONG,
+ -- Alias for `slice.category`.
+ category LONG,
+ -- Alias for `slice.name`.
+ name STRING,
+ -- Alias for `slice.track_id`.
+ track_id LONG,
+ -- Alias for `slice.depth`.
+ depth LONG,
+ -- Alias for `slice.parent_id`.
+ parent_id LONG,
+ -- Alias for `slice.arg_set_id`.
+ arg_set_id LONG,
+ -- Alias for `slice.thread_ts`.
+ thread_ts LONG,
+ -- Alias for `slice.thread_dur`.
+ thread_dur LONG
+) AS
+SELECT
+ slice.id,
+ slice.type,
+ slice.ts,
+ slice.dur,
+ slice.category,
+ slice.name,
+ slice.track_id,
+ slice.depth,
+ slice.parent_id,
+ slice.arg_set_id,
+ slice.thread_ts,
+ slice.thread_dur
+FROM slice
+WHERE parent_id = $parent_id;
+
+-- Given a slice id, returns the name of the slice.
+CREATE PERFETTO FUNCTION slice_name_from_id(
+ -- The slice id which we need the name for.
+ id LONG
+)
+-- The name of slice with the given id.
+RETURNS STRING AS
+SELECT
+ name
+FROM slice
+WHERE $id = id;
+
+CREATE PERFETTO FUNCTION slice_count(
+ -- Name of the slices to counted.
+ slice_glob STRING)
+-- Number of slices with the name.
+RETURNS INT AS
+SELECT COUNT(1) FROM slice WHERE name GLOB $slice_glob;
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/thread_states.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/thread_states.sql
new file mode 100644
index 0000000..a0c63e9
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/thread_states.sql
@@ -0,0 +1,119 @@
+--
+-- Copyright 2022 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.
+
+INCLUDE PERFETTO MODULE deprecated.v42.common.timestamps;
+INCLUDE PERFETTO MODULE deprecated.v42.common.cpus;
+
+-- TODO(altimin): this doesn't handle some corner cases which thread_state.ts
+-- handles (as complex strings manipulations in SQL are pretty painful),
+-- but they are pretty niche.
+-- Translates the thread state name from a single-letter shorthard to
+-- a human-readable name.
+CREATE PERFETTO FUNCTION _translate_thread_state_name(name STRING)
+RETURNS STRING AS
+SELECT CASE $name
+WHEN 'Running' THEN 'Running'
+WHEN 'R' THEN 'Runnable'
+WHEN 'R+' THEN 'Runnable (Preempted)'
+WHEN 'S' THEN 'Sleeping'
+WHEN 'D' THEN 'Uninterruptible Sleep'
+WHEN 'T' THEN 'Stopped'
+WHEN 't' THEN 'Traced'
+WHEN 'X' THEN 'Exit (Dead)'
+WHEN 'Z' THEN 'Exit (Zombie)'
+WHEN 'x' THEN 'Task Dead'
+WHEN 'I' THEN 'Idle'
+WHEN 'K' THEN 'Wakekill'
+WHEN 'W' THEN 'Waking'
+WHEN 'P' THEN 'Parked'
+WHEN 'N' THEN 'No Load'
+ELSE $name
+END;
+
+-- Returns a human-readable name for a thread state.
+CREATE PERFETTO FUNCTION human_readable_thread_state_name(
+ -- Thread state id.
+ id INT)
+-- Human-readable name for the thread state.
+RETURNS STRING AS
+WITH data AS (
+ SELECT
+ _translate_thread_state_name(state) AS state,
+ (CASE io_wait
+ WHEN 1 THEN ' (IO)'
+ WHEN 0 THEN ' (non-IO)'
+ ELSE ''
+ END) AS io_wait
+ FROM thread_state
+ WHERE id = $id
+)
+SELECT
+ printf('%s%s', state, io_wait)
+FROM data;
+
+-- Returns an aggregation of thread states (by state and cpu) for a given
+-- interval of time for a given thread.
+CREATE PERFETTO FUNCTION thread_state_summary_for_interval(
+ -- The start of the interval.
+ ts INT,
+ -- The duration of the interval.
+ dur INT,
+ -- The utid of the thread.
+ utid INT)
+RETURNS TABLE(
+ -- Human-readable thread state name.
+ state STRING,
+ -- Raw thread state name, alias of `thread_state.state`.
+ raw_state STRING,
+ -- The type of CPU if available (e.g. "big" / "mid" / "little").
+ cpu_type STRING,
+ -- The CPU index.
+ cpu INT,
+ -- The name of the kernel function execution is blocked in.
+ blocked_function STRING,
+ -- The total duration.
+ dur INT
+) AS
+WITH
+states_starting_inside AS (
+ SELECT id
+ FROM thread_state
+ WHERE $ts <= ts
+ AND ts <= $ts + $dur
+ AND utid = $utid
+),
+first_state_starting_before AS (
+ SELECT id
+ FROM thread_state
+ WHERE ts < $ts AND utid = $utid
+ ORDER BY ts DESC
+ LIMIT 1
+),
+relevant_states AS (
+ SELECT * FROM states_starting_inside
+ UNION ALL
+ SELECT * FROM first_state_starting_before
+)
+SELECT
+ human_readable_thread_state_name(id) as state,
+ state as raw_state,
+ guess_cpu_size(cpu) as cpu_type,
+ cpu,
+ blocked_function,
+ sum(spans_overlapping_dur($ts, $dur, ts, dur)) as dur
+FROM thread_state
+JOIN relevant_states USING (id)
+GROUP BY state, raw_state, cpu_type, cpu, blocked_function
+ORDER BY dur desc;
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/timestamps.sql b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/timestamps.sql
new file mode 100644
index 0000000..bff333f
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/deprecated/v42/common/timestamps.sql
@@ -0,0 +1,72 @@
+--
+-- Copyright 2022 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.
+
+INCLUDE PERFETTO MODULE time.conversion;
+
+CREATE PERFETTO FUNCTION is_spans_overlapping(
+ ts1 LONG,
+ ts_end1 LONG,
+ ts2 LONG,
+ ts_end2 LONG)
+RETURNS BOOL AS
+SELECT (IIF($ts1 < $ts2, $ts2, $ts1)
+ < IIF($ts_end1 < $ts_end2, $ts_end1, $ts_end2));
+
+CREATE PERFETTO FUNCTION spans_overlapping_dur(
+ ts1 LONG,
+ dur1 LONG,
+ ts2 LONG,
+ dur2 LONG
+)
+RETURNS INT AS
+SELECT
+ CASE
+ WHEN $dur1 = -1 OR $dur2 = -1 THEN 0
+ WHEN $ts1 + $dur1 < $ts2 OR $ts2 + $dur2 < $ts1 THEN 0
+ WHEN ($ts1 >= $ts2) AND ($ts1 + $dur1 <= $ts2 + $dur2) THEN $dur1
+ WHEN ($ts1 < $ts2) AND ($ts1 + $dur1 < $ts2 + $dur2) THEN $ts1 + $dur1 - $ts2
+ WHEN ($ts1 > $ts2) AND ($ts1 + $dur1 > $ts2 + $dur2) THEN $ts2 + $dur2 - $ts1
+ ELSE $dur2
+ END;
+
+-- Renames
+
+CREATE PERFETTO FUNCTION ns(nanos INT)
+RETURNS INT AS
+SELECT time_from_ns($nanos);
+
+CREATE PERFETTO FUNCTION us(micros INT)
+RETURNS INT AS
+SELECT time_from_us($micros);
+
+CREATE PERFETTO FUNCTION ms(millis INT)
+RETURNS INT AS
+SELECT time_from_ms($millis);
+
+CREATE PERFETTO FUNCTION seconds(seconds INT)
+RETURNS INT AS
+SELECT time_from_s($seconds);
+
+CREATE PERFETTO FUNCTION minutes(minutes INT)
+RETURNS INT AS
+SELECT time_from_min($minutes);
+
+CREATE PERFETTO FUNCTION hours(hours INT)
+RETURNS INT AS
+SELECT time_from_hours($hours);
+
+CREATE PERFETTO FUNCTION days(days INT)
+RETURNS INT AS
+SELECT time_from_days($days);
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn
index 19162d5..03f9cd1 100644
--- a/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn
@@ -15,5 +15,8 @@
import("../../../../../gn/perfetto_sql.gni")
perfetto_sql_source_set("prelude") {
- sources = [ "slices.sql" ]
+ sources = [
+ "slices.sql",
+ "trace_bounds.sql",
+ ]
}
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql b/src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql
new file mode 100644
index 0000000..51db48d
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql
@@ -0,0 +1,40 @@
+--
+-- Copyright 2023 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.
+
+-- Definition of `trace_bounds` table. The values are being filled by Trace
+-- Processor when parsing the trace. Can't be a Perfetto table because it has
+-- to be mutable.
+-- It is recommended to depend on the `trace_start()` and `trace_end()`
+-- functions rather than directly on `trace_bounds`.
+CREATE TABLE trace_bounds AS
+SELECT 0 AS start_ts, 0 AS end_ts;
+
+-- Fetch start of the trace.
+CREATE PERFETTO FUNCTION trace_start()
+-- Start of the trace in nanoseconds.
+RETURNS LONG AS
+SELECT start_ts FROM trace_bounds;
+
+-- Fetch end of the trace.
+CREATE PERFETTO FUNCTION trace_end()
+-- End of the trace in nanoseconds.
+RETURNS LONG AS
+SELECT end_ts FROM trace_bounds;
+
+-- Fetch duration of the trace.
+CREATE PERFETTO FUNCTION trace_dur()
+-- Duration of the trace in nanoseconds.
+RETURNS LONG AS
+SELECT trace_end() - trace_start();
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql b/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
index 8e74d2f..19f68c2 100644
--- a/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql
@@ -14,7 +14,6 @@
-- limitations under the License.
--
-INCLUDE PERFETTO MODULE common.slices;
INCLUDE PERFETTO MODULE slices.flat_slices;
-- A 'thread_executing_span' is thread_state span starting with a runnable slice
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
index ac79369..2e5f02f 100644
--- a/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/BUILD.gn
@@ -18,5 +18,6 @@
sources = [
"flat_slices.sql",
"slices.sql",
+ "with_context.sql",
]
}
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql b/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
index 20383b3..9b08700 100644
--- a/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/slices.sql
@@ -13,8 +13,6 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE common.slices;
-
-- All slices with related process and thread info if available. Unlike
-- `thread_slice` and `process_slice`, this view contains all slices,
-- with thread- and process-related columns set to NULL if the slice
diff --git a/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql b/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql
new file mode 100644
index 0000000..6e9ba0d
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/slices/with_context.sql
@@ -0,0 +1,138 @@
+--
+-- 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.
+
+-- All thread slices with data about thread, thread track and process.
+-- Where possible, use available view functions which filter this view.
+CREATE PERFETTO VIEW thread_slice(
+ -- Alias for `slice.id`.
+ id INT,
+ -- Alias for `slice.type`.
+ type STRING,
+ -- Alias for `slice.ts`.
+ ts INT,
+ -- Alias for `slice.dur`.
+ dur INT,
+ -- Alias for `slice.category`.
+ category STRING,
+ -- Alias for `slice.name`.
+ name STRING,
+ -- Alias for `slice.track_id`.
+ track_id INT,
+ -- Alias for `thread_track.name`.
+ track_name STRING,
+ -- Alias for `thread.name`.
+ thread_name STRING,
+ -- Alias for `thread.utid`.
+ utid INT,
+ -- Alias for `thread.tid`
+ tid INT,
+ -- Alias for `process.name`.
+ process_name STRING,
+ -- Alias for `process.upid`.
+ upid INT,
+ -- Alias for `process.pid`.
+ pid INT,
+ -- Alias for `slice.depth`.
+ depth INT,
+ -- Alias for `slice.parent_id`.
+ parent_id INT,
+ -- Alias for `slice.arg_set_id`.
+ arg_set_id INT,
+ -- Alias for `slice.thread_ts`.
+ thread_ts INT,
+ -- Alias for `slice.thread_dur`.
+ thread_dur INT
+) AS
+SELECT
+ slice.id,
+ slice.type,
+ slice.ts,
+ slice.dur,
+ slice.category,
+ slice.name,
+ slice.track_id,
+ thread_track.name AS track_name,
+ thread.name AS thread_name,
+ thread.utid,
+ thread.tid,
+ process.name AS process_name,
+ process.upid,
+ process.pid,
+ slice.depth,
+ slice.parent_id,
+ slice.arg_set_id,
+ slice.thread_ts,
+ slice.thread_dur
+FROM slice
+JOIN thread_track ON slice.track_id = thread_track.id
+JOIN thread USING (utid)
+LEFT JOIN process USING (upid);
+
+-- All process slices with data about process track and process.
+-- Where possible, use available view functions which filter this view.
+CREATE PERFETTO VIEW process_slice(
+ -- Alias for `slice.id`.
+ id INT,
+ -- Alias for `slice.type`.
+ type STRING,
+ -- Alias for `slice.ts`.
+ ts INT,
+ -- Alias for `slice.dur`.
+ dur INT,
+ -- Alias for `slice.category`.
+ category STRING,
+ -- Alias for `slice.name`.
+ name STRING,
+ -- Alias for `slice.track_id`.
+ track_id INT,
+ -- Alias for `process_track.name`.
+ track_name STRING,
+ -- Alias for `process.name`.
+ process_name STRING,
+ -- Alias for `process.upid`.
+ upid INT,
+ -- Alias for `process.pid`.
+ pid INT,
+ -- Alias for `slice.depth`.
+ depth INT,
+ -- Alias for `slice.parent_id`.
+ parent_id INT,
+ -- Alias for `slice.arg_set_id`.
+ arg_set_id INT,
+ -- Alias for `slice.thread_ts`.
+ thread_ts INT,
+ -- Alias for `slice.thread_dur`.
+ thread_dur INT
+) AS
+SELECT
+ slice.id,
+ slice.type,
+ slice.ts,
+ slice.dur,
+ slice.category,
+ slice.name,
+ slice.track_id,
+ process_track.name AS track_name,
+ process.name AS process_name,
+ process.upid,
+ process.pid,
+ slice.depth,
+ slice.parent_id,
+ slice.arg_set_id,
+ slice.thread_ts,
+ slice.thread_dur
+FROM slice
+JOIN process_track ON slice.track_id = process_track.id
+JOIN process USING (upid);
\ No newline at end of file
diff --git a/src/trace_processor/perfetto_sql/stdlib/time/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/time/BUILD.gn
new file mode 100644
index 0000000..da92871
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/time/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright (C) 2022 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("../../../../../gn/perfetto_sql.gni")
+
+perfetto_sql_source_set("time") {
+ sources = [ "conversion.sql" ]
+}
diff --git a/src/trace_processor/perfetto_sql/stdlib/time/conversion.sql b/src/trace_processor/perfetto_sql/stdlib/time/conversion.sql
new file mode 100644
index 0000000..9a284d0
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/time/conversion.sql
@@ -0,0 +1,85 @@
+--
+-- 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.
+
+-- Returns the provided nanosecond duration, which is the default
+-- representation of time durations in trace processor. Provided for
+-- consistency with other functions.
+CREATE PERFETTO FUNCTION time_from_ns(
+ -- Time duration in nanoseconds.
+ nanos INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $nanos;
+
+-- Converts a duration in microseconds to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_us(
+ -- Time duration in microseconds.
+ micros INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $micros * 1000;
+
+-- Converts a duration in millseconds to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_ms(
+ -- Time duration in milliseconds.
+ millis INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $millis * 1000 * 1000;
+
+-- Converts a duration in seconds to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_s(
+ -- Time duration in seconds.
+ seconds INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $seconds * 1000 * 1000 * 1000;
+
+-- Converts a duration in minutes to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_min(
+ -- Time duration in minutes.
+ minutes INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $minutes * 60 * 1000 * 1000 * 1000;
+
+-- Converts a duration in hours to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_hours(
+ -- Time duration in hours.
+ hours INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $hours * 60 * 60 * 1000 * 1000 * 1000;
+
+-- Converts a duration in days to nanoseconds, which is the default
+-- representation of time durations in trace processor.
+CREATE PERFETTO FUNCTION time_from_days(
+ -- Time duration in days.
+ days INT
+)
+-- Time duration in nanoseconds.
+RETURNS INT AS
+SELECT $days * 24 * 60 * 60 * 1000 * 1000 * 1000;
diff --git a/src/trace_processor/sqlite/db_sqlite_table.cc b/src/trace_processor/sqlite/db_sqlite_table.cc
index 0f416b1..8131d36 100644
--- a/src/trace_processor/sqlite/db_sqlite_table.cc
+++ b/src/trace_processor/sqlite/db_sqlite_table.cc
@@ -46,9 +46,9 @@
#include "src/trace_processor/sqlite/sqlite_utils.h"
#include "src/trace_processor/tp_metatrace.h"
#include "src/trace_processor/util/regex.h"
+#include "src/trace_processor/util/status_macros.h"
#include "protos/perfetto/trace_processor/metatrace_categories.pbzero.h"
-#include "src/trace_processor/util/status_macros.h"
namespace perfetto::trace_processor {
@@ -116,6 +116,8 @@
case SQLITE_NULL:
value.type = SqlValue::kNull;
break;
+ default:
+ PERFETTO_FATAL("Unexpected sqlite3_value type");
}
return value;
}
@@ -405,10 +407,11 @@
if (!col.is_hidden) {
continue;
}
- auto it = std::find_if(qc.constraints().begin(), qc.constraints().end(),
- [i](const QueryConstraints::Constraint& c) {
- return i == static_cast<uint32_t>(c.column);
- });
+ auto pred = [i](const QueryConstraints::Constraint& c) {
+ return i == static_cast<uint32_t>(c.column);
+ };
+ auto it =
+ std::find_if(qc.constraints().begin(), qc.constraints().end(), pred);
if (it == qc.constraints().end()) {
return base::ErrStatus("Failed to find constraint on column '%u'", i);
}
@@ -416,12 +419,8 @@
return base::ErrStatus(
"Only equality constraints supported on column '%u'", i);
}
- auto count = std::count_if(qc.constraints().begin(), qc.constraints().end(),
- [i](const QueryConstraints::Constraint& c) {
- return i == static_cast<uint32_t>(c.column);
- });
- PERFETTO_CHECK(count > 0);
- if (count > 1) {
+ auto count = std::count_if(it + 1, qc.constraints().end(), pred);
+ if (count > 0) {
return base::ErrStatus("Found multiple constraints on column '%u'", i);
}
}
@@ -429,7 +428,7 @@
}
std::unique_ptr<SqliteTable::BaseCursor> DbSqliteTable::CreateCursor() {
- return std::unique_ptr<Cursor>(new Cursor(this, context_->cache));
+ return std::make_unique<Cursor>(this, context_->cache);
}
DbSqliteTable::Cursor::Cursor(DbSqliteTable* sqlite_table, QueryCache* cache)
@@ -502,7 +501,7 @@
uint32_t constraints_pos = 0;
for (size_t i = 0; i < qc.constraints().size(); ++i) {
const auto& cs = qc.constraints()[i];
- uint32_t col = static_cast<uint32_t>(cs.column);
+ auto col = static_cast<uint32_t>(cs.column);
// If we get a std::nullopt FilterOp, that means we should allow SQLite
// to handle the constraint.
@@ -529,7 +528,7 @@
orders_.resize(qc.order_by().size());
for (size_t i = 0; i < qc.order_by().size(); ++i) {
const auto& ob = qc.order_by()[i];
- uint32_t col = static_cast<uint32_t>(ob.iColumn);
+ auto col = static_cast<uint32_t>(ob.iColumn);
orders_[i] = Order{col, static_cast<bool>(ob.desc)};
}
@@ -678,36 +677,6 @@
return base::OkStatus();
}
-base::Status DbSqliteTable::Cursor::Next() {
- if (mode_ == Mode::kSingleRow) {
- eof_ = true;
- } else {
- eof_ = !++*iterator_;
- }
- return base::OkStatus();
-}
-
-bool DbSqliteTable::Cursor::Eof() {
- return eof_;
-}
-
-base::Status DbSqliteTable::Cursor::Column(sqlite3_context* ctx, int raw_col) {
- auto column = static_cast<uint32_t>(raw_col);
- SqlValue value = mode_ == Mode::kSingleRow
- ? SourceTable()->columns()[column].Get(*single_row_)
- : iterator_->Get(column);
- // We can say kSqliteStatic for strings because all strings are expected to
- // come from the string pool and thus will be valid for the lifetime
- // of trace processor.
- // Similarily for bytes we can also use kSqliteStatic because for our iterator
- // will hold onto the pointer as long as we don't call Next() but that only
- // happens with Next() is called on the Cursor itself at which point
- // SQLite no longer cares about the bytes pointer.
- sqlite_utils::ReportSqlValue(ctx, value, sqlite_utils::kSqliteStatic,
- sqlite_utils::kSqliteStatic);
- return base::OkStatus();
-}
-
base::Status DbSqliteTable::Cursor::ExtractTableFunctionArguments(
const Table::Schema& schema,
std::vector<Constraint>& constraints,
diff --git a/src/trace_processor/sqlite/db_sqlite_table.h b/src/trace_processor/sqlite/db_sqlite_table.h
index 74ce2e0..5f4a3d7 100644
--- a/src/trace_processor/sqlite/db_sqlite_table.h
+++ b/src/trace_processor/sqlite/db_sqlite_table.h
@@ -26,6 +26,7 @@
#include <sqlite3.h>
+#include "perfetto/base/compiler.h"
#include "perfetto/base/status.h"
#include "perfetto/trace_processor/basic_types.h"
#include "src/trace_processor/db/column/types.h"
@@ -35,6 +36,7 @@
#include "src/trace_processor/sqlite/query_cache.h"
#include "src/trace_processor/sqlite/query_constraints.h"
#include "src/trace_processor/sqlite/sqlite_table.h"
+#include "src/trace_processor/sqlite/sqlite_utils.h"
namespace perfetto {
namespace trace_processor {
@@ -97,9 +99,33 @@
base::Status Filter(const QueryConstraints& qc,
sqlite3_value** argv,
FilterHistory);
- base::Status Next();
- bool Eof();
- base::Status Column(sqlite3_context*, int N);
+
+ PERFETTO_ALWAYS_INLINE void Next() {
+ if (mode_ == Mode::kSingleRow) {
+ eof_ = true;
+ } else {
+ eof_ = !++*iterator_;
+ }
+ }
+
+ PERFETTO_ALWAYS_INLINE bool Eof() const { return eof_; }
+
+ PERFETTO_ALWAYS_INLINE void Column(sqlite3_context* ctx,
+ int raw_col) const {
+ auto column = static_cast<uint32_t>(raw_col);
+ SqlValue value = mode_ == Mode::kSingleRow
+ ? SourceTable()->columns()[column].Get(*single_row_)
+ : iterator_->Get(column);
+ // We can say kSqliteStatic for strings because all strings are expected
+ // to come from the string pool. Thus they will be valid for the lifetime
+ // of trace processor. Similarily, for bytes, we can also use
+ // kSqliteStatic because for our iterator will hold onto the pointer as
+ // long as we don't call Next(). However, that only happens when Next() is
+ // called on the Cursor itself, at which point SQLite no longer cares
+ // about the bytes pointer.
+ sqlite_utils::ReportSqlValue(ctx, value, sqlite_utils::kSqliteStatic,
+ sqlite_utils::kSqliteStatic);
+ }
private:
enum class Mode {
diff --git a/src/trace_processor/sqlite/sqlite_table.h b/src/trace_processor/sqlite/sqlite_table.h
index d6d40b3..b2a7e40 100644
--- a/src/trace_processor/sqlite/sqlite_table.h
+++ b/src/trace_processor/sqlite/sqlite_table.h
@@ -18,24 +18,16 @@
#define SRC_TRACE_PROCESSOR_SQLITE_SQLITE_TABLE_H_
#include <sqlite3.h>
-
-#include <functional>
-#include <limits>
#include <memory>
-#include <optional>
#include <string>
+#include <type_traits>
#include <vector>
#include "perfetto/base/status.h"
-#include "perfetto/ext/base/flat_hash_map.h"
-#include "perfetto/ext/base/status_or.h"
-#include "perfetto/ext/base/utils.h"
#include "perfetto/trace_processor/basic_types.h"
-#include "src/trace_processor/db/table.h"
#include "src/trace_processor/sqlite/query_constraints.h"
-namespace perfetto {
-namespace trace_processor {
+namespace perfetto::trace_processor {
class SqliteEngine;
class TypedSqliteTableBase;
@@ -104,14 +96,14 @@
FilterHistory);
// Called to forward the cursor to the next row in the table.
- base::Status Next();
+ void Next();
// Called to check if the cursor has reached eof. Column will be called iff
// this method returns true.
bool Eof();
// Used to extract the value from the column at index |N|.
- base::Status Column(sqlite3_context* context, int N);
+ void Column(sqlite3_context* context, int N);
SqliteTable* table() const { return table_; }
@@ -397,16 +389,33 @@
}
static int xNext(sqlite3_vtab_cursor* c) {
auto* cursor = static_cast<typename SubTable::Cursor*>(c);
- auto* table = static_cast<SubTable*>(cursor->table());
- return table->SetStatusAndReturn(cursor->Next());
+ using NextType = decltype(&SubTable::Cursor::Next);
+ using ReturnType =
+ std::invoke_result_t<NextType, typename SubTable::Cursor*>;
+ if constexpr (std::is_same_v<ReturnType, void>) {
+ cursor->Next();
+ return SQLITE_OK;
+ } else {
+ auto* table = static_cast<SubTable*>(cursor->table());
+ return table->SetStatusAndReturn(cursor->Next());
+ }
}
static int xEof(sqlite3_vtab_cursor* c) {
return static_cast<int>(static_cast<typename SubTable::Cursor*>(c)->Eof());
}
static int xColumn(sqlite3_vtab_cursor* c, sqlite3_context* a, int b) {
auto* cursor = static_cast<typename SubTable::Cursor*>(c);
- auto* table = static_cast<SubTable*>(cursor->table());
- return table->SetStatusAndReturn(cursor->Column(a, b));
+ using ColumnType = decltype(&SubTable::Cursor::Column);
+ using ReturnType =
+ std::invoke_result_t<ColumnType, typename SubTable::Cursor*,
+ sqlite3_context*, int>;
+ if constexpr (std::is_same_v<ReturnType, void>) {
+ cursor->Column(a, b);
+ return SQLITE_OK;
+ } else {
+ auto* table = static_cast<SubTable*>(cursor->table());
+ return table->SetStatusAndReturn(cursor->Column(a, b));
+ }
}
static int xRowid(sqlite3_vtab_cursor*, sqlite3_int64*) {
return SQLITE_ERROR;
@@ -420,7 +429,6 @@
}
};
-} // namespace trace_processor
-} // namespace perfetto
+} // namespace perfetto::trace_processor
#endif // SRC_TRACE_PROCESSOR_SQLITE_SQLITE_TABLE_H_
diff --git a/src/trace_processor/storage/stats.h b/src/trace_processor/storage/stats.h
index 70d5a1c..66a524e 100644
--- a/src/trace_processor/storage/stats.h
+++ b/src/trace_processor/storage/stats.h
@@ -60,12 +60,15 @@
F(ftrace_cpu_oldest_event_ts_end, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_overrun_begin, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_overrun_end, kIndexed, kInfo, kTrace, ""), \
- F(ftrace_cpu_overrun_delta, kIndexed, kDataLoss, kTrace, \
- "The kernel ftrace buffer cannot keep up with the rate of events " \
- "produced. Indexed by CPU. This is likely a misconfiguration."), \
+ F(ftrace_cpu_overrun_delta, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_read_events_begin, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_read_events_end, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_read_events_delta, kIndexed, kInfo, kTrace, ""), \
+ F(ftrace_cpu_has_data_loss, kIndexed, kDataLoss, kTrace, \
+ "Ftrace data for the given cpu has data losses and is therefore " \
+ "unreliable. The kernel buffer overwrote events between our reads " \
+ "in userspace. Try re-recording the trace with a bigger buffer " \
+ "(ftrace_config.buffer_size_kb), or with fewer enabled ftrace events."),\
F(ftrace_setup_errors, kSingle, kInfo, kTrace, \
"One or more atrace/ftrace categories were not found or failed to " \
"enable. See ftrace_setup_errors in the metadata table for details."), \
@@ -112,8 +115,6 @@
F(flow_end_without_start, kSingle, kInfo, kTrace, ""), \
F(flow_invalid_id, kSingle, kError, kTrace, ""), \
F(flow_without_direction, kSingle, kError, kTrace, ""), \
- F(stackprofile_empty_callstack, kSingle, kError, kTrace, \
- "Callstack had no frames. Ignored"), \
F(stackprofile_invalid_string_id, kSingle, kError, kTrace, ""), \
F(stackprofile_invalid_mapping_id, kSingle, kError, kTrace, ""), \
F(stackprofile_invalid_frame_id, kSingle, kError, kTrace, ""), \
@@ -140,7 +141,11 @@
kIndexed, kInfo, kTrace, ""), \
F(traced_buf_padding_bytes_cleared, kIndexed, kInfo, kTrace, ""), \
F(traced_buf_padding_bytes_written, kIndexed, kInfo, kTrace, ""), \
- F(traced_buf_patches_failed, kIndexed, kDataLoss, kTrace, ""), \
+ F(traced_buf_patches_failed, kIndexed, kDataLoss, kTrace, \
+ "The tracing service potentially lost data from one of the data sources "\
+ "writing into the given target_buffer. This entry can be ignored" \
+ "if you're using DISCARD buffers and traced_buf_chunks_discarded is \
+ nonzero, meaning that the buffer was filled."), \
F(traced_buf_patches_succeeded, kIndexed, kInfo, kTrace, ""), \
F(traced_buf_readaheads_failed, kIndexed, kInfo, kTrace, ""), \
F(traced_buf_readaheads_succeeded, kIndexed, kInfo, kTrace, ""), \
diff --git a/src/trace_processor/tables/BUILD.gn b/src/trace_processor/tables/BUILD.gn
index 40f5fe1..b2fcffb 100644
--- a/src/trace_processor/tables/BUILD.gn
+++ b/src/trace_processor/tables/BUILD.gn
@@ -41,8 +41,9 @@
deps = [
"../../../gn:default_deps",
"../../../include/perfetto/ext/base",
+ "../../../include/perfetto/trace_processor",
"../containers",
- "../db",
+ "../db:minimal",
"../db/column",
]
public_deps = [ ":tables_python" ]
diff --git a/src/trace_processor/tables/macros_internal.h b/src/trace_processor/tables/macros_internal.h
index ff83d20..94293e7 100644
--- a/src/trace_processor/tables/macros_internal.h
+++ b/src/trace_processor/tables/macros_internal.h
@@ -19,22 +19,25 @@
#include <cstddef>
#include <cstdint>
+#include <initializer_list>
#include <type_traits>
#include <utility>
#include <vector>
+#include "perfetto/base/compiler.h"
#include "perfetto/base/logging.h"
+#include "perfetto/trace_processor/ref_counted.h"
#include "src/trace_processor/containers/bit_vector.h"
#include "src/trace_processor/containers/row_map.h"
#include "src/trace_processor/containers/string_pool.h"
#include "src/trace_processor/db/column.h"
+#include "src/trace_processor/db/column/data_layer.h"
+#include "src/trace_processor/db/column/selector_overlay.h"
#include "src/trace_processor/db/column_storage.h"
#include "src/trace_processor/db/column_storage_overlay.h"
#include "src/trace_processor/db/table.h"
-namespace perfetto {
-namespace trace_processor {
-namespace macros_internal {
+namespace perfetto::trace_processor::macros_internal {
// We define this class to allow the table macro below to compile without
// needing templates; in reality none of the methods will be called because the
@@ -81,9 +84,9 @@
protected:
// Constructors for tables created by the regular constructor.
- explicit MacroTable(StringPool* pool,
- std::vector<ColumnLegacy> columns,
- const MacroTable* parent = nullptr)
+ PERFETTO_NO_INLINE explicit MacroTable(StringPool* pool,
+ std::vector<ColumnLegacy> columns,
+ const MacroTable* parent)
: Table(pool, 0u, std::move(columns), EmptyOverlaysFromParent(parent)),
allow_inserts_(true),
parent_(parent) {}
@@ -97,21 +100,22 @@
parent_overlay.size(),
std::move(columns),
SelectedOverlaysFromParent(parent, parent_overlay)),
- allow_inserts_(false) {}
+ allow_inserts_(false),
+ parent_(&parent) {}
~MacroTable() override;
- void UpdateOverlaysAfterParentInsert() {
+ PERFETTO_NO_INLINE void UpdateOverlaysAfterParentInsert() {
CopyLastInsertFrom(parent_->overlays());
}
- void UpdateSelfOverlayAfterInsert() {
+ PERFETTO_NO_INLINE void UpdateSelfOverlayAfterInsert() {
IncrementRowCountAndAddToLastOverlay();
}
- static std::vector<ColumnLegacy> CopyColumnsFromParentOrAddRootColumns(
- MacroTable* self,
- const MacroTable* parent) {
+ PERFETTO_NO_INLINE static std::vector<ColumnLegacy>
+ CopyColumnsFromParentOrAddRootColumns(MacroTable* self,
+ const MacroTable* parent) {
std::vector<ColumnLegacy> columns;
if (parent) {
for (const ColumnLegacy& col : parent->columns()) {
@@ -124,6 +128,31 @@
return columns;
}
+ PERFETTO_NO_INLINE void OnConstructionCompletedRegularConstructor(
+ std::initializer_list<RefPtr<column::DataLayer>> storage_layers,
+ std::initializer_list<RefPtr<column::DataLayer>> null_layers) {
+ std::vector<RefPtr<column::DataLayer>> overlay_layers(
+ OverlayCount(parent_) + 1);
+ for (uint32_t i = 0; i < overlay_layers.size() - 1; ++i) {
+ PERFETTO_CHECK(overlays()[i].row_map().IsBitVector());
+ overlay_layers[i].reset(new column::SelectorOverlay(
+ overlays()[i].row_map().GetIfBitVector()));
+ }
+ Table::OnConstructionCompleted(storage_layers, null_layers,
+ std::move(overlay_layers));
+ }
+
+ template <typename T>
+ PERFETTO_NO_INLINE static void AddColumnToVector(
+ std::vector<ColumnLegacy>& columns,
+ const char* name,
+ ColumnStorage<T>* storage,
+ uint32_t flags,
+ uint32_t column_index,
+ uint32_t overlay_index) {
+ columns.emplace_back(name, storage, flags, column_index, overlay_index);
+ }
+
static uint32_t OverlayCount(const MacroTable* parent) {
return parent ? static_cast<uint32_t>(parent->overlays().size()) : 0;
}
@@ -148,8 +177,8 @@
ColumnStorage<StringPool::Id> type_;
private:
- static std::vector<ColumnStorageOverlay> EmptyOverlaysFromParent(
- const MacroTable* parent) {
+ PERFETTO_NO_INLINE static std::vector<ColumnStorageOverlay>
+ EmptyOverlaysFromParent(const MacroTable* parent) {
std::vector<ColumnStorageOverlay> overlays(
parent ? parent->overlays().size() : 0);
for (auto& overlay : overlays) {
@@ -158,9 +187,9 @@
overlays.emplace_back();
return overlays;
}
- static std::vector<ColumnStorageOverlay> SelectedOverlaysFromParent(
- const macros_internal::MacroTable& parent,
- const RowMap& rm) {
+ PERFETTO_NO_INLINE static std::vector<ColumnStorageOverlay>
+ SelectedOverlaysFromParent(const macros_internal::MacroTable& parent,
+ const RowMap& rm) {
std::vector<ColumnStorageOverlay> overlays;
for (const auto& overlay : parent.overlays()) {
overlays.emplace_back(overlay.SelectRows(rm));
@@ -266,8 +295,6 @@
uint32_t row_number_ = 0;
};
-} // namespace macros_internal
-} // namespace trace_processor
-} // namespace perfetto
+} // namespace perfetto::trace_processor::macros_internal
#endif // SRC_TRACE_PROCESSOR_TABLES_MACROS_INTERNAL_H_
diff --git a/src/trace_processor/trace_processor_context.cc b/src/trace_processor/trace_processor_context.cc
index c7cea38..34da487 100644
--- a/src/trace_processor/trace_processor_context.cc
+++ b/src/trace_processor/trace_processor_context.cc
@@ -31,12 +31,13 @@
#include "src/trace_processor/importers/common/process_tracker.h"
#include "src/trace_processor/importers/common/slice_tracker.h"
#include "src/trace_processor/importers/common/slice_translation_table.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
#include "src/trace_processor/importers/common/track_tracker.h"
#include "src/trace_processor/importers/ftrace/ftrace_module.h"
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
#include "src/trace_processor/importers/proto/perf_sample_tracker.h"
#include "src/trace_processor/importers/proto/proto_importer_module.h"
#include "src/trace_processor/importers/proto/proto_trace_parser.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
#include "src/trace_processor/importers/proto/track_event_module.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/types/destructible.h"
diff --git a/src/trace_processor/trace_processor_storage_impl.cc b/src/trace_processor/trace_processor_storage_impl.cc
index 05b88c0..f24a1fc 100644
--- a/src/trace_processor/trace_processor_storage_impl.cc
+++ b/src/trace_processor/trace_processor_storage_impl.cc
@@ -30,14 +30,15 @@
#include "src/trace_processor/importers/common/process_tracker.h"
#include "src/trace_processor/importers/common/slice_tracker.h"
#include "src/trace_processor/importers/common/slice_translation_table.h"
-#include "src/trace_processor/importers/common/stack_profile_tracker.h"
#include "src/trace_processor/importers/common/track_tracker.h"
#include "src/trace_processor/importers/proto/chrome_track_event.descriptor.h"
#include "src/trace_processor/importers/proto/default_modules.h"
+#include "src/trace_processor/importers/proto/heap_profile_tracker.h"
#include "src/trace_processor/importers/proto/packet_analyzer.h"
#include "src/trace_processor/importers/proto/perf_sample_tracker.h"
#include "src/trace_processor/importers/proto/proto_importer_module.h"
#include "src/trace_processor/importers/proto/proto_trace_reader.h"
+#include "src/trace_processor/importers/proto/stack_profile_tracker.h"
#include "src/trace_processor/importers/proto/track_event.descriptor.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/util/descriptors.h"
@@ -62,8 +63,9 @@
context_.process_tracker.reset(new ProcessTracker(&context_));
context_.clock_tracker.reset(new ClockTracker(&context_));
context_.clock_converter.reset(new ClockConverter(&context_));
+ context_.heap_profile_tracker.reset(new HeapProfileTracker(&context_));
context_.perf_sample_tracker.reset(new PerfSampleTracker(&context_));
- context_.stack_profile_tracker.reset(new StackProfileTracker(&context_));
+ context_.global_stack_profile_tracker.reset(new GlobalStackProfileTracker());
context_.metadata_tracker.reset(new MetadataTracker(context_.storage.get()));
context_.global_args_tracker.reset(
new GlobalArgsTracker(context_.storage.get()));
@@ -141,6 +143,7 @@
}
context_.event_tracker->FlushPendingEvents();
context_.slice_tracker->FlushPendingSlices();
+ context_.heap_profile_tracker->NotifyEndOfFile();
context_.args_tracker->Flush();
context_.process_tracker->NotifyEndOfFile();
}
diff --git a/src/trace_processor/types/trace_processor_context.h b/src/trace_processor/types/trace_processor_context.h
index ad4e148..25f129b 100644
--- a/src/trace_processor/types/trace_processor_context.h
+++ b/src/trace_processor/types/trace_processor_context.h
@@ -52,8 +52,9 @@
class ForwardingTraceParser;
class FtraceModule;
class GlobalArgsTracker;
-class StackProfileTracker;
+class GlobalStackProfileTracker;
class HeapGraphTracker;
+class HeapProfileTracker;
class PerfSampleTracker;
class MetadataTracker;
class PacketAnalyzer;
@@ -100,8 +101,9 @@
std::unique_ptr<EventTracker> event_tracker;
std::unique_ptr<ClockTracker> clock_tracker;
std::unique_ptr<ClockConverter> clock_converter;
+ std::unique_ptr<HeapProfileTracker> heap_profile_tracker;
std::unique_ptr<PerfSampleTracker> perf_sample_tracker;
- std::unique_ptr<StackProfileTracker> stack_profile_tracker;
+ std::unique_ptr<GlobalStackProfileTracker> global_stack_profile_tracker;
std::unique_ptr<MetadataTracker> metadata_tracker;
// These fields are stored as pointers to Destructible objects rather than
diff --git a/src/trace_processor/util/BUILD.gn b/src/trace_processor/util/BUILD.gn
index 23ff718..c717d3e 100644
--- a/src/trace_processor/util/BUILD.gn
+++ b/src/trace_processor/util/BUILD.gn
@@ -63,16 +63,12 @@
source_set("stack_traces_util") {
sources = [
- "profiler_util.cc",
- "profiler_util.h",
"stack_traces_util.cc",
"stack_traces_util.h",
]
deps = [
"../../../gn:default_deps",
"../../../include/perfetto/ext/base:base",
- "../../../protos/perfetto/trace/profiling:zero",
- "../storage:storage",
]
}
diff --git a/src/tracing/core/shared_memory_arbiter_impl.cc b/src/tracing/core/shared_memory_arbiter_impl.cc
index dfbb66b..d9d774e 100644
--- a/src/tracing/core/shared_memory_arbiter_impl.cc
+++ b/src/tracing/core/shared_memory_arbiter_impl.cc
@@ -93,10 +93,7 @@
Chunk SharedMemoryArbiterImpl::GetNewChunk(
const SharedMemoryABI::ChunkHeader& header,
- BufferExhaustedPolicy buffer_exhausted_policy,
- size_t size_hint) {
- PERFETTO_DCHECK(size_hint == 0); // Not implemented yet.
-
+ BufferExhaustedPolicy buffer_exhausted_policy) {
int stall_count = 0;
unsigned stall_interval_us = 0;
bool task_runner_runs_on_current_thread = false;
diff --git a/src/tracing/core/shared_memory_arbiter_impl.h b/src/tracing/core/shared_memory_arbiter_impl.h
index 12316dd..9bb5cfd 100644
--- a/src/tracing/core/shared_memory_arbiter_impl.h
+++ b/src/tracing/core/shared_memory_arbiter_impl.h
@@ -130,8 +130,7 @@
// BufferExhaustedPolicy, this may return an invalid chunk if no valid free
// chunk could be found in the SMB.
SharedMemoryABI::Chunk GetNewChunk(const SharedMemoryABI::ChunkHeader&,
- BufferExhaustedPolicy,
- size_t size_hint = 0);
+ BufferExhaustedPolicy);
// Puts back a Chunk that has been completed and sends a request to the
// service to move it to the central tracing buffer. |target_buffer| is the
diff --git a/src/tracing/service/tracing_service_impl.cc b/src/tracing/service/tracing_service_impl.cc
index 3b94cbf..aba6620 100644
--- a/src/tracing/service/tracing_service_impl.cc
+++ b/src/tracing/service/tracing_service_impl.cc
@@ -1797,7 +1797,7 @@
}
if (tracing_session->state != TracingSession::STARTED) {
- PERFETTO_ELOG("Flush() called, but tracing has not been started");
+ PERFETTO_LOG("Flush() called, but tracing has not been started");
callback(false);
return;
}
diff --git a/src/tracing/service/tracing_service_impl_unittest.cc b/src/tracing/service/tracing_service_impl_unittest.cc
index 76590b4..17936e5 100644
--- a/src/tracing/service/tracing_service_impl_unittest.cc
+++ b/src/tracing/service/tracing_service_impl_unittest.cc
@@ -5080,7 +5080,7 @@
}
TEST_F(TracingServiceImplTest, ClearBeforeClone) {
- // The consumer the creates the initial tracing session.
+ // The consumer that creates the initial tracing session.
std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
consumer->Connect(svc.get());
@@ -5150,6 +5150,53 @@
HasSubstr("after_clone")))));
}
+TEST_F(TracingServiceImplTest, CloneMainSessionStopped) {
+ // The consumer that creates the initial tracing session.
+ std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
+ consumer->Connect(svc.get());
+
+ std::unique_ptr<MockProducer> producer = CreateMockProducer();
+ producer->Connect(svc.get(), "mock_producer1");
+ producer->RegisterDataSource("ds_1");
+
+ TraceConfig trace_config;
+ trace_config.add_buffers()->set_size_kb(1024); // Buf 0.
+ auto* ds_cfg = trace_config.add_data_sources()->mutable_config();
+ ds_cfg->set_name("ds_1");
+ ds_cfg->set_target_buffer(0);
+
+ consumer->EnableTracing(trace_config);
+ producer->WaitForTracingSetup();
+ producer->WaitForDataSourceSetup("ds_1");
+ producer->WaitForDataSourceStart("ds_1");
+
+ std::unique_ptr<TraceWriter> writer = producer->CreateTraceWriter("ds_1");
+ {
+ auto packet = writer->NewTracePacket();
+ packet->set_for_testing()->set_str("before_clone");
+ }
+ writer->Flush();
+
+ consumer->DisableTracing();
+ producer->WaitForDataSourceStop("ds_1");
+ consumer->WaitForTracingDisabled();
+
+ // The tracing session is disabled, but it's still there. We can still clone
+ // it.
+ std::unique_ptr<MockConsumer> clone_consumer = CreateMockConsumer();
+ clone_consumer->Connect(svc.get());
+
+ auto clone_done = task_runner.CreateCheckpoint("clone_done");
+ EXPECT_CALL(*clone_consumer, OnSessionCloned(_))
+ .WillOnce(InvokeWithoutArgs(clone_done));
+ clone_consumer->CloneSession(1);
+
+ auto packets = clone_consumer->ReadBuffers();
+ EXPECT_THAT(packets, Contains(Property(&protos::gen::TracePacket::for_testing,
+ Property(&protos::gen::TestEvent::str,
+ HasSubstr("before_clone")))));
+}
+
TEST_F(TracingServiceImplTest, CloneTransferFlush) {
// The consumer the creates the initial tracing session.
std::unique_ptr<MockConsumer> consumer = CreateMockConsumer();
diff --git a/test/data/freezer_trace.atr.sha256 b/test/data/freezer_trace.atr.sha256
new file mode 100644
index 0000000..bbe6a9b
--- /dev/null
+++ b/test/data/freezer_trace.atr.sha256
@@ -0,0 +1 @@
+abbffc92db09d1b7fd3452e9d5e91aebd5a13151660125c6e25776331efccc53
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256 b/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256
index 63cfe4c..590d1c0 100644
--- a/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256
+++ b/test/data/ui-screenshots/ui-android_trace_30s_expand_camera.png.sha256
@@ -1 +1 @@
-307a9fee76af1020dca1ad22b42c447c84fed3a4cf1321359d02aa6d41b9188f
\ No newline at end of file
+71f0799ce780f36dbdeb601ba535ee012b7323afc57254a5b383704ec384da62
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256 b/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256
index 4d6e72d..fd6b0fe 100644
--- a/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256
+++ b/test/data/ui-screenshots/ui-android_trace_30s_load.png.sha256
@@ -1 +1 @@
-c87f517ecbc37a6455d72f6cb337c001aa903754bd1cc36158268e193c6bac95
\ No newline at end of file
+725ff7289949bda82fc4c2d454e1ee0b4218b3d56f20c1098d6fa7914ef19bfc
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-chrome_missing_track_names_load.png.sha256 b/test/data/ui-screenshots/ui-chrome_missing_track_names_load.png.sha256
index d8f53e7..06a3e7b 100644
--- a/test/data/ui-screenshots/ui-chrome_missing_track_names_load.png.sha256
+++ b/test/data/ui-screenshots/ui-chrome_missing_track_names_load.png.sha256
@@ -1 +1 @@
-a4b1867255b838c3ab73f6d00c84aa5bd7fc31bb53da5b83f52ceb84d99e96b2
\ No newline at end of file
+22ca974ba2f262c4e421e95dba686746eb89564a8ff213e50f78c9424277587c
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-chrome_rendering_desktop_expand_browser_proc.png.sha256 b/test/data/ui-screenshots/ui-chrome_rendering_desktop_expand_browser_proc.png.sha256
index 6cbb409..a917bab 100644
--- a/test/data/ui-screenshots/ui-chrome_rendering_desktop_expand_browser_proc.png.sha256
+++ b/test/data/ui-screenshots/ui-chrome_rendering_desktop_expand_browser_proc.png.sha256
@@ -1 +1 @@
-ec9873453c3834735d55eb21138bf510069cf863342509a799076d821a8f01dd
\ No newline at end of file
+90505c5620c73940b88d163a73c79005fa8e81d097d0fcabf2585e56f7bc6a99
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-chrome_rendering_desktop_load.png.sha256 b/test/data/ui-screenshots/ui-chrome_rendering_desktop_load.png.sha256
index 6667e5f..89a9c57 100644
--- a/test/data/ui-screenshots/ui-chrome_rendering_desktop_load.png.sha256
+++ b/test/data/ui-screenshots/ui-chrome_rendering_desktop_load.png.sha256
@@ -1 +1 @@
-351edcf1ade9e6b1b7ced9d4f204e9a939370b7a56066f66793e56c9d93ec972
\ No newline at end of file
+d1a9ace55344d8a2850a8238b698892aca1ea2eacf80886420108043de8d3c56
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-chrome_rendering_desktop_select_slice_with_flows.png.sha256 b/test/data/ui-screenshots/ui-chrome_rendering_desktop_select_slice_with_flows.png.sha256
index 90d04b9..470075f 100644
--- a/test/data/ui-screenshots/ui-chrome_rendering_desktop_select_slice_with_flows.png.sha256
+++ b/test/data/ui-screenshots/ui-chrome_rendering_desktop_select_slice_with_flows.png.sha256
@@ -1 +1 @@
-3699ab1be1ccf7f41559fad373027c884b3f1539183f4b405e29852f01985937
\ No newline at end of file
+a97c6027c4bef120c4227a7ed32e6a6fb6b290938ef8d66652e6d369b7e5d157
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_navigate_open_trace_from_url.png.sha256 b/test/data/ui-screenshots/ui-routing_navigate_open_trace_from_url.png.sha256
index 92f9c01..a0ddb77 100644
--- a/test/data/ui-screenshots/ui-routing_navigate_open_trace_from_url.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_navigate_open_trace_from_url.png.sha256
@@ -1 +1 @@
-1bcbdbf6d1c2c1c2e77faa90be1c060b350f21472f67aed9477e6ba5e5219e81
\ No newline at end of file
+47cda8e8a9ed007945bff13d7c10fa4d33fc6e264c1198b2038a216559bec962
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_open_invalid_trace_from_blank_page.png.sha256 b/test/data/ui-screenshots/ui-routing_open_invalid_trace_from_blank_page.png.sha256
index bd02978..98f2571 100644
--- a/test/data/ui-screenshots/ui-routing_open_invalid_trace_from_blank_page.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_open_invalid_trace_from_blank_page.png.sha256
@@ -1 +1 @@
-0b44f0292e51fcf599f17622193d67b17bbaca02440cf2f0e994dbbbac65306a
\ No newline at end of file
+bd495271f97ffe17851f6605acaf24463c2363cb6a4bcf8e1b3fd78b9e18353f
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_access_subpage_then_go_back.png.sha256 b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_access_subpage_then_go_back.png.sha256
index ff33850..5b79980 100644
--- a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_access_subpage_then_go_back.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_access_subpage_then_go_back.png.sha256
@@ -1 +1 @@
-7d8429af94229b4cb96f3e7691e987b4eb0ade9683acce9a2c14c41777415d73
\ No newline at end of file
+ab93fa5646ab5e2bc63922ee8f6c6d7657f128fe7b5426df97d02f19c770a1bc
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_first_trace_from_url.png.sha256 b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_first_trace_from_url.png.sha256
index 92f9c01..a0ddb77 100644
--- a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_first_trace_from_url.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_first_trace_from_url.png.sha256
@@ -1 +1 @@
-1bcbdbf6d1c2c1c2e77faa90be1c060b350f21472f67aed9477e6ba5e5219e81
\ No newline at end of file
+47cda8e8a9ed007945bff13d7c10fa4d33fc6e264c1198b2038a216559bec962
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_second_trace_from_url.png.sha256 b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_second_trace_from_url.png.sha256
index ff33850..5b79980 100644
--- a/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_second_trace_from_url.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_open_two_traces_then_go_back_open_second_trace_from_url.png.sha256
@@ -1 +1 @@
-7d8429af94229b4cb96f3e7691e987b4eb0ade9683acce9a2c14c41777415d73
\ No newline at end of file
+ab93fa5646ab5e2bc63922ee8f6c6d7657f128fe7b5426df97d02f19c770a1bc
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_start_from_no_trace_go_back_to_first_trace.png.sha256 b/test/data/ui-screenshots/ui-routing_start_from_no_trace_go_back_to_first_trace.png.sha256
index ff33850..5b79980 100644
--- a/test/data/ui-screenshots/ui-routing_start_from_no_trace_go_back_to_first_trace.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_start_from_no_trace_go_back_to_first_trace.png.sha256
@@ -1 +1 @@
-7d8429af94229b4cb96f3e7691e987b4eb0ade9683acce9a2c14c41777415d73
\ No newline at end of file
+ab93fa5646ab5e2bc63922ee8f6c6d7657f128fe7b5426df97d02f19c770a1bc
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_invalid_trace.png.sha256 b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_invalid_trace.png.sha256
index 2fe4afb..d806076 100644
--- a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_invalid_trace.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_invalid_trace.png.sha256
@@ -1 +1 @@
-b3f9edabe8db232b481a7484c5230fa08d01f37336f9e60eaf6fbe8e8d0ded16
\ No newline at end of file
+2dc0e3ade667e7578fa6b5b8911177ab272300bfddb015c4979c3b4361d93047
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_second_trace.png.sha256 b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_second_trace.png.sha256
index 92f9c01..a0ddb77 100644
--- a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_second_trace.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_second_trace.png.sha256
@@ -1 +1 @@
-1bcbdbf6d1c2c1c2e77faa90be1c060b350f21472f67aed9477e6ba5e5219e81
\ No newline at end of file
+47cda8e8a9ed007945bff13d7c10fa4d33fc6e264c1198b2038a216559bec962
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_trace_.png.sha256 b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_trace_.png.sha256
index ff33850..5b79980 100644
--- a/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_trace_.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_start_from_no_trace_open_trace_.png.sha256
@@ -1 +1 @@
-7d8429af94229b4cb96f3e7691e987b4eb0ade9683acce9a2c14c41777415d73
\ No newline at end of file
+ab93fa5646ab5e2bc63922ee8f6c6d7657f128fe7b5426df97d02f19c770a1bc
\ No newline at end of file
diff --git a/test/data/ui-screenshots/ui-routing_start_from_no_trace_refresh.png.sha256 b/test/data/ui-screenshots/ui-routing_start_from_no_trace_refresh.png.sha256
index ff33850..5b79980 100644
--- a/test/data/ui-screenshots/ui-routing_start_from_no_trace_refresh.png.sha256
+++ b/test/data/ui-screenshots/ui-routing_start_from_no_trace_refresh.png.sha256
@@ -1 +1 @@
-7d8429af94229b4cb96f3e7691e987b4eb0ade9683acce9a2c14c41777415d73
\ No newline at end of file
+ab93fa5646ab5e2bc63922ee8f6c6d7657f128fe7b5426df97d02f19c770a1bc
\ 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 65e2f53..fb9e893 100644
--- a/test/trace_processor/diff_tests/include_index.py
+++ b/test/trace_processor/diff_tests/include_index.py
@@ -96,6 +96,7 @@
from diff_tests.stdlib.chrome.tests_scroll_jank import ChromeScrollJankStdlib
from diff_tests.stdlib.common.tests import StdlibCommon
from diff_tests.stdlib.common.tests import StdlibCommon
+from diff_tests.stdlib.counters.tests import StdlibCounterIntervals
from diff_tests.stdlib.dynamic_tables.tests import DynamicTables
from diff_tests.stdlib.intervals.tests import StdlibIntervals
from diff_tests.stdlib.graphs.dominator_tree_tests import DominatorTree
@@ -245,6 +246,8 @@
*DominatorTree(index_path, 'stdlib/graphs', 'DominatorTree').fetch(),
*GraphSearchTests(index_path, 'stdlib/graphs',
'GraphSearchTests').fetch(),
+ *StdlibCounterIntervals(index_path, 'stdlib/counters',
+ 'StdlibCounterIntervals').fetch(),
*DynamicTables(index_path, 'stdlib/dynamic_tables',
'DynamicTables').fetch(),
*LinuxStdlib(index_path, 'stdlib/linux', 'LinuxStdlib').fetch(),
diff --git a/test/trace_processor/diff_tests/metrics/android/android_binder_metric.out b/test/trace_processor/diff_tests/metrics/android/android_binder_metric.out
index 02b1a94..f775c1c 100644
--- a/test/trace_processor/diff_tests/metrics/android/android_binder_metric.out
+++ b/test/trace_processor/diff_tests/metrics/android/android_binder_metric.out
@@ -394,6 +394,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: true
+ client_monotonic_dur: 95231
+ server_monotonic_dur: 69578
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -436,6 +438,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: true
+ client_monotonic_dur: 43573
+ server_monotonic_dur: 27121
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -478,6 +482,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 202525
+ server_monotonic_dur: 41745
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -523,6 +529,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 860460
+ server_monotonic_dur: 414084
thread_states {
thread_state_type: "binder_reply"
thread_state: "R+"
@@ -571,6 +579,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 202316
+ server_monotonic_dur: 70056
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -616,6 +626,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 38251304
+ server_monotonic_dur: 38200895
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -670,6 +682,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 500023
+ server_monotonic_dur: 75821
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -709,6 +723,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 299709
+ server_monotonic_dur: 267477
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -751,6 +767,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 393550
+ server_monotonic_dur: 56007
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -790,6 +808,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1823483
+ server_monotonic_dur: 181296
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -832,6 +852,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 297674
+ server_monotonic_dur: 55289
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -871,6 +893,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 620828
+ server_monotonic_dur: 596153
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -931,6 +955,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 521568
+ server_monotonic_dur: 47331
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -970,6 +996,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1370676
+ server_monotonic_dur: 1345615
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -1024,6 +1052,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 2175477
+ server_monotonic_dur: 47722
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1063,6 +1093,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1169019
+ server_monotonic_dur: 1141762
thread_states {
thread_state_type: "binder_reply"
thread_state: "R+"
@@ -1111,6 +1143,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 61263
+ server_monotonic_dur: 31411
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1150,6 +1184,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1388131
+ server_monotonic_dur: 872670
thread_states {
thread_state_type: "binder_reply"
thread_state: "R+"
@@ -1198,6 +1234,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 311771
+ server_monotonic_dur: 27727
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1237,6 +1275,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 7858970
+ server_monotonic_dur: 2350825
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -1297,6 +1337,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 67201
+ server_monotonic_dur: 27173
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1342,6 +1384,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1292793
+ server_monotonic_dur: 1269359
thread_states {
thread_state_type: "binder_reply"
thread_state: "R+"
@@ -1390,6 +1434,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 3536113
+ server_monotonic_dur: 25815
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1435,6 +1481,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 166354
+ server_monotonic_dur: 142006
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1477,6 +1525,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1725498
+ server_monotonic_dur: 24403
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1522,6 +1572,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2047907
+ server_monotonic_dur: 135992
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1564,6 +1616,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 313744
+ server_monotonic_dur: 23708
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1609,6 +1663,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 4590941
+ server_monotonic_dur: 4568826
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -1663,6 +1719,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: true
+ client_monotonic_dur: 56472
+ server_monotonic_dur: 10317
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1705,6 +1763,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 144039
+ server_monotonic_dur: 38296
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1747,6 +1807,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 2003890
+ server_monotonic_dur: 32711
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1789,6 +1851,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 392431
+ server_monotonic_dur: 20812
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1831,6 +1895,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 51336
+ server_monotonic_dur: 26061
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1873,6 +1939,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 15839
+ server_monotonic_dur: 3585
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1915,6 +1983,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 15392
+ server_monotonic_dur: 3595
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1957,6 +2027,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 17425
+ server_monotonic_dur: 4477
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -1999,6 +2071,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 777037
+ server_monotonic_dur: 25923
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2044,6 +2118,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 4404779
+ server_monotonic_dur: 3637769
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -2104,6 +2180,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 52503
+ server_monotonic_dur: 27259
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2146,6 +2224,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25350
+ server_monotonic_dur: 5866
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2188,6 +2268,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 53694
+ server_monotonic_dur: 33643
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2230,6 +2312,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 2395684
+ server_monotonic_dur: 37402
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2272,6 +2356,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 366288
+ server_monotonic_dur: 36664
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2314,6 +2400,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 130646
+ server_monotonic_dur: 58132
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2356,6 +2444,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 130331
+ server_monotonic_dur: 16252
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2398,6 +2488,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 73652
+ server_monotonic_dur: 16599
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2440,6 +2532,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 45088
+ server_monotonic_dur: 12097
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2482,6 +2576,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 169228
+ server_monotonic_dur: 81542
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2521,6 +2617,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 4400718
+ server_monotonic_dur: 3221518
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -2575,6 +2673,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 100089
+ server_monotonic_dur: 59307
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2617,6 +2717,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41765
+ server_monotonic_dur: 9571
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2659,6 +2761,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 84971
+ server_monotonic_dur: 53184
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2701,6 +2805,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 3250971
+ server_monotonic_dur: 23743
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2743,6 +2849,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 4622690
+ server_monotonic_dur: 16844
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2785,6 +2893,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 45134
+ server_monotonic_dur: 26738
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2827,6 +2937,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 17082
+ server_monotonic_dur: 4408
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2869,6 +2981,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 20947
+ server_monotonic_dur: 6173
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2911,6 +3025,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 20872
+ server_monotonic_dur: 5922
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2953,6 +3069,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 81291
+ server_monotonic_dur: 44407
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -2998,6 +3116,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 13104821
+ server_monotonic_dur: 10086524
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -3058,6 +3178,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 56023
+ server_monotonic_dur: 31643
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3100,6 +3222,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25346
+ server_monotonic_dur: 5833
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3142,6 +3266,8 @@
server_pid: 551
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 53012
+ server_monotonic_dur: 33177
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3184,6 +3310,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 65209
+ server_monotonic_dur: 38541
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3226,6 +3354,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 76725
+ server_monotonic_dur: 32135
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3268,6 +3398,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 101929
+ server_monotonic_dur: 69823
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3310,6 +3442,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 467516
+ server_monotonic_dur: 402831
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3352,6 +3486,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 7998432
+ server_monotonic_dur: 7890742
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3394,6 +3530,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 307840
+ server_monotonic_dur: 254236
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3436,6 +3574,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 5767125
+ server_monotonic_dur: 5717518
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3478,6 +3618,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 318968
+ server_monotonic_dur: 253598
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3520,6 +3662,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 7219754
+ server_monotonic_dur: 7157982
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3562,6 +3706,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 72915
+ server_monotonic_dur: 28616
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3604,6 +3750,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 240886
+ server_monotonic_dur: 190621
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3646,6 +3794,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 6382365
+ server_monotonic_dur: 6324177
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3688,6 +3838,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 63068
+ server_monotonic_dur: 21824
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3730,6 +3882,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 307675
+ server_monotonic_dur: 243984
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3772,6 +3926,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 7105430
+ server_monotonic_dur: 7047015
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3814,6 +3970,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 302902
+ server_monotonic_dur: 241791
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3856,6 +4014,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 7062027
+ server_monotonic_dur: 7001067
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3898,6 +4058,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 234069
+ server_monotonic_dur: 188364
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3940,6 +4102,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 5952658
+ server_monotonic_dur: 5894438
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -3982,6 +4146,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 71591
+ server_monotonic_dur: 25657
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4024,6 +4190,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 52660
+ server_monotonic_dur: 27518
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4066,6 +4234,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 29903
+ server_monotonic_dur: 11639
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4108,6 +4278,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 196774
+ server_monotonic_dur: 159951
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4150,6 +4322,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 3593496
+ server_monotonic_dur: 3543071
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -4198,6 +4372,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 32496
+ server_monotonic_dur: 12670
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4240,6 +4416,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 322810
+ server_monotonic_dur: 271515
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4282,6 +4460,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 4789815
+ server_monotonic_dur: 4749936
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4324,6 +4504,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 172609
+ server_monotonic_dur: 83158
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4366,6 +4548,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 227959
+ server_monotonic_dur: 194408
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4408,6 +4592,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 3824489
+ server_monotonic_dur: 3792958
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4450,6 +4636,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36050
+ server_monotonic_dur: 11449
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4492,6 +4680,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 155647
+ server_monotonic_dur: 126114
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4534,6 +4724,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 3808921
+ server_monotonic_dur: 3779150
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4576,6 +4768,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 153558
+ server_monotonic_dur: 124607
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4618,6 +4812,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 4194491
+ server_monotonic_dur: 4164444
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4660,6 +4856,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 303333
+ server_monotonic_dur: 238760
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4702,6 +4900,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 7572237
+ server_monotonic_dur: 7512667
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4744,6 +4944,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 252907
+ server_monotonic_dur: 202551
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4786,6 +4988,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 5273018
+ server_monotonic_dur: 5228369
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4828,6 +5032,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 128418
+ server_monotonic_dur: 102458
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4870,6 +5076,8 @@
server_pid: 432
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 3754229
+ server_monotonic_dur: 3723508
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -4912,6 +5120,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1068999945
+ server_monotonic_dur: 1068765551
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -4972,6 +5182,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1007359989
+ server_monotonic_dur: 1007181543
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -5035,6 +5247,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 802033
+ server_monotonic_dur: 538261
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5080,6 +5294,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 250272
+ server_monotonic_dur: 220155
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5125,6 +5341,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 805818
+ server_monotonic_dur: 514727
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5170,6 +5388,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 741859
+ server_monotonic_dur: 583186
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5215,6 +5435,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 717832
+ server_monotonic_dur: 534435
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5257,6 +5479,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1653373
+ server_monotonic_dur: 1493995
client_package_version_code: 309999900
is_client_package_debuggable: false
thread_states {
@@ -5307,6 +5531,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 680791
+ server_monotonic_dur: 615060
client_package_version_code: 309999900
is_client_package_debuggable: false
thread_states {
@@ -5351,6 +5577,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 598626
+ server_monotonic_dur: 539782
client_package_version_code: 309999900
is_client_package_debuggable: false
thread_states {
@@ -5395,6 +5623,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 419781
+ server_monotonic_dur: 297993
client_package_version_code: 309999900
is_client_package_debuggable: false
thread_states {
@@ -5439,6 +5669,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 826593
+ server_monotonic_dur: 395910
client_package_version_code: 309999900
is_client_package_debuggable: false
thread_states {
@@ -5486,6 +5718,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 753656
+ server_monotonic_dur: 702862
client_package_version_code: 309999900
is_client_package_debuggable: false
thread_states {
@@ -5527,6 +5761,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 5266197
+ server_monotonic_dur: 5130061
client_package_version_code: 309999900
is_client_package_debuggable: false
thread_states {
@@ -5586,6 +5822,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 226078
+ server_monotonic_dur: 175555
client_package_version_code: 309999900
is_client_package_debuggable: false
thread_states {
@@ -5633,6 +5871,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 4885909
+ server_monotonic_dur: 320746
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5678,6 +5918,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 330799
+ server_monotonic_dur: 272198
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5723,6 +5965,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 616676
+ server_monotonic_dur: 298418
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5768,6 +6012,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1410945
+ server_monotonic_dur: 200898
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5813,6 +6059,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 872295
+ server_monotonic_dur: 182774
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5858,6 +6106,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 637521
+ server_monotonic_dur: 325617
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5897,6 +6147,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 191825
+ server_monotonic_dur: 165334
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5936,6 +6188,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 5323539
+ server_monotonic_dur: 294315
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -5981,6 +6235,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 243315
+ server_monotonic_dur: 214612
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -6020,6 +6276,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 4092197
+ server_monotonic_dur: 315322
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -6065,6 +6323,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1563939
+ server_monotonic_dur: 200101
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -6110,6 +6370,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 161382
+ server_monotonic_dur: 104816
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -6155,6 +6417,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 4654877
+ server_monotonic_dur: 328348
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -6200,6 +6464,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 5707100
+ server_monotonic_dur: 146733
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -6241,6 +6507,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 122224
+ server_monotonic_dur: 20216
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -6276,6 +6544,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 302731
+ server_monotonic_dur: 230331
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -6311,6 +6581,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 47695555
+ server_monotonic_dur: 47295469
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -6371,6 +6643,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 228157
+ server_monotonic_dur: 6096
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6409,6 +6683,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 66349
+ server_monotonic_dur: 29706
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6450,6 +6726,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 10413366
+ server_monotonic_dur: 7824177
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6509,6 +6787,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 142447
+ server_monotonic_dur: 107780
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6556,6 +6836,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 201915
+ server_monotonic_dur: 177114
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6603,6 +6885,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 127224
+ server_monotonic_dur: 100335
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6650,6 +6934,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 239313
+ server_monotonic_dur: 170695
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6703,6 +6989,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 155029
+ server_monotonic_dur: 122075
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6750,6 +7038,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 97646
+ server_monotonic_dur: 73450
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6797,6 +7087,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 99500
+ server_monotonic_dur: 76612
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6844,6 +7136,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 250959
+ server_monotonic_dur: 226725
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6888,6 +7182,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 67962
+ server_monotonic_dur: 30308
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6929,6 +7225,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 154178
+ server_monotonic_dur: 124753
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -6976,6 +7274,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 106250
+ server_monotonic_dur: 80915
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7023,6 +7323,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 74906
+ server_monotonic_dur: 55191
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7070,6 +7372,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 71921
+ server_monotonic_dur: 52769
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7117,6 +7421,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 70654
+ server_monotonic_dur: 51674
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7161,6 +7467,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 64107
+ server_monotonic_dur: 26260
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7202,6 +7510,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 300661
+ server_monotonic_dur: 271896
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7249,6 +7559,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 191707
+ server_monotonic_dur: 159329
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7302,6 +7614,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 236014
+ server_monotonic_dur: 209844
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7349,6 +7663,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 677589
+ server_monotonic_dur: 639717
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7399,6 +7715,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 500344
+ server_monotonic_dur: 407163
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7446,6 +7764,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 130923
+ server_monotonic_dur: 104818
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7493,6 +7813,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 257727
+ server_monotonic_dur: 225960
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7540,6 +7862,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 207311
+ server_monotonic_dur: 141411
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7587,6 +7911,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 315861
+ server_monotonic_dur: 248947
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7634,6 +7960,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 259030
+ server_monotonic_dur: 236355
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7681,6 +8009,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 92883
+ server_monotonic_dur: 69001
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7728,6 +8058,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 188318
+ server_monotonic_dur: 166081
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7775,6 +8107,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 119066
+ server_monotonic_dur: 95747
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7822,6 +8156,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 237081
+ server_monotonic_dur: 209149
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7866,6 +8202,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 591366
+ server_monotonic_dur: 21891
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7907,6 +8245,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 111577
+ server_monotonic_dur: 86098
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -7954,6 +8294,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 189877
+ server_monotonic_dur: 167791
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8001,6 +8343,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 123707
+ server_monotonic_dur: 100048
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8048,6 +8392,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 228156
+ server_monotonic_dur: 201512
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8095,6 +8441,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 109512
+ server_monotonic_dur: 87276
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8142,6 +8490,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 232518
+ server_monotonic_dur: 209672
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8189,6 +8539,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 124783
+ server_monotonic_dur: 102909
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8236,6 +8588,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 244152
+ server_monotonic_dur: 217049
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8283,6 +8637,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 113353
+ server_monotonic_dur: 85375
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8324,6 +8680,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 227758
+ server_monotonic_dur: 187703
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8371,6 +8729,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 139295
+ server_monotonic_dur: 116093
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8412,6 +8772,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 264361
+ server_monotonic_dur: 234913
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8459,6 +8821,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 918856
+ server_monotonic_dur: 866310
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8518,6 +8882,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 796036
+ server_monotonic_dur: 321918
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8565,6 +8931,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 765487
+ server_monotonic_dur: 462664
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8612,6 +8980,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 481038
+ server_monotonic_dur: 361607
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8659,6 +9029,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 254494
+ server_monotonic_dur: 159330
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8706,6 +9078,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 309870
+ server_monotonic_dur: 220751
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8753,6 +9127,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 12677155
+ server_monotonic_dur: 147315
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8800,6 +9176,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 447621
+ server_monotonic_dur: 137704
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8847,6 +9225,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 191006
+ server_monotonic_dur: 164185
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8894,6 +9274,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 88522
+ server_monotonic_dur: 66721
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8941,6 +9323,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 957260
+ server_monotonic_dur: 95254
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -8988,6 +9372,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 578954
+ server_monotonic_dur: 365934
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9035,6 +9421,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 485812
+ server_monotonic_dur: 386791
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9082,6 +9470,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 250757
+ server_monotonic_dur: 166179
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9129,6 +9519,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 302881
+ server_monotonic_dur: 223517
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9176,6 +9568,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 3153591
+ server_monotonic_dur: 3025709
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9229,6 +9623,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 619943
+ server_monotonic_dur: 375734
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9276,6 +9672,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 431181
+ server_monotonic_dur: 318223
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9323,6 +9721,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 245663
+ server_monotonic_dur: 157246
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9370,6 +9770,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 380826
+ server_monotonic_dur: 297627
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9417,6 +9819,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 169230
+ server_monotonic_dur: 135040
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9464,6 +9868,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 160294
+ server_monotonic_dur: 138267
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9511,6 +9917,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 82925
+ server_monotonic_dur: 62558
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9558,6 +9966,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 109806
+ server_monotonic_dur: 89862
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9605,6 +10015,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 322167
+ server_monotonic_dur: 258351
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9652,6 +10064,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2993666
+ server_monotonic_dur: 861059
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9699,6 +10113,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 840445
+ server_monotonic_dur: 305801
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9740,6 +10156,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 827415
+ server_monotonic_dur: 784522
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9781,6 +10199,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 7322317
+ server_monotonic_dur: 93163
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9828,6 +10248,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 657190
+ server_monotonic_dur: 628491
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9875,6 +10297,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 451291
+ server_monotonic_dur: 426847
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9922,6 +10346,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 166904
+ server_monotonic_dur: 143790
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -9963,6 +10389,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 165778
+ server_monotonic_dur: 142948
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10004,6 +10432,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 230422
+ server_monotonic_dur: 206586
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10045,6 +10475,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 630450
+ server_monotonic_dur: 579789
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10101,6 +10533,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 119820
+ server_monotonic_dur: 28811
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10145,6 +10579,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 104172
+ server_monotonic_dur: 56403
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10192,6 +10628,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 322775
+ server_monotonic_dur: 295239
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10236,6 +10674,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 8016835
+ server_monotonic_dur: 7972329
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10292,6 +10732,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 228254
+ server_monotonic_dur: 205277
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10348,6 +10790,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 28403
+ server_monotonic_dur: 6640
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10392,6 +10836,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25556
+ server_monotonic_dur: 5569
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10436,6 +10882,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25344
+ server_monotonic_dur: 5525
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10480,6 +10928,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25346
+ server_monotonic_dur: 5607
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10524,6 +10974,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 27703
+ server_monotonic_dur: 6657
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10568,6 +11020,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 27032
+ server_monotonic_dur: 6047
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10612,6 +11066,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25479
+ server_monotonic_dur: 5572
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10656,6 +11112,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 26363
+ server_monotonic_dur: 5671
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10700,6 +11158,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 33909
+ server_monotonic_dur: 10452
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10744,6 +11204,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 27054
+ server_monotonic_dur: 6928
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10788,6 +11250,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25578
+ server_monotonic_dur: 5689
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10832,6 +11296,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25680
+ server_monotonic_dur: 5721
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10876,6 +11342,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25437
+ server_monotonic_dur: 5574
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10920,6 +11388,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25612
+ server_monotonic_dur: 5467
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -10964,6 +11434,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25288
+ server_monotonic_dur: 5467
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11008,6 +11480,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25190
+ server_monotonic_dur: 5460
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11052,6 +11526,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25439
+ server_monotonic_dur: 5683
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11096,6 +11572,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25378
+ server_monotonic_dur: 5557
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11140,6 +11618,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25672
+ server_monotonic_dur: 5494
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11184,6 +11664,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25248
+ server_monotonic_dur: 5521
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11228,6 +11710,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35238
+ server_monotonic_dur: 13912
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11272,6 +11756,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 84755
+ server_monotonic_dur: 37800
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11316,6 +11802,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21415376
+ server_monotonic_dur: 21387270
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11372,6 +11860,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 229234
+ server_monotonic_dur: 205390
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11428,6 +11918,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 28964
+ server_monotonic_dur: 6652
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11472,6 +11964,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25639
+ server_monotonic_dur: 5583
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11516,6 +12010,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25438
+ server_monotonic_dur: 5569
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11560,6 +12056,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25489
+ server_monotonic_dur: 5618
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11604,6 +12102,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25401
+ server_monotonic_dur: 5562
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11648,6 +12148,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25446
+ server_monotonic_dur: 5589
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11692,6 +12194,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25834
+ server_monotonic_dur: 5504
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11736,6 +12240,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25620
+ server_monotonic_dur: 5490
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11780,6 +12286,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25884
+ server_monotonic_dur: 5733
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11824,6 +12332,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25400
+ server_monotonic_dur: 5544
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11868,6 +12378,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25361
+ server_monotonic_dur: 5594
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11912,6 +12424,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25623
+ server_monotonic_dur: 5721
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -11956,6 +12470,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25457
+ server_monotonic_dur: 5550
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12000,6 +12516,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25274
+ server_monotonic_dur: 5486
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12044,6 +12562,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25443
+ server_monotonic_dur: 5605
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12088,6 +12608,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25391
+ server_monotonic_dur: 5521
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12132,6 +12654,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25435
+ server_monotonic_dur: 5576
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12176,6 +12700,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25823
+ server_monotonic_dur: 5556
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12220,6 +12746,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25503
+ server_monotonic_dur: 5586
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12264,6 +12792,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25860
+ server_monotonic_dur: 5710
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12308,6 +12838,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 32862
+ server_monotonic_dur: 13162
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12352,6 +12884,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 166297
+ server_monotonic_dur: 61520
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12396,6 +12930,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 8203900
+ server_monotonic_dur: 8148772
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12458,6 +12994,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 384794
+ server_monotonic_dur: 347231
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12514,6 +13052,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 46318
+ server_monotonic_dur: 10866
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12558,6 +13098,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41880
+ server_monotonic_dur: 9661
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12602,6 +13144,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 42485
+ server_monotonic_dur: 9626
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12646,6 +13190,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41474
+ server_monotonic_dur: 9586
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12690,6 +13236,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41412
+ server_monotonic_dur: 9309
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12734,6 +13282,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 42033
+ server_monotonic_dur: 9392
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12778,6 +13328,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41387
+ server_monotonic_dur: 9302
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12822,6 +13374,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41084
+ server_monotonic_dur: 9220
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12866,6 +13420,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41301
+ server_monotonic_dur: 9415
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12910,6 +13466,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41398
+ server_monotonic_dur: 9322
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12954,6 +13512,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41560
+ server_monotonic_dur: 9590
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -12998,6 +13558,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 50617
+ server_monotonic_dur: 14177
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13042,6 +13604,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41628
+ server_monotonic_dur: 9494
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13086,6 +13650,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41848
+ server_monotonic_dur: 9338
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13130,6 +13696,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41157
+ server_monotonic_dur: 9281
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13174,6 +13742,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40899
+ server_monotonic_dur: 9288
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13218,6 +13788,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41246
+ server_monotonic_dur: 9556
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13262,6 +13834,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41321
+ server_monotonic_dur: 9445
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13306,6 +13880,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40925
+ server_monotonic_dur: 9283
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13350,6 +13926,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41127
+ server_monotonic_dur: 9552
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13394,6 +13972,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 387578
+ server_monotonic_dur: 351226
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13447,6 +14027,8 @@
server_pid: 227
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 263198
+ server_monotonic_dur: 147077
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13494,6 +14076,8 @@
server_pid: 227
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 94966
+ server_monotonic_dur: 40099
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13541,6 +14125,8 @@
server_pid: 227
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 50151
+ server_monotonic_dur: 12420
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13588,6 +14174,8 @@
server_pid: 227
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 83809
+ server_monotonic_dur: 46436
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13635,6 +14223,8 @@
server_pid: 227
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 82894
+ server_monotonic_dur: 22609
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13682,6 +14272,8 @@
server_pid: 227
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 73495
+ server_monotonic_dur: 22894
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13729,6 +14321,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 219947
+ server_monotonic_dur: 148041
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13776,6 +14370,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 69210
+ server_monotonic_dur: 24451
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13823,6 +14419,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 45420
+ server_monotonic_dur: 13297
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13870,6 +14468,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 42724
+ server_monotonic_dur: 9189
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13917,6 +14517,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40940
+ server_monotonic_dur: 7896
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -13964,6 +14566,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 48291
+ server_monotonic_dur: 16180
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14011,6 +14615,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1936574
+ server_monotonic_dur: 1837670
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14052,6 +14658,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 93664
+ server_monotonic_dur: 34493
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14099,6 +14707,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 60079
+ server_monotonic_dur: 15406
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14146,6 +14756,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 100543
+ server_monotonic_dur: 36266
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14187,6 +14799,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 92697
+ server_monotonic_dur: 31308
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14228,6 +14842,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 110940
+ server_monotonic_dur: 43318
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14269,6 +14885,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 116782
+ server_monotonic_dur: 39838
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14310,6 +14928,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 216902
+ server_monotonic_dur: 76249
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14351,6 +14971,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 106017
+ server_monotonic_dur: 37024
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14392,6 +15014,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 87275
+ server_monotonic_dur: 27460
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14433,6 +15057,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 90924
+ server_monotonic_dur: 28396
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14474,6 +15100,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 92296
+ server_monotonic_dur: 28088
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14515,6 +15143,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 86354
+ server_monotonic_dur: 26116
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14556,6 +15186,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 88431
+ server_monotonic_dur: 26404
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14597,6 +15229,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 77898
+ server_monotonic_dur: 17389
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14638,6 +15272,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 57647
+ server_monotonic_dur: 17423
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14679,6 +15315,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 65380
+ server_monotonic_dur: 19929
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14720,6 +15358,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 63549
+ server_monotonic_dur: 18630
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14761,6 +15401,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 58003
+ server_monotonic_dur: 17697
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14802,6 +15444,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 103582
+ server_monotonic_dur: 19948
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14843,6 +15487,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 58251
+ server_monotonic_dur: 17667
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14884,6 +15530,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 57571
+ server_monotonic_dur: 17477
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14925,6 +15573,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 57586
+ server_monotonic_dur: 17432
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -14966,6 +15616,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 56988
+ server_monotonic_dur: 17197
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15007,6 +15659,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 57557
+ server_monotonic_dur: 17391
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15048,6 +15702,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 57720
+ server_monotonic_dur: 17590
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15089,6 +15745,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 61967
+ server_monotonic_dur: 20232
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15130,6 +15788,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 124321
+ server_monotonic_dur: 21151
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15171,6 +15831,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 58406
+ server_monotonic_dur: 17846
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15212,6 +15874,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 122522
+ server_monotonic_dur: 22467
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15253,6 +15917,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 108945
+ server_monotonic_dur: 21826
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15294,6 +15960,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 115625
+ server_monotonic_dur: 21876
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15335,6 +16003,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 117689
+ server_monotonic_dur: 21673
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15376,6 +16046,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 68086
+ server_monotonic_dur: 22255
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15417,6 +16089,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 354924
+ server_monotonic_dur: 135304
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15458,6 +16132,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 62081
+ server_monotonic_dur: 19429
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15499,6 +16175,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 60439
+ server_monotonic_dur: 18752
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15540,6 +16218,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 59383
+ server_monotonic_dur: 17430
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15581,6 +16261,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 71084
+ server_monotonic_dur: 22266
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15622,6 +16304,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 167837
+ server_monotonic_dur: 36313
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15663,6 +16347,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 101582
+ server_monotonic_dur: 27119
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15704,6 +16390,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1475488
+ server_monotonic_dur: 25170
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15745,6 +16433,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 72281
+ server_monotonic_dur: 24739
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15786,6 +16476,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 96807
+ server_monotonic_dur: 44972
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15827,6 +16519,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 75274
+ server_monotonic_dur: 33925
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15868,6 +16562,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 378935
+ server_monotonic_dur: 31989
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15915,6 +16611,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 119384
+ server_monotonic_dur: 61982
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -15968,6 +16666,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 71154
+ server_monotonic_dur: 40896
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16009,6 +16709,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40260
+ server_monotonic_dur: 12949
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16050,6 +16752,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 53353
+ server_monotonic_dur: 20694
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16091,6 +16795,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 58113
+ server_monotonic_dur: 25670
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16129,6 +16835,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1039850
+ server_monotonic_dur: 508063
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16185,6 +16893,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 150984
+ server_monotonic_dur: 35920
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16223,6 +16933,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 136562
+ server_monotonic_dur: 50827
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16270,6 +16982,8 @@
server_pid: 563
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 316824
+ server_monotonic_dur: 105755
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16326,6 +17040,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 203191
+ server_monotonic_dur: 64617
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16370,6 +17086,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 248354
+ server_monotonic_dur: 34787
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16417,6 +17135,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 727557
+ server_monotonic_dur: 660183
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16464,6 +17184,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1181407
+ server_monotonic_dur: 1111603
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16511,6 +17233,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1189317
+ server_monotonic_dur: 990715
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16558,6 +17282,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 927854
+ server_monotonic_dur: 805846
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16605,6 +17331,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 512420
+ server_monotonic_dur: 323254
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16652,6 +17380,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1487742
+ server_monotonic_dur: 1376590
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16699,6 +17429,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1449926
+ server_monotonic_dur: 1274408
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16746,6 +17478,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1298528
+ server_monotonic_dur: 1132551
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16793,6 +17527,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1454881
+ server_monotonic_dur: 1329844
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16840,6 +17576,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1800013
+ server_monotonic_dur: 1657903
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16887,6 +17625,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 247342
+ server_monotonic_dur: 193288
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16934,6 +17674,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 965478
+ server_monotonic_dur: 920088
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -16975,6 +17717,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1020780
+ server_monotonic_dur: 971950
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17022,6 +17766,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 959262
+ server_monotonic_dur: 906515
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17063,6 +17809,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 899049
+ server_monotonic_dur: 847940
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17104,6 +17852,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 909425
+ server_monotonic_dur: 858090
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17145,6 +17895,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1743948
+ server_monotonic_dur: 1673704
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17204,6 +17956,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 623698
+ server_monotonic_dur: 573369
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17245,6 +17999,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 15941493
+ server_monotonic_dur: 15891830
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17316,6 +18072,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1234219
+ server_monotonic_dur: 845821
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17369,6 +18127,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1291793
+ server_monotonic_dur: 1164551
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17416,6 +18176,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1943031
+ server_monotonic_dur: 939945
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17457,6 +18219,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1156924
+ server_monotonic_dur: 1082065
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17504,6 +18268,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 809167
+ server_monotonic_dur: 756459
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17551,6 +18317,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 678940
+ server_monotonic_dur: 635139
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17592,6 +18360,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 145751
+ server_monotonic_dur: 118650
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17633,6 +18403,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 530901
+ server_monotonic_dur: 500761
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17674,6 +18446,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 571584
+ server_monotonic_dur: 538071
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17715,6 +18489,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 552449
+ server_monotonic_dur: 520327
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17756,6 +18532,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 534612
+ server_monotonic_dur: 501212
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17797,6 +18575,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 536245
+ server_monotonic_dur: 503037
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17838,6 +18618,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1357351
+ server_monotonic_dur: 363694
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17879,6 +18661,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 420625
+ server_monotonic_dur: 394176
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17920,6 +18704,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1315862
+ server_monotonic_dur: 383396
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -17985,6 +18771,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 136670
+ server_monotonic_dur: 110994
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18026,6 +18814,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 508115
+ server_monotonic_dur: 480013
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18067,6 +18857,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 546196
+ server_monotonic_dur: 514929
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18108,6 +18900,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 524877
+ server_monotonic_dur: 493791
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18149,6 +18943,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 731991
+ server_monotonic_dur: 486628
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18190,6 +18986,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 716531
+ server_monotonic_dur: 684885
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18237,6 +19035,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 984986
+ server_monotonic_dur: 824723
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18278,6 +19078,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 502280
+ server_monotonic_dur: 438518
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18325,6 +19127,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1312257
+ server_monotonic_dur: 423528
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18372,6 +19176,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 3453818
+ server_monotonic_dur: 3361174
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18409,6 +19215,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 82151
+ server_monotonic_dur: 9960
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18452,6 +19260,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 176250
+ server_monotonic_dur: 131473
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18492,6 +19302,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 5999061
+ server_monotonic_dur: 5849109
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18545,6 +19357,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 233849
+ server_monotonic_dur: 199545
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18586,6 +19400,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 252552
+ server_monotonic_dur: 223077
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18627,6 +19443,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 204078
+ server_monotonic_dur: 172783
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18668,6 +19486,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 153994
+ server_monotonic_dur: 126916
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18709,6 +19529,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 182889
+ server_monotonic_dur: 154702
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18750,6 +19572,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 137217
+ server_monotonic_dur: 113244
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18791,6 +19615,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 118992
+ server_monotonic_dur: 97325
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18832,6 +19658,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 299443
+ server_monotonic_dur: 276814
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18870,6 +19698,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 283374
+ server_monotonic_dur: 135161
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18917,6 +19747,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 167484
+ server_monotonic_dur: 139418
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18958,6 +19790,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 145919
+ server_monotonic_dur: 118980
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -18999,6 +19833,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 74185
+ server_monotonic_dur: 55392
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19040,6 +19876,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 69978
+ server_monotonic_dur: 51751
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19081,6 +19919,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 68327
+ server_monotonic_dur: 50504
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19119,6 +19959,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 100638
+ server_monotonic_dur: 42296
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19166,6 +20008,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 342282
+ server_monotonic_dur: 315981
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19207,6 +20051,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 480814
+ server_monotonic_dur: 394591
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19254,6 +20100,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 272641
+ server_monotonic_dur: 212207
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19301,6 +20149,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 583763
+ server_monotonic_dur: 429944
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19342,6 +20192,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 433335
+ server_monotonic_dur: 355820
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19389,6 +20241,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 278251
+ server_monotonic_dur: 213908
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19433,6 +20287,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 219209
+ server_monotonic_dur: 91134
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19477,6 +20333,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 139801
+ server_monotonic_dur: 59523
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19521,6 +20379,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 83159
+ server_monotonic_dur: 50751
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19559,6 +20419,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 114800
+ server_monotonic_dur: 39897
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19603,6 +20465,8 @@
server_pid: 529
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 89284
+ server_monotonic_dur: 35183
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19650,6 +20514,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1765942
+ server_monotonic_dur: 1639703
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19694,6 +20560,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1128986
+ server_monotonic_dur: 966934
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19738,6 +20606,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1207202
+ server_monotonic_dur: 1050055
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19785,6 +20655,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 325502
+ server_monotonic_dur: 249321
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19832,6 +20704,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 195976
+ server_monotonic_dur: 165659
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19873,6 +20747,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 775714
+ server_monotonic_dur: 675697
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19920,6 +20796,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 291851
+ server_monotonic_dur: 212472
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -19964,6 +20842,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 211605
+ server_monotonic_dur: 130702
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20002,6 +20882,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 171873
+ server_monotonic_dur: 73511
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20052,6 +20934,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 94665
+ server_monotonic_dur: 36111
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20096,6 +20980,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 53570
+ server_monotonic_dur: 16168
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20140,6 +21026,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 60943
+ server_monotonic_dur: 13010
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20184,6 +21072,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 120844
+ server_monotonic_dur: 48153
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20222,6 +21112,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 50136
+ server_monotonic_dur: 8170
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20266,6 +21158,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 207533
+ server_monotonic_dur: 152273
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20310,6 +21204,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 73766
+ server_monotonic_dur: 32288
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20354,6 +21250,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 47558
+ server_monotonic_dur: 11184
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20401,6 +21299,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 770712
+ server_monotonic_dur: 643264
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20448,6 +21348,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1020490
+ server_monotonic_dur: 851167
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20501,6 +21403,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 455959
+ server_monotonic_dur: 343077
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20548,6 +21452,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 393022
+ server_monotonic_dur: 303161
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20595,6 +21501,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 313561
+ server_monotonic_dur: 255077
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20642,6 +21550,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 190578
+ server_monotonic_dur: 134753
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20689,6 +21599,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1139946
+ server_monotonic_dur: 1084235
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20736,6 +21648,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 912985
+ server_monotonic_dur: 856225
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20783,6 +21697,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 857508
+ server_monotonic_dur: 806911
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20836,6 +21752,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 747168
+ server_monotonic_dur: 666508
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20889,6 +21807,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 491535
+ server_monotonic_dur: 440583
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20936,6 +21856,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 490048
+ server_monotonic_dur: 437941
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -20989,6 +21911,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2177244
+ server_monotonic_dur: 389987
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21030,6 +21954,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 498121
+ server_monotonic_dur: 401681
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21071,6 +21997,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 246018
+ server_monotonic_dur: 205622
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21112,6 +22040,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 203694
+ server_monotonic_dur: 171323
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21153,6 +22083,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 4994400
+ server_monotonic_dur: 142288
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21194,6 +22126,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 233732
+ server_monotonic_dur: 199800
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21235,6 +22169,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 180445
+ server_monotonic_dur: 151129
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21276,6 +22212,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 169394
+ server_monotonic_dur: 140597
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21317,6 +22255,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 240417
+ server_monotonic_dur: 197934
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21364,6 +22304,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 177706
+ server_monotonic_dur: 149198
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21405,6 +22347,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 173583
+ server_monotonic_dur: 146010
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21446,6 +22390,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 175858
+ server_monotonic_dur: 148750
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21487,6 +22433,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 415888
+ server_monotonic_dur: 388498
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21528,6 +22476,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 374486
+ server_monotonic_dur: 345600
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21566,6 +22516,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 193674
+ server_monotonic_dur: 37550
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21613,6 +22565,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 413246
+ server_monotonic_dur: 387134
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21651,6 +22605,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 80614
+ server_monotonic_dur: 30549
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21695,6 +22651,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 183938
+ server_monotonic_dur: 111509
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21736,6 +22694,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 163824
+ server_monotonic_dur: 122423
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21777,6 +22737,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 301695
+ server_monotonic_dur: 270414
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21818,6 +22780,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 682979
+ server_monotonic_dur: 581920
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21865,6 +22829,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 273575
+ server_monotonic_dur: 249822
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21906,6 +22872,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 178193
+ server_monotonic_dur: 155515
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21947,6 +22915,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 657065
+ server_monotonic_dur: 219503
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -21985,6 +22955,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 567500
+ server_monotonic_dur: 110145
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22032,6 +23004,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1613617
+ server_monotonic_dur: 441040
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22079,6 +23053,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 387992
+ server_monotonic_dur: 333936
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22126,6 +23102,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 384278
+ server_monotonic_dur: 202134
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22173,6 +23151,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 17823806
+ server_monotonic_dur: 16706822
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22232,6 +23212,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 337321
+ server_monotonic_dur: 200530
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22279,6 +23261,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2135944
+ server_monotonic_dur: 1854843
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22338,6 +23322,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 371382
+ server_monotonic_dur: 318768
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22385,6 +23371,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2695236
+ server_monotonic_dur: 2023523
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22444,6 +23432,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2030870
+ server_monotonic_dur: 137432
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22491,6 +23481,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1251625
+ server_monotonic_dur: 614479
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22538,6 +23530,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 554029
+ server_monotonic_dur: 518373
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22585,6 +23579,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 563314
+ server_monotonic_dur: 528137
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22632,6 +23628,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 537780
+ server_monotonic_dur: 502049
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22679,6 +23677,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 519997
+ server_monotonic_dur: 488839
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22726,6 +23726,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 7429344
+ server_monotonic_dur: 583472
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22773,6 +23775,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 238249
+ server_monotonic_dur: 148173
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22820,6 +23824,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 576329
+ server_monotonic_dur: 544045
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22867,6 +23873,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 553742
+ server_monotonic_dur: 517013
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22914,6 +23922,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 535925
+ server_monotonic_dur: 501315
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -22961,6 +23971,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 527836
+ server_monotonic_dur: 493347
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23008,6 +24020,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 539363
+ server_monotonic_dur: 504362
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23055,6 +24069,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 839722
+ server_monotonic_dur: 809700
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23108,6 +24124,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2838780
+ server_monotonic_dur: 498019
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23155,6 +24173,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 746457
+ server_monotonic_dur: 101452
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23202,6 +24222,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 3116296
+ server_monotonic_dur: 494844
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23249,6 +24271,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2397558
+ server_monotonic_dur: 639946
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23296,6 +24320,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2532187
+ server_monotonic_dur: 614273
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23349,6 +24375,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 855776
+ server_monotonic_dur: 826237
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23402,6 +24430,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 517655
+ server_monotonic_dur: 490455
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23449,6 +24479,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 545271
+ server_monotonic_dur: 511925
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23496,6 +24528,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 135146
+ server_monotonic_dur: 107694
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23543,6 +24577,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 517013
+ server_monotonic_dur: 487281
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23590,6 +24626,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 631469
+ server_monotonic_dur: 604122
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23643,6 +24681,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 595074
+ server_monotonic_dur: 571893
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23696,6 +24736,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 552269
+ server_monotonic_dur: 520757
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23743,6 +24785,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 601540
+ server_monotonic_dur: 540479
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23790,6 +24834,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 105149
+ server_monotonic_dur: 80570
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23837,6 +24883,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 243959
+ server_monotonic_dur: 218826
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23884,6 +24932,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 108404
+ server_monotonic_dur: 83945
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23931,6 +24981,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 255772
+ server_monotonic_dur: 229172
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -23978,6 +25030,8 @@
server_pid: 1469
server_oom_score: -800
is_sync: true
+ client_monotonic_dur: 491565
+ server_monotonic_dur: 252231
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24037,6 +25091,8 @@
server_pid: 1469
server_oom_score: -800
is_sync: true
+ client_monotonic_dur: 1359588
+ server_monotonic_dur: 1280511
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24093,6 +25149,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1236290
+ server_monotonic_dur: 199511
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24134,6 +25192,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 299362
+ server_monotonic_dur: 274037
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24175,6 +25235,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 12551268
+ server_monotonic_dur: 12515329
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24231,6 +25293,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 313846
+ server_monotonic_dur: 287526
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24275,6 +25339,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 717354
+ server_monotonic_dur: 334312
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24319,6 +25385,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 7056358
+ server_monotonic_dur: 6980257
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24372,6 +25440,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 17949987
+ server_monotonic_dur: 163732
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24419,6 +25489,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 643839
+ server_monotonic_dur: 541776
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24466,6 +25538,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 444700
+ server_monotonic_dur: 350857
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24513,6 +25587,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2538493
+ server_monotonic_dur: 520350
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24566,6 +25642,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 369653
+ server_monotonic_dur: 234606
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24613,6 +25691,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1614884
+ server_monotonic_dur: 1545396
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24666,6 +25746,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 11137398
+ server_monotonic_dur: 11035265
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24725,6 +25807,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1916997
+ server_monotonic_dur: 1232073
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24784,6 +25868,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 926079
+ server_monotonic_dur: 874193
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24837,6 +25923,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 142621
+ server_monotonic_dur: 117045
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24884,6 +25972,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1356741
+ server_monotonic_dur: 189929
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24931,6 +26021,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 793821
+ server_monotonic_dur: 738381
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -24984,6 +26076,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1026395
+ server_monotonic_dur: 985850
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25031,6 +26125,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 583551
+ server_monotonic_dur: 551136
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25078,6 +26174,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 2755774
+ server_monotonic_dur: 1482290
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25131,6 +26229,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1389739
+ server_monotonic_dur: 1224718
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25190,6 +26290,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 3751733
+ server_monotonic_dur: 512010
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25237,6 +26339,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 813718
+ server_monotonic_dur: 779756
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25296,6 +26400,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 140114
+ server_monotonic_dur: 107070
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25343,6 +26449,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 294281
+ server_monotonic_dur: 262166
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25390,6 +26498,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 264817
+ server_monotonic_dur: 237850
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25437,6 +26547,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 278776
+ server_monotonic_dur: 252571
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25478,6 +26590,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 273809
+ server_monotonic_dur: 248681
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25516,6 +26630,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 226610
+ server_monotonic_dur: 190250
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25557,6 +26673,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 1002924
+ server_monotonic_dur: 694983
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25610,6 +26728,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 602659
+ server_monotonic_dur: 408791
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25657,6 +26777,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 262355
+ server_monotonic_dur: 196958
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25704,6 +26826,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 170144
+ server_monotonic_dur: 131405
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25751,6 +26875,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 609129
+ server_monotonic_dur: 372883
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25798,6 +26924,8 @@
server_pid: 642
server_oom_score: -900
is_sync: true
+ client_monotonic_dur: 415108
+ server_monotonic_dur: 279772
client_package_version_code: 33
is_client_package_debuggable: false
thread_states {
@@ -25842,6 +26970,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 990711
+ server_monotonic_dur: 18622
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -25878,6 +27008,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36104
+ server_monotonic_dur: 13559
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -25914,6 +27046,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 27199
+ server_monotonic_dur: 7976
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -25950,6 +27084,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36341
+ server_monotonic_dur: 6028
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -25986,6 +27122,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40656
+ server_monotonic_dur: 23849
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26022,6 +27160,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22212
+ server_monotonic_dur: 5868
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26058,6 +27198,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 30414
+ server_monotonic_dur: 13938
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26094,6 +27236,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24759
+ server_monotonic_dur: 8686
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26130,6 +27274,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23926
+ server_monotonic_dur: 7925
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26166,6 +27312,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23860
+ server_monotonic_dur: 7882
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26202,6 +27350,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21382
+ server_monotonic_dur: 5551
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26238,6 +27388,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24790
+ server_monotonic_dur: 6374
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26274,6 +27426,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 29653
+ server_monotonic_dur: 11564
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26310,6 +27464,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21591
+ server_monotonic_dur: 5597
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26346,6 +27502,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21357
+ server_monotonic_dur: 5438
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26382,6 +27540,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24288
+ server_monotonic_dur: 8403
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26418,6 +27578,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1058417
+ server_monotonic_dur: 5670
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -26448,6 +27610,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36616
+ server_monotonic_dur: 12538
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26484,6 +27648,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 28435
+ server_monotonic_dur: 10926
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26520,6 +27686,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22007
+ server_monotonic_dur: 5464
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26556,6 +27724,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24309
+ server_monotonic_dur: 7802
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26592,6 +27762,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21748
+ server_monotonic_dur: 5336
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26628,6 +27800,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24580
+ server_monotonic_dur: 8280
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26664,6 +27838,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23882
+ server_monotonic_dur: 7647
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26700,6 +27876,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21575
+ server_monotonic_dur: 5312
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26736,6 +27914,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21555
+ server_monotonic_dur: 5318
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26772,6 +27952,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 3948088
+ server_monotonic_dur: 20207
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -26814,6 +27996,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 891143
+ server_monotonic_dur: 17713
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26850,6 +28034,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 3043559
+ server_monotonic_dur: 12749
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26886,6 +28072,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 519456
+ server_monotonic_dur: 12923
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26922,6 +28110,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 3450163
+ server_monotonic_dur: 13004
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26958,6 +28148,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 58083
+ server_monotonic_dur: 30493
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -26994,6 +28186,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24489
+ server_monotonic_dur: 6328
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27030,6 +28224,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 47686
+ server_monotonic_dur: 30400
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27066,6 +28262,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 26241
+ server_monotonic_dur: 8926
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27102,6 +28300,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24542
+ server_monotonic_dur: 7961
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27138,6 +28338,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25475
+ server_monotonic_dur: 8311
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27174,6 +28376,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24388
+ server_monotonic_dur: 7868
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27210,6 +28414,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24327
+ server_monotonic_dur: 7956
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27246,6 +28452,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24199
+ server_monotonic_dur: 7843
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27282,6 +28490,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24262
+ server_monotonic_dur: 7953
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27318,6 +28528,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23993
+ server_monotonic_dur: 7691
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27354,6 +28566,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24137
+ server_monotonic_dur: 7797
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27390,6 +28604,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24661
+ server_monotonic_dur: 7720
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27426,6 +28642,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24213
+ server_monotonic_dur: 7862
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27462,6 +28680,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24099
+ server_monotonic_dur: 7736
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27498,6 +28718,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24435
+ server_monotonic_dur: 7906
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27534,6 +28756,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24108
+ server_monotonic_dur: 7730
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27570,6 +28794,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24062
+ server_monotonic_dur: 7740
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27606,6 +28832,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21626
+ server_monotonic_dur: 5345
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27642,6 +28870,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24258
+ server_monotonic_dur: 7879
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27678,6 +28908,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21796
+ server_monotonic_dur: 5274
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27714,6 +28946,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21612
+ server_monotonic_dur: 5227
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27750,6 +28984,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24409
+ server_monotonic_dur: 7945
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -27786,6 +29022,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 21304
+ server_monotonic_dur: 5405
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -27816,6 +29054,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 20650
+ server_monotonic_dur: 5275
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -27846,6 +29086,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23293
+ server_monotonic_dur: 8055
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -27876,6 +29118,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 20415
+ server_monotonic_dur: 5323
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -27906,6 +29150,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23140
+ server_monotonic_dur: 7699
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -27936,6 +29182,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 20312
+ server_monotonic_dur: 5293
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -27966,6 +29214,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22673
+ server_monotonic_dur: 7721
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -27996,6 +29246,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22661
+ server_monotonic_dur: 7740
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -28026,6 +29278,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22659
+ server_monotonic_dur: 7711
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -28056,6 +29310,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22706
+ server_monotonic_dur: 7719
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -28086,6 +29342,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22622
+ server_monotonic_dur: 7628
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -28116,6 +29374,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22726
+ server_monotonic_dur: 7718
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -28146,6 +29406,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22953
+ server_monotonic_dur: 7746
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -28176,6 +29438,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22784
+ server_monotonic_dur: 7712
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -28206,6 +29470,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22691
+ server_monotonic_dur: 7624
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -28236,6 +29502,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 20391
+ server_monotonic_dur: 5308
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -28266,6 +29534,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 20254
+ server_monotonic_dur: 5281
thread_states {
thread_state_type: "binder_txn"
thread_state: "R+"
@@ -28296,6 +29566,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1322150
+ server_monotonic_dur: 17684
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -28338,6 +29610,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 50949
+ server_monotonic_dur: 14973
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28374,6 +29648,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36821
+ server_monotonic_dur: 9677
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28410,6 +29686,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40517
+ server_monotonic_dur: 10198
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28446,6 +29724,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 38972
+ server_monotonic_dur: 9094
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28482,6 +29762,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 58727
+ server_monotonic_dur: 30654
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28518,6 +29800,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 37895
+ server_monotonic_dur: 9611
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28554,6 +29838,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 70403
+ server_monotonic_dur: 43299
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28590,6 +29876,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40782
+ server_monotonic_dur: 13796
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28626,6 +29914,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39514
+ server_monotonic_dur: 13152
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28662,6 +29952,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39404
+ server_monotonic_dur: 12971
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28698,6 +29990,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39462
+ server_monotonic_dur: 13001
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28734,6 +30028,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39435
+ server_monotonic_dur: 13025
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28770,6 +30066,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39155
+ server_monotonic_dur: 12827
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28806,6 +30104,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39318
+ server_monotonic_dur: 13013
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28842,6 +30142,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40374
+ server_monotonic_dur: 13042
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28878,6 +30180,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39667
+ server_monotonic_dur: 13220
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28914,6 +30218,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39274
+ server_monotonic_dur: 13002
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28950,6 +30256,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39611
+ server_monotonic_dur: 13280
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -28986,6 +30294,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39285
+ server_monotonic_dur: 12883
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29022,6 +30332,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39290
+ server_monotonic_dur: 12995
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29058,6 +30370,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35392
+ server_monotonic_dur: 9048
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29094,6 +30408,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40115
+ server_monotonic_dur: 13177
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29130,6 +30446,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35408
+ server_monotonic_dur: 8864
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29166,6 +30484,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35682
+ server_monotonic_dur: 8910
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29202,6 +30522,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40695
+ server_monotonic_dur: 14086
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29238,6 +30560,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36460
+ server_monotonic_dur: 9138
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29274,6 +30598,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35280
+ server_monotonic_dur: 8765
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29310,6 +30636,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39673
+ server_monotonic_dur: 13221
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29346,6 +30674,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36181
+ server_monotonic_dur: 9064
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29382,6 +30712,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39287
+ server_monotonic_dur: 12919
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29418,6 +30750,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 52115
+ server_monotonic_dur: 9023
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29454,6 +30788,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 69165
+ server_monotonic_dur: 41453
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29490,6 +30826,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41115
+ server_monotonic_dur: 13596
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29526,6 +30864,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39291
+ server_monotonic_dur: 13234
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29562,6 +30902,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 40177
+ server_monotonic_dur: 13349
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29598,6 +30940,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 39543
+ server_monotonic_dur: 13473
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29634,6 +30978,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 38962
+ server_monotonic_dur: 12841
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29670,6 +31016,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35128
+ server_monotonic_dur: 8992
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29706,6 +31054,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35089
+ server_monotonic_dur: 9000
thread_states {
thread_state_type: "binder_txn"
thread_state: "R"
@@ -29742,6 +31092,8 @@
server_pid: 553
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 55023
+ server_monotonic_dur: 21000
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -29784,6 +31136,8 @@
server_pid: 243
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 228059900
+ server_monotonic_dur: 228026279
thread_states {
thread_state_type: "binder_reply"
thread_state: "D"
@@ -29862,6 +31216,8 @@
server_pid: 243
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 162681216
+ server_monotonic_dur: 162630809
thread_states {
thread_state_type: "binder_reply"
thread_state: "D"
@@ -29940,6 +31296,8 @@
server_pid: 243
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 20588852
+ server_monotonic_dur: 20538993
thread_states {
thread_state_type: "binder_reply"
thread_state: "D"
@@ -30012,6 +31370,8 @@
server_pid: 243
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 170336
+ server_monotonic_dur: 96466
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30054,6 +31414,8 @@
server_pid: 243
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 285656
+ server_monotonic_dur: 216457
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30099,6 +31461,8 @@
server_pid: 557
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 281586
+ server_monotonic_dur: 201375
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30141,6 +31505,8 @@
server_pid: 243
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 88126
+ server_monotonic_dur: 28600
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30177,6 +31543,8 @@
server_pid: 243
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1107826416
+ server_monotonic_dur: 1107753554
thread_states {
thread_state_type: "binder_reply"
thread_state: "D"
@@ -30267,6 +31635,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 551762
+ server_monotonic_dur: 37934
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30291,6 +31661,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 206755
+ server_monotonic_dur: 99199
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30327,6 +31699,8 @@
server_pid: 243
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1012632223
+ server_monotonic_dur: 1012458082
thread_states {
thread_state_type: "binder_reply"
thread_state: "D"
@@ -30393,6 +31767,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 148055
+ server_monotonic_dur: 67881
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30417,6 +31793,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 199120
+ server_monotonic_dur: 96025
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30453,6 +31831,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 763221
+ server_monotonic_dur: 69071
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30489,6 +31869,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 184045
+ server_monotonic_dur: 66422
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30525,6 +31907,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 4469869
+ server_monotonic_dur: 44047
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30567,6 +31951,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 480108
+ server_monotonic_dur: 49614
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30609,6 +31995,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 2740797
+ server_monotonic_dur: 60621
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30651,6 +32039,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 9261452
+ server_monotonic_dur: 38742
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30693,6 +32083,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 2413332
+ server_monotonic_dur: 29167
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30735,6 +32127,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 303028
+ server_monotonic_dur: 23950
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30777,6 +32171,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 396440
+ server_monotonic_dur: 14784
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30819,6 +32215,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 282912
+ server_monotonic_dur: 46916
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30861,6 +32259,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 26498
+ server_monotonic_dur: 5533
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30903,6 +32303,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23985
+ server_monotonic_dur: 5247
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30945,6 +32347,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23561
+ server_monotonic_dur: 5111
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -30987,6 +32391,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23488
+ server_monotonic_dur: 5124
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31029,6 +32435,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 58807
+ server_monotonic_dur: 25722
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31071,6 +32479,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25853
+ server_monotonic_dur: 5759
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31113,6 +32523,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24395
+ server_monotonic_dur: 5429
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31155,6 +32567,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23577
+ server_monotonic_dur: 5097
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31197,6 +32611,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23326
+ server_monotonic_dur: 5094
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31239,6 +32655,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 41562
+ server_monotonic_dur: 14905
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31281,6 +32699,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24617
+ server_monotonic_dur: 5437
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31323,6 +32743,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23847
+ server_monotonic_dur: 5279
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31365,6 +32787,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23344
+ server_monotonic_dur: 5018
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31407,6 +32831,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23173
+ server_monotonic_dur: 5003
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31449,6 +32875,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 42455
+ server_monotonic_dur: 13643
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31491,6 +32919,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25039
+ server_monotonic_dur: 5879
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31533,6 +32963,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23818
+ server_monotonic_dur: 5210
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31575,6 +33007,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23523
+ server_monotonic_dur: 5250
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31617,6 +33051,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23258
+ server_monotonic_dur: 5179
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31659,6 +33095,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 37686
+ server_monotonic_dur: 12741
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31701,6 +33139,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25076
+ server_monotonic_dur: 5338
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31743,6 +33183,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24170
+ server_monotonic_dur: 5220
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31785,6 +33227,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23285
+ server_monotonic_dur: 5136
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31827,6 +33271,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23121
+ server_monotonic_dur: 5074
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31869,6 +33315,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36446
+ server_monotonic_dur: 11331
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31911,6 +33359,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 216337
+ server_monotonic_dur: 9175
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -31959,6 +33409,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24997
+ server_monotonic_dur: 5134
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32001,6 +33453,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23646
+ server_monotonic_dur: 5045
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32043,6 +33497,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23278
+ server_monotonic_dur: 5008
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32085,6 +33541,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 38383
+ server_monotonic_dur: 11966
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32127,6 +33585,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24444
+ server_monotonic_dur: 5361
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32169,6 +33629,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23624
+ server_monotonic_dur: 5206
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32211,6 +33673,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23411
+ server_monotonic_dur: 5103
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32253,6 +33717,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23200
+ server_monotonic_dur: 5116
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32295,6 +33761,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 37272
+ server_monotonic_dur: 11195
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32337,6 +33805,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24893
+ server_monotonic_dur: 5464
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32379,6 +33849,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23737
+ server_monotonic_dur: 5128
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32421,6 +33893,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23670
+ server_monotonic_dur: 5080
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32463,6 +33937,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23503
+ server_monotonic_dur: 5083
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32505,6 +33981,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35592
+ server_monotonic_dur: 10713
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32547,6 +34025,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24305
+ server_monotonic_dur: 5210
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32589,6 +34069,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23706
+ server_monotonic_dur: 5225
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32631,6 +34113,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23165
+ server_monotonic_dur: 5074
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32673,6 +34157,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23168
+ server_monotonic_dur: 5133
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32715,6 +34201,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35306
+ server_monotonic_dur: 10392
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32757,6 +34245,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24381
+ server_monotonic_dur: 5176
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32799,6 +34289,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23470
+ server_monotonic_dur: 5115
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32841,6 +34333,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23542
+ server_monotonic_dur: 5073
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32883,6 +34377,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23384
+ server_monotonic_dur: 5074
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32925,6 +34421,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35250
+ server_monotonic_dur: 10236
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -32967,6 +34465,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24212
+ server_monotonic_dur: 5302
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33009,6 +34509,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 26668
+ server_monotonic_dur: 5690
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33051,6 +34553,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 28736
+ server_monotonic_dur: 6082
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33093,6 +34597,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 31692
+ server_monotonic_dur: 7457
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33135,6 +34641,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 38639
+ server_monotonic_dur: 11177
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33177,6 +34685,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25645
+ server_monotonic_dur: 5662
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33219,6 +34729,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25248
+ server_monotonic_dur: 5141
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33261,6 +34773,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24407
+ server_monotonic_dur: 5197
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33303,6 +34817,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23761
+ server_monotonic_dur: 5029
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33345,6 +34861,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36661
+ server_monotonic_dur: 10577
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33387,6 +34905,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25064
+ server_monotonic_dur: 5449
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33429,6 +34949,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23437
+ server_monotonic_dur: 5088
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33471,6 +34993,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 27788
+ server_monotonic_dur: 6148
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33513,6 +35037,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 30162
+ server_monotonic_dur: 6377
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33555,6 +35081,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 204333
+ server_monotonic_dur: 10440
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33597,6 +35125,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 28290
+ server_monotonic_dur: 6752
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33639,6 +35169,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23656
+ server_monotonic_dur: 5177
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33681,6 +35213,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23334
+ server_monotonic_dur: 5089
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33723,6 +35257,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23145
+ server_monotonic_dur: 5038
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33765,6 +35301,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35789
+ server_monotonic_dur: 10425
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33807,6 +35345,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24574
+ server_monotonic_dur: 5165
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33849,6 +35389,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23513
+ server_monotonic_dur: 5220
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33891,6 +35433,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23105
+ server_monotonic_dur: 5151
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33933,6 +35477,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 22850
+ server_monotonic_dur: 5061
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -33975,6 +35521,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36067
+ server_monotonic_dur: 11134
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34017,6 +35565,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24738
+ server_monotonic_dur: 5151
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34059,6 +35609,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23608
+ server_monotonic_dur: 5033
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34101,6 +35653,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23348
+ server_monotonic_dur: 5000
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34143,6 +35697,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23149
+ server_monotonic_dur: 4962
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34185,6 +35741,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 34410
+ server_monotonic_dur: 9921
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34227,6 +35785,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25022
+ server_monotonic_dur: 5372
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34269,6 +35829,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23533
+ server_monotonic_dur: 5067
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34311,6 +35873,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23334
+ server_monotonic_dur: 5004
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34353,6 +35917,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23264
+ server_monotonic_dur: 5062
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34395,6 +35961,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 37797
+ server_monotonic_dur: 11210
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34437,6 +36005,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24457
+ server_monotonic_dur: 5311
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34479,6 +36049,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23691
+ server_monotonic_dur: 5120
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34521,6 +36093,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23600
+ server_monotonic_dur: 5195
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34563,6 +36137,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23223
+ server_monotonic_dur: 5022
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34605,6 +36181,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24971
+ server_monotonic_dur: 5779
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34647,6 +36225,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23811
+ server_monotonic_dur: 5064
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34689,6 +36269,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23366
+ server_monotonic_dur: 5050
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34731,6 +36313,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36875
+ server_monotonic_dur: 5970
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34773,6 +36357,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23299
+ server_monotonic_dur: 5177
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34815,6 +36401,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23580
+ server_monotonic_dur: 5233
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34857,6 +36445,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23357
+ server_monotonic_dur: 5118
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34899,6 +36489,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23287
+ server_monotonic_dur: 5230
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34941,6 +36533,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23143
+ server_monotonic_dur: 5080
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -34983,6 +36577,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23644
+ server_monotonic_dur: 5056
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35025,6 +36621,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23543
+ server_monotonic_dur: 5145
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35067,6 +36665,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23143
+ server_monotonic_dur: 5048
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35109,6 +36709,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23084
+ server_monotonic_dur: 5059
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35151,6 +36753,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23140
+ server_monotonic_dur: 5047
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35193,6 +36797,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23089
+ server_monotonic_dur: 5027
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35235,6 +36841,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35357
+ server_monotonic_dur: 10429
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35277,6 +36885,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 88269
+ server_monotonic_dur: 5241
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35319,6 +36929,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24809
+ server_monotonic_dur: 5666
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35361,6 +36973,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23697
+ server_monotonic_dur: 5217
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35403,6 +37017,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23663
+ server_monotonic_dur: 5052
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35445,6 +37061,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 25870
+ server_monotonic_dur: 5746
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35487,6 +37105,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23258
+ server_monotonic_dur: 5107
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35529,6 +37149,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 150443
+ server_monotonic_dur: 5613
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35565,6 +37187,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24180
+ server_monotonic_dur: 5626
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35607,6 +37231,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 34839
+ server_monotonic_dur: 5193
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35649,6 +37275,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 33346
+ server_monotonic_dur: 9340
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35691,6 +37319,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23777
+ server_monotonic_dur: 5140
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35733,6 +37363,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23389
+ server_monotonic_dur: 5100
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35775,6 +37407,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23142
+ server_monotonic_dur: 5086
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35817,6 +37451,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23125
+ server_monotonic_dur: 5089
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35859,6 +37495,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23978
+ server_monotonic_dur: 5383
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35901,6 +37539,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23179
+ server_monotonic_dur: 5138
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35943,6 +37583,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 26831
+ server_monotonic_dur: 5902
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -35985,6 +37627,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 29437
+ server_monotonic_dur: 6174
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36027,6 +37671,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 30978
+ server_monotonic_dur: 6742
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36069,6 +37715,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 27467
+ server_monotonic_dur: 6461
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36111,6 +37759,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23777
+ server_monotonic_dur: 5275
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36153,6 +37803,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23185
+ server_monotonic_dur: 5108
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36195,6 +37847,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23203
+ server_monotonic_dur: 5092
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36237,6 +37891,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23347
+ server_monotonic_dur: 5253
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36279,6 +37935,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 7978157
+ server_monotonic_dur: 66962
thread_states {
thread_state_type: "binder_reply"
thread_state: "R"
@@ -36321,6 +37979,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 34814
+ server_monotonic_dur: 9528
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36363,6 +38023,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24308
+ server_monotonic_dur: 5289
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36405,6 +38067,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23448
+ server_monotonic_dur: 5073
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36447,6 +38111,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23421
+ server_monotonic_dur: 5046
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36489,6 +38155,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1913216
+ server_monotonic_dur: 9871
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36531,6 +38199,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 34454
+ server_monotonic_dur: 9275
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36573,6 +38243,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24416
+ server_monotonic_dur: 5102
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36615,6 +38287,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23679
+ server_monotonic_dur: 5243
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36657,6 +38331,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23222
+ server_monotonic_dur: 5090
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36699,6 +38375,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 5056885
+ server_monotonic_dur: 9349
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36741,6 +38419,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 33923
+ server_monotonic_dur: 9115
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36783,6 +38463,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23704
+ server_monotonic_dur: 5092
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36825,6 +38507,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23336
+ server_monotonic_dur: 5061
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36867,6 +38551,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23099
+ server_monotonic_dur: 4992
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36909,6 +38595,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 11032023
+ server_monotonic_dur: 9668
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36951,6 +38639,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 34577
+ server_monotonic_dur: 8880
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -36993,6 +38683,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23881
+ server_monotonic_dur: 5076
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37035,6 +38727,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23603
+ server_monotonic_dur: 5316
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37077,6 +38771,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23285
+ server_monotonic_dur: 5074
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37119,6 +38815,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 36911
+ server_monotonic_dur: 9735
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37161,6 +38859,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24626
+ server_monotonic_dur: 5361
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37203,6 +38903,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23589
+ server_monotonic_dur: 5097
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37245,6 +38947,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23634
+ server_monotonic_dur: 5011
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37287,6 +38991,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23394
+ server_monotonic_dur: 5235
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37329,6 +39035,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 8989871
+ server_monotonic_dur: 9601
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37371,6 +39079,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 35638
+ server_monotonic_dur: 8905
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37413,6 +39123,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 24171
+ server_monotonic_dur: 5233
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37455,6 +39167,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23967
+ server_monotonic_dur: 5113
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37497,6 +39211,8 @@
server_pid: 447
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 23205
+ server_monotonic_dur: 5070
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37539,6 +39255,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 163113
+ server_monotonic_dur: 46170
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37575,6 +39293,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 3407477
+ server_monotonic_dur: 93276
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37617,6 +39337,8 @@
server_pid: 256
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 408373
+ server_monotonic_dur: 126182
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37659,6 +39381,8 @@
server_pid: 256
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 74407
+ server_monotonic_dur: 27462
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37695,6 +39419,8 @@
server_pid: 256
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 253419
+ server_monotonic_dur: 62308
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37731,6 +39457,8 @@
server_pid: 256
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 27262
+ server_monotonic_dur: 6839
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37767,6 +39495,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 566849
+ server_monotonic_dur: 42126
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37803,6 +39533,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 640620
+ server_monotonic_dur: 59362
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37845,6 +39577,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 67172
+ server_monotonic_dur: 25498
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37884,6 +39618,8 @@
server_pid: 550
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1832306
+ server_monotonic_dur: 1612156
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37926,6 +39662,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 96979
+ server_monotonic_dur: 36676
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37962,6 +39700,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 96212
+ server_monotonic_dur: 34204
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -37998,6 +39738,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 85847
+ server_monotonic_dur: 34883
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -38034,6 +39776,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 623581
+ server_monotonic_dur: 30144
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -38076,6 +39820,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 290505
+ server_monotonic_dur: 30338
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -38118,6 +39864,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 876817
+ server_monotonic_dur: 30724
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -38163,6 +39911,8 @@
server_pid: 550
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 2881392
+ server_monotonic_dur: 1064925
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -38199,6 +39949,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 117266
+ server_monotonic_dur: 28273
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -38241,6 +39993,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 1595172
+ server_monotonic_dur: 27543
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -38283,6 +40037,8 @@
server_pid: 226
server_oom_score: -1000
is_sync: true
+ client_monotonic_dur: 2090082
+ server_monotonic_dur: 29214
thread_states {
thread_state_type: "binder_reply"
thread_state: "Running"
@@ -38328,6 +40084,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IPermissionManager::getPermissionInfo::server"
@@ -38349,6 +40107,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38372,6 +40132,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38395,6 +40157,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeInternalPathChanged::server"
@@ -38416,6 +40180,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumePathChanged::server"
@@ -38437,6 +40203,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "com.android.providers.media.module"
@@ -38455,6 +40223,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38478,6 +40248,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::INotificationManager::cancelNotificationWithTag::server"
@@ -38499,6 +40271,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38522,6 +40296,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38545,6 +40321,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38568,6 +40346,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38591,6 +40371,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38614,6 +40396,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38637,6 +40421,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38660,6 +40446,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38680,6 +40468,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38703,6 +40493,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUserManager::getProfileIds::server"
@@ -38724,6 +40516,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38747,6 +40541,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38770,6 +40566,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38793,6 +40591,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38816,6 +40616,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38839,6 +40641,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38862,6 +40666,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38885,6 +40691,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IActivityManager::finishReceiver::server"
@@ -38906,6 +40714,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IActivityManager::finishReceiver::server"
@@ -38927,6 +40737,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -38950,6 +40762,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -38971,6 +40785,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -38992,6 +40808,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39010,6 +40828,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39028,6 +40848,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39049,6 +40871,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39070,6 +40894,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39091,6 +40917,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39112,6 +40940,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39133,6 +40963,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39154,6 +40986,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39175,6 +41009,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39196,6 +41032,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39217,6 +41055,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -39238,6 +41078,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -39259,6 +41101,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39280,6 +41124,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -39301,6 +41147,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -39322,6 +41170,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39340,6 +41190,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39358,6 +41210,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39376,6 +41230,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39394,6 +41250,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39412,6 +41270,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39433,6 +41293,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39454,6 +41316,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39475,6 +41339,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39496,6 +41362,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39517,6 +41385,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39538,6 +41408,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39559,6 +41431,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39580,6 +41454,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39601,6 +41477,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39622,6 +41500,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -39643,6 +41523,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39661,6 +41543,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39679,6 +41563,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39697,6 +41583,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39715,6 +41603,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39733,6 +41623,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39751,6 +41643,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39769,6 +41663,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39787,6 +41683,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39805,6 +41703,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39823,6 +41723,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39841,6 +41743,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39859,6 +41763,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39877,6 +41783,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39895,6 +41803,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39913,6 +41823,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39931,6 +41843,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39949,6 +41863,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39967,6 +41883,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -39985,6 +41903,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40003,6 +41923,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40021,6 +41943,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40039,6 +41963,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40057,6 +41983,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40075,6 +42003,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40093,6 +42023,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40111,6 +42043,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40129,6 +42063,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40147,6 +42083,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40165,6 +42103,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40183,6 +42123,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40201,6 +42143,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40219,6 +42163,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40237,6 +42183,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40255,6 +42203,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40273,6 +42223,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40291,6 +42243,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40309,6 +42263,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40327,6 +42283,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40345,6 +42303,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40363,6 +42323,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40381,6 +42343,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40399,6 +42363,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40417,6 +42383,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40435,6 +42403,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40453,6 +42423,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40471,6 +42443,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40489,6 +42463,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40507,6 +42483,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40525,6 +42503,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40543,6 +42523,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40561,6 +42543,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40579,6 +42563,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40597,6 +42583,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40615,6 +42603,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40633,6 +42623,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40651,6 +42643,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40669,6 +42663,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40687,6 +42683,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40705,6 +42703,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40723,6 +42723,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40741,6 +42743,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40759,6 +42763,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40777,6 +42783,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40795,6 +42803,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40813,6 +42823,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40831,6 +42843,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40849,6 +42863,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40867,6 +42883,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -40885,6 +42903,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -40906,6 +42926,8 @@
server_pid: 1937
server_oom_score: 925
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -40927,6 +42949,8 @@
server_pid: 1866
server_oom_score: 955
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -40948,6 +42972,8 @@
server_pid: 2003
server_oom_score: 965
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -40969,6 +42995,8 @@
server_pid: 2003
server_oom_score: 0
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -40990,6 +43018,8 @@
server_pid: 2003
server_oom_score: 905
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -41011,6 +43041,8 @@
server_pid: 2003
server_oom_score: 0
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -41032,6 +43064,8 @@
server_pid: 2003
server_oom_score: 905
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41050,6 +43084,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41068,6 +43104,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41085,6 +43123,8 @@
server_tid: 3484
server_pid: 3482
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleRegisteredReceiver::server"
@@ -41106,6 +43146,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IRemoteSessionCallback::onSessionChanged::server"
@@ -41127,6 +43169,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41145,6 +43189,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -41166,6 +43212,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -41187,6 +43235,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -41208,6 +43258,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -41229,6 +43281,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleRegisteredReceiver::server"
@@ -41250,6 +43304,8 @@
server_pid: 1469
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleRegisteredReceiver::server"
@@ -41271,6 +43327,8 @@
server_pid: 1469
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleRegisteredReceiver::server"
@@ -41292,6 +43350,8 @@
server_pid: 1469
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -41313,6 +43373,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IActivityManager::serviceDoneExecuting::server"
@@ -41334,6 +43396,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -41354,6 +43418,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41372,6 +43438,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41390,6 +43458,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41408,6 +43478,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41426,6 +43498,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41444,6 +43518,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41462,6 +43538,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41480,6 +43558,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41498,6 +43578,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41516,6 +43598,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41534,6 +43618,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41552,6 +43638,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41570,6 +43658,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41588,6 +43678,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41606,6 +43698,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41624,6 +43718,8 @@
server_pid: 256
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41642,6 +43738,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -41660,6 +43758,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onDiskScanned::server"
@@ -41681,6 +43781,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IPhoneStateListener::onSignalStrengthsChanged::server"
@@ -41702,6 +43804,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -41723,6 +43827,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::INotificationListener::onNotificationRemoved::server"
@@ -41744,6 +43850,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -41762,6 +43870,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -41780,6 +43890,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -41798,6 +43910,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IPackageManager::notifyDexLoad::server"
@@ -41819,6 +43933,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -41842,6 +43958,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStatsManagerService::registerPullAtomCallback::server"
@@ -41863,6 +43981,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -41886,6 +44006,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -41909,6 +44031,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -41929,6 +44053,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -41952,6 +44078,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -41973,6 +44101,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -41994,6 +44124,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeDestroyed::server"
@@ -42015,6 +44147,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -42036,6 +44170,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeDestroyed::server"
@@ -42057,6 +44193,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onDiskDestroyed::server"
@@ -42078,6 +44216,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onDiskCreated::server"
@@ -42099,6 +44239,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onDiskMetadataChanged::server"
@@ -42120,6 +44262,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeCreated::server"
@@ -42141,6 +44285,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -42162,6 +44308,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onDiskScanned::server"
@@ -42183,6 +44331,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeCreated::server"
@@ -42204,6 +44354,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -42225,6 +44377,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeStateChanged::server"
@@ -42246,6 +44400,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageManager::getVolumeList::server"
@@ -42267,6 +44423,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42290,6 +44448,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42313,6 +44473,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42336,6 +44498,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumeInternalPathChanged::server"
@@ -42357,6 +44521,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IVoldListener::onVolumePathChanged::server"
@@ -42378,6 +44544,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IActivityManager::finishReceiver::server"
@@ -42399,6 +44567,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42422,6 +44592,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42445,6 +44617,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42468,6 +44642,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42491,6 +44667,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42514,6 +44692,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42537,6 +44717,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42560,6 +44742,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42583,6 +44767,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42606,6 +44792,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42629,6 +44817,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42652,6 +44842,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42675,6 +44867,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42698,6 +44892,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42721,6 +44917,8 @@
server_pid: 642
server_oom_score: -900
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -42744,6 +44942,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -42765,6 +44965,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -42786,6 +44988,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidGone::server"
@@ -42807,6 +45011,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -42828,6 +45034,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IUidObserver::onUidStateChanged::server"
@@ -42849,6 +45057,8 @@
server_pid: 1441
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::bindApplication::server"
@@ -42870,6 +45080,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -42891,6 +45103,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleCreateService::server"
@@ -42912,6 +45126,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleBindService::server"
@@ -42933,6 +45149,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -42954,6 +45172,8 @@
server_pid: 3487
server_oom_score: 0
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onDiskScanned::server"
@@ -42975,6 +45195,8 @@
server_pid: 3487
server_oom_score: 905
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -42996,6 +45218,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleCreateService::server"
@@ -43017,6 +45241,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleBindService::server"
@@ -43038,6 +45264,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -43059,6 +45287,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43080,6 +45310,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -43101,6 +45333,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -43122,6 +45356,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -43143,6 +45379,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IExternalStorageService::startSession::server"
@@ -43164,6 +45402,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -43185,6 +45425,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43206,6 +45448,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IExternalStorageService::startSession::server"
@@ -43227,6 +45471,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -43248,6 +45494,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43269,6 +45517,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -43290,6 +45540,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43311,6 +45563,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -43332,6 +45586,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IJobService::startJob::server"
@@ -43353,6 +45609,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43374,6 +45632,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -43395,6 +45655,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IExternalStorageService::notifyVolumeStateChanged::server"
@@ -43416,6 +45678,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -43437,6 +45701,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -43458,6 +45724,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IExternalStorageService::endSession::server"
@@ -43479,6 +45747,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IExternalStorageService::endSession::server"
@@ -43500,6 +45770,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleUnbindService::server"
@@ -43521,6 +45793,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleStopService::server"
@@ -43542,6 +45816,8 @@
server_pid: 3487
server_oom_score: 0
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -43563,6 +45839,8 @@
server_pid: 3487
server_oom_score: 0
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -43584,6 +45862,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleCreateService::server"
@@ -43605,6 +45885,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleBindService::server"
@@ -43626,6 +45908,8 @@
server_pid: 3487
server_oom_score: -700
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IMediaMetricsService::submitBuffer::cppServer"
@@ -43647,6 +45931,8 @@
server_pid: 552
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -43670,6 +45956,8 @@
server_pid: 552
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -43693,6 +45981,8 @@
server_pid: 552
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IMediaMetricsService::submitBuffer::cppServer"
@@ -43714,6 +46004,8 @@
server_pid: 552
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IMediaMetricsService::submitBuffer::cppServer"
@@ -43735,6 +46027,8 @@
server_pid: 552
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -43753,6 +46047,8 @@
server_pid: 398
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -43771,6 +46067,8 @@
server_pid: 398
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -43792,6 +46090,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -43812,6 +46112,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -43830,6 +46132,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -43848,6 +46152,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -43866,6 +46172,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -43884,6 +46192,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -43902,6 +46212,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -43923,6 +46235,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -43943,6 +46257,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -43964,6 +46280,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -43984,6 +46302,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "com.android.systemui"
@@ -44002,6 +46322,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44025,6 +46347,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44045,6 +46369,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44066,6 +46392,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44086,6 +46414,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44106,6 +46436,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44127,6 +46459,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44147,6 +46481,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44167,6 +46503,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44188,6 +46526,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44208,6 +46548,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44228,6 +46570,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44249,6 +46593,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44269,6 +46615,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44290,6 +46638,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44310,6 +46660,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44331,6 +46683,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44351,6 +46705,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44369,6 +46725,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44387,6 +46745,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44405,6 +46765,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44426,6 +46788,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44446,6 +46810,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44464,6 +46830,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44482,6 +46850,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44503,6 +46873,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44523,6 +46895,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44541,6 +46915,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/vendor/bin/hw/android.hardware.graphics.composer3-service.ranchu"
@@ -44559,6 +46935,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44580,6 +46958,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44603,6 +46983,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44623,6 +47005,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44646,6 +47030,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44669,6 +47055,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44689,6 +47077,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44710,6 +47100,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44730,6 +47122,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44751,6 +47145,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44771,6 +47167,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44792,6 +47190,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44812,6 +47212,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44832,6 +47234,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44853,6 +47257,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44873,6 +47279,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "com.android.systemui"
@@ -44891,6 +47299,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44914,6 +47324,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44934,6 +47346,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44954,6 +47368,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -44975,6 +47391,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -44995,6 +47413,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -45015,6 +47435,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -45036,6 +47458,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -45056,6 +47480,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -45076,6 +47502,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -45097,6 +47525,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -45117,6 +47547,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -45137,6 +47569,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -45158,6 +47592,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -45178,6 +47614,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -45198,6 +47636,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -45219,6 +47659,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -45239,6 +47681,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -45259,6 +47703,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::cpp::IDisplayEventConnection::requestNextVsync::cppServer"
@@ -45280,6 +47726,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -45300,6 +47748,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45318,6 +47768,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45336,6 +47788,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45354,6 +47808,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45372,6 +47828,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45390,6 +47848,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45408,6 +47868,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45426,6 +47888,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45444,6 +47908,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45462,6 +47928,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45480,6 +47948,8 @@
server_pid: 476
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/apex/com.google.cf.rild/bin/hw/libcuttlefish-rild"
@@ -45498,6 +47968,8 @@
server_pid: 1469
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IPhoneStateListener::onSignalStrengthsChanged::server"
@@ -45519,6 +47991,8 @@
server_pid: 1469
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::INotificationListener::onNotificationRemoved::server"
@@ -45540,6 +48014,8 @@
server_pid: 1734
server_oom_score: 100
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::INotificationListener::onNotificationEnqueuedWithChannel::server"
@@ -45561,6 +48037,8 @@
server_pid: 1734
server_oom_score: 100
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::INotificationListener::onNotificationEnqueuedWithChannel::server"
@@ -45582,6 +48060,8 @@
server_pid: 1734
server_oom_score: 100
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::INotificationListener::onNotificationPosted::server"
@@ -45603,6 +48083,8 @@
server_pid: 1734
server_oom_score: 100
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::INotificationListener::onNotificationPosted::server"
@@ -45624,6 +48106,8 @@
server_pid: 1734
server_oom_score: 100
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -45642,6 +48126,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45660,6 +48146,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45678,6 +48166,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45696,6 +48186,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45714,6 +48206,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45732,6 +48226,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45750,6 +48246,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45768,6 +48266,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -45786,6 +48286,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45804,6 +48306,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45822,6 +48326,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45840,6 +48346,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45858,6 +48366,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45876,6 +48386,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45894,6 +48406,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45912,6 +48426,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45930,6 +48446,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45948,6 +48466,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45966,6 +48486,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -45984,6 +48506,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46002,6 +48526,8 @@
server_pid: 459
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "com.android.systemui"
@@ -46020,6 +48546,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -46040,6 +48568,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -46060,6 +48590,8 @@
server_pid: 484
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
client_package_version_code: 33
is_client_package_debuggable: false
}
@@ -46080,6 +48612,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -46098,6 +48632,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -46116,6 +48652,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -46134,6 +48672,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -46155,6 +48695,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -46176,6 +48718,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -46197,6 +48741,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onVolumeStateChanged::server"
@@ -46218,6 +48764,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IStorageEventListener::onStorageStateChanged::server"
@@ -46239,6 +48787,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::INotificationListener::onNotificationPosted::server"
@@ -46260,6 +48810,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::INotificationListener::onNotificationPosted::server"
@@ -46281,6 +48833,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -46299,6 +48853,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -46317,6 +48873,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -46335,6 +48893,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -46353,6 +48913,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -46371,6 +48933,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -46389,6 +48953,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "/system/bin/surfaceflinger"
@@ -46407,6 +48973,8 @@
server_pid: 1253
server_oom_score: -800
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::bindApplication::server"
@@ -46428,6 +48996,8 @@
server_pid: 3549
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -46449,6 +49019,8 @@
server_pid: 3549
server_oom_score: 0
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -46470,6 +49042,8 @@
server_pid: 3549
server_oom_score: 0
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -46491,6 +49065,8 @@
server_pid: 3549
server_oom_score: 0
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -46512,6 +49088,8 @@
server_pid: 3549
server_oom_score: 905
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::scheduleReceiver::server"
@@ -46533,6 +49111,8 @@
server_pid: 3549
server_oom_score: 0
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
aidl_name: "AIDL::java::IApplicationThread::setProcessState::server"
@@ -46554,6 +49134,8 @@
server_pid: 3549
server_oom_score: 905
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46572,6 +49154,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46590,6 +49174,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46608,6 +49194,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46626,6 +49214,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46644,6 +49234,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46662,6 +49254,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46680,6 +49274,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46698,6 +49294,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46716,6 +49314,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46734,6 +49334,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46752,6 +49354,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46770,6 +49374,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46788,6 +49394,8 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
unaggregated_txn_breakdown {
client_process: "system_server"
@@ -46806,5 +49414,7 @@
server_pid: 534
server_oom_score: -1000
is_sync: false
+ client_monotonic_dur: 0
+ server_monotonic_dur: 0
}
}
diff --git a/test/trace_processor/diff_tests/metrics/android/android_monitor_contention.out b/test/trace_processor/diff_tests/metrics/android/android_monitor_contention.out
index 43cf561..0fc97f3 100644
--- a/test/trace_processor/diff_tests/metrics/android/android_monitor_contention.out
+++ b/test/trace_processor/diff_tests/metrics/android/android_monitor_contention.out
@@ -3,6 +3,7 @@
node_id: 15061
ts: 1740012196981
dur: 235531
+ monotonic_dur: 235531
blocking_method: "android.content.pm.UserInfo com.android.server.pm.UserManagerService.getUserInfoNoChecks(int)"
blocked_method: "android.content.pm.UserInfo com.android.server.pm.UserManagerService.getUserInfoNoChecks(int)"
short_blocking_method: "com.android.server.pm.UserManagerService.getUserInfoNoChecks"
@@ -40,6 +41,7 @@
node_id: 2055
ts: 1737223735202
dur: 40111
+ monotonic_dur: 40111
blocking_method: "android.os.Message android.os.MessageQueue.next()"
blocked_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
short_blocking_method: "android.os.MessageQueue.next"
@@ -70,6 +72,7 @@
node_id: 1958
ts: 1737221139743
dur: 4232
+ monotonic_dur: 4232
blocking_method: "android.os.Message android.os.MessageQueue.next()"
blocked_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
short_blocking_method: "android.os.MessageQueue.next"
@@ -100,6 +103,7 @@
node_id: 14623
ts: 1739982673132
dur: 2750652
+ monotonic_dur: 2750652
blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
blocked_method: "android.os.storage.VolumeInfo[] com.android.server.StorageManagerService.getVolumes(int)"
short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -120,6 +124,7 @@
node_id: 13975
ts: 1739942269308
dur: 2165740
+ monotonic_dur: 2165740
blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
blocked_method: "android.os.storage.VolumeRecord[] com.android.server.StorageManagerService.getVolumeRecords(int)"
short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -140,6 +145,7 @@
node_id: 14626
ts: 1739982812646
dur: 943658
+ monotonic_dur: 943658
blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
blocked_method: "android.os.storage.VolumeRecord[] com.android.server.StorageManagerService.getVolumeRecords(int)"
short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -162,6 +168,7 @@
node_id: 14617
ts: 1739982085531
dur: 1188242
+ monotonic_dur: 1188242
blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -194,6 +201,7 @@
node_id: 15248
ts: 1740024214050
dur: 228088
+ monotonic_dur: 228088
blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -226,6 +234,7 @@
node_id: 13979
ts: 1739942426827
dur: 23842
+ monotonic_dur: 23842
blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -246,6 +255,7 @@
node_id: 14636
ts: 1739983492768
dur: 388360
+ monotonic_dur: 388360
blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -266,6 +276,7 @@
node_id: 14807
ts: 1739997641827
dur: 602533
+ monotonic_dur: 602533
blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
blocked_method: "boolean com.android.server.StorageManagerService.isUserKeyUnlocked(int)"
short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -296,6 +307,7 @@
node_id: 14619
ts: 1739982249023
dur: 2051396
+ monotonic_dur: 2051396
blocking_method: "android.os.storage.StorageVolume[] com.android.server.StorageManagerService.getVolumeList(int, java.lang.String, int)"
blocked_method: "boolean com.android.server.StorageManagerService.isUserKeyUnlocked(int)"
short_blocking_method: "com.android.server.StorageManagerService.getVolumeList"
@@ -316,6 +328,7 @@
node_id: 825
ts: 1737095066875
dur: 13553568
+ monotonic_dur: 13553568
blocking_method: "android.util.Pair com.android.server.am.ProcessList.getNumForegroundServices()"
blocked_method: "void com.android.server.am.ActivityManagerService.trimApplications(boolean, java.lang.String)"
short_blocking_method: "com.android.server.am.ProcessList.getNumForegroundServices"
@@ -336,6 +349,7 @@
node_id: 1072
ts: 1737134918767
dur: 201813
+ monotonic_dur: 201813
blocking_method: "android.util.StatsEvent$Buffer android.util.StatsEvent$Buffer.obtain()"
blocked_method: "android.util.StatsEvent$Buffer android.util.StatsEvent$Buffer.obtain()"
short_blocking_method: "android.util.StatsEvent$Buffer.obtain"
@@ -371,6 +385,7 @@
node_id: 20510
ts: 1740245849475
dur: 101011
+ monotonic_dur: 101011
blocking_method: "boolean android.content.res.AssetManager.getResourceValue(int, int, android.util.TypedValue, boolean)"
blocked_method: "void android.content.res.AssetManager.applyStyle(long, int, int, android.content.res.XmlBlock$Parser, int[], long, long)"
short_blocking_method: "android.content.res.AssetManager.getResourceValue"
@@ -396,6 +411,7 @@
node_id: 2609
ts: 1737298460334
dur: 21850
+ monotonic_dur: 21850
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -426,6 +442,7 @@
node_id: 2612
ts: 1737298572141
dur: 18243
+ monotonic_dur: 18243
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -456,6 +473,7 @@
node_id: 2615
ts: 1737298649475
dur: 16545
+ monotonic_dur: 16545
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -486,6 +504,7 @@
node_id: 2618
ts: 1737298721765
dur: 16357
+ monotonic_dur: 16357
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -516,6 +535,7 @@
node_id: 2621
ts: 1737298793731
dur: 16482
+ monotonic_dur: 16482
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -546,6 +566,7 @@
node_id: 2624
ts: 1737298865961
dur: 16788
+ monotonic_dur: 16788
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -576,6 +597,7 @@
node_id: 2627
ts: 1737298938587
dur: 16125
+ monotonic_dur: 16125
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -606,6 +628,7 @@
node_id: 2630
ts: 1737299010537
dur: 51638
+ monotonic_dur: 51638
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -636,6 +659,7 @@
node_id: 2633
ts: 1737299130928
dur: 18041
+ monotonic_dur: 18041
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -666,6 +690,7 @@
node_id: 2636
ts: 1737299208715
dur: 17654
+ monotonic_dur: 17654
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -696,6 +721,7 @@
node_id: 2639
ts: 1737299285037
dur: 16998
+ monotonic_dur: 16998
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -726,6 +752,7 @@
node_id: 2642
ts: 1737299360895
dur: 16885
+ monotonic_dur: 16885
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -756,6 +783,7 @@
node_id: 2645
ts: 1737299435615
dur: 16757
+ monotonic_dur: 16757
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -786,6 +814,7 @@
node_id: 2648
ts: 1737299510601
dur: 16754
+ monotonic_dur: 16754
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -816,6 +845,7 @@
node_id: 2651
ts: 1737299585305
dur: 17797
+ monotonic_dur: 17797
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -846,6 +876,7 @@
node_id: 2654
ts: 1737299665374
dur: 16561
+ monotonic_dur: 16561
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -876,6 +907,7 @@
node_id: 4018
ts: 1737341481517
dur: 21671
+ monotonic_dur: 21671
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -896,6 +928,7 @@
node_id: 5765
ts: 1737789462809
dur: 20680
+ monotonic_dur: 20680
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -926,6 +959,7 @@
node_id: 5771
ts: 1737789939928
dur: 19832
+ monotonic_dur: 19832
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -956,6 +990,7 @@
node_id: 1287
ts: 1737161170809
dur: 21040
+ monotonic_dur: 21040
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -986,6 +1021,7 @@
node_id: 19861
ts: 1740196222141
dur: 8261093
+ monotonic_dur: 8261093
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1016,6 +1052,7 @@
node_id: 20059
ts: 1740215659279
dur: 21393
+ monotonic_dur: 21393
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1046,6 +1083,7 @@
node_id: 20146
ts: 1740226983261
dur: 405233
+ monotonic_dur: 405233
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1076,6 +1114,7 @@
node_id: 20475
ts: 1740243405187
dur: 21177
+ monotonic_dur: 21177
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1106,6 +1145,7 @@
node_id: 16010
ts: 1740079340528
dur: 24052
+ monotonic_dur: 24052
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1136,6 +1176,7 @@
node_id: 16028
ts: 1740080203227
dur: 21678
+ monotonic_dur: 21678
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1166,6 +1207,7 @@
node_id: 16039
ts: 1740086095611
dur: 22424
+ monotonic_dur: 22424
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1196,6 +1238,7 @@
node_id: 16044
ts: 1740087510600
dur: 22032
+ monotonic_dur: 22032
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1226,6 +1269,7 @@
node_id: 16046
ts: 1740088505321
dur: 21783
+ monotonic_dur: 21783
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1256,6 +1300,7 @@
node_id: 16052
ts: 1740090099371
dur: 22117
+ monotonic_dur: 22117
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1286,6 +1331,7 @@
node_id: 16072
ts: 1740093579424
dur: 22973
+ monotonic_dur: 22973
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1316,6 +1362,7 @@
node_id: 16074
ts: 1740094332387
dur: 22001
+ monotonic_dur: 22001
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1346,6 +1393,7 @@
node_id: 16094
ts: 1740096040883
dur: 24390
+ monotonic_dur: 24390
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1376,6 +1424,7 @@
node_id: 19693
ts: 1740166145283
dur: 4220029
+ monotonic_dur: 4220029
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1406,6 +1455,7 @@
node_id: 19721
ts: 1740171864902
dur: 1480141
+ monotonic_dur: 1480141
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1436,6 +1486,7 @@
node_id: 19737
ts: 1740174355596
dur: 6989578
+ monotonic_dur: 6989578
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1466,6 +1517,7 @@
node_id: 11025
ts: 1738862386263
dur: 65791
+ monotonic_dur: 65791
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1496,6 +1548,7 @@
node_id: 1402
ts: 1737166624155
dur: 19365
+ monotonic_dur: 19365
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1526,6 +1579,7 @@
node_id: 1407
ts: 1737166746264
dur: 17318
+ monotonic_dur: 17318
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1556,6 +1610,7 @@
node_id: 1412
ts: 1737166849465
dur: 17295
+ monotonic_dur: 17295
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1586,6 +1641,7 @@
node_id: 1417
ts: 1737166949809
dur: 17047
+ monotonic_dur: 17047
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1616,6 +1672,7 @@
node_id: 1422
ts: 1737167048878
dur: 16995
+ monotonic_dur: 16995
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1646,6 +1703,7 @@
node_id: 1427
ts: 1737167147508
dur: 16908
+ monotonic_dur: 16908
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1676,6 +1734,7 @@
node_id: 230
ts: 1737051866140
dur: 45214
+ monotonic_dur: 45214
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1706,6 +1765,7 @@
node_id: 329
ts: 1737063671723
dur: 37395
+ monotonic_dur: 37395
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1726,6 +1786,7 @@
node_id: 333
ts: 1737064791138
dur: 39671
+ monotonic_dur: 39671
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1746,6 +1807,7 @@
node_id: 423
ts: 1737079706338
dur: 422780
+ monotonic_dur: 422780
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1766,6 +1828,7 @@
node_id: 536
ts: 1737083097868
dur: 418004
+ monotonic_dur: 418004
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1786,6 +1849,7 @@
node_id: 549
ts: 1737083661651
dur: 70166
+ monotonic_dur: 70166
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1806,6 +1870,7 @@
node_id: 564
ts: 1737084352020
dur: 610605
+ monotonic_dur: 610605
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1826,6 +1891,7 @@
node_id: 607
ts: 1737085172910
dur: 177041
+ monotonic_dur: 177041
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1846,6 +1912,7 @@
node_id: 616
ts: 1737085701252
dur: 74351
+ monotonic_dur: 74351
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1866,6 +1933,7 @@
node_id: 622
ts: 1737085890068
dur: 82270
+ monotonic_dur: 82270
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1886,6 +1954,7 @@
node_id: 628
ts: 1737086096530
dur: 66276
+ monotonic_dur: 66276
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1906,6 +1975,7 @@
node_id: 635
ts: 1737086457461
dur: 221578
+ monotonic_dur: 221578
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1926,6 +1996,7 @@
node_id: 648
ts: 1737086937596
dur: 101313
+ monotonic_dur: 101313
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1946,6 +2017,7 @@
node_id: 658
ts: 1737087250329
dur: 70570
+ monotonic_dur: 70570
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1966,6 +2038,7 @@
node_id: 668
ts: 1737087510285
dur: 72680
+ monotonic_dur: 72680
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -1986,6 +2059,7 @@
node_id: 678
ts: 1737087776958
dur: 77652
+ monotonic_dur: 77652
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2006,6 +2080,7 @@
node_id: 691
ts: 1737088173007
dur: 21327
+ monotonic_dur: 21327
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2026,6 +2101,7 @@
node_id: 700
ts: 1737088385479
dur: 19449
+ monotonic_dur: 19449
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2046,6 +2122,7 @@
node_id: 711
ts: 1737088642115
dur: 19776
+ monotonic_dur: 19776
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2066,6 +2143,7 @@
node_id: 721
ts: 1737088884385
dur: 20125
+ monotonic_dur: 20125
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2086,6 +2164,7 @@
node_id: 734
ts: 1737089379631
dur: 22080
+ monotonic_dur: 22080
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2106,6 +2185,7 @@
node_id: 743
ts: 1737089611044
dur: 18225
+ monotonic_dur: 18225
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2126,6 +2206,7 @@
node_id: 754
ts: 1737089904720
dur: 18856
+ monotonic_dur: 18856
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2146,6 +2227,7 @@
node_id: 767
ts: 1737090147338
dur: 18570
+ monotonic_dur: 18570
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2166,6 +2248,7 @@
node_id: 789
ts: 1737093129477
dur: 22632
+ monotonic_dur: 22632
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2186,6 +2269,7 @@
node_id: 799
ts: 1737093665987
dur: 21548
+ monotonic_dur: 21548
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2206,6 +2290,7 @@
node_id: 5343
ts: 1737738509304
dur: 1506011
+ monotonic_dur: 1506011
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2236,6 +2321,7 @@
node_id: 5423
ts: 1737750680394
dur: 61812
+ monotonic_dur: 61812
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2266,6 +2352,7 @@
node_id: 5431
ts: 1737751668053
dur: 197119
+ monotonic_dur: 197119
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2296,6 +2383,7 @@
node_id: 5440
ts: 1737752144687
dur: 51147
+ monotonic_dur: 51147
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2326,6 +2414,7 @@
node_id: 5448
ts: 1737752590130
dur: 958626
+ monotonic_dur: 958626
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2356,6 +2445,7 @@
node_id: 5465
ts: 1737757070844
dur: 36740
+ monotonic_dur: 36740
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2386,6 +2476,7 @@
node_id: 5474
ts: 1737757342251
dur: 42105
+ monotonic_dur: 42105
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2416,6 +2507,7 @@
node_id: 5480
ts: 1737757559170
dur: 132635
+ monotonic_dur: 132635
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2446,6 +2538,7 @@
node_id: 15853
ts: 1740068387427
dur: 60320
+ monotonic_dur: 60320
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2476,6 +2569,7 @@
node_id: 15858
ts: 1740068565965
dur: 18127
+ monotonic_dur: 18127
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2506,6 +2600,7 @@
node_id: 15863
ts: 1740068675554
dur: 17200
+ monotonic_dur: 17200
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2536,6 +2631,7 @@
node_id: 15868
ts: 1740068776690
dur: 17264
+ monotonic_dur: 17264
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2566,6 +2662,7 @@
node_id: 15873
ts: 1740068878149
dur: 17045
+ monotonic_dur: 17045
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2596,6 +2693,7 @@
node_id: 15878
ts: 1740068977698
dur: 16964
+ monotonic_dur: 16964
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2626,6 +2724,7 @@
node_id: 15883
ts: 1740069076545
dur: 16993
+ monotonic_dur: 16993
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2656,6 +2755,7 @@
node_id: 15914
ts: 1740071592461
dur: 20257
+ monotonic_dur: 20257
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2686,6 +2786,7 @@
node_id: 15919
ts: 1740071715050
dur: 17399
+ monotonic_dur: 17399
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2716,6 +2817,7 @@
node_id: 15924
ts: 1740071816220
dur: 16289
+ monotonic_dur: 16289
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2746,6 +2848,7 @@
node_id: 15929
ts: 1740071909638
dur: 17007
+ monotonic_dur: 17007
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2776,6 +2879,7 @@
node_id: 15934
ts: 1740072108820
dur: 16704
+ monotonic_dur: 16704
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2806,6 +2910,7 @@
node_id: 15939
ts: 1740072205156
dur: 22851
+ monotonic_dur: 22851
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2836,6 +2941,7 @@
node_id: 15944
ts: 1740072318829
dur: 16368
+ monotonic_dur: 16368
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2866,6 +2972,7 @@
node_id: 19099
ts: 1740149607242
dur: 4134255
+ monotonic_dur: 4134255
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2896,6 +3003,7 @@
node_id: 19107
ts: 1740154026307
dur: 19643
+ monotonic_dur: 19643
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2926,6 +3034,7 @@
node_id: 19112
ts: 1740154147385
dur: 17924
+ monotonic_dur: 17924
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2956,6 +3065,7 @@
node_id: 19117
ts: 1740154249350
dur: 17234
+ monotonic_dur: 17234
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -2986,6 +3096,7 @@
node_id: 19122
ts: 1740154360413
dur: 17225
+ monotonic_dur: 17225
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3016,6 +3127,7 @@
node_id: 19127
ts: 1740154457143
dur: 16522
+ monotonic_dur: 16522
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3046,6 +3158,7 @@
node_id: 19132
ts: 1740154550391
dur: 16256
+ monotonic_dur: 16256
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3076,6 +3189,7 @@
node_id: 19137
ts: 1740154698023
dur: 17672
+ monotonic_dur: 17672
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3106,6 +3220,7 @@
node_id: 19150
ts: 1740155084763
dur: 224375
+ monotonic_dur: 224375
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3136,6 +3251,7 @@
node_id: 1726
ts: 1737207724565
dur: 293900
+ monotonic_dur: 293900
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3166,6 +3282,7 @@
node_id: 1732
ts: 1737208096677
dur: 18837
+ monotonic_dur: 18837
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3196,6 +3313,7 @@
node_id: 1772
ts: 1737210611879
dur: 915778
+ monotonic_dur: 915778
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3216,6 +3334,7 @@
node_id: 1825
ts: 1737214360668
dur: 22107
+ monotonic_dur: 22107
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3236,6 +3355,7 @@
node_id: 1830
ts: 1737214486888
dur: 17063
+ monotonic_dur: 17063
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3256,6 +3376,7 @@
node_id: 1835
ts: 1737214594606
dur: 16069
+ monotonic_dur: 16069
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3276,6 +3397,7 @@
node_id: 1840
ts: 1737214699981
dur: 16203
+ monotonic_dur: 16203
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3296,6 +3418,7 @@
node_id: 1845
ts: 1737214804256
dur: 16029
+ monotonic_dur: 16029
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3316,6 +3439,7 @@
node_id: 1850
ts: 1737214908097
dur: 16476
+ monotonic_dur: 16476
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3336,6 +3460,7 @@
node_id: 1855
ts: 1737215012821
dur: 2326724
+ monotonic_dur: 2326724
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3356,6 +3481,7 @@
node_id: 1861
ts: 1737217472621
dur: 17678
+ monotonic_dur: 17678
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3376,6 +3502,7 @@
node_id: 14124
ts: 1739955629621
dur: 618271
+ monotonic_dur: 618271
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3406,6 +3533,7 @@
node_id: 14141
ts: 1739956770216
dur: 33942
+ monotonic_dur: 33942
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3426,6 +3554,7 @@
node_id: 14147
ts: 1739956981240
dur: 212483
+ monotonic_dur: 212483
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3446,6 +3575,7 @@
node_id: 14156
ts: 1739957398685
dur: 27945
+ monotonic_dur: 27945
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3466,6 +3596,7 @@
node_id: 14163
ts: 1739957560321
dur: 33593
+ monotonic_dur: 33593
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3486,6 +3617,7 @@
node_id: 14177
ts: 1739957759077
dur: 38184
+ monotonic_dur: 38184
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3506,6 +3638,7 @@
node_id: 14207
ts: 1739957975470
dur: 32312
+ monotonic_dur: 32312
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3526,6 +3659,7 @@
node_id: 15361
ts: 1740030984676
dur: 23693
+ monotonic_dur: 23693
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3546,6 +3680,7 @@
node_id: 1039
ts: 1737131797869
dur: 46496
+ monotonic_dur: 46496
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3576,6 +3711,7 @@
node_id: 1042
ts: 1737131917363
dur: 17474
+ monotonic_dur: 17474
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3606,6 +3742,7 @@
node_id: 1077
ts: 1737137616437
dur: 162992
+ monotonic_dur: 162992
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3636,6 +3773,7 @@
node_id: 1082
ts: 1737137954753
dur: 18084
+ monotonic_dur: 18084
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3666,6 +3804,7 @@
node_id: 1087
ts: 1737138059714
dur: 17620
+ monotonic_dur: 17620
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3696,6 +3835,7 @@
node_id: 1092
ts: 1737138160355
dur: 17037
+ monotonic_dur: 17037
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3726,6 +3866,7 @@
node_id: 1097
ts: 1737138259410
dur: 17665
+ monotonic_dur: 17665
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3756,6 +3897,7 @@
node_id: 1102
ts: 1737138360249
dur: 17002
+ monotonic_dur: 17002
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3786,6 +3928,7 @@
node_id: 1107
ts: 1737138459376
dur: 16904
+ monotonic_dur: 16904
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3816,6 +3959,7 @@
node_id: 1112
ts: 1737138566775
dur: 17308
+ monotonic_dur: 17308
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3846,6 +3990,7 @@
node_id: 1117
ts: 1737138706375
dur: 16366
+ monotonic_dur: 16366
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3876,6 +4021,7 @@
node_id: 914
ts: 1737110538163
dur: 10093878
+ monotonic_dur: 10093878
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3906,6 +4052,7 @@
node_id: 930
ts: 1737120738139
dur: 44747
+ monotonic_dur: 44747
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3936,6 +4083,7 @@
node_id: 994
ts: 1737130388552
dur: 21356
+ monotonic_dur: 21356
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3956,6 +4104,7 @@
node_id: 999
ts: 1737130575575
dur: 18416
+ monotonic_dur: 18416
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3976,6 +4125,7 @@
node_id: 1004
ts: 1737130679877
dur: 18378
+ monotonic_dur: 18378
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -3996,6 +4146,7 @@
node_id: 1009
ts: 1737130782643
dur: 17093
+ monotonic_dur: 17093
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4016,6 +4167,7 @@
node_id: 1014
ts: 1737130882317
dur: 17017
+ monotonic_dur: 17017
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4036,6 +4188,7 @@
node_id: 1019
ts: 1737130982066
dur: 17021
+ monotonic_dur: 17021
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4056,6 +4209,7 @@
node_id: 1024
ts: 1737131081147
dur: 17016
+ monotonic_dur: 17016
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4076,6 +4230,7 @@
node_id: 1029
ts: 1737131180347
dur: 17452
+ monotonic_dur: 17452
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4096,6 +4251,7 @@
node_id: 1034
ts: 1737131293842
dur: 16845
+ monotonic_dur: 16845
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4116,6 +4272,7 @@
node_id: 1310
ts: 1737163058873
dur: 19376
+ monotonic_dur: 19376
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4136,6 +4293,7 @@
node_id: 1313
ts: 1737163156482
dur: 18447
+ monotonic_dur: 18447
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4156,6 +4314,7 @@
node_id: 1343
ts: 1737165262724
dur: 21096
+ monotonic_dur: 21096
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4176,6 +4335,7 @@
node_id: 1349
ts: 1737165472300
dur: 26488
+ monotonic_dur: 26488
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4196,6 +4356,7 @@
node_id: 1364
ts: 1737165613345
dur: 16393
+ monotonic_dur: 16393
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4216,6 +4377,7 @@
node_id: 1369
ts: 1737165708794
dur: 16172
+ monotonic_dur: 16172
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4236,6 +4398,7 @@
node_id: 1374
ts: 1737165803090
dur: 16154
+ monotonic_dur: 16154
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4256,6 +4419,7 @@
node_id: 1379
ts: 1737165902444
dur: 16514
+ monotonic_dur: 16514
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4276,6 +4440,7 @@
node_id: 1384
ts: 1737165995669
dur: 16227
+ monotonic_dur: 16227
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4296,6 +4461,7 @@
node_id: 1389
ts: 1737166088126
dur: 16084
+ monotonic_dur: 16084
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4316,6 +4482,7 @@
node_id: 1394
ts: 1737166180874
dur: 16400
+ monotonic_dur: 16400
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4336,6 +4503,7 @@
node_id: 1506
ts: 1737181487572
dur: 47351
+ monotonic_dur: 47351
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4366,6 +4534,7 @@
node_id: 1510
ts: 1737181929327
dur: 20962
+ monotonic_dur: 20962
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4396,6 +4565,7 @@
node_id: 1553
ts: 1737185887986
dur: 36773
+ monotonic_dur: 36773
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4426,6 +4596,7 @@
node_id: 1558
ts: 1737186081562
dur: 17416
+ monotonic_dur: 17416
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4456,6 +4627,7 @@
node_id: 1563
ts: 1737186184623
dur: 18396
+ monotonic_dur: 18396
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4486,6 +4658,7 @@
node_id: 1568
ts: 1737186286357
dur: 17995
+ monotonic_dur: 17995
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4516,6 +4689,7 @@
node_id: 1573
ts: 1737186385961
dur: 16913
+ monotonic_dur: 16913
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4546,6 +4720,7 @@
node_id: 1578
ts: 1737186484644
dur: 16614
+ monotonic_dur: 16614
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4576,6 +4751,7 @@
node_id: 1583
ts: 1737186582856
dur: 16982
+ monotonic_dur: 16982
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4606,6 +4782,7 @@
node_id: 1588
ts: 1737186680997
dur: 16616
+ monotonic_dur: 16616
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4636,6 +4813,7 @@
node_id: 1593
ts: 1737186777333
dur: 17100
+ monotonic_dur: 17100
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4666,6 +4844,7 @@
node_id: 16170
ts: 1740097708826
dur: 88231
+ monotonic_dur: 88231
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4701,6 +4880,7 @@
node_id: 4028
ts: 1737344126801
dur: 22797
+ monotonic_dur: 22797
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4731,6 +4911,7 @@
node_id: 5656
ts: 1737785654002
dur: 22938
+ monotonic_dur: 22938
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4761,6 +4942,7 @@
node_id: 5761
ts: 1737787806610
dur: 22728
+ monotonic_dur: 22728
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4791,6 +4973,7 @@
node_id: 19095
ts: 1740149257124
dur: 21884
+ monotonic_dur: 21884
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4821,6 +5004,7 @@
node_id: 4233
ts: 1737371256653
dur: 1055512
+ monotonic_dur: 1055512
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4851,6 +5035,7 @@
node_id: 14106
ts: 1739953546712
dur: 44814
+ monotonic_dur: 44814
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4881,6 +5066,7 @@
node_id: 14227
ts: 1739958399006
dur: 33080
+ monotonic_dur: 33080
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4901,6 +5087,7 @@
node_id: 15352
ts: 1740030452448
dur: 132766
+ monotonic_dur: 132766
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4921,6 +5108,7 @@
node_id: 4025
ts: 1737343049979
dur: 22668
+ monotonic_dur: 22668
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4951,6 +5139,7 @@
node_id: 1289
ts: 1737161421139
dur: 20479
+ monotonic_dur: 20479
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -4981,6 +5170,7 @@
node_id: 1291
ts: 1737161616671
dur: 18545
+ monotonic_dur: 18545
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5011,6 +5201,7 @@
node_id: 1399
ts: 1737166461659
dur: 19206
+ monotonic_dur: 19206
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5041,6 +5232,7 @@
node_id: 286
ts: 1737055789278
dur: 40769
+ monotonic_dur: 40769
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5071,6 +5263,7 @@
node_id: 10955
ts: 1738826773946
dur: 65637
+ monotonic_dur: 65637
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5101,6 +5294,7 @@
node_id: 10966
ts: 1738828107585
dur: 187487
+ monotonic_dur: 187487
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5131,6 +5325,7 @@
node_id: 14241
ts: 1739964126021
dur: 35852
+ monotonic_dur: 35852
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5151,6 +5346,7 @@
node_id: 14243
ts: 1739964658240
dur: 34889
+ monotonic_dur: 34889
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5171,6 +5367,7 @@
node_id: 1297
ts: 1737162104329
dur: 183696
+ monotonic_dur: 183696
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5201,6 +5398,7 @@
node_id: 14245
ts: 1739965127438
dur: 37681
+ monotonic_dur: 37681
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5221,6 +5419,7 @@
node_id: 228
ts: 1737051099036
dur: 48097
+ monotonic_dur: 48097
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5251,6 +5450,7 @@
node_id: 5658
ts: 1737785934018
dur: 19831
+ monotonic_dur: 19831
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5281,6 +5481,7 @@
node_id: 14110
ts: 1739953949546
dur: 41355
+ monotonic_dur: 41355
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5311,6 +5512,7 @@
node_id: 20837
ts: 1740282732663
dur: 75213
+ monotonic_dur: 75213
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5341,6 +5543,7 @@
node_id: 14730
ts: 1739991072170
dur: 23552
+ monotonic_dur: 23552
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5371,6 +5574,7 @@
node_id: 14903
ts: 1740006407801
dur: 28042
+ monotonic_dur: 28042
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5401,6 +5605,7 @@
node_id: 15617
ts: 1740039831041
dur: 21671
+ monotonic_dur: 21671
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5431,6 +5636,7 @@
node_id: 14757
ts: 1739995747475
dur: 22859
+ monotonic_dur: 22859
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5461,6 +5667,7 @@
node_id: 14961
ts: 1740008070118
dur: 21573
+ monotonic_dur: 21573
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5491,6 +5698,7 @@
node_id: 15144
ts: 1740018472842
dur: 22492
+ monotonic_dur: 22492
blocking_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.enqueueMessage"
@@ -5521,6 +5729,7 @@
node_id: 291
ts: 1737056375519
dur: 37555955
+ monotonic_dur: 37555955
blocking_method: "boolean com.android.server.am.ActivityManagerService.forceStopPackageLocked(java.lang.String, int, boolean, boolean, boolean, boolean, boolean, int, java.lang.String)"
blocked_method: "boolean com.android.server.am.ActivityManagerService.isUidActive(int, java.lang.String)"
short_blocking_method: "com.android.server.am.ActivityManagerService.forceStopPackageLocked"
@@ -5558,6 +5767,7 @@
node_id: 5679
ts: 1737786392325
dur: 307737
+ monotonic_dur: 307737
blocking_method: "boolean com.android.server.am.OomAdjuster.updateOomAdjLocked(com.android.server.am.ProcessRecord, java.lang.String)"
blocked_method: "void com.android.server.am.ActivityManagerService$LocalService.notifyNetworkPolicyRulesUpdated(int, long)"
short_blocking_method: "com.android.server.am.OomAdjuster.updateOomAdjLocked"
@@ -5588,6 +5798,7 @@
node_id: 4163
ts: 1737369931286
dur: 332456
+ monotonic_dur: 332456
blocking_method: "boolean com.android.server.am.OomAdjuster.updateOomAdjLocked(com.android.server.am.ProcessRecord, java.lang.String)"
blocked_method: "void com.android.server.am.ActivityManagerService$LocalService.notifyNetworkPolicyRulesUpdated(int, long)"
short_blocking_method: "com.android.server.am.OomAdjuster.updateOomAdjLocked"
@@ -5618,6 +5829,7 @@
node_id: 1405
ts: 1737166679041
dur: 18738
+ monotonic_dur: 18738
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5648,6 +5860,7 @@
node_id: 1410
ts: 1737166789697
dur: 18114
+ monotonic_dur: 18114
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5678,6 +5891,7 @@
node_id: 1415
ts: 1737166892174
dur: 17346
+ monotonic_dur: 17346
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5708,6 +5922,7 @@
node_id: 1420
ts: 1737166992097
dur: 17240
+ monotonic_dur: 17240
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5738,6 +5953,7 @@
node_id: 1425
ts: 1737167090769
dur: 17223
+ monotonic_dur: 17223
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5768,6 +5984,7 @@
node_id: 1430
ts: 1737167189280
dur: 17404
+ monotonic_dur: 17404
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5798,6 +6015,7 @@
node_id: 336
ts: 1737064905607
dur: 36485
+ monotonic_dur: 36485
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5818,6 +6036,7 @@
node_id: 450
ts: 1737080194439
dur: 106755
+ monotonic_dur: 106755
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5838,6 +6057,7 @@
node_id: 547
ts: 1737083570272
dur: 22979
+ monotonic_dur: 22979
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5858,6 +6078,7 @@
node_id: 553
ts: 1737083767030
dur: 87452
+ monotonic_dur: 87452
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5878,6 +6099,7 @@
node_id: 600
ts: 1737085028725
dur: 22524
+ monotonic_dur: 22524
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5898,6 +6120,7 @@
node_id: 613
ts: 1737085397198
dur: 222027
+ monotonic_dur: 222027
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5918,6 +6141,7 @@
node_id: 620
ts: 1737085814565
dur: 20392
+ monotonic_dur: 20392
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5938,6 +6162,7 @@
node_id: 626
ts: 1737086010699
dur: 21428
+ monotonic_dur: 21428
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5958,6 +6183,7 @@
node_id: 632
ts: 1737086195810
dur: 82235
+ monotonic_dur: 82235
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -5978,6 +6204,7 @@
node_id: 5427
ts: 1737750845100
dur: 55306
+ monotonic_dur: 55306
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6008,6 +6235,7 @@
node_id: 5437
ts: 1737751957836
dur: 57557
+ monotonic_dur: 57557
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6038,6 +6266,7 @@
node_id: 5445
ts: 1737752295207
dur: 148524
+ monotonic_dur: 148524
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6068,6 +6297,7 @@
node_id: 5455
ts: 1737753638544
dur: 3315112
+ monotonic_dur: 3315112
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6098,6 +6328,7 @@
node_id: 5471
ts: 1737757172791
dur: 36455
+ monotonic_dur: 36455
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6128,6 +6359,7 @@
node_id: 5478
ts: 1737757436661
dur: 33956
+ monotonic_dur: 33956
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6158,6 +6390,7 @@
node_id: 15856
ts: 1740068492050
dur: 19741
+ monotonic_dur: 19741
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6188,6 +6421,7 @@
node_id: 15861
ts: 1740068610842
dur: 17707
+ monotonic_dur: 17707
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6218,6 +6452,7 @@
node_id: 15866
ts: 1740068718431
dur: 17491
+ monotonic_dur: 17491
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6248,6 +6483,7 @@
node_id: 15871
ts: 1740068819512
dur: 17871
+ monotonic_dur: 17871
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6278,6 +6514,7 @@
node_id: 15876
ts: 1740068920129
dur: 17449
+ monotonic_dur: 17449
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6308,6 +6545,7 @@
node_id: 15881
ts: 1740069019548
dur: 17287
+ monotonic_dur: 17287
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6338,6 +6576,7 @@
node_id: 15886
ts: 1740069124909
dur: 17544
+ monotonic_dur: 17544
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6368,6 +6607,7 @@
node_id: 15917
ts: 1740071648279
dur: 18916
+ monotonic_dur: 18916
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6398,6 +6638,7 @@
node_id: 15922
ts: 1740071756861
dur: 16967
+ monotonic_dur: 16967
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6428,6 +6669,7 @@
node_id: 15927
ts: 1740071855963
dur: 16545
+ monotonic_dur: 16545
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6458,6 +6700,7 @@
node_id: 15932
ts: 1740071990692
dur: 56291
+ monotonic_dur: 56291
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6488,6 +6731,7 @@
node_id: 15937
ts: 1740072150609
dur: 16590
+ monotonic_dur: 16590
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6518,6 +6762,7 @@
node_id: 15942
ts: 1740072261613
dur: 18126
+ monotonic_dur: 18126
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6548,6 +6793,7 @@
node_id: 15947
ts: 1740072358594
dur: 16392
+ monotonic_dur: 16392
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6578,6 +6824,7 @@
node_id: 16250
ts: 1740099416847
dur: 42564
+ monotonic_dur: 42564
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6608,6 +6855,7 @@
node_id: 19104
ts: 1740153788345
dur: 21717
+ monotonic_dur: 21717
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6638,6 +6886,7 @@
node_id: 19110
ts: 1740154078337
dur: 18626
+ monotonic_dur: 18626
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6668,6 +6917,7 @@
node_id: 19115
ts: 1740154191235
dur: 17446
+ monotonic_dur: 17446
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6698,6 +6948,7 @@
node_id: 19120
ts: 1740154302692
dur: 17692
+ monotonic_dur: 17692
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6728,6 +6979,7 @@
node_id: 19125
ts: 1740154401863
dur: 17420
+ monotonic_dur: 17420
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6758,6 +7010,7 @@
node_id: 19130
ts: 1740154496716
dur: 16532
+ monotonic_dur: 16532
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6788,6 +7041,7 @@
node_id: 19135
ts: 1740154589516
dur: 16334
+ monotonic_dur: 16334
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6818,6 +7072,7 @@
node_id: 2419
ts: 1737240599881
dur: 42310
+ monotonic_dur: 42310
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6848,6 +7103,7 @@
node_id: 1828
ts: 1737214417825
dur: 18273
+ monotonic_dur: 18273
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6868,6 +7124,7 @@
node_id: 1833
ts: 1737214530615
dur: 16604
+ monotonic_dur: 16604
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6888,6 +7145,7 @@
node_id: 1838
ts: 1737214636440
dur: 16932
+ monotonic_dur: 16932
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6908,6 +7166,7 @@
node_id: 1843
ts: 1737214741536
dur: 16227
+ monotonic_dur: 16227
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6928,6 +7187,7 @@
node_id: 1848
ts: 1737214845608
dur: 16214
+ monotonic_dur: 16214
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6948,6 +7208,7 @@
node_id: 1853
ts: 1737214949887
dur: 16260
+ monotonic_dur: 16260
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6968,6 +7229,7 @@
node_id: 1859
ts: 1737217389586
dur: 20823
+ monotonic_dur: 20823
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -6988,6 +7250,7 @@
node_id: 1864
ts: 1737217518658
dur: 18293
+ monotonic_dur: 18293
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7008,6 +7271,7 @@
node_id: 2485
ts: 1737245705728
dur: 4362
+ monotonic_dur: 4362
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7033,6 +7297,7 @@
node_id: 14131
ts: 1739956333592
dur: 48179
+ monotonic_dur: 48179
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7063,6 +7328,7 @@
node_id: 14144
ts: 1739956863678
dur: 31443
+ monotonic_dur: 31443
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7083,6 +7349,7 @@
node_id: 14154
ts: 1739957260292
dur: 58458
+ monotonic_dur: 58458
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7103,6 +7370,7 @@
node_id: 14159
ts: 1739957468620
dur: 28295
+ monotonic_dur: 28295
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7123,6 +7391,7 @@
node_id: 14172
ts: 1739957659134
dur: 27483
+ monotonic_dur: 27483
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7143,6 +7412,7 @@
node_id: 14190
ts: 1739957843194
dur: 38223
+ monotonic_dur: 38223
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7163,6 +7433,7 @@
node_id: 14218
ts: 1739958067210
dur: 28514
+ monotonic_dur: 28514
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7183,6 +7454,7 @@
node_id: 1080
ts: 1737137827035
dur: 20665
+ monotonic_dur: 20665
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7213,6 +7485,7 @@
node_id: 1085
ts: 1737137999738
dur: 17916
+ monotonic_dur: 17916
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7243,6 +7516,7 @@
node_id: 1090
ts: 1737138102876
dur: 17436
+ monotonic_dur: 17436
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7273,6 +7547,7 @@
node_id: 1095
ts: 1737138202412
dur: 17207
+ monotonic_dur: 17207
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7303,6 +7578,7 @@
node_id: 1100
ts: 1737138302518
dur: 17756
+ monotonic_dur: 17756
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7333,6 +7609,7 @@
node_id: 1105
ts: 1737138402108
dur: 17640
+ monotonic_dur: 17640
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7363,6 +7640,7 @@
node_id: 1110
ts: 1737138508966
dur: 17284
+ monotonic_dur: 17284
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7393,6 +7671,7 @@
node_id: 1115
ts: 1737138607722
dur: 58793
+ monotonic_dur: 58793
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7423,6 +7702,7 @@
node_id: 1120
ts: 1737138746994
dur: 16813
+ monotonic_dur: 16813
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7453,6 +7733,7 @@
node_id: 997
ts: 1737130453174
dur: 19583
+ monotonic_dur: 19583
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7473,6 +7754,7 @@
node_id: 1002
ts: 1737130620879
dur: 17882
+ monotonic_dur: 17882
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7493,6 +7775,7 @@
node_id: 1007
ts: 1737130724438
dur: 17847
+ monotonic_dur: 17847
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7513,6 +7796,7 @@
node_id: 1012
ts: 1737130824923
dur: 17378
+ monotonic_dur: 17378
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7533,6 +7817,7 @@
node_id: 1017
ts: 1737130924318
dur: 17952
+ monotonic_dur: 17952
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7553,6 +7838,7 @@
node_id: 1022
ts: 1737131023637
dur: 17902
+ monotonic_dur: 17902
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7573,6 +7859,7 @@
node_id: 1027
ts: 1737131123118
dur: 17327
+ monotonic_dur: 17327
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7593,6 +7880,7 @@
node_id: 1032
ts: 1737131236193
dur: 17929
+ monotonic_dur: 17929
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7613,6 +7901,7 @@
node_id: 1037
ts: 1737131334215
dur: 16603
+ monotonic_dur: 16603
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7633,6 +7922,7 @@
node_id: 1347
ts: 1737165356298
dur: 20332
+ monotonic_dur: 20332
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7653,6 +7943,7 @@
node_id: 1361
ts: 1737165537252
dur: 37481
+ monotonic_dur: 37481
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7673,6 +7964,7 @@
node_id: 1367
ts: 1737165653862
dur: 17155
+ monotonic_dur: 17155
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7693,6 +7985,7 @@
node_id: 1372
ts: 1737165748745
dur: 16809
+ monotonic_dur: 16809
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7713,6 +8006,7 @@
node_id: 1377
ts: 1737165848320
dur: 16352
+ monotonic_dur: 16352
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7733,6 +8027,7 @@
node_id: 1382
ts: 1737165942133
dur: 16587
+ monotonic_dur: 16587
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7753,6 +8048,7 @@
node_id: 1387
ts: 1737166034874
dur: 16267
+ monotonic_dur: 16267
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7773,6 +8069,7 @@
node_id: 1392
ts: 1737166127218
dur: 16224
+ monotonic_dur: 16224
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7793,6 +8090,7 @@
node_id: 1397
ts: 1737166220113
dur: 16151
+ monotonic_dur: 16151
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7813,6 +8111,7 @@
node_id: 1556
ts: 1737185963232
dur: 19053
+ monotonic_dur: 19053
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7843,6 +8142,7 @@
node_id: 1561
ts: 1737186125286
dur: 18053
+ monotonic_dur: 18053
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7873,6 +8173,7 @@
node_id: 1566
ts: 1737186228484
dur: 17302
+ monotonic_dur: 17302
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7903,6 +8204,7 @@
node_id: 1571
ts: 1737186329374
dur: 17099
+ monotonic_dur: 17099
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7933,6 +8235,7 @@
node_id: 1576
ts: 1737186427621
dur: 17307
+ monotonic_dur: 17307
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7963,6 +8266,7 @@
node_id: 1581
ts: 1737186526032
dur: 17399
+ monotonic_dur: 17399
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -7993,6 +8297,7 @@
node_id: 1586
ts: 1737186624590
dur: 17194
+ monotonic_dur: 17194
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -8023,6 +8328,7 @@
node_id: 1591
ts: 1737186721862
dur: 16600
+ monotonic_dur: 16600
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -8053,6 +8359,7 @@
node_id: 1596
ts: 1737186818912
dur: 17743
+ monotonic_dur: 17743
blocking_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
blocked_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
short_blocking_method: "com.android.server.am.ProcessList.enqueueProcessChangeItemLocked"
@@ -8083,6 +8390,7 @@
node_id: 1337
ts: 1737164392191
dur: 270357
+ monotonic_dur: 270357
blocking_method: "com.android.server.am.ProcessRecord com.android.server.am.ProcessList.removeProcessNameLocked(java.lang.String, int, com.android.server.am.ProcessRecord)"
blocked_method: "boolean com.android.server.am.ActivityManagerService.isUidActive(int, java.lang.String)"
short_blocking_method: "com.android.server.am.ProcessList.removeProcessNameLocked"
@@ -8105,6 +8413,7 @@
node_id: 1542
ts: 1737183322309
dur: 1164236
+ monotonic_dur: 1164236
blocking_method: "com.android.server.am.ProcessRecord com.android.server.am.ProcessList.removeProcessNameLocked(java.lang.String, int, com.android.server.am.ProcessRecord)"
blocked_method: "boolean com.android.server.am.ActivityManagerService.isUidActive(int, java.lang.String)"
short_blocking_method: "com.android.server.am.ProcessList.removeProcessNameLocked"
@@ -8137,6 +8446,7 @@
node_id: 4016
ts: 1737341060765
dur: 500783
+ monotonic_dur: 500783
blocking_method: "com.android.server.pm.Computer com.android.server.pm.PackageManagerService.snapshotComputer()"
blocked_method: "com.android.server.pm.Computer com.android.server.pm.PackageManagerService.snapshotComputer()"
short_blocking_method: "com.android.server.pm.PackageManagerService.snapshotComputer"
@@ -8177,6 +8487,7 @@
node_id: 14151
ts: 1739957159014
dur: 1509341
+ monotonic_dur: 1509341
blocking_method: "int com.android.server.am.ActivityManagerService.bindServiceInstance(android.app.IApplicationThread, android.os.IBinder, android.content.Intent, java.lang.String, android.app.IServiceConnection, int, java.lang.String, boolean, int, java.lang.String, java.lang.String, int)"
blocked_method: "void com.android.server.am.ActivityManagerService.publishService(android.os.IBinder, android.content.Intent, android.os.IBinder)"
short_blocking_method: "com.android.server.am.ActivityManagerService.bindServiceInstance"
@@ -8199,6 +8510,7 @@
node_id: 14139
ts: 1739956578839
dur: 1980671
+ monotonic_dur: 1980671
blocking_method: "int com.android.server.am.ActivityManagerService.bindServiceInstance(android.app.IApplicationThread, android.os.IBinder, android.content.Intent, java.lang.String, android.app.IServiceConnection, int, java.lang.String, boolean, int, java.lang.String, java.lang.String, int)"
blocked_method: "void com.android.server.am.ActivityManagerService.serviceDoneExecuting(android.os.IBinder, int, int, int)"
short_blocking_method: "com.android.server.am.ActivityManagerService.bindServiceInstance"
@@ -8229,6 +8541,7 @@
node_id: 233
ts: 1737052012461
dur: 41841
+ monotonic_dur: 41841
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8259,6 +8572,7 @@
node_id: 642
ts: 1737086736113
dur: 22026
+ monotonic_dur: 22026
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8279,6 +8593,7 @@
node_id: 652
ts: 1737087085776
dur: 20982
+ monotonic_dur: 20982
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8299,6 +8614,7 @@
node_id: 662
ts: 1737087359159
dur: 21012
+ monotonic_dur: 21012
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8319,6 +8635,7 @@
node_id: 672
ts: 1737087629336
dur: 20625
+ monotonic_dur: 20625
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8339,6 +8656,7 @@
node_id: 682
ts: 1737087908874
dur: 36432
+ monotonic_dur: 36432
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8359,6 +8677,7 @@
node_id: 694
ts: 1737088232763
dur: 19794
+ monotonic_dur: 19794
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8379,6 +8698,7 @@
node_id: 704
ts: 1737088435540
dur: 74457
+ monotonic_dur: 74457
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8399,6 +8719,7 @@
node_id: 714
ts: 1737088695169
dur: 19264
+ monotonic_dur: 19264
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8419,6 +8740,7 @@
node_id: 724
ts: 1737088938281
dur: 19838
+ monotonic_dur: 19838
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8439,6 +8761,7 @@
node_id: 737
ts: 1737089446994
dur: 19502
+ monotonic_dur: 19502
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8459,6 +8782,7 @@
node_id: 746
ts: 1737089667267
dur: 19612
+ monotonic_dur: 19612
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8479,6 +8803,7 @@
node_id: 757
ts: 1737089952687
dur: 18324
+ monotonic_dur: 18324
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8499,6 +8824,7 @@
node_id: 778
ts: 1737090202518
dur: 18886
+ monotonic_dur: 18886
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8519,6 +8845,7 @@
node_id: 792
ts: 1737093195601
dur: 19790
+ monotonic_dur: 19790
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8539,6 +8866,7 @@
node_id: 802
ts: 1737093725219
dur: 20720
+ monotonic_dur: 20720
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8559,6 +8887,7 @@
node_id: 5363
ts: 1737740148902
dur: 62887
+ monotonic_dur: 62887
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8589,6 +8918,7 @@
node_id: 5485
ts: 1737757752455
dur: 34371
+ monotonic_dur: 34371
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8619,6 +8949,7 @@
node_id: 19140
ts: 1740154747721
dur: 17340
+ monotonic_dur: 17340
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8649,6 +8980,7 @@
node_id: 19153
ts: 1740155350826
dur: 29306
+ monotonic_dur: 29306
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8679,6 +9011,7 @@
node_id: 1735
ts: 1737208148293
dur: 18441
+ monotonic_dur: 18441
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8709,6 +9042,7 @@
node_id: 15364
ts: 1740031051846
dur: 20196
+ monotonic_dur: 20196
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8729,6 +9063,7 @@
node_id: 1045
ts: 1737131968339
dur: 17215
+ monotonic_dur: 17215
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8759,6 +9094,7 @@
node_id: 933
ts: 1737120850459
dur: 20602
+ monotonic_dur: 20602
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8789,6 +9125,7 @@
node_id: 1316
ts: 1737163210116
dur: 18147
+ monotonic_dur: 18147
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8809,6 +9146,7 @@
node_id: 1513
ts: 1737181998210
dur: 19273
+ monotonic_dur: 19273
blocking_method: "int com.android.server.am.UidObserverController.enqueueUidChange(com.android.server.am.UidObserverController$ChangeRecord, int, int, int, long, int, boolean)"
blocked_method: "void com.android.server.am.UidObserverController.dispatchUidsChanged()"
short_blocking_method: "com.android.server.am.UidObserverController.enqueueUidChange"
@@ -8839,6 +9177,7 @@
node_id: 14238
ts: 1739963968503
dur: 1421118
+ monotonic_dur: 1421118
blocking_method: "int com.android.server.job.JobSchedulerService.scheduleAsPackage(android.app.job.JobInfo, android.app.job.JobWorkItem, int, java.lang.String, int, java.lang.String)"
blocked_method: "void com.android.server.job.JobServiceContext.onServiceConnected(android.content.ComponentName, android.os.IBinder)"
short_blocking_method: "com.android.server.job.JobSchedulerService.scheduleAsPackage"
@@ -8874,6 +9213,7 @@
node_id: 20043
ts: 1740213696044
dur: 519686
+ monotonic_dur: 519686
blocking_method: "void android.content.res.AssetManager.applyStyle(long, int, int, android.content.res.XmlBlock$Parser, int[], long, long)"
blocked_method: "boolean android.content.res.AssetManager.isUpToDate()"
short_blocking_method: "android.content.res.AssetManager.applyStyle"
@@ -8904,6 +9244,7 @@
node_id: 325
ts: 1737062755240
dur: 40603
+ monotonic_dur: 40603
blocking_method: "void android.os.MessageQueue.nativeWake(long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.nativeWake"
@@ -8924,6 +9265,7 @@
node_id: 14507
ts: 1739976886497
dur: 29604
+ monotonic_dur: 29604
blocking_method: "void android.os.MessageQueue.nativeWake(long)"
blocked_method: "android.os.Message android.os.MessageQueue.next()"
short_blocking_method: "android.os.MessageQueue.nativeWake"
@@ -8954,6 +9296,7 @@
node_id: 36448
ts: 1740519832439
dur: 41153
+ monotonic_dur: 41153
blocking_method: "void android.os.MessageQueue.removeSyncBarrier(int)"
blocked_method: "boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)"
short_blocking_method: "android.os.MessageQueue.removeSyncBarrier"
@@ -8989,6 +9332,7 @@
node_id: 13934
ts: 1739927671503
dur: 12908792
+ monotonic_dur: 12908792
blocking_method: "void com.android.server.StorageManagerService.onVolumeStateChangedAsync(android.os.storage.VolumeInfo, int, int)"
blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
short_blocking_method: "com.android.server.StorageManagerService.onVolumeStateChangedAsync"
@@ -9034,6 +9378,7 @@
node_id: 13938
ts: 1739927803390
dur: 15628453
+ monotonic_dur: 15628453
blocking_method: "void com.android.server.StorageManagerService.onVolumeStateChangedAsync(android.os.storage.VolumeInfo, int, int)"
blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
short_blocking_method: "com.android.server.StorageManagerService.onVolumeStateChangedAsync"
@@ -9056,6 +9401,7 @@
node_id: 13948
ts: 1739931845759
dur: 9867807
+ monotonic_dur: 9867807
blocking_method: "void com.android.server.StorageManagerService.onVolumeStateChangedAsync(android.os.storage.VolumeInfo, int, int)"
blocked_method: "boolean com.android.server.StorageManagerService.isSystemUnlocked(int)"
short_blocking_method: "com.android.server.StorageManagerService.onVolumeStateChangedAsync"
@@ -9078,6 +9424,7 @@
node_id: 2282
ts: 1737231587234
dur: 7359992
+ monotonic_dur: 7359992
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9108,6 +9455,7 @@
node_id: 947
ts: 1737121970382
dur: 9553799
+ monotonic_dur: 9553799
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9148,6 +9496,7 @@
node_id: 1768
ts: 1737210433724
dur: 9886915
+ monotonic_dur: 9886915
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9188,6 +9537,7 @@
node_id: 1774
ts: 1737210664931
dur: 10603245
+ monotonic_dur: 10603245
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9208,6 +9558,7 @@
node_id: 2284
ts: 1737231637875
dur: 8165621
+ monotonic_dur: 8165621
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9228,6 +9579,7 @@
node_id: 1778
ts: 1737210812768
dur: 15412062
+ monotonic_dur: 15412062
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9248,6 +9600,7 @@
node_id: 2289
ts: 1737231841438
dur: 8892876
+ monotonic_dur: 8892876
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9268,6 +9621,7 @@
node_id: 1786
ts: 1737211317791
dur: 15990216
+ monotonic_dur: 15990216
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9288,6 +9642,7 @@
node_id: 1822
ts: 1737213945119
dur: 14489462
+ monotonic_dur: 14489462
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -9308,6 +9663,7 @@
node_id: 15273
ts: 1740028121682
dur: 4258407
+ monotonic_dur: 4258407
blocking_method: "void com.android.server.am.ActivityManagerService.attachApplication(android.app.IApplicationThread, long)"
blocked_method: "int com.android.server.am.ActivityManagerService.broadcastIntentWithFeature(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.content.IIntentReceiver, int, java.lang.String, android.os.Bundle, java.lang.String[], java.lang.String[], java.lang.String[], int, android.os.Bundle, boolean, boolean, int)"
short_blocking_method: "com.android.server.am.ActivityManagerService.attachApplication"
@@ -9343,6 +9699,7 @@
node_id: 4240
ts: 1737372928313
dur: 11910
+ monotonic_dur: 11910
blocking_method: "void com.android.server.am.ActivityManagerService.attachApplication(android.app.IApplicationThread, long)"
blocked_method: "void com.android.server.am.BroadcastQueue.processNextBroadcast(boolean)"
short_blocking_method: "com.android.server.am.ActivityManagerService.attachApplication"
@@ -9368,6 +9725,7 @@
node_id: 15356
ts: 1740030616665
dur: 2229356
+ monotonic_dur: 2229356
blocking_method: "void com.android.server.am.ActivityManagerService.attachApplication(android.app.IApplicationThread, long)"
blocked_method: "void com.android.server.am.BroadcastQueue.processNextBroadcast(boolean)"
short_blocking_method: "com.android.server.am.ActivityManagerService.attachApplication"
@@ -9388,6 +9746,7 @@
node_id: 327
ts: 1737063410007
dur: 46114664
+ monotonic_dur: 46114664
blocking_method: "void com.android.server.am.ActivityManagerService.forceStopPackage(java.lang.String, int)"
blocked_method: "boolean com.android.server.am.ActivityManagerService.unbindService(android.app.IServiceConnection)"
short_blocking_method: "com.android.server.am.ActivityManagerService.forceStopPackage"
@@ -9428,6 +9787,7 @@
node_id: 1909
ts: 1737220480342
dur: 42187
+ monotonic_dur: 42187
blocking_method: "void com.android.server.am.AppProfiler.collectPssInBackground()"
blocked_method: "void com.android.server.am.ProcessProfileRecord.onProcessInactive(com.android.server.am.ProcessStatsService)"
short_blocking_method: "com.android.server.am.AppProfiler.collectPssInBackground"
@@ -9459,6 +9819,7 @@
node_id: 1303
ts: 1737162534263
dur: 420259
+ monotonic_dur: 420259
blocking_method: "void com.android.server.am.AppProfiler.collectPssInBackground()"
blocked_method: "void com.android.server.am.ProcessProfileRecord.onProcessInactive(com.android.server.am.ProcessStatsService)"
short_blocking_method: "com.android.server.am.AppProfiler.collectPssInBackground"
@@ -9495,6 +9856,7 @@
node_id: 949
ts: 1737122781871
dur: 7301144
+ monotonic_dur: 7301144
blocking_method: "void com.android.server.am.AppProfiler.collectPssInBackground()"
blocked_method: "void com.android.server.am.ProcessRecord.setPid(int)"
short_blocking_method: "com.android.server.am.AppProfiler.collectPssInBackground"
@@ -9526,6 +9888,7 @@
node_id: 949
ts: 1737122781871
dur: 7301144
+ monotonic_dur: 7301144
blocking_method: "void com.android.server.am.AppProfiler.collectPssInBackground()"
blocked_method: "void com.android.server.am.ProcessRecord.setPid(int)"
short_blocking_method: "com.android.server.am.AppProfiler.collectPssInBackground"
@@ -9556,6 +9919,7 @@
node_id: 1546
ts: 1737184711536
dur: 932536
+ monotonic_dur: 932536
blocking_method: "void com.android.server.am.AppProfiler.collectPssInBackground()"
blocked_method: "void com.android.server.am.ProcessRecord.setPid(int)"
short_blocking_method: "com.android.server.am.AppProfiler.collectPssInBackground"
@@ -9586,6 +9950,7 @@
node_id: 15380
ts: 1740031570180
dur: 341236
+ monotonic_dur: 341236
blocking_method: "void com.android.server.am.OomAdjuster.performUpdateOomAdjPendingTargetsLocked(java.lang.String)"
blocked_method: "void com.android.server.am.ActivityManagerService$LocalService.notifyNetworkPolicyRulesUpdated(int, long)"
short_blocking_method: "com.android.server.am.OomAdjuster.performUpdateOomAdjPendingTargetsLocked"
@@ -9606,6 +9971,7 @@
node_id: 2256
ts: 1737229788262
dur: 1864661
+ monotonic_dur: 1864661
blocking_method: "void com.android.server.am.OomAdjuster.updateOomAdjLocked(java.lang.String)"
blocked_method: "boolean com.android.server.am.ActivityManagerService.isUidActive(int, java.lang.String)"
short_blocking_method: "com.android.server.am.OomAdjuster.updateOomAdjLocked"
@@ -9643,6 +10009,7 @@
node_id: 2202
ts: 1737228235050
dur: 70781
+ monotonic_dur: 70781
blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9673,6 +10040,7 @@
node_id: 2352
ts: 1737239594398
dur: 5000
+ monotonic_dur: 5000
blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9698,6 +10066,7 @@
node_id: 2137
ts: 1737227163556
dur: 7177
+ monotonic_dur: 7177
blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9723,6 +10092,7 @@
node_id: 2477
ts: 1737245633067
dur: 8154
+ monotonic_dur: 8154
blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9748,6 +10118,7 @@
node_id: 1955
ts: 1737221116248
dur: 5019
+ monotonic_dur: 5019
blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9773,6 +10144,7 @@
node_id: 2249
ts: 1737229615862
dur: 9541
+ monotonic_dur: 9541
blocking_method: "void com.android.server.am.ProcessList.dispatchProcessesChanged()"
blocked_method: "com.android.server.am.ActivityManagerService$ProcessChangeItem com.android.server.am.ProcessList.enqueueProcessChangeItemLocked(int, int)"
short_blocking_method: "com.android.server.am.ProcessList.dispatchProcessesChanged"
@@ -9798,6 +10170,7 @@
node_id: 1819
ts: 1737213634830
dur: 2487729
+ monotonic_dur: 2487729
blocking_method: "void com.android.server.content.ContentService$ObserverNode$ObserverEntry.binderDied()"
blocked_method: "void com.android.server.content.ContentService$ObserverNode$ObserverEntry.binderDied()"
short_blocking_method: "com.android.server.content.ContentService$ObserverNode$ObserverEntry.binderDied"
@@ -9833,6 +10206,7 @@
node_id: 1211
ts: 1737145912664
dur: 12262591
+ monotonic_dur: 12262591
blocking_method: "void com.android.server.media.MediaSessionService.pushSession1Changed(int)"
blocked_method: "java.util.List com.android.server.media.MediaSessionService$SessionManagerImpl.getSessions(android.content.ComponentName, int)"
short_blocking_method: "com.android.server.media.MediaSessionService.pushSession1Changed"
@@ -9865,6 +10239,7 @@
node_id: 1151
ts: 1737141884094
dur: 513114
+ monotonic_dur: 513114
blocking_method: "void com.android.server.power.PowerManagerService.acquireWakeLockInternal(android.os.IBinder, int, int, java.lang.String, java.lang.String, android.os.WorkSource, java.lang.String, int, int, android.os.IWakeLockCallback)"
blocked_method: "void com.android.server.power.PowerManagerService.handleSandman(int)"
short_blocking_method: "com.android.server.power.PowerManagerService.acquireWakeLockInternal"
@@ -9895,6 +10270,7 @@
node_id: 1161
ts: 1737142534967
dur: 5471
+ monotonic_dur: 5471
blocking_method: "void com.android.server.power.PowerManagerService.acquireWakeLockInternal(android.os.IBinder, int, int, java.lang.String, java.lang.String, android.os.WorkSource, java.lang.String, int, int, android.os.IWakeLockCallback)"
blocked_method: "void com.android.server.power.PowerManagerService.handleSandman(int)"
short_blocking_method: "com.android.server.power.PowerManagerService.acquireWakeLockInternal"
@@ -9920,6 +10296,7 @@
node_id: 14088
ts: 1739952323311
dur: 688213
+ monotonic_dur: 688213
blocking_method: "void com.android.server.power.PowerManagerService.acquireWakeLockInternal(android.os.IBinder, int, int, java.lang.String, java.lang.String, android.os.WorkSource, java.lang.String, int, int, android.os.IWakeLockCallback)"
blocked_method: "void com.android.server.power.PowerManagerService.handleSandman(int)"
short_blocking_method: "com.android.server.power.PowerManagerService.acquireWakeLockInternal"
@@ -9945,6 +10322,7 @@
node_id: 1301
ts: 1737162328333
dur: 419228
+ monotonic_dur: 419228
blocking_method: "void com.android.server.power.PowerManagerService.releaseWakeLockInternal(android.os.IBinder, int)"
blocked_method: "void com.android.server.power.PowerManagerService.handleSandman(int)"
short_blocking_method: "com.android.server.power.PowerManagerService.releaseWakeLockInternal"
@@ -9975,6 +10353,7 @@
node_id: 14247
ts: 1739965200743
dur: 59154
+ monotonic_dur: 59154
blocking_method: "void com.android.server.power.PowerManagerService.releaseWakeLockInternal(android.os.IBinder, int)"
blocked_method: "void com.android.server.power.PowerManagerService.handleSandman(int)"
short_blocking_method: "com.android.server.power.PowerManagerService.releaseWakeLockInternal"
@@ -9996,6 +10375,7 @@
node_id: 956
ts: 1737123891932
dur: 17577143
+ monotonic_dur: 17577143
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "int com.android.server.am.ActivityManagerService.getMemoryTrimLevel()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -10017,6 +10397,7 @@
node_id: 983
ts: 1737128030991
dur: 13677637
+ monotonic_dur: 13677637
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
@@ -10038,6 +10419,7 @@
node_id: 1307
ts: 1737162807202
dur: 3588216
+ monotonic_dur: 3588216
blocking_method: "void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()"
blocked_method: "boolean com.android.server.am.ActivityManagerService.unbindService(android.app.IServiceConnection)"
short_blocking_method: "com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied"
diff --git a/test/trace_processor/diff_tests/metrics/camera/camera-ion-mem-trace_android_camera_unagg.out b/test/trace_processor/diff_tests/metrics/camera/camera-ion-mem-trace_android_camera_unagg.out
index b690d13..84dd261 100644
--- a/test/trace_processor/diff_tests/metrics/camera/camera-ion-mem-trace_android_camera_unagg.out
+++ b/test/trace_processor/diff_tests/metrics/camera/camera-ion-mem-trace_android_camera_unagg.out
@@ -72687,4 +72687,12 @@
dma_val: 322318336.0
value: 1277186048.0
}
+ gc_rss_and_dma {
+ ts: 790258000000
+ gca_rss_val: 622112768.0
+ hal_rss_val: 327274496.0
+ cameraserver_rss_val: 5480448.0
+ dma_val: 0.0
+ value: 954867712.0
+ }
}
diff --git a/test/trace_processor/diff_tests/metrics/camera/tests.py b/test/trace_processor/diff_tests/metrics/camera/tests.py
index 43a9f86..fecb492 100644
--- a/test/trace_processor/diff_tests/metrics/camera/tests.py
+++ b/test/trace_processor/diff_tests/metrics/camera/tests.py
@@ -30,7 +30,7 @@
gc_rss_and_dma {
min: 47779840.0
max: 2536079360.0
- avg: 1464706457.7379363
+ avg: 1464706457.7348418
}
}
"""))
diff --git a/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py b/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
index c2336ce..70dec5c 100644
--- a/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
+++ b/test/trace_processor/diff_tests/metrics/chrome/tests_scroll_jank.py
@@ -458,4 +458,76 @@
}
}
}
+ """))
+
+ def test_has_descendant_slice_with_name_true(self):
+ return DiffTestBlueprint(
+ # We need a trace with a large number of non-chrome slices, so that the
+ # reliable range is affected by their filtering.
+ trace=DataPath('chrome_input_with_frame_view.pftrace'),
+ query="""
+ INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+ SELECT
+ _HAS_DESCENDANT_SLICE_WITH_NAME(
+ (SELECT id from slice where dur = 46046000),
+ 'SwapEndToPresentationCompositorFrame') AS has_descendant;
+ """,
+ out=Csv("""
+ "has_descendant"
+ 1
+ """))
+
+ def test_has_descendant_slice_with_name_false(self):
+ return DiffTestBlueprint(
+ # We need a trace with a large number of non-chrome slices, so that the
+ # reliable range is affected by their filtering.
+ trace=DataPath('chrome_input_with_frame_view.pftrace'),
+ query="""
+ INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+ SELECT
+ _HAS_DESCENDANT_SLICE_WITH_NAME(
+ (SELECT id from slice where dur = 11666000),
+ 'SwapEndToPresentationCompositorFrame') AS has_descendant;
+ """,
+ out=Csv("""
+ "has_descendant"
+ 0
+ """))
+
+ def test_descendant_slice_null(self):
+ return DiffTestBlueprint(
+ # We need a trace with a large number of non-chrome slices, so that the
+ # reliable range is affected by their filtering.
+ trace=DataPath('chrome_input_with_frame_view.pftrace'),
+ query="""
+ INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+ SELECT
+ _DESCENDANT_SLICE_END(
+ (SELECT id from slice where dur = 11666000),
+ 'SwapEndToPresentationCompositorFrame') AS end_ts;
+ """,
+ out=Csv("""
+ "end_ts"
+ "[NULL]"
+ """))
+
+ def test_descendant_slice(self):
+ return DiffTestBlueprint(
+ # We need a trace with a large number of non-chrome slices, so that the
+ # reliable range is affected by their filtering.
+ trace=DataPath('chrome_input_with_frame_view.pftrace'),
+ query="""
+ INCLUDE PERFETTO MODULE chrome.scroll_jank.scroll_jank_v3;
+
+ SELECT
+ _DESCENDANT_SLICE_END(
+ (SELECT id from slice where dur = 46046000),
+ 'SwapEndToPresentationCompositorFrame') AS end_ts;
+ """,
+ out=Csv("""
+ "end_ts"
+ 174797566610797
"""))
\ No newline at end of file
diff --git a/test/trace_processor/diff_tests/metrics/graphics/gpu_frequency_metric.textproto b/test/trace_processor/diff_tests/metrics/graphics/gpu_frequency_metric.textproto
index 8f0710f..3825a15 100644
--- a/test/trace_processor/diff_tests/metrics/graphics/gpu_frequency_metric.textproto
+++ b/test/trace_processor/diff_tests/metrics/graphics/gpu_frequency_metric.textproto
@@ -42,7 +42,7 @@
}
}
event {
- timestamp: 200005999999
+ timestamp: 200006000000
pid: 527
gpu_frequency {
gpu_id: 0
diff --git a/test/trace_processor/diff_tests/metrics/graphics/tests.py b/test/trace_processor/diff_tests/metrics/graphics/tests.py
index f5bb896..28a1f66 100644
--- a/test/trace_processor/diff_tests/metrics/graphics/tests.py
+++ b/test/trace_processor/diff_tests/metrics/graphics/tests.py
@@ -101,7 +101,7 @@
}
mem_max: 4
mem_min: 1
- mem_avg: 2
+ mem_avg: 1
}
"""))
diff --git a/test/trace_processor/diff_tests/parser/parsing/android_sched_and_ps_stats.out b/test/trace_processor/diff_tests/parser/parsing/android_sched_and_ps_stats.out
index 17268dc..e1542c5 100644
--- a/test/trace_processor/diff_tests/parser/parsing/android_sched_and_ps_stats.out
+++ b/test/trace_processor/diff_tests/parser/parsing/android_sched_and_ps_stats.out
@@ -143,14 +143,14 @@
"ftrace_cpu_overrun_end",5,"info","trace",0
"ftrace_cpu_overrun_end",6,"info","trace",0
"ftrace_cpu_overrun_end",7,"info","trace",0
-"ftrace_cpu_overrun_delta",0,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",1,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",2,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",3,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",4,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",5,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",6,"data_loss","trace",0
-"ftrace_cpu_overrun_delta",7,"data_loss","trace",0
+"ftrace_cpu_overrun_delta",0,"info","trace",0
+"ftrace_cpu_overrun_delta",1,"info","trace",0
+"ftrace_cpu_overrun_delta",2,"info","trace",0
+"ftrace_cpu_overrun_delta",3,"info","trace",0
+"ftrace_cpu_overrun_delta",4,"info","trace",0
+"ftrace_cpu_overrun_delta",5,"info","trace",0
+"ftrace_cpu_overrun_delta",6,"info","trace",0
+"ftrace_cpu_overrun_delta",7,"info","trace",0
"ftrace_cpu_read_events_begin",0,"info","trace",0
"ftrace_cpu_read_events_begin",1,"info","trace",0
"ftrace_cpu_read_events_begin",2,"info","trace",0
diff --git a/test/trace_processor/diff_tests/parser/power/dvfs_metric.textproto b/test/trace_processor/diff_tests/parser/power/dvfs_metric.textproto
index 8301519..4472456 100644
--- a/test/trace_processor/diff_tests/parser/power/dvfs_metric.textproto
+++ b/test/trace_processor/diff_tests/parser/power/dvfs_metric.textproto
@@ -42,7 +42,7 @@
}
}
event {
- timestamp: 200005999999
+ timestamp: 200006000000
pid: 527
clock_set_rate {
name: "domain@1"
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 62b0c43..3eead2a 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
@@ -207,6 +207,19 @@
""",
out=Path('heap_graph_object.out'))
+ def test_heap_graph_object_reference_set_id(self):
+ return DiffTestBlueprint(
+ trace=Path('heap_graph.textproto'),
+ query="""
+ SELECT o.reference_set_id
+ FROM heap_graph_object o
+ WHERE o.reference_set_id = 3
+ """,
+ out=Csv('''
+ "reference_set_id"
+ 3
+ '''))
+
def test_heap_graph_reference_2(self):
return DiffTestBlueprint(
trace=Path('heap_graph.textproto'),
diff --git a/test/trace_processor/diff_tests/stdlib/android/tests.py b/test/trace_processor/diff_tests/stdlib/android/tests.py
index 5df48e0..23ae137 100644
--- a/test/trace_processor/diff_tests/stdlib/android/tests.py
+++ b/test/trace_processor/diff_tests/stdlib/android/tests.py
@@ -317,8 +317,8 @@
LIMIT 1;
""",
out=Csv("""
- "parent_id","blocking_method","blocked_method","short_blocking_method","short_blocked_method","blocking_src","blocked_src","waiter_count","blocked_utid","blocked_thread_name","blocking_utid","blocking_thread_name","blocking_tid","upid","process_name","id","ts","dur","track_id","is_blocked_thread_main","blocked_thread_tid","is_blocking_thread_main","blocking_thread_tid","binder_reply_id","binder_reply_ts","binder_reply_tid","pid","child_id"
- 949,"void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()","int com.android.server.am.ActivityManagerService.getMemoryTrimLevel()","com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied","com.android.server.am.ActivityManagerService.getMemoryTrimLevel","ActivityManagerService.java:1478","ActivityManagerService.java:9183",1,250,"system_server",656,"binder:642_12",2720,250,"system_server",956,1737123891932,17577143,1215,1,642,0,2720,"[NULL]","[NULL]","[NULL]",642,"[NULL]"
+ "parent_id","blocking_method","blocked_method","short_blocking_method","short_blocked_method","blocking_src","blocked_src","waiter_count","blocked_utid","blocked_thread_name","blocking_utid","blocking_thread_name","blocking_tid","upid","process_name","id","ts","dur","monotonic_dur","track_id","is_blocked_thread_main","blocked_thread_tid","is_blocking_thread_main","blocking_thread_tid","binder_reply_id","binder_reply_ts","binder_reply_tid","pid","child_id"
+ 949,"void com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied()","int com.android.server.am.ActivityManagerService.getMemoryTrimLevel()","com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied","com.android.server.am.ActivityManagerService.getMemoryTrimLevel","ActivityManagerService.java:1478","ActivityManagerService.java:9183",1,250,"system_server",656,"binder:642_12",2720,250,"system_server",956,1737123891932,17577143,17577143,1215,1,642,0,2720,"[NULL]","[NULL]","[NULL]",642,"[NULL]"
"""))
def test_monitor_contention_graph(self):
@@ -541,6 +541,10 @@
server_oom_score,
client_ts,
server_ts,
+ client_dur,
+ server_dur,
+ client_monotonic_dur,
+ server_monotonic_dur,
aidl_ts,
aidl_dur,
is_sync,
@@ -554,17 +558,17 @@
LIMIT 10;
""",
out=Csv("""
- "aidl_name","client_process","server_process","client_thread","client_tid","server_tid","is_main_thread","client_oom_score","server_oom_score","client_ts","server_ts","aidl_ts","aidl_dur","is_sync","client_package_version_code","server_package_version_code","is_client_package_debuggable","is_server_package_debuggable"
- "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736110278076,1736110435876,1736110692464,135281,1,33,"[NULL]",0,"[NULL]"
- "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736111274404,1736111340019,1736111417370,249758,1,33,"[NULL]",0,"[NULL]"
- "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736111874030,1736111923740,1736111994038,64535,1,33,"[NULL]",0,"[NULL]"
- "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736112257185,1736112301639,1736112361927,133727,1,33,"[NULL]",0,"[NULL]"
- "AIDL::java::IPackageManager::isProtectedBroadcast::server","com.android.systemui","system_server","ndroid.systemui",1253,657,1,-800,-900,1737108493015,1737125387579,1737125511194,24959,1,33,"[NULL]",0,"[NULL]"
- "AIDL::java::IActivityManager::checkPermission::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737110161286,1737110746980,1737110799860,75563,1,33,"[NULL]",0,"[NULL]"
- "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737123460104,1737123475761,1737123532124,48775,1,33,"[NULL]",0,"[NULL]"
- "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737123982140,1737123994640,1737124033555,109797,1,33,"[NULL]",0,"[NULL]"
- "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737124228451,1737124238356,1737124269922,24911,1,33,"[NULL]",0,"[NULL]"
- "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737124369273,1737124378273,1737124406331,54810,1,33,"[NULL]",0,"[NULL]"
+ "aidl_name","client_process","server_process","client_thread","client_tid","server_tid","is_main_thread","client_oom_score","server_oom_score","client_ts","server_ts","client_dur","server_dur","client_monotonic_dur","server_monotonic_dur","aidl_ts","aidl_dur","is_sync","client_package_version_code","server_package_version_code","is_client_package_debuggable","is_server_package_debuggable"
+ "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736110278076,1736110435876,765487,462664,765487,462664,1736110692464,135281,1,33,"[NULL]",0,"[NULL]"
+ "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736111274404,1736111340019,481038,361607,481038,361607,1736111417370,249758,1,33,"[NULL]",0,"[NULL]"
+ "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736111874030,1736111923740,254494,159330,254494,159330,1736111994038,64535,1,33,"[NULL]",0,"[NULL]"
+ "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,657,1,-800,-900,1736112257185,1736112301639,309870,220751,309870,220751,1736112361927,133727,1,33,"[NULL]",0,"[NULL]"
+ "AIDL::java::IPackageManager::isProtectedBroadcast::server","com.android.systemui","system_server","ndroid.systemui",1253,657,1,-800,-900,1737108493015,1737125387579,17949987,163732,17949987,163732,1737125511194,24959,1,33,"[NULL]",0,"[NULL]"
+ "AIDL::java::IActivityManager::checkPermission::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737110161286,1737110746980,12677155,147315,12677155,147315,1737110799860,75563,1,33,"[NULL]",0,"[NULL]"
+ "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737123460104,1737123475761,447621,137704,447621,137704,1737123532124,48775,1,33,"[NULL]",0,"[NULL]"
+ "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737123982140,1737123994640,191006,164185,191006,164185,1737124033555,109797,1,33,"[NULL]",0,"[NULL]"
+ "AIDL::java::INetworkStatsService::getMobileIfaces::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737124228451,1737124238356,88522,66721,88522,66721,1737124269922,24911,1,33,"[NULL]",0,"[NULL]"
+ "AIDL::java::INetworkStatsService::getIfaceStats::server","com.android.phone","system_server","m.android.phone",1469,2721,1,-800,-900,1737124369273,1737124378273,957260,95254,957260,95254,1737124406331,54810,1,33,"[NULL]",0,"[NULL]"
"""))
def test_binder_outgoing_graph(self):
@@ -919,7 +923,7 @@
"name","ts","value","dur"
"domain@1 Frequency",200001000000,400000.000000,2000000
"domain@1 Frequency",200003000000,1024000.000000,2000000
- "domain@1 Frequency",200005000000,1024000.000000,1
+ "domain@1 Frequency",200005000000,1024000.000000,0
"""))
def test_android_dvfs_counter_stats(self):
@@ -987,8 +991,8 @@
""",
out=Csv("""
"name","max","min","dur","wgt_avg"
- "bus_throughput Frequency",1014000.000000,553000.000000,4000000,783499.942375
- "domain@1 Frequency",1024000.000000,400000.000000,4000000,712000.078000
+ "bus_throughput Frequency",1014000.000000,553000.000000,2000000,783500.000000
+ "domain@1 Frequency",1024000.000000,400000.000000,2000000,712000.000000
"""))
def test_android_dvfs_counter_residency(self):
@@ -998,7 +1002,7 @@
ftrace_events {
cpu: 0
event {
- timestamp: 200001000001
+ timestamp: 200001000000
pid: 2
clock_set_rate {
name : "bus_throughput"
@@ -1006,7 +1010,7 @@
}
}
event {
- timestamp: 200003000001
+ timestamp: 200003000000
pid: 2
clock_set_rate {
name: "bus_throughput"
@@ -1157,14 +1161,21 @@
def test_freezer_events(self):
return DiffTestBlueprint(
- trace=DataPath('post_boot_trace.atr'),
+ trace=DataPath('freezer_trace.atr'),
query="""
INCLUDE PERFETTO MODULE android.freezer;
- SELECT pid, ts, dur FROM android_freezer_events ORDER BY ts
+ SELECT pid, ts, dur, unfreeze_reason_int, unfreeze_reason_str FROM android_freezer_events ORDER BY ts
""",
out=Csv("""
- "pid","ts","dur"
- 8361,588092720937,576298685
+ "pid","ts","dur","unfreeze_reason_int","unfreeze_reason_str"
+ 6506,91266310231819,94699935803,"[NULL]","[NULL]"
+ 3804,91266322277324,94687890298,"[NULL]","[NULL]"
+ 3299,91281767065245,78699885147,6,"start_service"
+ 5782,91296291190245,64718977377,"[NULL]","[NULL]"
+ 6533,91296292403211,64717764411,"[NULL]","[NULL]"
+ 4044,91296293188372,64716979250,"[NULL]","[NULL]"
+ 4002,91296294215356,64715952266,"[NULL]","[NULL]"
+ 3981,91296294804650,64715362972,"[NULL]","[NULL]"
"""))
def test_service_bindings(self):
@@ -1209,3 +1220,38 @@
0,"com.android.bluetooth","droid.bluetooth",7639,7639,571248973750,9874358,-700,"com.android.bluetooth","binder:7639_2",7672,7639,571871169647,6460322,"android.os.BinderProxy@7482132","android.bluetooth.IBluetooth","com.android.bluetooth/.btservice.AdapterService","[NULL]",4
-700,"com.android.bluetooth","droid.bluetooth",7639,7639,572342110044,4874276,-700,"com.android.bluetooth","binder:7639_2",7672,7639,572466393291,1404185,"android.os.BinderProxy@ce5a6fc","android.media.browse.MediaBrowserService","com.android.bluetooth/.avrcpcontroller.BluetoothMediaBrowserService","[NULL]",10
"""))
+
+ def test_oom_adjuster_transitions(self):
+ return DiffTestBlueprint(
+ trace=DataPath('sched_wakeup_trace.atr'),
+ query="""
+ INCLUDE PERFETTO MODULE android.oom_adjuster;
+ SELECT
+ ts,
+ dur,
+ score,
+ bucket,
+ process_name,
+ oom_adj_ts,
+ oom_adj_dur,
+ oom_adj_thread_name,
+ oom_adj_reason,
+ oom_adj_trigger
+ FROM android_oom_adj_intervals
+ WHERE oom_adj_reason IS NOT NULL
+ ORDER BY ts
+ LIMIT 10
+ """,
+ out=Csv("""
+ "ts","dur","score","bucket","process_name","oom_adj_ts","oom_adj_dur","oom_adj_thread_name","oom_adj_reason","oom_adj_trigger"
+ 1737065264829,701108081,925,"cached_app","com.android.providers.calendar",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737066678827,3470211742,935,"cached_app","com.android.imsserviceentitlement",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737066873002,3470017567,945,"cached_app","com.android.carrierconfig",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737067058812,3469831757,955,"cached_app_lmk_first","com.android.messaging",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737067246975,699224817,955,"cached_app_lmk_first","android.process.acore",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737068421919,3468468650,965,"cached_app_lmk_first","com.android.shell",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737068599673,697908135,965,"cached_app_lmk_first","android.process.media",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737068933602,3467956967,975,"cached_app_lmk_first","com.android.gallery3d",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737069091010,3467799559,975,"cached_app_lmk_first","com.android.packageinstaller",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ 1737069240534,3467650035,985,"cached_app_lmk_first","com.android.managedprovisioning",1737064421516,29484835,"binder:642_1","processEnd","IActivityManager#1598246212"
+ """))
diff --git a/test/trace_processor/diff_tests/stdlib/counters/tests.py b/test/trace_processor/diff_tests/stdlib/counters/tests.py
new file mode 100644
index 0000000..270d074
--- /dev/null
+++ b/test/trace_processor/diff_tests/stdlib/counters/tests.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+# Copyright (C) 2024 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License a
+#
+# 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 DataPath
+from python.generators.diff_tests.testing import Csv, TextProto
+from python.generators.diff_tests.testing import DiffTestBlueprint
+from python.generators.diff_tests.testing import TestSuite
+
+
+class StdlibCounterIntervals(TestSuite):
+
+ def test_intervals_counter_leading(self):
+ return DiffTestBlueprint(
+ trace=DataPath('counters.json'),
+ query="""
+ INCLUDE PERFETTO MODULE counters.intervals;
+
+ WITH
+ foo AS (
+ SELECT 0 AS id, 0 AS ts, 10 AS value, 1 AS track_id
+ UNION ALL
+ SELECT 1 AS id, 0 AS ts, 10 AS value, 2 AS track_id
+ UNION ALL
+ SELECT 2 AS id, 10 AS ts, 10 AS value, 1 AS track_id
+ UNION ALL
+ SELECT 3 AS id, 10 AS ts, 20 AS value, 2 AS track_id
+ UNION ALL
+ SELECT 4 AS id, 20 AS ts, 30 AS value, 1 AS track_id
+ )
+ SELECT * FROM counter_leading_intervals !(foo);
+ """,
+ out=Csv("""
+ "id","ts","track_id","dur","value"
+ 0,0,1,20,10
+ 4,20,1,19980,30
+ 1,0,2,10,10
+ 3,10,2,19990,20
+ """))
diff --git a/test/trace_processor/diff_tests/stdlib/slices/tests.py b/test/trace_processor/diff_tests/stdlib/slices/tests.py
index 9b565bb..e3db459 100644
--- a/test/trace_processor/diff_tests/stdlib/slices/tests.py
+++ b/test/trace_processor/diff_tests/stdlib/slices/tests.py
@@ -26,7 +26,7 @@
return DiffTestBlueprint(
trace=Path('trace.py'),
query="""
- INCLUDE PERFETTO MODULE common.slices;
+ INCLUDE PERFETTO MODULE slices.with_context;
SELECT name, ts, dur, depth, thread_name, tid, process_name, pid
FROM thread_slice;
@@ -40,7 +40,7 @@
return DiffTestBlueprint(
trace=Path('trace.py'),
query="""
- INCLUDE PERFETTO MODULE common.slices;
+ INCLUDE PERFETTO MODULE slices.with_context;
SELECT name, ts, dur, depth, process_name, pid
FROM process_slice;
@@ -67,77 +67,6 @@
"""))
# Common functions
- def test_has_descendant_slice_with_name_true(self):
- return DiffTestBlueprint(
- # We need a trace with a large number of non-chrome slices, so that the
- # reliable range is affected by their filtering.
- trace=DataPath('chrome_input_with_frame_view.pftrace'),
- query="""
- INCLUDE PERFETTO MODULE common.slices;
-
- SELECT
- HAS_DESCENDANT_SLICE_WITH_NAME(
- (SELECT id from slice where dur = 46046000),
- 'SwapEndToPresentationCompositorFrame') AS has_descendant;
- """,
- out=Csv("""
- "has_descendant"
- 1
- """))
-
- def test_has_descendant_slice_with_name_false(self):
- return DiffTestBlueprint(
- # We need a trace with a large number of non-chrome slices, so that the
- # reliable range is affected by their filtering.
- trace=DataPath('chrome_input_with_frame_view.pftrace'),
- query="""
- INCLUDE PERFETTO MODULE common.slices;
-
- SELECT
- HAS_DESCENDANT_SLICE_WITH_NAME(
- (SELECT id from slice where dur = 11666000),
- 'SwapEndToPresentationCompositorFrame') AS has_descendant;
- """,
- out=Csv("""
- "has_descendant"
- 0
- """))
-
- def test_descendant_slice_null(self):
- return DiffTestBlueprint(
- # We need a trace with a large number of non-chrome slices, so that the
- # reliable range is affected by their filtering.
- trace=DataPath('chrome_input_with_frame_view.pftrace'),
- query="""
- INCLUDE PERFETTO MODULE common.slices;
-
- SELECT
- DESCENDANT_SLICE_END(
- (SELECT id from slice where dur = 11666000),
- 'SwapEndToPresentationCompositorFrame') AS end_ts;
- """,
- out=Csv("""
- "end_ts"
- "[NULL]"
- """))
-
- def test_descendant_slice(self):
- return DiffTestBlueprint(
- # We need a trace with a large number of non-chrome slices, so that the
- # reliable range is affected by their filtering.
- trace=DataPath('chrome_input_with_frame_view.pftrace'),
- query="""
- INCLUDE PERFETTO MODULE common.slices;
-
- SELECT
- DESCENDANT_SLICE_END(
- (SELECT id from slice where dur = 46046000),
- 'SwapEndToPresentationCompositorFrame') AS end_ts;
- """,
- out=Csv("""
- "end_ts"
- 174797566610797
- """))
def test_slice_flattened(self):
return DiffTestBlueprint(
diff --git a/tools/check_sql_metrics.py b/tools/check_sql_metrics.py
index b577b43..73f0d70 100755
--- a/tools/check_sql_metrics.py
+++ b/tools/check_sql_metrics.py
@@ -48,7 +48,7 @@
'/chrome/gesture_jank.sql': [
'{{prefix}}_jank_maybe_null_prev_and_next_without_precompute'
],
- '/experimental/frame_times.sql': ['DisplayCompositorPresentationEvents']
+ '/experimental/frame_times.sql': ['DisplayCompositorPresentationEvents'],
}
diff --git a/tools/check_sql_modules.py b/tools/check_sql_modules.py
index 7f6f81c..b4ffc1f 100755
--- a/tools/check_sql_modules.py
+++ b/tools/check_sql_modules.py
@@ -34,9 +34,8 @@
# Allowlist path are relative to the stdlib root.
CREATE_TABLE_ALLOWLIST = {
- '/android/binder.sql': [
- '_oom_score'
- ],
+ '/prelude/trace_bounds.sql': ['trace_bounds'],
+ '/android/binder.sql': ['_oom_score'],
'/android/monitor_contention.sql': [
'_isolated', 'android_monitor_contention_chain',
'android_monitor_contention'
@@ -91,6 +90,11 @@
sql = f.read()
parsed = parse_file(rel_path, sql)
+
+ # Some modules (i.e. `deprecated`) should not be checked.
+ if not parsed:
+ continue
+
modules.append((path, sql, parsed))
if args.verbose:
diff --git a/tools/extract_linux_syscall_tables b/tools/extract_linux_syscall_tables
index 89889b2..59e33d0 100755
--- a/tools/extract_linux_syscall_tables
+++ b/tools/extract_linux_syscall_tables
@@ -11,7 +11,7 @@
SELF_PATH = os.path.relpath(__file__, PROJECT_ROOT).replace('\\', '/')
syscalls = {}
-archs = ['aarch32', 'aarch64', 'armeabi', 'x86', 'x86_64']
+archs = ['arm64', 'arm32', 'x86', 'x86_64']
def print_tables():
@@ -83,7 +83,7 @@
def Main():
- KSRC = 'https://raw.githubusercontent.com/torvalds/linux/v4.20/'
+ KSRC = 'https://raw.githubusercontent.com/torvalds/linux/v6.7/'
response = urlopen(KSRC + 'arch/x86/entry/syscalls/syscall_64.tbl')
syscalls['x86_64'] = parse_tlb(response.read().decode())
@@ -92,17 +92,14 @@
syscalls['x86'] = parse_tlb(response.read().decode())
response = urlopen(KSRC + 'arch/arm/tools/syscall.tbl')
- syscalls['armeabi'] = parse_tlb(response.read().decode())
-
- response = urlopen(KSRC + 'arch/arm64/include/asm/unistd32.h')
- syscalls['aarch32'] = parse_def(response.read().decode())
+ syscalls['arm32'] = parse_tlb(response.read().decode())
# From:
# arch/arm64/include/asm/unistd.h
# -> arch/arm64/include/uapi/asm/unistd.h
# -> include/uapi/asm-generic/unistd.h
response = urlopen(KSRC + 'include/uapi/asm-generic/unistd.h')
- syscalls['aarch64'] = parse_def(response.read().decode())
+ syscalls['arm64'] = parse_def(response.read().decode())
dst_file = os.path.join(PROJECT_ROOT, 'src', 'kernel_utils',
'syscall_table_generated.h')
diff --git a/tools/gen_bazel b/tools/gen_bazel
index 6330000..31c127a 100755
--- a/tools/gen_bazel
+++ b/tools/gen_bazel
@@ -64,6 +64,7 @@
public_targets = [
'//:libperfetto_client_experimental',
'//src/perfetto_cmd:perfetto',
+ '//src/shared_lib:libperfetto_c',
'//src/traced/probes:traced_probes',
'//src/traced/service:traced',
'//src/trace_processor:trace_processor_shell',
@@ -173,6 +174,15 @@
}
}
+# Defines required for Bazel.
+bazel_required_defines = [
+ "PERFETTO_SHLIB_SDK_IMPLEMENTATION"
+]
+
+# Filter defines that appear in the bazel build file to only those that bazel requires.
+def filter_defines(defines):
+ return [d for d in defines if d in bazel_required_defines]
+
def gen_version_header(target):
label = BazelLabel(get_bazel_label_name(target.name), 'perfetto_genrule')
@@ -322,6 +332,7 @@
self.visibility: Union[List[str], str] = []
self.srcs: Union[List[str], str] = []
self.hdrs = []
+ self.defines = []
self.data = []
self.deps = []
self.external_deps = []
@@ -348,8 +359,8 @@
res += '%s(\n' % self.type
any_deps = len(self.deps) + len(self.external_deps) > 0
ORD = [
- 'name', 'srcs', 'hdrs', 'visibility', 'data', 'deps', 'outs', 'cmd',
- 'tools', 'exports', 'main', 'python_version'
+ 'name', 'srcs', 'hdrs', 'defines', 'visibility', 'data', 'deps', 'outs',
+ 'cmd', 'tools', 'exports', 'main', 'python_version'
]
hasher = lambda x: sum((99,) + tuple(ord(c) for c in x))
key_sorter = lambda kv: ORD.index(kv[0]) if kv[0] in ORD else hasher(kv[0])
@@ -624,7 +635,7 @@
elif gn_target.type == 'executable':
bazel_type = 'perfetto_cc_binary'
elif gn_target.type == 'shared_library':
- bazel_type = 'perfetto_cc_binary'
+ bazel_type = 'perfetto_cc_library'
elif gn_target.type == 'static_library':
bazel_type = 'perfetto_cc_library'
elif gn_target.type == 'source_set':
@@ -670,6 +681,10 @@
label.hdrs += [name]
else:
label.srcs += [name]
+
+ # Add defines from all transitive dependencies.
+ label.defines += trans_dep.defines
+
for dep in sorted(gn_target.non_proto_or_source_set_deps()):
dep_name = dep.name
if dep_name.startswith('//gn:'):
@@ -684,6 +699,7 @@
label.external_deps += external_deps[dep_name]
else:
label.deps += [':' + get_bazel_label_name(dep_name)]
+
label.deps += [
':' + get_bazel_label_name(x.name)
for x in gn_target.transitive_cpp_proto_deps()
@@ -698,6 +714,7 @@
label.deps = sorted(label.deps)
label.hdrs = sorted(label.hdrs)
+ label.defines = sorted(filter_defines(set(label.defines)))
return [label]
diff --git a/tools/gen_cc_proto_descriptor.py b/tools/gen_cc_proto_descriptor.py
index 0c2dc66..45354b1 100755
--- a/tools/gen_cc_proto_descriptor.py
+++ b/tools/gen_cc_proto_descriptor.py
@@ -68,7 +68,7 @@
namespace perfetto {{
-constexpr std::array<uint8_t, {size}> k{proto_name}Descriptor{{
+constexpr inline std::array<uint8_t, {size}> k{proto_name}Descriptor{{
{binary}}};
}} // namespace perfetto
diff --git a/tools/gen_stdlib_docs_json.py b/tools/gen_stdlib_docs_json.py
index 513b932..8ae6044 100755
--- a/tools/gen_stdlib_docs_json.py
+++ b/tools/gen_stdlib_docs_json.py
@@ -71,6 +71,11 @@
import_key = path.split(".sql")[0].replace("/", ".")
docs = parse_file(path, sql)
+
+ # Some modules (i.e `deprecated`) should not generate docs.
+ if not docs:
+ continue
+
if len(docs.errors) > 0:
for e in docs.errors:
print(e)
diff --git a/tools/install-build-deps b/tools/install-build-deps
index 802ae9e..b27e8ea 100755
--- a/tools/install-build-deps
+++ b/tools/install-build-deps
@@ -165,13 +165,13 @@
# tools/clang/scripts/update.py.
Dependency(
'buildtools/linux64/clang.tgz',
- 'https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-16-init-8697-g60809cd2-1.tgz',
- '5ae35f85e0d32136795c6b223bf64263d46678dd4a24fea4e9039e58a32670de',
+ 'https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-18-init-17730-gf670112a-5.tgz',
+ 'ce6201b728ea485d4b116aa3b5e8ae3b34ee2775f25924c5714fdbe42fb2b787',
'linux', 'x64'),
Dependency(
'buildtools/win/clang.tgz',
- 'https://commondatastorage.googleapis.com/chromium-browser-clang/Win/clang-llvmorg-16-init-8697-g60809cd2-1.tgz',
- '086faec822acba5b9c0308c6a8be34424031027d757efa2b81805aed18ffc521',
+ 'https://commondatastorage.googleapis.com/chromium-browser-clang/Win/clang-llvmorg-18-init-17730-gf670112a-5.tgz',
+ '972011cc8a5bc5d5fbe08773089058a264ee0e19af019df28f0972ee9bd0493f',
'windows', 'x64'),
]
@@ -221,8 +221,8 @@
# From https://github.com/ianlancetaylor/libbacktrace/archive/177940370e4a6b2509e92a0aaa9749184e64af43.zip
Dependency(
'buildtools/libbacktrace.zip',
- 'https://storage.googleapis.com/perfetto/libbacktrace-177940370e4a6b2509e92a0aaa9749184e64af43.zip',
- '21ac9a4209f7aeef766c482be53a7fa365063c031c7077e2070b491202983b31',
+ 'https://storage.googleapis.com/perfetto/libbacktrace-14818b7783eeb9a56c3f0fca78cefd3143f8c5f6.zip',
+ '0d09295938155aa84d9a6049f63df8cd2def3a28302b3550ea3ead9100b3d086',
'all', 'all'),
# Sqlite for the trace processing library.
diff --git a/ui/release/channels.json b/ui/release/channels.json
index 8e7a8cf..778c4d8 100644
--- a/ui/release/channels.json
+++ b/ui/release/channels.json
@@ -6,7 +6,7 @@
},
{
"name": "canary",
- "rev": "ed568855bbbfffe3fb099cd5f3d0096f1e4aa268"
+ "rev": "f62b11e6b5d34d0b0f1af3d60eb4d40a57b652b6"
},
{
"name": "autopush",
diff --git a/ui/src/assets/details.scss b/ui/src/assets/details.scss
index 2bd55e5..f3e529a 100644
--- a/ui/src/assets/details.scss
+++ b/ui/src/assets/details.scss
@@ -63,6 +63,10 @@
.pf-tab-title {
margin: 0px 4px;
overflow: hidden;
+
+ .pf-nocontent {
+ font-weight: lighter;
+ }
}
}
}
diff --git a/ui/src/assets/plugins_page.scss b/ui/src/assets/plugins_page.scss
index 3000353..0312323 100644
--- a/ui/src/assets/plugins_page.scss
+++ b/ui/src/assets/plugins_page.scss
@@ -33,7 +33,7 @@
.pf-plugins-grid {
display: inline-grid;
- grid-template-columns: auto auto auto;
+ grid-template-columns: repeat(6, auto);
row-gap: 6px;
column-gap: 10px;
}
diff --git a/ui/src/common/cache_manager.ts b/ui/src/common/cache_manager.ts
index 41faf66..1eab53f 100644
--- a/ui/src/common/cache_manager.ts
+++ b/ui/src/common/cache_manager.ts
@@ -42,7 +42,7 @@
try {
const cache = await getCache();
if (cache === undefined) return false; // Cache storage not supported.
- return cache.delete(key);
+ return await cache.delete(key);
} catch (_) {
// TODO(288483453): Reinstate:
// return ignoreCacheUnactionableErrors(e, false);
@@ -54,7 +54,7 @@
try {
const cache = await getCache();
if (cache === undefined) return; // Cache storage not supported.
- cache.put(key, value);
+ await cache.put(key, value);
} catch (_) {
// TODO(288483453): Reinstate:
// ignoreCacheUnactionableErrors(e, undefined);
@@ -65,7 +65,7 @@
try {
const cache = await getCache();
if (cache === undefined) return undefined; // Cache storage not supported.
- return cache.match(key);
+ return await cache.match(key);
} catch (_) {
// TODO(288483453): Reinstate:
// ignoreCacheUnactionableErrors(e, undefined);
@@ -77,7 +77,7 @@
try {
const cache = await getCache();
if (cache === undefined) return []; // Cache storage not supported.
- return cache.keys();
+ return await cache.keys();
} catch (e) {
// TODO(288483453): Reinstate:
// return ignoreCacheUnactionableErrors(e, []);
diff --git a/ui/src/common/default_plugins.ts b/ui/src/common/default_plugins.ts
new file mode 100644
index 0000000..1a48e28
--- /dev/null
+++ b/ui/src/common/default_plugins.ts
@@ -0,0 +1,58 @@
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Plugins in this list will run by default when users boot up the UI.
+// Users may choose to enable plugins which are not in this list, but they will
+// need to do this manually.
+// In order to get a plugin into this list it must:
+// - Use only the available plugin API (no hacks).
+// - Follow naming conventions for tracks and plugins.
+// - Not directly rely on any other plugins.
+// - Be approved by one of Perfetto UI owners.
+export const defaultPlugins = [
+ 'dev.perfetto.AndroidBinderVizPlugin',
+ 'dev.perfetto.AndroidClientServer',
+ 'dev.perfetto.AndroidCujs',
+ 'dev.perfetto.AndroidLongBatteryTracing',
+ 'dev.perfetto.AndroidNetwork',
+ 'dev.perfetto.AndroidPerf',
+ 'dev.perfetto.AndroidPerfTraceCounters',
+ 'dev.perfetto.BookmarkletApi',
+ 'dev.perfetto.CoreCommands',
+ 'dev.perfetto.LargeScreensPerf',
+ 'perfetto.AndroidLog',
+ 'perfetto.Annotation',
+ 'perfetto.AsyncSlices',
+ 'perfetto.ChromeScrollJank',
+ 'perfetto.ChromeSlices',
+ 'perfetto.Counter',
+ 'perfetto.CpuFreq',
+ 'perfetto.CpuProfile',
+ 'perfetto.CpuSlices',
+ 'perfetto.CriticalUserInteraction',
+ 'perfetto.CustomSqlTrack',
+ 'perfetto.DebugSlices',
+ 'perfetto.Flows',
+ 'perfetto.Frames',
+ 'perfetto.FtraceRaw',
+ 'perfetto.HeapProfile',
+ 'perfetto.NullTrack',
+ 'perfetto.PerfSamplesProfile',
+ 'perfetto.PivotTable',
+ 'perfetto.ProcessSummary',
+ 'perfetto.Sched',
+ 'perfetto.Screenshots',
+ 'perfetto.ThreadState',
+ 'perfetto.VisualisedArgs',
+];
diff --git a/ui/src/common/plugins.ts b/ui/src/common/plugins.ts
index 788dbcd..fc996a2 100644
--- a/ui/src/common/plugins.ts
+++ b/ui/src/common/plugins.ts
@@ -42,6 +42,10 @@
import {Registry} from './registry';
import {SCROLLING_TRACK_GROUP} from './state';
import {addQueryResultsTab} from '../frontend/query_result_tab';
+import {Flag, featureFlags} from '../core/feature_flags';
+import {assertExists} from '../base/logging';
+import {raf} from '../core/raf_scheduler';
+import {defaultPlugins} from './default_plugins';
// Every plugin gets its own PluginContext. This is how we keep track
// what each plugin is doing and how we can blame issues on particular
@@ -139,6 +143,11 @@
this.trash.add(unregister);
}
+ addDefaultTab(uri: string): void {
+ const remove = globals.tabManager.addDefaultTab(uri);
+ this.trash.add(remove);
+ }
+
registerDetailsPanel(section: DetailsPanel): void {
if (!this.alive) return;
@@ -318,10 +327,11 @@
}
}
-interface PluginDetails {
+export interface PluginDetails {
plugin: Plugin;
context: PluginContext&Disposable;
traceContext?: PluginContextTraceImpl;
+ previousOnTraceLoadTimeMillis?: number;
}
function isPluginClass(v: unknown): v is PluginClass {
@@ -345,15 +355,68 @@
export class PluginManager {
private registry: PluginRegistry;
- private plugins: Map<string, PluginDetails>;
+ private _plugins: Map<string, PluginDetails>;
private engine?: Engine;
+ private flags = new Map<string, Flag>();
constructor(registry: PluginRegistry) {
this.registry = registry;
- this.plugins = new Map();
+ this._plugins = new Map();
}
- activatePlugin(id: string): void {
+ get plugins(): Map<string, PluginDetails> {
+ return this._plugins;
+ }
+
+ // Must only be called once on startup
+ async initialize(): Promise<void> {
+ for (const plugin of pluginRegistry.values()) {
+ const id = `plugin_${plugin.pluginId}`;
+ const name = `Plugin: ${plugin.pluginId}`;
+ const flag = featureFlags.register({
+ id,
+ name,
+ description: `Overrides '${id}' plugin.`,
+ defaultValue: defaultPlugins.includes(plugin.pluginId),
+ });
+ this.flags.set(plugin.pluginId, flag);
+ if (flag.get()) {
+ await this.activatePlugin(plugin.pluginId);
+ }
+ }
+ }
+
+ /**
+ * Enable plugin flag - i.e. configure a plugin to start on boot.
+ * @param id The ID of the plugin.
+ * @param now Optional: If true, also activate the plugin now.
+ */
+ async enablePlugin(id: string, now?: boolean): Promise<void> {
+ const flag = this.flags.get(id);
+ if (flag) {
+ flag.set(true);
+ }
+ now && await this.activatePlugin(id);
+ }
+
+ /**
+ * Disable plugin flag - i.e. configure a plugin not to start on boot.
+ * @param id The ID of the plugin.
+ * @param now Optional: If true, also deactivate the plugin now.
+ */
+ async disablePlugin(id: string, now?: boolean): Promise<void> {
+ const flag = this.flags.get(id);
+ if (flag) {
+ flag.set(false);
+ }
+ now && await this.deactivatePlugin(id);
+ }
+
+ /**
+ * Start a plugin just for this session. This setting is not persisted.
+ * @param id The ID of the plugin to start.
+ */
+ async activatePlugin(id: string): Promise<void> {
if (this.isActive(id)) {
return;
}
@@ -373,53 +436,89 @@
// If a trace is already loaded when plugin is activated, make sure to
// call onTraceLoad().
if (this.engine) {
- this.doPluginTraceLoad(pluginDetails, this.engine, id);
+ await doPluginTraceLoad(pluginDetails, this.engine, id);
}
- this.plugins.set(id, pluginDetails);
+ this._plugins.set(id, pluginDetails);
+
+ raf.scheduleFullRedraw();
}
- deactivatePlugin(id: string): void {
+ /**
+ * Stop a plugin just for this session. This setting is not persisted.
+ * @param id The ID of the plugin to stop.
+ */
+ async deactivatePlugin(id: string): Promise<void> {
const pluginDetails = this.getPluginContext(id);
if (pluginDetails === undefined) {
return;
}
const {context, plugin} = pluginDetails;
- maybeDoPluginTraceUnload(pluginDetails);
+ await doPluginTraceUnload(pluginDetails);
plugin.onDeactivate && plugin.onDeactivate(context);
context.dispose();
- this.plugins.delete(id);
+ this._plugins.delete(id);
+
+ raf.scheduleFullRedraw();
+ }
+
+ /**
+ * Restore all plugins enable/disabled flags to their default values.
+ * @param now Optional: Also activates/deactivates plugins to match flag
+ * settings.
+ */
+ async restoreDefaults(now?: boolean): Promise<void> {
+ for (const plugin of pluginRegistry.values()) {
+ const pluginId = plugin.pluginId;
+ const flag = assertExists(this.flags.get(pluginId));
+ flag.reset();
+ if (now) {
+ if (flag.get()) {
+ await this.activatePlugin(plugin.pluginId);
+ } else {
+ await this.deactivatePlugin(plugin.pluginId);
+ }
+ }
+ }
}
isActive(pluginId: string): boolean {
return this.getPluginContext(pluginId) !== undefined;
}
+ isEnabled(pluginId: string): boolean {
+ return Boolean(this.flags.get(pluginId)?.get());
+ }
+
getPluginContext(pluginId: string): PluginDetails|undefined {
- return this.plugins.get(pluginId);
+ return this._plugins.get(pluginId);
}
async onTraceLoad(engine: Engine): Promise<void> {
this.engine = engine;
- const plugins = Array.from(this.plugins.entries());
- const promises = plugins.map(([id, pluginDetails]) => {
- return this.doPluginTraceLoad(pluginDetails, engine, id);
- });
- await Promise.all(promises);
+ const plugins = Array.from(this._plugins.entries());
+ // Awaiting all plugins in parallel will skew timing data as later plugins
+ // will spend most of their time waiting for earlier plugins to load.
+ // Running in parallel will have very little performance benefit assuming
+ // most plugins use the same engine, which can only process one query at a
+ // time.
+ for (const [id, pluginDetails] of plugins) {
+ await doPluginTraceLoad(pluginDetails, engine, id);
+ }
}
onTraceClose() {
- for (const pluginDetails of this.plugins.values()) {
- maybeDoPluginTraceUnload(pluginDetails);
+ for (const pluginDetails of this._plugins.values()) {
+ doPluginTraceUnload(pluginDetails);
}
this.engine = undefined;
}
metricVisualisations(): MetricVisualisation[] {
- return Array.from(this.plugins.values()).flatMap((ctx) => {
+ return Array.from(this._plugins.values()).flatMap((ctx) => {
const tracePlugin = ctx.plugin;
if (tracePlugin.metricVisualisations) {
return tracePlugin.metricVisualisations(ctx.context);
@@ -428,28 +527,35 @@
}
});
}
-
- private async doPluginTraceLoad(
- pluginDetails: PluginDetails, engine: Engine,
- pluginId: string): Promise<void> {
- const {plugin, context} = pluginDetails;
-
- const engineProxy = engine.getProxy(pluginId);
-
- const traceCtx = new PluginContextTraceImpl(context, engineProxy);
- pluginDetails.traceContext = traceCtx;
-
- const result = plugin.onTraceLoad?.(traceCtx);
- return Promise.resolve(result);
- }
}
-function maybeDoPluginTraceUnload(pluginDetails: PluginDetails): void {
+async function doPluginTraceLoad(
+ pluginDetails: PluginDetails,
+ engine: Engine,
+ pluginId: string): Promise<void> {
+ const {plugin, context} = pluginDetails;
+
+ const engineProxy = engine.getProxy(pluginId);
+
+ const traceCtx = new PluginContextTraceImpl(context, engineProxy);
+ pluginDetails.traceContext = traceCtx;
+
+ const startTime = performance.now();
+ const result = await Promise.resolve(plugin.onTraceLoad?.(traceCtx));
+ const loadTime = performance.now() - startTime;
+ pluginDetails.previousOnTraceLoadTimeMillis = loadTime;
+
+ raf.scheduleFullRedraw();
+
+ return result;
+}
+
+async function doPluginTraceUnload(
+ pluginDetails: PluginDetails): Promise<void> {
const {traceContext, plugin} = pluginDetails;
if (traceContext) {
- // TODO(stevegolton): Await onTraceUnload.
- plugin.onTraceUnload && plugin.onTraceUnload(traceContext);
+ plugin.onTraceUnload && await plugin.onTraceUnload(traceContext);
traceContext.dispose();
pluginDetails.traceContext = undefined;
}
diff --git a/ui/src/common/plugins_unittest.ts b/ui/src/common/plugins_unittest.ts
index 05238a5..55fc82d 100644
--- a/ui/src/common/plugins_unittest.ts
+++ b/ui/src/common/plugins_unittest.ts
@@ -37,11 +37,8 @@
const engine = new FakeEngine();
globals.initStore(createEmptyState());
-// We use `any` here to avoid checking possibly undefined types in tests.
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-let mockPlugin: any;
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-let manager: any;
+let mockPlugin: Plugin;
+let manager: PluginManager;
describe('PluginManger', () => {
beforeEach(() => {
@@ -54,39 +51,39 @@
manager = new PluginManager(registry);
});
- it('can activate plugin', () => {
- manager.activatePlugin('foo');
+ it('can activate plugin', async () => {
+ await manager.activatePlugin('foo');
expect(manager.isActive('foo')).toBe(true);
expect(mockPlugin.onActivate).toHaveBeenCalledTimes(1);
});
- it('can deactivate plugin', () => {
- manager.activatePlugin('foo');
- manager.deactivatePlugin('foo');
+ it('can deactivate plugin', async () => {
+ await manager.activatePlugin('foo');
+ await manager.deactivatePlugin('foo');
expect(manager.isActive('foo')).toBe(false);
expect(mockPlugin.onDeactivate).toHaveBeenCalledTimes(1);
});
- it('invokes onTraceLoad when trace is loaded', () => {
- manager.activatePlugin('foo');
- manager.onTraceLoad(engine);
+ it('invokes onTraceLoad when trace is loaded', async () => {
+ await manager.activatePlugin('foo');
+ await manager.onTraceLoad(engine);
expect(mockPlugin.onTraceLoad).toHaveBeenCalledTimes(1);
});
- it('invokes onTraceLoad when plugin activated while trace loaded', () => {
- manager.onTraceLoad(engine);
- manager.activatePlugin('foo');
+ it('invokes onTraceLoad when plugin activated while trace loaded', async () => {
+ await manager.onTraceLoad(engine);
+ await manager.activatePlugin('foo');
expect(mockPlugin.onTraceLoad).toHaveBeenCalledTimes(1);
});
- it('invokes onTraceUnload when plugin deactivated while trace loaded', () => {
- manager.activatePlugin('foo');
- manager.onTraceLoad(engine);
- manager.deactivatePlugin('foo');
+ it('invokes onTraceUnload when plugin deactivated while trace loaded', async () => {
+ await manager.activatePlugin('foo');
+ await manager.onTraceLoad(engine);
+ await manager.deactivatePlugin('foo');
expect(mockPlugin.onTraceUnload).toHaveBeenCalledTimes(1);
});
diff --git a/ui/src/common/state.ts b/ui/src/common/state.ts
index 777724b..379104a 100644
--- a/ui/src/common/state.ts
+++ b/ui/src/common/state.ts
@@ -131,8 +131,9 @@
// 41. Ported all remaining tracks.
// 42. Rename trackId -> trackKey.
// 43. Remove visibleTracks.
-// 44. Add TabsV2 state
-export const STATE_VERSION = 44;
+// 44. Add TabsV2 state.
+// 45. Remove v1 tracks.
+export const STATE_VERSION = 45;
export const SCROLLING_TRACK_GROUP = 'ScrollingTracks';
diff --git a/ui/src/common/tab_registry.ts b/ui/src/common/tab_registry.ts
index e9493de..038695d 100644
--- a/ui/src/common/tab_registry.ts
+++ b/ui/src/common/tab_registry.ts
@@ -26,6 +26,7 @@
*/
export class TabManager implements Disposable {
private _registry = new Map<string, TabDescriptor>();
+ private _defaultTabs = new Set<string>();
private _detailsPanelsRegistry = new Set<DetailsPanel>();
private _currentTabs = new Map<string, TabDescriptor>();
@@ -44,6 +45,13 @@
});
}
+ addDefaultTab(uri: string): Disposable {
+ this._defaultTabs.add(uri);
+ return new DisposableCallback(() => {
+ this._defaultTabs.delete(uri);
+ });
+ }
+
registerDetailsPanel(section: DetailsPanel): Disposable {
this._detailsPanelsRegistry.add(section);
return new DisposableCallback(() => {
@@ -59,6 +67,10 @@
return Array.from(this._registry.values());
}
+ get defaultTabs(): string[] {
+ return Array.from(this._defaultTabs);
+ }
+
get detailsPanels(): DetailsPanel[] {
return Array.from(this._detailsPanelsRegistry);
}
diff --git a/ui/src/controller/aggregation/slice_aggregation_controller.ts b/ui/src/controller/aggregation/slice_aggregation_controller.ts
index baf2057..6208594 100644
--- a/ui/src/controller/aggregation/slice_aggregation_controller.ts
+++ b/ui/src/controller/aggregation/slice_aggregation_controller.ts
@@ -16,9 +16,7 @@
import {Area, Sorting} from '../../common/state';
import {globals} from '../../frontend/globals';
import {Engine} from '../../trace_processor/engine';
-import {
- ASYNC_SLICE_TRACK_KIND,
-} from '../../tracks/async_slices/async_slice_track';
+import {ASYNC_SLICE_TRACK_KIND} from '../../tracks/async_slices';
import {SLICE_TRACK_KIND} from '../../tracks/chrome_slices';
import {AggregationController} from './aggregation_controller';
diff --git a/ui/src/controller/trace_controller.ts b/ui/src/controller/trace_controller.ts
index b5c6994..ad92b2f 100644
--- a/ui/src/controller/trace_controller.ts
+++ b/ui/src/controller/trace_controller.ts
@@ -523,6 +523,8 @@
}
}
+ this.decideTabs();
+
await this.listThreads();
await this.loadTimelineOverview(traceTime);
@@ -757,6 +759,13 @@
globals.dispatchMultiple(actions);
}
+ // Show the list of default tabs, but don't make them active!
+ private decideTabs() {
+ for (const tabUri of globals.tabManager.defaultTabs) {
+ globals.dispatch(Actions.showTab({uri: tabUri}));
+ }
+ }
+
private async listThreads() {
this.updateStatus('Reading thread list');
const query = `select
diff --git a/ui/src/controller/track_decider.ts b/ui/src/controller/track_decider.ts
index 13ba2f1..c3f0cbe 100644
--- a/ui/src/controller/track_decider.ts
+++ b/ui/src/controller/track_decider.ts
@@ -27,8 +27,8 @@
TrackSortKey,
UtidToTrackSortKey,
} from '../common/state';
-import {featureFlags, PERF_SAMPLE_FLAG} from '../core/feature_flags';
import {globals} from '../frontend/globals';
+import {PERF_SAMPLE_FLAG} from '../core/feature_flags';
import {PrimaryTrackSortKey} from '../public';
import {getTrackName} from '../public/utils';
import {Engine, EngineProxy} from '../trace_processor/engine';
@@ -38,7 +38,7 @@
STR,
STR_NULL,
} from '../trace_processor/query_result';
-import {ASYNC_SLICE_TRACK_KIND} from '../tracks/async_slices/async_slice_track';
+import {ASYNC_SLICE_TRACK_KIND} from '../tracks/async_slices';
import {
ENABLE_SCROLL_JANK_PLUGIN_V2,
getScrollJankTracks,
@@ -58,29 +58,6 @@
} from '../tracks/screenshots';
import {THREAD_STATE_TRACK_KIND} from '../tracks/thread_state';
-const TRACKS_V2_FLAG = featureFlags.register({
- id: 'tracksV2.2',
- name: 'Tracks V2',
- description: '[WARNING SOON TO BE REMOVED] Show tracks built on top of the Track V2 API.',
- defaultValue: true,
-});
-
-const TRACKS_V2_COMPARE_FLAG = featureFlags.register({
- id: 'tracksV2Compare',
- name: 'Tracks V2: Also show V1 tracks',
- description:
- 'Show V1 tracks side by side with V2 tracks. Does nothing if TracksV2 is not enabled.',
- defaultValue: false,
-});
-
-function showV2(): boolean {
- return TRACKS_V2_FLAG.get();
-}
-
-function showV1(): boolean {
- return !showV2() || (showV2() && TRACKS_V2_COMPARE_FLAG.get());
-}
-
const MEM_DMA_COUNTER_NAME = 'mem.dma_heap';
const MEM_DMA = 'mem.dma_buffer';
const MEM_ION = 'mem.ion';
@@ -290,25 +267,14 @@
}
}
- if (showV1()) {
- const track: AddTrackArgs = {
- uri: `perfetto.AsyncSlices#${rawName}.${it.parentId}`,
- trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
- trackGroup,
- name,
- };
- this.tracksToAdd.push(track);
- }
+ const track: AddTrackArgs = {
+ uri: `perfetto.AsyncSlices#${rawName}.${it.parentId}`,
+ trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
+ trackGroup,
+ name,
+ };
- if (showV2()) {
- const track: AddTrackArgs = {
- uri: `perfetto.AsyncSlices#${rawName}.${it.parentId}.v2`,
- trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
- trackGroup,
- name,
- };
- this.tracksToAdd.push(track);
- }
+ this.tracksToAdd.push(track);
}
}
@@ -837,29 +803,15 @@
const name =
getTrackName({utid, tid, threadName, kind: THREAD_STATE_TRACK_KIND});
- if (showV1()) {
- this.tracksToAdd.push({
- uri: `perfetto.ThreadState#${upid}.${utid}`,
- name,
- trackGroup: uuid,
- trackSortKey: {
- utid,
- priority,
- },
- });
- }
-
- if (showV2()) {
- this.tracksToAdd.push({
- uri: `perfetto.ThreadState#${utid}.v2`,
- name,
- trackGroup: uuid,
- trackSortKey: {
- utid,
- priority,
- },
- });
- }
+ this.tracksToAdd.push({
+ uri: `perfetto.ThreadState#${utid}`,
+ name,
+ trackGroup: uuid,
+ trackSortKey: {
+ utid,
+ priority,
+ },
+ });
}
}
@@ -1008,23 +960,12 @@
kind: ASYNC_SLICE_TRACK_KIND,
});
- if (showV1()) {
- this.tracksToAdd.push({
- uri: `perfetto.AsyncSlices#process.${pid}${rawTrackIds}`,
- name,
- trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
- trackGroup: uuid,
- });
- }
-
- if (showV2()) {
- this.tracksToAdd.push({
- uri: `perfetto.AsyncSlices#process.${pid}${rawTrackIds}.v2`,
- name,
- trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
- trackGroup: uuid,
- });
- }
+ this.tracksToAdd.push({
+ uri: `perfetto.AsyncSlices#process.${pid}${rawTrackIds}`,
+ name,
+ trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
+ trackGroup: uuid,
+ });
}
}
@@ -1089,23 +1030,12 @@
groupMap.set(rawName, [groupUuid, summaryTrackKey]);
}
- if (showV1()) {
- this.tracksToAdd.push({
- uri: `perfetto.AsyncSlices#${rawName}.${uid}`,
- name: userName,
- trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
- trackGroup: groupUuid,
- });
- }
-
- if (showV2()) {
- this.tracksToAdd.push({
- uri: `perfetto.AsyncSlices#${rawName}.${uid}.v2`,
- name: userName,
- trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
- trackGroup: groupUuid,
- });
- }
+ this.tracksToAdd.push({
+ uri: `perfetto.AsyncSlices#${rawName}.${uid}`,
+ name: userName,
+ trackSortKey: PrimaryTrackSortKey.ASYNC_SLICE_TRACK,
+ trackGroup: groupUuid,
+ });
}
for (const [name, [groupUuid, summaryTrackKey]] of groupMap) {
@@ -1167,23 +1097,12 @@
const name =
getTrackName({name: trackName, upid, pid, processName, kind});
- if (showV1()) {
- this.tracksToAdd.push({
- uri: `perfetto.ActualFrames#${upid}`,
- name,
- trackSortKey: PrimaryTrackSortKey.ACTUAL_FRAMES_SLICE_TRACK,
- trackGroup: uuid,
- });
- }
-
- if (showV2()) {
- this.tracksToAdd.push({
- uri: `perfetto.ActualFrames#${upid}.v2`,
- name,
- trackSortKey: PrimaryTrackSortKey.ACTUAL_FRAMES_SLICE_TRACK,
- trackGroup: uuid,
- });
- }
+ this.tracksToAdd.push({
+ uri: `perfetto.ActualFrames#${upid}`,
+ name,
+ trackSortKey: PrimaryTrackSortKey.ACTUAL_FRAMES_SLICE_TRACK,
+ trackGroup: uuid,
+ });
}
}
@@ -1236,23 +1155,12 @@
const name =
getTrackName({name: trackName, upid, pid, processName, kind});
- if (showV1()) {
- this.tracksToAdd.push({
- uri: `perfetto.ExpectedFrames#${upid}`,
- name,
- trackSortKey: PrimaryTrackSortKey.EXPECTED_FRAMES_SLICE_TRACK,
- trackGroup: uuid,
- });
- }
-
- if (showV2()) {
- this.tracksToAdd.push({
- uri: `perfetto.ExpectedFrames#${upid}.v2`,
- name,
- trackSortKey: PrimaryTrackSortKey.EXPECTED_FRAMES_SLICE_TRACK,
- trackGroup: uuid,
- });
- }
+ this.tracksToAdd.push({
+ uri: `perfetto.ExpectedFrames#${upid}`,
+ name,
+ trackSortKey: PrimaryTrackSortKey.EXPECTED_FRAMES_SLICE_TRACK,
+ trackGroup: uuid,
+ });
}
}
@@ -1298,33 +1206,18 @@
const kind = SLICE_TRACK_KIND;
const name = getTrackName({name: trackName, utid, tid, threadName, kind});
- if (showV1()) {
- this.tracksToAdd.push({
- uri: `perfetto.ChromeSlices#${trackId}`,
- name,
- trackGroup: uuid,
- trackSortKey: {
- utid,
- priority: isDefaultTrackForScope ?
- InThreadTrackSortKey.DEFAULT_TRACK :
- InThreadTrackSortKey.ORDINARY,
- },
- });
- }
- if (showV2()) {
- this.tracksToAdd.push({
- uri: `perfetto.ChromeSlices#${trackId}.v2`,
- name,
- trackGroup: uuid,
- trackSortKey: {
- utid,
- priority: isDefaultTrackForScope ?
- InThreadTrackSortKey.DEFAULT_TRACK :
- InThreadTrackSortKey.ORDINARY,
- },
- });
- }
+ this.tracksToAdd.push({
+ uri: `perfetto.ChromeSlices#${trackId}`,
+ name,
+ trackGroup: uuid,
+ trackSortKey: {
+ utid,
+ priority: isDefaultTrackForScope ?
+ InThreadTrackSortKey.DEFAULT_TRACK :
+ InThreadTrackSortKey.ORDINARY,
+ },
+ });
}
}
diff --git a/ui/src/core/feature_flags.ts b/ui/src/core/feature_flags.ts
index f00d535..5fec7bb 100644
--- a/ui/src/core/feature_flags.ts
+++ b/ui/src/core/feature_flags.ts
@@ -249,5 +249,5 @@
id: 'tabsv2',
name: 'Tabs V2',
description: 'Use Tabs V2',
- defaultValue: false,
+ defaultValue: true,
});
diff --git a/ui/src/frontend/aggregation_tab.ts b/ui/src/frontend/aggregation_tab.ts
index 0db524e..603599d 100644
--- a/ui/src/frontend/aggregation_tab.ts
+++ b/ui/src/frontend/aggregation_tab.ts
@@ -26,6 +26,7 @@
import {Icons} from '../base/semantic_icons';
import {Tree, TreeNode} from '../widgets/tree';
import {Timestamp} from './widgets/timestamp';
+import {PIVOT_TABLE_REDUX_FLAG} from '../controller/pivot_table_controller';
interface AreaDetailsPanelAttrs {
selection: AreaSelection;
@@ -96,6 +97,21 @@
'Flow Events'),
}));
+ if (PIVOT_TABLE_REDUX_FLAG.get()) {
+ linkNodes.push(m(TreeNode, {
+ left: m(
+ Anchor,
+ {
+ icon: Icons.ChangeTab,
+ onclick: () => {
+ globals.dispatch(
+ Actions.showTab({uri: 'perfetto.PivotTable#PivotTable'}));
+ },
+ },
+ 'Pivot Table'),
+ }));
+ }
+
if (linkNodes.length === 0) return undefined;
return m(Section,
@@ -148,7 +164,12 @@
uri,
isEphemeral: false,
content: {
- getTitle: () => `Aggregation: ${title}`,
+ hasContent: () => {
+ const data = globals.aggregateDataStore.get(type);
+ const hasData = Boolean(data && !isEmptyData(data));
+ return hasData;
+ },
+ getTitle: () => title,
render: () => {
const data = globals.aggregateDataStore.get(type);
return m(AggregationPanel, {kind: type, data});
diff --git a/ui/src/frontend/drag_handle.ts b/ui/src/frontend/drag_handle.ts
index e3da5ce..4ba4220 100644
--- a/ui/src/frontend/drag_handle.ts
+++ b/ui/src/frontend/drag_handle.ts
@@ -31,7 +31,7 @@
key: string;
// Tab title to show on the tab handle.
- title: string;
+ title: m.Children;
// Whether to show a close button on the tab handle or not.
// Default = false.
diff --git a/ui/src/frontend/index.ts b/ui/src/frontend/index.ts
index c9d0ab8..623017c 100644
--- a/ui/src/frontend/index.ts
+++ b/ui/src/frontend/index.ts
@@ -23,7 +23,7 @@
import {addErrorHandler, reportError} from '../base/logging';
import {Actions, DeferredAction, StateActions} from '../common/actions';
import {flattenArgs, traceEvent} from '../common/metatracing';
-import {pluginManager, pluginRegistry} from '../common/plugins';
+import {pluginManager} from '../common/plugins';
import {State} from '../common/state';
import {initController, runControllers} from '../controller';
import {
@@ -321,20 +321,7 @@
document.body.classList.add('testing');
}
- for (const plugin of pluginRegistry.values()) {
- const id = `plugin_${plugin.pluginId}`;
- const name = `Plugin: ${plugin.pluginId}`;
- const flag = featureFlags.register({
- id,
- name,
- description: `Overrides '${id}' plugin.`,
- defaultValue: true,
- });
-
- if (flag.get()) {
- pluginManager.activatePlugin(plugin.pluginId);
- }
- }
+ pluginManager.initialize();
}
function onCssLoaded() {
diff --git a/ui/src/frontend/plugins_page.ts b/ui/src/frontend/plugins_page.ts
index c75a4a6..dd84526 100644
--- a/ui/src/frontend/plugins_page.ts
+++ b/ui/src/frontend/plugins_page.ts
@@ -16,10 +16,12 @@
import {pluginManager, pluginRegistry} from '../common/plugins';
import {raf} from '../core/raf_scheduler';
-import {PluginDescriptor} from '../public';
import {Button} from '../widgets/button';
+import {exists} from '../base/utils';
+import {PluginDescriptor} from '../public';
import {createPage} from './pages';
+import {defaultPlugins} from '../common/default_plugins';
export const PluginsPage = createPage({
view() {
@@ -30,27 +32,43 @@
'.pf-plugins-topbar',
m(Button, {
minimal: false,
- label: 'Deactivate All',
- onclick: () => {
+ label: 'Disable All',
+ onclick: async () => {
for (const plugin of pluginRegistry.values()) {
- pluginManager.deactivatePlugin(plugin.pluginId);
+ await pluginManager.disablePlugin(plugin.pluginId, true);
+ raf.scheduleFullRedraw();
}
- raf.scheduleFullRedraw();
},
}),
m(Button, {
minimal: false,
- label: 'Activate All',
- onclick: () => {
+ label: 'Enable All',
+ onclick: async () => {
for (const plugin of pluginRegistry.values()) {
- pluginManager.activatePlugin(plugin.pluginId);
+ await pluginManager.enablePlugin(plugin.pluginId, true);
+ raf.scheduleFullRedraw();
}
+ },
+ }),
+ m(Button, {
+ minimal: false,
+ label: 'Restore Defaults',
+ onclick: async () => {
+ await pluginManager.restoreDefaults(true);
raf.scheduleFullRedraw();
},
}),
),
m(
'.pf-plugins-grid',
+ [
+ m('span', 'Plugin'),
+ m('span', 'Default?'),
+ m('span', 'Enabled?'),
+ m('span', 'Active?'),
+ m('span', 'Control'),
+ m('span', 'Load Time'),
+ ],
Array.from(pluginRegistry.values()).map((plugin) => {
return renderPluginRow(plugin);
}),
@@ -59,21 +77,32 @@
});
function renderPluginRow(plugin: PluginDescriptor): m.Children {
- const isActive = pluginManager.isActive(plugin.pluginId);
+ const pluginId = plugin.pluginId;
+ const isDefault = defaultPlugins.includes(pluginId);
+ const pluginDetails = pluginManager.plugins.get(pluginId);
+ const isActive = pluginManager.isActive(pluginId);
+ const isEnabled = pluginManager.isEnabled(pluginId);
+ const loadTime = pluginDetails?.previousOnTraceLoadTimeMillis;
return [
- plugin.pluginId,
+ m('span', pluginId),
+ m('span', isDefault ? 'Yes' : 'No'),
+ isEnabled ? m('.pf-tag.pf-active', 'Enabled') :
+ m('.pf-tag.pf-inactive', 'Disabled'),
isActive ? m('.pf-tag.pf-active', 'Active') :
m('.pf-tag.pf-inactive', 'Inactive'),
m(Button, {
- label: isActive ? 'Deactivate' : 'Activate',
- onclick: () => {
+ label: isActive ? 'Disable' : 'Enable',
+ onclick: async () => {
if (isActive) {
- pluginManager.deactivatePlugin(plugin.pluginId);
+ await pluginManager.disablePlugin(pluginId, true);
} else {
- pluginManager.activatePlugin(plugin.pluginId);
+ await pluginManager.enablePlugin(pluginId, true);
}
raf.scheduleFullRedraw();
},
}),
+ exists(loadTime) ?
+ m('span', `${loadTime.toFixed(1)} ms`) :
+ m('span', `-`),
];
}
diff --git a/ui/src/frontend/tab_panel.ts b/ui/src/frontend/tab_panel.ts
index 73cfa16..130a494 100644
--- a/ui/src/frontend/tab_panel.ts
+++ b/ui/src/frontend/tab_panel.ts
@@ -44,10 +44,13 @@
const resolvedTabs = tabMan.resolveTabs(tabList);
const tabs = resolvedTabs.map(({uri, tab: tabDesc}): TabWithContent => {
if (tabDesc) {
+ const titleStr = tabDesc.content.getTitle();
return {
key: uri,
hasCloseButton: true,
- title: tabDesc.content.getTitle(),
+ title: (tabDesc.content.hasContent?.() ?? true) ?
+ titleStr :
+ m('.pf-nocontent', titleStr),
content: tabDesc.content.render(),
};
} else {
diff --git a/ui/src/frontend/track_panel.ts b/ui/src/frontend/track_panel.ts
index dad4861..da06f31 100644
--- a/ui/src/frontend/track_panel.ts
+++ b/ui/src/frontend/track_panel.ts
@@ -323,7 +323,10 @@
// TODO(hjd): The min height below must match the track_shell_title
// max height in common.scss so we should read it from CSS to avoid
// them going out of sync.
- const height = Math.max(24, attrs.heightPx ?? 0);
+ const TRACK_HEIGHT_MIN_PX = 18;
+ const TRACK_HEIGHT_DEFAULT_PX = 24;
+ const trackHeightRaw = attrs.heightPx ?? TRACK_HEIGHT_DEFAULT_PX;
+ const trackHeight = Math.max(trackHeightRaw, TRACK_HEIGHT_MIN_PX);
return m(
'.track',
@@ -331,7 +334,7 @@
style: {
// Note: Sub-pixel track heights can mess with sticky elements.
// Round up to the nearest integer number of pixels.
- height: `${Math.ceil(height)}px`,
+ height: `${Math.ceil(trackHeight)}px`,
},
id: 'track_' + attrs.trackKey,
},
diff --git a/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts b/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts
index fa9624a..d3216df 100644
--- a/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts
+++ b/ui/src/plugins/dev.perfetto.AndroidLongBatteryTracing/index.ts
@@ -259,7 +259,7 @@
const SCREEN_STATE = `
WITH _counter AS (
- SELECT *
+ SELECT counter.id, ts, 0 AS track_id, value
FROM counter
JOIN counter_track ON counter_track.id = counter.track_id
WHERE name = 'ScreenState'
@@ -279,7 +279,7 @@
// they transition.
const DOZE_LIGHT = `
WITH _counter AS (
- SELECT *
+ SELECT counter.id, ts, 0 AS track_id, value
FROM counter
JOIN counter_track ON counter_track.id = counter.track_id
WHERE name = 'DozeLightState'
@@ -300,7 +300,7 @@
const DOZE_DEEP = `
WITH _counter AS (
- SELECT *
+ SELECT counter.id, ts, 0 AS track_id, value
FROM counter
JOIN counter_track ON counter_track.id = counter.track_id
WHERE name = 'DozeDeepState'
@@ -323,7 +323,7 @@
const CHARGING = `
WITH _counter AS (
- SELECT *
+ SELECT counter.id, ts, 0 AS track_id, value
FROM counter
JOIN counter_track ON counter_track.id = counter.track_id
WHERE name = 'BatteryStatus'
diff --git a/ui/src/plugins/dev.perfetto.BookmarkletApi/OWNERS b/ui/src/plugins/dev.perfetto.BookmarkletApi/OWNERS
new file mode 100644
index 0000000..888f192
--- /dev/null
+++ b/ui/src/plugins/dev.perfetto.BookmarkletApi/OWNERS
@@ -0,0 +1,2 @@
+hjd@google.com
+stevegolton@google.com
diff --git a/ui/src/plugins/dev.perfetto.BookmarkletApi/index.ts b/ui/src/plugins/dev.perfetto.BookmarkletApi/index.ts
new file mode 100644
index 0000000..767e29d
--- /dev/null
+++ b/ui/src/plugins/dev.perfetto.BookmarkletApi/index.ts
@@ -0,0 +1,52 @@
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import {
+ Plugin,
+ PluginContext,
+ PluginContextTrace,
+ PluginDescriptor,
+} from '../../public';
+
+declare global {
+ interface Window {
+ ctx: PluginContext | PluginContextTrace | undefined;
+ }
+}
+
+class BookmarkletApi implements Plugin {
+ private pluginCtx?: PluginContext;
+
+ onActivate(pluginCtx: PluginContext): void {
+ this.pluginCtx = pluginCtx;
+ window.ctx = pluginCtx;
+ }
+
+ async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
+ window.ctx = ctx;
+ }
+
+ async onTraceUnload(_: PluginContextTrace): Promise<void> {
+ window.ctx = this.pluginCtx;
+ }
+
+ onDeactivate(_: PluginContext): void {
+ window.ctx = undefined;
+ }
+}
+
+export const plugin: PluginDescriptor = {
+ pluginId: 'dev.perfetto.BookmarkletApi',
+ plugin: BookmarkletApi,
+};
diff --git a/ui/src/public/index.ts b/ui/src/public/index.ts
index 174e49b..7d9e1bd 100644
--- a/ui/src/public/index.ts
+++ b/ui/src/public/index.ts
@@ -312,6 +312,7 @@
}
export interface Tab {
+ hasContent?(): boolean;
render(): m.Children;
getTitle(): string;
}
@@ -406,6 +407,9 @@
// is deactivated or when the trace is unloaded.
registerTab(tab: TabDescriptor): void;
+ // Suggest that a tab should be shown immediately.
+ addDefaultTab(uri: string): void;
+
// Register a hook into the current selection tab rendering logic that allows
// customization of the current selection tab content.
registerDetailsPanel(sel: DetailsPanel): void;
diff --git a/ui/src/tracks/android_log/index.ts b/ui/src/tracks/android_log/index.ts
index 212d1cc..cdef7ff 100644
--- a/ui/src/tracks/android_log/index.ts
+++ b/ui/src/tracks/android_log/index.ts
@@ -152,8 +152,8 @@
async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
const result =
await ctx.engine.query(`select count(1) as cnt from android_logs`);
- const count = result.firstRow({cnt: NUM}).cnt;
- if (count > 0) {
+ const logCount = result.firstRow({cnt: NUM}).cnt;
+ if (logCount > 0) {
ctx.registerTrack({
uri: 'perfetto.AndroidLog',
displayName: 'Android logs',
@@ -174,6 +174,10 @@
},
});
+ if (logCount > 0) {
+ ctx.addDefaultTab(androidLogsTabUri);
+ }
+
ctx.registerCommand({
id: 'perfetto.AndroidLog#ShowLogsTab',
name: 'Show Android Logs Tab',
diff --git a/ui/src/tracks/async_slices/async_slice_track.ts b/ui/src/tracks/async_slices/async_slice_track.ts
deleted file mode 100644
index b5d33e7..0000000
--- a/ui/src/tracks/async_slices/async_slice_track.ts
+++ /dev/null
@@ -1,119 +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 {BigintMath as BIMath} from '../../base/bigint_math';
-import {duration, time} from '../../base/time';
-import {SliceData, SliceTrackLEGACY} from '../../frontend/slice_track';
-import {EngineProxy} from '../../public';
-import {
- LONG,
- LONG_NULL,
- NUM,
- STR,
-} from '../../trace_processor/query_result';
-
-export const ASYNC_SLICE_TRACK_KIND = 'AsyncSliceTrack';
-
-export class AsyncSliceTrack extends SliceTrackLEGACY {
- private maxDurNs: duration = 0n;
-
- constructor(
- private engine: EngineProxy, maxDepth: number, trackKey: string,
- private trackIds: number[], namespace?: string) {
- // TODO is 'slice' right here?
- super(maxDepth, trackKey, 'slice', namespace);
- }
-
- async onBoundsChange(start: time, end: time, resolution: duration):
- Promise<SliceData> {
- if (this.maxDurNs === 0n) {
- const maxDurResult = await this.engine.query(`
- select max(iif(dur = -1, (SELECT end_ts FROM trace_bounds) - ts,
- dur)) as maxDur from experimental_slice_layout where filter_track_ids
- = '${this.trackIds.join(',')}'
- `);
- this.maxDurNs = maxDurResult.firstRow({maxDur: LONG_NULL}).maxDur ?? 0n;
- }
-
- const queryRes = await this.engine.query(`
- SELECT
- (ts + ${resolution / 2n}) / ${resolution} * ${resolution} as tsq,
- ts,
- max(iif(dur = -1, (SELECT end_ts FROM trace_bounds) - ts, dur)) as
- dur, layout_depth as depth, ifnull(name, '[null]') as name, id, dur =
- 0 as isInstant, dur = -1 as isIncomplete
- from experimental_slice_layout
- where
- filter_track_ids = '${this.trackIds.join(',')}' and
- ts >= ${start - this.maxDurNs} and
- ts <= ${end}
- group by tsq, layout_depth
- order by tsq, layout_depth
- `);
-
- const numRows = queryRes.numRows();
- const slices: SliceData = {
- start,
- end,
- resolution,
- length: numRows,
- strings: [],
- sliceIds: new Float64Array(numRows),
- starts: new BigInt64Array(numRows),
- ends: new BigInt64Array(numRows),
- depths: new Uint16Array(numRows),
- titles: new Uint16Array(numRows),
- isInstant: new Uint16Array(numRows),
- isIncomplete: new Uint16Array(numRows),
- };
-
- const stringIndexes = new Map<string, number>();
- function internString(str: string) {
- let idx = stringIndexes.get(str);
- if (idx !== undefined) return idx;
- idx = slices.strings.length;
- slices.strings.push(str);
- stringIndexes.set(str, idx);
- return idx;
- }
-
- const it = queryRes.iter({
- tsq: LONG,
- ts: LONG,
- dur: LONG,
- depth: NUM,
- name: STR,
- id: NUM,
- isInstant: NUM,
- isIncomplete: NUM,
- });
- for (let row = 0; it.valid(); it.next(), row++) {
- const startQ = it.tsq;
- const start = it.ts;
- const dur = it.dur;
- const end = start + dur;
- const minEnd = startQ + resolution;
- const endQ = BIMath.max(BIMath.quant(end, resolution), minEnd);
-
- slices.starts[row] = startQ;
- slices.ends[row] = endQ;
- slices.depths[row] = it.depth;
- slices.titles[row] = internString(it.name);
- slices.sliceIds[row] = it.id;
- slices.isInstant[row] = it.isInstant;
- slices.isIncomplete[row] = it.isIncomplete;
- }
- return slices;
- }
-}
diff --git a/ui/src/tracks/async_slices/index.ts b/ui/src/tracks/async_slices/index.ts
index 2a94887..40b018b 100644
--- a/ui/src/tracks/async_slices/index.ts
+++ b/ui/src/tracks/async_slices/index.ts
@@ -26,7 +26,6 @@
STR_NULL,
} from '../../trace_processor/query_result';
-import {AsyncSliceTrack} from './async_slice_track';
import {AsyncSliceTrackV2} from './async_slice_track_v2';
export const ASYNC_SLICE_TRACK_KIND = 'AsyncSliceTrack';
@@ -118,21 +117,6 @@
trackIds,
kind: ASYNC_SLICE_TRACK_KIND,
trackFactory: ({trackKey}) => {
- return new AsyncSliceTrack(
- engine,
- maxDepth,
- trackKey,
- trackIds,
- );
- },
- });
-
- ctx.registerTrack({
- uri: `perfetto.AsyncSlices#${rawName}.${it.parentId}.v2`,
- displayName,
- trackIds,
- kind: ASYNC_SLICE_TRACK_KIND,
- trackFactory: ({trackKey}) => {
return new AsyncSliceTrackV2(
{engine, trackKey},
maxDepth,
@@ -200,21 +184,6 @@
trackIds,
kind: ASYNC_SLICE_TRACK_KIND,
trackFactory: ({trackKey}) => {
- return new AsyncSliceTrack(
- ctx.engine,
- maxDepth,
- trackKey,
- trackIds,
- );
- },
- });
-
- ctx.registerTrack({
- uri: `perfetto.AsyncSlices#process.${pid}${rawTrackIds}.v2`,
- displayName,
- trackIds,
- kind: ASYNC_SLICE_TRACK_KIND,
- trackFactory: ({trackKey}) => {
return new AsyncSliceTrackV2(
{engine: ctx.engine, trackKey},
maxDepth,
@@ -291,21 +260,6 @@
trackIds,
kind: ASYNC_SLICE_TRACK_KIND,
trackFactory: ({trackKey}) => {
- return new AsyncSliceTrack(
- engine,
- maxDepth,
- trackKey,
- trackIds,
- );
- },
- });
-
- ctx.registerTrack({
- uri: `perfetto.AsyncSlices#${rawName}.${uid}.v2`,
- displayName,
- trackIds,
- kind: ASYNC_SLICE_TRACK_KIND,
- trackFactory: ({trackKey}) => {
return new AsyncSliceTrackV2(
{engine, trackKey},
maxDepth,
diff --git a/ui/src/tracks/chrome_scroll_jank/index.ts b/ui/src/tracks/chrome_scroll_jank/index.ts
index 3f603a5..bc92259 100644
--- a/ui/src/tracks/chrome_scroll_jank/index.ts
+++ b/ui/src/tracks/chrome_scroll_jank/index.ts
@@ -181,7 +181,8 @@
// Initialise the chrome_tasks_delaying_input_processing table. It will be
// used in the tracks above.
await ctx.engine.query(`
- select RUN_METRIC(
+ INCLUDE PERFETTO MODULE deprecated.v42.common.slices;
+ SELECT RUN_METRIC(
'chrome/chrome_tasks_delaying_input_processing.sql',
'duration_causing_jank_ms',
/* duration_causing_jank_ms = */ '8');`);
diff --git a/ui/src/tracks/chrome_slices/index.ts b/ui/src/tracks/chrome_slices/index.ts
index 06109fc..72b7f8a 100644
--- a/ui/src/tracks/chrome_slices/index.ts
+++ b/ui/src/tracks/chrome_slices/index.ts
@@ -270,23 +270,6 @@
trackIds: [trackId],
kind: SLICE_TRACK_KIND,
trackFactory: ({trackKey}) => {
- return new ChromeSliceTrack(
- engine,
- maxDepth,
- trackKey,
- trackId,
- );
- },
- });
-
- // trackIds can only be registered by one track at a time.
- // TODO(hjd): Move trackIds to only be on V2.
- ctx.registerTrack({
- uri: `perfetto.ChromeSlices#${trackId}.v2`,
- displayName,
- trackIds: [trackId],
- kind: SLICE_TRACK_KIND,
- trackFactory: ({trackKey}) => {
const newTrackArgs = {
engine: ctx.engine,
trackKey,
diff --git a/ui/src/tracks/frames/actual_frames_track.ts b/ui/src/tracks/frames/actual_frames_track.ts
deleted file mode 100644
index 79e742d..0000000
--- a/ui/src/tracks/frames/actual_frames_track.ts
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (C) 2023 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 {BigintMath as BIMath} from '../../base/bigint_math';
-import {duration, time} from '../../base/time';
-import {SliceData, SliceTrackLEGACY} from '../../frontend/slice_track';
-import {
- EngineProxy,
-} from '../../public';
-import {
- LONG,
- LONG_NULL,
- NUM,
- STR,
-} from '../../trace_processor/query_result';
-
-export const ACTUAL_FRAMES_SLICE_TRACK_KIND = 'ActualFramesSliceTrack';
-
-const BLUE_COLOR = '#03A9F4'; // Blue 500
-const GREEN_COLOR = '#4CAF50'; // Green 500
-const YELLOW_COLOR = '#FFEB3B'; // Yellow 500
-const RED_COLOR = '#FF5722'; // Red 500
-const LIGHT_GREEN_COLOR = '#C0D588'; // Light Green 500
-const PINK_COLOR = '#F515E0'; // Pink 500
-
-export class ActualFramesTrack extends SliceTrackLEGACY {
- private maxDur = 0n;
-
- constructor(
- private engine: EngineProxy, maxDepth: number, trackKey: string,
- private trackIds: number[], namespace?: string) {
- super(maxDepth, trackKey, 'actual_frame_timeline_slice', namespace);
- }
-
- async onBoundsChange(start: time, end: time, resolution: duration):
- Promise<SliceData> {
- if (this.maxDur === 0n) {
- const maxDurResult = await this.engine.query(`
- select
- max(iif(dur = -1, (SELECT end_ts FROM trace_bounds) - ts, dur))
- as maxDur
- from experimental_slice_layout
- where filter_track_ids = '${this.trackIds.join(',')}'
- `);
- this.maxDur = maxDurResult.firstRow({maxDur: LONG_NULL}).maxDur ?? 0n;
- }
-
- const rawResult = await this.engine.query(`
- SELECT
- (s.ts + ${resolution / 2n}) / ${resolution} * ${resolution} as tsq,
- s.ts as ts,
- max(iif(s.dur = -1, (SELECT end_ts FROM trace_bounds) - s.ts, s.dur))
- as dur,
- s.layout_depth as layoutDepth,
- s.name as name,
- s.id as id,
- s.dur = 0 as isInstant,
- s.dur = -1 as isIncomplete,
- CASE afs.jank_tag
- WHEN 'Self Jank' THEN '${RED_COLOR}'
- WHEN 'Other Jank' THEN '${YELLOW_COLOR}'
- WHEN 'Dropped Frame' THEN '${BLUE_COLOR}'
- WHEN 'Buffer Stuffing' THEN '${LIGHT_GREEN_COLOR}'
- WHEN 'SurfaceFlinger Stuffing' THEN '${LIGHT_GREEN_COLOR}'
- WHEN 'No Jank' THEN '${GREEN_COLOR}'
- ELSE '${PINK_COLOR}'
- END as color
- from experimental_slice_layout s
- join actual_frame_timeline_slice afs using(id)
- where
- filter_track_ids = '${this.trackIds.join(',')}' and
- s.ts >= ${start - this.maxDur} and
- s.ts <= ${end}
- group by tsq, s.layout_depth
- order by tsq, s.layout_depth
-`);
-
- const numRows = rawResult.numRows();
- const slices: SliceData = {
- start,
- end,
- resolution,
- length: numRows,
- strings: [],
- sliceIds: new Float64Array(numRows),
- starts: new BigInt64Array(numRows),
- ends: new BigInt64Array(numRows),
- depths: new Uint16Array(numRows),
- titles: new Uint16Array(numRows),
- colors: new Uint16Array(numRows),
- isInstant: new Uint16Array(numRows),
- isIncomplete: new Uint16Array(numRows),
- };
-
- const stringIndexes = new Map<string, number>();
- function internString(str: string) {
- let idx = stringIndexes.get(str);
- if (idx !== undefined) return idx;
- idx = slices.strings.length;
- slices.strings.push(str);
- stringIndexes.set(str, idx);
- return idx;
- }
-
- const it = rawResult.iter({
- 'tsq': LONG,
- 'ts': LONG,
- 'dur': LONG,
- 'layoutDepth': NUM,
- 'id': NUM,
- 'name': STR,
- 'isInstant': NUM,
- 'isIncomplete': NUM,
- 'color': STR,
- });
- for (let i = 0; it.valid(); i++, it.next()) {
- const startQ = it.tsq;
- const start = it.ts;
- const dur = it.dur;
- const end = start + dur;
- const minEnd = startQ + resolution;
- const endQ = BIMath.max(BIMath.quant(end, resolution), minEnd);
-
- slices.starts[i] = startQ;
- slices.ends[i] = endQ;
- slices.depths[i] = it.layoutDepth;
- slices.titles[i] = internString(it.name);
- slices.colors![i] = internString(it.color);
- slices.sliceIds[i] = it.id;
- slices.isInstant[i] = it.isInstant;
- slices.isIncomplete[i] = it.isIncomplete;
- }
- return slices;
- }
-}
diff --git a/ui/src/tracks/frames/expected_frames_track.ts b/ui/src/tracks/frames/expected_frames_track.ts
deleted file mode 100644
index 4e98b67..0000000
--- a/ui/src/tracks/frames/expected_frames_track.ts
+++ /dev/null
@@ -1,123 +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 {BigintMath as BIMath} from '../../base/bigint_math';
-import {Duration, duration, time} from '../../base/time';
-import {SliceData, SliceTrackLEGACY} from '../../frontend/slice_track';
-import {EngineProxy} from '../../public';
-import {
- LONG,
- LONG_NULL,
- NUM,
- STR,
-} from '../../trace_processor/query_result';
-
-export class ExpectedFramesTrack extends SliceTrackLEGACY {
- private maxDur = Duration.ZERO;
-
- constructor(
- private engine: EngineProxy, maxDepth: number, trackKey: string,
- private trackIds: number[], namespace?: string) {
- super(maxDepth, trackKey, '', namespace);
- }
-
- async onBoundsChange(start: time, end: time, resolution: duration):
- Promise<SliceData> {
- if (this.maxDur === Duration.ZERO) {
- const maxDurResult = await this.engine.query(`
- select max(iif(dur = -1, (SELECT end_ts FROM trace_bounds) - ts, dur))
- as maxDur
- from experimental_slice_layout
- where filter_track_ids = '${this.trackIds.join(',')}'
- `);
- this.maxDur = maxDurResult.firstRow({maxDur: LONG_NULL}).maxDur ?? 0n;
- }
-
- const queryRes = await this.engine.query(`
- SELECT
- (ts + ${resolution / 2n}) / ${resolution} * ${resolution} as tsq,
- ts,
- max(iif(dur = -1, (SELECT end_ts FROM trace_bounds) - ts, dur)) as dur,
- layout_depth as layoutDepth,
- name,
- id,
- dur = 0 as isInstant,
- dur = -1 as isIncomplete
- from experimental_slice_layout
- where
- filter_track_ids = '${this.trackIds.join(',')}' and
- ts >= ${start - this.maxDur} and
- ts <= ${end}
- group by tsq, layout_depth
- order by tsq, layout_depth
- `);
-
- const numRows = queryRes.numRows();
- const slices: SliceData = {
- start,
- end,
- resolution,
- length: numRows,
- strings: [],
- sliceIds: new Float64Array(numRows),
- starts: new BigInt64Array(numRows),
- ends: new BigInt64Array(numRows),
- depths: new Uint16Array(numRows),
- titles: new Uint16Array(numRows),
- colors: new Uint16Array(numRows),
- isInstant: new Uint16Array(numRows),
- isIncomplete: new Uint16Array(numRows),
- };
-
- const stringIndexes = new Map<string, number>();
- function internString(str: string) {
- let idx = stringIndexes.get(str);
- if (idx !== undefined) return idx;
- idx = slices.strings.length;
- slices.strings.push(str);
- stringIndexes.set(str, idx);
- return idx;
- }
- const greenIndex = internString('#4CAF50');
-
- const it = queryRes.iter({
- tsq: LONG,
- ts: LONG,
- dur: LONG,
- layoutDepth: NUM,
- id: NUM,
- name: STR,
- isInstant: NUM,
- isIncomplete: NUM,
- });
- for (let row = 0; it.valid(); it.next(), ++row) {
- const startQ = it.tsq;
- const start = it.ts;
- const dur = it.dur;
- const end = start + dur;
- const minEnd = startQ + resolution;
- const endQ = BIMath.max(BIMath.quant(end, resolution), minEnd);
-
- slices.starts[row] = startQ;
- slices.ends[row] = endQ;
- slices.depths[row] = it.layoutDepth;
- slices.titles[row] = internString(it.name);
- slices.sliceIds[row] = it.id;
- slices.isInstant[row] = it.isInstant;
- slices.isIncomplete[row] = it.isIncomplete;
- slices.colors![row] = greenIndex;
- }
- return slices;
- }
-}
diff --git a/ui/src/tracks/frames/index.ts b/ui/src/tracks/frames/index.ts
index 12427eb..5cbdd80 100644
--- a/ui/src/tracks/frames/index.ts
+++ b/ui/src/tracks/frames/index.ts
@@ -26,11 +26,9 @@
STR_NULL,
} from '../../trace_processor/query_result';
-import {ActualFramesTrack} from './actual_frames_track';
import {
ActualFramesTrack as ActualFramesTrackV2,
} from './actual_frames_track_v2';
-import {ExpectedFramesTrack} from './expected_frames_track';
import {
ExpectedFramesTrack as ExpectedFramesTrackV2,
} from './expected_frames_track_v2';
@@ -102,21 +100,6 @@
trackIds,
kind: EXPECTED_FRAMES_SLICE_TRACK_KIND,
trackFactory: ({trackKey}) => {
- return new ExpectedFramesTrack(
- engine,
- maxDepth,
- trackKey,
- trackIds,
- );
- },
- });
-
- ctx.registerTrack({
- uri: `perfetto.ExpectedFrames#${upid}.v2`,
- displayName,
- trackIds,
- kind: EXPECTED_FRAMES_SLICE_TRACK_KIND,
- trackFactory: ({trackKey}) => {
return new ExpectedFramesTrackV2(
engine,
maxDepth,
@@ -184,21 +167,6 @@
trackIds,
kind: ACTUAL_FRAMES_SLICE_TRACK_KIND,
trackFactory: ({trackKey}) => {
- return new ActualFramesTrack(
- engine,
- maxDepth,
- trackKey,
- trackIds,
- );
- },
- });
-
- ctx.registerTrack({
- uri: `perfetto.ActualFrames#${upid}.v2`,
- displayName,
- trackIds,
- kind: ACTUAL_FRAMES_SLICE_TRACK_KIND,
- trackFactory: ({trackKey}) => {
return new ActualFramesTrackV2(
engine,
maxDepth,
diff --git a/ui/src/tracks/ftrace/index.ts b/ui/src/tracks/ftrace/index.ts
index c3616c6..24dd886 100644
--- a/ui/src/tracks/ftrace/index.ts
+++ b/ui/src/tracks/ftrace/index.ts
@@ -165,6 +165,10 @@
},
});
+ if (await this.hasFtrace(ctx.engine)) {
+ ctx.addDefaultTab(ftraceTabUri);
+ }
+
ctx.registerCommand({
id: 'perfetto.FtraceRaw#ShowFtraceTab',
name: 'Show Ftrace Tab',
@@ -174,6 +178,18 @@
});
}
+ private async hasFtrace(engine: EngineProxy): Promise<boolean> {
+ // Check if we have any ftrace events at all
+ const query = `
+ select
+ *
+ from ftrace_event
+ limit 1`;
+
+ const res = await engine.query(query);
+ return res.numRows() > 0;
+ }
+
private async lookupCpuCores(engine: EngineProxy): Promise<number[]> {
const query = 'select distinct cpu from ftrace_event';
diff --git a/ui/src/tracks/thread_state/index.ts b/ui/src/tracks/thread_state/index.ts
index d14958d..8c6402a 100644
--- a/ui/src/tracks/thread_state/index.ts
+++ b/ui/src/tracks/thread_state/index.ts
@@ -12,35 +12,18 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import {v4 as uuidv4} from 'uuid';
-
-import {BigintMath as BIMath} from '../../base/bigint_math';
-import {search} from '../../base/binary_search';
-import {assertFalse} from '../../base/logging';
-import {duration, Time, time} from '../../base/time';
-import {Actions} from '../../common/actions';
-import {cropText} from '../../common/canvas_utils';
-import {colorForState} from '../../common/colorizer';
-import {translateState} from '../../common/thread_state';
-import {TrackData} from '../../common/track_data';
-import {TimelineFetcher} from '../../common/track_helper';
-import {checkerboardExcept} from '../../frontend/checkerboard';
-import {globals} from '../../frontend/globals';
-import {PanelSize} from '../../frontend/panel';
+import {uuidv4} from '../../base/uuid';
import {asThreadStateSqlId} from '../../frontend/sql_types';
import {ThreadStateTab} from '../../frontend/thread_state_tab';
import {
BottomTabToSCSAdapter,
- EngineProxy,
Plugin,
PluginContext,
PluginContextTrace,
PluginDescriptor,
- Track,
} from '../../public';
import {getTrackName} from '../../public/utils';
import {
- LONG,
NUM,
NUM_NULL,
STR_NULL,
@@ -52,263 +35,6 @@
export const THREAD_STATE_TRACK_KIND = 'ThreadStateTrack';
-interface Data extends TrackData {
- strings: string[];
- ids: Float64Array;
- starts: BigInt64Array;
- ends: BigInt64Array;
- cpu: Int8Array;
- state: Uint16Array; // Index into |strings|.
-}
-
-const MARGIN_TOP = 3;
-const RECT_HEIGHT = 12;
-const EXCESS_WIDTH = 10;
-
-class ThreadStateTrack implements Track {
- private fetcher = new TimelineFetcher<Data>(this.onBoundsChange.bind(this));
- private trackKey: string;
- private engine: EngineProxy;
- private utid: number;
- private uuid = uuidv4();
-
- constructor(trackKey: string, engine: EngineProxy, utid: number) {
- this.trackKey = trackKey;
- this.engine = engine;
- this.utid = utid;
- }
-
- private maxDurNs: duration = 0n;
-
- // Returns a valid SQL table name with the given prefix that should be unique
- // for each track.
- private tableName(prefix: string) {
- // Derive table name from, since that is unique for each track.
- // Track ID can be UUID but '-' is not valid for sql table name.
- const idSuffix = this.uuid.split('-').join('_');
- return `${prefix}_${idSuffix}`;
- }
-
- async onCreate() {
- await this.engine.query(`
- create view ${this.tableName('thread_state')} as
- select
- id,
- ts,
- dur,
- cpu,
- state,
- io_wait as ioWait
- from thread_state
- where utid = ${this.utid} and utid != 0
- `);
-
- const queryRes = await this.engine.query(`
- select ifnull(max(dur), 0) as maxDur
- from ${this.tableName('thread_state')}
- `);
- this.maxDurNs = queryRes.firstRow({maxDur: LONG}).maxDur;
- }
-
- async onUpdate() {
- await this.fetcher.requestDataForCurrentTime();
- }
-
- async onBoundsChange(start: time, end: time, resolution: duration):
- Promise<Data> {
- const query = `
- select
- (ts + ${resolution / 2n}) / ${resolution} * ${resolution} as tsq,
- ts,
- state = 'S' as is_sleep,
- max(dur) as dur,
- ifnull(cast(cpu as integer), -1) as cpu,
- state,
- ioWait,
- ifnull(id, -1) as id
- from ${this.tableName('thread_state')}
- where
- ts >= ${start - this.maxDurNs} and
- ts <= ${end}
- group by tsq, is_sleep
- order by tsq
- `;
-
- const queryRes = await this.engine.query(query);
- const numRows = queryRes.numRows();
-
- const data: Data = {
- start,
- end,
- resolution,
- length: numRows,
- ids: new Float64Array(numRows),
- starts: new BigInt64Array(numRows),
- ends: new BigInt64Array(numRows),
- strings: [],
- state: new Uint16Array(numRows),
- cpu: new Int8Array(numRows),
- };
-
- const stringIndexes = new Map<
- {shortState: string | undefined; ioWait: boolean | undefined},
- number>();
- function internState(
- shortState: string|undefined, ioWait: boolean|undefined) {
- let idx = stringIndexes.get({shortState, ioWait});
- if (idx !== undefined) return idx;
- idx = data.strings.length;
- data.strings.push(translateState(shortState, ioWait));
- stringIndexes.set({shortState, ioWait}, idx);
- return idx;
- }
- const it = queryRes.iter({
- 'tsq': LONG,
- 'ts': LONG,
- 'dur': LONG,
- 'cpu': NUM,
- 'state': STR_NULL,
- 'ioWait': NUM_NULL,
- 'id': NUM,
- });
- for (let row = 0; it.valid(); it.next(), row++) {
- const startQ = it.tsq;
- const start = it.ts;
- const dur = it.dur;
- const end = start + dur;
- const minEnd = startQ + resolution;
- const endQ = BIMath.max(BIMath.quant(end, resolution), minEnd);
-
- const cpu = it.cpu;
- const state = it.state || undefined;
- const ioWait = it.ioWait === null ? undefined : !!it.ioWait;
- const id = it.id;
-
- // We should never have the end timestamp being the same as the bucket
- // start.
- assertFalse(startQ === endQ);
-
- data.starts[row] = startQ;
- data.ends[row] = endQ;
- data.state[row] = internState(state, ioWait);
- data.ids[row] = id;
- data.cpu[row] = cpu;
- }
- return data;
- }
-
- async onDestroy() {
- if (this.engine.isAlive) {
- await this.engine.query(
- `drop view if exists ${this.tableName('thread_state')}`);
- }
- this.fetcher.dispose();
- }
-
- getHeight(): number {
- return 2 * MARGIN_TOP + RECT_HEIGHT;
- }
-
- render(ctx: CanvasRenderingContext2D, size: PanelSize): void {
- const {
- visibleTimeScale: timeScale,
- visibleTimeSpan,
- } = globals.timeline;
- const data = this.fetcher.data;
- const charWidth = ctx.measureText('dbpqaouk').width / 8;
-
- if (data === undefined) return; // Can't possibly draw anything.
-
- // The draw of the rect on the selected slice must happen after the other
- // drawings, otherwise it would result under another rect.
- let drawRectOnSelected = () => {};
-
- checkerboardExcept(
- ctx,
- this.getHeight(),
- 0,
- size.width,
- timeScale.timeToPx(data.start),
- timeScale.timeToPx(data.end),
- );
-
- ctx.textAlign = 'center';
- ctx.font = '10px Roboto Condensed';
-
- for (let i = 0; i < data.starts.length; i++) {
- // NOTE: Unlike userspace and scheduling slices, thread state slices are
- // allowed to overlap; specifically, sleeping slices are allowed to
- // overlap with non-sleeping slices. We do this because otherwise
- // sleeping slices generally dominate traces making it seem like there are
- // no running/runnable etc. slices until you zoom in. By drawing both,
- // we get a more accurate representation of the trace and prevent weird
- // artifacts when zooming.
- // See b/201793731 for an example of why we do this.
- const tStart = Time.fromRaw(data.starts[i]);
- const tEnd = Time.fromRaw(data.ends[i]);
- const state = data.strings[data.state[i]];
- if (!visibleTimeSpan.intersects(tStart, tEnd)) {
- continue;
- }
-
- // Don't display a slice for Task Dead.
- if (state === 'x') continue;
- const rectStart = timeScale.timeToPx(tStart);
- const rectEnd = timeScale.timeToPx(tEnd);
- const rectWidth = rectEnd - rectStart;
-
- const currentSelection = globals.state.currentSelection;
- const isSelected = currentSelection &&
- currentSelection.kind === 'THREAD_STATE' &&
- currentSelection.id === data.ids[i];
-
- const colorScheme = colorForState(state);
- ctx.fillStyle = colorScheme.base.cssString;
- ctx.fillRect(rectStart, MARGIN_TOP, rectWidth, RECT_HEIGHT);
-
- // Don't render text when we have less than 10px to play with.
- if (rectWidth < 10 || state === 'Sleeping') continue;
- const title = cropText(state, charWidth, rectWidth);
- const rectXCenter = rectStart + rectWidth / 2;
- ctx.fillStyle = colorScheme.textBase.cssString;
- ctx.fillText(title, rectXCenter, MARGIN_TOP + RECT_HEIGHT / 2 + 3);
-
- if (isSelected) {
- drawRectOnSelected = () => {
- const rectStart =
- Math.max(0 - EXCESS_WIDTH, timeScale.timeToPx(tStart));
- const rectEnd =
- Math.min(size.width + EXCESS_WIDTH, timeScale.timeToPx(tEnd));
- ctx.strokeStyle = colorScheme.base.cssString;
- ctx.beginPath();
- ctx.lineWidth = 3;
- ctx.strokeRect(
- rectStart,
- MARGIN_TOP - 1.5,
- rectEnd - rectStart,
- RECT_HEIGHT + 3);
- ctx.closePath();
- };
- }
- }
- drawRectOnSelected();
- }
-
- onMouseClick({x}: {x: number}) {
- const data = this.fetcher.data;
- if (data === undefined) return false;
- const {visibleTimeScale} = globals.timeline;
- const time = visibleTimeScale.pxToHpTime(x);
- const index = search(data.starts, time.toTime());
- if (index === -1) return false;
- const id = data.ids[index];
- globals.makeSelection(
- Actions.selectThreadState({id, trackKey: this.trackKey}));
- return true;
- }
-}
-
-
class ThreadState implements Plugin {
onActivate(_ctx: PluginContext): void {}
@@ -337,24 +63,13 @@
});
for (; it.valid(); it.next()) {
const utid = it.utid;
- const upid = it.upid;
const tid = it.tid;
const threadName = it.threadName;
const displayName =
getTrackName({utid, tid, threadName, kind: THREAD_STATE_TRACK_KIND});
ctx.registerTrack({
- uri: `perfetto.ThreadState#${upid}.${utid}`,
- displayName,
- kind: THREAD_STATE_TRACK_KIND,
- utid: utid,
- trackFactory: ({trackKey}) => {
- return new ThreadStateTrack(trackKey, ctx.engine, utid);
- },
- });
-
- ctx.registerTrack({
- uri: `perfetto.ThreadState#${utid}.v2`,
+ uri: `perfetto.ThreadState#${utid}`,
displayName,
kind: THREAD_STATE_TRACK_KIND,
utid,