lttv and lib ltt new compiles
[lttv.git] / ltt / branches / poly / ltt / ltt-private.h
1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Xiangxiu Yang
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16 * MA 02111-1307, USA.
17 */
18
19 #ifndef LTT_PRIVATE_H
20 #define LTT_PRIVATE_H
21
22 #include <glib.h>
23 #include <sys/types.h>
24 #include <ltt/ltt.h>
25
26
27 #ifndef max
28 #define max(a,b) ((a)>(b)?(a):(b))
29 #endif
30
31
32 #define LTT_MAGIC_NUMBER 0x00D6B7ED
33 #define LTT_REV_MAGIC_NUMBER 0xEDB7D600
34
35 #define NSEC_PER_USEC 1000
36
37 #define LTT_PACKED_STRUCT __attribute__ ((packed))
38
39 /* Hardcoded facilities */
40 #define LTT_FACILITY_CORE 0
41
42 /* Hardcoded core events */
43 enum ltt_core_events {
44 LTT_EVENT_FACILITY_LOAD,
45 LTT_EVENT_FACILITY_UNLOAD,
46 LTT_EVENT_STATE_DUMP_FACILITY_LOAD,
47 LTT_EVENT_HEARTBEAT
48 };
49
50
51 #if 0
52 /* enumeration definition */
53
54 typedef enum _BuildinEvent{
55 TRACE_FACILITY_LOAD = 0,
56 TRACE_BLOCK_START = 17,
57 TRACE_BLOCK_END = 18,
58 TRACE_TIME_HEARTBEAT= 19
59 } BuildinEvent;
60
61
62 /* structure definition */
63
64 typedef struct _FacilityLoad{
65 gchar * name;
66 LttChecksum checksum;
67 guint32 base_code;
68 } LTT_PACKED_STRUCT FacilityLoad;
69
70 typedef struct _BlockStart {
71 LttTime time; //Time stamp of this block
72 LttCycleCount cycle_count; //cycle count of the event
73 guint32 block_id; //block id
74 } LTT_PACKED_STRUCT BlockStart;
75
76 typedef struct _BlockEnd {
77 LttTime time; //Time stamp of this block
78 LttCycleCount cycle_count; //cycle count of the event
79 guint32 block_id; //block id
80 } LTT_PACKED_STRUCT BlockEnd;
81 #endif //0
82
83
84 typedef guint8 uint8_t;
85 typedef guint16 uint16_t;
86 typedef guint32 uint32_t;
87 typedef guint64 uint64_t;
88
89 /* Hardcoded facility load event : this plus an following "name" string */
90 struct LttFacilityLoad {
91 guint32 checksum;
92 guint32 id;
93 guint32 long_size;
94 guint32 pointer_size;
95 guint32 size_t_size;
96 guint32 alignment;
97 };
98
99 struct LttFacilityUnload {
100 guint32 id;
101 };
102
103 struct LttStateDumpFacilityLoad {
104 guint32 checksum;
105 guint32 id;
106 guint32 long_size;
107 guint32 pointer_size;
108 guint32 size_t_size;
109 guint32 alignment;
110 };
111
112
113
114 typedef struct _TimeHeartbeat {
115 LttTime time; //Time stamp of this block
116 uint64_t cycle_count; //cycle count of the event
117 } LTT_PACKED_STRUCT TimeHeartbeat;
118
119 struct ltt_event_header_hb {
120 uint32_t timestamp;
121 unsigned char facility_id;
122 unsigned char event_id;
123 uint16_t event_size;
124 } __attribute((aligned(8)));
125
126 struct ltt_event_header_nohb {
127 uint64_t timestamp;
128 unsigned char facility_id;
129 unsigned char event_id;
130 uint16_t event_size;
131 } __attribute((aligned(8)));
132
133 struct ltt_trace_header {
134 uint32_t magic_number;
135 uint32_t arch_type;
136 uint32_t arch_variant;
137 uint8_t arch_size;
138 //uint32_t system_type;
139 uint8_t major_version;
140 uint8_t minor_version;
141 uint8_t flight_recorder;
142 uint8_t has_heartbeat;
143 uint8_t has_alignment; /* Event header alignment */
144 uint8_t has_tsc;
145 } __attribute((aligned(8)));
146
147
148 struct ltt_block_start_header {
149 struct {
150 struct timeval timestamp;
151 uint64_t cycle_count;
152 } begin;
153 struct {
154 struct timeval timestamp;
155 uint64_t cycle_count;
156 } end;
157 uint32_t lost_size; /* Size unused at the end of the buffer */
158 uint32_t buf_size; /* The size of this sub-buffer */
159 struct ltt_trace_header trace;
160 } __attribute((aligned(8)));
161
162
163 struct _LttType{
164 GQuark type_name; //type name if it is a named type
165 GQuark element_name; //elements name of the struct
166 gchar * fmt;
167 unsigned int size;
168 LttTypeEnum type_class; //which type
169 GQuark * enum_strings; //for enum labels
170 struct _LttType ** element_type; //for array, sequence and struct
171 unsigned element_number; //the number of elements
172 //for enum, array, sequence and structure
173 };
174
175 struct _LttEventType{
176 GQuark name;
177 gchar * description;
178 guint index; //id of the event type within the facility
179 LttFacility * facility; //the facility that contains the event type
180 LttField * root_field; //root field
181 };
182
183 /* Structure LttEvent and LttEventPosition must begin with the _exact_ same
184 * fields in the exact same order. LttEventPosition is a parent of LttEvent. */
185 struct _LttEvent{
186
187 /* Begin of LttEventPosition fields */
188 LttTracefile *tracefile;
189 unsigned int block;
190 unsigned int offset;
191
192 /* Timekeeping */
193 uint64_t tsc; /* Current timestamp counter */
194
195 /* End of LttEventPosition fields */
196
197 union { /* choice by trace has_tsc */
198 guint32 timestamp; /* truncated timestamp */
199 LttTime delta;
200 } time;
201
202 unsigned char facility_id; /* facility ID are never reused. */
203 unsigned char event_id;
204
205 LttTime event_time;
206
207 void * data; //event data
208 guint data_size;
209
210 int count; //the number of overflow of cycle count
211 gint64 overflow_nsec; //precalculated nsec for overflows
212 };
213
214 struct _LttEventPosition{
215 LttTracefile *tracefile;
216 unsigned int block;
217 unsigned int offset;
218
219 /* Timekeeping */
220 uint64_t tsc; /* Current timestamp counter */
221 };
222
223
224 enum field_status { FIELD_UNKNOWN, FIELD_VARIABLE, FIELD_FIXED };
225
226 struct _LttField{
227 //guint field_pos; //field position within its parent
228 LttType * field_type; //field type, if it is root field
229 //then it must be struct type
230
231 off_t offset_root; //offset from the root, -1:uninitialized
232 enum field_status fixed_root; //offset fixed according to the root
233 //-1:uninitialized, 0:unfixed, 1:fixed
234 off_t offset_parent; //offset from the parent,-1:uninitialized
235 enum field_status fixed_parent; //offset fixed according to its parent
236 //-1:uninitialized, 0:unfixed, 1:fixed
237 // void * base_address; //base address of the field ????
238
239 guint field_size; // //>0: size of the field,
240 // //0 : uncertain
241 // //-1: uninitialize
242 enum field_status fixed_size;
243
244 /* for sequence */
245 gint sequ_number_size; //the size of unsigned used to save the
246 //number of elements in the sequence
247
248 gint element_size; //the element size of the sequence
249 //int field_fixed; //0: field has string or sequence
250 //1: field has no string or sequenc
251 //-1: uninitialize
252
253 struct _LttField * parent;
254 struct _LttField ** child; //for array, sequence, struct and union:
255 //list of fields, it may have only one
256 //field if the element is not a struct or
257 //union
258 unsigned current_element; //which element is currently processed
259 // Used for sequences and arrays.
260 };
261
262
263 struct _LttFacility{
264 LttTrace *trace;
265 //gchar * name; //facility name
266 GQuark name;
267 guint32 checksum; //checksum of the facility
268 guint32 id; //id of the facility
269
270 guint32 pointer_size;
271 guint32 size_t_size;
272 guint32 alignment;
273
274
275 //LttEventType ** events; //array of event types
276 //unsigned int event_number; //number of events in the facility
277 //LttType ** named_types;
278 //unsigned int named_types_number;
279
280 GArray *events;
281 GData *events_by_name;
282 // GArray *named_types;
283 //GData *named_types_by_name;
284 GData *named_types;
285
286 unsigned char exists; /* 0 does not exist, 1 exists */
287 };
288
289 typedef struct _LttBuffer {
290 void * head;
291 unsigned int index;
292
293 struct {
294 LttTime timestamp;
295 uint64_t cycle_count;
296 } begin;
297 struct {
298 LttTime timestamp;
299 uint64_t cycle_count;
300 } end;
301 uint32_t lost_size; /* Size unused at the end of the buffer */
302
303 /* Timekeeping */
304 uint64_t tsc; /* Current timestamp counter */
305 double nsecs_per_cycle;
306 } LttBuffer;
307
308 struct _LttTracefile{
309 gboolean cpu_online; //is the cpu online ?
310 GQuark name; //tracefile name
311 guint cpu_num; //cpu number of the tracefile
312 LttTrace * trace; //trace containing the tracefile
313 int fd; //file descriptor
314 off_t file_size; //file size
315 unsigned block_size; //block_size
316 unsigned int num_blocks; //number of blocks in the file
317 gboolean reverse_bo; //must we reverse byte order ?
318
319 /* Current event */
320 LttEvent event; //Event currently accessible in the trace
321
322 /* Current block */
323 LttBuffer buffer; //current buffer
324 guint32 buf_size; /* The size of blocks */
325
326 /* Time flow */
327 //unsigned int count; //the number of overflow of cycle count
328 //double nsec_per_cycle; //Nsec per cycle
329 //TimeHeartbeat * last_heartbeat; //last heartbeat
330
331 //LttCycleCount cycles_per_nsec_reciprocal; // Optimisation for speed
332 //void * last_event_pos;
333
334 //LttTime prev_block_end_time; //the end time of previous block
335 //LttTime prev_event_time; //the time of the previous event
336 //LttCycleCount pre_cycle_count; //previous cycle count of the event
337 };
338
339 struct _LttTrace{
340 GQuark pathname; //the pathname of the trace
341 //LttSystemDescription * system_description;//system description
342
343 GArray *facilities_by_num; /* fac_id as index in array */
344 GData *facilities_by_name; /* fac name (GQuark) as index */
345 /* Points to array of fac_id of all the
346 * facilities that has this name. */
347
348 guint8 ltt_major_version;
349 guint8 ltt_minor_version;
350 guint8 flight_recorder;
351 guint8 has_heartbeat;
352 // guint8 alignment;
353 guint8 has_tsc;
354
355 GData *tracefiles; //tracefiles groups
356 };
357
358 /* The characteristics of the system on which the trace was obtained
359 is described in a LttSystemDescription structure. */
360
361 struct _LttSystemDescription {
362 gchar *description;
363 gchar *node_name;
364 gchar *domain_name;
365 unsigned nb_cpu;
366 LttArchSize size;
367 LttArchEndian endian;
368 gchar *kernel_name;
369 gchar *kernel_release;
370 gchar *kernel_version;
371 gchar *machine;
372 gchar *processor;
373 gchar *hardware_platform;
374 gchar *operating_system;
375 LttTime trace_start;
376 LttTime trace_end;
377 };
378
379 /*****************************************************************************
380 macro for size of some data types
381 *****************************************************************************/
382 // alignment -> dynamic!
383
384 //#define TIMESTAMP_SIZE sizeof(guint32)
385 //#define EVENT_ID_SIZE sizeof(guint16)
386 //#define EVENT_HEADER_SIZE (TIMESTAMP_SIZE + EVENT_ID_SIZE)
387
388 #define LTT_GET_BO(t) ((t)->reverse_bo)
389
390
391 #endif /* LTT_PRIVATE_H */
This page took 0.037377 seconds and 4 git commands to generate.