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 */ 15import { BaseElement, element } from '../../../../../base-ui/BaseElement'; 16import { type LitTable } from '../../../../../base-ui/table/lit-table'; 17import { type SelectionParam } from '../../../../bean/BoxSelection'; 18import { Utils } from '../../base/Utils'; 19import { MemoryConfig } from '../../../../bean/MemoryConfig'; 20import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon'; 21import {queryVmTrackerShmSizeData} from "../../../../database/sql/Memory.sql"; 22import { TabPaneVmTrackerShmHtml } from './TabPaneVmTrackerShm.html'; 23 24@element('tabpane-vmtracker-shm') 25export class TabPaneVmTrackerShm extends BaseElement { 26 private TableEl: LitTable | undefined | null; 27 private shmData: Array<number | string> = []; 28 private sortArray: Array<any> = []; 29 private memoryConfig: MemoryConfig = MemoryConfig.getInstance(); 30 private tabTitle: HTMLDivElement | undefined | null; 31 private range: HTMLLabelElement | null | undefined; 32 33 set data(valVmTrackerShm: SelectionParam | any) { 34 if (valVmTrackerShm.vmtrackershm.length > 0) { 35 this.init(); 36 this.clear(); 37 this.range!.textContent = 38 'Selected range: ' + 39 parseFloat(((valVmTrackerShm.rightNs - valVmTrackerShm.leftNs) / 1000000.0).toFixed(5)) + 40 ' ms'; 41 this.queryDataByDB(valVmTrackerShm); 42 } 43 } 44 45 initElements(): void { 46 this.TableEl = this.shadowRoot!.querySelector<LitTable>('#tb-shm') as LitTable; 47 this.range = this.shadowRoot?.querySelector('#time-range'); 48 this.tabTitle = this.TableEl!.shadowRoot?.querySelector('.thead') as HTMLDivElement; 49 this.TableEl!.addEventListener('column-click', (evt) => { 50 // @ts-ignore 51 this.sortByColumn(evt.detail.key, evt.detail.sort); 52 }); 53 } 54 55 queryDataByDB(srVal: SelectionParam | any): void { 56 queryVmTrackerShmSizeData( 57 srVal.leftNs, 58 srVal.rightNs, 59 this.memoryConfig.iPid, 60 (MemoryConfig.getInstance().interval * 1000_000) / 5 61 ).then((result) => { 62 if (result.length > 0) { 63 for (let filter of result) { 64 filter.time = ns2s(filter.startNS); 65 filter.sumSizeStr = Utils.getBinaryByteWithUnit(filter.sum); 66 filter.avgSizeStr = Utils.getBinaryByteWithUnit(filter.avg); 67 filter.minSizeStr = Utils.getBinaryByteWithUnit(filter.min); 68 filter.maxSizeStr = Utils.getBinaryByteWithUnit(filter.max); 69 } 70 this.shmData = result.sort((a, b) => b.avg - a.avg); 71 this.TableEl!.recycleDataSource = this.shmData; 72 } 73 }); 74 } 75 76 clear(): void { 77 this.TableEl!.recycleDataSource = []; 78 } 79 80 private init(): void { 81 const thTable = this.tabTitle!.querySelector('.th'); 82 const vmTrackerShmTblNodes = thTable!.querySelectorAll('div'); 83 if (this.tabTitle!.hasAttribute('sort')) { 84 this.tabTitle!.removeAttribute('sort'); 85 vmTrackerShmTblNodes.forEach((item) => { 86 item.querySelectorAll('svg').forEach((svg) => { 87 svg.style.display = 'none'; 88 }); 89 }); 90 } 91 } 92 93 sortByColumn(column: string, sort: number): void { 94 switch (sort) { 95 case 0: 96 this.TableEl!.snapshotDataSource = this.shmData; 97 break; 98 default: 99 this.sortArray = [...this.shmData]; 100 switch (column) { 101 case 'time': 102 this.TableEl!.snapshotDataSource = this.sortArray.sort((leftStartNS, rightStartNS) => { 103 return sort === 1 104 ? leftStartNS.startNS - rightStartNS.startNS 105 : rightStartNS.startNS - leftStartNS.startNS; 106 }); 107 break; 108 case 'flag': 109 this.TableEl!.snapshotDataSource = this.sortArray.sort((leftFlag, rightFlag) => { 110 return sort === 1 ? leftFlag.flag - rightFlag.flag : rightFlag.flag - leftFlag.flag; 111 }); 112 break; 113 case 'minSizeStr': 114 this.TableEl!.snapshotDataSource = this.sortArray.sort((leftMin, rightMin) => { 115 return sort === 1 ? leftMin.min - rightMin.min : rightMin.min - leftMin.min; 116 }); 117 break; 118 case 'avgSizeStr': 119 this.TableEl!.snapshotDataSource = this.sortArray.sort((leftAvg, rightAvg) => { 120 return sort === 1 ? leftAvg.avg - rightAvg.avg : rightAvg.avg - leftAvg.avg; 121 }); 122 break; 123 case 'maxSizeStr': 124 this.TableEl!.snapshotDataSource = this.sortArray.sort((leftMax, rightMax) => { 125 return sort === 1 ? leftMax.max - rightMax.max : rightMax.max - leftMax.max; 126 }); 127 break; 128 } 129 break; 130 } 131 } 132 133 initHtml(): string { 134 return TabPaneVmTrackerShmHtml; 135 } 136} 137