blob: eca39b4771943563b406cc722a6c04c6f1db93eb [file] [log] [blame]
// Copyright (C) 2024 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 {
NUM,
Plugin,
PluginContextTrace,
PluginDescriptor,
STR_NULL,
} from '../../public';
import {ASYNC_SLICE_TRACK_KIND} from '../../core_plugins/async_slices';
import {AsyncSliceTrackV2} from '../../core_plugins/async_slices/async_slice_track_v2';
// This plugin renders visualizations of runtime power state transitions for
// Linux kernel devices (devices managed by Linux drivers).
class LinuxKernelDevices implements Plugin {
async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
const result = await ctx.engine.query(`
select
t.id as trackId,
t.name
from linux_device_track t
join _slice_track_summary using (id)
order by t.name;
`);
const it = result.iter({
name: STR_NULL,
trackId: NUM,
});
for (; it.valid(); it.next()) {
const trackId = it.trackId;
const displayName = it.name ?? `${trackId}`;
ctx.registerStaticTrack({
uri: `org.kernel.LinuxKernelDevices#${displayName}`,
displayName,
trackIds: [trackId],
kind: ASYNC_SLICE_TRACK_KIND,
trackFactory: ({trackKey}) => {
return new AsyncSliceTrackV2(
{
engine: ctx.engine,
trackKey,
},
0,
[trackId],
);
},
groupName: `Linux Kernel Devices`,
});
}
}
}
export const plugin: PluginDescriptor = {
pluginId: 'org.kernel.LinuxKernelDevices',
plugin: LinuxKernelDevices,
};