• 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 */
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