// 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 {exists} from '../base/utils'; import {Trace} from './trace'; import {TimeSpan} from '../base/time'; export function getTrackName( args: Partial<{ name: string | null; utid: number | null; processName: string | null; pid: number | null; threadName: string | null; tid: number | null; upid: number | null; userName: string | null; uid: number | null; kind: string; threadTrack: boolean; uidTrack: boolean; }>, ) { const { name, upid, utid, processName, threadName, pid, tid, userName, uid, kind, threadTrack, uidTrack, } = args; const hasName = name !== undefined && name !== null && name !== '[NULL]'; const hasUpid = upid !== undefined && upid !== null; const hasUtid = utid !== undefined && utid !== null; const hasProcessName = processName !== undefined && processName !== null; const hasThreadName = threadName !== undefined && threadName !== null; const hasUserName = userName !== undefined && userName !== null; const hasTid = tid !== undefined && tid !== null; const hasPid = pid !== undefined && pid !== null; const hasUid = uid !== undefined && uid !== null; const hasKind = kind !== undefined; const isThreadTrack = threadTrack !== undefined && threadTrack; const isUidTrack = uidTrack !== undefined && uidTrack; // If we don't have any useful information (better than // upid/utid) we show the track kind to help with tracking // down where this is coming from. const kindSuffix = hasKind ? ` (${kind})` : ''; if (isThreadTrack && hasName && hasTid) { return `${name} (${tid})`; } else if (isUidTrack && hasName && hasUserName) { return `${name} (${userName})`; } else if (isUidTrack && hasName && hasUid) { return `${name} ${uid}`; } else if (hasName) { return `${name}`; } else if (hasUpid && hasPid && hasProcessName) { return `${processName} ${pid}`; } else if (hasUpid && hasPid) { return `Process ${pid}`; } else if (hasThreadName && hasTid) { return `${threadName} ${tid}`; } else if (hasTid) { return `Thread ${tid}`; } else if (hasUpid) { return `upid: ${upid}${kindSuffix}`; } else if (hasUtid) { return `utid: ${utid}${kindSuffix}`; } else if (hasUid) { return `uid: ${uid}${kindSuffix}`; } else if (hasKind) { return `Unnamed ${kind}`; } return 'Unknown'; } export function getThreadOrProcUri( upid: number | null, utid: number | null, ): string { if (exists(upid)) { return `/process_${upid}`; } else if (exists(utid)) { return `/thread_${utid}`; } else { throw new Error('No upid or utid defined...'); } } export function getThreadUriPrefix(upid: number | null, utid: number): string { if (exists(upid)) { return `/process_${upid}/thread_${utid}`; } else { return `/thread_${utid}`; } } // Returns the time span of the current selection, or the visible window if // there is no current selection. export async function getTimeSpanOfSelectionOrVisibleWindow( trace: Trace, ): Promise { const range = await trace.selection.findTimeRangeOfSelection(); if (exists(range)) { return new TimeSpan(range.start, range.end); } else { return trace.timeline.visibleWindow.toTimeSpan(); } }