1 #define LTT_PACKED_STRUCT __attribute__ ((packed))
2 #define TRACER_MAGIC_NUMBER 0x00D6B7ED /* That day marks an important historical event ... */
5 void freeFacilities(); //not implimented yet
8 //following part is for event reading API
9 typedef struct _trace_header_event
{
10 //information of the machine type
11 uint32_t arch_type
; /* Type of architecture */
12 uint32_t arch_variant
; /* Variant of the given type of architecture */
13 uint32_t system_type
; /* Operating system type */
14 uint32_t magic_number
; /* Magic number to identify a trace */
17 uint8_t time_size
; /* time size */
18 uint8_t time_granul
; /* time granularity */
19 uint8_t id_size
; /* size of combined facility/event ids */
22 uint32_t ip_addr
; /* IP of the machine */
23 uint8_t nbCpu
; /* number of CPU */
24 uint8_t cpuID
; /* cpu id */
25 uint32_t buffer_size
; /* Size of blocks */
26 } LTT_PACKED_STRUCT trace_header_event
;
29 typedef struct _block_header
{
30 struct timeval time
; /* Time stamp of this block */
31 uint32_t tsc
; /* TSC of this block, if applicable */
32 uint32_t time_delta
; /* Time between now and prev event */
33 uint32_t event_count
; /* event count */
34 } LTT_PACKED_STRUCT block_header
;
37 typedef struct _block_footer
{
38 uint32_t unused_bytes
; /* unused bytes at the end of the block */
39 struct timeval time
; /* Time stamp of this block */
40 uint32_t tsc
; /* TSC of this block, if applicable */
41 uint32_t time_delta
; /* Time between now and prev event */
42 } LTT_PACKED_STRUCT block_footer
;
45 typedef struct _ltt_descriptor
{
46 int fd
; /* file descriptor */
47 off_t file_size
; /* file size */
48 int nbBlocks
; /* number of blocks in the file */
49 int which_block
; /* which block the current block is */
50 int which_event
; /* which event of the current block is currently processed */
51 uint32_t current_event_time
; /* time of the current event */
52 trace_header_event
* trace_header
; /* the first event in the first block */
53 block_header
* a_block_header
; /* block header of the block*/
54 block_footer
* a_block_footer
; /* block footer of the block*/
55 void * first_event_pos
; /* the position of the first event in blockBuf */
56 void * cur_event_pos
; /* the position of the current event in blockBuf */
57 void * buffer
; /* the buffer to contain the content of the block */
58 int byte_rev
; /* Byte-reverse trace data */
59 double TSCPerUsec
; /* Cycles per usec */
62 typedef struct _field_handle
{
63 char * name
; /* field name */
64 data_type field_type
; /* field type : integer, float, string, enum, array, sequence */
65 int size
; /* number of bytes for a primitive type */
66 data_type element_type
; /* element type for array or sequence */
67 int nbElements
; /* number of fields for a struct, and of elements for array or sequence */
68 int sequence_size
; /* the length size of uint which stores the number of elements of the sequence */
69 char * fmt
; /* printf format string for primitive type */
70 off_t offset
; /* offset from the beginning of the current event */
71 off_t end_field
; /* end of the field: offset of the next field */
74 typedef struct _event_handle
{
75 char * name
; /* event name */
76 int id
; /* event code */
77 int size_fixed
; /* indicate whether or not the event has string or sequence */
78 sequence base_field
; /* base field */
79 int latest_block
; /* the latest block which uses the event handle */
80 int latest_event
; /* the latest event which uses the event handle */
84 typedef struct _facility_handle
{
85 char * name
; /* facility name */
86 int nbEvents
; /* number of events in the facility */
87 unsigned long checksum
; /* checksum of the facility */
88 event_handle
** events
; /* array of event types */
92 typedef struct _event_struct
{
93 int recid
; /* event position in the combined log */
94 struct timeval time
; /* detailed absolute time */
95 uint32_t tsc
; /* TSC of this event */
96 facility_handle
* fHandle
; /* facility handle */
97 int event_id
; /* id of a event belonging to the facility */
98 // event_handle * event_type; /* event handle */
99 uint32_t ip_addr
; /* IP address of the system */
100 uint8_t CPU_id
; /* CPU id */
101 int tid
; /* thread id */
102 int pid
; /* process id */
103 sequence
* base_field
; /* base field */
104 void * data
; /* event binary data */
108 typedef struct _kernel_facility
{
109 char * name
; /* kernel name */
110 unsigned long checksum
; /* checksum of the facility */
111 int nbEvents
; /* number of events in the facility */
112 int firstId
; /* the ID of the first event of the facility */
116 void parseEventAndTypeDefinition(char * facilityName
);
117 void generateFacilityHandle(char * facName
, unsigned long checksum
, sequence
* events
);
118 int getTypeSize(data_type dt
, int index
);
121 int getFacilitiesNumber(int * numFac
, int * numEvents
); //get the number of the registered faciliyies
122 int getFacilitiesFromKernel(kernel_facility
** kFacilities
);
123 int readFile(int fd
, void * buf
, size_t size
, char * mesg
);
124 int readBlock(ltt_descriptor
* lttdes
, int whichBlock
);
125 void updateLttdes(ltt_descriptor
* lttdes
);
126 void getTSCPerUsec(ltt_descriptor
* lttdes
);
127 void getEventTime(ltt_descriptor
* lttdes
, uint32_t time_delta
, struct timeval
* pTime
);
129 ltt_descriptor
* trace_open_log(char * fileName
);
130 int trace_seek(ltt_descriptor
* lttdes
, off_t offset
, int whence
);
131 int trace_seek_time(ltt_descriptor
* lttdes
, uint32_t offset
, int whence
);
132 int trace_read(ltt_descriptor
* lttdes
, event_struct
* ev
);
134 int trace_lookup_facility(int evId
, facility_handle
** facilityHandle
);
135 int trace_lookup_event(int event_id
, facility_handle
* facHandle
, event_handle
** eventHandle
);
136 int trace_lookup_field(sequence
* baseField
, int position
, field_handle
** field
);
138 int trace_get_char(field_handle
* field
, void * data
);
139 int trace_get_uchar(field_handle
* field
, void * data
);
140 unsigned long trace_get_enum(field_handle
* field
, void * data
);
141 short int trace_get_short(field_handle
* field
, void * data
);
142 unsigned short int trace_get_ushort(field_handle
* field
, void * data
);
143 int trace_get_integer(field_handle
* field
, void * data
);
144 unsigned int trace_get_uinteger(field_handle
* field
, void * data
);
145 long trace_get_long(field_handle
* field
, void * data
);
146 unsigned long trace_get_ulong(field_handle
* field
, void * data
);
147 float trace_get_float(field_handle
* field
, void * data
);
148 double trace_get_double(field_handle
* field
, void * data
);
149 char * trace_get_string(field_handle
* field
, void * data
);
151 int trace_get_time_block_position(ltt_descriptor
* lttdes
, uint32_t seekTime
, int beginBlock
, int endBlock
);
152 void trace_update_basefield(ltt_descriptor
* lttdes
, sequence
* baseField
);
155 #define EVENT_ID_SIZE() sizeof(int8_t)
156 #define TIME_DELTA_SIZE() sizeof(uint32_t)
157 //event id and time delta
158 #define EVENT_HEADER_SIZE() (sizeof(int8_t) + sizeof(uint32_t))
160 /* Time operation macros */
162 #define DBTimeSub(T3, T2, T1) \
165 T3.tv_sec = T2.tv_sec - T1.tv_sec; \
166 T3.tv_usec = T2.tv_usec - T1.tv_usec; \
170 T3.tv_usec += 1000000;\
175 #define DBTimeAdd(T3, T2, T1) \
178 T3.tv_sec = T2.tv_sec + T1.tv_sec; \
179 T3.tv_usec = T2.tv_usec + T1.tv_usec; \
180 if(T3.tv_usec >= 1000000)\
182 T3.tv_sec += T3.tv_usec / 1000000;\
183 T3.tv_usec = T3.tv_usec % 1000000;\