1 /* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 import { SpSystemTrace } from '../SpSystemTrace.js'; 17 import { TraceRow } from '../trace/base/TraceRow.js'; 18 import { queryIrqData, queryIrqList } from '../../database/SqlLite.js'; 19 import { info } from '../../../log/Log.js'; 20 import { renders } from '../../database/ui-worker/ProcedureWorker.js'; 21 import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js'; 22 import { IrqRender, IrqStruct } from '../../database/ui-worker/ProcedureWorkerIrq.js'; 23 24 export class SpIrqChart { 25 private trace: SpSystemTrace; 26 27 constructor(trace: SpSystemTrace) { 28 this.trace = trace; 29 } 30 31 async init() { 32 let folder = await this.initFolder(); 33 await this.initData(folder); 34 } 35 36 async initData(folder: TraceRow<any>) { 37 let irqStartTime = new Date().getTime(); 38 let irqList = await queryIrqList(); 39 if (irqList.length == 0) { 40 return; 41 } 42 info('irqList data size is: ', irqList!.length); 43 this.trace.rowsEL?.appendChild(folder); 44 for (let i = 0; i < irqList.length; i++) { 45 const it = irqList[i]; 46 let traceRow = TraceRow.skeleton<IrqStruct>(); 47 traceRow.rowId = it.name + it.cpu; 48 traceRow.rowType = TraceRow.ROW_TYPE_IRQ; 49 traceRow.rowParentId = folder.rowId; 50 traceRow.style.height = '40px'; 51 traceRow.name = `${it.name} Cpu ${it.cpu}`; 52 traceRow.rowHidden = !folder.expansion; 53 traceRow.setAttribute('children', ''); 54 traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 55 traceRow.selectChangeHandler = this.trace.selectChangeHandler; 56 traceRow.supplier = () => queryIrqData(it.cpu, it.name); 57 traceRow.focusHandler = (ev) => { 58 this.trace?.displayTip( 59 traceRow, 60 IrqStruct.hoverIrqStruct, 61 `<span>${IrqStruct.hoverIrqStruct?.name || ''}</span>` 62 ); 63 }; 64 traceRow.onThreadHandler = (useCache) => { 65 let context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 66 traceRow.canvasSave(context); 67 (renders['irq'] as IrqRender).renderMainThread( 68 { 69 context: context, 70 useCache: useCache, 71 type: it.name, 72 index: i, 73 }, 74 traceRow 75 ); 76 traceRow.canvasRestore(context); 77 }; 78 folder.addChildTraceRow(traceRow); 79 } 80 let durTime = new Date().getTime() - irqStartTime; 81 info('The time to load the ClockData is: ', durTime); 82 } 83 84 async initFolder(): Promise<TraceRow<any>> { 85 let irqFolder = TraceRow.skeleton(); 86 irqFolder.rowId = `Irqs`; 87 irqFolder.index = 0; 88 irqFolder.rowType = TraceRow.ROW_TYPE_IRQ_GROUP; 89 irqFolder.rowParentId = ''; 90 irqFolder.style.height = '40px'; 91 irqFolder.folder = true; 92 irqFolder.name = `Irqs`; /* & I/O Latency */ 93 irqFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler; 94 irqFolder.selectChangeHandler = this.trace.selectChangeHandler; 95 irqFolder.supplier = () => new Promise<Array<any>>((resolve) => resolve([])); 96 irqFolder.onThreadHandler = (useCache) => { 97 irqFolder.canvasSave(this.trace.canvasPanelCtx!); 98 if (irqFolder.expansion) { 99 this.trace.canvasPanelCtx?.clearRect(0, 0, irqFolder.frame.width, irqFolder.frame.height); 100 } else { 101 (renders['empty'] as EmptyRender).renderMainThread( 102 { 103 context: this.trace.canvasPanelCtx, 104 useCache: useCache, 105 type: ``, 106 }, 107 irqFolder 108 ); 109 } 110 irqFolder.canvasRestore(this.trace.canvasPanelCtx!); 111 }; 112 return irqFolder; 113 } 114 } 115