1/* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import {CpuRender, EmptyRender} from "./ProcedureWorkerCPU.js"; 17import { 18 RequestMessage, 19} from "./ProcedureWorkerCommon.js"; 20import {FreqRender} from "./ProcedureWorkerFreq.js"; 21import {ProcessRender} from "./ProcedureWorkerProcess.js"; 22import {MemRender} from "./ProcedureWorkerMem.js"; 23import {ThreadRender} from "./ProcedureWorkerThread.js"; 24import {FuncRender} from "./ProcedureWorkerFunc.js"; 25import {FpsRender} from "./ProcedureWorkerFPS.js"; 26import {HeapRender, NativeMemoryRender} from "./ProcedureWorkerHeap.js"; 27import {TimelineRender} from "./ProcedureWorkerTimeline.js"; 28import {CpuAbilityRender} from "./ProcedureWorkerCpuAbility.js"; 29import {MemoryAbilityRender} from "./ProcedureWorkerMemoryAbility.js"; 30import {DiskIoAbilityRender} from "./ProcedureWorkerDiskIoAbility.js"; 31import {NetworkAbilityRender} from "./ProcedureWorkerNetworkAbility.js"; 32import {HiperfCpuRender} from "./ProcedureWorkerHiPerfCPU.js"; 33import {HiperfProcessRender} from "./ProcedureWorkerHiPerfProcess.js"; 34import {HiperfThreadRender} from "./ProcedureWorkerHiPerfThread.js"; 35import {HiperfEventRender} from "./ProcedureWorkerHiPerfEvent.js"; 36import {HiperfReportRender} from "./ProcedureWorkerHiPerfReport.js"; 37import {VirtualMemoryRender} from "./ProcedureWorkerVirtualMemory.js"; 38import {FileSystemRender} from "./ProcedureWorkerFileSystem.js"; 39import {info} from "../../../log/Log.js"; 40import {SdkSliceRender} from "./ProduceWorkerSdkSlice.js"; 41import {SdkCounterRender} from "./ProduceWorkerSdkCounter.js"; 42import {CpuStateRender} from "./ProcedureWorkerCpuState.js"; 43import {EnergyAnomalyRender} from "./ProcedureWorkerEnergyAnomaly.js"; 44import {EnergySystemRender} from "./ProcedureWorkerEnergySystem.js"; 45import {EnergyPowerRender} from "./ProcedureWorkerEnergyPower.js"; 46import {EnergyStateRender} from "./ProcedureWorkerEnergyState.js"; 47import {SmapsRender} from "./ProcedureWorkerSmaps.js"; 48import {CpuFreqLimitRender} from "./ProcedureWorkerCpuFreqLimits.js"; 49 50let dataList: any = {} 51let dataList2: any = {} 52let dataFilter: any = {} 53let canvasList: any = {} 54let contextList: any = {} 55let renders: any = { 56 "timeline": new TimelineRender(), 57 "cpu-data": new CpuRender(), 58 "cpu-state": new CpuStateRender(), 59 "cpu-limit-freq": new CpuFreqLimitRender(), 60 "fps": new FpsRender(), 61 "freq": new FreqRender(), 62 "virtual-memory-folder": new EmptyRender(), 63 "virtual-memory-cell": new VirtualMemoryRender(), 64 "file-system-group": new EmptyRender(), 65 "file-system-cell": new FileSystemRender(), 66 "process": new ProcessRender(), 67 "heap": new HeapRender(), 68 "mem": new MemRender(), 69 "thread": new ThreadRender(), 70 "func": new FuncRender(), 71 "native": new NativeMemoryRender(), 72 "HiPerf-Group": new EmptyRender(), 73 "monitorGroup": new EmptyRender(), 74 "HiPerf-Cpu": new HiperfCpuRender(), 75 "HiPerf-Process": new HiperfProcessRender(), 76 "HiPerf-Thread": new HiperfThreadRender(), 77 "HiPerf-Report-Event": new HiperfEventRender(), 78 "HiPerf-Report-Fold": new HiperfReportRender(), 79 "monitorCpu": new CpuAbilityRender(), 80 "monitorMemory": new MemoryAbilityRender(), 81 "monitorDiskIo": new DiskIoAbilityRender(), 82 "monitorNetwork": new NetworkAbilityRender(), 83 "sdkSlice": new SdkSliceRender(), 84 "sdkCounter": new SdkCounterRender(), 85 "energyAnomaly": new EnergyAnomalyRender(), 86 "energySystem": new EnergySystemRender(), 87 "energyPower": new EnergyPowerRender(), 88 "energyState": new EnergyStateRender(), 89 "smaps": new SmapsRender(), 90}; 91 92function match(type: string, req: RequestMessage) { 93 Reflect.ownKeys(renders).filter((it) => { 94 if (type.startsWith(it as string)) { 95 if (dataList[type]) { 96 req.lazyRefresh = dataList[type].length > 20000; 97 } 98 renders[it].render(req, dataList[type], dataFilter[type], dataList2); 99 } 100 }) 101} 102 103let dec = new TextDecoder(); 104let convertJSON = (arr: any) => { 105 if (arr instanceof ArrayBuffer) { 106 let jsonArray = []; 107 let str = dec.decode(new Uint8Array(arr)); 108 str = str.substring(str.indexOf("\n") + 1); 109 if (!str) { 110 } else { 111 let parse = JSON.parse(str); 112 let columns = parse.columns; 113 let values = parse.values; 114 for (let i = 0; i < values.length; i++) { 115 let obj: any = {} 116 for (let j = 0; j < columns.length; j++) { 117 obj[columns[j]] = values[i][j] 118 } 119 jsonArray.push(obj) 120 } 121 } 122 return jsonArray; 123 } else { 124 return arr; 125 } 126} 127self.onmessage = function (e: any) { 128 if ((e.data.type as string).startsWith("clear")) { 129 dataList = {}; 130 dataList2 = {}; 131 dataFilter = {}; 132 canvasList = {}; 133 contextList = {}; 134 // @ts-ignore 135 self.postMessage({ 136 id: e.data.id, 137 type: e.data.type, 138 results: null, 139 }); 140 return; 141 } 142 if (e.data.params.list) { 143 dataList[e.data.type] = convertJSON(e.data.params.list); 144 if (e.data.params.offscreen) { 145 canvasList[e.data.type] = e.data.params.offscreen; 146 contextList[e.data.type] = e.data.params.offscreen!.getContext('2d'); 147 contextList[e.data.type].scale(e.data.params.dpr, e.data.params.dpr); 148 } 149 } 150 if (!dataFilter[e.data.type]) { 151 dataFilter[e.data.type] = [] 152 } 153 let req = new RequestMessage(); 154 req.canvas = canvasList[e.data.type]; 155 req.context = contextList[e.data.type]; 156 req.type = e.data.type as string; 157 req.params = e.data.params; 158 req.online = e.data.params.online; 159 req.buf = e.data.params.buf; 160 req.isRangeSelect = e.data.params.isRangeSelect; 161 req.isHover = e.data.params.isHover; 162 req.xs = e.data.params.xs; 163 req.frame = e.data.params.frame; 164 req.flagMoveInfo = e.data.params.flagMoveInfo; 165 req.flagSelectedInfo = e.data.params.flagSelectedInfo; 166 req.hoverX = e.data.params.hoverX; 167 req.hoverY = e.data.params.hoverY; 168 req.startNS = e.data.params.startNS; 169 req.endNS = e.data.params.endNS; 170 req.totalNS = e.data.params.totalNS; 171 req.slicesTime = e.data.params.slicesTime; 172 req.range = e.data.params.range; 173 req.scale = e.data.params.scale; 174 req.canvasWidth = e.data.params.canvasWidth; 175 req.canvasHeight = e.data.params.canvasHeight; 176 req.useCache = e.data.params.useCache; 177 req.lineColor = e.data.params.lineColor; 178 req.chartColor = e.data.params.chartColor; 179 req.wakeupBean = e.data.params.wakeupBean; 180 req.intervalPerf = e.data.params.intervalPerf; 181 req.id = e.data.id; 182 if (!req.frame) { 183 info(req.frame); 184 return; 185 } 186 if (req.canvas) { 187 if (req.canvas.width !== req.canvasWidth || req.canvas.height !== req.canvasHeight) { 188 req.canvas.width = req.canvasWidth; 189 req.canvas.height = req.canvasHeight; 190 req.context.scale(e.data.params.dpr, e.data.params.dpr); 191 } 192 } 193 match(req.type, req); 194}; 195self.onmessageerror = function (e: any) { 196} 197 198