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 { queryVirtualMemory, queryVirtualMemoryData } from '../../database/SqlLite.js'; 19import { VirtualMemoryRender, VirtualMemoryStruct } from '../../database/ui-worker/ProcedureWorkerVirtualMemory.js'; 20import { renders } from '../../database/ui-worker/ProcedureWorker.js'; 21import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.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 vmFolder = TraceRow.skeleton(); 36 vmFolder.rowId = `VirtualMemory`; 37 vmFolder.index = 0; 38 vmFolder.rowType = TraceRow.ROW_TYPE_VIRTUAL_MEMORY_GROUP; 39 vmFolder.rowParentId = ''; 40 vmFolder.folder = true; 41 vmFolder.name = `Virtual Memory`; 42 vmFolder.style.height = '40px'; 43 vmFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler; 44 vmFolder.selectChangeHandler = this.trace.selectChangeHandler; 45 vmFolder.supplier = () => new Promise<Array<any>>((resolve) => resolve([])); 46 vmFolder.onThreadHandler = (useCache) => { 47 vmFolder.canvasSave(this.trace.canvasPanelCtx!); 48 if (vmFolder.expansion) { 49 this.trace.canvasPanelCtx?.clearRect(0, 0, vmFolder.frame.width, vmFolder.frame.height); 50 } else { 51 (renders['empty'] as EmptyRender).renderMainThread( 52 { 53 context: this.trace.canvasPanelCtx, 54 useCache: useCache, 55 type: ``, 56 }, 57 vmFolder 58 ); 59 } 60 vmFolder.canvasRestore(this.trace.canvasPanelCtx!); 61 }; 62 this.trace.rowsEL?.appendChild(vmFolder); 63 array.forEach((it, idx) => this.initVirtualMemoryRow(vmFolder, it.id, it.name, idx)); 64 } 65 66 initVirtualMemoryRow(folder: TraceRow<any>, id: number, name: string, idx: number) { 67 let virtualMemoryRow = TraceRow.skeleton<VirtualMemoryStruct>(); 68 virtualMemoryRow.rowId = `${id}`; 69 virtualMemoryRow.rowType = TraceRow.ROW_TYPE_VIRTUAL_MEMORY; 70 virtualMemoryRow.rowParentId = folder.rowId; 71 virtualMemoryRow.rowHidden = !folder.expansion; 72 virtualMemoryRow.style.height = '40px'; 73 virtualMemoryRow.name = `${name.substring(16)}`; 74 virtualMemoryRow.setAttribute('children', ''); 75 virtualMemoryRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 76 virtualMemoryRow.selectChangeHandler = this.trace.selectChangeHandler; 77 virtualMemoryRow.supplier = () => 78 queryVirtualMemoryData(id).then((resultVm) => { 79 let maxValue = Math.max(...resultVm.map((it) => it.value || 0)); 80 for (let j = 0; j < resultVm.length; j++) { 81 resultVm[j].maxValue = maxValue; 82 if (j == resultVm.length - 1) { 83 resultVm[j].duration = (TraceRow.range?.totalNS || 0) - (resultVm[j].startTime || 0); 84 } else { 85 resultVm[j].duration = (resultVm[j + 1].startTime || 0) - (resultVm[j].startTime || 0); 86 } 87 if (j > 0) { 88 resultVm[j].delta = (resultVm[j].value || 0) - (resultVm[j - 1].value || 0); 89 } else { 90 resultVm[j].delta = 0; 91 } 92 } 93 return resultVm; 94 }); 95 virtualMemoryRow.focusHandler = () => { 96 this.trace?.displayTip( 97 virtualMemoryRow, 98 VirtualMemoryStruct.hoverStruct, 99 `<span>value:${VirtualMemoryStruct.hoverStruct?.value}</span>` 100 ); 101 }; 102 virtualMemoryRow.onThreadHandler = (useCache) => { 103 let context = virtualMemoryRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 104 virtualMemoryRow.canvasSave(context); 105 (renders['virtual-memory-cell'] as VirtualMemoryRender).renderMainThread( 106 { 107 context: context, 108 useCache: useCache, 109 type: `virtual-memory-cell-${id}`, 110 }, 111 virtualMemoryRow 112 ); 113 virtualMemoryRow.canvasRestore(context); 114 }; 115 folder.addChildTraceRow(virtualMemoryRow); 116 } 117} 118