root/headers/private/system/system_profiler_defs.h
/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef _SYSTEM_SYSTEM_PROFILER_DEFS_H
#define _SYSTEM_SYSTEM_PROFILER_DEFS_H


#include <image.h>


struct system_profiler_parameters {
        // general
        area_id         buffer_area;                    // area the events will be written to
        uint32          flags;                                  // flags selecting the events to receive

        // scheduling
        size_t          locking_lookup_size;    // size of the lookup table used for
                                                                                // caching the locking primitive infos

        // sampling
        bigtime_t       interval;                               // interval at which to take samples
        uint32          stack_depth;                    // maximum stack depth to sample
        bool            profile_kernel;                 // sample kernel stack frames
};


// event flags
enum {
        B_SYSTEM_PROFILER_TEAM_EVENTS                   = 0x01,
        B_SYSTEM_PROFILER_THREAD_EVENTS                 = 0x02,
        B_SYSTEM_PROFILER_IMAGE_EVENTS                  = 0x04,
        B_SYSTEM_PROFILER_SAMPLING_EVENTS               = 0x08,
        B_SYSTEM_PROFILER_SCHEDULING_EVENTS             = 0x10,
        B_SYSTEM_PROFILER_IO_SCHEDULING_EVENTS  = 0x20
};


// events
enum {
        // reserved for the user application
        B_SYSTEM_PROFILER_USER_EVENT = 0,

        // ring buffer wrap-around marker
        B_SYSTEM_PROFILER_BUFFER_END,

        // team
        B_SYSTEM_PROFILER_TEAM_ADDED,
        B_SYSTEM_PROFILER_TEAM_REMOVED,
        B_SYSTEM_PROFILER_TEAM_EXEC,

        // thread
        B_SYSTEM_PROFILER_THREAD_ADDED,
        B_SYSTEM_PROFILER_THREAD_REMOVED,

        // image
        B_SYSTEM_PROFILER_IMAGE_ADDED,
        B_SYSTEM_PROFILER_IMAGE_REMOVED,

        // profiling samples
        B_SYSTEM_PROFILER_SAMPLES,

        // scheduling
        B_SYSTEM_PROFILER_THREAD_SCHEDULED,
        B_SYSTEM_PROFILER_THREAD_ENQUEUED_IN_RUN_QUEUE,
        B_SYSTEM_PROFILER_THREAD_REMOVED_FROM_RUN_QUEUE,
        B_SYSTEM_PROFILER_WAIT_OBJECT_INFO,

        // I/O scheduling
        B_SYSTEM_PROFILER_IO_SCHEDULER_ADDED,
        B_SYSTEM_PROFILER_IO_SCHEDULER_REMOVED,
        B_SYSTEM_PROFILER_IO_REQUEST_SCHEDULED,
        B_SYSTEM_PROFILER_IO_REQUEST_FINISHED,
        B_SYSTEM_PROFILER_IO_OPERATION_STARTED,
        B_SYSTEM_PROFILER_IO_OPERATION_FINISHED
};


struct system_profiler_buffer_header {
        size_t  start;
        size_t  size;
};


struct system_profiler_event_header {
        uint8   event;
        uint8   cpu;    // only for B_SYSTEM_PROFILER_SAMPLES
        uint16  size;   // size of the event structure excluding the header
};


// B_SYSTEM_PROFILER_TEAM_ADDED
struct system_profiler_team_added {
        team_id         team;
        uint16          args_offset;
        char            name[1];
};

// B_SYSTEM_PROFILER_TEAM_REMOVED
struct system_profiler_team_removed {
        team_id         team;
};

// B_SYSTEM_PROFILER_TEAM_EXEC
struct system_profiler_team_exec {
        team_id         team;
        char            thread_name[B_OS_NAME_LENGTH];
        char            args[1];
};

// B_SYSTEM_PROFILER_THREAD_ADDED
struct system_profiler_thread_added {
        team_id         team;
        thread_id       thread;
        char            name[B_OS_NAME_LENGTH];
        bigtime_t       cpu_time;
};

// B_SYSTEM_PROFILER_THREAD_REMOVED
struct system_profiler_thread_removed {
        team_id         team;
        thread_id       thread;
        bigtime_t       cpu_time;
};

// B_SYSTEM_PROFILER_IMAGE_ADDED
struct system_profiler_image_added {
        team_id         team;
        image_info      info;
};

// B_SYSTEM_PROFILER_IMAGE_REMOVED
struct system_profiler_image_removed {
        team_id         team;
        image_id        image;
};

// B_SYSTEM_PROFILER_SAMPLES
struct system_profiler_samples {
        thread_id       thread;
        addr_t          samples[0];
};

// base structure for the following three
struct system_profiler_thread_scheduling_event {
        nanotime_t      time;
        thread_id       thread;
};

// B_SYSTEM_PROFILER_THREAD_SCHEDULED
struct system_profiler_thread_scheduled {
        nanotime_t      time;
        thread_id       thread;
        thread_id       previous_thread;
        uint16          previous_thread_state;
        uint16          previous_thread_wait_object_type;
        addr_t          previous_thread_wait_object;
};

// B_SYSTEM_PROFILER_THREAD_ENQUEUED_IN_RUN_QUEUE
struct system_profiler_thread_enqueued_in_run_queue {
        nanotime_t      time;
        thread_id       thread;
        uint8           priority;
};

// B_SYSTEM_PROFILER_THREAD_REMOVED_FROM_RUN_QUEUE
struct system_profiler_thread_removed_from_run_queue {
        nanotime_t      time;
        thread_id       thread;
};

// B_SYSTEM_PROFILER_WAIT_OBJECT_INFO
struct system_profiler_wait_object_info {
        uint32          type;
        addr_t          object;
        addr_t          referenced_object;
        char            name[1];
};

// B_SYSTEM_PROFILER_IO_SCHEDULER_ADDED
struct system_profiler_io_scheduler_added {
        int32           scheduler;
        char            name[1];
};

// B_SYSTEM_PROFILER_IO_SCHEDULER_REMOVED
struct system_profiler_io_scheduler_removed {
        int32           scheduler;
};

// B_SYSTEM_PROFILER_IO_REQUEST_SCHEDULED
struct system_profiler_io_request_scheduled {
        nanotime_t      time;
        int32           scheduler;
        team_id         team;
        thread_id       thread;
        void*           request;
        off_t           offset;
        size_t          length;
        bool            write;
        uint8           priority;
};

// B_SYSTEM_PROFILER_IO_REQUEST_FINISHED
struct system_profiler_io_request_finished {
        nanotime_t      time;
        int32           scheduler;
        void*           request;
        status_t        status;
        size_t          transferred;
};

// B_SYSTEM_PROFILER_IO_OPERATION_STARTED
struct system_profiler_io_operation_started {
        nanotime_t      time;
        int32           scheduler;
        void*           request;
        void*           operation;
        off_t           offset;
        size_t          length;
        bool            write;
};

// B_SYSTEM_PROFILER_IO_OPERATION_FINISHED
struct system_profiler_io_operation_finished {
        nanotime_t      time;
        int32           scheduler;
        void*           request;
        void*           operation;
        status_t        status;
        size_t          transferred;
};


#endif  /* _SYSTEM_SYSTEM_PROFILER_DEFS_H */