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