• 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
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