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 { type BaseStruct } from '../../bean/BaseStruct';
19fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker';
20fb726d48Sopenharmony_ciimport { Utils } from '../trace/base/Utils';
21fb726d48Sopenharmony_ciimport { type EmptyRender } from '../../database/ui-worker/cpu/ProcedureWorkerCPU';
22fb726d48Sopenharmony_ciimport { info } from '../../../log/Log';
23fb726d48Sopenharmony_ciimport { type SnapshotRender, SnapshotStruct } from '../../database/ui-worker/ProcedureWorkerSnapshot';
24fb726d48Sopenharmony_ciimport { type TreeItemData } from '../../../base-ui/tree/LitTree';
25fb726d48Sopenharmony_ciimport { MemoryConfig } from '../../bean/MemoryConfig';
26fb726d48Sopenharmony_ciimport { TabPaneSmapsRecord } from '../trace/sheet/smaps/TabPaneSmapsRecord';
27fb726d48Sopenharmony_ciimport {
28fb726d48Sopenharmony_ci  dmaDataSender,
29fb726d48Sopenharmony_ci  gpuGpuDataSender,
30fb726d48Sopenharmony_ci  gpuMemoryDataSender,
31fb726d48Sopenharmony_ci  gpuResourceDataSender,
32fb726d48Sopenharmony_ci  gpuTotalDataSender,
33fb726d48Sopenharmony_ci  gpuWindowDataSender,
34fb726d48Sopenharmony_ci  purgeableDataSender,
35fb726d48Sopenharmony_ci  sMapsDataSender,
36fb726d48Sopenharmony_ci  shmDataSender,
37fb726d48Sopenharmony_ci} from '../../database/data-trafic/VmTrackerDataSender';
38fb726d48Sopenharmony_ciimport { resetVmTracker } from '../../database/data-trafic/VmTrackerDataReceiver';
39fb726d48Sopenharmony_ciimport { querySmapsExits } from '../../database/sql/Smaps.sql';
40fb726d48Sopenharmony_ciimport {
41fb726d48Sopenharmony_ci  queryisExistsGpuMemoryData,
42fb726d48Sopenharmony_ci  queryisExistsPurgeableData,
43fb726d48Sopenharmony_ci  queryisExistsShmData,
44fb726d48Sopenharmony_ci} from '../../database/sql/Memory.sql';
45fb726d48Sopenharmony_ciimport { queryisExistsDmaData } from '../../database/sql/Dma.sql';
46fb726d48Sopenharmony_ciimport {
47fb726d48Sopenharmony_ci  queryGpuTotalType,
48fb726d48Sopenharmony_ci  queryGpuWindowType,
49fb726d48Sopenharmony_ci  queryisExistsGpuData,
50fb726d48Sopenharmony_ci  queryisExistsGpuResourceData,
51fb726d48Sopenharmony_ci} from '../../database/sql/Gpu.sql';
52fb726d48Sopenharmony_ci
53fb726d48Sopenharmony_ciexport class VmTrackerChart {
54fb726d48Sopenharmony_ci  private trace: SpSystemTrace;
55fb726d48Sopenharmony_ci  private rowFolder!: TraceRow<BaseStruct>;
56fb726d48Sopenharmony_ci  private sMapsFolder!: TraceRow<BaseStruct>;
57fb726d48Sopenharmony_ci  private gpuFolder!: TraceRow<BaseStruct>;
58fb726d48Sopenharmony_ci  private memoryConfig: MemoryConfig = MemoryConfig.getInstance();
59fb726d48Sopenharmony_ci  static gpuTotalModule: number | null = null; //ns
60fb726d48Sopenharmony_ci  static gpuWindow: number | null = null; //ns
61fb726d48Sopenharmony_ci  static gpuWindowModule: number | null = null; //ns
62fb726d48Sopenharmony_ci  private smapsRecordTab: TabPaneSmapsRecord | undefined | null;
63fb726d48Sopenharmony_ci  private scratchId = -1;
64fb726d48Sopenharmony_ci  constructor(trace: SpSystemTrace) {
65fb726d48Sopenharmony_ci    this.trace = trace;
66fb726d48Sopenharmony_ci  }
67fb726d48Sopenharmony_ci
68fb726d48Sopenharmony_ci  async init(): Promise<void> {
69fb726d48Sopenharmony_ci    this.smapsRecordTab = this.trace
70fb726d48Sopenharmony_ci      .shadowRoot!.querySelector('div > trace-sheet')!
71fb726d48Sopenharmony_ci      .shadowRoot!.querySelector<TabPaneSmapsRecord>('#box-smaps-record > tabpane-smaps-record');
72fb726d48Sopenharmony_ci    if (this.scratchId === -1) {
73fb726d48Sopenharmony_ci      for (let [key, value] of SpSystemTrace.DATA_DICT) {
74fb726d48Sopenharmony_ci        if (value === 'Scratch') {
75fb726d48Sopenharmony_ci          this.scratchId = key;
76fb726d48Sopenharmony_ci          break;
77fb726d48Sopenharmony_ci        }
78fb726d48Sopenharmony_ci      }
79fb726d48Sopenharmony_ci    }
80fb726d48Sopenharmony_ci    const result = await querySmapsExits();
81fb726d48Sopenharmony_ci    if (result.length <= 0) {
82fb726d48Sopenharmony_ci      return;
83fb726d48Sopenharmony_ci    }
84fb726d48Sopenharmony_ci    await this.initVmTrackerFolder();
85fb726d48Sopenharmony_ci    await this.initSMapsFolder();
86fb726d48Sopenharmony_ci    const rowNameList: Array<string> = ['Dirty', 'Swapped', 'RSS', 'PSS', 'USS'];
87fb726d48Sopenharmony_ci    for (const rowName of rowNameList) {
88fb726d48Sopenharmony_ci      await this.initSmapsRows(rowName);
89fb726d48Sopenharmony_ci    }
90fb726d48Sopenharmony_ci    const isExistsShm = await queryisExistsShmData(this.memoryConfig.iPid);
91fb726d48Sopenharmony_ci    const isExistsDma = await queryisExistsDmaData(this.memoryConfig.iPid);
92fb726d48Sopenharmony_ci    //@ts-ignore
93fb726d48Sopenharmony_ci    if (isExistsShm[0].data_exists) {
94fb726d48Sopenharmony_ci      await this.initShmRows();
95fb726d48Sopenharmony_ci    }
96fb726d48Sopenharmony_ci    await this.initPurgeableVM();
97fb726d48Sopenharmony_ci    // @ts-ignore
98fb726d48Sopenharmony_ci    if (isExistsDma[0].data_exists) {
99fb726d48Sopenharmony_ci      await this.initDmaRow();
100fb726d48Sopenharmony_ci    }
101fb726d48Sopenharmony_ci    await this.initGpuData();
102fb726d48Sopenharmony_ci  }
103fb726d48Sopenharmony_ci
104fb726d48Sopenharmony_ci  private async initGpuData(): Promise<void> {
105fb726d48Sopenharmony_ci    const isExistsGpuMemory = await queryisExistsGpuMemoryData(this.memoryConfig.iPid);
106fb726d48Sopenharmony_ci    const isExistsGpuResource = await queryisExistsGpuResourceData(this.scratchId);
107fb726d48Sopenharmony_ci    const isExistsGraph = await queryisExistsGpuData(MemoryConfig.getInstance().iPid, "'mem.graph_pss'");
108fb726d48Sopenharmony_ci    const isExistsGl = await queryisExistsGpuData(MemoryConfig.getInstance().iPid, "'mem.gl_pss'");
109fb726d48Sopenharmony_ci    if (
110fb726d48Sopenharmony_ci      // @ts-ignore
111fb726d48Sopenharmony_ci      isExistsGpuMemory[0].data_exists ||
112fb726d48Sopenharmony_ci      // @ts-ignore
113fb726d48Sopenharmony_ci      isExistsGpuResource[0].data_exists ||
114fb726d48Sopenharmony_ci      // @ts-ignore
115fb726d48Sopenharmony_ci      isExistsGraph[0].data_exists ||
116fb726d48Sopenharmony_ci      // @ts-ignore
117fb726d48Sopenharmony_ci      isExistsGl[0].data_exists
118fb726d48Sopenharmony_ci    ) {
119fb726d48Sopenharmony_ci      await this.initGpuFolder();
120fb726d48Sopenharmony_ci      //   @ts-ignore
121fb726d48Sopenharmony_ci      if (isExistsGpuMemory[0].data_exists) {
122fb726d48Sopenharmony_ci        await this.initGpuMemoryRow();
123fb726d48Sopenharmony_ci      }
124fb726d48Sopenharmony_ci      // @ts-ignore
125fb726d48Sopenharmony_ci      if (isExistsGpuResource[0].data_exists) {
126fb726d48Sopenharmony_ci        await this.initGpuResourceRow(this.scratchId);
127fb726d48Sopenharmony_ci      } else {
128fb726d48Sopenharmony_ci        this.smapsRecordTab!.GLESHostCache = [];
129fb726d48Sopenharmony_ci      }
130fb726d48Sopenharmony_ci      // @ts-ignore
131fb726d48Sopenharmony_ci      if (isExistsGraph[0].data_exists) {
132fb726d48Sopenharmony_ci        await this.addGpuGraphRow();
133fb726d48Sopenharmony_ci      }
134fb726d48Sopenharmony_ci      // @ts-ignore
135fb726d48Sopenharmony_ci      if (isExistsGl[0].data_exists) {
136fb726d48Sopenharmony_ci        await this.addGpuGLRow();
137fb726d48Sopenharmony_ci        await this.addGpuTotalRow();
138fb726d48Sopenharmony_ci        await this.addGpuWindowRow();
139fb726d48Sopenharmony_ci      }
140fb726d48Sopenharmony_ci    }
141fb726d48Sopenharmony_ci  }
142fb726d48Sopenharmony_ci
143fb726d48Sopenharmony_ci  private initVmTrackerFolder = async (): Promise<void> => {
144fb726d48Sopenharmony_ci    let VmTrackerRow = TraceRow.skeleton();
145fb726d48Sopenharmony_ci    VmTrackerRow.rowId = 'VmTrackerRow';
146fb726d48Sopenharmony_ci    VmTrackerRow.rowType = TraceRow.ROW_TYPE_VM_TRACKER;
147fb726d48Sopenharmony_ci    VmTrackerRow.addTemplateTypes('ProcessMemory');
148fb726d48Sopenharmony_ci    VmTrackerRow.addTemplateTypes('Memory');
149fb726d48Sopenharmony_ci    VmTrackerRow.rowParentId = '';
150fb726d48Sopenharmony_ci    VmTrackerRow.style.height = '40px';
151fb726d48Sopenharmony_ci    VmTrackerRow.index = 0;
152fb726d48Sopenharmony_ci    VmTrackerRow.folder = true;
153fb726d48Sopenharmony_ci    VmTrackerRow.name = `VM Tracker (${this.memoryConfig.processName} ${this.memoryConfig.pid})`;
154fb726d48Sopenharmony_ci    VmTrackerRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
155fb726d48Sopenharmony_ci    VmTrackerRow.selectChangeHandler = this.trace.selectChangeHandler;
156fb726d48Sopenharmony_ci    VmTrackerRow.supplierFrame = (): Promise<Array<SnapshotStruct>> =>
157fb726d48Sopenharmony_ci      new Promise<Array<SnapshotStruct>>((resolve) => resolve([]));
158fb726d48Sopenharmony_ci    VmTrackerRow.onThreadHandler = (useCache): void => {
159fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
160fb726d48Sopenharmony_ci      if (VmTrackerRow.currentContext) {
161fb726d48Sopenharmony_ci        context = VmTrackerRow.currentContext;
162fb726d48Sopenharmony_ci      } else {
163fb726d48Sopenharmony_ci        context = VmTrackerRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
164fb726d48Sopenharmony_ci      }
165fb726d48Sopenharmony_ci      VmTrackerRow.canvasSave(context);
166fb726d48Sopenharmony_ci      if (VmTrackerRow.expansion) {
167fb726d48Sopenharmony_ci        // @ts-ignore
168fb726d48Sopenharmony_ci        context?.clearRect(0, 0, VmTrackerRow.frame.width, VmTrackerRow.frame.height);
169fb726d48Sopenharmony_ci      } else {
170fb726d48Sopenharmony_ci        (renders.empty as EmptyRender).renderMainThread(
171fb726d48Sopenharmony_ci          {
172fb726d48Sopenharmony_ci            context: context,
173fb726d48Sopenharmony_ci            useCache: useCache,
174fb726d48Sopenharmony_ci            type: '',
175fb726d48Sopenharmony_ci          },
176fb726d48Sopenharmony_ci          VmTrackerRow
177fb726d48Sopenharmony_ci        );
178fb726d48Sopenharmony_ci      }
179fb726d48Sopenharmony_ci      VmTrackerRow.canvasRestore(context, this.trace);
180fb726d48Sopenharmony_ci    };
181fb726d48Sopenharmony_ci    this.rowFolder = VmTrackerRow;
182fb726d48Sopenharmony_ci    this.trace.rowsEL?.appendChild(VmTrackerRow);
183fb726d48Sopenharmony_ci  };
184fb726d48Sopenharmony_ci
185fb726d48Sopenharmony_ci  private initSMapsFolder = async (): Promise<void> => {
186fb726d48Sopenharmony_ci    let sMapsRow = TraceRow.skeleton<SnapshotStruct>();
187fb726d48Sopenharmony_ci    sMapsRow.rowId = 'smapsRow';
188fb726d48Sopenharmony_ci    sMapsRow.rowParentId = 'VmTrackerRow';
189fb726d48Sopenharmony_ci    sMapsRow.rowHidden = !this.rowFolder.expansion;
190fb726d48Sopenharmony_ci    sMapsRow.rowType = TraceRow.ROW_TYPE_VM_TRACKER_SMAPS;
191fb726d48Sopenharmony_ci    sMapsRow.folder = true;
192fb726d48Sopenharmony_ci    sMapsRow.name = 'Smaps';
193fb726d48Sopenharmony_ci    sMapsRow.folderPaddingLeft = 20;
194fb726d48Sopenharmony_ci    sMapsRow.style.height = '40px';
195fb726d48Sopenharmony_ci    sMapsRow.style.width = '100%';
196fb726d48Sopenharmony_ci    sMapsRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
197fb726d48Sopenharmony_ci    sMapsRow.selectChangeHandler = this.trace.selectChangeHandler;
198fb726d48Sopenharmony_ci    sMapsRow.supplierFrame = (): Promise<Array<SnapshotStruct>> =>
199fb726d48Sopenharmony_ci      new Promise<Array<SnapshotStruct>>((resolve) => resolve([]));
200fb726d48Sopenharmony_ci    sMapsRow.onThreadHandler = (useCache): void => {
201fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
202fb726d48Sopenharmony_ci      if (sMapsRow.currentContext) {
203fb726d48Sopenharmony_ci        context = sMapsRow.currentContext;
204fb726d48Sopenharmony_ci      } else {
205fb726d48Sopenharmony_ci        context = sMapsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
206fb726d48Sopenharmony_ci      }
207fb726d48Sopenharmony_ci      sMapsRow.canvasSave(context);
208fb726d48Sopenharmony_ci      if (sMapsRow.expansion) {
209fb726d48Sopenharmony_ci        // @ts-ignore
210fb726d48Sopenharmony_ci        context?.clearRect(0, 0, sMapsRow.frame.width, sMapsRow.frame.height);
211fb726d48Sopenharmony_ci      } else {
212fb726d48Sopenharmony_ci        (renders.empty as EmptyRender).renderMainThread(
213fb726d48Sopenharmony_ci          {
214fb726d48Sopenharmony_ci            context: context,
215fb726d48Sopenharmony_ci            useCache: useCache,
216fb726d48Sopenharmony_ci            type: '',
217fb726d48Sopenharmony_ci          },
218fb726d48Sopenharmony_ci          sMapsRow
219fb726d48Sopenharmony_ci        );
220fb726d48Sopenharmony_ci      }
221fb726d48Sopenharmony_ci      sMapsRow.canvasRestore(context, this.trace);
222fb726d48Sopenharmony_ci    };
223fb726d48Sopenharmony_ci    this.sMapsFolder = sMapsRow;
224fb726d48Sopenharmony_ci    this.rowFolder?.addChildTraceRow(sMapsRow);
225fb726d48Sopenharmony_ci  };
226fb726d48Sopenharmony_ci
227fb726d48Sopenharmony_ci  private initGpuFolder = async (): Promise<TraceRow<SnapshotStruct>> => {
228fb726d48Sopenharmony_ci    let gpuTraceRow = TraceRow.skeleton<SnapshotStruct>();
229fb726d48Sopenharmony_ci    gpuTraceRow.rowId = 'skiaGpuTraceRow';
230fb726d48Sopenharmony_ci    gpuTraceRow.rowType = TraceRow.ROW_TYPE_SYS_MEMORY_GPU;
231fb726d48Sopenharmony_ci    gpuTraceRow.rowParentId = 'VmTrackerRow';
232fb726d48Sopenharmony_ci    gpuTraceRow.style.height = '40px';
233fb726d48Sopenharmony_ci    gpuTraceRow.folder = true;
234fb726d48Sopenharmony_ci    gpuTraceRow.folderPaddingLeft = 20;
235fb726d48Sopenharmony_ci    gpuTraceRow.rowHidden = !this.rowFolder.expansion;
236fb726d48Sopenharmony_ci    gpuTraceRow.name = 'GPU';
237fb726d48Sopenharmony_ci    gpuTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
238fb726d48Sopenharmony_ci    gpuTraceRow.selectChangeHandler = this.trace.selectChangeHandler;
239fb726d48Sopenharmony_ci    gpuTraceRow.supplierFrame = (): Promise<Array<SnapshotStruct>> =>
240fb726d48Sopenharmony_ci      new Promise<Array<SnapshotStruct>>((resolve) => resolve([]));
241fb726d48Sopenharmony_ci    gpuTraceRow.onThreadHandler = (useCache): void => {
242fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
243fb726d48Sopenharmony_ci      if (gpuTraceRow.currentContext) {
244fb726d48Sopenharmony_ci        context = gpuTraceRow.currentContext;
245fb726d48Sopenharmony_ci      } else {
246fb726d48Sopenharmony_ci        context = gpuTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
247fb726d48Sopenharmony_ci      }
248fb726d48Sopenharmony_ci      gpuTraceRow.canvasSave(context);
249fb726d48Sopenharmony_ci      if (gpuTraceRow.expansion) {
250fb726d48Sopenharmony_ci        // @ts-ignore
251fb726d48Sopenharmony_ci        context?.clearRect(0, 0, gpuTraceRow.frame.width, gpuTraceRow.frame.height);
252fb726d48Sopenharmony_ci      } else {
253fb726d48Sopenharmony_ci        (renders.empty as EmptyRender).renderMainThread(
254fb726d48Sopenharmony_ci          {
255fb726d48Sopenharmony_ci            context: context,
256fb726d48Sopenharmony_ci            useCache: useCache,
257fb726d48Sopenharmony_ci            type: '',
258fb726d48Sopenharmony_ci          },
259fb726d48Sopenharmony_ci          gpuTraceRow
260fb726d48Sopenharmony_ci        );
261fb726d48Sopenharmony_ci      }
262fb726d48Sopenharmony_ci      gpuTraceRow.canvasRestore(context, this.trace);
263fb726d48Sopenharmony_ci    };
264fb726d48Sopenharmony_ci    this.gpuFolder = gpuTraceRow;
265fb726d48Sopenharmony_ci    this.rowFolder.addChildTraceRow(gpuTraceRow);
266fb726d48Sopenharmony_ci    return gpuTraceRow;
267fb726d48Sopenharmony_ci  };
268fb726d48Sopenharmony_ci
269fb726d48Sopenharmony_ci  private getSmapsKeyName(rowName: string): string {
270fb726d48Sopenharmony_ci    let columnName = rowName.toLowerCase();
271fb726d48Sopenharmony_ci    let keyName = '';
272fb726d48Sopenharmony_ci    switch (rowName) {
273fb726d48Sopenharmony_ci      case 'USS':
274fb726d48Sopenharmony_ci        keyName = 'private_clean + private_dirty';
275fb726d48Sopenharmony_ci        break;
276fb726d48Sopenharmony_ci      case 'RSS':
277fb726d48Sopenharmony_ci        keyName = 'resident_size';
278fb726d48Sopenharmony_ci        break;
279fb726d48Sopenharmony_ci      case 'Swapped':
280fb726d48Sopenharmony_ci        keyName = 'swap + swap_pss';
281fb726d48Sopenharmony_ci        break;
282fb726d48Sopenharmony_ci      default:
283fb726d48Sopenharmony_ci        keyName = columnName;
284fb726d48Sopenharmony_ci    }
285fb726d48Sopenharmony_ci    return keyName;
286fb726d48Sopenharmony_ci  }
287fb726d48Sopenharmony_ci
288fb726d48Sopenharmony_ci  private initSmapsRows = async (rowName: string): Promise<void> => {
289fb726d48Sopenharmony_ci    let sMapsTraceRow = this.initTraceRow(rowName, TraceRow.ROW_TYPE_VM_TRACKER_SMAPS, 'smapsRow');
290fb726d48Sopenharmony_ci    sMapsTraceRow.rowHidden = !this.sMapsFolder.expansion;
291fb726d48Sopenharmony_ci    sMapsTraceRow.folderTextLeft = 40;
292fb726d48Sopenharmony_ci    sMapsTraceRow.supplierFrame = (): Promise<Array<SnapshotStruct>> => {
293fb726d48Sopenharmony_ci      //@ts-ignore
294fb726d48Sopenharmony_ci      return sMapsDataSender(this.getSmapsKeyName(rowName), sMapsTraceRow).then((sMaps: unknown[]) => {
295fb726d48Sopenharmony_ci        this.setName(sMaps);
296fb726d48Sopenharmony_ci        return sMaps;
297fb726d48Sopenharmony_ci      });
298fb726d48Sopenharmony_ci    };
299fb726d48Sopenharmony_ci    this.sMapsFolder.addChildTraceRow(sMapsTraceRow);
300fb726d48Sopenharmony_ci  };
301fb726d48Sopenharmony_ci
302fb726d48Sopenharmony_ci  private initShmRows = async (): Promise<void> => {
303fb726d48Sopenharmony_ci    let shmTraceRow = this.initTraceRow('SHM', TraceRow.ROW_TYPE_VMTRACKER_SHM, 'VmTrackerRow');
304fb726d48Sopenharmony_ci    shmTraceRow.supplierFrame = (): Promise<Array<SnapshotStruct>> => {
305fb726d48Sopenharmony_ci      //@ts-ignore
306fb726d48Sopenharmony_ci      return shmDataSender(this.memoryConfig.iPid, shmTraceRow).then((shmData: unknown[]) => {
307fb726d48Sopenharmony_ci        this.setName(shmData);
308fb726d48Sopenharmony_ci        return shmData;
309fb726d48Sopenharmony_ci      });
310fb726d48Sopenharmony_ci    };
311fb726d48Sopenharmony_ci    this.rowFolder.addChildTraceRow(shmTraceRow);
312fb726d48Sopenharmony_ci  };
313fb726d48Sopenharmony_ci
314fb726d48Sopenharmony_ci  private async initPurgeableTotal(): Promise<void> {
315fb726d48Sopenharmony_ci    let totalTraceRow = this.initTraceRow('Purgeable Total', TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM, 'VmTrackerRow');
316fb726d48Sopenharmony_ci    totalTraceRow.supplierFrame = (): Promise<Array<SnapshotStruct>> => {
317fb726d48Sopenharmony_ci      //@ts-ignore
318fb726d48Sopenharmony_ci      return purgeableDataSender(this.memoryConfig.iPid, totalTraceRow, false).then((purgeableTotalData: unknown[]) => {
319fb726d48Sopenharmony_ci        this.setName(purgeableTotalData);
320fb726d48Sopenharmony_ci        return purgeableTotalData;
321fb726d48Sopenharmony_ci      });
322fb726d48Sopenharmony_ci    };
323fb726d48Sopenharmony_ci    this.rowFolder.addChildTraceRow(totalTraceRow);
324fb726d48Sopenharmony_ci  }
325fb726d48Sopenharmony_ci
326fb726d48Sopenharmony_ci  private async initPurgeablePin(): Promise<void> {
327fb726d48Sopenharmony_ci    let pinTraceRow = this.initTraceRow('Purgeable Pin', TraceRow.ROW_TYPE_PURGEABLE_PIN_VM, 'VmTrackerRow');
328fb726d48Sopenharmony_ci    pinTraceRow.supplierFrame = (): Promise<Array<SnapshotStruct>> => {
329fb726d48Sopenharmony_ci      //@ts-ignore
330fb726d48Sopenharmony_ci      return purgeableDataSender(this.memoryConfig.iPid, pinTraceRow, true).then((purgeablePinData: unknown[]) => {
331fb726d48Sopenharmony_ci        this.setName(purgeablePinData);
332fb726d48Sopenharmony_ci        return purgeablePinData;
333fb726d48Sopenharmony_ci      });
334fb726d48Sopenharmony_ci    };
335fb726d48Sopenharmony_ci    this.rowFolder.addChildTraceRow(pinTraceRow);
336fb726d48Sopenharmony_ci  }
337fb726d48Sopenharmony_ci
338fb726d48Sopenharmony_ci  private initPurgeableVM = async (): Promise<void> => {
339fb726d48Sopenharmony_ci    let time = new Date().getTime();
340fb726d48Sopenharmony_ci    const isExistsPurgeableTotal = await queryisExistsPurgeableData(this.memoryConfig.iPid, false);
341fb726d48Sopenharmony_ci    const isExistsPurgeablePin = await queryisExistsPurgeableData(this.memoryConfig.iPid, true); //@ts-ignore
342fb726d48Sopenharmony_ci    if (isExistsPurgeableTotal[0].data_exists) {
343fb726d48Sopenharmony_ci      await this.initPurgeableTotal();
344fb726d48Sopenharmony_ci    } //@ts-ignore
345fb726d48Sopenharmony_ci    if (isExistsPurgeablePin[0].data_exists) {
346fb726d48Sopenharmony_ci      await this.initPurgeablePin();
347fb726d48Sopenharmony_ci    }
348fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - time;
349fb726d48Sopenharmony_ci    info('The time to load the VM Purgeable is: ', durTime);
350fb726d48Sopenharmony_ci  };
351fb726d48Sopenharmony_ci
352fb726d48Sopenharmony_ci  private initDmaRow = async (): Promise<void> => {
353fb726d48Sopenharmony_ci    let dmaTraceRow = this.initTraceRow('DMA', TraceRow.ROW_TYPE_DMA_VMTRACKER, 'VmTrackerRow');
354fb726d48Sopenharmony_ci    dmaTraceRow.supplierFrame = (): Promise<Array<SnapshotStruct>> => {
355fb726d48Sopenharmony_ci      //@ts-ignore
356fb726d48Sopenharmony_ci      return dmaDataSender(this.memoryConfig.iPid, dmaTraceRow).then((dmaData: unknown[]) => {
357fb726d48Sopenharmony_ci        this.setName(dmaData);
358fb726d48Sopenharmony_ci        return dmaData;
359fb726d48Sopenharmony_ci      });
360fb726d48Sopenharmony_ci    };
361fb726d48Sopenharmony_ci    this.rowFolder.addChildTraceRow(dmaTraceRow);
362fb726d48Sopenharmony_ci  };
363fb726d48Sopenharmony_ci
364fb726d48Sopenharmony_ci  private initGpuMemoryRow = async (): Promise<void> => {
365fb726d48Sopenharmony_ci    let gpuMemoryTraceRow = this.initTraceRow(
366fb726d48Sopenharmony_ci      'Skia Gpu Memory',
367fb726d48Sopenharmony_ci      TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER,
368fb726d48Sopenharmony_ci      'skiaGpuTraceRow'
369fb726d48Sopenharmony_ci    );
370fb726d48Sopenharmony_ci    gpuMemoryTraceRow.rowHidden = !this.gpuFolder.expansion;
371fb726d48Sopenharmony_ci    gpuMemoryTraceRow.folderTextLeft = 40;
372fb726d48Sopenharmony_ci    gpuMemoryTraceRow.supplierFrame = (): Promise<Array<SnapshotStruct>> => {
373fb726d48Sopenharmony_ci      //@ts-ignore
374fb726d48Sopenharmony_ci      return gpuMemoryDataSender(this.memoryConfig.iPid, gpuMemoryTraceRow).then((gpuMemoryData: unknown[]) => {
375fb726d48Sopenharmony_ci        this.setName(gpuMemoryData);
376fb726d48Sopenharmony_ci        return gpuMemoryData;
377fb726d48Sopenharmony_ci      });
378fb726d48Sopenharmony_ci    };
379fb726d48Sopenharmony_ci    this.gpuFolder.addChildTraceRow(gpuMemoryTraceRow);
380fb726d48Sopenharmony_ci  };
381fb726d48Sopenharmony_ci
382fb726d48Sopenharmony_ci  private initGpuResourceRow = async (scratchId: number): Promise<void> => {
383fb726d48Sopenharmony_ci    let gpuMemoryTraceRow = this.initTraceRow(
384fb726d48Sopenharmony_ci      'Gpu Resource',
385fb726d48Sopenharmony_ci      TraceRow.ROW_TYPE_GPU_RESOURCE_VMTRACKER,
386fb726d48Sopenharmony_ci      this.gpuFolder.rowId!
387fb726d48Sopenharmony_ci    );
388fb726d48Sopenharmony_ci    gpuMemoryTraceRow.rowHidden = !this.gpuFolder.expansion;
389fb726d48Sopenharmony_ci    gpuMemoryTraceRow.folderTextLeft = 40;
390fb726d48Sopenharmony_ci    gpuMemoryTraceRow.supplierFrame = (): Promise<Array<SnapshotStruct>> => {
391fb726d48Sopenharmony_ci      //@ts-ignore
392fb726d48Sopenharmony_ci      return gpuResourceDataSender(scratchId, gpuMemoryTraceRow).then((gpuResourceData: unknown[]) => {
393fb726d48Sopenharmony_ci        this.setName(gpuResourceData);
394fb726d48Sopenharmony_ci        // 将泳道图数据传递给Native Heap Tab页
395fb726d48Sopenharmony_ci        //@ts-ignore
396fb726d48Sopenharmony_ci        this.smapsRecordTab!.GLESHostCache = gpuResourceData;
397fb726d48Sopenharmony_ci        return gpuResourceData;
398fb726d48Sopenharmony_ci      });
399fb726d48Sopenharmony_ci    };
400fb726d48Sopenharmony_ci    this.gpuFolder.addChildTraceRow(gpuMemoryTraceRow);
401fb726d48Sopenharmony_ci  };
402fb726d48Sopenharmony_ci
403fb726d48Sopenharmony_ci  private async addGpuGraphRow(): Promise<void> {
404fb726d48Sopenharmony_ci    let graphRow = this.initTraceRow('Graph', TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH, this.gpuFolder.rowId!);
405fb726d48Sopenharmony_ci    graphRow.addTemplateTypes('sys-memory');
406fb726d48Sopenharmony_ci    graphRow.folderTextLeft = 40;
407fb726d48Sopenharmony_ci    graphRow.supplierFrame = (): Promise<SnapshotStruct[]> => {
408fb726d48Sopenharmony_ci      //@ts-ignore
409fb726d48Sopenharmony_ci      return gpuGpuDataSender(this.memoryConfig.iPid, "'mem.graph_pss'", graphRow).then((graphData: unknown[]) => {
410fb726d48Sopenharmony_ci        this.setName(graphData);
411fb726d48Sopenharmony_ci        return graphData;
412fb726d48Sopenharmony_ci      });
413fb726d48Sopenharmony_ci    };
414fb726d48Sopenharmony_ci    this.gpuFolder.addChildTraceRow(graphRow);
415fb726d48Sopenharmony_ci  }
416fb726d48Sopenharmony_ci
417fb726d48Sopenharmony_ci  private async addGpuGLRow(): Promise<void> {
418fb726d48Sopenharmony_ci    let glRow = this.initTraceRow('GL', TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL, this.gpuFolder.rowId!);
419fb726d48Sopenharmony_ci    glRow.addTemplateTypes('sys-memory');
420fb726d48Sopenharmony_ci    glRow.folderTextLeft = 40;
421fb726d48Sopenharmony_ci    glRow.supplierFrame = (): Promise<SnapshotStruct[]> => {
422fb726d48Sopenharmony_ci      //@ts-ignore
423fb726d48Sopenharmony_ci      return gpuGpuDataSender(this.memoryConfig.iPid, "'mem.gl_pss'", glRow).then((glData: unknown[]) => {
424fb726d48Sopenharmony_ci        this.setName(glData);
425fb726d48Sopenharmony_ci        return glData;
426fb726d48Sopenharmony_ci      });
427fb726d48Sopenharmony_ci    };
428fb726d48Sopenharmony_ci    this.gpuFolder.addChildTraceRow(glRow);
429fb726d48Sopenharmony_ci  }
430fb726d48Sopenharmony_ci
431fb726d48Sopenharmony_ci  private async addGpuTotalRow(): Promise<void> {
432fb726d48Sopenharmony_ci    let types = await queryGpuTotalType();
433fb726d48Sopenharmony_ci    if (!types || types.length === 0) {
434fb726d48Sopenharmony_ci      return;
435fb726d48Sopenharmony_ci    }
436fb726d48Sopenharmony_ci    let gpuTotalRow = this.initTraceRow(
437fb726d48Sopenharmony_ci      'Skia Gpu Dump Total',
438fb726d48Sopenharmony_ci      TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL,
439fb726d48Sopenharmony_ci      this.gpuFolder.rowId!
440fb726d48Sopenharmony_ci    );
441fb726d48Sopenharmony_ci    gpuTotalRow.folderTextLeft = 40;
442fb726d48Sopenharmony_ci    gpuTotalRow.addTemplateTypes('sys-memory');
443fb726d48Sopenharmony_ci    gpuTotalRow.addRowSettingPop();
444fb726d48Sopenharmony_ci    gpuTotalRow.rowSetting = 'enable';
445fb726d48Sopenharmony_ci    gpuTotalRow.rowSettingList = [
446fb726d48Sopenharmony_ci      {
447fb726d48Sopenharmony_ci        key: 'total',
448fb726d48Sopenharmony_ci        title: 'Total',
449fb726d48Sopenharmony_ci        checked: true,
450fb726d48Sopenharmony_ci      },
451fb726d48Sopenharmony_ci      ...types.map(
452fb726d48Sopenharmony_ci        (
453fb726d48Sopenharmony_ci          it
454fb726d48Sopenharmony_ci        ): {
455fb726d48Sopenharmony_ci          key: string;
456fb726d48Sopenharmony_ci          title: string;
457fb726d48Sopenharmony_ci        } => {
458fb726d48Sopenharmony_ci          return {
459fb726d48Sopenharmony_ci            key: `${it.id}`,
460fb726d48Sopenharmony_ci            title: it.data,
461fb726d48Sopenharmony_ci          };
462fb726d48Sopenharmony_ci        }
463fb726d48Sopenharmony_ci      ),
464fb726d48Sopenharmony_ci    ];
465fb726d48Sopenharmony_ci    this.addHandleEventByGpuTotalRow(gpuTotalRow);
466fb726d48Sopenharmony_ci    this.gpuFolder.addChildTraceRow(gpuTotalRow);
467fb726d48Sopenharmony_ci  }
468fb726d48Sopenharmony_ci
469fb726d48Sopenharmony_ci  private addHandleEventByGpuTotalRow(gpuTotalRow: TraceRow<SnapshotStruct>): void {
470fb726d48Sopenharmony_ci    gpuTotalRow.onRowSettingChangeHandler = (setting): void => {
471fb726d48Sopenharmony_ci      if (setting && setting.length > 0) {
472fb726d48Sopenharmony_ci        gpuTotalRow.dataListCache = [];
473fb726d48Sopenharmony_ci        gpuTotalRow.dataList = [];
474fb726d48Sopenharmony_ci        gpuTotalRow.isComplete = false;
475fb726d48Sopenharmony_ci        VmTrackerChart.gpuTotalModule = setting[0] === 'total' ? null : parseInt(setting[0]);
476fb726d48Sopenharmony_ci        gpuTotalRow.needRefresh = true;
477fb726d48Sopenharmony_ci        gpuTotalRow.drawFrame();
478fb726d48Sopenharmony_ci      }
479fb726d48Sopenharmony_ci    };
480fb726d48Sopenharmony_ci    gpuTotalRow.supplierFrame = (): Promise<Array<SnapshotStruct>> => {
481fb726d48Sopenharmony_ci      //@ts-ignore
482fb726d48Sopenharmony_ci      return gpuTotalDataSender(VmTrackerChart.gpuTotalModule, gpuTotalRow).then((gpuTotalData: unknown[]) => {
483fb726d48Sopenharmony_ci        this.setName(gpuTotalData);
484fb726d48Sopenharmony_ci        return gpuTotalData;
485fb726d48Sopenharmony_ci      });
486fb726d48Sopenharmony_ci    };
487fb726d48Sopenharmony_ci  }
488fb726d48Sopenharmony_ci
489fb726d48Sopenharmony_ci  private async addGpuWindowRow(): Promise<void> {
490fb726d48Sopenharmony_ci    let types = await queryGpuWindowType();
491fb726d48Sopenharmony_ci    if (!types || types.length === 0) {
492fb726d48Sopenharmony_ci      return;
493fb726d48Sopenharmony_ci    }
494fb726d48Sopenharmony_ci    let settings: TreeItemData[] = types
495fb726d48Sopenharmony_ci      .filter((it) => it.pid === null)
496fb726d48Sopenharmony_ci      .map((it) => {
497fb726d48Sopenharmony_ci        return {
498fb726d48Sopenharmony_ci          key: `${it.id}`,
499fb726d48Sopenharmony_ci          title: it.data,
500fb726d48Sopenharmony_ci          children: [],
501fb726d48Sopenharmony_ci        };
502fb726d48Sopenharmony_ci      });
503fb726d48Sopenharmony_ci    settings.forEach((it) => {
504fb726d48Sopenharmony_ci      it.children = types
505fb726d48Sopenharmony_ci        .filter((child) => `${child.pid}` === it.key)
506fb726d48Sopenharmony_ci        .map((item) => {
507fb726d48Sopenharmony_ci          return {
508fb726d48Sopenharmony_ci            key: `${it.key}-${item.id}`,
509fb726d48Sopenharmony_ci            title: item.data,
510fb726d48Sopenharmony_ci          };
511fb726d48Sopenharmony_ci        });
512fb726d48Sopenharmony_ci    });
513fb726d48Sopenharmony_ci    settings[0].checked = true;
514fb726d48Sopenharmony_ci    VmTrackerChart.gpuWindow = parseInt(settings[0].key);
515fb726d48Sopenharmony_ci    VmTrackerChart.gpuWindowModule = null;
516fb726d48Sopenharmony_ci    let gpuWindowRow = this.initTraceRow(
517fb726d48Sopenharmony_ci      'Skia Gpu Dump Window',
518fb726d48Sopenharmony_ci      TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW,
519fb726d48Sopenharmony_ci      this.gpuFolder.rowId!
520fb726d48Sopenharmony_ci    );
521fb726d48Sopenharmony_ci    gpuWindowRow.folderTextLeft = 40;
522fb726d48Sopenharmony_ci    gpuWindowRow.addRowSettingPop();
523fb726d48Sopenharmony_ci    gpuWindowRow.rowSetting = 'enable';
524fb726d48Sopenharmony_ci    gpuWindowRow.rowSettingList = settings;
525fb726d48Sopenharmony_ci    gpuWindowRow.addTemplateTypes('sys-memory');
526fb726d48Sopenharmony_ci    this.addHandleEventByGpuWindowRow(gpuWindowRow);
527fb726d48Sopenharmony_ci    this.gpuFolder.addChildTraceRow(gpuWindowRow);
528fb726d48Sopenharmony_ci  }
529fb726d48Sopenharmony_ci
530fb726d48Sopenharmony_ci  private addHandleEventByGpuWindowRow(gpuWindowRow: TraceRow<SnapshotStruct>): void {
531fb726d48Sopenharmony_ci    gpuWindowRow.onRowSettingChangeHandler = (setting): void => {
532fb726d48Sopenharmony_ci      if (setting && setting.length > 0) {
533fb726d48Sopenharmony_ci        let split = setting[0].split('-');
534fb726d48Sopenharmony_ci        VmTrackerChart.gpuWindow = parseInt(split[0]);
535fb726d48Sopenharmony_ci        VmTrackerChart.gpuWindowModule = split.length > 1 ? parseInt(split[1]) : null;
536fb726d48Sopenharmony_ci        gpuWindowRow.dataListCache = [];
537fb726d48Sopenharmony_ci        gpuWindowRow.dataList = [];
538fb726d48Sopenharmony_ci        gpuWindowRow.isComplete = false;
539fb726d48Sopenharmony_ci        gpuWindowRow.needRefresh = true;
540fb726d48Sopenharmony_ci        gpuWindowRow.drawFrame();
541fb726d48Sopenharmony_ci      }
542fb726d48Sopenharmony_ci    };
543fb726d48Sopenharmony_ci    gpuWindowRow.supplierFrame = (): Promise<SnapshotStruct[]> => {
544fb726d48Sopenharmony_ci      //@ts-ignore
545fb726d48Sopenharmony_ci      return gpuWindowDataSender(VmTrackerChart.gpuWindow!, VmTrackerChart.gpuWindowModule, gpuWindowRow).then(
546fb726d48Sopenharmony_ci        (gpuWindowData: unknown[]) => {
547fb726d48Sopenharmony_ci          this.setName(gpuWindowData);
548fb726d48Sopenharmony_ci          return gpuWindowData;
549fb726d48Sopenharmony_ci        }
550fb726d48Sopenharmony_ci      );
551fb726d48Sopenharmony_ci    };
552fb726d48Sopenharmony_ci  }
553fb726d48Sopenharmony_ci
554fb726d48Sopenharmony_ci  private initTraceRow(rowName: string, type: string, rowParentId: string): TraceRow<SnapshotStruct> {
555fb726d48Sopenharmony_ci    let vmTrackerTraceRow = TraceRow.skeleton<SnapshotStruct>();
556fb726d48Sopenharmony_ci    vmTrackerTraceRow.rowParentId = rowParentId;
557fb726d48Sopenharmony_ci    vmTrackerTraceRow.rowId = rowName;
558fb726d48Sopenharmony_ci    vmTrackerTraceRow.rowType = type;
559fb726d48Sopenharmony_ci    vmTrackerTraceRow.folderTextLeft = 20;
560fb726d48Sopenharmony_ci    vmTrackerTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
561fb726d48Sopenharmony_ci    vmTrackerTraceRow.selectChangeHandler = this.trace.selectChangeHandler;
562fb726d48Sopenharmony_ci    vmTrackerTraceRow.style.height = '40px';
563fb726d48Sopenharmony_ci    vmTrackerTraceRow.style.width = '100%';
564fb726d48Sopenharmony_ci    vmTrackerTraceRow.setAttribute('children', '');
565fb726d48Sopenharmony_ci    vmTrackerTraceRow.name = rowName;
566fb726d48Sopenharmony_ci    vmTrackerTraceRow.focusHandler = (): void => {
567fb726d48Sopenharmony_ci      this.showTip(vmTrackerTraceRow);
568fb726d48Sopenharmony_ci    };
569fb726d48Sopenharmony_ci    vmTrackerTraceRow.findHoverStruct = (): void => {
570fb726d48Sopenharmony_ci      SnapshotStruct.hoverSnapshotStruct = vmTrackerTraceRow.getHoverStruct();
571fb726d48Sopenharmony_ci    };
572fb726d48Sopenharmony_ci    vmTrackerTraceRow.onThreadHandler = (useCache): void => {
573fb726d48Sopenharmony_ci      let context: CanvasRenderingContext2D;
574fb726d48Sopenharmony_ci      if (vmTrackerTraceRow.currentContext) {
575fb726d48Sopenharmony_ci        context = vmTrackerTraceRow.currentContext;
576fb726d48Sopenharmony_ci      } else {
577fb726d48Sopenharmony_ci        context = vmTrackerTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
578fb726d48Sopenharmony_ci      }
579fb726d48Sopenharmony_ci      vmTrackerTraceRow.canvasSave(context);
580fb726d48Sopenharmony_ci      (renders.snapshot as SnapshotRender).renderMainThread(
581fb726d48Sopenharmony_ci        {
582fb726d48Sopenharmony_ci          context: context,
583fb726d48Sopenharmony_ci          useCache: useCache,
584fb726d48Sopenharmony_ci          type: 'snapshot',
585fb726d48Sopenharmony_ci        },
586fb726d48Sopenharmony_ci        vmTrackerTraceRow
587fb726d48Sopenharmony_ci      );
588fb726d48Sopenharmony_ci      vmTrackerTraceRow.canvasRestore(context, this.trace);
589fb726d48Sopenharmony_ci    };
590fb726d48Sopenharmony_ci    return vmTrackerTraceRow;
591fb726d48Sopenharmony_ci  }
592fb726d48Sopenharmony_ci
593fb726d48Sopenharmony_ci  private showTip(traceRow: TraceRow<SnapshotStruct>): void {
594fb726d48Sopenharmony_ci    this.trace?.displayTip(
595fb726d48Sopenharmony_ci      traceRow,
596fb726d48Sopenharmony_ci      SnapshotStruct.hoverSnapshotStruct,
597fb726d48Sopenharmony_ci      `<span>Name: ${SnapshotStruct.hoverSnapshotStruct?.name || ''}</span>
598fb726d48Sopenharmony_ci      <span>Size: ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}</span>`
599fb726d48Sopenharmony_ci    );
600fb726d48Sopenharmony_ci  }
601fb726d48Sopenharmony_ci
602fb726d48Sopenharmony_ci  private setName(data: Array<unknown>): void {
603fb726d48Sopenharmony_ci    if (data.length > 0) {
604fb726d48Sopenharmony_ci      data.forEach((item, index) => {
605fb726d48Sopenharmony_ci        //@ts-ignore
606fb726d48Sopenharmony_ci        item.name = `SnapShot ${index}`;
607fb726d48Sopenharmony_ci      });
608fb726d48Sopenharmony_ci    }
609fb726d48Sopenharmony_ci  }
610fb726d48Sopenharmony_ci}
611