• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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