xref: /aosp_15_r20/external/perfetto/ui/src/frontend/task_tracker.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2020 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 Workerinterface PromiseInfo {
16*6dbdd20aSAndroid Build Coastguard Worker  startTimeMs: number;
17*6dbdd20aSAndroid Build Coastguard Worker  message: string;
18*6dbdd20aSAndroid Build Coastguard Worker}
19*6dbdd20aSAndroid Build Coastguard Worker
20*6dbdd20aSAndroid Build Coastguard Workerexport class TaskTracker {
21*6dbdd20aSAndroid Build Coastguard Worker  private promisesSeen: number;
22*6dbdd20aSAndroid Build Coastguard Worker  private promisesRejected: number;
23*6dbdd20aSAndroid Build Coastguard Worker  private promisesFulfilled: number;
24*6dbdd20aSAndroid Build Coastguard Worker  private promiseInfo: Map<Promise<unknown>, PromiseInfo>;
25*6dbdd20aSAndroid Build Coastguard Worker
26*6dbdd20aSAndroid Build Coastguard Worker  constructor() {
27*6dbdd20aSAndroid Build Coastguard Worker    this.promisesSeen = 0;
28*6dbdd20aSAndroid Build Coastguard Worker    this.promisesRejected = 0;
29*6dbdd20aSAndroid Build Coastguard Worker    this.promisesFulfilled = 0;
30*6dbdd20aSAndroid Build Coastguard Worker    this.promiseInfo = new Map();
31*6dbdd20aSAndroid Build Coastguard Worker  }
32*6dbdd20aSAndroid Build Coastguard Worker
33*6dbdd20aSAndroid Build Coastguard Worker  trackPromise(promise: Promise<unknown>, message: string): void {
34*6dbdd20aSAndroid Build Coastguard Worker    this.promiseInfo.set(promise, {
35*6dbdd20aSAndroid Build Coastguard Worker      startTimeMs: new Date().getMilliseconds(),
36*6dbdd20aSAndroid Build Coastguard Worker      message,
37*6dbdd20aSAndroid Build Coastguard Worker    });
38*6dbdd20aSAndroid Build Coastguard Worker    this.promisesSeen += 1;
39*6dbdd20aSAndroid Build Coastguard Worker    promise
40*6dbdd20aSAndroid Build Coastguard Worker      .then(() => {
41*6dbdd20aSAndroid Build Coastguard Worker        this.promisesFulfilled += 1;
42*6dbdd20aSAndroid Build Coastguard Worker      })
43*6dbdd20aSAndroid Build Coastguard Worker      .catch(() => {
44*6dbdd20aSAndroid Build Coastguard Worker        this.promisesRejected += 1;
45*6dbdd20aSAndroid Build Coastguard Worker      })
46*6dbdd20aSAndroid Build Coastguard Worker      .finally(() => {
47*6dbdd20aSAndroid Build Coastguard Worker        this.promiseInfo.delete(promise);
48*6dbdd20aSAndroid Build Coastguard Worker      });
49*6dbdd20aSAndroid Build Coastguard Worker  }
50*6dbdd20aSAndroid Build Coastguard Worker
51*6dbdd20aSAndroid Build Coastguard Worker  hasPendingTasks(): boolean {
52*6dbdd20aSAndroid Build Coastguard Worker    return this.promisesSeen > this.promisesFulfilled + this.promisesRejected;
53*6dbdd20aSAndroid Build Coastguard Worker  }
54*6dbdd20aSAndroid Build Coastguard Worker
55*6dbdd20aSAndroid Build Coastguard Worker  progressMessage(): string | undefined {
56*6dbdd20aSAndroid Build Coastguard Worker    const {value} = this.promiseInfo.values().next();
57*6dbdd20aSAndroid Build Coastguard Worker    if (value === undefined) {
58*6dbdd20aSAndroid Build Coastguard Worker      return value;
59*6dbdd20aSAndroid Build Coastguard Worker    } else {
60*6dbdd20aSAndroid Build Coastguard Worker      const nowMs = new Date().getMilliseconds();
61*6dbdd20aSAndroid Build Coastguard Worker      const runtimeSeconds = Math.round((nowMs - value.startTimeMs) / 1000);
62*6dbdd20aSAndroid Build Coastguard Worker      return `${value.message} (${runtimeSeconds}s)`;
63*6dbdd20aSAndroid Build Coastguard Worker    }
64*6dbdd20aSAndroid Build Coastguard Worker  }
65*6dbdd20aSAndroid Build Coastguard Worker}
66*6dbdd20aSAndroid Build Coastguard Worker
67*6dbdd20aSAndroid Build Coastguard Workerexport const taskTracker = new TaskTracker();
68