/*
 * 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.
 */

syntax = "proto2";

package perfetto.protos;

import "protos/perfetto/metrics/android/process_metadata.proto";

// Blocking calls inside Android CUJs. Shows count and total duration for each.
message AndroidBlockingCallsCujMetric {
  repeated Cuj cuj = 1;

  // Next id: 7
  message Cuj {
    // ID of the CUJ that is unique within the trace.
    optional int32 id = 1;

    // Name of the CUJ, extracted from the CUJ jank or latency trace marker.
    // For example SHADE_EXPAND_COLLAPSE from J<SHADE_EXPAND_COLLAPSE>.
    optional string name = 2;

    // Details about the process (uid, version, etc)
    optional AndroidProcessMetadata process = 3;

    // ts of the CUJ trace marker slice, in ns.
    optional int64 ts = 4;

    // dur of the CUJ trace marker slice, in ns.
    optional int64 dur = 5;

    // List of blocking calls on the process main thread.
    repeated BlockingCall blocking_calls = 6;
  }

  // Blocking call on the main thread.
  message BlockingCall {
    // Name of the blocking call
    optional string name = 1;
    // Number of times it happened within the CUJ
    optional int64 cnt = 2;
    // Total duration within the CUJ
    optional int64 total_dur_ms = 3;
    // Maximal duration within the CUJ
    optional int64 max_dur_ms = 4;
    // Minimal duration within the CUJ
    optional int64 min_dur_ms = 5;
  }
}
