1fb726d48Sopenharmony_ci/* 2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb726d48Sopenharmony_ci * You may obtain a copy of the License at 6fb726d48Sopenharmony_ci * 7fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb726d48Sopenharmony_ci * 9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and 13fb726d48Sopenharmony_ci * limitations under the License. 14fb726d48Sopenharmony_ci */ 15fb726d48Sopenharmony_ci 16fb726d48Sopenharmony_ciimport { query } from '../SqlLite'; 17fb726d48Sopenharmony_ciimport { IrqStruct } from '../ui-worker/ProcedureWorkerIrq'; 18fb726d48Sopenharmony_ciimport { IrqAndSoftirqBean } from '../../component/trace/sheet/irq/irqAndSoftirqBean' 19fb726d48Sopenharmony_ciimport { Utils } from '../../component/trace/base/Utils'; 20fb726d48Sopenharmony_ci 21fb726d48Sopenharmony_ciexport const queryIrqList = (traceId?: string): Promise<Array<{ name: string; cpu: number }>> => 22fb726d48Sopenharmony_ci query('queryIrqList', 23fb726d48Sopenharmony_ci `SELECT 24fb726d48Sopenharmony_ci * 25fb726d48Sopenharmony_ci FROM 26fb726d48Sopenharmony_ci (SELECT DISTINCT cat AS name, callid AS cpu FROM irq WHERE cat<>'ipi') 27fb726d48Sopenharmony_ci ORDER By 28fb726d48Sopenharmony_ci name, 29fb726d48Sopenharmony_ci cpu` 30fb726d48Sopenharmony_ci , {}, { traceId: traceId }); 31fb726d48Sopenharmony_ci 32fb726d48Sopenharmony_ciexport const queryAllIrqNames = async (traceId?: string): Promise<Array<{ ipiName: string; name: string; id: number }>> => { 33fb726d48Sopenharmony_ci let allIrqNamesBuffer = await query( 34fb726d48Sopenharmony_ci 'queryAllIrqNames', 35fb726d48Sopenharmony_ci `select 36fb726d48Sopenharmony_ci id, 37fb726d48Sopenharmony_ci case 38fb726d48Sopenharmony_ci when 39fb726d48Sopenharmony_ci cat = 'ipi' then 'IPI' || name else name end as ipiName from irq;`, 40fb726d48Sopenharmony_ci {}, 41fb726d48Sopenharmony_ci { traceId: traceId, action: 'exec-buf' } 42fb726d48Sopenharmony_ci ); 43fb726d48Sopenharmony_ci // @ts-ignore 44fb726d48Sopenharmony_ci return Utils.convertJSON(allIrqNamesBuffer); 45fb726d48Sopenharmony_ci}; 46fb726d48Sopenharmony_ci 47fb726d48Sopenharmony_ciexport const queryIrqData = (callid: number, cat: string): Promise<Array<IrqStruct>> => { 48fb726d48Sopenharmony_ci let sqlSoftIrq = ` 49fb726d48Sopenharmony_ci select i.ts - t.start_ts as startNS,i.dur,i.name,i.depth,argsetid as argSetId,i.id from irq i, 50fb726d48Sopenharmony_citrace_range t where i.callid = ${callid} and i.cat = 'softirq' 51fb726d48Sopenharmony_ci `; 52fb726d48Sopenharmony_ci let sqlIrq = ` 53fb726d48Sopenharmony_ci select i.ts - t.start_ts as startNS,i.dur, 54fb726d48Sopenharmony_ci case when i.cat = 'ipi' then 'IPI' || i.name else i.name end as name, 55fb726d48Sopenharmony_ci i.depth, 56fb726d48Sopenharmony_ci argsetid as argSetId, 57fb726d48Sopenharmony_ci i.id 58fb726d48Sopenharmony_ci from irq i,trace_range t 59fb726d48Sopenharmony_ci where i.callid = ${callid} and ((i.cat = 'irq' and i.flag ='1') or i.cat = 'ipi') 60fb726d48Sopenharmony_ci `; 61fb726d48Sopenharmony_ci return query('queryIrqData', cat === 'irq' ? sqlIrq : sqlSoftIrq, {}); 62fb726d48Sopenharmony_ci}; 63fb726d48Sopenharmony_ci 64fb726d48Sopenharmony_ciexport const queryIrqDataBoxSelect = ( 65fb726d48Sopenharmony_ci callIds: Array<number>, 66fb726d48Sopenharmony_ci startNS: number, 67fb726d48Sopenharmony_ci endNS: number 68fb726d48Sopenharmony_ci): Promise<Array<unknown>> => { 69fb726d48Sopenharmony_ci let sqlIrq = ` 70fb726d48Sopenharmony_ciselect case when i.cat = 'ipi' then 'IPI' || i.name else i.name end as irqName, 71fb726d48Sopenharmony_ci 'irq' as cat, 72fb726d48Sopenharmony_ci sum( 73fb726d48Sopenharmony_ci min(${endNS},(i.ts - t.start_ts + iif(i.dur = -1 or i.dur is null, 0, i.dur))) - max(${startNS},i.ts - t.start_ts) 74fb726d48Sopenharmony_ci ) as wallDuration, 75fb726d48Sopenharmony_ci max(dur) as maxDuration, 76fb726d48Sopenharmony_ci count(1) as count, 77fb726d48Sopenharmony_ci avg(ifnull(dur, 0)) as avgDuration 78fb726d48Sopenharmony_cifrom irq i, 79fb726d48Sopenharmony_ci trace_range t 80fb726d48Sopenharmony_ciwhere ((i.cat = 'irq' and i.flag = '1') or i.cat = 'ipi') 81fb726d48Sopenharmony_ci and callid in (${callIds.join(',')}) 82fb726d48Sopenharmony_ci and max(i.ts - t.start_ts, ${startNS}) <= min(i.ts - t.start_ts + dur, ${endNS}) 83fb726d48Sopenharmony_cigroup by irqName; 84fb726d48Sopenharmony_ci `; 85fb726d48Sopenharmony_ci return query('queryIrqDataBoxSelect', callIds.length > 0 ? sqlIrq : '', {}, { traceId: Utils.currentSelectTrace }); 86fb726d48Sopenharmony_ci}; 87fb726d48Sopenharmony_ci 88fb726d48Sopenharmony_ciexport const querySoftIrqDataBoxSelect = ( 89fb726d48Sopenharmony_ci callIds: Array<number>, 90fb726d48Sopenharmony_ci startNS: number, 91fb726d48Sopenharmony_ci endNS: number 92fb726d48Sopenharmony_ci): Promise<Array<unknown>> => { 93fb726d48Sopenharmony_ci let sqlIrq = ` 94fb726d48Sopenharmony_ciselect i.name as irqName, 95fb726d48Sopenharmony_ci i.cat, 96fb726d48Sopenharmony_ci sum( 97fb726d48Sopenharmony_ci min(${endNS},(i.ts - t.start_ts + iif(i.dur = -1 or i.dur is null, 0, i.dur))) - max(${startNS},i.ts - t.start_ts) 98fb726d48Sopenharmony_ci ) as wallDuration, 99fb726d48Sopenharmony_ci max(dur) as maxDuration, 100fb726d48Sopenharmony_ci count(1) as count, 101fb726d48Sopenharmony_ci avg(ifnull(dur, 0)) as avgDuration 102fb726d48Sopenharmony_cifrom irq i, 103fb726d48Sopenharmony_ci trace_range t 104fb726d48Sopenharmony_ciwhere callid in (${callIds.join(',')}) 105fb726d48Sopenharmony_ci and i.cat = 'softirq' 106fb726d48Sopenharmony_ci and max(i.ts - t.start_ts, ${startNS}) <= min(i.ts - t.start_ts + dur, ${endNS}) 107fb726d48Sopenharmony_cigroup by irqName; 108fb726d48Sopenharmony_ci `; 109fb726d48Sopenharmony_ci return query('querySoftIrqDataBoxSelect', callIds.length > 0 ? sqlIrq : '', {}, { traceId: Utils.currentSelectTrace }); 110fb726d48Sopenharmony_ci}; 111fb726d48Sopenharmony_ci 112fb726d48Sopenharmony_ciexport const queryIrqSelectData = (callIds: Array<number>, startNS: number, endNS: number): Promise<Array<IrqAndSoftirqBean>> => 113fb726d48Sopenharmony_ci query( 114fb726d48Sopenharmony_ci 'getIrqSelectData', 115fb726d48Sopenharmony_ci ` 116fb726d48Sopenharmony_ci SELECT 117fb726d48Sopenharmony_ci 'irq' AS cat, 118fb726d48Sopenharmony_ci i.callid, 119fb726d48Sopenharmony_ci CASE 120fb726d48Sopenharmony_ci WHEN i.cat = 'ipi' 121fb726d48Sopenharmony_ci THEN 'IPI' || i.name 122fb726d48Sopenharmony_ci ELSE i.name 123fb726d48Sopenharmony_ci END AS name, 124fb726d48Sopenharmony_ci 1 As count, 125fb726d48Sopenharmony_ci true As isFirstObject, 126fb726d48Sopenharmony_ci 2 AS priority, 127fb726d48Sopenharmony_ci MAX(${startNS},i.ts - TR.start_ts) AS startTime, 128fb726d48Sopenharmony_ci MIN(${endNS},(i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur))) AS endTime, 129fb726d48Sopenharmony_ci MIN(${endNS},(i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur))) - MAX(${startNS},i.ts - TR.start_ts) AS wallDuration 130fb726d48Sopenharmony_ci FROM 131fb726d48Sopenharmony_ci irq i 132fb726d48Sopenharmony_ci LEFT JOIN 133fb726d48Sopenharmony_ci trace_range AS TR 134fb726d48Sopenharmony_ci WHERE 135fb726d48Sopenharmony_ci i.callid IN (${callIds.join(',')}) 136fb726d48Sopenharmony_ci AND 137fb726d48Sopenharmony_ci NOT ((i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur) < ${startNS}) OR (i.ts - TR.start_ts > ${endNS})) 138fb726d48Sopenharmony_ci AND ( ( i.cat = 'irq' AND i.flag = '1' ) OR i.cat = 'ipi' )` 139fb726d48Sopenharmony_ci ); 140fb726d48Sopenharmony_ci 141fb726d48Sopenharmony_ciexport const querySoftirqSelectData = (callIds: Array<number>, startNS: number, endNS: number): Promise<Array<IrqAndSoftirqBean>> => 142fb726d48Sopenharmony_ci query( 143fb726d48Sopenharmony_ci 'getSoftirqSelectData', 144fb726d48Sopenharmony_ci ` 145fb726d48Sopenharmony_ci SELECT 146fb726d48Sopenharmony_ci 'softirq' AS cat, 147fb726d48Sopenharmony_ci i.callid, 148fb726d48Sopenharmony_ci i.name, 149fb726d48Sopenharmony_ci 1 As count, 150fb726d48Sopenharmony_ci true As isFirstObject, 151fb726d48Sopenharmony_ci 1 AS priority, 152fb726d48Sopenharmony_ci MAX(${startNS},i.ts - TR.start_ts) AS startTime, 153fb726d48Sopenharmony_ci MIN(${endNS},(i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur))) AS endTime, 154fb726d48Sopenharmony_ci MIN(${endNS},(i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur))) - MAX(${startNS},i.ts - TR.start_ts) AS wallDuration 155fb726d48Sopenharmony_ci FROM 156fb726d48Sopenharmony_ci irq i 157fb726d48Sopenharmony_ci LEFT JOIN 158fb726d48Sopenharmony_ci trace_range AS TR 159fb726d48Sopenharmony_ci WHERE 160fb726d48Sopenharmony_ci i.callid IN (${callIds.join(',')}) 161fb726d48Sopenharmony_ci AND 162fb726d48Sopenharmony_ci NOT ((i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur) < ${startNS}) OR (i.ts - TR.start_ts > ${endNS})) 163fb726d48Sopenharmony_ci AND 164fb726d48Sopenharmony_ci i.cat = 'softirq' ` 165fb726d48Sopenharmony_ci );