1fb726d48Sopenharmony_ci// Copyright (c) 2021 Huawei Device Co., Ltd. 2fb726d48Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 3fb726d48Sopenharmony_ci// you may not use this file except in compliance with the License. 4fb726d48Sopenharmony_ci// You may obtain a copy of the License at 5fb726d48Sopenharmony_ci// 6fb726d48Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 7fb726d48Sopenharmony_ci// 8fb726d48Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 9fb726d48Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 10fb726d48Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11fb726d48Sopenharmony_ci// See the License for the specific language governing permissions and 12fb726d48Sopenharmony_ci// limitations under the License. 13fb726d48Sopenharmony_ci 14fb726d48Sopenharmony_ciimport { TraficEnum } from '../utils/QueryEnum'; 15fb726d48Sopenharmony_ciimport { filterDataByGroup } from '../utils/DataFilter'; 16fb726d48Sopenharmony_ciimport { cpuFreqLimitList } from '../utils/AllMemoryCache'; 17fb726d48Sopenharmony_ciimport { Args } from '../CommonArgs'; 18fb726d48Sopenharmony_ci 19fb726d48Sopenharmony_ciexport const chartCpuFreqLimitDataSql = (args: Args): string => { 20fb726d48Sopenharmony_ci const endNS = args.endNS; 21fb726d48Sopenharmony_ci const startNS = args.startNS; 22fb726d48Sopenharmony_ci const recordStartNS = args.recordStartNS; 23fb726d48Sopenharmony_ci const cpu = args.cpu; 24fb726d48Sopenharmony_ci const width = args.width; 25fb726d48Sopenharmony_ci const maxId = args.maxId; 26fb726d48Sopenharmony_ci const minId = args.minId; 27fb726d48Sopenharmony_ci return ` 28fb726d48Sopenharmony_ci SELECT 29fb726d48Sopenharmony_ci max AS max, 30fb726d48Sopenharmony_ci min AS min, 31fb726d48Sopenharmony_ci value, 32fb726d48Sopenharmony_ci max(dura) AS dur, 33fb726d48Sopenharmony_ci startNs AS startNs, 34fb726d48Sopenharmony_ci ${cpu} AS cpu, 35fb726d48Sopenharmony_ci (startNs / (${Math.floor((endNS - startNS) / width)})) AS px 36fb726d48Sopenharmony_ci FROM ( 37fb726d48Sopenharmony_ci SELECT ts - ${recordStartNS} AS startNs, 38fb726d48Sopenharmony_ci case when dur is null then (${endNS + recordStartNS} - ts) else dur end AS dura, 39fb726d48Sopenharmony_ci value, 40fb726d48Sopenharmony_ci MAX (value) AS max, 41fb726d48Sopenharmony_ci MIN (value) AS min 42fb726d48Sopenharmony_ci FROM measure 43fb726d48Sopenharmony_ci WHERE filter_id IN (${maxId}, ${minId}) 44fb726d48Sopenharmony_ci AND startNs + dura >= ${Math.floor(startNS)} 45fb726d48Sopenharmony_ci AND startNs <= ${Math.floor(endNS)} 46fb726d48Sopenharmony_ci GROUP BY ts 47fb726d48Sopenharmony_ci ) AS subquery 48fb726d48Sopenharmony_ci GROUP BY px; 49fb726d48Sopenharmony_ci `; 50fb726d48Sopenharmony_ci}; 51fb726d48Sopenharmony_ci 52fb726d48Sopenharmony_ciexport const chartCpuFreqLimitDataSqlMem = (args: Args): string => { 53fb726d48Sopenharmony_ci return ` 54fb726d48Sopenharmony_ci select ts - ${args.recordStartNS} as startNs, 55fb726d48Sopenharmony_ci dur, 56fb726d48Sopenharmony_ci max(value) as max, 57fb726d48Sopenharmony_ci min(value) as min, 58fb726d48Sopenharmony_ci $cpu as cpu 59fb726d48Sopenharmony_ci from measure where filter_id in (${args.maxId}, ${args.minId}) 60fb726d48Sopenharmony_ci group by ts; 61fb726d48Sopenharmony_ci `; 62fb726d48Sopenharmony_ci}; 63fb726d48Sopenharmony_ci 64fb726d48Sopenharmony_ciexport function cpuFreqLimitReceiver(data: unknown, proc: Function): void { 65fb726d48Sopenharmony_ci // @ts-ignore 66fb726d48Sopenharmony_ci if (data.params.trafic === TraficEnum.Memory) { 67fb726d48Sopenharmony_ci let res: unknown[]; 68fb726d48Sopenharmony_ci let list: unknown[]; 69fb726d48Sopenharmony_ci // @ts-ignore 70fb726d48Sopenharmony_ci if (!cpuFreqLimitList.has(data.params.cpu)) { 71fb726d48Sopenharmony_ci // @ts-ignore 72fb726d48Sopenharmony_ci let sql = chartCpuFreqLimitDataSqlMem(data.params); 73fb726d48Sopenharmony_ci list = proc(sql); 74fb726d48Sopenharmony_ci for (let i = 0; i < list.length; i++) { 75fb726d48Sopenharmony_ci if (i < list.length - 1) { 76fb726d48Sopenharmony_ci // @ts-ignore 77fb726d48Sopenharmony_ci list[i].dur = list[i + 1].startNs - list[i].startNs; 78fb726d48Sopenharmony_ci } else { 79fb726d48Sopenharmony_ci // @ts-ignore 80fb726d48Sopenharmony_ci list[i].dur = data.params.recordEndNS - data.params.recordStartNS - list[i].startNs; 81fb726d48Sopenharmony_ci } 82fb726d48Sopenharmony_ci } 83fb726d48Sopenharmony_ci // @ts-ignore 84fb726d48Sopenharmony_ci cpuFreqLimitList.set(data.params.cpu, list); 85fb726d48Sopenharmony_ci } else { 86fb726d48Sopenharmony_ci // @ts-ignore 87fb726d48Sopenharmony_ci list = cpuFreqLimitList.get(data.params.cpu) || []; 88fb726d48Sopenharmony_ci } 89fb726d48Sopenharmony_ci res = filterDataByGroup( 90fb726d48Sopenharmony_ci list || [], 91fb726d48Sopenharmony_ci 'startNs', 92fb726d48Sopenharmony_ci 'dur', 93fb726d48Sopenharmony_ci // @ts-ignore 94fb726d48Sopenharmony_ci data.params.startNS, 95fb726d48Sopenharmony_ci // @ts-ignore 96fb726d48Sopenharmony_ci data.params.endNS, 97fb726d48Sopenharmony_ci // @ts-ignore 98fb726d48Sopenharmony_ci data.params.width, 99fb726d48Sopenharmony_ci 'value' 100fb726d48Sopenharmony_ci ); 101fb726d48Sopenharmony_ci arrayBufferHandler(data, res, true); 102fb726d48Sopenharmony_ci } else { 103fb726d48Sopenharmony_ci // @ts-ignore 104fb726d48Sopenharmony_ci let sql = chartCpuFreqLimitDataSql(data.params); 105fb726d48Sopenharmony_ci let res = proc(sql); 106fb726d48Sopenharmony_ci // @ts-ignore 107fb726d48Sopenharmony_ci arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 108fb726d48Sopenharmony_ci } 109fb726d48Sopenharmony_ci} 110fb726d48Sopenharmony_ci 111fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 112fb726d48Sopenharmony_ci // @ts-ignore 113fb726d48Sopenharmony_ci let startNs = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNs); 114fb726d48Sopenharmony_ci // @ts-ignore 115fb726d48Sopenharmony_ci let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 116fb726d48Sopenharmony_ci // @ts-ignore 117fb726d48Sopenharmony_ci let value = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.value); 118fb726d48Sopenharmony_ci // @ts-ignore 119fb726d48Sopenharmony_ci let max = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.max); 120fb726d48Sopenharmony_ci // @ts-ignore 121fb726d48Sopenharmony_ci let min = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.min); 122fb726d48Sopenharmony_ci res.forEach((it, i) => { 123fb726d48Sopenharmony_ci // @ts-ignore 124fb726d48Sopenharmony_ci data.params.trafic === TraficEnum.ProtoBuffer && (it = it.cpuFreqLimitData); 125fb726d48Sopenharmony_ci // @ts-ignore 126fb726d48Sopenharmony_ci startNs[i] = it.startNs; 127fb726d48Sopenharmony_ci // @ts-ignore 128fb726d48Sopenharmony_ci dur[i] = it.dur; 129fb726d48Sopenharmony_ci // @ts-ignore 130fb726d48Sopenharmony_ci value[i] = it.value; 131fb726d48Sopenharmony_ci // @ts-ignore 132fb726d48Sopenharmony_ci max[i] = it.max; 133fb726d48Sopenharmony_ci // @ts-ignore 134fb726d48Sopenharmony_ci min[i] = it.min; 135fb726d48Sopenharmony_ci }); 136fb726d48Sopenharmony_ci (self as unknown as Worker).postMessage( 137fb726d48Sopenharmony_ci { 138fb726d48Sopenharmony_ci // @ts-ignore 139fb726d48Sopenharmony_ci id: data.id, 140fb726d48Sopenharmony_ci // @ts-ignore 141fb726d48Sopenharmony_ci action: data.action, 142fb726d48Sopenharmony_ci results: transfer 143fb726d48Sopenharmony_ci ? { 144fb726d48Sopenharmony_ci startNs: startNs.buffer, 145fb726d48Sopenharmony_ci dur: dur.buffer, 146fb726d48Sopenharmony_ci value: value.buffer, 147fb726d48Sopenharmony_ci max: max.buffer, 148fb726d48Sopenharmony_ci min: min.buffer, 149fb726d48Sopenharmony_ci } 150fb726d48Sopenharmony_ci : {}, 151fb726d48Sopenharmony_ci len: res.length, 152fb726d48Sopenharmony_ci transfer: transfer, 153fb726d48Sopenharmony_ci }, 154fb726d48Sopenharmony_ci transfer ? [startNs.buffer, dur.buffer, value.buffer, max.buffer, min.buffer] : [] 155fb726d48Sopenharmony_ci ); 156fb726d48Sopenharmony_ci} 157