• 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 { 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