• 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 {SpSystemTrace} from "../SpSystemTrace.js";
17import {TraceRow} from "../trace/base/TraceRow.js";
18import {procedurePool} from "../../database/Procedure.js";
19import {queryVirtualMemory, queryVirtualMemoryData} from "../../database/SqlLite.js";
20import {CpuStruct} from "../../bean/CpuStruct.js";
21import {VirtualMemoryStruct} from "../../database/ui-worker/ProcedureWorkerVirtualMemory.js";
22
23export class SpVirtualMemChart {
24    private trace: SpSystemTrace;
25
26    constructor(trace: SpSystemTrace) {
27        this.trace = trace;
28    }
29
30    async init() {
31        let array = await  queryVirtualMemory();
32        if(array.length==0){
33            return;
34        }
35        let folder = new TraceRow({
36            canvasNumber: 1,
37            alpha: false,
38            contextId: '2d',
39            isOffScreen: SpSystemTrace.isCanvasOffScreen
40        });
41        folder.rowId = `VirtualMemory`;
42        folder.index = 0;
43        folder.rowType = TraceRow.ROW_TYPE_VIRTUAL_MEMORY_GROUP
44        folder.rowParentId = '';
45        folder.folder = true;
46        folder.name = `Virtual Memory`;
47        folder.supplier = () => new Promise<Array<any>>((resolve) => resolve([]));
48        folder.favoriteChangeHandler = this.trace.favoriteChangeHandler;
49        folder.selectChangeHandler = this.trace.selectChangeHandler;
50        folder.onThreadHandler = (useCache) => {
51            procedurePool.submitWithName(`process${folder.index}`, `virtual-memory-folder`, folder.buildArgs({
52                flagMoveInfo: this.trace.hoverFlag,
53                flagSelectedInfo: this.trace.selectFlag,
54                useCache: useCache,
55                scale: TraceRow.range?.scale || 50,
56            }), !folder.isTransferCanvas ? folder.offscreen[0] : undefined, (res: any) => {
57                folder.must = false;
58            })
59            folder.isTransferCanvas = true;
60        }
61        this.trace.rowsEL?.appendChild(folder)
62        array.forEach((it,idx)=> this.initVirtualMemoryRow(folder, it.id, it.name, idx))
63    }
64
65    initVirtualMemoryRow(folder:TraceRow<any>,id:number,name:string,idx:number) {
66        let row = new TraceRow<any>({
67            canvasNumber: 1,
68            alpha: false,
69            contextId: '2d',
70            isOffScreen: SpSystemTrace.isCanvasOffScreen
71        });
72        row.rowId = `${id}`
73        row.rowType = TraceRow.ROW_TYPE_VIRTUAL_MEMORY
74        row.rowParentId = folder.rowId
75        row.rowHidden = !folder.expansion
76        row.style.height = '40px'
77        row.style.width = `100%`;
78        row.name = `${name.substring(16)}`;
79        row.setAttribute('children', '');
80        row.favoriteChangeHandler = this.trace.favoriteChangeHandler;
81        row.selectChangeHandler = this.trace.selectChangeHandler;
82        row.supplier = () => queryVirtualMemoryData(id).then(res => {
83            let maxValue = Math.max(...res.map(it => it.value || 0))
84            for (let j = 0; j < res.length; j++) {
85                res[j].maxValue = maxValue;
86                if (j == res.length - 1) {
87                    res[j].duration = (TraceRow.range?.totalNS || 0) - (res[j].startTime || 0);
88                } else {
89                    res[j].duration = (res[j + 1].startTime || 0) - (res[j].startTime || 0);
90                }
91                if (j > 0) {
92                    res[j].delta = (res[j].value || 0) - (res[j - 1].value || 0);
93                } else {
94                    res[j].delta = 0;
95                }
96            }
97            return res
98        });
99        row.onThreadHandler = (useCache) => {
100            procedurePool.submitWithName(`cpu${idx % procedurePool.cpusLen.length}`, `virtual-memory-cell-${id}`, row.buildArgs({
101                flagMoveInfo: this.trace.hoverFlag,
102                flagSelectedInfo: this.trace.selectFlag,
103                wakeupBean: CpuStruct.wakeupBean,
104                useCache: useCache,
105                hoverStruct: VirtualMemoryStruct.hoverStruct,
106            }), row.getTransferArray(), (res: any, hover: any) => {
107                row.must = false;
108                if (row.isHover) {
109                    VirtualMemoryStruct.hoverStruct = hover;
110                }
111                return;
112            });
113            row.isTransferCanvas = true;
114        }
115        this.trace.rowsEL?.appendChild(row)
116    }
117}