• 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 {querySmapsData, querySmapsDataMax, querySmapsExits} from "../../database/SqlLite.js";
18import {TraceRow} from "../trace/base/TraceRow.js";
19import {BaseStruct} from "../../bean/BaseStruct.js";
20import {procedurePool} from "../../database/Procedure.js";
21import {CounterStruct} from "../../bean/SdkStruct.js";
22import {SmapsShowStruct} from "../../bean/SmapsShowStruct.js";
23
24export class SmpsChart {
25    private trace: SpSystemTrace;
26
27    constructor(trace: SpSystemTrace) {
28        this.trace = trace;
29    }
30
31    async init() {
32        let result = await querySmapsExits();
33        if (result.length <= 0) return;
34        let smapsRow = this.initSmapsRow();
35        let rowNameList: Array<string> = ['Dirty Size', 'Swapped Size', 'Resident Size']
36        for (let rowName of rowNameList) {
37            await this.initRows(smapsRow, rowName);
38        }
39    }
40
41    private initSmapsRow = () => {
42        let smapsRow = new TraceRow<any>();
43        smapsRow.rowId = `smapsRow`
44        smapsRow.rowType = TraceRow.ROW_TYPE_SMAPS
45        smapsRow.rowParentId = '';
46        smapsRow.folder = true;
47        smapsRow.name = 'VM Tracker';
48        smapsRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
49        smapsRow.selectChangeHandler = this.trace.selectChangeHandler;
50        smapsRow.supplier = () => new Promise<Array<any>>((resolve) => resolve([]));
51        smapsRow.onThreadHandler = (useCache) => {
52            procedurePool.submitWithName(`cpu0`, `smaps`, {
53                    list: smapsRow.must ? smapsRow.dataList : undefined,
54                    offscreen: smapsRow.must ? smapsRow.offscreen[0] : undefined,
55                    xs: TraceRow.range?.xs,
56                    dpr: smapsRow.dpr,
57                    isHover: smapsRow.isHover,
58                    hoverX: smapsRow.hoverX,
59                    hoverY: smapsRow.hoverY,
60                    flagMoveInfo: this.trace.hoverFlag,
61                    flagSelectedInfo: this.trace.selectFlag,
62                    canvasWidth: smapsRow.canvasWidth,
63                    canvasHeight: smapsRow.canvasHeight,
64                    isRangeSelect: smapsRow.rangeSelect,
65                    rangeSelectObject: TraceRow.rangeSelectObject,
66                    useCache: useCache,
67                    lineColor: smapsRow.getLineColor(),
68                    startNS: TraceRow.range?.startNS || 0,
69                    endNS: TraceRow.range?.endNS || 0,
70                    totalNS: TraceRow.range?.totalNS || 0,
71                    slicesTime: TraceRow.range?.slicesTime,
72                    range: TraceRow.range,
73                    frame: smapsRow.frame,
74                }, smapsRow.must && smapsRow.args.isOffScreen ? smapsRow.offscreen[0] : undefined, (res: any, hover: any) => {
75                    smapsRow.must = false;
76                }
77            )
78        }
79        this.trace.rowsEL?.appendChild(smapsRow)
80        return smapsRow;
81    }
82
83    private initRows = async (nodeRow: TraceRow<BaseStruct>, rowName:string ) => {
84        let traceRow = new TraceRow<CounterStruct>({
85            canvasNumber: 1,
86            alpha: false,
87            contextId: '2d',
88            isOffScreen: SpSystemTrace.isCanvasOffScreen
89        });
90        traceRow.rowParentId = `smapsRow`
91        traceRow.rowHidden = !nodeRow.expansion
92        traceRow.rowId = rowName
93        traceRow.rowType = TraceRow.ROW_TYPE_SMAPS
94        traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
95        traceRow.selectChangeHandler = this.trace.selectChangeHandler;
96        traceRow.style.height = '40px'
97        traceRow.style.width = `100%`;
98        traceRow.setAttribute('children', '');
99        traceRow.name = rowName;
100        let columnName = ""
101        if (rowName == "Dirty Size") {
102            columnName = "dirty"
103        } else if (rowName == "Swapped Size") {
104            columnName = "swapper"
105        } else {
106            columnName = "resident_size"
107        }
108        traceRow.supplier = () => querySmapsData(columnName)
109        let maxList = await querySmapsDataMax(columnName);
110        let maxValue = maxList[0].max_value;
111        traceRow.onThreadHandler = (useCache) => {
112            procedurePool.submitWithName(`process0`, `smaps-${rowName}`, {
113                    list: traceRow.must ? traceRow.dataList : undefined,
114                    offscreen: traceRow.must ? traceRow.offscreen[0] : undefined,
115                    xs: TraceRow.range?.xs,
116                    dpr: traceRow.dpr,
117                    isHover: traceRow.isHover,
118                    hoverX: traceRow.hoverX,
119                    hoverY: traceRow.hoverY,
120                    flagMoveInfo: this.trace.hoverFlag,
121                    flagSelectedInfo: this.trace.selectFlag,
122                    canvasWidth: traceRow.canvasWidth,
123                    canvasHeight: traceRow.canvasHeight,
124                    hoverCounterStruct: SmapsShowStruct.hoverStruct,
125                    selectCounterStruct: SmapsShowStruct.selectStruct,
126                    isRangeSelect: traceRow.rangeSelect,
127                    rangeSelectObject: TraceRow.rangeSelectObject,
128                    maxValue: maxValue,
129                    maxValueName: maxValue + "",
130                    rowName: columnName,
131                    useCache: useCache,
132                    lineColor: traceRow.getLineColor(),
133                    startNS: TraceRow.range?.startNS || 0,
134                    endNS: TraceRow.range?.endNS || 0,
135                    totalNS: TraceRow.range?.totalNS || 0,
136                    slicesTime: TraceRow.range?.slicesTime,
137                    range: TraceRow.range,
138                    frame: traceRow.frame,
139                }, traceRow.must && traceRow.args.isOffScreen ? traceRow.offscreen[0] : undefined, (res: any, hover: any) => {
140                    traceRow.must = false;
141                    if (traceRow.args.isOffScreen == true) {
142                        if (traceRow.isHover) {
143                            SmapsShowStruct.hoverStruct = hover;
144                            this.trace.visibleRows.filter(it => it.rowType === TraceRow.ROW_TYPE_SMAPS && it.name !== traceRow.name).forEach(it => it.draw(true));
145                        }
146                        return;
147                    }
148                }
149            )
150        }
151        this.trace.rowsEL?.appendChild(traceRow)
152    }
153}