1-- 2-- Copyright 2024 The Android Open Source Project 3-- 4-- Licensed under the Apache License, Version 2.0 (the "License"); 5-- you may not use this file except in compliance with the License. 6-- You may obtain a copy of the License at 7-- 8-- https://www.apache.org/licenses/LICENSE-2.0 9-- 10-- Unless required by applicable law or agreed to in writing, software 11-- distributed under the License is distributed on an "AS IS" BASIS, 12-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13-- See the License for the specific language governing permissions and 14-- limitations under the License. 15 16SELECT RUN_METRIC('android/process_metadata.sql'); 17 18INCLUDE PERFETTO MODULE android.slices; 19INCLUDE PERFETTO MODULE android.binder; 20INCLUDE PERFETTO MODULE android.critical_blocking_calls; 21 22DROP TABLE IF EXISTS process_info; 23CREATE TABLE process_info AS 24SELECT 25 process.upid AS upid, 26 process.name AS process_name, 27 process_metadata.metadata AS process_metadata 28FROM process 29JOIN process_metadata USING (upid); 30 31DROP TABLE IF EXISTS android_blocking_calls_unagg_calls; 32CREATE TABLE android_blocking_calls_unagg_calls AS 33SELECT 34 name, 35 COUNT(*) AS occurrences, 36 MAX(dur) AS max_dur_ns, 37 MIN(dur) AS min_dur_ns, 38 SUM(dur) AS total_dur_ns, 39 AVG(dur) AS avg_dur_ns, 40 upid, 41 process_name 42FROM 43 _android_critical_blocking_calls 44GROUP BY name, upid, process_name; 45 46DROP TABLE IF EXISTS filtered_processes_with_non_zero_blocking_calls; 47CREATE TABLE filtered_processes_with_non_zero_blocking_calls AS 48SELECT pi.upid, 49 pi.process_name, 50 pi.process_metadata 51FROM process_info pi WHERE pi.upid IN 52 (SELECT DISTINCT upid FROM _android_critical_blocking_calls); 53 54 55DROP TABLE IF EXISTS filtered_processes_with_non_zero_blocking_calls; 56CREATE TABLE filtered_processes_with_non_zero_blocking_calls AS 57SELECT pi.upid, 58 pi.process_name, 59 pi.process_metadata 60FROM process_info pi WHERE pi.upid IN 61 (SELECT DISTINCT upid FROM _android_critical_blocking_calls); 62 63DROP VIEW IF EXISTS android_blocking_calls_unagg_output; 64CREATE PERFETTO VIEW android_blocking_calls_unagg_output AS 65SELECT AndroidBlockingCallsUnagg( 66 'process_with_blocking_calls', ( 67 SELECT RepeatedField( 68 AndroidBlockingCallsUnagg_ProcessWithBlockingCalls( 69 'process', e.process_metadata, 70 'blocking_calls', ( 71 SELECT RepeatedField( 72 AndroidBlockingCall( 73 'name', d.name, 74 'cnt', d.occurrences, 75 'avg_dur_ms', CAST(avg_dur_ns / 1e6 AS INT), 76 'total_dur_ms', CAST(total_dur_ns / 1e6 AS INT), 77 'max_dur_ms', CAST(max_dur_ns / 1e6 AS INT), 78 'min_dur_ms', CAST(min_dur_ns / 1e6 AS INT), 79 'avg_dur_ns', CAST(d.avg_dur_ns AS INT), 80 'total_dur_ns', d.total_dur_ns, 81 'max_dur_ns', d.max_dur_ns, 82 'min_dur_ns', d.min_dur_ns 83 ) 84 ) FROM ( 85 SELECT b.name, 86 b.occurrences, 87 b.avg_dur_ns, 88 b.total_dur_ns, 89 b.max_dur_ns, 90 b.min_dur_ns 91 FROM android_blocking_calls_unagg_calls b INNER JOIN filtered_processes_with_non_zero_blocking_calls c 92 ON b.upid = c.upid WHERE b.upid = e.upid 93 ORDER BY total_dur_ns DESC 94 ) d 95 ) 96 ) 97 ) 98 FROM filtered_processes_with_non_zero_blocking_calls e 99 ) 100); 101