* Copyright (C) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { ColorUtils } from '../component/trace/base/ColorUtils';
import { BaseStruct } from './BaseStruct';
import { WakeupBean } from './WakeupBean';
export class CpuStruct extends BaseStruct {
static cpuCount: number;
static hoverCpuStruct: CpuStruct | undefined;
static selectCpuStruct: CpuStruct | undefined;
static wakeupBean: WakeupBean | null | undefined;
cpu: number | undefined;
dur: number | undefined;
end_state: string | undefined;
id: number | undefined;
name: string | undefined;
priority: number | undefined;
processCmdLine: string | undefined;
processId: number | undefined;
processName: string | undefined;
schedId: number | undefined;
startTime: number | undefined;
tid: number | undefined;
type: string | undefined;
static draw(cpuCtx: CanvasRenderingContext2D, cpuStruct: CpuStruct): void {
if (cpuStruct.frame) {
let cpuWidth = cpuStruct.frame.width || 0;
if (cpuStruct.processId === CpuStruct.hoverCpuStruct?.processId || !CpuStruct.hoverCpuStruct) {
cpuCtx.fillStyle = ColorUtils.colorForTid(
(cpuStruct.processId || 0) > 0 ? cpuStruct.processId || 0 : cpuStruct.tid || 0
);
} else {
cpuCtx.fillStyle = '#e0e0e0';
}
cpuCtx.fillRect(cpuStruct.frame.x, cpuStruct.frame.y, cpuWidth, cpuStruct.frame.height);
if (cpuWidth > textPadding * 2) {
let cpuProcess = `${cpuStruct.processName || 'Process'} [${cpuStruct.processId}]`;
let cpuThread = `${cpuStruct.name || 'Thread'} [${cpuStruct.tid}]`;
let processMeasure = cpuCtx.measureText(cpuProcess);
let threadMeasure = cpuCtx.measureText(cpuThread);
let pChartWidth = Math.round(processMeasure.width / cpuProcess.length);
let tChartWidth = Math.round(threadMeasure.width / cpuThread.length);
cpuCtx.fillStyle = '#ffffff';
let y = cpuStruct.frame.height / 2 + cpuStruct.frame.y;
if (processMeasure.width < cpuWidth - textPadding * 2) {
let x1 = Math.floor(cpuWidth / 2 - processMeasure.width / 2 + cpuStruct.frame.x + textPadding);
cpuCtx.textBaseline = 'bottom';
cpuCtx.fillText(cpuProcess, x1, y, cpuWidth - textPadding * 2);
} else if (cpuWidth - textPadding * 2 > pChartWidth * 4) {
let chatNum = (cpuWidth - textPadding * 2) / pChartWidth;
let x1 = cpuStruct.frame.x + textPadding;
cpuCtx.textBaseline = 'bottom';
cpuCtx.fillText(`${cpuProcess.substring(0, chatNum - 4)}...`, x1, y, cpuWidth - textPadding * 2);
}
if (threadMeasure.width < cpuWidth - textPadding * 2) {
cpuCtx.textBaseline = 'top';
let x2 = Math.floor(cpuWidth / 2 - threadMeasure.width / 2 + cpuStruct.frame.x + textPadding);
cpuCtx.fillText(cpuThread, x2, y + 2, cpuWidth - textPadding * 2);
} else if (cpuWidth - textPadding * 2 > tChartWidth * 4) {
let chatNum = (cpuWidth - textPadding * 2) / tChartWidth;
let x1 = cpuStruct.frame.x + textPadding;
cpuCtx.textBaseline = 'top';
cpuCtx.fillText(`${cpuThread.substring(0, chatNum - 4)}...`, x1, y + 2, cpuWidth - textPadding * 2);
}
}
if (CpuStruct.selectCpuStruct && CpuStruct.equals(CpuStruct.selectCpuStruct, cpuStruct)) {
cpuCtx.strokeStyle = '#232c5d';
cpuCtx.lineWidth = 2;
cpuCtx.strokeRect(cpuStruct.frame.x, cpuStruct.frame.y, cpuWidth - 2, cpuStruct.frame.height);
}
}
}
static equals(d1: CpuStruct, d2: CpuStruct): boolean {
if (
d1 &&
d2 &&
d1.cpu === d2.cpu &&
d1.tid === d2.tid &&
d1.processId === d2.processId &&
d1.startTime === d2.startTime &&
d1.dur === d2.dur
) {
return true;
} else {
return false;
}
}
}
const textPadding = 2;