• 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.js';
17import { TraceRow } from '../trace/base/TraceRow.js';
18import { queryIrqData, queryIrqList } from '../../database/SqlLite.js';
19import { info } from '../../../log/Log.js';
20import { renders } from '../../database/ui-worker/ProcedureWorker.js';
21import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js';
22import { IrqRender, IrqStruct } from '../../database/ui-worker/ProcedureWorkerIrq.js';
23
24export 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