blob: eb47784e93cd4262ef593d8fdaf3c1c1d63cf26a [file] [log] [blame]
--
-- Copyright 2020 The Android Open Source Project
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- 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.
--
SELECT RUN_METRIC('android/cpu_info.sql');
SELECT RUN_METRIC('android/process_metadata.sql');
CREATE VIEW android_thread_time_in_state_base AS
SELECT
*,
(
SELECT
CASE
WHEN layout = 'big_little_bigger' AND cpu < 4 THEN 'little'
WHEN layout = 'big_little_bigger' AND cpu < 7 THEN 'big'
WHEN layout = 'big_little_bigger' AND cpu = 7 THEN 'bigger'
WHEN layout = 'big_little' AND cpu < 4 THEN 'little'
WHEN layout = 'big_little' AND cpu < 8 THEN 'big'
ELSE 'unknown'
END
FROM core_layout_type
) AS core_type
FROM (
SELECT
slice.ts AS ts,
thread.upid AS upid,
CAST(SUBSTR(slice.name, 18) AS int) AS cpu,
thread.utid AS utid,
-- We need globally unique track names so add the utid even when we
-- know the name. But when we don't, also use the tid because that's what
-- the rest of the UI does.
IFNULL(thread.name, 'Thread ' || thread.tid) || ' (' || thread.utid || ')'
AS thread_name,
args.key AS freq,
args.int_value as runtime_ms_counter
FROM slice
JOIN thread_track ON slice.track_id = thread_track.id
JOIN args USING (arg_set_id)
JOIN thread USING (utid)
WHERE slice.name LIKE 'time_in_state.%'
);
CREATE VIEW android_thread_time_in_state_raw AS
SELECT
utid,
core_type,
freq,
MAX(runtime_ms_counter) - MIN(runtime_ms_counter) runtime_ms
FROM android_thread_time_in_state_base
GROUP BY utid, core_type, freq;
CREATE TABLE android_thread_time_in_state_counters AS
SELECT
utid,
core_type,
SUM(runtime_ms) runtime_ms
FROM android_thread_time_in_state_raw
GROUP BY utid, core_type
HAVING runtime_ms > 0;
CREATE VIEW android_thread_time_in_state_thread_metrics AS
SELECT
utid,
RepeatedField(AndroidThreadTimeInStateMetric_MetricsByCoreType(
'core_type', core_type,
'runtime_ms', runtime_ms
)) metrics
FROM android_thread_time_in_state_counters
GROUP BY utid;
CREATE VIEW android_thread_time_in_state_threads AS
SELECT
upid,
RepeatedField(AndroidThreadTimeInStateMetric_Thread(
'name', thread.name,
'metrics_by_core_type', android_thread_time_in_state_thread_metrics.metrics
)) threads
FROM thread
JOIN android_thread_time_in_state_thread_metrics USING (utid)
GROUP BY upid;
CREATE VIEW android_thread_time_in_state_process_metrics AS
WITH process_counters AS (
SELECT
upid,
core_type,
SUM(runtime_ms) runtime_ms
FROM android_thread_time_in_state_counters
JOIN thread USING (utid)
GROUP BY upid, core_type
)
SELECT
upid,
RepeatedField(AndroidThreadTimeInStateMetric_MetricsByCoreType(
'core_type', core_type,
'runtime_ms', runtime_ms
)) metrics
FROM process_counters
GROUP BY upid;
CREATE VIEW android_thread_time_in_state_output AS
SELECT AndroidThreadTimeInStateMetric(
'processes', (
SELECT
RepeatedField(AndroidThreadTimeInStateMetric_Process(
'metadata', metadata,
'metrics_by_core_type',
android_thread_time_in_state_process_metrics.metrics,
'threads', android_thread_time_in_state_threads.threads
))
FROM process
JOIN process_metadata USING (upid)
JOIN android_thread_time_in_state_process_metrics USING (upid)
JOIN android_thread_time_in_state_threads USING (upid)
)
);
CREATE VIEW android_thread_time_in_state_annotations_raw AS
SELECT
ts,
ts - LAG(ts) OVER (PARTITION BY core_type, utid ORDER BY ts) AS dur,
upid,
core_type,
utid,
thread_name,
freq,
runtime_ms_counter - LAG(runtime_ms_counter)
OVER (PARTITION BY core_type, utid, freq ORDER BY ts) AS runtime_ms
FROM android_thread_time_in_state_base;
CREATE VIEW android_thread_time_in_state_annotations AS
SELECT
'counter' AS track_type,
thread_name || ' (' || core_type || ' core)' as track_name,
ts,
dur,
upid,
sum(runtime_ms * freq / 1000) AS value -- i.e. cycles
FROM android_thread_time_in_state_annotations_raw
WHERE thread_name IS NOT NULL
AND runtime_ms IS NOT NULL
AND dur != 0
GROUP BY track_type, track_name, ts, dur, upid
-- Biggest values at top of list in UI.
ORDER BY value DESC;