#pragma once
#include <stdint.h>

#ifndef PY_TRACING_BUFFER_SIZE
#define PY_TRACING_BUFFER_SIZE 512
#define PY_TRACING_MAX_THREADS 256
#endif
#define PY_TRACING_READY_POOL 0
#define PY_TRACING_EMPTY_POOL 1
#define PY_TRACING_GC 0
#define PY_DATALOADER 1

#define MAX_STACK_DEPTH 32
#define MAX_STACK_FRAME_LENGTH 256

typedef enum {
    PAYLOAD_UNINITIALIZED = 0,
    PAYLOAD_GC = 1,
} PayloadType;

typedef enum {
    UNKNOWN = 0,
    DATALOADER,
    FORWARD,
    BACKWARD,
    SYNCHRONIZATION,
    GC,
} Stagetype;

typedef union {
    int gc_debug[2];
} Payload;

typedef struct {
    uint64_t start;
    uint64_t end;
    uint32_t count;
    uint32_t stage_id;
    Stagetype stage_type;
    Payload payload;
    PayloadType type;
    char stack_info[MAX_STACK_DEPTH][256];
    int stack_depth;
} PyTorchTracingData;

typedef struct {
    PyTorchTracingData data[PY_TRACING_BUFFER_SIZE];
    uint64_t cur;
} PyTorchTracingDataArray;