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}