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