//===-- ActivitySPI.h -------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//===----------------------------------------------------------------------===//

#ifndef __GenealogySPI_h__
#define __GenealogySPI_h__

#include <xpc/xpc.h>

typedef void *os_activity_process_list_t;
typedef void *os_activity_list_t;
typedef void *os_trace_message_list_t;
typedef struct os_activity_watch_s *os_activity_watch_t;
typedef uint64_t os_activity_t;

struct os_activity_breadcrumb_s {
        uint32_t breadcrumb_id;
        uint64_t activity_id;
        uint64_t timestamp;
        const char *name;
};

typedef struct os_activity_breadcrumb_s *os_activity_breadcrumb_t;

typedef struct os_trace_message_s {
        uint64_t trace_id;
        uint64_t thread;
        uint64_t timestamp;
        uint32_t offset;
        xpc_object_t __unsafe_unretained payload;
        const uint8_t *image_uuid;
        const char *image_path;
        const char *format;
        const void *buffer;
        size_t bufferLen;
} *os_trace_message_t;

typedef struct os_activity_process_s {
        os_activity_process_list_t child_procs;
        os_trace_message_list_t messages;
        os_activity_list_t activities;
        void *breadcrumbs;
        uint64_t proc_id;
        const uint8_t *image_uuid;
        const char *image_path;
        pid_t pid;
} *os_activity_process_t;

typedef struct os_activity_entry_s {
        uint64_t activity_start;
        os_activity_t activity_id;
        os_activity_t parent_id;
        const char *activity_name;
        const char *reason;
        os_trace_message_list_t messages;
} *os_activity_entry_t;

enum 
{
    OS_ACTIVITY_DIAGNOSTIC_DEFAULT = 0x00000000,
    OS_ACTIVITY_DIAGNOSTIC_PROCESS_ONLY = 0x00000001,
    OS_ACTIVITY_DIAGNOSTIC_SKIP_DECODE = 0x00000002,
    OS_ACTIVITY_DIAGNOSTIC_FLATTENED = 0x00000004,
    OS_ACTIVITY_DIAGNOSTIC_ALL_ACTIVITIES = 0x00000008,
    OS_ACTIVITY_DIAGNOSTIC_MAX = 0x0000000f
};
typedef uint32_t os_activity_diagnostic_flag_t;

enum
{
    OS_ACTIVITY_WATCH_DEFAULT = 0x00000000,
    OS_ACTIVITY_WATCH_PROCESS_ONLY = 0x00000001,
    OS_ACTIVITY_WATCH_SKIP_DECODE = 0x00000002,
    OS_ACTIVITY_WATCH_PAYLOAD = 0x00000004,
    OS_ACTIVITY_WATCH_ERRORS = 0x00000008,
    OS_ACTIVITY_WATCH_FAULTS = 0x00000010,
    OS_ACTIVITY_WATCH_MAX = 0x0000001f
};
typedef uint32_t os_activity_watch_flag_t;

// Return values from os_trace_get_type()
#define OS_TRACE_TYPE_RELEASE (1u << 0)
#define OS_TRACE_TYPE_DEBUG (1u << 1)
#define OS_TRACE_TYPE_ERROR ((1u << 6) | (1u << 0))
#define OS_TRACE_TYPE_FAULT ((1u << 7) | (1u << 6) | (1u << 0))


typedef void (^os_activity_watch_block_t)(os_activity_watch_t watch, os_activity_process_t process_info, bool canceled);
typedef void (^os_diagnostic_block_t)(os_activity_process_list_t processes, int error);

#endif

