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

option java_multiple_files = true;

import "frameworks/base/core/proto/android/privacy.proto";

package android.os;

/**
 * Data structure of the linux command
 * 'top -b -n 1 -H -s 6 -o pid,tid,user,pr,ni,%cpu,s,virt,res,pcy,cmd,name'
 *
 * Next Tag: 6
 */
message CpuInfoProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    message TaskStats {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional int32 total = 1;    // total number of cpu tasks
        optional int32 running = 2;  // number of running tasks
        optional int32 sleeping = 3; // number of sleeping tasks
        optional int32 stopped = 4;  // number of stopped tasks
        optional int32 zombie = 5;   // number of zombie tasks
    }
    optional TaskStats task_stats = 1;

    message MemStats { // unit in kB
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional int32 total = 1;
        optional int32 used = 2;
        optional int32 free = 3;
        optional int32 buffers = 4;
        optional int32 cached = 5;
    }
    optional MemStats mem = 2;
    optional MemStats swap = 3;

    message CpuUsage { // unit is percentage %
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional int32 cpu = 1;   // 400% cpu indicates 4 cores
        optional int32 user = 2;
        optional int32 nice = 3;
        optional int32 sys = 4;
        optional int32 idle = 5;
        optional int32 iow = 6;
        optional int32 irq = 7;
        optional int32 sirq = 8;
        optional int32 host = 9;
    }
    optional CpuUsage cpu_usage = 4;

    // Next Tag: 13
    message Task {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional int32 pid = 1;
        optional int32 tid = 2;
        optional string user = 3;   // the process name which uses cpu
        optional string pr = 4;     // priority of each task, using string type is because special value RT (real time)
        optional sint32 ni = 5;     // niceness value
        optional float cpu = 6;     // precentage of cpu usage of the task

        enum Status {
            STATUS_UNKNOWN = 0;
            STATUS_D = 1;  // uninterruptible sleep
            STATUS_R = 2;  // running
            STATUS_S = 3;  // sleeping
            STATUS_T = 4;  // traced or stopped
            STATUS_Z = 5;  // zombie
        }
        optional Status s = 7;      // process status
        optional string virt = 8;   // virtual memory size, i.e. 14.0G, 13.5M
        optional string res = 9;    // Resident size, i.e. 0, 3.1G

        // How Android memory manager will treat the task.
        // TODO: use PsDumpProto.Process.Policy instead once we extern variables
        // and are able to include the same .h file in two files.
        enum Policy {
            POLICY_UNKNOWN = 0;
            POLICY_fg = 1;  // foreground, the name is lower case for parsing the value
            POLICY_bg = 2;  // background, the name is lower case for parsing the value
            POLICY_ta = 3;  // TODO: figure out what is this value
        }
        optional Policy pcy = 10;   // Policy of the task
        optional string cmd = 11;   // thread name
        optional string name = 12;  // program name
    }
    repeated Task tasks = 5;
}
