mirror of
https://review.haiku-os.org/haiku
synced 2025-01-31 10:47:14 +01:00
7eb6aafc30
The "-k" argument (which never did anything before) is now inverted compared to what it used to be, i.e. now specifying it will profile kernel frames, too, whereas by default only user frames will be sampled.
237 lines
5.0 KiB
C
237 lines
5.0 KiB
C
/*
|
|
* 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 */
|