/* * Copyright (C) 2022 Huawei Device Co., Ltd. * 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. */ let temp_query_process = `create table temp_query_process as select distinct process.pid as pid, process.name as processName from (select ipid, itid from sched_slice group by itid) the_tracks left join (select sched_slice.ipid, sum(dur) as total_dur from sched_slice group by ipid) using (ipid) left join process using (ipid) where pid is not null order by total_dur desc, the_tracks.ipid, processName, the_tracks.itid; `; let temp_query_cpu_data = `create table temp_query_cpu_data as with list as (SELECT IP.name as processName, IP.name processCmdLine, IP.pid as processId, B.cpu, A.name, C.id as schedId, A.tid, A.id, A.type, B.dur, B.ts - TR.start_ts AS startTime, C.priority, C.end_state from thread_state AS B left join thread as A on B.itid = A.id left join sched_slice AS C on B.itid = C.itid and B.ts = C.ts left join trace_range AS TR left join process AS IP on A.ipid = IP.id where C.itid is not null order by B.id) select * from list; create index temp_query_cpu_data_idx on temp_query_cpu_data (cpu, startTime); `; let temp_query_freq_data = `create table temp_query_freq_data as select cpu, value, ts - tb.start_ts as startNS from measure c, trace_range tb inner join cpu_measure_filter t on c.filter_id = t.id where (name = 'cpufreq' or name = 'cpu_frequency') order by ts; create index temp_query_freq_data_idx on temp_query_freq_data (cpu); `; let temp_query_process_data = `create table temp_query_process_data as select ta.id, type, ts, dur, ta.cpu, itid as utid, state, ts - tb.start_ts as startTime, tc.tid, tc.pid, tc.process, tc.thread from thread_state ta, trace_range tb left join (select it.id, tid, pid, ip.name as process, it.name as thread from thread as it left join process ip on it.ipid = ip.id) tc on ta.itid = tc.id where ta.cpu is not null order by startTime; create index temp_query_process_data_idx on temp_query_process_data (pid, startTime); `; let temp_query_thread_function = `create table temp_query_thread_function as select tid, A.name as threadName, is_main_thread, c.callid as track_id, c.ts - D.start_ts as startTs, c.dur, c.name as funName, c.parent_id, c.id, c.depth, c.argsetid from thread A, trace_range D left join callstack C on A.id = C.callid where startTs not null and c.cookie is null; create index temp_query_thread_function_idx on temp_query_thread_function (tid); `; let temp_query_thread_data = `create table temp_query_thread_data as select A.id , A.type , A.tid , A.name , A.start_ts , A.end_ts , A.ipid as upid , A.is_main_thread , B.cpu , B.ts - TR.start_ts AS startTime , B.dur , B.state , IP.pid , IP.name as processName from thread_state AS B left join thread as A on A.id = B.itid left join trace_range AS TR left join process AS IP on IP.id = A.ipid; create index temp_query_thread_data_idx on temp_query_thread_data (tid);`; let temp_view = `CREATE VIEW IF NOT EXISTS thread_view AS SELECT id as itid, * FROM thread; CREATE VIEW IF NOT EXISTS process_view AS SELECT id as ipid, * FROM process; CREATE VIEW IF NOT EXISTS sched_view AS SELECT *, ts + dur as ts_end FROM sched_slice; CREATE VIEW IF NOT EXISTS instants_view AS SELECT *, 0.0 as value FROM instant; CREATE VIEW IF NOT EXISTS trace_section AS select start_ts, end_ts from trace_range;`; let temp_query_cpu_freq = `create table temp_query_cpu_freq as select cpu from cpu_measure_filter where (name = 'cpufreq' or name = 'cpu_frequency') order by cpu;`; let temp_query_cpu_max_freq = `create table temp_query_cpu_max_freq as select max(value) as maxFreq from measure c inner join cpu_measure_filter t on c.filter_id = t.id where (name = 'cpufreq' or name = 'cpu_frequency');`; let temp_get_tab_states_group_by_process = `create table temp_get_tab_states_group_by_process as select IP.name as process, IP.pid as processId, dur, Ip.id as id, (ts - B.start_ts + dur) as end_ts, (ts - B.start_ts) as start_ts from thread_state as A, trace_range as B left join thread as C on A.itid = C.id left join process AS IP on C.ipid = IP.id where A.dur > 0 and processId not null and (ts - B.start_ts)>0; create index temp_get_tab_states_group_by_process_idx on temp_get_tab_states_group_by_process (end_ts, start_ts); `; let temp_get_process_thread_state_data = ` create table temp_get_process_thread_state_data as select IP.name as process, IP.pid as processId, A.name as thread, B.state as state, A.tid as threadId, B.dur, (B.ts - TR.start_ts + B.dur) as end_ts, (B.ts - TR.start_ts) as start_ts, B.cpu, C.priority, '-' as note from thread_state as B left join thread as A on B.itid = A.id left join process as IP on A.ipid = IP.id left join trace_range as TR left join sched_slice as C on B.itid = C.itid and C.ts = B.ts where B.dur > 0 and IP.pid not null and (B.ts - TR.start_ts) >= 0; create index temp_get_process_thread_state_data_idx on temp_get_process_thread_state_data (end_ts, start_ts); `; let temp_get_tab_states_group_by_state_pid_tid = ` create table temp_get_tab_states_group_by_state_pid_tid as select IP.name as process, IP.pid as processId, A.name as thread, B.state as state, A.tid as threadId, B.dur as dur, A.tid as tid, (B.ts - TR.start_ts + B.dur) as end_ts, (B.ts - TR.start_ts) as start_ts from thread_state AS B left join thread as A on B.itid = A.id left join process AS IP on A.ipid = IP.id left join trace_range AS TR where B.dur > 0 and IP.pid not null and (B.ts - TR.start_ts > 0); create index temp_get_tab_states_group_by_state_pid_tid_idx0 on temp_get_tab_states_group_by_state_pid_tid (process, processId, thread, threadId, state); create index temp_get_tab_states_group_by_state_pid_tid_idx1 on temp_get_tab_states_group_by_state_pid_tid (end_ts, start_ts); create index temp_get_tab_states_group_by_state_pid_tid_idx3 on temp_get_tab_states_group_by_state_pid_tid (end_ts, start_ts, process, processId, thread, threadId, state); `; let temp_get_tab_states_group_by_state_pid = `create table temp_get_tab_states_group_by_state_pid as select IP.name as process, IP.pid as processId, B.state as state, B.dur as dur, A.tid as tid, (ts - TR.start_ts + dur) as end_ts, (ts - TR.start_ts) as start_ts from thread_state AS B left join thread as A on B.itid = A.id left join process AS IP on A.ipid = IP.id left join trace_range AS TR where pid not null and B.dur > 0 and (ts - TR.start_ts > 0); create index temp_get_tab_states_group_by_state_pid_idx0 on temp_get_tab_states_group_by_state_pid (process, processId, state); create index temp_get_tab_states_group_by_state_pid_idx1 on temp_get_tab_states_group_by_state_pid (start_ts, end_ts); `; let temp_get_tab_states_group_by_state = `create table temp_get_tab_states_group_by_state as select state, dur, (ts - B.start_ts + dur) as end_ts, (ts - B.start_ts) as start_ts from thread_state as A, trace_range as B left join thread as C on A.itid = C.id left join process AS IP on C.ipid = IP.id where A.dur > 0 and IP.pid not null and (ts - B.start_ts > 0); create index temp_get_tab_states_group_by_state_idx0 on temp_get_tab_states_group_by_state (state); create index temp_get_tab_states_group_by_state_idx1 on temp_get_tab_states_group_by_state (start_ts, end_ts); `; let temp_get_tab_states_group_by_process_thread = `create table temp_get_tab_states_group_by_process_thread as select IP.name as process, IP.pid as processId, A.name as thread, a.tid as threadId, B.dur as dur, A.tid as tid, (ts - TR.start_ts + dur) as end_ts, (ts - TR.start_ts) as start_ts from thread_state AS B left join thread as A on B.itid = A.id left join process AS IP on A.ipid = IP.id left join trace_range AS TR where pid not null and B.dur > 0 and (ts - TR.start_ts)>0; create index temp_get_tab_states_group_by_process_thread_idx0 on temp_get_tab_states_group_by_process_thread (process, processId, thread, threadId); create index temp_get_tab_states_group_by_process_thread_idx1 on temp_get_tab_states_group_by_process_thread (start_ts, end_ts); `; let temp_get_cpu_rate = `create table temp_get_cpu_rate as with cpu as (select cpu, ts, dur, (case when ro < 99 then ro else 99 end) as ro, (case when ro < 99 then stime + ro * cell else stime + 99 * cell end) as st, (case when ro < 99 then stime + (ro + 1) * cell else etime end) as et from (select cpu, ts, A.dur, ((ts + A.dur) - D.start_ts) / ((D.end_ts - D.start_ts) / 100) as ro, D.start_ts as stime, D.end_ts etime, (D.end_ts - D.start_ts) / 100 as cell from sched_slice A left join trace_range D left join thread B on A.itid = B.id left join process C on B.ipid = C.id where tid != 0 and (A.ts) between D.start_ts and D.end_ts)) select cpu, ro, sum(case when ts <= st and ts + dur <= et then (ts + dur - st) when ts <= st and ts + dur > et then et - st when ts > st and ts + dur <= et then dur when ts > st and ts + dur > et then et - ts end) / cast(et - st as float) as rate from cpu group by cpu, ro; `; let temp_get_tab_thread_states = `create table temp_get_tab_thread_states as select IP.name as process, IP.pid as pid, A.name as thread, A.tid as tid, B.state as state, B.dur as dur, (B.ts - TR.start_ts + ifnull(B.dur, 0)) as end_ts, (B.ts - TR.start_ts) as start_ts from thread_state AS B left join thread as A on A.id = B.itid left join trace_range AS TR left join process AS IP on IP.id = A.ipid where (B.ts - TR.start_ts > 0); create index temp_get_tab_thread_states_idx0 on temp_get_tab_thread_states (process, pid, thread, tid, state); create index temp_get_tab_thread_states_idx1 on temp_get_tab_thread_states (start_ts, end_ts); `; let temp_get_tab_slices = `create table temp_get_tab_slices as select c.name as name, c.dur as dur, A.tid as tid, (C.ts - D.start_ts + C.dur) as end_ts, (C.ts - D.start_ts) as start_ts from thread A, trace_range D left join callstack C on A.id = C.callid where C.ts not null and c.dur >= 0 and (C.ts - D.start_ts > 0); create index temp_get_tab_slices_idx0 on temp_get_tab_slices (name); `; let createProcessNoId = ` insert into process(id, ipid, type, pid, name, start_ts) SELECT null, null, 'process' as type, tid as pid, t.name, t.start_ts from thread t where ipid is null and tid != 0; update process set id = ROWID - 1, ipid = ROWID - 1 where id is null; update thread set ipid = (select id from process where thread.tid = process.pid) where thread.ipid is null; `; let temp_create_cpu_freq_view = `CREATE VIEW cpu_freq_view AS SELECT B.cpu, A.ts, LEAD(A.ts, 1, (SELECT end_ts FROM trace_range)) OVER (PARTITION BY A.filter_id ORDER BY ts) AS end_ts,LEAD(A.ts, 1, (SELECT end_ts FROM trace_range)) OVER (PARTITION BY A.filter_id ORDER BY ts) - ts AS dur,value AS freq FROM measure AS A, cpu_measure_filter AS B WHERE B.name = 'cpu_frequency' AND A.filter_id = B.id`; let temp_create_virtual_table = `CREATE VIRTUAL table result USING SPAN_JOIN(cpu_freq_view partitioned cpu, sched_slice partitioned cpu)`; let queryThreadWakeUpFrom = ` select TB.tid, TB.name as thread, TA.cpu, (TA.ts - TR.start_ts) as ts, TC.pid, TC.name as process from (select ts as wakeTs, wakeup_from as wakeupFromTid from instant, trace_range where name = 'sched_wakeup' and ref = $itid and ts > start_ts + $startTime and ts < start_ts + $startTime + $dur order by ts) TW left join thread_state TA on TW.wakeupFromTid = TA.itid and TA.ts < TW.wakeTs and TA.ts + TA.dur >= TW.wakeTs left join thread TB on TA.itid = TB.id left join process TC on TB.ipid = TC.id left join trace_range TR where TB.ipid not null limit 1; `; let queryThreadWakeUp = ` select TB.tid, TB.name as thread, min(TA.ts - TR.start_ts) as ts, TC.pid, TC.name as process from (select min(ts) as wakeTs, ref as itid from instant, trace_range where name = 'sched_wakeup' and wakeup_from = $itid and ts > start_ts + $startTime and ts < start_ts + $startTime + $dur group by ref) TW left join thread_state TA on TW.itid = TA.itid and TA.ts > TW.wakeTs left join thread TB on TA.itid = TB.id left join process TC on TB.ipid = TC.id left join trace_range TR where TB.ipid not null group by TB.tid, TB.name, TC.pid, TC.name; `; let delete_callstack_binder_data = `DELETE FROM callstack WHERE dur < -1 or name = 'binder transaction async' or name = 'binder async rcv';`; let temp_init_sql_list = [temp_query_process];