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 16import { SpSystemTrace } from '../SpSystemTrace'; 17import { TraceRow } from '../trace/base/TraceRow'; 18import { info } from '../../../log/Log'; 19import { renders } from '../../database/ui-worker/ProcedureWorker'; 20import { EmptyRender } from '../../database/ui-worker/cpu/ProcedureWorkerCPU'; 21import { IrqRender, IrqStruct } from '../../database/ui-worker/ProcedureWorkerIrq'; 22import { irqDataSender } from '../../database/data-trafic/IrqDataSender'; 23import {queryAllIrqNames, queryIrqList} from "../../database/sql/Irq.sql"; 24 25export class SpIrqChart { 26 private trace: SpSystemTrace; 27 private irqNameMap: Map<number, { name: string; ipiName: string }> = new Map(); 28 29 constructor(trace: SpSystemTrace) { 30 this.trace = trace; 31 } 32 33 async init() { 34 let folder = await this.initFolder(); 35 await this.initData(folder); 36 } 37 38 async initData(folder: TraceRow<any>) { 39 let irqStartTime = new Date().getTime(); 40 let irqList = await queryIrqList(); 41 if (irqList.length == 0) { 42 return; 43 } 44 //加载irq table所有id和name数据 45 let irqNamesArray = await queryAllIrqNames(); 46 irqNamesArray.forEach((it) => { 47 this.irqNameMap.set(it.id, { ipiName: it.ipiName, name: it.name }); 48 }); 49 info('irqList data size is: ', irqList!.length); 50 this.trace.rowsEL?.appendChild(folder); 51 for (let i = 0; i < irqList.length; i++) { 52 const it = irqList[i]; 53 let traceRow = TraceRow.skeleton<IrqStruct>(); 54 traceRow.rowId = it.name + it.cpu; 55 traceRow.rowType = TraceRow.ROW_TYPE_IRQ; 56 traceRow.rowParentId = folder.rowId; 57 traceRow.style.height = '40px'; 58 traceRow.name = `${it.name} Cpu ${it.cpu}`; 59 traceRow.rowHidden = !folder.expansion; 60 traceRow.setAttribute('children', ''); 61 traceRow.setAttribute('callId', `${it.cpu}`); 62 traceRow.setAttribute('cat', `${it.name}`); 63 traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 64 traceRow.selectChangeHandler = this.trace.selectChangeHandler; 65 traceRow.supplierFrame = () => { 66 return irqDataSender(it.cpu, it.name, traceRow).then((irqs) => { 67 if (irqs.length > 0) { 68 irqs.forEach((irq, index) => { 69 if (it.name === 'irq') { 70 irqs[index].name = this.irqNameMap.get(irqs[index].id!)!.ipiName || ''; 71 } else { 72 irqs[index].name = this.irqNameMap.get(irqs[index].id!)!.name || ''; 73 } 74 }); 75 } 76 return irqs; 77 }); 78 }; 79 traceRow.focusHandler = (ev) => { 80 this.trace?.displayTip( 81 traceRow, 82 IrqStruct.hoverIrqStruct, 83 `<span>${IrqStruct.hoverIrqStruct?.name || ''}</span>` 84 ); 85 }; 86 traceRow.findHoverStruct = () => { 87 IrqStruct.hoverIrqStruct = traceRow.getHoverStruct(); 88 }; 89 traceRow.onThreadHandler = (useCache) => { 90 let context: CanvasRenderingContext2D; 91 if (traceRow.currentContext) { 92 context = traceRow.currentContext; 93 } else { 94 context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 95 } 96 traceRow.canvasSave(context); 97 (renders['irq'] as IrqRender).renderMainThread( 98 { 99 context: context, 100 useCache: useCache, 101 type: it.name, 102 index: i, 103 }, 104 traceRow 105 ); 106 traceRow.canvasRestore(context, this.trace); 107 }; 108 folder.addChildTraceRow(traceRow); 109 } 110 let durTime = new Date().getTime() - irqStartTime; 111 info('The time to load the ClockData is: ', durTime); 112 } 113 114 async initFolder(): Promise<TraceRow<any>> { 115 let irqFolder = TraceRow.skeleton(); 116 irqFolder.rowId = `Irqs`; 117 irqFolder.index = 0; 118 irqFolder.rowType = TraceRow.ROW_TYPE_IRQ_GROUP; 119 irqFolder.rowParentId = ''; 120 irqFolder.style.height = '40px'; 121 irqFolder.folder = true; 122 irqFolder.name = `Irqs`; /* & I/O Latency */ 123 irqFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler; 124 irqFolder.selectChangeHandler = this.trace.selectChangeHandler; 125 irqFolder.supplier = () => new Promise<Array<any>>((resolve) => resolve([])); 126 irqFolder.onThreadHandler = (useCache) => { 127 irqFolder.canvasSave(this.trace.canvasPanelCtx!); 128 if (irqFolder.expansion) { 129 this.trace.canvasPanelCtx?.clearRect(0, 0, irqFolder.frame.width, irqFolder.frame.height); 130 } else { 131 (renders['empty'] as EmptyRender).renderMainThread( 132 { 133 context: this.trace.canvasPanelCtx, 134 useCache: useCache, 135 type: ``, 136 }, 137 irqFolder 138 ); 139 } 140 irqFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace); 141 }; 142 return irqFolder; 143 } 144} 145