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 { Args } from './CommonArgs'; 15fb726d48Sopenharmony_ciimport { cpuList, processList, sliceList, threadStateList } from './utils/AllMemoryCache'; 16fb726d48Sopenharmony_ciconst dataCache: { 17fb726d48Sopenharmony_ci argSetID: number | null | undefined; 18fb726d48Sopenharmony_ci cpu: number | null | undefined; 19fb726d48Sopenharmony_ci dur: number | null | undefined; 20fb726d48Sopenharmony_ci itid: number | null | undefined; 21fb726d48Sopenharmony_ci pid: number | null | undefined; 22fb726d48Sopenharmony_ci state: string | null | undefined; 23fb726d48Sopenharmony_ci tid: number | null | undefined; 24fb726d48Sopenharmony_ci startTime: number | null | undefined; 25fb726d48Sopenharmony_ci} = { 26fb726d48Sopenharmony_ci argSetID: null, 27fb726d48Sopenharmony_ci cpu: null, 28fb726d48Sopenharmony_ci dur: null, 29fb726d48Sopenharmony_ci itid: null, 30fb726d48Sopenharmony_ci pid: null, 31fb726d48Sopenharmony_ci state: null, 32fb726d48Sopenharmony_ci tid: null, 33fb726d48Sopenharmony_ci startTime: null 34fb726d48Sopenharmony_ci}; 35fb726d48Sopenharmony_ciexport const sliceSqlMem = (args: Args): string => { 36fb726d48Sopenharmony_ci return ` 37fb726d48Sopenharmony_ci SELECT B.pid, 38fb726d48Sopenharmony_ci B.cpu, 39fb726d48Sopenharmony_ci B.tid, 40fb726d48Sopenharmony_ci B.itid as id, 41fb726d48Sopenharmony_ci B.dur AS dur, 42fb726d48Sopenharmony_ci B.state, 43fb726d48Sopenharmony_ci B.ts - ${args.recordStartNS} AS startTime, 44fb726d48Sopenharmony_ci ifnull(B.arg_setid, -1) as argSetId 45fb726d48Sopenharmony_ci from thread_state AS B 46fb726d48Sopenharmony_ci where B.itid is not null and B.ts + ifnull(B.dur, 0) < ${args.recordEndNS}`; 47fb726d48Sopenharmony_ci}; 48fb726d48Sopenharmony_ci 49fb726d48Sopenharmony_ciexport function sliceReceiver(data: unknown, proc: Function): void { 50fb726d48Sopenharmony_ci let count = { 51fb726d48Sopenharmony_ci cpu: new Map<number, number>(), 52fb726d48Sopenharmony_ci }; 53fb726d48Sopenharmony_ci // 存储线程及其状态耗时总和;用以线程泳道排序 54fb726d48Sopenharmony_ci let threadMap = new Map<string, number>(); 55fb726d48Sopenharmony_ci let processRowSortMap = new Map<string, number>(); 56fb726d48Sopenharmony_ci sliceList.clear(); 57fb726d48Sopenharmony_ci cpuList.clear(); 58fb726d48Sopenharmony_ci processList.clear(); 59fb726d48Sopenharmony_ci threadStateList.clear(); //@ts-ignore 60fb726d48Sopenharmony_ci let list: unknown[] = proc(sliceSqlMem(data.params)); 61fb726d48Sopenharmony_ci sliceList.set(0, list); 62fb726d48Sopenharmony_ci for (let i = 0; i < list.length; i++) { 63fb726d48Sopenharmony_ci let slice = list[i]; //@ts-ignore 64fb726d48Sopenharmony_ci // @ts-ignore 65fb726d48Sopenharmony_ci if (slice.pid > 0 && typeof slice.pid === 'number' && slice.state === 'Running') { 66fb726d48Sopenharmony_ci // @ts-ignore 67fb726d48Sopenharmony_ci if (!processRowSortMap.has(slice.pid)) { 68fb726d48Sopenharmony_ci // @ts-ignore 69fb726d48Sopenharmony_ci processRowSortMap.set(slice.pid, slice.dur); 70fb726d48Sopenharmony_ci } else { 71fb726d48Sopenharmony_ci // @ts-ignore 72fb726d48Sopenharmony_ci let val = processRowSortMap.get(slice.pid); 73fb726d48Sopenharmony_ci // @ts-ignore 74fb726d48Sopenharmony_ci processRowSortMap.set(slice.pid, val + slice.dur); 75fb726d48Sopenharmony_ci } 76fb726d48Sopenharmony_ci }// @ts-ignore 77fb726d48Sopenharmony_ci if (slice.cpu !== null && slice.cpu !== undefined) { 78fb726d48Sopenharmony_ci //@ts-ignore 79fb726d48Sopenharmony_ci if (cpuList.has(slice.cpu)) { 80fb726d48Sopenharmony_ci //@ts-ignore 81fb726d48Sopenharmony_ci let arr = cpuList.get(slice.cpu) || []; 82fb726d48Sopenharmony_ci let last = arr[arr.length - 1]; 83fb726d48Sopenharmony_ci //@ts-ignore 84fb726d48Sopenharmony_ci if (last && (last.dur === -1 || last.dur === null || last.dur === undefined)) { 85fb726d48Sopenharmony_ci //@ts-ignore 86fb726d48Sopenharmony_ci last.dur = slice.startTime - last.startTime; 87fb726d48Sopenharmony_ci } //@ts-ignore 88fb726d48Sopenharmony_ci cpuList.get(slice.cpu)!.push(slice); 89fb726d48Sopenharmony_ci } else { 90fb726d48Sopenharmony_ci //@ts-ignore 91fb726d48Sopenharmony_ci cpuList.set(slice.cpu, [slice]); 92fb726d48Sopenharmony_ci } 93fb726d48Sopenharmony_ci } //@ts-ignore 94fb726d48Sopenharmony_ci if (slice.pid >= 0 && slice.cpu !== null && slice.cpu !== undefined) { 95fb726d48Sopenharmony_ci //@ts-ignore 96fb726d48Sopenharmony_ci if (processList.has(slice.pid)) { 97fb726d48Sopenharmony_ci //@ts-ignore 98fb726d48Sopenharmony_ci processList.get(slice.pid)!.push(slice); 99fb726d48Sopenharmony_ci } else { 100fb726d48Sopenharmony_ci //@ts-ignore 101fb726d48Sopenharmony_ci processList.set(slice.pid, [slice]); 102fb726d48Sopenharmony_ci } 103fb726d48Sopenharmony_ci } //@ts-ignore 104fb726d48Sopenharmony_ci if (slice.pid >= 0 && slice.tid >= 0) { 105fb726d48Sopenharmony_ci //@ts-ignore 106fb726d48Sopenharmony_ci let key = `${slice.pid}-${slice.tid}`; 107fb726d48Sopenharmony_ci if (threadStateList.has(key)) { 108fb726d48Sopenharmony_ci threadStateList.get(key)!.push(slice); 109fb726d48Sopenharmony_ci } else { 110fb726d48Sopenharmony_ci threadStateList.set(key, [slice]); 111fb726d48Sopenharmony_ci } 112fb726d48Sopenharmony_ci // @ts-ignore 113fb726d48Sopenharmony_ci if (slice.state === 'S' || typeof slice.dur !== 'number' || slice.tid === 0) { 114fb726d48Sopenharmony_ci continue; 115fb726d48Sopenharmony_ci } else { 116fb726d48Sopenharmony_ci // @ts-ignore 117fb726d48Sopenharmony_ci if (!threadMap.has(key)) { 118fb726d48Sopenharmony_ci // @ts-ignore 119fb726d48Sopenharmony_ci threadMap.set(key, slice.dur); 120fb726d48Sopenharmony_ci } else { 121fb726d48Sopenharmony_ci // @ts-ignore 122fb726d48Sopenharmony_ci let val = threadMap.get(key); 123fb726d48Sopenharmony_ci // @ts-ignore 124fb726d48Sopenharmony_ci threadMap.set(key, val + slice.dur); 125fb726d48Sopenharmony_ci } 126fb726d48Sopenharmony_ci } 127fb726d48Sopenharmony_ci } 128fb726d48Sopenharmony_ci } 129fb726d48Sopenharmony_ci for (let key of cpuList.keys()) { 130fb726d48Sopenharmony_ci let arr = cpuList.get(key) || []; 131fb726d48Sopenharmony_ci count.cpu.set(key, arr.length); 132fb726d48Sopenharmony_ci } 133fb726d48Sopenharmony_ci //处理threadList最后一个符合条件的dur 134fb726d48Sopenharmony_ci for (let key of threadStateList.keys()) { 135fb726d48Sopenharmony_ci let arr = threadStateList.get(key) || []; 136fb726d48Sopenharmony_ci let last = arr[arr.length - 1]; 137fb726d48Sopenharmony_ci if (!last) { 138fb726d48Sopenharmony_ci continue; 139fb726d48Sopenharmony_ci } 140fb726d48Sopenharmony_ci //@ts-ignore 141fb726d48Sopenharmony_ci switch (last.state) { 142fb726d48Sopenharmony_ci case 'S': 143fb726d48Sopenharmony_ci case 'I': 144fb726d48Sopenharmony_ci case 'T': 145fb726d48Sopenharmony_ci case 'X': 146fb726d48Sopenharmony_ci break; 147fb726d48Sopenharmony_ci default: 148fb726d48Sopenharmony_ci //@ts-ignore 149fb726d48Sopenharmony_ci if (last.dur === -1 || last.dur === null || last.dur === undefined) { 150fb726d48Sopenharmony_ci //@ts-ignore 151fb726d48Sopenharmony_ci let totalNs = data.params.recordEndNS - data.params.recordStartNS; //@ts-ignore 152fb726d48Sopenharmony_ci last.dur = totalNs - last.startTime; 153fb726d48Sopenharmony_ci } 154fb726d48Sopenharmony_ci break; 155fb726d48Sopenharmony_ci } 156fb726d48Sopenharmony_ci } 157fb726d48Sopenharmony_ci //处理热点数据 158fb726d48Sopenharmony_ci //@ts-ignore 159fb726d48Sopenharmony_ci let cpuUtiliRateArray = getCpuUtiliRate(cpuList, data.params); 160fb726d48Sopenharmony_ci postMsg(data, { count, threadMap, processRowSortMap, cpuUtiliRateArray }); 161fb726d48Sopenharmony_ci} 162fb726d48Sopenharmony_ci 163fb726d48Sopenharmony_cifunction getCpuUtiliRate(cpulist: Map<number, Array<unknown>>, args: Args): Array<unknown> { 164fb726d48Sopenharmony_ci // cpu进行排序 165fb726d48Sopenharmony_ci let cpuListArray = Array.from(cpulist.entries()); 166fb726d48Sopenharmony_ci //@ts-ignore 167fb726d48Sopenharmony_ci cpuListArray.sort((a: unknown, b: unknown) => parseInt(a[0]) - parseInt(b[0])); 168fb726d48Sopenharmony_ci let cpuListMap = new Map(cpuListArray); 169fb726d48Sopenharmony_ci let cpuUtiliRateArray = new Array(); 170fb726d48Sopenharmony_ci let cell = Math.floor((args.recordEndNS - args.recordStartNS) / 100);//分成100个格子,cell每个格子的持续时间 171fb726d48Sopenharmony_ci for (const [cpu, list] of cpuListMap.entries()) { 172fb726d48Sopenharmony_ci let ro = 0; 173fb726d48Sopenharmony_ci let index = 0; 174fb726d48Sopenharmony_ci let sumTime = 0; 175fb726d48Sopenharmony_ci //@ts-ignore 176fb726d48Sopenharmony_ci let sliceSt = list[0].startTime;//起始时间 177fb726d48Sopenharmony_ci let cellSt = ro * cell;//每个格子起始时间 178fb726d48Sopenharmony_ci let cellEt = (ro + 1) * cell;//每个格子的结束时间 179fb726d48Sopenharmony_ci //@ts-ignore 180fb726d48Sopenharmony_ci while (index < list.length && ro <= 99) { 181fb726d48Sopenharmony_ci let isGoNextRo = false;//标志位,当下格子区间内的cpu切片持续时间是否统计结束,如统计结束true可跳转至下一个格子区间,反之false 182fb726d48Sopenharmony_ci //@ts-ignore 183fb726d48Sopenharmony_ci let sliceEt = list[index].startTime + list[index].dur;//cpu结束时间 184fb726d48Sopenharmony_ci if (sliceSt >= cellSt && sliceEt <= cellEt) {//包含在ro内 185fb726d48Sopenharmony_ci //@ts-ignore 186fb726d48Sopenharmony_ci sumTime += (sliceEt - sliceSt);//cpu dur累加 187fb726d48Sopenharmony_ci //@ts-ignore 188fb726d48Sopenharmony_ci sliceSt = index + 1 >= list.length ? sliceSt : list[index + 1].startTime;//处理最后一条cpu数据 189fb726d48Sopenharmony_ci index++; 190fb726d48Sopenharmony_ci } else if (sliceSt >= cellSt && sliceSt < cellEt && sliceEt > cellEt) {//部分包含在ro内 191fb726d48Sopenharmony_ci sumTime = sumTime + (cellEt - sliceSt); 192fb726d48Sopenharmony_ci sliceSt = cellEt; 193fb726d48Sopenharmony_ci isGoNextRo = true; 194fb726d48Sopenharmony_ci } else if (sliceSt >= cellEt) {//不包含在ro内 195fb726d48Sopenharmony_ci isGoNextRo = true; 196fb726d48Sopenharmony_ci } else {//保护逻辑 197fb726d48Sopenharmony_ci //@ts-ignore 198fb726d48Sopenharmony_ci sliceSt = index + 1 >= list.length ? sliceSt : list[index + 1].startTime; 199fb726d48Sopenharmony_ci index++; 200fb726d48Sopenharmony_ci } 201fb726d48Sopenharmony_ci if (isGoNextRo) {//格子内cpu dur累加结束 跳转至下一个Ro 处理比率 储存处理后的数据 202fb726d48Sopenharmony_ci ro++; 203fb726d48Sopenharmony_ci cellSt = ro * cell;//下一个格子的起始时间 204fb726d48Sopenharmony_ci //第99个格子结束时间为recordEndNS,确保覆盖整个时间范围 205fb726d48Sopenharmony_ci if (ro < 99) { 206fb726d48Sopenharmony_ci cellEt = (ro + 1) * cell;//下一个格子结束时间 207fb726d48Sopenharmony_ci } else { 208fb726d48Sopenharmony_ci cellEt = args.recordEndNS - args.recordStartNS; 209fb726d48Sopenharmony_ci } 210fb726d48Sopenharmony_ci //处理比率 储存处理后的数据 211fb726d48Sopenharmony_ci if (sumTime !== 0) { 212fb726d48Sopenharmony_ci let rate = sumTime / cell; 213fb726d48Sopenharmony_ci cpuUtiliRateArray.push({ ro: ro - 1, cpu, rate }); 214fb726d48Sopenharmony_ci sumTime = 0; 215fb726d48Sopenharmony_ci } 216fb726d48Sopenharmony_ci } 217fb726d48Sopenharmony_ci } 218fb726d48Sopenharmony_ci //处理最后一个sumTime不为0区间的数据 219fb726d48Sopenharmony_ci if (sumTime !== 0) { 220fb726d48Sopenharmony_ci let rate = sumTime / cell; 221fb726d48Sopenharmony_ci cpuUtiliRateArray.push({ ro, cpu, rate }); 222fb726d48Sopenharmony_ci } 223fb726d48Sopenharmony_ci } 224fb726d48Sopenharmony_ci return cpuUtiliRateArray; 225fb726d48Sopenharmony_ci} 226fb726d48Sopenharmony_ci 227fb726d48Sopenharmony_ciexport function sliceSPTReceiver(data: unknown): void { 228fb726d48Sopenharmony_ci //@ts-ignore 229fb726d48Sopenharmony_ci if (data && data.params.func) { 230fb726d48Sopenharmony_ci //@ts-ignore 231fb726d48Sopenharmony_ci switch (data.params.func) { 232fb726d48Sopenharmony_ci case 'spt-getPTS': 233fb726d48Sopenharmony_ci getPTS(data); 234fb726d48Sopenharmony_ci break; 235fb726d48Sopenharmony_ci case 'spt-getSPT': 236fb726d48Sopenharmony_ci getSPT(data); 237fb726d48Sopenharmony_ci break; 238fb726d48Sopenharmony_ci case 'spt-getCpuPriorityByTime': 239fb726d48Sopenharmony_ci sptGetCpuPriorityByTime(data); 240fb726d48Sopenharmony_ci break; 241fb726d48Sopenharmony_ci case 'state-box': 242fb726d48Sopenharmony_ci getChildBoxDb(data); 243fb726d48Sopenharmony_ci break; 244fb726d48Sopenharmony_ci case 'near-data': 245fb726d48Sopenharmony_ci seacrhThreadNearData(data); 246fb726d48Sopenharmony_ci break; 247fb726d48Sopenharmony_ci } 248fb726d48Sopenharmony_ci } 249fb726d48Sopenharmony_ci} 250fb726d48Sopenharmony_ci 251fb726d48Sopenharmony_cifunction postMsg(data: unknown, res: unknown): void { 252fb726d48Sopenharmony_ci (self as unknown as Worker).postMessage( 253fb726d48Sopenharmony_ci { 254fb726d48Sopenharmony_ci //@ts-ignore 255fb726d48Sopenharmony_ci id: data.id, //@ts-ignore 256fb726d48Sopenharmony_ci action: data.action, 257fb726d48Sopenharmony_ci results: res, //@ts-ignore 258fb726d48Sopenharmony_ci len: res.length, 259fb726d48Sopenharmony_ci transfer: false, 260fb726d48Sopenharmony_ci }, 261fb726d48Sopenharmony_ci [] 262fb726d48Sopenharmony_ci ); 263fb726d48Sopenharmony_ci} 264fb726d48Sopenharmony_ci 265fb726d48Sopenharmony_cifunction getSPT(data: unknown): void { 266fb726d48Sopenharmony_ci let threadSlice = sliceList.get(0) || []; 267fb726d48Sopenharmony_ci let sptFilter = threadSlice.filter( 268fb726d48Sopenharmony_ci (it) => 269fb726d48Sopenharmony_ci //@ts-ignore 270fb726d48Sopenharmony_ci Math.max(data.params.leftNs, it.startTime!) < Math.min(data.params.rightNs, it.startTime! + it.dur!) && 271fb726d48Sopenharmony_ci //@ts-ignore 272fb726d48Sopenharmony_ci (it.cpu === null || it.cpu === undefined || data.params.cpus.includes(it.cpu)) 273fb726d48Sopenharmony_ci ); 274fb726d48Sopenharmony_ci let group: unknown = {}; 275fb726d48Sopenharmony_ci sptFilter.forEach((slice) => { 276fb726d48Sopenharmony_ci let item = { 277fb726d48Sopenharmony_ci //@ts-ignore 278fb726d48Sopenharmony_ci title: `T-${slice.tid}`, 279fb726d48Sopenharmony_ci count: 1, //@ts-ignore 280fb726d48Sopenharmony_ci state: slice.state, //@ts-ignore 281fb726d48Sopenharmony_ci pid: slice.pid, //@ts-ignore 282fb726d48Sopenharmony_ci tid: slice.tid, //@ts-ignore 283fb726d48Sopenharmony_ci minDuration: slice.dur || 0, //@ts-ignore 284fb726d48Sopenharmony_ci maxDuration: slice.dur || 0, //@ts-ignore 285fb726d48Sopenharmony_ci wallDuration: slice.dur || 0, //@ts-ignore 286fb726d48Sopenharmony_ci avgDuration: `${slice.dur}`, 287fb726d48Sopenharmony_ci }; //@ts-ignore 288fb726d48Sopenharmony_ci if (group[`${slice.state}`]) { 289fb726d48Sopenharmony_ci setSPTData(group, slice, item); 290fb726d48Sopenharmony_ci } else { 291fb726d48Sopenharmony_ci //@ts-ignore 292fb726d48Sopenharmony_ci group[`${slice.state}`] = { 293fb726d48Sopenharmony_ci //@ts-ignore 294fb726d48Sopenharmony_ci title: `S-${slice.state}`, 295fb726d48Sopenharmony_ci count: 1, //@ts-ignore 296fb726d48Sopenharmony_ci state: slice.state, //@ts-ignore 297fb726d48Sopenharmony_ci minDuration: slice.dur || 0, //@ts-ignore 298fb726d48Sopenharmony_ci maxDuration: slice.dur || 0, //@ts-ignore 299fb726d48Sopenharmony_ci wallDuration: slice.dur || 0, //@ts-ignore 300fb726d48Sopenharmony_ci avgDuration: `${slice.dur}`, 301fb726d48Sopenharmony_ci children: [ 302fb726d48Sopenharmony_ci { 303fb726d48Sopenharmony_ci //@ts-ignore 304fb726d48Sopenharmony_ci title: `P-${slice.pid}`, 305fb726d48Sopenharmony_ci count: 1, //@ts-ignore 306fb726d48Sopenharmony_ci state: slice.state, //@ts-ignore 307fb726d48Sopenharmony_ci pid: slice.pid, //@ts-ignore 308fb726d48Sopenharmony_ci minDuration: slice.dur || 0, //@ts-ignore 309fb726d48Sopenharmony_ci maxDuration: slice.dur || 0, //@ts-ignore 310fb726d48Sopenharmony_ci wallDuration: slice.dur || 0, //@ts-ignore 311fb726d48Sopenharmony_ci avgDuration: `${slice.dur}`, 312fb726d48Sopenharmony_ci children: [item], 313fb726d48Sopenharmony_ci }, 314fb726d48Sopenharmony_ci ], 315fb726d48Sopenharmony_ci }; 316fb726d48Sopenharmony_ci } 317fb726d48Sopenharmony_ci }); //@ts-ignore 318fb726d48Sopenharmony_ci postMsg(data, Object.values(group)); 319fb726d48Sopenharmony_ci} 320fb726d48Sopenharmony_ci 321fb726d48Sopenharmony_cifunction getPTS(data: unknown): void { 322fb726d48Sopenharmony_ci let threadSlice = sliceList.get(0) || []; 323fb726d48Sopenharmony_ci let ptsFilter = threadSlice.filter( 324fb726d48Sopenharmony_ci (it) => 325fb726d48Sopenharmony_ci //@ts-ignore 326fb726d48Sopenharmony_ci Math.max(data.params.leftNs, it.startTime!) < Math.min(data.params.rightNs, it.startTime! + it.dur!) && //@ts-ignore 327fb726d48Sopenharmony_ci (it.cpu === null || it.cpu === undefined || data.params.cpus.includes(it.cpu)) 328fb726d48Sopenharmony_ci ); 329fb726d48Sopenharmony_ci let group: unknown = {}; 330fb726d48Sopenharmony_ci ptsFilter.forEach((slice) => { 331fb726d48Sopenharmony_ci //@ts-ignore 332fb726d48Sopenharmony_ci let title = `S-${slice.state}`; 333fb726d48Sopenharmony_ci let item = setStateData(slice, title); //@ts-ignore 334fb726d48Sopenharmony_ci if (group[`${slice.pid}`]) { 335fb726d48Sopenharmony_ci //@ts-ignore 336fb726d48Sopenharmony_ci let process = group[`${slice.pid}`]; 337fb726d48Sopenharmony_ci process.count += 1; //@ts-ignore 338fb726d48Sopenharmony_ci process.wallDuration += slice.dur; //@ts-ignore 339fb726d48Sopenharmony_ci process.minDuration = Math.min(process.minDuration, slice.dur!); //@ts-ignore 340fb726d48Sopenharmony_ci process.maxDuration = Math.max(process.maxDuration, slice.dur!); 341fb726d48Sopenharmony_ci process.avgDuration = (process.wallDuration / process.count).toFixed(2); //@ts-ignore 342fb726d48Sopenharmony_ci let thread = process.children.find((child: unknown) => child.title === `T-${slice.tid}`); 343fb726d48Sopenharmony_ci if (thread) { 344fb726d48Sopenharmony_ci thread.count += 1; //@ts-ignore 345fb726d48Sopenharmony_ci thread.wallDuration += slice.dur; //@ts-ignore 346fb726d48Sopenharmony_ci thread.minDuration = Math.min(thread.minDuration, slice.dur!); //@ts-ignore 347fb726d48Sopenharmony_ci thread.maxDuration = Math.max(thread.maxDuration, slice.dur!); 348fb726d48Sopenharmony_ci thread.avgDuration = (thread.wallDuration / thread.count).toFixed(2); //@ts-ignore 349fb726d48Sopenharmony_ci let state = thread.children.find((child: unknown) => child.title === `S-${slice.state}`); 350fb726d48Sopenharmony_ci if (state) { 351fb726d48Sopenharmony_ci state.count += 1; //@ts-ignore 352fb726d48Sopenharmony_ci state.wallDuration += slice.dur; //@ts-ignore 353fb726d48Sopenharmony_ci state.minDuration = Math.min(state.minDuration, slice.dur!); //@ts-ignore 354fb726d48Sopenharmony_ci state.maxDuration = Math.max(state.maxDuration, slice.dur!); 355fb726d48Sopenharmony_ci state.avgDuration = (state.wallDuration / state.count).toFixed(2); 356fb726d48Sopenharmony_ci } else { 357fb726d48Sopenharmony_ci thread.children.push(item); 358fb726d48Sopenharmony_ci } 359fb726d48Sopenharmony_ci } else { 360fb726d48Sopenharmony_ci let processChild = setThreadData(slice, item); 361fb726d48Sopenharmony_ci process.children.push(processChild); 362fb726d48Sopenharmony_ci } 363fb726d48Sopenharmony_ci } else { 364fb726d48Sopenharmony_ci //@ts-ignore 365fb726d48Sopenharmony_ci group[`${slice.pid}`] = setProcessData(slice, item); 366fb726d48Sopenharmony_ci } 367fb726d48Sopenharmony_ci }); //@ts-ignore 368fb726d48Sopenharmony_ci postMsg(data, Object.values(group)); 369fb726d48Sopenharmony_ci} 370fb726d48Sopenharmony_ci 371fb726d48Sopenharmony_cifunction sptGetCpuPriorityByTime(data: unknown): void { 372fb726d48Sopenharmony_ci let threadSlice = sliceList.get(0) || []; 373fb726d48Sopenharmony_ci const result = threadSlice.filter((item: unknown) => { 374fb726d48Sopenharmony_ci //@ts-ignore 375fb726d48Sopenharmony_ci return !(item.startTime + item.dur < data.params.leftNs || item.startTime! > data.params.rightNs); 376fb726d48Sopenharmony_ci }); 377fb726d48Sopenharmony_ci postMsg(data, result); 378fb726d48Sopenharmony_ci} 379fb726d48Sopenharmony_ci 380fb726d48Sopenharmony_ci//处理跳转子页面的数据 381fb726d48Sopenharmony_cifunction getChildBoxDb(data: unknown): void { 382fb726d48Sopenharmony_ci let threadSlice = sliceList.get(0) || []; 383fb726d48Sopenharmony_ci let setProcessId; 384fb726d48Sopenharmony_ci let setThreadId; 385fb726d48Sopenharmony_ci let setCpu = new Set(); 386fb726d48Sopenharmony_ci //处理processId数据 387fb726d48Sopenharmony_ci //@ts-ignore 388fb726d48Sopenharmony_ci setProcessId = handleIdParams(data.params.processId); 389fb726d48Sopenharmony_ci //处理threadId数据 390fb726d48Sopenharmony_ci //@ts-ignore 391fb726d48Sopenharmony_ci setThreadId = handleIdParams(data.params.threadId); 392fb726d48Sopenharmony_ci //处理Cpu数据 393fb726d48Sopenharmony_ci //@ts-ignore 394fb726d48Sopenharmony_ci if (data.params.cpus) {//@ts-ignore 395fb726d48Sopenharmony_ci if (data.params.cpus.length > 0) { 396fb726d48Sopenharmony_ci //@ts-ignore 397fb726d48Sopenharmony_ci setCpu = new Set(data.params.cpus); 398fb726d48Sopenharmony_ci } 399fb726d48Sopenharmony_ci } 400fb726d48Sopenharmony_ci 401fb726d48Sopenharmony_ci let childBoxDb = threadSlice.filter((it: unknown) => { 402fb726d48Sopenharmony_ci let condition = true; 403fb726d48Sopenharmony_ci // 检查进程ID 404fb726d48Sopenharmony_ci if (setProcessId.size !== 0) { 405fb726d48Sopenharmony_ci //@ts-ignore 406fb726d48Sopenharmony_ci condition = condition && setProcessId.has(it.pid); 407fb726d48Sopenharmony_ci } 408fb726d48Sopenharmony_ci // 检查线程ID 409fb726d48Sopenharmony_ci if (setThreadId.size !== 0) { 410fb726d48Sopenharmony_ci //@ts-ignore 411fb726d48Sopenharmony_ci condition = condition && setThreadId.has(it.tid); 412fb726d48Sopenharmony_ci } 413fb726d48Sopenharmony_ci // 检查CPU(如果存在且不是null/undefined,或在setCpu中) 414fb726d48Sopenharmony_ci if (setCpu.size !== 0) { 415fb726d48Sopenharmony_ci //@ts-ignore 416fb726d48Sopenharmony_ci condition = condition && (it.cpu === null || it.cpu === undefined || setCpu.has(it.cpu)); 417fb726d48Sopenharmony_ci } 418fb726d48Sopenharmony_ci // 检查状态 419fb726d48Sopenharmony_ci //@ts-ignore 420fb726d48Sopenharmony_ci if (data.params.state) { 421fb726d48Sopenharmony_ci //@ts-ignore 422fb726d48Sopenharmony_ci condition = condition && it.state === data.params.state; 423fb726d48Sopenharmony_ci } 424fb726d48Sopenharmony_ci //@ts-ignore 425fb726d48Sopenharmony_ci return condition && Math.max(data.params.leftNs, it.startTime!) < Math.min(data.params.rightNs, it.startTime! + it.dur!); 426fb726d48Sopenharmony_ci }); 427fb726d48Sopenharmony_ci postMsg(data, childBoxDb); 428fb726d48Sopenharmony_ci} 429fb726d48Sopenharmony_ci//处理processId和threadId 430fb726d48Sopenharmony_cifunction handleIdParams(id: number | number[] | undefined): Set<unknown> { 431fb726d48Sopenharmony_ci let setId: Set<unknown>; 432fb726d48Sopenharmony_ci if (Array.isArray(id) || typeof id === 'number') { 433fb726d48Sopenharmony_ci setId = new Set(Array.isArray(id) ? id : [id]); 434fb726d48Sopenharmony_ci } else { 435fb726d48Sopenharmony_ci setId = new Set(); 436fb726d48Sopenharmony_ci } 437fb726d48Sopenharmony_ci return setId; 438fb726d48Sopenharmony_ci} 439fb726d48Sopenharmony_ci 440fb726d48Sopenharmony_ci//查找点击的thread块前后相邻块信息 441fb726d48Sopenharmony_cifunction seacrhThreadNearData(target: unknown): void { 442fb726d48Sopenharmony_ci //@ts-ignore 443fb726d48Sopenharmony_ci let key = `${target.params.pid}-${target.params.tid}`; 444fb726d48Sopenharmony_ci let preData; 445fb726d48Sopenharmony_ci let nextData; 446fb726d48Sopenharmony_ci let threadSlice = threadStateList.get(key) || []; 447fb726d48Sopenharmony_ci //@ts-ignore 448fb726d48Sopenharmony_ci let dbIndex = threadSlice.findIndex(it => it.startTime === target.params.startTime); 449fb726d48Sopenharmony_ci if (dbIndex !== -1) { 450fb726d48Sopenharmony_ci preData = threadSlice[dbIndex - 1] ? threadSlice[dbIndex - 1] : dataCache; 451fb726d48Sopenharmony_ci nextData = threadSlice[dbIndex + 1] ? threadSlice[dbIndex + 1] : dataCache; 452fb726d48Sopenharmony_ci } else { 453fb726d48Sopenharmony_ci preData = dataCache; 454fb726d48Sopenharmony_ci nextData = dataCache; 455fb726d48Sopenharmony_ci } 456fb726d48Sopenharmony_ci postMsg(target, [preData, nextData]); 457fb726d48Sopenharmony_ci} 458fb726d48Sopenharmony_ci 459fb726d48Sopenharmony_cifunction setStateData(slice: unknown, title: string): unknown { 460fb726d48Sopenharmony_ci return { 461fb726d48Sopenharmony_ci title: title, 462fb726d48Sopenharmony_ci count: 1, //@ts-ignore 463fb726d48Sopenharmony_ci state: slice.state, //@ts-ignore 464fb726d48Sopenharmony_ci tid: slice.tid, //@ts-ignore 465fb726d48Sopenharmony_ci pid: slice.pid, //@ts-ignore 466fb726d48Sopenharmony_ci minDuration: slice.dur || 0, //@ts-ignore 467fb726d48Sopenharmony_ci maxDuration: slice.dur || 0, //@ts-ignore 468fb726d48Sopenharmony_ci wallDuration: slice.dur || 0, //@ts-ignore 469fb726d48Sopenharmony_ci avgDuration: `${slice.dur}`, 470fb726d48Sopenharmony_ci }; 471fb726d48Sopenharmony_ci} 472fb726d48Sopenharmony_ci 473fb726d48Sopenharmony_cifunction setThreadData(slice: unknown, item: unknown): unknown { 474fb726d48Sopenharmony_ci return { 475fb726d48Sopenharmony_ci //@ts-ignore 476fb726d48Sopenharmony_ci title: `T-${slice.tid}`, 477fb726d48Sopenharmony_ci count: 1, //@ts-ignore 478fb726d48Sopenharmony_ci tid: slice.tid, //@ts-ignore 479fb726d48Sopenharmony_ci pid: slice.pid, //@ts-ignore 480fb726d48Sopenharmony_ci minDuration: slice.dur || 0, //@ts-ignore 481fb726d48Sopenharmony_ci maxDuration: slice.dur || 0, //@ts-ignore 482fb726d48Sopenharmony_ci wallDuration: slice.dur || 0, //@ts-ignore 483fb726d48Sopenharmony_ci avgDuration: `${slice.dur}`, 484fb726d48Sopenharmony_ci children: [item], 485fb726d48Sopenharmony_ci }; 486fb726d48Sopenharmony_ci} 487fb726d48Sopenharmony_ci 488fb726d48Sopenharmony_cifunction setProcessData(slice: unknown, item: unknown): unknown { 489fb726d48Sopenharmony_ci return { 490fb726d48Sopenharmony_ci //@ts-ignore 491fb726d48Sopenharmony_ci title: `P-${slice.pid}`, 492fb726d48Sopenharmony_ci count: 1, //@ts-ignore 493fb726d48Sopenharmony_ci pid: slice.pid, //@ts-ignore 494fb726d48Sopenharmony_ci minDuration: slice.dur || 0, //@ts-ignore 495fb726d48Sopenharmony_ci maxDuration: slice.dur || 0, //@ts-ignore 496fb726d48Sopenharmony_ci wallDuration: slice.dur || 0, //@ts-ignore 497fb726d48Sopenharmony_ci avgDuration: `${slice.dur}`, 498fb726d48Sopenharmony_ci children: [ 499fb726d48Sopenharmony_ci { 500fb726d48Sopenharmony_ci //@ts-ignore 501fb726d48Sopenharmony_ci title: `T-${slice.tid}`, 502fb726d48Sopenharmony_ci count: 1, //@ts-ignore 503fb726d48Sopenharmony_ci pid: slice.pid, //@ts-ignore 504fb726d48Sopenharmony_ci tid: slice.tid, //@ts-ignore 505fb726d48Sopenharmony_ci minDuration: slice.dur || 0, //@ts-ignore 506fb726d48Sopenharmony_ci maxDuration: slice.dur || 0, //@ts-ignore 507fb726d48Sopenharmony_ci wallDuration: slice.dur || 0, //@ts-ignore 508fb726d48Sopenharmony_ci avgDuration: `${slice.dur}`, 509fb726d48Sopenharmony_ci children: [item], 510fb726d48Sopenharmony_ci }, 511fb726d48Sopenharmony_ci ], 512fb726d48Sopenharmony_ci }; 513fb726d48Sopenharmony_ci} 514fb726d48Sopenharmony_ci 515fb726d48Sopenharmony_cifunction setSPTData(group: unknown, slice: unknown, item: unknown): void { 516fb726d48Sopenharmony_ci //@ts-ignore 517fb726d48Sopenharmony_ci let state = group[`${slice.state}`]; 518fb726d48Sopenharmony_ci state.count += 1; //@ts-ignore 519fb726d48Sopenharmony_ci state.wallDuration += slice.dur; //@ts-ignore 520fb726d48Sopenharmony_ci state.minDuration = Math.min(state.minDuration, slice.dur!); //@ts-ignore 521fb726d48Sopenharmony_ci state.maxDuration = Math.max(state.maxDuration, slice.dur!); 522fb726d48Sopenharmony_ci state.avgDuration = (state.wallDuration / state.count).toFixed(2); //@ts-ignore 523fb726d48Sopenharmony_ci let process = state.children.find((child: unknown) => child.title === `P-${slice.pid}`); 524fb726d48Sopenharmony_ci if (process) { 525fb726d48Sopenharmony_ci process.count += 1; //@ts-ignore 526fb726d48Sopenharmony_ci process.wallDuration += slice.dur; //@ts-ignore 527fb726d48Sopenharmony_ci process.minDuration = Math.min(process.minDuration, slice.dur!); //@ts-ignore 528fb726d48Sopenharmony_ci process.maxDuration = Math.max(process.maxDuration, slice.dur!); 529fb726d48Sopenharmony_ci process.avgDuration = (process.wallDuration / process.count).toFixed(2); //@ts-ignore 530fb726d48Sopenharmony_ci let thread = process.children.find((child: unknown) => child.title === `T-${slice.tid}`); 531fb726d48Sopenharmony_ci if (thread) { 532fb726d48Sopenharmony_ci thread.count += 1; //@ts-ignore 533fb726d48Sopenharmony_ci thread.wallDuration += slice.dur; //@ts-ignore 534fb726d48Sopenharmony_ci thread.minDuration = Math.min(thread.minDuration, slice.dur!); //@ts-ignore 535fb726d48Sopenharmony_ci thread.maxDuration = Math.max(thread.maxDuration, slice.dur!); 536fb726d48Sopenharmony_ci thread.avgDuration = (thread.wallDuration / thread.count).toFixed(2); 537fb726d48Sopenharmony_ci } else { 538fb726d48Sopenharmony_ci process.children.push(item); 539fb726d48Sopenharmony_ci } 540fb726d48Sopenharmony_ci } else { 541fb726d48Sopenharmony_ci state.children.push({ 542fb726d48Sopenharmony_ci //@ts-ignore 543fb726d48Sopenharmony_ci title: `P-${slice.pid}`, 544fb726d48Sopenharmony_ci count: 1, //@ts-ignore 545fb726d48Sopenharmony_ci state: slice.state, //@ts-ignore 546fb726d48Sopenharmony_ci pid: slice.pid, //@ts-ignore 547fb726d48Sopenharmony_ci minDuration: slice.dur || 0, //@ts-ignore 548fb726d48Sopenharmony_ci maxDuration: slice.dur || 0, //@ts-ignore 549fb726d48Sopenharmony_ci wallDuration: slice.dur || 0, //@ts-ignore 550fb726d48Sopenharmony_ci avgDuration: `${slice.dur}`, 551fb726d48Sopenharmony_ci children: [item], 552fb726d48Sopenharmony_ci }); 553fb726d48Sopenharmony_ci } 554fb726d48Sopenharmony_ci} 555