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