syntax = "proto2";
package NV.CpuStacktrace;

enum CpuStacktraceCategory
{
    // Every feature counts Category 0 as invalid. Then the array of categories.size() is always >  1.
    CpuStacktraceCategoryInvalid                = 0;
    CpuStacktraceCategoryCollect                = 1;

    // DO NOT RE-ORDER THESE CATEGORIES
    // Always add a new category at the end.
}

enum CpuStacktraceMethod
{
    // Every feature counts Category 0 as invalid. Then the array of categories.size() is always >  1.
    CpuStacktraceMethodInvalid                      = 0;
    CpuStacktraceMethodCollectStackRequestMessage   = 1;
    CpuStacktraceMethodCollectStackReplyMessage     = 2;

    // DO NOT RE-ORDER THESE CATEGORIES
    // Always add a new category at the end.
}

enum CpuStacktraceType
{
    // Type of stacktrace to collect
    CpuStacktraceTypeInvalid    = 0;
    CpuStacktraceTypeNative     = 1;
    CpuStacktraceTypePython     = 2;
}

message CpuStacktraceCollectStackRequestMessage
{
    message TypeInfo
    {
        optional CpuStacktraceCategory Category = 1 [default = CpuStacktraceCategoryCollect];
        optional CpuStacktraceMethod Method     = 2 [default = CpuStacktraceMethodCollectStackRequestMessage];
    }

    required uint32 ThreadID        = 1;
    optional CpuStacktraceType Type = 2 [default = CpuStacktraceTypeNative];
}

message CpuStacktraceStackFrameMessage
{
    required string ModuleName  = 1;
    required uint64 PC          = 2;
    optional string FileName    = 3;
    optional string FuncName    = 4;
    optional uint32 Line        = 5;
}

message CpuStacktraceStackMessage
{
    repeated CpuStacktraceStackFrameMessage Frames = 1;
    optional CpuStacktraceType                Type = 2 [default = CpuStacktraceTypeNative];
}

enum CpuStacktraceStatus
{
    CpuStacktraceStatusSuccess                      = 0;
    CpuStacktraceStatusUnknownError                 = 1;
    CpuStacktraceStatusCouldNotExecOnThread         = 2;
    CpuStacktraceStatusNativeFailedToGetFrameInfo   = 3;
    CpuStacktraceStatusPythonNotFound               = 4;
    CpuStacktraceStatusPythonNotInitialized         = 5;
    CpuStacktraceStatusPythonInsufficientVersion    = 6;
}

message CpuStacktraceCollectStackReplyMessage
{
    message TypeInfo
    {
        optional CpuStacktraceCategory Category = 1 [default = CpuStacktraceCategoryCollect];
        optional CpuStacktraceMethod Method     = 2 [default = CpuStacktraceMethodCollectStackReplyMessage];
    }

    required CpuStacktraceStackMessage Stack = 1;
    optional CpuStacktraceStatus Status      = 2 [default = CpuStacktraceStatusSuccess];
}
