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