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 './cpu/ProcedureWorkerCPU'; 17import { RequestMessage } from './ProcedureWorkerCommon'; 18import { FreqRender } from './ProcedureWorkerFreq'; 19import { ProcessRender } from './ProcedureWorkerProcess'; 20import { MemRender } from './ProcedureWorkerMem'; 21import { ThreadRender } from './ProcedureWorkerThread'; 22import { FuncRender } from './ProcedureWorkerFunc'; 23import { FpsRender } from './ProcedureWorkerFPS'; 24import { HeapRender, NativeMemoryRender } from './ProcedureWorkerHeap'; 25import { CpuAbilityRender } from './ProcedureWorkerCpuAbility'; 26import { MemoryAbilityRender } from './ProcedureWorkerMemoryAbility'; 27import { DiskIoAbilityRender } from './ProcedureWorkerDiskIoAbility'; 28import { NetworkAbilityRender } from './ProcedureWorkerNetworkAbility'; 29import { HiperfEventRender } from './hiperf/ProcedureWorkerHiPerfEvent'; 30import { HiperfReportRender } from './hiperf/ProcedureWorkerHiPerfReport'; 31import { VirtualMemoryRender } from './ProcedureWorkerVirtualMemory'; 32import { EBPFRender } from './ProcedureWorkerEBPF'; 33import { info } from '../../../log/Log'; 34import { SdkSliceRender } from './ProduceWorkerSdkSlice'; 35import { SdkCounterRender } from './ProduceWorkerSdkCounter'; 36import { CpuStateRender } from './cpu/ProcedureWorkerCpuState'; 37import { EnergyAnomalyRender } from './ProcedureWorkerEnergyAnomaly'; 38import { EnergySystemRender } from './ProcedureWorkerEnergySystem'; 39import { EnergyPowerRender } from './ProcedureWorkerEnergyPower'; 40import { EnergyStateRender } from './ProcedureWorkerEnergyState'; 41import { CpuFreqLimitRender } from './cpu/ProcedureWorkerCpuFreqLimits'; 42import { HangRender } from './ProcedureWorkerHang'; 43import { ClockRender } from './ProcedureWorkerClock'; 44import { IrqRender } from './ProcedureWorkerIrq'; 45import { JankRender } from './ProcedureWorkerJank'; 46import { HeapTimelineRender } from './ProcedureWorkerHeapTimeline'; 47import { HeapSnapshotRender } from './ProcedureWorkerHeapSnapshot'; 48import { translateJsonString } from '../logic-worker/ProcedureLogicWorkerCommon'; 49import { AppStartupRender } from './ProcedureWorkerAppStartup'; 50import { SoRender } from './ProcedureWorkerSoInit'; 51import { FrameDynamicRender } from './ProcedureWorkerFrameDynamic'; 52import { FrameAnimationRender } from './ProcedureWorkerFrameAnimation'; 53import { FrameSpacingRender } from './ProcedureWorkerFrameSpacing'; 54import { JsCpuProfilerRender } from './ProcedureWorkerCpuProfiler'; 55import { SnapshotRender } from './ProcedureWorkerSnapshot'; 56import { LogRender } from './ProcedureWorkerLog'; 57import { HiPerfCallChartRender } from './hiperf/ProcedureWorkerHiPerfCallChart'; 58import { HiSysEventRender } from './ProcedureWorkerHiSysEvent'; 59import { HiperfCpuRender2 } from './hiperf/ProcedureWorkerHiPerfCPU2'; 60import { HiperfProcessRender2 } from './hiperf/ProcedureWorkerHiPerfProcess2'; 61import { HiperfThreadRender2 } from './hiperf/ProcedureWorkerHiPerfThread2'; 62import { AllAppStartupRender } from './ProcedureWorkerAllAppStartup'; 63import { FreqExtendRender } from './ProcedureWorkerFreqExtend'; 64import { hitchTimeRender } from './ProcedureWorkerHitchTime'; 65import { LtpoRender } from './ProcedureWorkerLTPO'; 66import { BinderRender } from './procedureWorkerBinder'; 67import { SampleRender } from './ProcedureWorkerBpftrace'; 68import { PerfToolRender } from './ProcedureWorkerPerfTool'; 69import { GpuCounterRender } from './ProcedureWorkerGpuCounter'; 70import { AllStatesRender } from './ProcedureWorkerAllStates'; 71import { DmaFenceRender } from './ProcedureWorkerDmaFence'; 72 73let dataList: unknown = {}; 74let dataList2: unknown = {}; 75let dataFilter: unknown = {}; 76let canvasList: unknown = {}; 77let contextList: unknown = {}; 78export let renders = { 79 'cpu-data': new CpuRender(), 80 'cpu-state': new CpuStateRender(), 81 'cpu-limit-freq': new CpuFreqLimitRender(), 82 fps: new FpsRender(), 83 freq: new FreqRender(), 84 empty: new EmptyRender(), 85 'virtual-memory-folder': new EmptyRender(), 86 'virtual-memory-cell': new VirtualMemoryRender(), 87 'file-system-group': new EmptyRender(), 88 'file-system-cell': new EBPFRender(), 89 process: new ProcessRender(), 90 'app-start-up': new AppStartupRender(), 91 'all-app-start-up': new AllAppStartupRender(), 92 'ltpo-present': new LtpoRender(), 93 hitch: new hitchTimeRender(), 94 'app-so-init': new SoRender(), 95 heap: new HeapRender(), 96 'heap-timeline': new HeapTimelineRender(), 97 'heap-snapshot': new HeapSnapshotRender(), 98 mem: new MemRender(), 99 thread: new ThreadRender(), 100 func: new FuncRender(), 101 native: new NativeMemoryRender(), 102 'HiPerf-Group': new EmptyRender(), 103 monitorGroup: new EmptyRender(), 104 'HiPerf-Cpu-2': new HiperfCpuRender2(), 105 'HiPerf-callchart': new HiPerfCallChartRender(), 106 'HiPerf-Process-2': new HiperfProcessRender2(), 107 'HiPerf-Thread-2': new HiperfThreadRender2(), 108 'HiPerf-Report-Event': new HiperfEventRender(), 109 'HiPerf-Report-Fold': new HiperfReportRender(), 110 monitorCpu: new CpuAbilityRender(), 111 monitorMemory: new MemoryAbilityRender(), 112 monitorDiskIo: new DiskIoAbilityRender(), 113 monitorNetwork: new NetworkAbilityRender(), 114 'sdk-slice': new SdkSliceRender(), 115 'sdk-counter': new SdkCounterRender(), 116 energyAnomaly: new EnergyAnomalyRender(), 117 energySystem: new EnergySystemRender(), 118 energyPower: new EnergyPowerRender(), 119 energyState: new EnergyStateRender(), 120 hang: new HangRender(), 121 clock: new ClockRender(), 122 irq: new IrqRender(), 123 jank: new JankRender(), 124 frameDynamicCurve: new FrameDynamicRender(), 125 frameAnimation: new FrameAnimationRender(), 126 frameSpacing: new FrameSpacingRender(), 127 'js-cpu-profiler': new JsCpuProfilerRender(), 128 snapshot: new SnapshotRender(), 129 logs: new LogRender(), 130 hiSysEvent: new HiSysEventRender(), 131 'freq-extend': new FreqExtendRender(), 132 binder: new BinderRender(), 133 sample: new SampleRender(), 134 perfTool: new PerfToolRender(), 135 gpuCounter: new GpuCounterRender(), 136 stateCut: new AllStatesRender(), 137 dmaFence:new DmaFenceRender() 138}; 139 140function match(type: string, req: RequestMessage): void { 141 Reflect.ownKeys(renders).filter((it) => { 142 if (type && type.startsWith(it as string)) { 143 //@ts-ignore 144 if (dataList[type]) { 145 //@ts-ignore 146 req.lazyRefresh = dataList[type].length > 20000; 147 } 148 //@ts-ignore 149 renders[it].render(req, dataList[type], dataFilter[type], dataList2); 150 } 151 }); 152} 153 154let dec = new TextDecoder(); 155let convertJSON = (arr: unknown): unknown => { 156 if (arr instanceof ArrayBuffer) { 157 let jsonArr = []; 158 let str = dec.decode(new Uint8Array(arr)); 159 str = str.substring(str.indexOf('\n') + 1); 160 if (!str) { 161 } else { 162 let parsed = JSON.parse(translateJsonString(str)); 163 let columns = parsed.columns; 164 let values = parsed.values; 165 for (let i = 0; i < values.length; i++) { 166 let obj: unknown = {}; 167 for (let j = 0; j < columns.length; j++) { 168 //@ts-ignore 169 obj[columns[j]] = values[i][j]; 170 } 171 jsonArr.push(obj); 172 } 173 } 174 return jsonArr; 175 } else { 176 return arr; 177 } 178}; 179 180self.onmessage = (e: unknown): void => { 181 clear(e); 182 //@ts-ignore 183 if (e.data.params && e.data.params.list) { 184 //@ts-ignore 185 dataList[e.data.type] = convertJSON(e.data.params.list); 186 //@ts-ignore 187 if (e.data.params.offscreen) { 188 //@ts-ignore 189 canvasList[e.data.type] = e.data.params.offscreen; 190 //@ts-ignore 191 contextList[e.data.type] = e.data.params.offscreen!.getContext('2d'); 192 //@ts-ignore 193 contextList[e.data.type].scale(e.data.params.dpr, e.data.params.dpr); 194 } 195 } 196 //@ts-ignore 197 if (!dataFilter[e.data.type]) { 198 //@ts-ignore 199 dataFilter[e.data.type] = []; 200 } 201 let req = new RequestMessage(); 202 setReq(req, e); 203 204 match(req.type!, req); 205}; 206 207function clear(e: unknown): void { 208 //@ts-ignore 209 if (e.data.type && (e.data.type as string).startsWith('clear')) { 210 dataList = {}; 211 dataList2 = {}; 212 dataFilter = {}; 213 canvasList = {}; 214 contextList = {}; 215 // @ts-ignore 216 self.postMessage({ 217 //@ts-ignore 218 id: e.data.id, 219 //@ts-ignore 220 type: e.data.type, 221 results: null, 222 }); 223 return; 224 } 225} 226 227function setReq(req: RequestMessage, e: unknown): void { 228 //@ts-ignore 229 req.canvas = canvasList[e.data.type]; 230 //@ts-ignore 231 req.context = contextList[e.data.type]; 232 //@ts-ignore 233 req.type = e.data.type as string; 234 //@ts-ignore 235 req.params = e.data.params; 236 //@ts-ignore 237 if (e.data.params) { 238 //@ts-ignore 239 req.online = e.data.params.online; 240 //@ts-ignore 241 req.buf = e.data.params.buf; 242 //@ts-ignore 243 req.isRangeSelect = e.data.params.isRangeSelect; 244 //@ts-ignore 245 req.isHover = e.data.params.isHover; 246 //@ts-ignore 247 req.xs = e.data.params.xs; 248 //@ts-ignore 249 req.frame = e.data.params.frame; 250 //@ts-ignore 251 req.flagMoveInfo = e.data.params.flagMoveInfo; 252 //@ts-ignore 253 req.flagSelectedInfo = e.data.params.flagSelectedInfo; 254 //@ts-ignore 255 req.hoverX = e.data.params.hoverX; 256 //@ts-ignore 257 req.hoverY = e.data.params.hoverY; 258 //@ts-ignore 259 req.startNS = e.data.params.startNS; 260 //@ts-ignore 261 req.endNS = e.data.params.endNS; 262 //@ts-ignore 263 req.totalNS = e.data.params.totalNS; 264 //@ts-ignore 265 req.slicesTime = e.data.params.slicesTime; 266 //@ts-ignore 267 req.range = e.data.params.range; 268 //@ts-ignore 269 req.scale = e.data.params.scale; 270 //@ts-ignore 271 req.canvasWidth = e.data.params.canvasWidth; 272 //@ts-ignore 273 req.canvasHeight = e.data.params.canvasHeight; 274 //@ts-ignore 275 req.useCache = e.data.params.useCache; 276 //@ts-ignore 277 req.lineColor = e.data.params.lineColor; 278 //@ts-ignore 279 req.chartColor = e.data.params.chartColor; 280 //@ts-ignore 281 req.wakeupBean = e.data.params.wakeupBean; 282 //@ts-ignore 283 req.intervalPerf = e.data.params.intervalPerf; 284 } 285 //@ts-ignore 286 req.id = e.data.id; 287 if (!req.frame) { 288 info(req.frame); 289 return; 290 } 291 if (req.canvas) { 292 //@ts-ignore 293 if (req.canvas.width !== req.canvasWidth || req.canvas.height !== req.canvasHeight) { 294 //@ts-ignore 295 req.canvas.width = req.canvasWidth; 296 //@ts-ignore 297 req.canvas.height = req.canvasHeight; 298 //@ts-ignore 299 req.context.scale(e.data.params.dpr, e.data.params.dpr); 300 } 301 } 302} 303 304self.onmessageerror = function (e: unknown): void {}; 305