blob: c45740814f0c6da2c4284331da1a5388caed7509 [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 m from 'mithril';
import {Tab} from '../public/tab';
import {Upid} from '../trace_processor/sql_utils/core_types';
import {DetailsShell} from '../widgets/details_shell';
import {GridLayout, GridLayoutColumn} from '../widgets/grid_layout';
import {Section} from '../widgets/section';
import {Details, DetailsSchema} from './widgets/sql/details/details';
import d = DetailsSchema;
import {Trace} from '../public/trace';
export class ProcessDetailsTab implements Tab {
private data: Details;
// TODO(altimin): Ideally, we would not require the pid to be passed in, but
// fetch it from the underlying data instead.
//
// However, the only place which creates `ProcessDetailsTab` currently is `renderProcessRef`,
// which already has `pid` available (note that Details is already fetching the data, including
// the `pid` from the trace processor, but it doesn't expose it for now).
constructor(private args: {trace: Trace; upid: Upid; pid?: number}) {
this.data = new Details(args.trace, 'process', args.upid, {
'pid': d.Value('pid'),
'Name': d.Value('name'),
'Start time': d.Timestamp('start_ts', {skipIfNull: true}),
'End time': d.Timestamp('end_ts', {skipIfNull: true}),
'Parent process': d.SqlIdRef('process', 'parent_upid', {
skipIfNull: true,
}),
'User ID': d.Value('uid', {skipIfNull: true}),
'Android app ID': d.Value('android_appid', {skipIfNull: true}),
'Command line': d.Value('cmdline', {skipIfNull: true}),
'Machine id': d.Value('machine_id', {skipIfNull: true}),
'Args': d.ArgSetId('arg_set_id'),
});
}
render() {
return m(
DetailsShell,
{
title: this.getTitle(),
},
m(
GridLayout,
m(GridLayoutColumn, m(Section, {title: 'Details'}, this.data.render())),
),
);
}
getTitle(): string {
if (this.args.pid !== undefined) {
return `Process ${this.args.pid}`;
}
return `Process upid:${this.args.upid}`;
}
}