blob: d7c9dda3e2a69652439ab69b138f664288753c4f [file] [log] [blame]
// Copyright (C) 2023 The Android Open Source Project
//
// 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 m from 'mithril';
import {NullDisposable} from '../../base/disposable';
import {sqliteString} from '../../base/string_utils';
import {uuidv4} from '../../base/uuid';
import {Actions} from '../../common/actions';
import {SCROLLING_TRACK_GROUP} from '../../common/state';
import {
BaseCounterTrack,
RenderOptions,
} from '../../frontend/base_counter_track';
import {CloseTrackButton} from '../../frontend/close_track_button';
import {globals} from '../../frontend/globals';
import {EngineProxy, PrimaryTrackSortKey, TrackContext} from '../../public';
export function addActiveCPUCountTrack(cpuType?: string) {
const cpuTypeName = cpuType === undefined ? '' : ` ${cpuType} `;
const key = uuidv4();
globals.dispatchMultiple([
Actions.addTrack({
key,
uri: ActiveCPUCountTrack.kind,
name: `Active ${cpuTypeName}CPU count`,
trackSortKey: PrimaryTrackSortKey.DEBUG_TRACK,
trackGroup: SCROLLING_TRACK_GROUP,
params: {
cpuType,
},
}),
Actions.toggleTrackPinned({trackKey: key}),
]);
}
export interface ActiveCPUCountTrackConfig {
cpuType?: string;
}
export class ActiveCPUCountTrack extends BaseCounterTrack {
private config: ActiveCPUCountTrackConfig;
static readonly kind = 'dev.perfetto.Sched.ActiveCPUCount';
constructor(ctx: TrackContext, engine: EngineProxy) {
super({
engine,
trackKey: ctx.trackKey,
});
// TODO(stevegolton): Validate params before type asserting.
// TODO(stevegolton): Avoid just pushing this config up for some base
// class to use. Be more explicit.
this.config = ctx.params as ActiveCPUCountTrackConfig;
}
getTrackShellButtons(): m.Children {
return [m(CloseTrackButton, {
trackKey: this.trackKey,
})];
}
protected getRenderOptions(): RenderOptions {
return {
yBoundaries: 'strict',
yRange: 'viewport',
};
}
async onInit() {
await this.engine.query(
`INCLUDE PERFETTO MODULE sched.thread_level_parallelism`);
return new NullDisposable();
}
getSqlSource() {
const sourceTable = this.config!.cpuType === undefined ?
'sched_active_cpu_count' :
`sched_active_cpu_count_for_core_type(${
sqliteString(this.config!.cpuType)})`;
return `
select
ts,
active_cpu_count as value
from ${sourceTable}
`;
}
}