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 { processFrameList } from '../utils/AllMemoryCache'; 16fb726d48Sopenharmony_ciimport { Args } from '../CommonArgs'; 17fb726d48Sopenharmony_ci 18fb726d48Sopenharmony_ciexport const chartProcessActualDataSql = (args: Args): string => { 19fb726d48Sopenharmony_ci return ` 20fb726d48Sopenharmony_ci SELECT 21fb726d48Sopenharmony_ci (a.ts - ${args.recordStartNS}) AS ts, 22fb726d48Sopenharmony_ci a.dur, 23fb726d48Sopenharmony_ci ${args.pid} as pid, 24fb726d48Sopenharmony_ci a.id, 25fb726d48Sopenharmony_ci a.vsync AS name, 26fb726d48Sopenharmony_ci a.type, 27fb726d48Sopenharmony_ci a.flag AS jankTag, 28fb726d48Sopenharmony_ci a.dst AS dstSlice, 29fb726d48Sopenharmony_ci a.depth 30fb726d48Sopenharmony_ci FROM frame_slice AS a 31fb726d48Sopenharmony_ci WHERE a.type = 0 32fb726d48Sopenharmony_ci AND a.flag <> 2 33fb726d48Sopenharmony_ci AND a.ipid in (select p.ipid from process AS p where p.pid = ${args.pid}) 34fb726d48Sopenharmony_ci ORDER BY a.ipid;`; 35fb726d48Sopenharmony_ci}; 36fb726d48Sopenharmony_ci 37fb726d48Sopenharmony_ciexport const chartProcessActualProtoDataSql = (args: Args): string => { 38fb726d48Sopenharmony_ci return ` 39fb726d48Sopenharmony_ci SELECT 40fb726d48Sopenharmony_ci (a.ts - ${args.recordStartNS}) AS ts, 41fb726d48Sopenharmony_ci a.dur, 42fb726d48Sopenharmony_ci ${args.pid} as pid, 43fb726d48Sopenharmony_ci a.id, 44fb726d48Sopenharmony_ci a.vsync AS name, 45fb726d48Sopenharmony_ci a.type, 46fb726d48Sopenharmony_ci a.flag AS jankTag, 47fb726d48Sopenharmony_ci a.dst AS dstSlice, 48fb726d48Sopenharmony_ci a.depth, 49fb726d48Sopenharmony_ci (a.ts - ${args.recordStartNS}) / (${Math.floor( 50fb726d48Sopenharmony_ci (args.endNS - args.startNS) / args.width 51fb726d48Sopenharmony_ci )}) + (a.depth * ${args.width}) AS px 52fb726d48Sopenharmony_ci FROM frame_slice AS a 53fb726d48Sopenharmony_ci WHERE a.type = 0 54fb726d48Sopenharmony_ci AND a.flag <> 2 55fb726d48Sopenharmony_ci AND a.ipid in (select p.ipid from process AS p where p.pid = ${args.pid}) 56fb726d48Sopenharmony_ci AND (a.ts - ${args.recordStartNS}) + dur >= ${Math.floor(args.startNS)} 57fb726d48Sopenharmony_ci 58fb726d48Sopenharmony_ci AND (a.ts - ${args.recordStartNS}) <= ${Math.floor(args.endNS)} 59fb726d48Sopenharmony_ci group by px 60fb726d48Sopenharmony_ci ORDER BY a.ipid;`; 61fb726d48Sopenharmony_ci}; 62fb726d48Sopenharmony_ci 63fb726d48Sopenharmony_ciexport function processActualDataReceiver(data: unknown, proc: Function): void { 64fb726d48Sopenharmony_ci //@ts-ignore 65fb726d48Sopenharmony_ci if (data.params.trafic === TraficEnum.Memory) { 66fb726d48Sopenharmony_ci //@ts-ignore 67fb726d48Sopenharmony_ci if (!processFrameList.has(`${data.params.pid}_actual`)) { 68fb726d48Sopenharmony_ci //@ts-ignore 69fb726d48Sopenharmony_ci let sql = chartProcessActualDataSql(data.params); //@ts-ignore 70fb726d48Sopenharmony_ci processFrameList.set(`${data.params.pid}_actual`, proc(sql)); 71fb726d48Sopenharmony_ci } //@ts-ignore 72fb726d48Sopenharmony_ci arrayBufferHandler(data, processFrameList.get(`${data.params.pid}_actual`)!, true); 73fb726d48Sopenharmony_ci } else { 74fb726d48Sopenharmony_ci //@ts-ignore 75fb726d48Sopenharmony_ci let sql = chartProcessActualProtoDataSql(data.params); 76fb726d48Sopenharmony_ci let res = proc(sql); //@ts-ignore 77fb726d48Sopenharmony_ci arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 78fb726d48Sopenharmony_ci } 79fb726d48Sopenharmony_ci} 80fb726d48Sopenharmony_ci 81fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 82fb726d48Sopenharmony_ci let processActual = new ProcessActual(data, transfer, res.length); 83fb726d48Sopenharmony_ci for (let index = 0; index < res.length; index++) { 84fb726d48Sopenharmony_ci let itemData = res[index]; //@ts-ignore 85fb726d48Sopenharmony_ci data.params.trafic === TraficEnum.ProtoBuffer && (itemData = itemData.processJanksActualData); //@ts-ignore 86fb726d48Sopenharmony_ci if (!itemData.dur || itemData.dur < 0) { 87fb726d48Sopenharmony_ci continue; 88fb726d48Sopenharmony_ci } //@ts-ignore 89fb726d48Sopenharmony_ci processActual.dur[index] = itemData.dur; //@ts-ignore 90fb726d48Sopenharmony_ci processActual.ts[index] = itemData.ts; //@ts-ignore 91fb726d48Sopenharmony_ci processActual.pid[index] = itemData.pid; //@ts-ignore 92fb726d48Sopenharmony_ci processActual.id[index] = itemData.id; //@ts-ignore 93fb726d48Sopenharmony_ci processActual.name[index] = itemData.name; //@ts-ignore 94fb726d48Sopenharmony_ci processActual.type[index] = itemData.type; //@ts-ignore 95fb726d48Sopenharmony_ci processActual.jank_tag[index] = itemData.jankTag; //@ts-ignore 96fb726d48Sopenharmony_ci processActual.dst_slice[index] = itemData.dstSlice; //@ts-ignore 97fb726d48Sopenharmony_ci processActual.depth[index] = itemData.depth; 98fb726d48Sopenharmony_ci } 99fb726d48Sopenharmony_ci postProcessActualMessage(data, transfer, processActual, res.length); 100fb726d48Sopenharmony_ci} 101fb726d48Sopenharmony_cifunction postProcessActualMessage(data: unknown, transfer: boolean, processActual: ProcessActual, len: number): void { 102fb726d48Sopenharmony_ci (self as unknown as Worker).postMessage( 103fb726d48Sopenharmony_ci { 104fb726d48Sopenharmony_ci //@ts-ignore 105fb726d48Sopenharmony_ci id: data.id, //@ts-ignore 106fb726d48Sopenharmony_ci action: data.action, 107fb726d48Sopenharmony_ci results: transfer 108fb726d48Sopenharmony_ci ? { 109fb726d48Sopenharmony_ci dur: processActual.dur.buffer, 110fb726d48Sopenharmony_ci ts: processActual.ts.buffer, 111fb726d48Sopenharmony_ci pid: processActual.pid.buffer, 112fb726d48Sopenharmony_ci id: processActual.id.buffer, 113fb726d48Sopenharmony_ci name: processActual.name.buffer, 114fb726d48Sopenharmony_ci type: processActual.type.buffer, 115fb726d48Sopenharmony_ci jank_tag: processActual.jank_tag.buffer, 116fb726d48Sopenharmony_ci dst_slice: processActual.dst_slice.buffer, 117fb726d48Sopenharmony_ci depth: processActual.depth.buffer, 118fb726d48Sopenharmony_ci } 119fb726d48Sopenharmony_ci : {}, 120fb726d48Sopenharmony_ci len: len, 121fb726d48Sopenharmony_ci transfer: transfer, 122fb726d48Sopenharmony_ci }, 123fb726d48Sopenharmony_ci transfer 124fb726d48Sopenharmony_ci ? [ 125fb726d48Sopenharmony_ci processActual.dur.buffer, 126fb726d48Sopenharmony_ci processActual.ts.buffer, 127fb726d48Sopenharmony_ci processActual.pid.buffer, 128fb726d48Sopenharmony_ci processActual.type.buffer, 129fb726d48Sopenharmony_ci processActual.id.buffer, 130fb726d48Sopenharmony_ci processActual.name.buffer, 131fb726d48Sopenharmony_ci processActual.jank_tag.buffer, 132fb726d48Sopenharmony_ci processActual.dst_slice.buffer, 133fb726d48Sopenharmony_ci processActual.depth.buffer, 134fb726d48Sopenharmony_ci ] 135fb726d48Sopenharmony_ci : [] 136fb726d48Sopenharmony_ci ); 137fb726d48Sopenharmony_ci} 138fb726d48Sopenharmony_ciclass ProcessActual { 139fb726d48Sopenharmony_ci ts: Float64Array; 140fb726d48Sopenharmony_ci dur: Float64Array; 141fb726d48Sopenharmony_ci pid: Int32Array; 142fb726d48Sopenharmony_ci id: Int32Array; 143fb726d48Sopenharmony_ci name: Int32Array; 144fb726d48Sopenharmony_ci type: Int32Array; 145fb726d48Sopenharmony_ci jank_tag: Int32Array; 146fb726d48Sopenharmony_ci dst_slice: Int32Array; 147fb726d48Sopenharmony_ci depth: Uint16Array; 148fb726d48Sopenharmony_ci constructor(data: unknown, transfer: boolean, len: number) { 149fb726d48Sopenharmony_ci //@ts-ignore 150fb726d48Sopenharmony_ci this.ts = new Float64Array(transfer ? len : data.params.sharedArrayBuffers.ts); //@ts-ignore 151fb726d48Sopenharmony_ci this.dur = new Float64Array(transfer ? len : data.params.sharedArrayBuffers.dur); //@ts-ignore 152fb726d48Sopenharmony_ci this.pid = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.pid); //@ts-ignore 153fb726d48Sopenharmony_ci this.id = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.id); //@ts-ignore 154fb726d48Sopenharmony_ci this.name = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.name); //@ts-ignore 155fb726d48Sopenharmony_ci this.type = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.type); //@ts-ignore 156fb726d48Sopenharmony_ci this.jank_tag = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.jank_tag); //@ts-ignore 157fb726d48Sopenharmony_ci this.dst_slice = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.dst_slice); //@ts-ignore 158fb726d48Sopenharmony_ci this.depth = new Uint16Array(transfer ? len : data.params.sharedArrayBuffers.depth); 159fb726d48Sopenharmony_ci } 160fb726d48Sopenharmony_ci} 161