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 { cpuStateList } from '../utils/AllMemoryCache'; 17fb726d48Sopenharmony_ciimport { Args } from '../CommonArgs'; 18fb726d48Sopenharmony_ci 19fb726d48Sopenharmony_ciexport const chartCpuStateDataSql = (args: Args): string => { 20fb726d48Sopenharmony_ci return ` 21fb726d48Sopenharmony_ci select (value) as value, 22fb726d48Sopenharmony_ci max(ifnull(dur, ${args.recordEndNS} - A.ts)) as dur, 23fb726d48Sopenharmony_ci (A.ts - ${args.recordStartNS}) as startTs, 24fb726d48Sopenharmony_ci ((A.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px 25fb726d48Sopenharmony_ci from measure A 26fb726d48Sopenharmony_ci where filter_id = ${args.filterId} 27fb726d48Sopenharmony_ci and startTs + ifnull(dur, ${args.recordEndNS} - A.ts) >= ${Math.floor(args.startNS)} 28fb726d48Sopenharmony_ci and startTs <= ${Math.floor(args.endNS)} 29fb726d48Sopenharmony_ci group by px 30fb726d48Sopenharmony_ci union 31fb726d48Sopenharmony_ci select max(value) as value, 32fb726d48Sopenharmony_ci (ifnull(dur, ${args.recordEndNS} - A.ts)) as dur, 33fb726d48Sopenharmony_ci (A.ts - ${args.recordStartNS}) as startTs, 34fb726d48Sopenharmony_ci ((A.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px 35fb726d48Sopenharmony_ci from measure A 36fb726d48Sopenharmony_ci where filter_id = ${args.filterId} 37fb726d48Sopenharmony_ci and startTs + ifnull(dur, ${args.recordEndNS} - A.ts) >= ${Math.floor(args.startNS)} 38fb726d48Sopenharmony_ci and startTs <= ${Math.floor(args.endNS)} 39fb726d48Sopenharmony_ci group by px 40fb726d48Sopenharmony_ci ;`; 41fb726d48Sopenharmony_ci}; 42fb726d48Sopenharmony_ci 43fb726d48Sopenharmony_ciexport const chartCpuStateDataSqlMem = (args: Args): string => { 44fb726d48Sopenharmony_ci return ` 45fb726d48Sopenharmony_ci select (A.ts - ${args.recordStartNS}) as startTs,ifnull(dur,${args.recordEndNS} - A.ts) dur, 46fb726d48Sopenharmony_ci value 47fb726d48Sopenharmony_ci from measure A 48fb726d48Sopenharmony_ci where filter_id = ${args.filterId}; 49fb726d48Sopenharmony_ci `; 50fb726d48Sopenharmony_ci}; 51fb726d48Sopenharmony_ci 52fb726d48Sopenharmony_ciexport function cpuStateReceiver(data: unknown, proc: Function): void { 53fb726d48Sopenharmony_ci // @ts-ignore 54fb726d48Sopenharmony_ci if (data.params.trafic === TraficEnum.Memory) { 55fb726d48Sopenharmony_ci let res: unknown[]; 56fb726d48Sopenharmony_ci let list: unknown[]; 57fb726d48Sopenharmony_ci // @ts-ignore 58fb726d48Sopenharmony_ci if (!cpuStateList.has(data.params.filterId)) { 59fb726d48Sopenharmony_ci // @ts-ignore 60fb726d48Sopenharmony_ci list = proc(chartCpuStateDataSqlMem(data.params)); 61fb726d48Sopenharmony_ci for (let i = 0; i < list.length; i++) { 62fb726d48Sopenharmony_ci // @ts-ignore 63fb726d48Sopenharmony_ci if (list[i].dur === -1 || list[i].dur === null || list[i].dur === undefined) { 64fb726d48Sopenharmony_ci // @ts-ignore 65fb726d48Sopenharmony_ci list[i].dur = data.params.recordEndNS - data.params.recordStartNS - list[i].startTs; 66fb726d48Sopenharmony_ci } 67fb726d48Sopenharmony_ci } 68fb726d48Sopenharmony_ci // @ts-ignore 69fb726d48Sopenharmony_ci cpuStateList.set(data.params.filterId, list); 70fb726d48Sopenharmony_ci } else { 71fb726d48Sopenharmony_ci // @ts-ignore 72fb726d48Sopenharmony_ci list = cpuStateList.get(data.params.filterId) || []; 73fb726d48Sopenharmony_ci } 74fb726d48Sopenharmony_ci res = filterDataByGroup( 75fb726d48Sopenharmony_ci list || [], 76fb726d48Sopenharmony_ci 'startTs', 77fb726d48Sopenharmony_ci 'dur', 78fb726d48Sopenharmony_ci // @ts-ignore 79fb726d48Sopenharmony_ci data.params.startNS, 80fb726d48Sopenharmony_ci // @ts-ignore 81fb726d48Sopenharmony_ci data.params.endNS, 82fb726d48Sopenharmony_ci // @ts-ignore 83fb726d48Sopenharmony_ci data.params.width, 84fb726d48Sopenharmony_ci 'value' 85fb726d48Sopenharmony_ci ); 86fb726d48Sopenharmony_ci arrayBufferHandler(data, res, true); 87fb726d48Sopenharmony_ci } else { 88fb726d48Sopenharmony_ci // @ts-ignore 89fb726d48Sopenharmony_ci let sql = chartCpuStateDataSql(data.params); 90fb726d48Sopenharmony_ci let res = proc(sql); 91fb726d48Sopenharmony_ci // @ts-ignore 92fb726d48Sopenharmony_ci arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 93fb726d48Sopenharmony_ci } 94fb726d48Sopenharmony_ci} 95fb726d48Sopenharmony_ci 96fb726d48Sopenharmony_cilet heights = [4, 8, 12, 16, 20, 24, 28, 32]; 97fb726d48Sopenharmony_ci 98fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 99fb726d48Sopenharmony_ci // @ts-ignore 100fb726d48Sopenharmony_ci let startTs = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTs); 101fb726d48Sopenharmony_ci // @ts-ignore 102fb726d48Sopenharmony_ci let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 103fb726d48Sopenharmony_ci // @ts-ignore 104fb726d48Sopenharmony_ci let value = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.value); 105fb726d48Sopenharmony_ci // @ts-ignore 106fb726d48Sopenharmony_ci let height = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.height); 107fb726d48Sopenharmony_ci res.forEach((it, i) => { 108fb726d48Sopenharmony_ci // @ts-ignore 109fb726d48Sopenharmony_ci data.params.trafic === TraficEnum.ProtoBuffer && (it = it.cpuStateData); 110fb726d48Sopenharmony_ci // @ts-ignore 111fb726d48Sopenharmony_ci startTs[i] = it.startTs; 112fb726d48Sopenharmony_ci // @ts-ignore 113fb726d48Sopenharmony_ci dur[i] = it.dur; 114fb726d48Sopenharmony_ci // @ts-ignore 115fb726d48Sopenharmony_ci value[i] = it.value; 116fb726d48Sopenharmony_ci // @ts-ignore 117fb726d48Sopenharmony_ci height[i] = heights[it.value]; 118fb726d48Sopenharmony_ci }); 119fb726d48Sopenharmony_ci (self as unknown as Worker).postMessage( 120fb726d48Sopenharmony_ci { 121fb726d48Sopenharmony_ci // @ts-ignore 122fb726d48Sopenharmony_ci id: data.id, 123fb726d48Sopenharmony_ci // @ts-ignore 124fb726d48Sopenharmony_ci action: data.action, 125fb726d48Sopenharmony_ci results: transfer 126fb726d48Sopenharmony_ci ? { 127fb726d48Sopenharmony_ci startTs: startTs.buffer, 128fb726d48Sopenharmony_ci dur: dur.buffer, 129fb726d48Sopenharmony_ci value: value.buffer, 130fb726d48Sopenharmony_ci } 131fb726d48Sopenharmony_ci : {}, 132fb726d48Sopenharmony_ci len: res.length, 133fb726d48Sopenharmony_ci transfer: transfer, 134fb726d48Sopenharmony_ci }, 135fb726d48Sopenharmony_ci transfer ? [startTs.buffer, dur.buffer, value.buffer] : [] 136fb726d48Sopenharmony_ci ); 137fb726d48Sopenharmony_ci} 138