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 { cpuList } from './utils/AllMemoryCache'; 17fb726d48Sopenharmony_ciimport { Args } from './CommonArgs'; 18fb726d48Sopenharmony_ci 19fb726d48Sopenharmony_ciexport const chartCpuDataProtoSql = (args: Args): string => { 20fb726d48Sopenharmony_ci return ` 21fb726d48Sopenharmony_ci SELECT B.pid as processId, 22fb726d48Sopenharmony_ci B.cpu, 23fb726d48Sopenharmony_ci B.tid, 24fb726d48Sopenharmony_ci B.itid as id, 25fb726d48Sopenharmony_ci max(B.dur) AS dur, 26fb726d48Sopenharmony_ci B.ts - ${args.recordStartNS} AS startTime, 27fb726d48Sopenharmony_ci ifnull(B.arg_setid, -1) as argSetId, 28fb726d48Sopenharmony_ci ((B.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px 29fb726d48Sopenharmony_ci from thread_state AS B 30fb726d48Sopenharmony_ci where B.itid is not null 31fb726d48Sopenharmony_ci and B.cpu = ${args.cpu} 32fb726d48Sopenharmony_ci and startTime + dur >= ${Math.floor(args.startNS)} 33fb726d48Sopenharmony_ci and startTime <= ${Math.floor(args.endNS)} 34fb726d48Sopenharmony_ci group by px;`; 35fb726d48Sopenharmony_ci}; 36fb726d48Sopenharmony_ci 37fb726d48Sopenharmony_ciexport const chartCpuDataProtoSqlMem = (args: Args): string => { 38fb726d48Sopenharmony_ci return ` 39fb726d48Sopenharmony_ci SELECT B.pid as processId, 40fb726d48Sopenharmony_ci B.cpu, 41fb726d48Sopenharmony_ci B.tid, 42fb726d48Sopenharmony_ci B.itid as id, 43fb726d48Sopenharmony_ci B.dur AS dur, 44fb726d48Sopenharmony_ci B.ts - ${args.recordStartNS} AS startTime, 45fb726d48Sopenharmony_ci ifnull(B.arg_setid, -1) as argSetId 46fb726d48Sopenharmony_ci from thread_state AS B 47fb726d48Sopenharmony_ci where B.itid is not null 48fb726d48Sopenharmony_ci and B.cpu = ${args.cpu};`; 49fb726d48Sopenharmony_ci}; 50fb726d48Sopenharmony_ci 51fb726d48Sopenharmony_ciexport function cpuDataReceiver(data: unknown, proc: Function): void { 52fb726d48Sopenharmony_ci // @ts-ignore 53fb726d48Sopenharmony_ci if (data.params.trafic === TraficEnum.Memory) { 54fb726d48Sopenharmony_ci let res: unknown[]; 55fb726d48Sopenharmony_ci let list: unknown[]; 56fb726d48Sopenharmony_ci // @ts-ignore 57fb726d48Sopenharmony_ci if (!cpuList.has(data.params.cpu)) { 58fb726d48Sopenharmony_ci // @ts-ignore 59fb726d48Sopenharmony_ci list = proc(chartCpuDataProtoSqlMem(data.params)); 60fb726d48Sopenharmony_ci for (let i = 0; i < list.length; i++) { 61fb726d48Sopenharmony_ci // @ts-ignore 62fb726d48Sopenharmony_ci if (list[i].dur === -1 || list[i].dur === null || list[i].dur === undefined) { 63fb726d48Sopenharmony_ci // @ts-ignore 64fb726d48Sopenharmony_ci list[i].nofinish = 1; 65fb726d48Sopenharmony_ci if (i === list.length - 1) { 66fb726d48Sopenharmony_ci // @ts-ignore 67fb726d48Sopenharmony_ci list[i].dur = data.params.endNS - list[i].startTime; 68fb726d48Sopenharmony_ci } else { 69fb726d48Sopenharmony_ci // @ts-ignore 70fb726d48Sopenharmony_ci list[i].dur = list[i + 1].startTime - list[i].startTime; 71fb726d48Sopenharmony_ci } 72fb726d48Sopenharmony_ci } else { 73fb726d48Sopenharmony_ci // @ts-ignore 74fb726d48Sopenharmony_ci list[i].nofinish = 0; 75fb726d48Sopenharmony_ci } 76fb726d48Sopenharmony_ci } 77fb726d48Sopenharmony_ci // @ts-ignore 78fb726d48Sopenharmony_ci cpuList.set(data.params.cpu, list); 79fb726d48Sopenharmony_ci } else { 80fb726d48Sopenharmony_ci // @ts-ignore 81fb726d48Sopenharmony_ci list = cpuList.get(data.params.cpu) || []; 82fb726d48Sopenharmony_ci } 83fb726d48Sopenharmony_ci // @ts-ignore 84fb726d48Sopenharmony_ci res = filterDataByGroup(list || [], 'startTime', 'dur', data.params.startNS, data.params.endNS, data.params.width); 85fb726d48Sopenharmony_ci arrayBufferHandler(data, res, true); 86fb726d48Sopenharmony_ci } else { 87fb726d48Sopenharmony_ci // @ts-ignore 88fb726d48Sopenharmony_ci let sql = chartCpuDataProtoSql(data.params); 89fb726d48Sopenharmony_ci let res = proc(sql); 90fb726d48Sopenharmony_ci // @ts-ignore 91fb726d48Sopenharmony_ci arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 92fb726d48Sopenharmony_ci } 93fb726d48Sopenharmony_ci} 94fb726d48Sopenharmony_ci 95fb726d48Sopenharmony_ciexport function searchDataHandler(data: unknown): void { 96fb726d48Sopenharmony_ci let res: unknown[] = []; 97fb726d48Sopenharmony_ci // @ts-ignore 98fb726d48Sopenharmony_ci let pidArr = data.params.pidArr as number[]; 99fb726d48Sopenharmony_ci // @ts-ignore 100fb726d48Sopenharmony_ci let tidArr = data.params.tidArr as number[]; 101fb726d48Sopenharmony_ci for (let value of Array.from(cpuList.values())) { 102fb726d48Sopenharmony_ci res.push( 103fb726d48Sopenharmony_ci //@ts-ignore 104fb726d48Sopenharmony_ci ...value.filter((cpuData) => pidArr.includes(cpuData.pid || cpuData.processId) || tidArr.includes(cpuData.tid)) 105fb726d48Sopenharmony_ci ); 106fb726d48Sopenharmony_ci } 107fb726d48Sopenharmony_ci // @ts-ignore 108fb726d48Sopenharmony_ci res.sort((dataA, dataB) => dataA.startTime - dataB.startTime); 109fb726d48Sopenharmony_ci arrayBufferHandler(data, res, true); 110fb726d48Sopenharmony_ci} 111fb726d48Sopenharmony_ci 112fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 113fb726d48Sopenharmony_ci // @ts-ignore 114fb726d48Sopenharmony_ci let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime); 115fb726d48Sopenharmony_ci // @ts-ignore 116fb726d48Sopenharmony_ci let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 117fb726d48Sopenharmony_ci // @ts-ignore 118fb726d48Sopenharmony_ci let tid = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.tid); 119fb726d48Sopenharmony_ci // @ts-ignore 120fb726d48Sopenharmony_ci let id = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.id); 121fb726d48Sopenharmony_ci // @ts-ignore 122fb726d48Sopenharmony_ci let processId = new Int16Array(transfer ? res.length : data.params.sharedArrayBuffers.processId); 123fb726d48Sopenharmony_ci // @ts-ignore 124fb726d48Sopenharmony_ci let cpu = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.cpu); 125fb726d48Sopenharmony_ci // @ts-ignore 126fb726d48Sopenharmony_ci let argSetId = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.argSetId); 127fb726d48Sopenharmony_ci // @ts-ignore 128fb726d48Sopenharmony_ci let nofinish = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.nofinish); 129fb726d48Sopenharmony_ci res.forEach((it, i) => { 130fb726d48Sopenharmony_ci // @ts-ignore 131fb726d48Sopenharmony_ci data.params.trafic === TraficEnum.ProtoBuffer && (it = it.cpuData); 132fb726d48Sopenharmony_ci // @ts-ignore 133fb726d48Sopenharmony_ci startTime[i] = it.startTime; 134fb726d48Sopenharmony_ci // @ts-ignore 135fb726d48Sopenharmony_ci dur[i] = it.dur; 136fb726d48Sopenharmony_ci // @ts-ignore 137fb726d48Sopenharmony_ci tid[i] = it.tid; 138fb726d48Sopenharmony_ci // @ts-ignore 139fb726d48Sopenharmony_ci cpu[i] = it.cpu; 140fb726d48Sopenharmony_ci // @ts-ignore 141fb726d48Sopenharmony_ci id[i] = it.id; 142fb726d48Sopenharmony_ci // @ts-ignore 143fb726d48Sopenharmony_ci nofinish[i] = it.nofinish; 144fb726d48Sopenharmony_ci // @ts-ignore 145fb726d48Sopenharmony_ci processId[i] = it.pid || it.processId; 146fb726d48Sopenharmony_ci // @ts-ignore 147fb726d48Sopenharmony_ci argSetId[i] = it.argSetId; 148fb726d48Sopenharmony_ci }); 149fb726d48Sopenharmony_ci (self as unknown as Worker).postMessage( 150fb726d48Sopenharmony_ci { 151fb726d48Sopenharmony_ci // @ts-ignore 152fb726d48Sopenharmony_ci id: data.id, 153fb726d48Sopenharmony_ci // @ts-ignore 154fb726d48Sopenharmony_ci action: data.action, 155fb726d48Sopenharmony_ci results: transfer 156fb726d48Sopenharmony_ci ? { 157fb726d48Sopenharmony_ci startTime: startTime.buffer, 158fb726d48Sopenharmony_ci dur: dur.buffer, 159fb726d48Sopenharmony_ci tid: tid.buffer, 160fb726d48Sopenharmony_ci id: id.buffer, 161fb726d48Sopenharmony_ci processId: processId.buffer, 162fb726d48Sopenharmony_ci cpu: cpu.buffer, 163fb726d48Sopenharmony_ci argSetID: argSetId.buffer, 164fb726d48Sopenharmony_ci nofinish: nofinish.buffer, 165fb726d48Sopenharmony_ci } 166fb726d48Sopenharmony_ci : {}, 167fb726d48Sopenharmony_ci len: res.length, 168fb726d48Sopenharmony_ci transfer: transfer, 169fb726d48Sopenharmony_ci }, 170fb726d48Sopenharmony_ci transfer 171fb726d48Sopenharmony_ci ? [ 172fb726d48Sopenharmony_ci startTime.buffer, 173fb726d48Sopenharmony_ci dur.buffer, 174fb726d48Sopenharmony_ci tid.buffer, 175fb726d48Sopenharmony_ci id.buffer, 176fb726d48Sopenharmony_ci processId.buffer, 177fb726d48Sopenharmony_ci cpu.buffer, 178fb726d48Sopenharmony_ci argSetId.buffer, 179fb726d48Sopenharmony_ci nofinish.buffer, 180fb726d48Sopenharmony_ci ] 181fb726d48Sopenharmony_ci : [] 182fb726d48Sopenharmony_ci ); 183fb726d48Sopenharmony_ci} 184