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 { clockList, hangList } from './utils/AllMemoryCache'; 16fb726d48Sopenharmony_ciimport { Args } from './CommonArgs'; 17fb726d48Sopenharmony_ci 18fb726d48Sopenharmony_ciexport const chartHangDataSql = (args: Args): string => ` 19fb726d48Sopenharmony_ciSELECT 20fb726d48Sopenharmony_ci c.id as id, 21fb726d48Sopenharmony_ci c.ts - r.start_ts as startNS, 22fb726d48Sopenharmony_ci c.dur as dur, 23fb726d48Sopenharmony_ci t.tid as tid, 24fb726d48Sopenharmony_ci t.name as tname, 25fb726d48Sopenharmony_ci p.pid as pid, 26fb726d48Sopenharmony_ci p.name as pname 27fb726d48Sopenharmony_ciFROM 28fb726d48Sopenharmony_ci callstack c, trace_range r 29fb726d48Sopenharmony_ciLEFT JOIN thread t ON 30fb726d48Sopenharmony_ci t.itid = c.callid 31fb726d48Sopenharmony_ciLEFT JOIN process p ON 32fb726d48Sopenharmony_ci p.ipid = t.ipid 33fb726d48Sopenharmony_ciWHERE 34fb726d48Sopenharmony_ci c.dur >= ${args.minDur} 35fb726d48Sopenharmony_ci AND c.name LIKE 'H:Et:%' 36fb726d48Sopenharmony_ci AND t.is_main_thread = 1 37fb726d48Sopenharmony_ci AND p.pid = ${args.pid} 38fb726d48Sopenharmony_ci`.trim(); 39fb726d48Sopenharmony_ci 40fb726d48Sopenharmony_ciexport interface HangSQLStruct { 41fb726d48Sopenharmony_ci id: number; 42fb726d48Sopenharmony_ci startNS: number; 43fb726d48Sopenharmony_ci dur: number; 44fb726d48Sopenharmony_ci tid: number; 45fb726d48Sopenharmony_ci pid: number; 46fb726d48Sopenharmony_ci} 47fb726d48Sopenharmony_ci 48fb726d48Sopenharmony_ciexport function hangDataReceiver(data: unknown, proc: Function): void { 49fb726d48Sopenharmony_ci // @ts-ignore 50fb726d48Sopenharmony_ci if (data.params.trafic === TraficEnum.Memory) { 51fb726d48Sopenharmony_ci let res: HangSQLStruct[]; 52fb726d48Sopenharmony_ci let list: HangSQLStruct[]; 53fb726d48Sopenharmony_ci 54fb726d48Sopenharmony_ci // @ts-ignore 55fb726d48Sopenharmony_ci if (!hangList.has(data.params.pid)) { 56fb726d48Sopenharmony_ci // @ts-ignore 57fb726d48Sopenharmony_ci let sql = chartHangDataSql(data.params); 58fb726d48Sopenharmony_ci list = proc(sql); 59fb726d48Sopenharmony_ci // @ts-ignore 60fb726d48Sopenharmony_ci hangList.set(data.params.pid, list); 61fb726d48Sopenharmony_ci } 62fb726d48Sopenharmony_ci else { 63fb726d48Sopenharmony_ci // @ts-ignore 64fb726d48Sopenharmony_ci list = hangList.get(data.params.pid) || []; 65fb726d48Sopenharmony_ci } 66fb726d48Sopenharmony_ci 67fb726d48Sopenharmony_ci // @ts-ignore 68fb726d48Sopenharmony_ci if (data.params.queryAll) { 69fb726d48Sopenharmony_ci res = list.filter( 70fb726d48Sopenharmony_ci //@ts-ignore 71fb726d48Sopenharmony_ci (it) => it.startNS + it.dur >= data.params.selectStartNS && it.startNS <= data.params.selectEndNS 72fb726d48Sopenharmony_ci ); 73fb726d48Sopenharmony_ci } 74fb726d48Sopenharmony_ci else { 75fb726d48Sopenharmony_ci res = list; 76fb726d48Sopenharmony_ci } 77fb726d48Sopenharmony_ci 78fb726d48Sopenharmony_ci arrayBufferHandler(data, res, true); 79fb726d48Sopenharmony_ci } 80fb726d48Sopenharmony_ci else { 81fb726d48Sopenharmony_ci // @ts-ignore 82fb726d48Sopenharmony_ci let sql = chartHangDataSql(data.params); 83fb726d48Sopenharmony_ci let res: HangSQLStruct[] = proc(sql); 84fb726d48Sopenharmony_ci // @ts-ignore 85fb726d48Sopenharmony_ci arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 86fb726d48Sopenharmony_ci } 87fb726d48Sopenharmony_ci} 88fb726d48Sopenharmony_ci 89fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: HangSQLStruct[], transfer: boolean = true): void { 90fb726d48Sopenharmony_ci // @ts-ignore 91fb726d48Sopenharmony_ci let id = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.id); 92fb726d48Sopenharmony_ci // @ts-ignore 93fb726d48Sopenharmony_ci let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS); 94fb726d48Sopenharmony_ci // @ts-ignore 95fb726d48Sopenharmony_ci let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 96fb726d48Sopenharmony_ci // @ts-ignore 97fb726d48Sopenharmony_ci let tid = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.tid); 98fb726d48Sopenharmony_ci // @ts-ignore 99fb726d48Sopenharmony_ci let pid = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.pid); 100fb726d48Sopenharmony_ci res.forEach((it, i) => { 101fb726d48Sopenharmony_ci id[i] = it.id; 102fb726d48Sopenharmony_ci startNS[i] = it.startNS; 103fb726d48Sopenharmony_ci dur[i] = it.dur; 104fb726d48Sopenharmony_ci tid[i] = it.tid; 105fb726d48Sopenharmony_ci pid[i] = it.pid; 106fb726d48Sopenharmony_ci }); 107fb726d48Sopenharmony_ci 108fb726d48Sopenharmony_ci let arg1 = { 109fb726d48Sopenharmony_ci // @ts-ignore 110fb726d48Sopenharmony_ci id: data.id, 111fb726d48Sopenharmony_ci // @ts-ignore 112fb726d48Sopenharmony_ci action: data.action, 113fb726d48Sopenharmony_ci results: { 114fb726d48Sopenharmony_ci id: id.buffer, 115fb726d48Sopenharmony_ci startNS: startNS.buffer, 116fb726d48Sopenharmony_ci dur: dur.buffer, 117fb726d48Sopenharmony_ci tid: tid.buffer, 118fb726d48Sopenharmony_ci pid: pid.buffer, 119fb726d48Sopenharmony_ci }, 120fb726d48Sopenharmony_ci len: res.length, 121fb726d48Sopenharmony_ci transfer: transfer, 122fb726d48Sopenharmony_ci }; 123fb726d48Sopenharmony_ci let arg2 = [ 124fb726d48Sopenharmony_ci id.buffer, 125fb726d48Sopenharmony_ci startNS.buffer, 126fb726d48Sopenharmony_ci dur.buffer, 127fb726d48Sopenharmony_ci tid.buffer, 128fb726d48Sopenharmony_ci pid.buffer, 129fb726d48Sopenharmony_ci ]; 130fb726d48Sopenharmony_ci (self as unknown as Worker).postMessage( 131fb726d48Sopenharmony_ci arg1, arg2, 132fb726d48Sopenharmony_ci ); 133fb726d48Sopenharmony_ci}