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