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