• 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 "./ProcedureWorkerCPU.js";
17import {
18    RequestMessage,
19} from "./ProcedureWorkerCommon.js";
20import {FreqRender} from "./ProcedureWorkerFreq.js";
21import {ProcessRender} from "./ProcedureWorkerProcess.js";
22import {MemRender} from "./ProcedureWorkerMem.js";
23import {ThreadRender} from "./ProcedureWorkerThread.js";
24import {FuncRender} from "./ProcedureWorkerFunc.js";
25import {FpsRender} from "./ProcedureWorkerFPS.js";
26import {HeapRender, NativeMemoryRender} from "./ProcedureWorkerHeap.js";
27import {TimelineRender} from "./ProcedureWorkerTimeline.js";
28import {CpuAbilityRender} from "./ProcedureWorkerCpuAbility.js";
29import {MemoryAbilityRender} from "./ProcedureWorkerMemoryAbility.js";
30import {DiskIoAbilityRender} from "./ProcedureWorkerDiskIoAbility.js";
31import {NetworkAbilityRender} from "./ProcedureWorkerNetworkAbility.js";
32import {HiperfCpuRender} from "./ProcedureWorkerHiPerfCPU.js";
33import {HiperfProcessRender} from "./ProcedureWorkerHiPerfProcess.js";
34import {HiperfThreadRender} from "./ProcedureWorkerHiPerfThread.js";
35import {HiperfEventRender} from "./ProcedureWorkerHiPerfEvent.js";
36import {HiperfReportRender} from "./ProcedureWorkerHiPerfReport.js";
37import {VirtualMemoryRender} from "./ProcedureWorkerVirtualMemory.js";
38import {FileSystemRender} from "./ProcedureWorkerFileSystem.js";
39import {info} from "../../../log/Log.js";
40import {SdkSliceRender} from "./ProduceWorkerSdkSlice.js";
41import {SdkCounterRender} from "./ProduceWorkerSdkCounter.js";
42import {CpuStateRender} from "./ProcedureWorkerCpuState.js";
43import {EnergyAnomalyRender} from "./ProcedureWorkerEnergyAnomaly.js";
44import {EnergySystemRender} from "./ProcedureWorkerEnergySystem.js";
45import {EnergyPowerRender} from "./ProcedureWorkerEnergyPower.js";
46import {EnergyStateRender} from "./ProcedureWorkerEnergyState.js";
47import {SmapsRender} from "./ProcedureWorkerSmaps.js";
48import {CpuFreqLimitRender} from "./ProcedureWorkerCpuFreqLimits.js";
49
50let dataList: any = {}
51let dataList2: any = {}
52let dataFilter: any = {}
53let canvasList: any = {}
54let contextList: any = {}
55let renders: any = {
56    "timeline": new TimelineRender(),
57    "cpu-data": new CpuRender(),
58    "cpu-state": new CpuStateRender(),
59    "cpu-limit-freq": new CpuFreqLimitRender(),
60    "fps": new FpsRender(),
61    "freq": new FreqRender(),
62    "virtual-memory-folder": new EmptyRender(),
63    "virtual-memory-cell": new VirtualMemoryRender(),
64    "file-system-group": new EmptyRender(),
65    "file-system-cell": new FileSystemRender(),
66    "process": new ProcessRender(),
67    "heap": new HeapRender(),
68    "mem": new MemRender(),
69    "thread": new ThreadRender(),
70    "func": new FuncRender(),
71    "native": new NativeMemoryRender(),
72    "HiPerf-Group": new EmptyRender(),
73    "monitorGroup": new EmptyRender(),
74    "HiPerf-Cpu": new HiperfCpuRender(),
75    "HiPerf-Process": new HiperfProcessRender(),
76    "HiPerf-Thread": new HiperfThreadRender(),
77    "HiPerf-Report-Event": new HiperfEventRender(),
78    "HiPerf-Report-Fold": new HiperfReportRender(),
79    "monitorCpu": new CpuAbilityRender(),
80    "monitorMemory": new MemoryAbilityRender(),
81    "monitorDiskIo": new DiskIoAbilityRender(),
82    "monitorNetwork": new NetworkAbilityRender(),
83    "sdkSlice": new SdkSliceRender(),
84    "sdkCounter": new SdkCounterRender(),
85    "energyAnomaly": new EnergyAnomalyRender(),
86    "energySystem": new EnergySystemRender(),
87    "energyPower": new EnergyPowerRender(),
88    "energyState": new EnergyStateRender(),
89    "smaps": new SmapsRender(),
90};
91
92function match(type: string, req: RequestMessage) {
93    Reflect.ownKeys(renders).filter((it) => {
94        if (type.startsWith(it as string)) {
95            if (dataList[type]) {
96                req.lazyRefresh = dataList[type].length > 20000;
97            }
98            renders[it].render(req, dataList[type], dataFilter[type], dataList2);
99        }
100    })
101}
102
103let dec = new TextDecoder();
104let convertJSON = (arr: any) => {
105    if (arr instanceof ArrayBuffer) {
106        let jsonArray = [];
107        let str = dec.decode(new Uint8Array(arr));
108        str = str.substring(str.indexOf("\n") + 1);
109        if (!str) {
110        } else {
111            let parse = JSON.parse(str);
112            let columns = parse.columns;
113            let values = parse.values;
114            for (let i = 0; i < values.length; i++) {
115                let obj: any = {}
116                for (let j = 0; j < columns.length; j++) {
117                    obj[columns[j]] = values[i][j]
118                }
119                jsonArray.push(obj)
120            }
121        }
122        return jsonArray;
123    } else {
124        return arr;
125    }
126}
127self.onmessage = function (e: any) {
128    if ((e.data.type as string).startsWith("clear")) {
129        dataList = {};
130        dataList2 = {};
131        dataFilter = {};
132        canvasList = {};
133        contextList = {};
134        // @ts-ignore
135        self.postMessage({
136            id: e.data.id,
137            type: e.data.type,
138            results: null,
139        });
140        return;
141    }
142    if (e.data.params.list) {
143        dataList[e.data.type] = convertJSON(e.data.params.list);
144        if (e.data.params.offscreen) {
145            canvasList[e.data.type] = e.data.params.offscreen;
146            contextList[e.data.type] = e.data.params.offscreen!.getContext('2d');
147            contextList[e.data.type].scale(e.data.params.dpr, e.data.params.dpr);
148        }
149    }
150    if (!dataFilter[e.data.type]) {
151        dataFilter[e.data.type] = []
152    }
153    let req = new RequestMessage();
154    req.canvas = canvasList[e.data.type];
155    req.context = contextList[e.data.type];
156    req.type = e.data.type as string;
157    req.params = e.data.params;
158    req.online = e.data.params.online;
159    req.buf = e.data.params.buf;
160    req.isRangeSelect = e.data.params.isRangeSelect;
161    req.isHover = e.data.params.isHover;
162    req.xs = e.data.params.xs;
163    req.frame = e.data.params.frame;
164    req.flagMoveInfo = e.data.params.flagMoveInfo;
165    req.flagSelectedInfo = e.data.params.flagSelectedInfo;
166    req.hoverX = e.data.params.hoverX;
167    req.hoverY = e.data.params.hoverY;
168    req.startNS = e.data.params.startNS;
169    req.endNS = e.data.params.endNS;
170    req.totalNS = e.data.params.totalNS;
171    req.slicesTime = e.data.params.slicesTime;
172    req.range = e.data.params.range;
173    req.scale = e.data.params.scale;
174    req.canvasWidth = e.data.params.canvasWidth;
175    req.canvasHeight = e.data.params.canvasHeight;
176    req.useCache = e.data.params.useCache;
177    req.lineColor = e.data.params.lineColor;
178    req.chartColor = e.data.params.chartColor;
179    req.wakeupBean = e.data.params.wakeupBean;
180    req.intervalPerf = e.data.params.intervalPerf;
181    req.id = e.data.id;
182    if (!req.frame) {
183        info(req.frame);
184        return;
185    }
186    if (req.canvas) {
187        if (req.canvas.width !== req.canvasWidth || req.canvas.height !== req.canvasHeight) {
188            req.canvas.width = req.canvasWidth;
189            req.canvas.height = req.canvasHeight;
190            req.context.scale(e.data.params.dpr, e.data.params.dpr);
191        }
192    }
193    match(req.type, req);
194};
195self.onmessageerror = function (e: any) {
196}
197
198