1/* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _SYSTEM_SYSTEM_PROFILER_DEFS_H 6#define _SYSTEM_SYSTEM_PROFILER_DEFS_H 7 8 9#include <image.h> 10 11 12struct system_profiler_parameters { 13 // general 14 area_id buffer_area; // area the events will be written to 15 uint32 flags; // flags selecting the events to receive 16 17 // scheduling 18 size_t locking_lookup_size; // size of the lookup table used for 19 // caching the locking primitive infos 20 21 // sampling 22 bigtime_t interval; // interval at which to take samples 23 uint32 stack_depth; // maximum stack depth to sample 24}; 25 26 27// event flags 28enum { 29 B_SYSTEM_PROFILER_TEAM_EVENTS = 0x01, 30 B_SYSTEM_PROFILER_THREAD_EVENTS = 0x02, 31 B_SYSTEM_PROFILER_IMAGE_EVENTS = 0x04, 32 B_SYSTEM_PROFILER_SAMPLING_EVENTS = 0x08, 33 B_SYSTEM_PROFILER_SCHEDULING_EVENTS = 0x10, 34 B_SYSTEM_PROFILER_IO_SCHEDULING_EVENTS = 0x20 35}; 36 37 38// events 39enum { 40 // reserved for the user application 41 B_SYSTEM_PROFILER_USER_EVENT = 0, 42 43 // ring buffer wrap-around marker 44 B_SYSTEM_PROFILER_BUFFER_END, 45 46 // team 47 B_SYSTEM_PROFILER_TEAM_ADDED, 48 B_SYSTEM_PROFILER_TEAM_REMOVED, 49 B_SYSTEM_PROFILER_TEAM_EXEC, 50 51 // thread 52 B_SYSTEM_PROFILER_THREAD_ADDED, 53 B_SYSTEM_PROFILER_THREAD_REMOVED, 54 55 // image 56 B_SYSTEM_PROFILER_IMAGE_ADDED, 57 B_SYSTEM_PROFILER_IMAGE_REMOVED, 58 59 // profiling samples 60 B_SYSTEM_PROFILER_SAMPLES, 61 62 // scheduling 63 B_SYSTEM_PROFILER_THREAD_SCHEDULED, 64 B_SYSTEM_PROFILER_THREAD_ENQUEUED_IN_RUN_QUEUE, 65 B_SYSTEM_PROFILER_THREAD_REMOVED_FROM_RUN_QUEUE, 66 B_SYSTEM_PROFILER_WAIT_OBJECT_INFO, 67 68 // I/O scheduling 69 B_SYSTEM_PROFILER_IO_SCHEDULER_ADDED, 70 B_SYSTEM_PROFILER_IO_SCHEDULER_REMOVED, 71 B_SYSTEM_PROFILER_IO_REQUEST_SCHEDULED, 72 B_SYSTEM_PROFILER_IO_REQUEST_FINISHED, 73 B_SYSTEM_PROFILER_IO_OPERATION_STARTED, 74 B_SYSTEM_PROFILER_IO_OPERATION_FINISHED 75}; 76 77 78struct system_profiler_buffer_header { 79 size_t start; 80 size_t size; 81}; 82 83 84struct system_profiler_event_header { 85 uint8 event; 86 uint8 cpu; // only for B_SYSTEM_PROFILER_SAMPLES 87 uint16 size; // size of the event structure excluding the header 88}; 89 90 91// B_SYSTEM_PROFILER_TEAM_ADDED 92struct system_profiler_team_added { 93 team_id team; 94 uint16 args_offset; 95 char name[1]; 96}; 97 98// B_SYSTEM_PROFILER_TEAM_REMOVED 99struct system_profiler_team_removed { 100 team_id team; 101}; 102 103// B_SYSTEM_PROFILER_TEAM_EXEC 104struct system_profiler_team_exec { 105 team_id team; 106 char thread_name[B_OS_NAME_LENGTH]; 107 char args[1]; 108}; 109 110// B_SYSTEM_PROFILER_THREAD_ADDED 111struct system_profiler_thread_added { 112 team_id team; 113 thread_id thread; 114 char name[B_OS_NAME_LENGTH]; 115}; 116 117// B_SYSTEM_PROFILER_THREAD_REMOVED 118struct system_profiler_thread_removed { 119 team_id team; 120 thread_id thread; 121}; 122 123// B_SYSTEM_PROFILER_IMAGE_ADDED 124struct system_profiler_image_added { 125 team_id team; 126 image_info info; 127}; 128 129// B_SYSTEM_PROFILER_IMAGE_REMOVED 130struct system_profiler_image_removed { 131 team_id team; 132 image_id image; 133}; 134 135// B_SYSTEM_PROFILER_SAMPLES 136struct system_profiler_samples { 137 thread_id thread; 138 addr_t samples[0]; 139}; 140 141// base structure for the following three 142struct system_profiler_thread_scheduling_event { 143 nanotime_t time; 144 thread_id thread; 145}; 146 147// B_SYSTEM_PROFILER_THREAD_SCHEDULED 148struct system_profiler_thread_scheduled { 149 nanotime_t time; 150 thread_id thread; 151 thread_id previous_thread; 152 uint16 previous_thread_state; 153 uint16 previous_thread_wait_object_type; 154 addr_t previous_thread_wait_object; 155}; 156 157// B_SYSTEM_PROFILER_THREAD_ENQUEUED_IN_RUN_QUEUE 158struct system_profiler_thread_enqueued_in_run_queue { 159 nanotime_t time; 160 thread_id thread; 161 uint8 priority; 162}; 163 164// B_SYSTEM_PROFILER_THREAD_REMOVED_FROM_RUN_QUEUE 165struct system_profiler_thread_removed_from_run_queue { 166 nanotime_t time; 167 thread_id thread; 168}; 169 170// B_SYSTEM_PROFILER_WAIT_OBJECT_INFO 171struct system_profiler_wait_object_info { 172 uint32 type; 173 addr_t object; 174 addr_t referenced_object; 175 char name[1]; 176}; 177 178// B_SYSTEM_PROFILER_IO_SCHEDULER_ADDED 179struct system_profiler_io_scheduler_added { 180 int32 scheduler; 181 char name[1]; 182}; 183 184// B_SYSTEM_PROFILER_IO_SCHEDULER_REMOVED 185struct system_profiler_io_scheduler_removed { 186 int32 scheduler; 187}; 188 189// B_SYSTEM_PROFILER_IO_REQUEST_SCHEDULED 190struct system_profiler_io_request_scheduled { 191 nanotime_t time; 192 int32 scheduler; 193 team_id team; 194 thread_id thread; 195 void* request; 196 off_t offset; 197 size_t length; 198 bool write; 199 uint8 priority; 200}; 201 202// B_SYSTEM_PROFILER_IO_REQUEST_FINISHED 203struct system_profiler_io_request_finished { 204 nanotime_t time; 205 int32 scheduler; 206 void* request; 207 status_t status; 208 size_t transferred; 209}; 210 211// B_SYSTEM_PROFILER_IO_OPERATION_STARTED 212struct system_profiler_io_operation_started { 213 nanotime_t time; 214 int32 scheduler; 215 void* request; 216 void* operation; 217 off_t offset; 218 size_t length; 219 bool write; 220}; 221 222// B_SYSTEM_PROFILER_IO_OPERATION_FINISHED 223struct system_profiler_io_operation_finished { 224 nanotime_t time; 225 int32 scheduler; 226 void* request; 227 void* operation; 228 status_t status; 229 size_t transferred; 230}; 231 232 233#endif /* _SYSTEM_SYSTEM_PROFILER_DEFS_H */ 234