1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { SpSystemTrace } from '../SpSystemTrace';
17fb726d48Sopenharmony_ciimport { TraceRow } from '../trace/base/TraceRow';
18fb726d48Sopenharmony_ciimport { VirtualMemoryRender, VirtualMemoryStruct } from '../../database/ui-worker/ProcedureWorkerVirtualMemory';
19fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker';
20fb726d48Sopenharmony_ciimport { EmptyRender } from '../../database/ui-worker/cpu/ProcedureWorkerCPU';
21fb726d48Sopenharmony_ciimport { virtualMemoryDataSender } from '../../database/data-trafic/VirtualMemoryDataSender';
22fb726d48Sopenharmony_ciimport { queryVirtualMemory } from '../../database/sql/Memory.sql';
23fb726d48Sopenharmony_ciimport { NUM_16 } from '../../bean/NumBean';
24fb726d48Sopenharmony_ciimport { BaseStruct } from '../../bean/BaseStruct';
25fb726d48Sopenharmony_ci
26fb726d48Sopenharmony_ciexport class SpVirtualMemChart {
27fb726d48Sopenharmony_ci  trace: SpSystemTrace;
28fb726d48Sopenharmony_ci
29fb726d48Sopenharmony_ci  constructor(trace: SpSystemTrace) {
30fb726d48Sopenharmony_ci    this.trace = trace;
31fb726d48Sopenharmony_ci  }
32fb726d48Sopenharmony_ci
33fb726d48Sopenharmony_ci  async init(): Promise<void> {
34fb726d48Sopenharmony_ci    let array = await queryVirtualMemory();
35fb726d48Sopenharmony_ci    if (array.length === 0) {
36fb726d48Sopenharmony_ci      return;
37fb726d48Sopenharmony_ci    }
38fb726d48Sopenharmony_ci    let vmFolder = TraceRow.skeleton();
39fb726d48Sopenharmony_ci    vmFolder.rowId = 'VirtualMemory';
40fb726d48Sopenharmony_ci    vmFolder.index = 0;
41fb726d48Sopenharmony_ci    vmFolder.rowType = TraceRow.ROW_TYPE_VIRTUAL_MEMORY_GROUP;
42fb726d48Sopenharmony_ci    vmFolder.rowParentId = '';
43fb726d48Sopenharmony_ci    vmFolder.folder = true;
44fb726d48Sopenharmony_ci    vmFolder.name = 'Virtual Memory';
45fb726d48Sopenharmony_ci    vmFolder.style.height = '40px';
46fb726d48Sopenharmony_ci    vmFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler;
47fb726d48Sopenharmony_ci    vmFolder.selectChangeHandler = this.trace.selectChangeHandler;
48fb726d48Sopenharmony_ci    vmFolder.supplier = async (): Promise<BaseStruct[]> => new Promise<[]>((resolve) => resolve([]));
49fb726d48Sopenharmony_ci    vmFolder.onThreadHandler = (useCache): void => {
50fb726d48Sopenharmony_ci      vmFolder.canvasSave(this.trace.canvasPanelCtx!);
51fb726d48Sopenharmony_ci      if (vmFolder.expansion) {
52fb726d48Sopenharmony_ci        // @ts-ignore
53fb726d48Sopenharmony_ci        this.trace.canvasPanelCtx?.clearRect(0, 0, vmFolder.frame.width, vmFolder.frame.height);
54fb726d48Sopenharmony_ci      } else {
55fb726d48Sopenharmony_ci        (renders.empty as EmptyRender).renderMainThread(
56fb726d48Sopenharmony_ci          {
57fb726d48Sopenharmony_ci            context: this.trace.canvasPanelCtx,
58fb726d48Sopenharmony_ci            useCache: useCache,
59fb726d48Sopenharmony_ci            type: '',
60fb726d48Sopenharmony_ci          },
61fb726d48Sopenharmony_ci          vmFolder
62fb726d48Sopenharmony_ci        );
63fb726d48Sopenharmony_ci      }
64fb726d48Sopenharmony_ci      vmFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace);
65fb726d48Sopenharmony_ci    };
66fb726d48Sopenharmony_ci    this.trace.rowsEL?.appendChild(vmFolder);
67fb726d48Sopenharmony_ci    //@ts-ignore
68fb726d48Sopenharmony_ci    array.forEach((it) => this.initVirtualMemoryRow(vmFolder, it.id, it.name));
69fb726d48Sopenharmony_ci  }
70fb726d48Sopenharmony_ci
71fb726d48Sopenharmony_ci  private initVirtualMemoryChartRow(
72fb726d48Sopenharmony_ci    id: number,
73fb726d48Sopenharmony_ci    folder: TraceRow<BaseStruct>,
74fb726d48Sopenharmony_ci    name: string
75fb726d48Sopenharmony_ci  ): TraceRow<VirtualMemoryStruct> {
76fb726d48Sopenharmony_ci    let virtualMemoryRow = TraceRow.skeleton<VirtualMemoryStruct>();
77fb726d48Sopenharmony_ci    virtualMemoryRow.rowId = `${id}`;
78fb726d48Sopenharmony_ci    virtualMemoryRow.rowType = TraceRow.ROW_TYPE_VIRTUAL_MEMORY;
79fb726d48Sopenharmony_ci    virtualMemoryRow.rowParentId = folder.rowId;
80fb726d48Sopenharmony_ci    virtualMemoryRow.rowHidden = !folder.expansion;
81fb726d48Sopenharmony_ci    virtualMemoryRow.style.height = '40px';
82fb726d48Sopenharmony_ci    virtualMemoryRow.name = `${name.substring(NUM_16)}`;
83fb726d48Sopenharmony_ci    virtualMemoryRow.setAttribute('children', '');
84fb726d48Sopenharmony_ci    virtualMemoryRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
85fb726d48Sopenharmony_ci    virtualMemoryRow.selectChangeHandler = this.trace.selectChangeHandler;
86fb726d48Sopenharmony_ci    virtualMemoryRow.focusHandler = (): void => {
87fb726d48Sopenharmony_ci      this.trace?.displayTip(
88fb726d48Sopenharmony_ci        virtualMemoryRow,
89fb726d48Sopenharmony_ci        VirtualMemoryStruct.hoverStruct,
90fb726d48Sopenharmony_ci        `<span>value:${VirtualMemoryStruct.hoverStruct?.value}</span>`
91fb726d48Sopenharmony_ci      );
92fb726d48Sopenharmony_ci    };
93fb726d48Sopenharmony_ci    virtualMemoryRow.findHoverStruct = (): void => {
94fb726d48Sopenharmony_ci      VirtualMemoryStruct.hoverStruct = virtualMemoryRow.getHoverStruct();
95fb726d48Sopenharmony_ci    };
96fb726d48Sopenharmony_ci    return virtualMemoryRow;
97fb726d48Sopenharmony_ci  }
98fb726d48Sopenharmony_ci
99fb726d48Sopenharmony_ci  initVirtualMemoryRow(folder: TraceRow<BaseStruct>, id: number, name: string): void {
100fb726d48Sopenharmony_ci    let virtualMemoryRow = this.initVirtualMemoryChartRow(id, folder, name);
101fb726d48Sopenharmony_ci    virtualMemoryRow.supplierFrame = async (): Promise<VirtualMemoryStruct[]> =>
102fb726d48Sopenharmony_ci      virtualMemoryDataSender(id, virtualMemoryRow).then((resultVm) => {
103fb726d48Sopenharmony_ci        let maxValue = 0;
104fb726d48Sopenharmony_ci        if (!virtualMemoryRow.isComplete) {
105fb726d48Sopenharmony_ci          maxValue = Math.max(...resultVm.map((it) => it.value || 0));
106fb726d48Sopenharmony_ci          virtualMemoryRow.setAttribute('maxValue', maxValue.toString() || '');
107fb726d48Sopenharmony_ci        }
108fb726d48Sopenharmony_ci        for (let j = 0; j < resultVm.length; j++) {
109fb726d48Sopenharmony_ci          if (!virtualMemoryRow.isComplete) {
110fb726d48Sopenharmony_ci            resultVm[j].maxValue = maxValue;
111fb726d48Sopenharmony_ci          } else {
112fb726d48Sopenharmony_ci            resultVm[j].maxValue = Number(virtualMemoryRow.getAttribute('maxValue'));
113fb726d48Sopenharmony_ci          }
114fb726d48Sopenharmony_ci          if (j === resultVm.length - 1) {
115fb726d48Sopenharmony_ci            resultVm[j].duration = (TraceRow.range?.totalNS || 0) - (resultVm[j].startTime || 0);
116fb726d48Sopenharmony_ci          } else {
117fb726d48Sopenharmony_ci            resultVm[j].duration = (resultVm[j + 1].startTime || 0) - (resultVm[j].startTime || 0);
118fb726d48Sopenharmony_ci          }
119fb726d48Sopenharmony_ci          if (j > 0) {
120fb726d48Sopenharmony_ci            resultVm[j].delta = (resultVm[j].value || 0) - (resultVm[j - 1].value || 0);
121fb726d48Sopenharmony_ci          } else {
122fb726d48Sopenharmony_ci            resultVm[j].delta = 0;
123fb726d48Sopenharmony_ci          }
124fb726d48Sopenharmony_ci        }
125fb726d48Sopenharmony_ci        return resultVm;
126fb726d48Sopenharmony_ci      });
127fb726d48Sopenharmony_ci    virtualMemoryRow.onThreadHandler = (useCache): void => {
128fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
129fb726d48Sopenharmony_ci      if (virtualMemoryRow.currentContext) {
130fb726d48Sopenharmony_ci        context = virtualMemoryRow.currentContext;
131fb726d48Sopenharmony_ci      } else {
132fb726d48Sopenharmony_ci        context = virtualMemoryRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
133fb726d48Sopenharmony_ci      }
134fb726d48Sopenharmony_ci      virtualMemoryRow.canvasSave(context);
135fb726d48Sopenharmony_ci      (renders['virtual-memory-cell'] as VirtualMemoryRender).renderMainThread(
136fb726d48Sopenharmony_ci        {
137fb726d48Sopenharmony_ci          context: context,
138fb726d48Sopenharmony_ci          useCache: useCache,
139fb726d48Sopenharmony_ci          type: `virtual-memory-cell-${id}`,
140fb726d48Sopenharmony_ci        },
141fb726d48Sopenharmony_ci        virtualMemoryRow
142fb726d48Sopenharmony_ci      );
143fb726d48Sopenharmony_ci      virtualMemoryRow.canvasRestore(context, this.trace);
144fb726d48Sopenharmony_ci    };
145fb726d48Sopenharmony_ci    folder.addChildTraceRow(virtualMemoryRow);
146fb726d48Sopenharmony_ci  }
147fb726d48Sopenharmony_ci}
148