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 { info } from '../../../log/Log'; 18fb726d48Sopenharmony_ciimport { TraceRow } from '../trace/base/TraceRow'; 19fb726d48Sopenharmony_ciimport { Utils } from '../trace/base/Utils'; 20fb726d48Sopenharmony_ciimport { type EmptyRender } from '../../database/ui-worker/cpu/ProcedureWorkerCPU'; 21fb726d48Sopenharmony_ciimport { type ProcessStruct } from '../../database/ui-worker/ProcedureWorkerProcess'; 22fb726d48Sopenharmony_ciimport { CpuAbilityMonitorStruct, CpuAbilityRender } from '../../database/ui-worker/ProcedureWorkerCpuAbility'; 23fb726d48Sopenharmony_ciimport { MemoryAbilityMonitorStruct, MemoryAbilityRender } from '../../database/ui-worker/ProcedureWorkerMemoryAbility'; 24fb726d48Sopenharmony_ciimport { DiskAbilityMonitorStruct, DiskIoAbilityRender } from '../../database/ui-worker/ProcedureWorkerDiskIoAbility'; 25fb726d48Sopenharmony_ciimport { 26fb726d48Sopenharmony_ci NetworkAbilityMonitorStruct, 27fb726d48Sopenharmony_ci NetworkAbilityRender, 28fb726d48Sopenharmony_ci} from '../../database/ui-worker/ProcedureWorkerNetworkAbility'; 29fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker'; 30fb726d48Sopenharmony_ciimport { type SnapshotRender, SnapshotStruct } from '../../database/ui-worker/ProcedureWorkerSnapshot'; 31fb726d48Sopenharmony_ciimport { 32fb726d48Sopenharmony_ci abilityBytesInTraceDataSender, 33fb726d48Sopenharmony_ci abilityBytesReadDataSender, 34fb726d48Sopenharmony_ci abilityMemoryUsedDataSender, 35fb726d48Sopenharmony_ci cpuAbilityUserDataSender, 36fb726d48Sopenharmony_ci} from '../../database/data-trafic/AbilityMonitorSender'; 37fb726d48Sopenharmony_ciimport { 38fb726d48Sopenharmony_ci abilityDmaDataSender, 39fb726d48Sopenharmony_ci abilityGpuMemoryDataSender, 40fb726d48Sopenharmony_ci abilityPurgeableDataSender, 41fb726d48Sopenharmony_ci} from '../../database/data-trafic/VmTrackerDataSender'; 42fb726d48Sopenharmony_ciimport { MemoryConfig } from '../../bean/MemoryConfig'; 43fb726d48Sopenharmony_ciimport { queryMemoryMaxData } from '../../database/sql/Memory.sql'; 44fb726d48Sopenharmony_ciimport { queryDiskIoMaxData, queryNetWorkMaxData } from '../../database/sql/SqlLite.sql'; 45fb726d48Sopenharmony_ciimport { queryAbilityExits, queryCPuAbilityMaxData, queryPurgeableSysData } from '../../database/sql/Ability.sql'; 46fb726d48Sopenharmony_ciimport { SpStatisticsHttpUtil } from '../../../statistics/util/SpStatisticsHttpUtil'; 47fb726d48Sopenharmony_ciconst networkNameList: Array<string> = ['Bytes In/Sec', 'Bytes Out/Sec', 'Packets In/Sec', 'Packets Out/Sec']; 48fb726d48Sopenharmony_ciconst memoryNameList: Array<string> = ['MemoryTotal', 'Cached', 'SwapTotal']; 49fb726d48Sopenharmony_ciconst diskIONameList: Array<string> = ['Bytes Read/Sec', 'Bytes Written/Sec', 'Read Ops/Sec', 'Written Ops/Sec']; 50fb726d48Sopenharmony_ciconst key = 'abilityMonitor'; 51fb726d48Sopenharmony_ci 52fb726d48Sopenharmony_ciexport class SpAbilityMonitorChart { 53fb726d48Sopenharmony_ci private trace: SpSystemTrace; 54fb726d48Sopenharmony_ci constructor(trace: SpSystemTrace) { 55fb726d48Sopenharmony_ci this.trace = trace; 56fb726d48Sopenharmony_ci } 57fb726d48Sopenharmony_ci memoryMath = (maxByte: number): string => { 58fb726d48Sopenharmony_ci let maxByteName = ''; 59fb726d48Sopenharmony_ci if (maxByte > 0) { 60fb726d48Sopenharmony_ci maxByteName = Utils.getBinaryKBWithUnit(maxByte); 61fb726d48Sopenharmony_ci } 62fb726d48Sopenharmony_ci return maxByteName; 63fb726d48Sopenharmony_ci }; 64fb726d48Sopenharmony_ci 65fb726d48Sopenharmony_ci diskIOMath = (maxByte: number): string => { 66fb726d48Sopenharmony_ci let maxByteName = ''; 67fb726d48Sopenharmony_ci if (maxByte > 0) { 68fb726d48Sopenharmony_ci maxByteName = `${maxByte}KB/S`; 69fb726d48Sopenharmony_ci } 70fb726d48Sopenharmony_ci return maxByteName; 71fb726d48Sopenharmony_ci }; 72fb726d48Sopenharmony_ci 73fb726d48Sopenharmony_ci networkMath = (maxValue: number): string => { 74fb726d48Sopenharmony_ci let maxByteName = ''; 75fb726d48Sopenharmony_ci if (maxValue > 0) { 76fb726d48Sopenharmony_ci maxByteName = Utils.getBinaryByteWithUnit(maxValue); 77fb726d48Sopenharmony_ci } 78fb726d48Sopenharmony_ci return maxByteName; 79fb726d48Sopenharmony_ci }; 80fb726d48Sopenharmony_ci 81fb726d48Sopenharmony_ci async init(): Promise<void> { 82fb726d48Sopenharmony_ci let time = new Date().getTime(); 83fb726d48Sopenharmony_ci let result = await queryAbilityExits(); 84fb726d48Sopenharmony_ci info('Ability Monitor Exits Tables size is: ', result!.length); 85fb726d48Sopenharmony_ci if (result.length <= 0) { 86fb726d48Sopenharmony_ci return; 87fb726d48Sopenharmony_ci } 88fb726d48Sopenharmony_ci let processRow = this.initAbilityRow(); 89fb726d48Sopenharmony_ci if (this.hasTable(result, 'trace_cpu_usage')) { 90fb726d48Sopenharmony_ci await this.initCpuAbility(processRow); 91fb726d48Sopenharmony_ci } 92fb726d48Sopenharmony_ci if (this.hasTable(result, 'sys_memory')) { 93fb726d48Sopenharmony_ci await this.initMemoryAbility(processRow); 94fb726d48Sopenharmony_ci } 95fb726d48Sopenharmony_ci if (this.hasTable(result, 'trace_diskio')) { 96fb726d48Sopenharmony_ci await this.initDiskAbility(processRow); 97fb726d48Sopenharmony_ci // 统计diskio插件 98fb726d48Sopenharmony_ci let requestBody = { 99fb726d48Sopenharmony_ci eventData: { 100fb726d48Sopenharmony_ci plugin: ['diskio-plugin'] 101fb726d48Sopenharmony_ci } 102fb726d48Sopenharmony_ci }; 103fb726d48Sopenharmony_ci SpStatisticsHttpUtil.recordPluginUsage(requestBody); 104fb726d48Sopenharmony_ci } 105fb726d48Sopenharmony_ci if (this.hasTable(result, 'trace_network')) { 106fb726d48Sopenharmony_ci await this.initNetworkAbility(processRow); 107fb726d48Sopenharmony_ci } 108fb726d48Sopenharmony_ci // 初始化PurgeableToTal和PurgeablePin泳道图 109fb726d48Sopenharmony_ci let totalDataList = await queryPurgeableSysData(false); 110fb726d48Sopenharmony_ci let pinDataList = await queryPurgeableSysData(true); 111fb726d48Sopenharmony_ci if (totalDataList.length > 0) { 112fb726d48Sopenharmony_ci await this.initPurgeableTotal(processRow); 113fb726d48Sopenharmony_ci } 114fb726d48Sopenharmony_ci if (pinDataList.length > 0) { 115fb726d48Sopenharmony_ci await this.initPurgeablePin(processRow); 116fb726d48Sopenharmony_ci } 117fb726d48Sopenharmony_ci await this.initDmaAbility(processRow); 118fb726d48Sopenharmony_ci await this.initGpuMemoryAbility(processRow); 119fb726d48Sopenharmony_ci let durTime = new Date().getTime() - time; 120fb726d48Sopenharmony_ci info('The time to load the AbilityMonitor data is: ', durTime); 121fb726d48Sopenharmony_ci } 122fb726d48Sopenharmony_ci 123fb726d48Sopenharmony_ci private hasTable(result: Array<unknown>, tableName: string): boolean { 124fb726d48Sopenharmony_ci // @ts-ignore 125fb726d48Sopenharmony_ci return result.find((o) => { 126fb726d48Sopenharmony_ci // @ts-ignore 127fb726d48Sopenharmony_ci return o.event_name === tableName; 128fb726d48Sopenharmony_ci }); 129fb726d48Sopenharmony_ci } 130fb726d48Sopenharmony_ci 131fb726d48Sopenharmony_ci private initAbilityRow = (): TraceRow<ProcessStruct> => { 132fb726d48Sopenharmony_ci let abilityRow = TraceRow.skeleton<ProcessStruct>(); 133fb726d48Sopenharmony_ci abilityRow.rowId = key; 134fb726d48Sopenharmony_ci abilityRow.rowType = TraceRow.ROW_TYPE_MONITOR; 135fb726d48Sopenharmony_ci abilityRow.style.height = '40px'; 136fb726d48Sopenharmony_ci abilityRow.rowParentId = ''; 137fb726d48Sopenharmony_ci abilityRow.folder = true; 138fb726d48Sopenharmony_ci abilityRow.name = 'Ability Monitor'; 139fb726d48Sopenharmony_ci abilityRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 140fb726d48Sopenharmony_ci abilityRow.selectChangeHandler = this.trace.selectChangeHandler; // @ts-ignore 141fb726d48Sopenharmony_ci abilityRow.supplier = (): Promise<unknown[]> => new Promise<Array<unknown>>((resolve) => resolve([])); 142fb726d48Sopenharmony_ci abilityRow.onThreadHandler = (useCache): void => { 143fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 144fb726d48Sopenharmony_ci if (abilityRow.currentContext) { 145fb726d48Sopenharmony_ci context = abilityRow.currentContext; 146fb726d48Sopenharmony_ci } else { 147fb726d48Sopenharmony_ci context = abilityRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 148fb726d48Sopenharmony_ci } 149fb726d48Sopenharmony_ci abilityRow.canvasSave(context); 150fb726d48Sopenharmony_ci if (abilityRow.expansion) { 151fb726d48Sopenharmony_ci // @ts-ignore 152fb726d48Sopenharmony_ci context?.clearRect(0, 0, abilityRow.frame.width, abilityRow.frame.height); 153fb726d48Sopenharmony_ci } else { 154fb726d48Sopenharmony_ci (renders.empty as EmptyRender).renderMainThread( 155fb726d48Sopenharmony_ci { 156fb726d48Sopenharmony_ci context: context, 157fb726d48Sopenharmony_ci useCache: useCache, 158fb726d48Sopenharmony_ci type: '', 159fb726d48Sopenharmony_ci }, 160fb726d48Sopenharmony_ci abilityRow 161fb726d48Sopenharmony_ci ); 162fb726d48Sopenharmony_ci } 163fb726d48Sopenharmony_ci abilityRow.canvasRestore(context, this.trace); 164fb726d48Sopenharmony_ci }; 165fb726d48Sopenharmony_ci this.trace.rowsEL?.appendChild(abilityRow); 166fb726d48Sopenharmony_ci return abilityRow; 167fb726d48Sopenharmony_ci }; 168fb726d48Sopenharmony_ci 169fb726d48Sopenharmony_ci private initCpuAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => { 170fb726d48Sopenharmony_ci let time = new Date().getTime(); 171fb726d48Sopenharmony_ci let cpuMaxData = await queryCPuAbilityMaxData(); 172fb726d48Sopenharmony_ci let hasTotal = false; 173fb726d48Sopenharmony_ci let hasUserLoad = false; 174fb726d48Sopenharmony_ci let hasSystemLoad = false; 175fb726d48Sopenharmony_ci //@ts-ignore 176fb726d48Sopenharmony_ci let userLoad = cpuMaxData[0].userLoad; 177fb726d48Sopenharmony_ci if (userLoad > 0) { 178fb726d48Sopenharmony_ci hasUserLoad = true; 179fb726d48Sopenharmony_ci } //@ts-ignore 180fb726d48Sopenharmony_ci let systemLoad = cpuMaxData[0].systemLoad; 181fb726d48Sopenharmony_ci if (systemLoad > 0) { 182fb726d48Sopenharmony_ci hasSystemLoad = true; 183fb726d48Sopenharmony_ci } //@ts-ignore 184fb726d48Sopenharmony_ci let totalLoad = cpuMaxData[0].totalLoad; 185fb726d48Sopenharmony_ci if (totalLoad > 0) { 186fb726d48Sopenharmony_ci hasTotal = true; 187fb726d48Sopenharmony_ci } 188fb726d48Sopenharmony_ci let cpuNameList: Array<string> = ['Total', 'User', 'System']; 189fb726d48Sopenharmony_ci this.initTotalMonitorTraceRow(processRow, cpuNameList, hasTotal); 190fb726d48Sopenharmony_ci this.initUserMonitorTraceRow(processRow, cpuNameList, hasUserLoad); 191fb726d48Sopenharmony_ci this.initSysMonitorTraceRow(processRow, cpuNameList, hasSystemLoad); 192fb726d48Sopenharmony_ci let durTime = new Date().getTime() - time; 193fb726d48Sopenharmony_ci info('The time to load the Ability Cpu is: ', durTime); 194fb726d48Sopenharmony_ci }; 195fb726d48Sopenharmony_ci 196fb726d48Sopenharmony_ci private initUserMonitorTraceRow(processRow: TraceRow<ProcessStruct>, cpuList: Array<string>, load: boolean): void { 197fb726d48Sopenharmony_ci let userTraceRow = TraceRow.skeleton<CpuAbilityMonitorStruct>(); 198fb726d48Sopenharmony_ci userTraceRow.rowParentId = key; 199fb726d48Sopenharmony_ci userTraceRow.rowHidden = !processRow.expansion; 200fb726d48Sopenharmony_ci userTraceRow.rowId = cpuList[1]; 201fb726d48Sopenharmony_ci userTraceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY; 202fb726d48Sopenharmony_ci userTraceRow.style.height = '40px'; 203fb726d48Sopenharmony_ci userTraceRow.style.width = '100%'; 204fb726d48Sopenharmony_ci userTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 205fb726d48Sopenharmony_ci userTraceRow.selectChangeHandler = this.trace.selectChangeHandler; 206fb726d48Sopenharmony_ci userTraceRow.setAttribute('children', ''); 207fb726d48Sopenharmony_ci userTraceRow.name = `CPU ${cpuList[1]} Load`; 208fb726d48Sopenharmony_ci userTraceRow.supplierFrame = (): Promise<CpuAbilityMonitorStruct[]> => 209fb726d48Sopenharmony_ci cpuAbilityUserDataSender(userTraceRow, 'CpuAbilityUserData').then((res): CpuAbilityMonitorStruct[] => { 210fb726d48Sopenharmony_ci this.computeDur(res); 211fb726d48Sopenharmony_ci return res; 212fb726d48Sopenharmony_ci }); 213fb726d48Sopenharmony_ci userTraceRow.focusHandler = (ev): void => { 214fb726d48Sopenharmony_ci let monitorCpuTip = `${(CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2)}%`; 215fb726d48Sopenharmony_ci this.trace?.displayTip( 216fb726d48Sopenharmony_ci userTraceRow, 217fb726d48Sopenharmony_ci CpuAbilityMonitorStruct.hoverCpuAbilityStruct, 218fb726d48Sopenharmony_ci `<span>${monitorCpuTip}</span>` 219fb726d48Sopenharmony_ci ); 220fb726d48Sopenharmony_ci }; 221fb726d48Sopenharmony_ci userTraceRow.findHoverStruct = (): void => { 222fb726d48Sopenharmony_ci CpuAbilityMonitorStruct.hoverCpuAbilityStruct = userTraceRow.getHoverStruct(); 223fb726d48Sopenharmony_ci }; 224fb726d48Sopenharmony_ci userTraceRow.onThreadHandler = (useCache): void => { 225fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 226fb726d48Sopenharmony_ci if (userTraceRow.currentContext) { 227fb726d48Sopenharmony_ci context = userTraceRow.currentContext; 228fb726d48Sopenharmony_ci } else { 229fb726d48Sopenharmony_ci context = userTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 230fb726d48Sopenharmony_ci } 231fb726d48Sopenharmony_ci userTraceRow.canvasSave(context); 232fb726d48Sopenharmony_ci (renders.monitorCpu as CpuAbilityRender).renderMainThread( 233fb726d48Sopenharmony_ci { 234fb726d48Sopenharmony_ci context: context, 235fb726d48Sopenharmony_ci useCache: useCache, 236fb726d48Sopenharmony_ci type: 'monitorCpu1', 237fb726d48Sopenharmony_ci maxCpuUtilization: 100, 238fb726d48Sopenharmony_ci maxCpuUtilizationName: load ? '100%' : '0%', 239fb726d48Sopenharmony_ci }, 240fb726d48Sopenharmony_ci userTraceRow 241fb726d48Sopenharmony_ci ); 242fb726d48Sopenharmony_ci userTraceRow.canvasRestore(context, this.trace); 243fb726d48Sopenharmony_ci }; 244fb726d48Sopenharmony_ci processRow.addChildTraceRow(userTraceRow); 245fb726d48Sopenharmony_ci } 246fb726d48Sopenharmony_ci 247fb726d48Sopenharmony_ci private initTotalMonitorTraceRow(parent: TraceRow<ProcessStruct>, cpuList: Array<string>, hasTotal: boolean): void { 248fb726d48Sopenharmony_ci let traceRow = TraceRow.skeleton<CpuAbilityMonitorStruct>(); 249fb726d48Sopenharmony_ci traceRow.rowParentId = key; 250fb726d48Sopenharmony_ci traceRow.rowHidden = !parent.expansion; 251fb726d48Sopenharmony_ci traceRow.rowId = cpuList[0]; 252fb726d48Sopenharmony_ci traceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY; 253fb726d48Sopenharmony_ci traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 254fb726d48Sopenharmony_ci traceRow.selectChangeHandler = this.trace.selectChangeHandler; 255fb726d48Sopenharmony_ci traceRow.style.height = '40px'; 256fb726d48Sopenharmony_ci traceRow.style.width = '100%'; 257fb726d48Sopenharmony_ci traceRow.setAttribute('children', ''); 258fb726d48Sopenharmony_ci traceRow.name = `CPU ${cpuList[0]} Load`; 259fb726d48Sopenharmony_ci traceRow.supplierFrame = (): Promise<CpuAbilityMonitorStruct[]> => 260fb726d48Sopenharmony_ci cpuAbilityUserDataSender(traceRow, 'CpuAbilityMonitorData').then((res): CpuAbilityMonitorStruct[] => { 261fb726d48Sopenharmony_ci this.computeDur(res); 262fb726d48Sopenharmony_ci return res; 263fb726d48Sopenharmony_ci }); 264fb726d48Sopenharmony_ci traceRow.focusHandler = (ev): void => { 265fb726d48Sopenharmony_ci let monitorCpuTip = `${(CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2)}'%'`; 266fb726d48Sopenharmony_ci this.trace?.displayTip(traceRow, CpuAbilityMonitorStruct.hoverCpuAbilityStruct, `<span>${monitorCpuTip}</span>`); 267fb726d48Sopenharmony_ci }; 268fb726d48Sopenharmony_ci traceRow.findHoverStruct = (): void => { 269fb726d48Sopenharmony_ci CpuAbilityMonitorStruct.hoverCpuAbilityStruct = traceRow.getHoverStruct(); 270fb726d48Sopenharmony_ci }; 271fb726d48Sopenharmony_ci traceRow.onThreadHandler = (useCache): void => { 272fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 273fb726d48Sopenharmony_ci if (traceRow.currentContext) { 274fb726d48Sopenharmony_ci context = traceRow.currentContext; 275fb726d48Sopenharmony_ci } else { 276fb726d48Sopenharmony_ci context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 277fb726d48Sopenharmony_ci } 278fb726d48Sopenharmony_ci traceRow.canvasSave(context); 279fb726d48Sopenharmony_ci (renders.monitorCpu as CpuAbilityRender).renderMainThread( 280fb726d48Sopenharmony_ci { 281fb726d48Sopenharmony_ci context: context, 282fb726d48Sopenharmony_ci useCache: useCache, 283fb726d48Sopenharmony_ci type: 'monitorCpu0', 284fb726d48Sopenharmony_ci maxCpuUtilization: 100, 285fb726d48Sopenharmony_ci maxCpuUtilizationName: hasTotal ? '100%' : '0%', 286fb726d48Sopenharmony_ci }, 287fb726d48Sopenharmony_ci traceRow 288fb726d48Sopenharmony_ci ); 289fb726d48Sopenharmony_ci traceRow.canvasRestore(context, this.trace); 290fb726d48Sopenharmony_ci }; 291fb726d48Sopenharmony_ci parent.addChildTraceRow(traceRow); 292fb726d48Sopenharmony_ci } 293fb726d48Sopenharmony_ci 294fb726d48Sopenharmony_ci private initSysMonitorTraceRow(parent: TraceRow<ProcessStruct>, cpuList: Array<string>, hasLoad: boolean): void { 295fb726d48Sopenharmony_ci let sysTraceRow = TraceRow.skeleton<CpuAbilityMonitorStruct>(); 296fb726d48Sopenharmony_ci sysTraceRow.rowParentId = key; 297fb726d48Sopenharmony_ci sysTraceRow.rowHidden = !parent.expansion; 298fb726d48Sopenharmony_ci sysTraceRow.rowId = cpuList[2]; 299fb726d48Sopenharmony_ci sysTraceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY; 300fb726d48Sopenharmony_ci sysTraceRow.style.height = '40px'; 301fb726d48Sopenharmony_ci sysTraceRow.style.width = '100%'; 302fb726d48Sopenharmony_ci sysTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 303fb726d48Sopenharmony_ci sysTraceRow.selectChangeHandler = this.trace.selectChangeHandler; 304fb726d48Sopenharmony_ci sysTraceRow.setAttribute('children', ''); 305fb726d48Sopenharmony_ci sysTraceRow.name = `CPU ${cpuList[2]} Load`; 306fb726d48Sopenharmony_ci sysTraceRow.supplierFrame = (): Promise<CpuAbilityMonitorStruct[]> => 307fb726d48Sopenharmony_ci cpuAbilityUserDataSender(sysTraceRow, 'CpuAbilitySystemData').then((res): CpuAbilityMonitorStruct[] => { 308fb726d48Sopenharmony_ci this.computeDur(res); 309fb726d48Sopenharmony_ci return res; 310fb726d48Sopenharmony_ci }); 311fb726d48Sopenharmony_ci sysTraceRow.focusHandler = (): void => { 312fb726d48Sopenharmony_ci this.trace?.displayTip( 313fb726d48Sopenharmony_ci sysTraceRow, 314fb726d48Sopenharmony_ci CpuAbilityMonitorStruct.hoverCpuAbilityStruct, 315fb726d48Sopenharmony_ci `<span>${(CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2)}%</span>` 316fb726d48Sopenharmony_ci ); 317fb726d48Sopenharmony_ci }; 318fb726d48Sopenharmony_ci sysTraceRow.findHoverStruct = (): void => { 319fb726d48Sopenharmony_ci CpuAbilityMonitorStruct.hoverCpuAbilityStruct = sysTraceRow.getHoverStruct(); 320fb726d48Sopenharmony_ci }; 321fb726d48Sopenharmony_ci sysTraceRow.onThreadHandler = (useCache): void => { 322fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 323fb726d48Sopenharmony_ci if (sysTraceRow.currentContext) { 324fb726d48Sopenharmony_ci context = sysTraceRow.currentContext; 325fb726d48Sopenharmony_ci } else { 326fb726d48Sopenharmony_ci context = sysTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 327fb726d48Sopenharmony_ci } 328fb726d48Sopenharmony_ci sysTraceRow.canvasSave(context); 329fb726d48Sopenharmony_ci (renders.monitorCpu as CpuAbilityRender).renderMainThread( 330fb726d48Sopenharmony_ci { 331fb726d48Sopenharmony_ci context: context, 332fb726d48Sopenharmony_ci useCache: useCache, 333fb726d48Sopenharmony_ci type: 'monitorCpu2', 334fb726d48Sopenharmony_ci maxCpuUtilization: 100, 335fb726d48Sopenharmony_ci maxCpuUtilizationName: hasLoad ? '100%' : '0%', 336fb726d48Sopenharmony_ci }, 337fb726d48Sopenharmony_ci sysTraceRow 338fb726d48Sopenharmony_ci ); 339fb726d48Sopenharmony_ci sysTraceRow.canvasRestore(context, this.trace); 340fb726d48Sopenharmony_ci }; 341fb726d48Sopenharmony_ci parent.addChildTraceRow(sysTraceRow); 342fb726d48Sopenharmony_ci } 343fb726d48Sopenharmony_ci 344fb726d48Sopenharmony_ci private memoryUsedThreadHandle(memoryUsedRow: TraceRow<MemoryAbilityMonitorStruct>, memoryTotal: unknown[]): void { 345fb726d48Sopenharmony_ci // @ts-ignore 346fb726d48Sopenharmony_ci let memoryTotalValue = memoryTotal[0].maxValue; 347fb726d48Sopenharmony_ci let memoryTotalValueName = this.memoryMath(memoryTotalValue); 348fb726d48Sopenharmony_ci memoryUsedRow.onThreadHandler = (useCache): void => { 349fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 350fb726d48Sopenharmony_ci if (memoryUsedRow.currentContext) { 351fb726d48Sopenharmony_ci context = memoryUsedRow.currentContext; 352fb726d48Sopenharmony_ci } else { 353fb726d48Sopenharmony_ci context = memoryUsedRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 354fb726d48Sopenharmony_ci } 355fb726d48Sopenharmony_ci memoryUsedRow.canvasSave(context); 356fb726d48Sopenharmony_ci (renders.monitorMemory as MemoryAbilityRender).renderMainThread( 357fb726d48Sopenharmony_ci { 358fb726d48Sopenharmony_ci context: context, 359fb726d48Sopenharmony_ci useCache: useCache, 360fb726d48Sopenharmony_ci type: 'monitorMemory0', 361fb726d48Sopenharmony_ci maxMemoryByte: memoryTotalValue, 362fb726d48Sopenharmony_ci maxMemoryByteName: memoryTotalValueName, 363fb726d48Sopenharmony_ci }, 364fb726d48Sopenharmony_ci memoryUsedRow 365fb726d48Sopenharmony_ci ); 366fb726d48Sopenharmony_ci memoryUsedRow.canvasRestore(context, this.trace); 367fb726d48Sopenharmony_ci }; 368fb726d48Sopenharmony_ci } 369fb726d48Sopenharmony_ci 370fb726d48Sopenharmony_ci private async initMemoryUsedRow( 371fb726d48Sopenharmony_ci memoryUsedRow: TraceRow<MemoryAbilityMonitorStruct>, // @ts-ignore 372fb726d48Sopenharmony_ci parent: TraceRow<unknown> 373fb726d48Sopenharmony_ci ): Promise<void> { 374fb726d48Sopenharmony_ci let memoryTotal = await queryMemoryMaxData('sys.mem.total'); 375fb726d48Sopenharmony_ci //@ts-ignore 376fb726d48Sopenharmony_ci let memoryTotalId = memoryTotal[0].filter_id; 377fb726d48Sopenharmony_ci 378fb726d48Sopenharmony_ci memoryUsedRow.rowParentId = key; 379fb726d48Sopenharmony_ci memoryUsedRow.rowHidden = !parent.expansion; 380fb726d48Sopenharmony_ci memoryUsedRow.rowId = memoryNameList[0]; 381fb726d48Sopenharmony_ci memoryUsedRow.rowType = TraceRow.ROW_TYPE_MEMORY_ABILITY; 382fb726d48Sopenharmony_ci memoryUsedRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 383fb726d48Sopenharmony_ci memoryUsedRow.selectChangeHandler = this.trace.selectChangeHandler; 384fb726d48Sopenharmony_ci memoryUsedRow.style.height = '40px'; 385fb726d48Sopenharmony_ci memoryUsedRow.style.width = '100%'; 386fb726d48Sopenharmony_ci memoryUsedRow.setAttribute('children', ''); 387fb726d48Sopenharmony_ci memoryUsedRow.name = memoryNameList[0]; 388fb726d48Sopenharmony_ci memoryUsedRow.supplierFrame = (): Promise<MemoryAbilityMonitorStruct[]> => { 389fb726d48Sopenharmony_ci return abilityMemoryUsedDataSender(memoryTotalId, memoryUsedRow).then((res): MemoryAbilityMonitorStruct[] => { 390fb726d48Sopenharmony_ci this.computeDur(res); 391fb726d48Sopenharmony_ci return res; 392fb726d48Sopenharmony_ci }); 393fb726d48Sopenharmony_ci }; 394fb726d48Sopenharmony_ci memoryUsedRow.focusHandler = (ev): void => { 395fb726d48Sopenharmony_ci this.trace?.displayTip( 396fb726d48Sopenharmony_ci memoryUsedRow, 397fb726d48Sopenharmony_ci MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct, 398fb726d48Sopenharmony_ci `<span>${Utils.getBinaryKBWithUnit(MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.value || 0)}</span>` 399fb726d48Sopenharmony_ci ); 400fb726d48Sopenharmony_ci }; 401fb726d48Sopenharmony_ci memoryUsedRow.findHoverStruct = (): void => { 402fb726d48Sopenharmony_ci MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = memoryUsedRow.getHoverStruct(); 403fb726d48Sopenharmony_ci }; 404fb726d48Sopenharmony_ci this.memoryUsedThreadHandle(memoryUsedRow, memoryTotal); 405fb726d48Sopenharmony_ci } 406fb726d48Sopenharmony_ci 407fb726d48Sopenharmony_ci private cachedThreadHandler(cachedFilesTraceRow: TraceRow<MemoryAbilityMonitorStruct>, cached: unknown[]): void { 408fb726d48Sopenharmony_ci // @ts-ignore 409fb726d48Sopenharmony_ci let cachedValue = cached[0].maxValue; 410fb726d48Sopenharmony_ci let cachedValueName = this.memoryMath(cachedValue); 411fb726d48Sopenharmony_ci cachedFilesTraceRow.onThreadHandler = (useCache): void => { 412fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 413fb726d48Sopenharmony_ci if (cachedFilesTraceRow.currentContext) { 414fb726d48Sopenharmony_ci context = cachedFilesTraceRow.currentContext; 415fb726d48Sopenharmony_ci } else { 416fb726d48Sopenharmony_ci context = cachedFilesTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 417fb726d48Sopenharmony_ci } 418fb726d48Sopenharmony_ci cachedFilesTraceRow.canvasSave(context); 419fb726d48Sopenharmony_ci (renders.monitorMemory as MemoryAbilityRender).renderMainThread( 420fb726d48Sopenharmony_ci { 421fb726d48Sopenharmony_ci context: context, 422fb726d48Sopenharmony_ci useCache: useCache, 423fb726d48Sopenharmony_ci type: 'monitorMemory1', 424fb726d48Sopenharmony_ci maxMemoryByte: cachedValue, 425fb726d48Sopenharmony_ci maxMemoryByteName: cachedValueName, 426fb726d48Sopenharmony_ci }, 427fb726d48Sopenharmony_ci cachedFilesTraceRow 428fb726d48Sopenharmony_ci ); 429fb726d48Sopenharmony_ci cachedFilesTraceRow.canvasRestore(context, this.trace); 430fb726d48Sopenharmony_ci }; 431fb726d48Sopenharmony_ci } 432fb726d48Sopenharmony_ci 433fb726d48Sopenharmony_ci private async initCachedRow( 434fb726d48Sopenharmony_ci cachedFilesRow: TraceRow<MemoryAbilityMonitorStruct>, // @ts-ignore 435fb726d48Sopenharmony_ci parent: TraceRow<unknown> 436fb726d48Sopenharmony_ci ): Promise<void> { 437fb726d48Sopenharmony_ci let cached = await queryMemoryMaxData('sys.mem.cached'); 438fb726d48Sopenharmony_ci 439fb726d48Sopenharmony_ci //@ts-ignore 440fb726d48Sopenharmony_ci let cachedId = cached[0].filter_id; 441fb726d48Sopenharmony_ci cachedFilesRow.rowParentId = key; 442fb726d48Sopenharmony_ci cachedFilesRow.rowHidden = !parent.expansion; 443fb726d48Sopenharmony_ci cachedFilesRow.rowId = memoryNameList[1]; 444fb726d48Sopenharmony_ci cachedFilesRow.rowType = TraceRow.ROW_TYPE_MEMORY_ABILITY; 445fb726d48Sopenharmony_ci cachedFilesRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 446fb726d48Sopenharmony_ci cachedFilesRow.selectChangeHandler = this.trace.selectChangeHandler; 447fb726d48Sopenharmony_ci cachedFilesRow.style.height = '40px'; 448fb726d48Sopenharmony_ci cachedFilesRow.style.width = '100%'; 449fb726d48Sopenharmony_ci cachedFilesRow.setAttribute('children', ''); 450fb726d48Sopenharmony_ci cachedFilesRow.name = memoryNameList[1]; 451fb726d48Sopenharmony_ci cachedFilesRow.supplierFrame = (): Promise<MemoryAbilityMonitorStruct[]> => 452fb726d48Sopenharmony_ci abilityMemoryUsedDataSender(cachedId, cachedFilesRow).then((res): MemoryAbilityMonitorStruct[] => { 453fb726d48Sopenharmony_ci this.computeDur(res); 454fb726d48Sopenharmony_ci return res; 455fb726d48Sopenharmony_ci }); 456fb726d48Sopenharmony_ci cachedFilesRow.focusHandler = (ev): void => { 457fb726d48Sopenharmony_ci this.trace?.displayTip( 458fb726d48Sopenharmony_ci cachedFilesRow, 459fb726d48Sopenharmony_ci MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct, 460fb726d48Sopenharmony_ci `<span>${Utils.getBinaryKBWithUnit(MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.value || 0)}</span>` 461fb726d48Sopenharmony_ci ); 462fb726d48Sopenharmony_ci }; 463fb726d48Sopenharmony_ci cachedFilesRow.findHoverStruct = (): void => { 464fb726d48Sopenharmony_ci MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = cachedFilesRow.getHoverStruct(); 465fb726d48Sopenharmony_ci }; 466fb726d48Sopenharmony_ci this.cachedThreadHandler(cachedFilesRow, cached); 467fb726d48Sopenharmony_ci } 468fb726d48Sopenharmony_ci 469fb726d48Sopenharmony_ci private compressThreadHandler(compressedRow: TraceRow<MemoryAbilityMonitorStruct>, swap: unknown[]): void { 470fb726d48Sopenharmony_ci // @ts-ignore 471fb726d48Sopenharmony_ci let swapValue = swap[0].maxValue; 472fb726d48Sopenharmony_ci let swapValueName = this.memoryMath(swapValue); 473fb726d48Sopenharmony_ci compressedRow.onThreadHandler = (useCache): void => { 474fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 475fb726d48Sopenharmony_ci if (compressedRow.currentContext) { 476fb726d48Sopenharmony_ci context = compressedRow.currentContext; 477fb726d48Sopenharmony_ci } else { 478fb726d48Sopenharmony_ci context = compressedRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 479fb726d48Sopenharmony_ci } 480fb726d48Sopenharmony_ci compressedRow.canvasSave(context); 481fb726d48Sopenharmony_ci (renders.monitorMemory as MemoryAbilityRender).renderMainThread( 482fb726d48Sopenharmony_ci { 483fb726d48Sopenharmony_ci context: context, 484fb726d48Sopenharmony_ci useCache: useCache, 485fb726d48Sopenharmony_ci type: 'monitorMemory2', 486fb726d48Sopenharmony_ci maxMemoryByte: swapValue, 487fb726d48Sopenharmony_ci maxMemoryByteName: swapValueName, 488fb726d48Sopenharmony_ci }, 489fb726d48Sopenharmony_ci compressedRow 490fb726d48Sopenharmony_ci ); 491fb726d48Sopenharmony_ci compressedRow.canvasRestore(context, this.trace); 492fb726d48Sopenharmony_ci }; 493fb726d48Sopenharmony_ci } 494fb726d48Sopenharmony_ci 495fb726d48Sopenharmony_ci private async initCompressedRow( 496fb726d48Sopenharmony_ci compressedRow: TraceRow<MemoryAbilityMonitorStruct>, // @ts-ignore 497fb726d48Sopenharmony_ci parent: TraceRow<unknown> 498fb726d48Sopenharmony_ci ): Promise<void> { 499fb726d48Sopenharmony_ci let swap = await queryMemoryMaxData('sys.mem.swap.total'); 500fb726d48Sopenharmony_ci //@ts-ignore 501fb726d48Sopenharmony_ci let swapId = swap[0].filter_id; 502fb726d48Sopenharmony_ci compressedRow.rowParentId = key; 503fb726d48Sopenharmony_ci compressedRow.rowHidden = !parent.expansion; 504fb726d48Sopenharmony_ci compressedRow.rowId = memoryNameList[2]; 505fb726d48Sopenharmony_ci compressedRow.rowType = TraceRow.ROW_TYPE_MEMORY_ABILITY; 506fb726d48Sopenharmony_ci compressedRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 507fb726d48Sopenharmony_ci compressedRow.selectChangeHandler = this.trace.selectChangeHandler; 508fb726d48Sopenharmony_ci compressedRow.style.height = '40px'; 509fb726d48Sopenharmony_ci compressedRow.style.width = '100%'; 510fb726d48Sopenharmony_ci compressedRow.setAttribute('children', ''); 511fb726d48Sopenharmony_ci compressedRow.name = memoryNameList[2]; 512fb726d48Sopenharmony_ci compressedRow.supplierFrame = (): Promise<MemoryAbilityMonitorStruct[]> => 513fb726d48Sopenharmony_ci abilityMemoryUsedDataSender(swapId, compressedRow).then((res): MemoryAbilityMonitorStruct[] => { 514fb726d48Sopenharmony_ci this.computeDur(res); 515fb726d48Sopenharmony_ci return res; 516fb726d48Sopenharmony_ci }); 517fb726d48Sopenharmony_ci compressedRow.focusHandler = (ev): void => { 518fb726d48Sopenharmony_ci this.trace?.displayTip( 519fb726d48Sopenharmony_ci compressedRow, 520fb726d48Sopenharmony_ci MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct, 521fb726d48Sopenharmony_ci `<span>${Utils.getBinaryKBWithUnit(MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.value || 0)}</span>` 522fb726d48Sopenharmony_ci ); 523fb726d48Sopenharmony_ci }; 524fb726d48Sopenharmony_ci compressedRow.findHoverStruct = (): void => { 525fb726d48Sopenharmony_ci MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = compressedRow.getHoverStruct(); 526fb726d48Sopenharmony_ci }; 527fb726d48Sopenharmony_ci this.compressThreadHandler(compressedRow, swap); 528fb726d48Sopenharmony_ci } 529fb726d48Sopenharmony_ci 530fb726d48Sopenharmony_ci private initMemoryAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => { 531fb726d48Sopenharmony_ci let time = new Date().getTime(); 532fb726d48Sopenharmony_ci // sys.mem.total sys.mem.cached sys.mem.swap.total 533fb726d48Sopenharmony_ci let memoryUsedTraceRow = TraceRow.skeleton<MemoryAbilityMonitorStruct>(); 534fb726d48Sopenharmony_ci this.initMemoryUsedRow(memoryUsedTraceRow, processRow); 535fb726d48Sopenharmony_ci processRow.addChildTraceRow(memoryUsedTraceRow); 536fb726d48Sopenharmony_ci 537fb726d48Sopenharmony_ci let cachedFilesTraceRow = TraceRow.skeleton<MemoryAbilityMonitorStruct>(); 538fb726d48Sopenharmony_ci this.initCachedRow(cachedFilesTraceRow, processRow); 539fb726d48Sopenharmony_ci processRow.addChildTraceRow(cachedFilesTraceRow); 540fb726d48Sopenharmony_ci 541fb726d48Sopenharmony_ci let compressedTraceRow = TraceRow.skeleton<MemoryAbilityMonitorStruct>(); 542fb726d48Sopenharmony_ci this.initCompressedRow(compressedTraceRow, processRow); 543fb726d48Sopenharmony_ci processRow.addChildTraceRow(compressedTraceRow); 544fb726d48Sopenharmony_ci let durTime = new Date().getTime() - time; 545fb726d48Sopenharmony_ci info('The time to load the Ability Memory is: ', durTime); 546fb726d48Sopenharmony_ci }; 547fb726d48Sopenharmony_ci 548fb726d48Sopenharmony_ci private bytesReadThreadHandler(bytesReadRow: TraceRow<DiskAbilityMonitorStruct>, maxList: unknown[]): void { 549fb726d48Sopenharmony_ci // @ts-ignore 550fb726d48Sopenharmony_ci let maxBytesRead = maxList[0].bytesRead; 551fb726d48Sopenharmony_ci let maxBytesReadName = this.diskIOMath(maxBytesRead); 552fb726d48Sopenharmony_ci bytesReadRow.onThreadHandler = (useCache): void => { 553fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 554fb726d48Sopenharmony_ci if (bytesReadRow.currentContext) { 555fb726d48Sopenharmony_ci context = bytesReadRow.currentContext; 556fb726d48Sopenharmony_ci } else { 557fb726d48Sopenharmony_ci context = bytesReadRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 558fb726d48Sopenharmony_ci } 559fb726d48Sopenharmony_ci bytesReadRow.canvasSave(context); 560fb726d48Sopenharmony_ci (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread( 561fb726d48Sopenharmony_ci { 562fb726d48Sopenharmony_ci context: context, 563fb726d48Sopenharmony_ci useCache: useCache, 564fb726d48Sopenharmony_ci type: 'monitorDiskIo0', 565fb726d48Sopenharmony_ci maxDiskRate: maxBytesRead, 566fb726d48Sopenharmony_ci maxDiskRateName: maxBytesReadName, 567fb726d48Sopenharmony_ci }, 568fb726d48Sopenharmony_ci bytesReadRow 569fb726d48Sopenharmony_ci ); 570fb726d48Sopenharmony_ci bytesReadRow.canvasRestore(context, this.trace); 571fb726d48Sopenharmony_ci }; 572fb726d48Sopenharmony_ci } 573fb726d48Sopenharmony_ci 574fb726d48Sopenharmony_ci private initBytesReadRow( 575fb726d48Sopenharmony_ci bytesReadRow: TraceRow<DiskAbilityMonitorStruct>, // @ts-ignore 576fb726d48Sopenharmony_ci parentRow: TraceRow<unknown>, 577fb726d48Sopenharmony_ci maxList: unknown[] 578fb726d48Sopenharmony_ci ): void { 579fb726d48Sopenharmony_ci bytesReadRow.rowParentId = key; 580fb726d48Sopenharmony_ci bytesReadRow.rowHidden = !parentRow.expansion; 581fb726d48Sopenharmony_ci bytesReadRow.rowId = diskIONameList[0]; 582fb726d48Sopenharmony_ci bytesReadRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY; 583fb726d48Sopenharmony_ci bytesReadRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 584fb726d48Sopenharmony_ci bytesReadRow.selectChangeHandler = this.trace.selectChangeHandler; 585fb726d48Sopenharmony_ci bytesReadRow.style.height = '40px'; 586fb726d48Sopenharmony_ci bytesReadRow.style.width = '100%'; 587fb726d48Sopenharmony_ci bytesReadRow.setAttribute('children', ''); 588fb726d48Sopenharmony_ci bytesReadRow.name = `Disk ${diskIONameList[0]}`; 589fb726d48Sopenharmony_ci bytesReadRow.supplierFrame = (): Promise<DiskAbilityMonitorStruct[]> => 590fb726d48Sopenharmony_ci abilityBytesReadDataSender(bytesReadRow, 'AbilityBytesReadData').then((res): DiskAbilityMonitorStruct[] => { 591fb726d48Sopenharmony_ci this.computeDur(res); 592fb726d48Sopenharmony_ci return res; 593fb726d48Sopenharmony_ci }); 594fb726d48Sopenharmony_ci bytesReadRow.focusHandler = (ev): void => { 595fb726d48Sopenharmony_ci this.trace?.displayTip( 596fb726d48Sopenharmony_ci bytesReadRow, 597fb726d48Sopenharmony_ci DiskAbilityMonitorStruct.hoverDiskAbilityStruct, 598fb726d48Sopenharmony_ci `<span>${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S</span>` 599fb726d48Sopenharmony_ci ); 600fb726d48Sopenharmony_ci }; 601fb726d48Sopenharmony_ci bytesReadRow.findHoverStruct = (): void => { 602fb726d48Sopenharmony_ci DiskAbilityMonitorStruct.hoverDiskAbilityStruct = bytesReadRow.getHoverStruct(); 603fb726d48Sopenharmony_ci }; 604fb726d48Sopenharmony_ci this.bytesReadThreadHandler(bytesReadRow, maxList); 605fb726d48Sopenharmony_ci } 606fb726d48Sopenharmony_ci private bytesWriteThreadHandler(bytesWriteRow: TraceRow<DiskAbilityMonitorStruct>, maxList: unknown[]): void { 607fb726d48Sopenharmony_ci // @ts-ignore 608fb726d48Sopenharmony_ci let maxBytesWrite = maxList[0].bytesWrite; 609fb726d48Sopenharmony_ci let maxBytesWriteName = this.diskIOMath(maxBytesWrite); 610fb726d48Sopenharmony_ci bytesWriteRow.onThreadHandler = (useCache): void => { 611fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 612fb726d48Sopenharmony_ci if (bytesWriteRow.currentContext) { 613fb726d48Sopenharmony_ci context = bytesWriteRow.currentContext; 614fb726d48Sopenharmony_ci } else { 615fb726d48Sopenharmony_ci context = bytesWriteRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 616fb726d48Sopenharmony_ci } 617fb726d48Sopenharmony_ci bytesWriteRow.canvasSave(context); 618fb726d48Sopenharmony_ci (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread( 619fb726d48Sopenharmony_ci { 620fb726d48Sopenharmony_ci context: context, 621fb726d48Sopenharmony_ci useCache: useCache, 622fb726d48Sopenharmony_ci type: 'monitorDiskIo1', 623fb726d48Sopenharmony_ci maxDiskRate: maxBytesWrite, 624fb726d48Sopenharmony_ci maxDiskRateName: maxBytesWriteName, 625fb726d48Sopenharmony_ci }, 626fb726d48Sopenharmony_ci bytesWriteRow 627fb726d48Sopenharmony_ci ); 628fb726d48Sopenharmony_ci bytesWriteRow.canvasRestore(context, this.trace); 629fb726d48Sopenharmony_ci }; 630fb726d48Sopenharmony_ci } 631fb726d48Sopenharmony_ci 632fb726d48Sopenharmony_ci private initBytesWriteRow( 633fb726d48Sopenharmony_ci bytesWriteRow: TraceRow<DiskAbilityMonitorStruct>, // @ts-ignore 634fb726d48Sopenharmony_ci parent: TraceRow<unknown>, 635fb726d48Sopenharmony_ci maxList: unknown[] 636fb726d48Sopenharmony_ci ): void { 637fb726d48Sopenharmony_ci bytesWriteRow.rowParentId = key; 638fb726d48Sopenharmony_ci bytesWriteRow.rowHidden = !parent.expansion; 639fb726d48Sopenharmony_ci bytesWriteRow.rowId = diskIONameList[1]; 640fb726d48Sopenharmony_ci bytesWriteRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY; 641fb726d48Sopenharmony_ci bytesWriteRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 642fb726d48Sopenharmony_ci bytesWriteRow.selectChangeHandler = this.trace.selectChangeHandler; 643fb726d48Sopenharmony_ci bytesWriteRow.style.height = '40px'; 644fb726d48Sopenharmony_ci bytesWriteRow.style.width = '100%'; 645fb726d48Sopenharmony_ci bytesWriteRow.setAttribute('children', ''); 646fb726d48Sopenharmony_ci bytesWriteRow.name = `Disk ${diskIONameList[1]}`; 647fb726d48Sopenharmony_ci bytesWriteRow.supplierFrame = (): Promise<DiskAbilityMonitorStruct[]> => 648fb726d48Sopenharmony_ci abilityBytesReadDataSender(bytesWriteRow, 'AbilityBytesWrittenData').then((res): DiskAbilityMonitorStruct[] => { 649fb726d48Sopenharmony_ci this.computeDur(res); 650fb726d48Sopenharmony_ci return res; 651fb726d48Sopenharmony_ci }); 652fb726d48Sopenharmony_ci bytesWriteRow.focusHandler = (ev): void => { 653fb726d48Sopenharmony_ci this.trace?.displayTip( 654fb726d48Sopenharmony_ci bytesWriteRow, 655fb726d48Sopenharmony_ci DiskAbilityMonitorStruct.hoverDiskAbilityStruct, 656fb726d48Sopenharmony_ci `<span>${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S</span>` 657fb726d48Sopenharmony_ci ); 658fb726d48Sopenharmony_ci }; 659fb726d48Sopenharmony_ci bytesWriteRow.findHoverStruct = (): void => { 660fb726d48Sopenharmony_ci DiskAbilityMonitorStruct.hoverDiskAbilityStruct = bytesWriteRow.getHoverStruct(); 661fb726d48Sopenharmony_ci }; 662fb726d48Sopenharmony_ci this.bytesWriteThreadHandler(bytesWriteRow, maxList); 663fb726d48Sopenharmony_ci } 664fb726d48Sopenharmony_ci 665fb726d48Sopenharmony_ci private initReadOspRow( 666fb726d48Sopenharmony_ci readOpsRow: TraceRow<DiskAbilityMonitorStruct>, 667fb726d48Sopenharmony_ci // @ts-ignore 668fb726d48Sopenharmony_ci parent: TraceRow<unknown>, 669fb726d48Sopenharmony_ci maxList: unknown[] 670fb726d48Sopenharmony_ci ): void { 671fb726d48Sopenharmony_ci // @ts-ignore 672fb726d48Sopenharmony_ci let maxReadOps = maxList[0].readOps; 673fb726d48Sopenharmony_ci let maxReadOpsName = this.diskIOMath(maxReadOps); 674fb726d48Sopenharmony_ci readOpsRow.rowParentId = key; 675fb726d48Sopenharmony_ci readOpsRow.rowHidden = !parent.expansion; 676fb726d48Sopenharmony_ci readOpsRow.rowId = diskIONameList[2]; 677fb726d48Sopenharmony_ci readOpsRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY; 678fb726d48Sopenharmony_ci readOpsRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 679fb726d48Sopenharmony_ci readOpsRow.selectChangeHandler = this.trace.selectChangeHandler; 680fb726d48Sopenharmony_ci readOpsRow.style.height = '40px'; 681fb726d48Sopenharmony_ci readOpsRow.style.width = '100%'; 682fb726d48Sopenharmony_ci readOpsRow.setAttribute('children', ''); 683fb726d48Sopenharmony_ci readOpsRow.name = `Disk ${diskIONameList[2]}`; 684fb726d48Sopenharmony_ci readOpsRow.supplierFrame = (): Promise<DiskAbilityMonitorStruct[]> => 685fb726d48Sopenharmony_ci abilityBytesReadDataSender(readOpsRow, 'AbilityReadOpsData').then((res): DiskAbilityMonitorStruct[] => { 686fb726d48Sopenharmony_ci this.computeDur(res); 687fb726d48Sopenharmony_ci return res; 688fb726d48Sopenharmony_ci }); 689fb726d48Sopenharmony_ci readOpsRow.focusHandler = (ev): void => { 690fb726d48Sopenharmony_ci this.trace?.displayTip( 691fb726d48Sopenharmony_ci readOpsRow, 692fb726d48Sopenharmony_ci DiskAbilityMonitorStruct.hoverDiskAbilityStruct, 693fb726d48Sopenharmony_ci `<span>${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S</span>` 694fb726d48Sopenharmony_ci ); 695fb726d48Sopenharmony_ci }; 696fb726d48Sopenharmony_ci readOpsRow.findHoverStruct = (): void => { 697fb726d48Sopenharmony_ci DiskAbilityMonitorStruct.hoverDiskAbilityStruct = readOpsRow.getHoverStruct(); 698fb726d48Sopenharmony_ci }; 699fb726d48Sopenharmony_ci readOpsRow.onThreadHandler = (useCache): void => { 700fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 701fb726d48Sopenharmony_ci if (readOpsRow.currentContext) { 702fb726d48Sopenharmony_ci context = readOpsRow.currentContext; 703fb726d48Sopenharmony_ci } else { 704fb726d48Sopenharmony_ci context = readOpsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 705fb726d48Sopenharmony_ci } 706fb726d48Sopenharmony_ci readOpsRow.canvasSave(context); 707fb726d48Sopenharmony_ci (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread( 708fb726d48Sopenharmony_ci { 709fb726d48Sopenharmony_ci context: context, 710fb726d48Sopenharmony_ci useCache: useCache, 711fb726d48Sopenharmony_ci type: 'monitorDiskIo2', 712fb726d48Sopenharmony_ci maxDiskRate: maxReadOps, 713fb726d48Sopenharmony_ci maxDiskRateName: maxReadOpsName, 714fb726d48Sopenharmony_ci }, 715fb726d48Sopenharmony_ci readOpsRow 716fb726d48Sopenharmony_ci ); 717fb726d48Sopenharmony_ci readOpsRow.canvasRestore(context, this.trace); 718fb726d48Sopenharmony_ci }; 719fb726d48Sopenharmony_ci } 720fb726d48Sopenharmony_ci 721fb726d48Sopenharmony_ci private writeOspThreadHandler(writeOpsRow: TraceRow<DiskAbilityMonitorStruct>, maxList: unknown[]): void { 722fb726d48Sopenharmony_ci // @ts-ignore 723fb726d48Sopenharmony_ci let maxWriteOps = maxList[0].writeOps; 724fb726d48Sopenharmony_ci let maxWriteOpsName = this.diskIOMath(maxWriteOps); 725fb726d48Sopenharmony_ci writeOpsRow.onThreadHandler = (useCache): void => { 726fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 727fb726d48Sopenharmony_ci if (writeOpsRow.currentContext) { 728fb726d48Sopenharmony_ci context = writeOpsRow.currentContext; 729fb726d48Sopenharmony_ci } else { 730fb726d48Sopenharmony_ci context = writeOpsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 731fb726d48Sopenharmony_ci } 732fb726d48Sopenharmony_ci writeOpsRow.canvasSave(context); 733fb726d48Sopenharmony_ci (renders.monitorDiskIo as DiskIoAbilityRender).renderMainThread( 734fb726d48Sopenharmony_ci { 735fb726d48Sopenharmony_ci context: context, 736fb726d48Sopenharmony_ci useCache: useCache, 737fb726d48Sopenharmony_ci type: 'monitorDiskIo3', 738fb726d48Sopenharmony_ci maxDiskRate: maxWriteOps, 739fb726d48Sopenharmony_ci maxDiskRateName: maxWriteOpsName, 740fb726d48Sopenharmony_ci }, 741fb726d48Sopenharmony_ci writeOpsRow 742fb726d48Sopenharmony_ci ); 743fb726d48Sopenharmony_ci writeOpsRow.canvasRestore(context, this.trace); 744fb726d48Sopenharmony_ci }; 745fb726d48Sopenharmony_ci } 746fb726d48Sopenharmony_ci 747fb726d48Sopenharmony_ci private initWriteOspRow( 748fb726d48Sopenharmony_ci writeOpsRow: TraceRow<DiskAbilityMonitorStruct>, // @ts-ignore 749fb726d48Sopenharmony_ci parent: TraceRow<unknown>, 750fb726d48Sopenharmony_ci maxList: unknown[] 751fb726d48Sopenharmony_ci ): void { 752fb726d48Sopenharmony_ci writeOpsRow.rowParentId = key; 753fb726d48Sopenharmony_ci writeOpsRow.rowHidden = !parent.expansion; 754fb726d48Sopenharmony_ci writeOpsRow.rowId = diskIONameList[3]; 755fb726d48Sopenharmony_ci writeOpsRow.rowType = TraceRow.ROW_TYPE_DISK_ABILITY; 756fb726d48Sopenharmony_ci writeOpsRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 757fb726d48Sopenharmony_ci writeOpsRow.selectChangeHandler = this.trace.selectChangeHandler; 758fb726d48Sopenharmony_ci writeOpsRow.style.height = '40px'; 759fb726d48Sopenharmony_ci writeOpsRow.style.width = '100%'; 760fb726d48Sopenharmony_ci writeOpsRow.setAttribute('children', ''); 761fb726d48Sopenharmony_ci writeOpsRow.name = `Disk ${diskIONameList[3]}`; 762fb726d48Sopenharmony_ci writeOpsRow.supplierFrame = (): Promise<DiskAbilityMonitorStruct[]> => 763fb726d48Sopenharmony_ci abilityBytesReadDataSender(writeOpsRow, 'AbilityWrittenOpsData').then((res): DiskAbilityMonitorStruct[] => { 764fb726d48Sopenharmony_ci this.computeDur(res); 765fb726d48Sopenharmony_ci return res; 766fb726d48Sopenharmony_ci }); 767fb726d48Sopenharmony_ci writeOpsRow.focusHandler = (ev): void => { 768fb726d48Sopenharmony_ci this.trace?.displayTip( 769fb726d48Sopenharmony_ci writeOpsRow, 770fb726d48Sopenharmony_ci DiskAbilityMonitorStruct.hoverDiskAbilityStruct, 771fb726d48Sopenharmony_ci `<span>${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S</span>` 772fb726d48Sopenharmony_ci ); 773fb726d48Sopenharmony_ci }; 774fb726d48Sopenharmony_ci writeOpsRow.findHoverStruct = (): void => { 775fb726d48Sopenharmony_ci DiskAbilityMonitorStruct.hoverDiskAbilityStruct = writeOpsRow.getHoverStruct(); 776fb726d48Sopenharmony_ci }; 777fb726d48Sopenharmony_ci this.writeOspThreadHandler(writeOpsRow, maxList); 778fb726d48Sopenharmony_ci } 779fb726d48Sopenharmony_ci private initDiskAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => { 780fb726d48Sopenharmony_ci let time = new Date().getTime(); 781fb726d48Sopenharmony_ci let maxList = await queryDiskIoMaxData(); 782fb726d48Sopenharmony_ci 783fb726d48Sopenharmony_ci let bytesReadTraceRow = TraceRow.skeleton<DiskAbilityMonitorStruct>(); 784fb726d48Sopenharmony_ci this.initBytesReadRow(bytesReadTraceRow, processRow, maxList); 785fb726d48Sopenharmony_ci processRow.addChildTraceRow(bytesReadTraceRow); 786fb726d48Sopenharmony_ci 787fb726d48Sopenharmony_ci let bytesWrittenTraceRow = TraceRow.skeleton<DiskAbilityMonitorStruct>(); 788fb726d48Sopenharmony_ci this.initBytesWriteRow(bytesWrittenTraceRow, processRow, maxList); 789fb726d48Sopenharmony_ci processRow.addChildTraceRow(bytesWrittenTraceRow); 790fb726d48Sopenharmony_ci 791fb726d48Sopenharmony_ci let readOpsTraceRow = TraceRow.skeleton<DiskAbilityMonitorStruct>(); 792fb726d48Sopenharmony_ci this.initReadOspRow(readOpsTraceRow, processRow, maxList); 793fb726d48Sopenharmony_ci processRow.addChildTraceRow(readOpsTraceRow); 794fb726d48Sopenharmony_ci 795fb726d48Sopenharmony_ci let writtenOpsTraceRow = TraceRow.skeleton<DiskAbilityMonitorStruct>(); 796fb726d48Sopenharmony_ci this.initWriteOspRow(writtenOpsTraceRow, processRow, maxList); 797fb726d48Sopenharmony_ci processRow.addChildTraceRow(writtenOpsTraceRow); 798fb726d48Sopenharmony_ci let durTime = new Date().getTime() - time; 799fb726d48Sopenharmony_ci info('The time to load the Ability DiskIO is: ', durTime); 800fb726d48Sopenharmony_ci }; 801fb726d48Sopenharmony_ci 802fb726d48Sopenharmony_ci private bytesInRowThreadHandler(row: TraceRow<NetworkAbilityMonitorStruct>, maxList: unknown[]): void { 803fb726d48Sopenharmony_ci // @ts-ignore 804fb726d48Sopenharmony_ci let maxBytesIn = maxList[0].maxIn; 805fb726d48Sopenharmony_ci let maxInByteName = this.networkMath(maxBytesIn); 806fb726d48Sopenharmony_ci row.onThreadHandler = (useCache): void => { 807fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 808fb726d48Sopenharmony_ci if (row.currentContext) { 809fb726d48Sopenharmony_ci context = row.currentContext; 810fb726d48Sopenharmony_ci } else { 811fb726d48Sopenharmony_ci context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 812fb726d48Sopenharmony_ci } 813fb726d48Sopenharmony_ci row.canvasSave(context); 814fb726d48Sopenharmony_ci (renders.monitorNetwork as NetworkAbilityRender).renderMainThread( 815fb726d48Sopenharmony_ci { 816fb726d48Sopenharmony_ci context: context, 817fb726d48Sopenharmony_ci useCache: useCache, 818fb726d48Sopenharmony_ci type: 'monitorNetwork0', 819fb726d48Sopenharmony_ci maxNetworkRate: maxBytesIn, 820fb726d48Sopenharmony_ci maxNetworkRateName: maxInByteName, 821fb726d48Sopenharmony_ci }, 822fb726d48Sopenharmony_ci row 823fb726d48Sopenharmony_ci ); 824fb726d48Sopenharmony_ci row.canvasRestore(context, this.trace); 825fb726d48Sopenharmony_ci }; 826fb726d48Sopenharmony_ci } 827fb726d48Sopenharmony_ci 828fb726d48Sopenharmony_ci private initBytesInRow( 829fb726d48Sopenharmony_ci row: TraceRow<NetworkAbilityMonitorStruct>, 830fb726d48Sopenharmony_ci parent: TraceRow<ProcessStruct>, 831fb726d48Sopenharmony_ci maxList: unknown[] 832fb726d48Sopenharmony_ci ): void { 833fb726d48Sopenharmony_ci row.rowParentId = key; 834fb726d48Sopenharmony_ci row.rowHidden = !parent.expansion; 835fb726d48Sopenharmony_ci row.rowId = networkNameList[0]; 836fb726d48Sopenharmony_ci row.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY; 837fb726d48Sopenharmony_ci row.favoriteChangeHandler = this.trace.favoriteChangeHandler; 838fb726d48Sopenharmony_ci row.selectChangeHandler = this.trace.selectChangeHandler; 839fb726d48Sopenharmony_ci row.style.height = '40px'; 840fb726d48Sopenharmony_ci row.style.width = '100%'; 841fb726d48Sopenharmony_ci row.setAttribute('children', ''); 842fb726d48Sopenharmony_ci row.name = `Network ${networkNameList[0]}`; 843fb726d48Sopenharmony_ci row.supplierFrame = (): Promise<NetworkAbilityMonitorStruct[]> => 844fb726d48Sopenharmony_ci abilityBytesInTraceDataSender(row, 'AbilityBytesInTraceData').then((res): NetworkAbilityMonitorStruct[] => { 845fb726d48Sopenharmony_ci this.computeDur(res); 846fb726d48Sopenharmony_ci return res; 847fb726d48Sopenharmony_ci }); 848fb726d48Sopenharmony_ci row.focusHandler = (ev): void => { 849fb726d48Sopenharmony_ci this.trace?.displayTip( 850fb726d48Sopenharmony_ci row, 851fb726d48Sopenharmony_ci NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, 852fb726d48Sopenharmony_ci `<span>${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.value || 0)}</span>` 853fb726d48Sopenharmony_ci ); 854fb726d48Sopenharmony_ci }; 855fb726d48Sopenharmony_ci row.findHoverStruct = (): void => { 856fb726d48Sopenharmony_ci NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = row.getHoverStruct(); 857fb726d48Sopenharmony_ci }; 858fb726d48Sopenharmony_ci this.bytesInRowThreadHandler(row, maxList); 859fb726d48Sopenharmony_ci } 860fb726d48Sopenharmony_ci private bytesOutRowThreadHandler(row: TraceRow<NetworkAbilityMonitorStruct>, maxList: unknown[]): void { 861fb726d48Sopenharmony_ci // @ts-ignore 862fb726d48Sopenharmony_ci let maxBytesOut = maxList[0].maxOut; 863fb726d48Sopenharmony_ci let maxOutByteName = this.networkMath(maxBytesOut); 864fb726d48Sopenharmony_ci row.onThreadHandler = (useCache): void => { 865fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 866fb726d48Sopenharmony_ci if (row.currentContext) { 867fb726d48Sopenharmony_ci context = row.currentContext; 868fb726d48Sopenharmony_ci } else { 869fb726d48Sopenharmony_ci context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 870fb726d48Sopenharmony_ci } 871fb726d48Sopenharmony_ci row.canvasSave(context); 872fb726d48Sopenharmony_ci (renders.monitorNetwork as NetworkAbilityRender).renderMainThread( 873fb726d48Sopenharmony_ci { 874fb726d48Sopenharmony_ci context: context, 875fb726d48Sopenharmony_ci useCache: useCache, 876fb726d48Sopenharmony_ci type: 'monitorNetwork1', 877fb726d48Sopenharmony_ci maxNetworkRate: maxBytesOut, 878fb726d48Sopenharmony_ci maxNetworkRateName: maxOutByteName, 879fb726d48Sopenharmony_ci }, 880fb726d48Sopenharmony_ci row 881fb726d48Sopenharmony_ci ); 882fb726d48Sopenharmony_ci row.canvasRestore(context, this.trace); 883fb726d48Sopenharmony_ci }; 884fb726d48Sopenharmony_ci } 885fb726d48Sopenharmony_ci 886fb726d48Sopenharmony_ci private initBytesOutRow( 887fb726d48Sopenharmony_ci row: TraceRow<NetworkAbilityMonitorStruct>, 888fb726d48Sopenharmony_ci parent: TraceRow<ProcessStruct>, 889fb726d48Sopenharmony_ci maxList: unknown[] 890fb726d48Sopenharmony_ci ): void { 891fb726d48Sopenharmony_ci row.rowParentId = key; 892fb726d48Sopenharmony_ci row.rowHidden = !parent.expansion; 893fb726d48Sopenharmony_ci row.rowId = networkNameList[1]; 894fb726d48Sopenharmony_ci row.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY; 895fb726d48Sopenharmony_ci row.favoriteChangeHandler = this.trace.favoriteChangeHandler; 896fb726d48Sopenharmony_ci row.selectChangeHandler = this.trace.selectChangeHandler; 897fb726d48Sopenharmony_ci row.style.height = '40px'; 898fb726d48Sopenharmony_ci row.style.width = '100%'; 899fb726d48Sopenharmony_ci row.setAttribute('children', ''); 900fb726d48Sopenharmony_ci row.name = `Network ${networkNameList[1]}`; 901fb726d48Sopenharmony_ci row.supplierFrame = (): Promise<NetworkAbilityMonitorStruct[]> => 902fb726d48Sopenharmony_ci abilityBytesInTraceDataSender(row, 'AbilityBytesOutTraceData').then((res): NetworkAbilityMonitorStruct[] => { 903fb726d48Sopenharmony_ci this.computeDur(res); 904fb726d48Sopenharmony_ci return res; 905fb726d48Sopenharmony_ci }); 906fb726d48Sopenharmony_ci row.focusHandler = (ev): void => { 907fb726d48Sopenharmony_ci this.trace?.displayTip( 908fb726d48Sopenharmony_ci row, 909fb726d48Sopenharmony_ci NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, 910fb726d48Sopenharmony_ci `<span>${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.value || 0)}</span>` 911fb726d48Sopenharmony_ci ); 912fb726d48Sopenharmony_ci }; 913fb726d48Sopenharmony_ci row.findHoverStruct = (): void => { 914fb726d48Sopenharmony_ci NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = row.getHoverStruct(); 915fb726d48Sopenharmony_ci }; 916fb726d48Sopenharmony_ci this.bytesOutRowThreadHandler(row, maxList); 917fb726d48Sopenharmony_ci } 918fb726d48Sopenharmony_ci 919fb726d48Sopenharmony_ci private packetInRowThreadHandler(row: TraceRow<NetworkAbilityMonitorStruct>, maxList: unknown[]): void { 920fb726d48Sopenharmony_ci // @ts-ignore 921fb726d48Sopenharmony_ci let maxPacketIn = maxList[0].maxPacketIn; 922fb726d48Sopenharmony_ci let maxInPacketName = this.networkMath(maxPacketIn); 923fb726d48Sopenharmony_ci row.onThreadHandler = (useCache): void => { 924fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 925fb726d48Sopenharmony_ci if (row.currentContext) { 926fb726d48Sopenharmony_ci context = row.currentContext; 927fb726d48Sopenharmony_ci } else { 928fb726d48Sopenharmony_ci context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 929fb726d48Sopenharmony_ci } 930fb726d48Sopenharmony_ci row.canvasSave(context); 931fb726d48Sopenharmony_ci (renders.monitorNetwork as NetworkAbilityRender).renderMainThread( 932fb726d48Sopenharmony_ci { 933fb726d48Sopenharmony_ci context: context, 934fb726d48Sopenharmony_ci useCache: useCache, 935fb726d48Sopenharmony_ci type: 'monitorNetwork-Packet2', 936fb726d48Sopenharmony_ci maxNetworkRate: maxPacketIn, 937fb726d48Sopenharmony_ci maxNetworkRateName: maxInPacketName, 938fb726d48Sopenharmony_ci }, 939fb726d48Sopenharmony_ci row 940fb726d48Sopenharmony_ci ); 941fb726d48Sopenharmony_ci row.canvasRestore(context, this.trace); 942fb726d48Sopenharmony_ci }; 943fb726d48Sopenharmony_ci } 944fb726d48Sopenharmony_ci 945fb726d48Sopenharmony_ci private initPacketInRow( 946fb726d48Sopenharmony_ci row: TraceRow<NetworkAbilityMonitorStruct>, 947fb726d48Sopenharmony_ci parent: TraceRow<ProcessStruct>, 948fb726d48Sopenharmony_ci maxList: unknown[] 949fb726d48Sopenharmony_ci ): void { 950fb726d48Sopenharmony_ci row.rowParentId = key; 951fb726d48Sopenharmony_ci row.rowHidden = !parent.expansion; 952fb726d48Sopenharmony_ci row.rowId = networkNameList[2]; 953fb726d48Sopenharmony_ci row.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY; 954fb726d48Sopenharmony_ci row.favoriteChangeHandler = this.trace.favoriteChangeHandler; 955fb726d48Sopenharmony_ci row.selectChangeHandler = this.trace.selectChangeHandler; 956fb726d48Sopenharmony_ci row.style.height = '40px'; 957fb726d48Sopenharmony_ci row.style.width = '100%'; 958fb726d48Sopenharmony_ci row.setAttribute('children', ''); 959fb726d48Sopenharmony_ci row.name = `Network ${networkNameList[2]}`; 960fb726d48Sopenharmony_ci row.supplierFrame = (): Promise<NetworkAbilityMonitorStruct[]> => 961fb726d48Sopenharmony_ci abilityBytesInTraceDataSender(row, 'AbilityPacketInTraceData').then((res): NetworkAbilityMonitorStruct[] => { 962fb726d48Sopenharmony_ci this.computeDur(res); 963fb726d48Sopenharmony_ci return res; 964fb726d48Sopenharmony_ci }); 965fb726d48Sopenharmony_ci row.focusHandler = (ev): void => { 966fb726d48Sopenharmony_ci this.trace?.displayTip( 967fb726d48Sopenharmony_ci row, 968fb726d48Sopenharmony_ci NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, 969fb726d48Sopenharmony_ci `<span>${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.value || 0)}</span>` 970fb726d48Sopenharmony_ci ); 971fb726d48Sopenharmony_ci }; 972fb726d48Sopenharmony_ci row.findHoverStruct = (): void => { 973fb726d48Sopenharmony_ci NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = row.getHoverStruct(); 974fb726d48Sopenharmony_ci }; 975fb726d48Sopenharmony_ci this.packetInRowThreadHandler(row, maxList); 976fb726d48Sopenharmony_ci } 977fb726d48Sopenharmony_ci 978fb726d48Sopenharmony_ci private packetOutRowThreadHandler(row: TraceRow<NetworkAbilityMonitorStruct>, maxList: unknown[]): void { 979fb726d48Sopenharmony_ci // @ts-ignore 980fb726d48Sopenharmony_ci let maxPacketOut = maxList[0].maxPacketOut; 981fb726d48Sopenharmony_ci let maxOutPacketName = this.networkMath(maxPacketOut); 982fb726d48Sopenharmony_ci row.onThreadHandler = (useCache): void => { 983fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 984fb726d48Sopenharmony_ci if (row.currentContext) { 985fb726d48Sopenharmony_ci context = row.currentContext; 986fb726d48Sopenharmony_ci } else { 987fb726d48Sopenharmony_ci context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 988fb726d48Sopenharmony_ci } 989fb726d48Sopenharmony_ci row.canvasSave(context); 990fb726d48Sopenharmony_ci (renders.monitorNetwork as NetworkAbilityRender).renderMainThread( 991fb726d48Sopenharmony_ci { 992fb726d48Sopenharmony_ci context: context, 993fb726d48Sopenharmony_ci useCache: useCache, 994fb726d48Sopenharmony_ci type: 'monitorNetwork3', 995fb726d48Sopenharmony_ci maxNetworkRate: maxPacketOut, 996fb726d48Sopenharmony_ci maxNetworkRateName: maxOutPacketName, 997fb726d48Sopenharmony_ci }, 998fb726d48Sopenharmony_ci row 999fb726d48Sopenharmony_ci ); 1000fb726d48Sopenharmony_ci row.canvasRestore(context, this.trace); 1001fb726d48Sopenharmony_ci }; 1002fb726d48Sopenharmony_ci } 1003fb726d48Sopenharmony_ci 1004fb726d48Sopenharmony_ci private initPacketOutRow( 1005fb726d48Sopenharmony_ci row: TraceRow<NetworkAbilityMonitorStruct>, 1006fb726d48Sopenharmony_ci parent: TraceRow<ProcessStruct>, 1007fb726d48Sopenharmony_ci maxList: unknown[] 1008fb726d48Sopenharmony_ci ): void { 1009fb726d48Sopenharmony_ci row.rowParentId = key; 1010fb726d48Sopenharmony_ci row.rowHidden = !parent.expansion; 1011fb726d48Sopenharmony_ci row.rowId = networkNameList[3]; 1012fb726d48Sopenharmony_ci row.rowType = TraceRow.ROW_TYPE_NETWORK_ABILITY; 1013fb726d48Sopenharmony_ci row.favoriteChangeHandler = this.trace.favoriteChangeHandler; 1014fb726d48Sopenharmony_ci row.selectChangeHandler = this.trace.selectChangeHandler; 1015fb726d48Sopenharmony_ci row.style.height = '40px'; 1016fb726d48Sopenharmony_ci row.style.width = '100%'; 1017fb726d48Sopenharmony_ci row.setAttribute('children', ''); 1018fb726d48Sopenharmony_ci row.name = `Network ${networkNameList[3]}`; 1019fb726d48Sopenharmony_ci row.supplierFrame = (): Promise<NetworkAbilityMonitorStruct[]> => 1020fb726d48Sopenharmony_ci abilityBytesInTraceDataSender(row, 'AbilityPacketsOutTraceData').then((res): NetworkAbilityMonitorStruct[] => { 1021fb726d48Sopenharmony_ci this.computeDur(res); 1022fb726d48Sopenharmony_ci return res; 1023fb726d48Sopenharmony_ci }); 1024fb726d48Sopenharmony_ci row.focusHandler = (ev): void => { 1025fb726d48Sopenharmony_ci if (NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct) { 1026fb726d48Sopenharmony_ci this.trace?.displayTip( 1027fb726d48Sopenharmony_ci row, 1028fb726d48Sopenharmony_ci NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, 1029fb726d48Sopenharmony_ci `<span>${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct!.value!)}</span>` 1030fb726d48Sopenharmony_ci ); 1031fb726d48Sopenharmony_ci } 1032fb726d48Sopenharmony_ci }; 1033fb726d48Sopenharmony_ci row.findHoverStruct = (): void => { 1034fb726d48Sopenharmony_ci NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = row.getHoverStruct(); 1035fb726d48Sopenharmony_ci }; 1036fb726d48Sopenharmony_ci this.packetOutRowThreadHandler(row, maxList); 1037fb726d48Sopenharmony_ci } 1038fb726d48Sopenharmony_ci private initNetworkAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => { 1039fb726d48Sopenharmony_ci let time = new Date().getTime(); 1040fb726d48Sopenharmony_ci let maxList = await queryNetWorkMaxData(); 1041fb726d48Sopenharmony_ci let bytesInTraceRow = TraceRow.skeleton<NetworkAbilityMonitorStruct>(); 1042fb726d48Sopenharmony_ci this.initBytesInRow(bytesInTraceRow, processRow, maxList); 1043fb726d48Sopenharmony_ci processRow.addChildTraceRow(bytesInTraceRow); 1044fb726d48Sopenharmony_ci 1045fb726d48Sopenharmony_ci let bytesOutTraceRow = TraceRow.skeleton<NetworkAbilityMonitorStruct>(); 1046fb726d48Sopenharmony_ci this.initBytesOutRow(bytesOutTraceRow, processRow, maxList); 1047fb726d48Sopenharmony_ci processRow.addChildTraceRow(bytesOutTraceRow); 1048fb726d48Sopenharmony_ci let packetInTraceRow = TraceRow.skeleton<NetworkAbilityMonitorStruct>(); 1049fb726d48Sopenharmony_ci this.initPacketInRow(packetInTraceRow, processRow, maxList); 1050fb726d48Sopenharmony_ci processRow.addChildTraceRow(packetInTraceRow); 1051fb726d48Sopenharmony_ci let packetOutTraceRow = TraceRow.skeleton<NetworkAbilityMonitorStruct>(); 1052fb726d48Sopenharmony_ci this.initPacketOutRow(packetOutTraceRow, processRow, maxList); 1053fb726d48Sopenharmony_ci processRow.addChildTraceRow(packetOutTraceRow); 1054fb726d48Sopenharmony_ci let durTime = new Date().getTime() - time; 1055fb726d48Sopenharmony_ci info('The time to load the Ability Network is: ', durTime); 1056fb726d48Sopenharmony_ci }; 1057fb726d48Sopenharmony_ci 1058fb726d48Sopenharmony_ci private async initPurgeableTotal(processRow: TraceRow<ProcessStruct>): Promise<void> { 1059fb726d48Sopenharmony_ci let snapshotDur = MemoryConfig.getInstance().snapshotDur; 1060fb726d48Sopenharmony_ci let totalTraceRow = this.initTraceRow( 1061fb726d48Sopenharmony_ci 'System Purgeable Total', 1062fb726d48Sopenharmony_ci 'Purgeable Total', 1063fb726d48Sopenharmony_ci TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY, 1064fb726d48Sopenharmony_ci processRow 1065fb726d48Sopenharmony_ci ); // @ts-ignore 1066fb726d48Sopenharmony_ci totalTraceRow.supplierFrame = (): Promise<unknown[]> => 1067fb726d48Sopenharmony_ci new Promise<Array<unknown>>((resolve): void => 1068fb726d48Sopenharmony_ci resolve( 1069fb726d48Sopenharmony_ci abilityPurgeableDataSender(totalTraceRow, snapshotDur, false).then((res: unknown[]) => { 1070fb726d48Sopenharmony_ci this.setName(res); 1071fb726d48Sopenharmony_ci return res; 1072fb726d48Sopenharmony_ci }) 1073fb726d48Sopenharmony_ci ) 1074fb726d48Sopenharmony_ci ); 1075fb726d48Sopenharmony_ci processRow.addChildTraceRow(totalTraceRow); 1076fb726d48Sopenharmony_ci } 1077fb726d48Sopenharmony_ci 1078fb726d48Sopenharmony_ci private async initPurgeablePin(processRow: TraceRow<ProcessStruct>): Promise<void> { 1079fb726d48Sopenharmony_ci let snapshotDur = MemoryConfig.getInstance().snapshotDur; 1080fb726d48Sopenharmony_ci let pinTraceRow = this.initTraceRow( 1081fb726d48Sopenharmony_ci 'System Purgeable Pin', 1082fb726d48Sopenharmony_ci 'Purgeable Pin', 1083fb726d48Sopenharmony_ci TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY, 1084fb726d48Sopenharmony_ci processRow 1085fb726d48Sopenharmony_ci ); // @ts-ignore 1086fb726d48Sopenharmony_ci pinTraceRow.supplierFrame = (): Promise<unknown[]> => 1087fb726d48Sopenharmony_ci new Promise<Array<unknown>>((resolve): void => 1088fb726d48Sopenharmony_ci resolve( 1089fb726d48Sopenharmony_ci abilityPurgeableDataSender(pinTraceRow, snapshotDur, true).then((res: unknown[]) => { 1090fb726d48Sopenharmony_ci this.setName(res); 1091fb726d48Sopenharmony_ci return res; 1092fb726d48Sopenharmony_ci }) 1093fb726d48Sopenharmony_ci ) 1094fb726d48Sopenharmony_ci ); 1095fb726d48Sopenharmony_ci processRow.addChildTraceRow(pinTraceRow); 1096fb726d48Sopenharmony_ci } 1097fb726d48Sopenharmony_ci 1098fb726d48Sopenharmony_ci /** 1099fb726d48Sopenharmony_ci * DMA 1100fb726d48Sopenharmony_ci * @param processRow 1101fb726d48Sopenharmony_ci */ 1102fb726d48Sopenharmony_ci private initDmaAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => { 1103fb726d48Sopenharmony_ci let snapshotDur = MemoryConfig.getInstance().snapshotDur; 1104fb726d48Sopenharmony_ci let dmaTraceRow = this.initTraceRow('abilityMonitorDma', 'DMA', TraceRow.ROW_TYPE_DMA_ABILITY, processRow); // @ts-ignore 1105fb726d48Sopenharmony_ci dmaTraceRow.supplierFrame = (): Promise<unknown[]> => 1106fb726d48Sopenharmony_ci new Promise<Array<unknown>>((resolve): void => 1107fb726d48Sopenharmony_ci resolve( 1108fb726d48Sopenharmony_ci abilityDmaDataSender(dmaTraceRow, snapshotDur).then((res: unknown[]) => { 1109fb726d48Sopenharmony_ci this.setName(res); 1110fb726d48Sopenharmony_ci return res; 1111fb726d48Sopenharmony_ci }) 1112fb726d48Sopenharmony_ci ) 1113fb726d48Sopenharmony_ci ); 1114fb726d48Sopenharmony_ci processRow.addChildTraceRow(dmaTraceRow); 1115fb726d48Sopenharmony_ci }; 1116fb726d48Sopenharmony_ci 1117fb726d48Sopenharmony_ci /** 1118fb726d48Sopenharmony_ci * Skia Gpu Memory 1119fb726d48Sopenharmony_ci * @param processRow 1120fb726d48Sopenharmony_ci */ 1121fb726d48Sopenharmony_ci private initGpuMemoryAbility = async (processRow: TraceRow<ProcessStruct>): Promise<void> => { 1122fb726d48Sopenharmony_ci let snapshotDur = MemoryConfig.getInstance().snapshotDur; 1123fb726d48Sopenharmony_ci let gpuMemoryTraceRow = this.initTraceRow( 1124fb726d48Sopenharmony_ci 'abilityMonitorGpuMemory', 1125fb726d48Sopenharmony_ci 'Skia Gpu Memory', 1126fb726d48Sopenharmony_ci TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY, 1127fb726d48Sopenharmony_ci processRow 1128fb726d48Sopenharmony_ci ); // @ts-ignore 1129fb726d48Sopenharmony_ci gpuMemoryTraceRow.supplierFrame = (): Promise<unknown[]> => 1130fb726d48Sopenharmony_ci new Promise<Array<unknown>>((resolve): void => 1131fb726d48Sopenharmony_ci resolve( 1132fb726d48Sopenharmony_ci abilityGpuMemoryDataSender(gpuMemoryTraceRow, snapshotDur).then((res: unknown[]) => { 1133fb726d48Sopenharmony_ci this.setName(res); 1134fb726d48Sopenharmony_ci return res; 1135fb726d48Sopenharmony_ci }) 1136fb726d48Sopenharmony_ci ) 1137fb726d48Sopenharmony_ci ); 1138fb726d48Sopenharmony_ci processRow.addChildTraceRow(gpuMemoryTraceRow); 1139fb726d48Sopenharmony_ci }; 1140fb726d48Sopenharmony_ci 1141fb726d48Sopenharmony_ci private initTraceRow( 1142fb726d48Sopenharmony_ci rowId: string, 1143fb726d48Sopenharmony_ci rowName: string, 1144fb726d48Sopenharmony_ci type: string, 1145fb726d48Sopenharmony_ci processRow: TraceRow<ProcessStruct> 1146fb726d48Sopenharmony_ci ): TraceRow<SnapshotStruct> { 1147fb726d48Sopenharmony_ci let abilityMonitor = TraceRow.skeleton<SnapshotStruct>(); 1148fb726d48Sopenharmony_ci abilityMonitor.rowParentId = key; 1149fb726d48Sopenharmony_ci abilityMonitor.rowHidden = !processRow.expansion; 1150fb726d48Sopenharmony_ci abilityMonitor.rowId = rowId; 1151fb726d48Sopenharmony_ci abilityMonitor.rowType = type; 1152fb726d48Sopenharmony_ci abilityMonitor.favoriteChangeHandler = this.trace.favoriteChangeHandler; 1153fb726d48Sopenharmony_ci abilityMonitor.selectChangeHandler = this.trace.selectChangeHandler; 1154fb726d48Sopenharmony_ci abilityMonitor.style.height = '40px'; 1155fb726d48Sopenharmony_ci abilityMonitor.style.width = '100%'; 1156fb726d48Sopenharmony_ci abilityMonitor.setAttribute('children', ''); 1157fb726d48Sopenharmony_ci abilityMonitor.name = rowName; 1158fb726d48Sopenharmony_ci abilityMonitor.addTemplateTypes('Memory'); 1159fb726d48Sopenharmony_ci abilityMonitor.focusHandler = (): void => { 1160fb726d48Sopenharmony_ci this.showTip(abilityMonitor); 1161fb726d48Sopenharmony_ci }; 1162fb726d48Sopenharmony_ci abilityMonitor.findHoverStruct = (): void => { 1163fb726d48Sopenharmony_ci SnapshotStruct.hoverSnapshotStruct = abilityMonitor.getHoverStruct(); 1164fb726d48Sopenharmony_ci }; 1165fb726d48Sopenharmony_ci abilityMonitor.onThreadHandler = (useCache): void => { 1166fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 1167fb726d48Sopenharmony_ci if (abilityMonitor.currentContext) { 1168fb726d48Sopenharmony_ci context = abilityMonitor.currentContext; 1169fb726d48Sopenharmony_ci } else { 1170fb726d48Sopenharmony_ci context = abilityMonitor.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 1171fb726d48Sopenharmony_ci } 1172fb726d48Sopenharmony_ci abilityMonitor.canvasSave(context); 1173fb726d48Sopenharmony_ci (renders.snapshot as SnapshotRender).renderMainThread( 1174fb726d48Sopenharmony_ci { 1175fb726d48Sopenharmony_ci context: context, 1176fb726d48Sopenharmony_ci useCache: useCache, 1177fb726d48Sopenharmony_ci type: 'snapshot', 1178fb726d48Sopenharmony_ci }, 1179fb726d48Sopenharmony_ci abilityMonitor 1180fb726d48Sopenharmony_ci ); 1181fb726d48Sopenharmony_ci abilityMonitor.canvasRestore(context, this.trace); 1182fb726d48Sopenharmony_ci }; 1183fb726d48Sopenharmony_ci return abilityMonitor; 1184fb726d48Sopenharmony_ci } 1185fb726d48Sopenharmony_ci 1186fb726d48Sopenharmony_ci private showTip(traceRow: TraceRow<SnapshotStruct>): void { 1187fb726d48Sopenharmony_ci this.trace?.displayTip( 1188fb726d48Sopenharmony_ci traceRow, 1189fb726d48Sopenharmony_ci SnapshotStruct.hoverSnapshotStruct, 1190fb726d48Sopenharmony_ci `<span>Name: ${SnapshotStruct.hoverSnapshotStruct?.name || ''}</span> 1191fb726d48Sopenharmony_ci <span>Size: ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}</span>` 1192fb726d48Sopenharmony_ci ); 1193fb726d48Sopenharmony_ci } 1194fb726d48Sopenharmony_ci 1195fb726d48Sopenharmony_ci private setName(data: Array<unknown>): void { 1196fb726d48Sopenharmony_ci if (data.length > 0) { 1197fb726d48Sopenharmony_ci data.forEach((item, index) => { 1198fb726d48Sopenharmony_ci // @ts-ignore 1199fb726d48Sopenharmony_ci item.name = `SnapShot ${index}`; 1200fb726d48Sopenharmony_ci }); 1201fb726d48Sopenharmony_ci } 1202fb726d48Sopenharmony_ci } 1203fb726d48Sopenharmony_ci 1204fb726d48Sopenharmony_ci private computeDur(list: Array<unknown>): void { 1205fb726d48Sopenharmony_ci let endNS = TraceRow.range?.endNS || 0; 1206fb726d48Sopenharmony_ci list.forEach((it, i) => { 1207fb726d48Sopenharmony_ci if (i === list.length - 1) { 1208fb726d48Sopenharmony_ci // @ts-ignore 1209fb726d48Sopenharmony_ci it.dur = (endNS || 0) - (it.startNS || 0); 1210fb726d48Sopenharmony_ci } else { 1211fb726d48Sopenharmony_ci // @ts-ignore 1212fb726d48Sopenharmony_ci it.dur = (list[i + 1].startNS || 0) - (it.startNS || 0); 1213fb726d48Sopenharmony_ci } 1214fb726d48Sopenharmony_ci }); 1215fb726d48Sopenharmony_ci } 1216fb726d48Sopenharmony_ci} 1217