• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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