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

option java_multiple_files = true;
option java_outer_classname = "ProcrankProto";

package android.os;

//Memory usage of running processes
message Procrank {
    // Currently running process
    repeated ProcessProto processes = 1;

    // Summary
    SummaryProto summary = 2;
}

// Next Tag: 11
message ProcessProto {
    // ID of the process
    int32 pid = 1;

    // virtual set size, unit KB
    int64 vss = 2;

    // resident set size, unit KB
    int64 rss = 3;

    // proportional set size, unit KB
    int64 pss = 4;

    // unique set size, unit KB
    int64 uss = 5;

    // swap size, unit KB
    int64 swap = 6;

    // proportional swap size, unit KB
    int64 pswap = 7;

    // unique swap size, unit KB
    int64 uswap = 8;

    // zswap size, unit KB
    int64 zswap = 9;

    // process command
    string cmdline = 10;
}

// Next Tag: 3
message SummaryProto {
    ProcessProto total = 1;

    ZramProto zram = 2;

    RamProto ram = 3;
}

// TODO: sync on how to use these values
message ZramProto {
    string raw_text = 1;
}

message RamProto {
    string raw_text = 1;
}
