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}