/*
 * Copyright (C) 2022 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;

// This metric provides information about the monitor contention graph in a
// trace
message AndroidMonitorContentionMetric {
  message Node {
    optional int64 node_parent_id = 1;
    optional int64 node_id = 2;
    optional int64 ts = 3;
    optional int64 dur = 4;
    optional string blocking_method = 5;
    optional string blocked_method = 6;
    optional string short_blocking_method = 7;
    optional string short_blocked_method = 8;
    optional string blocking_src = 9;
    optional string blocked_src = 10;
    optional uint32 waiter_count = 11;
    optional string blocked_thread_name = 12;
    optional string blocking_thread_name = 13;
    optional string process_name = 14;
    optional bool is_blocked_thread_main = 15;
    optional bool is_blocking_thread_main = 16;
    optional int64 binder_reply_ts = 17;
    optional uint32 binder_reply_tid = 18;

    repeated ThreadStateBreakdown thread_states = 19;
    repeated BlockedFunctionBreakdown blocked_functions = 20;
  }

  message ThreadStateBreakdown {
    optional string thread_state = 1;
    optional int64 thread_state_dur = 2;
    optional int64 thread_state_count = 3;
  }

  message BlockedFunctionBreakdown {
    optional string blocked_function = 1;
    optional int64 blocked_function_dur = 2;
    optional int64 blocked_function_count = 3;
  }

  repeated Node node = 1;
}
