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