xref: /aosp_15_r20/external/perfetto/ui/src/public/utils.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2023 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker//
3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker//
7*6dbdd20aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker//
9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport {exists} from '../base/utils';
16*6dbdd20aSAndroid Build Coastguard Workerimport {Trace} from './trace';
17*6dbdd20aSAndroid Build Coastguard Workerimport {TimeSpan} from '../base/time';
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Workerexport function getTrackName(
20*6dbdd20aSAndroid Build Coastguard Worker  args: Partial<{
21*6dbdd20aSAndroid Build Coastguard Worker    name: string | null;
22*6dbdd20aSAndroid Build Coastguard Worker    utid: number | null;
23*6dbdd20aSAndroid Build Coastguard Worker    processName: string | null;
24*6dbdd20aSAndroid Build Coastguard Worker    pid: number | null;
25*6dbdd20aSAndroid Build Coastguard Worker    threadName: string | null;
26*6dbdd20aSAndroid Build Coastguard Worker    tid: number | null;
27*6dbdd20aSAndroid Build Coastguard Worker    upid: number | null;
28*6dbdd20aSAndroid Build Coastguard Worker    userName: string | null;
29*6dbdd20aSAndroid Build Coastguard Worker    uid: number | null;
30*6dbdd20aSAndroid Build Coastguard Worker    kind: string;
31*6dbdd20aSAndroid Build Coastguard Worker    threadTrack: boolean;
32*6dbdd20aSAndroid Build Coastguard Worker    uidTrack: boolean;
33*6dbdd20aSAndroid Build Coastguard Worker  }>,
34*6dbdd20aSAndroid Build Coastguard Worker) {
35*6dbdd20aSAndroid Build Coastguard Worker  const {
36*6dbdd20aSAndroid Build Coastguard Worker    name,
37*6dbdd20aSAndroid Build Coastguard Worker    upid,
38*6dbdd20aSAndroid Build Coastguard Worker    utid,
39*6dbdd20aSAndroid Build Coastguard Worker    processName,
40*6dbdd20aSAndroid Build Coastguard Worker    threadName,
41*6dbdd20aSAndroid Build Coastguard Worker    pid,
42*6dbdd20aSAndroid Build Coastguard Worker    tid,
43*6dbdd20aSAndroid Build Coastguard Worker    userName,
44*6dbdd20aSAndroid Build Coastguard Worker    uid,
45*6dbdd20aSAndroid Build Coastguard Worker    kind,
46*6dbdd20aSAndroid Build Coastguard Worker    threadTrack,
47*6dbdd20aSAndroid Build Coastguard Worker    uidTrack,
48*6dbdd20aSAndroid Build Coastguard Worker  } = args;
49*6dbdd20aSAndroid Build Coastguard Worker
50*6dbdd20aSAndroid Build Coastguard Worker  const hasName = name !== undefined && name !== null && name !== '[NULL]';
51*6dbdd20aSAndroid Build Coastguard Worker  const hasUpid = upid !== undefined && upid !== null;
52*6dbdd20aSAndroid Build Coastguard Worker  const hasUtid = utid !== undefined && utid !== null;
53*6dbdd20aSAndroid Build Coastguard Worker  const hasProcessName = processName !== undefined && processName !== null;
54*6dbdd20aSAndroid Build Coastguard Worker  const hasThreadName = threadName !== undefined && threadName !== null;
55*6dbdd20aSAndroid Build Coastguard Worker  const hasUserName = userName !== undefined && userName !== null;
56*6dbdd20aSAndroid Build Coastguard Worker  const hasTid = tid !== undefined && tid !== null;
57*6dbdd20aSAndroid Build Coastguard Worker  const hasPid = pid !== undefined && pid !== null;
58*6dbdd20aSAndroid Build Coastguard Worker  const hasUid = uid !== undefined && uid !== null;
59*6dbdd20aSAndroid Build Coastguard Worker  const hasKind = kind !== undefined;
60*6dbdd20aSAndroid Build Coastguard Worker  const isThreadTrack = threadTrack !== undefined && threadTrack;
61*6dbdd20aSAndroid Build Coastguard Worker  const isUidTrack = uidTrack !== undefined && uidTrack;
62*6dbdd20aSAndroid Build Coastguard Worker
63*6dbdd20aSAndroid Build Coastguard Worker  // If we don't have any useful information (better than
64*6dbdd20aSAndroid Build Coastguard Worker  // upid/utid) we show the track kind to help with tracking
65*6dbdd20aSAndroid Build Coastguard Worker  // down where this is coming from.
66*6dbdd20aSAndroid Build Coastguard Worker  const kindSuffix = hasKind ? ` (${kind})` : '';
67*6dbdd20aSAndroid Build Coastguard Worker
68*6dbdd20aSAndroid Build Coastguard Worker  if (isThreadTrack && hasName && hasTid) {
69*6dbdd20aSAndroid Build Coastguard Worker    return `${name} (${tid})`;
70*6dbdd20aSAndroid Build Coastguard Worker  } else if (isUidTrack && hasName && hasUserName) {
71*6dbdd20aSAndroid Build Coastguard Worker    return `${name} (${userName})`;
72*6dbdd20aSAndroid Build Coastguard Worker  } else if (isUidTrack && hasName && hasUid) {
73*6dbdd20aSAndroid Build Coastguard Worker    return `${name} ${uid}`;
74*6dbdd20aSAndroid Build Coastguard Worker  } else if (hasName) {
75*6dbdd20aSAndroid Build Coastguard Worker    return `${name}`;
76*6dbdd20aSAndroid Build Coastguard Worker  } else if (hasUpid && hasPid && hasProcessName) {
77*6dbdd20aSAndroid Build Coastguard Worker    return `${processName} ${pid}`;
78*6dbdd20aSAndroid Build Coastguard Worker  } else if (hasUpid && hasPid) {
79*6dbdd20aSAndroid Build Coastguard Worker    return `Process ${pid}`;
80*6dbdd20aSAndroid Build Coastguard Worker  } else if (hasThreadName && hasTid) {
81*6dbdd20aSAndroid Build Coastguard Worker    return `${threadName} ${tid}`;
82*6dbdd20aSAndroid Build Coastguard Worker  } else if (hasTid) {
83*6dbdd20aSAndroid Build Coastguard Worker    return `Thread ${tid}`;
84*6dbdd20aSAndroid Build Coastguard Worker  } else if (hasUpid) {
85*6dbdd20aSAndroid Build Coastguard Worker    return `upid: ${upid}${kindSuffix}`;
86*6dbdd20aSAndroid Build Coastguard Worker  } else if (hasUtid) {
87*6dbdd20aSAndroid Build Coastguard Worker    return `utid: ${utid}${kindSuffix}`;
88*6dbdd20aSAndroid Build Coastguard Worker  } else if (hasUid) {
89*6dbdd20aSAndroid Build Coastguard Worker    return `uid: ${uid}${kindSuffix}`;
90*6dbdd20aSAndroid Build Coastguard Worker  } else if (hasKind) {
91*6dbdd20aSAndroid Build Coastguard Worker    return `Unnamed ${kind}`;
92*6dbdd20aSAndroid Build Coastguard Worker  }
93*6dbdd20aSAndroid Build Coastguard Worker  return 'Unknown';
94*6dbdd20aSAndroid Build Coastguard Worker}
95*6dbdd20aSAndroid Build Coastguard Worker
96*6dbdd20aSAndroid Build Coastguard Workerexport function getThreadOrProcUri(
97*6dbdd20aSAndroid Build Coastguard Worker  upid: number | null,
98*6dbdd20aSAndroid Build Coastguard Worker  utid: number | null,
99*6dbdd20aSAndroid Build Coastguard Worker): string {
100*6dbdd20aSAndroid Build Coastguard Worker  if (exists(upid)) {
101*6dbdd20aSAndroid Build Coastguard Worker    return `/process_${upid}`;
102*6dbdd20aSAndroid Build Coastguard Worker  } else if (exists(utid)) {
103*6dbdd20aSAndroid Build Coastguard Worker    return `/thread_${utid}`;
104*6dbdd20aSAndroid Build Coastguard Worker  } else {
105*6dbdd20aSAndroid Build Coastguard Worker    throw new Error('No upid or utid defined...');
106*6dbdd20aSAndroid Build Coastguard Worker  }
107*6dbdd20aSAndroid Build Coastguard Worker}
108*6dbdd20aSAndroid Build Coastguard Worker
109*6dbdd20aSAndroid Build Coastguard Workerexport function getThreadUriPrefix(upid: number | null, utid: number): string {
110*6dbdd20aSAndroid Build Coastguard Worker  if (exists(upid)) {
111*6dbdd20aSAndroid Build Coastguard Worker    return `/process_${upid}/thread_${utid}`;
112*6dbdd20aSAndroid Build Coastguard Worker  } else {
113*6dbdd20aSAndroid Build Coastguard Worker    return `/thread_${utid}`;
114*6dbdd20aSAndroid Build Coastguard Worker  }
115*6dbdd20aSAndroid Build Coastguard Worker}
116*6dbdd20aSAndroid Build Coastguard Worker
117*6dbdd20aSAndroid Build Coastguard Worker// Returns the time span of the current selection, or the visible window if
118*6dbdd20aSAndroid Build Coastguard Worker// there is no current selection.
119*6dbdd20aSAndroid Build Coastguard Workerexport async function getTimeSpanOfSelectionOrVisibleWindow(
120*6dbdd20aSAndroid Build Coastguard Worker  trace: Trace,
121*6dbdd20aSAndroid Build Coastguard Worker): Promise<TimeSpan> {
122*6dbdd20aSAndroid Build Coastguard Worker  const range = await trace.selection.findTimeRangeOfSelection();
123*6dbdd20aSAndroid Build Coastguard Worker  if (exists(range)) {
124*6dbdd20aSAndroid Build Coastguard Worker    return new TimeSpan(range.start, range.end);
125*6dbdd20aSAndroid Build Coastguard Worker  } else {
126*6dbdd20aSAndroid Build Coastguard Worker    return trace.timeline.visibleWindow.toTimeSpan();
127*6dbdd20aSAndroid Build Coastguard Worker  }
128*6dbdd20aSAndroid Build Coastguard Worker}
129