5a1bc7d3 |
1 | #define LTT_PACKED_STRUCT __attribute__ ((packed)) |
2 | #define TRACER_MAGIC_NUMBER 0x00D6B7ED /* That day marks an important historical event ... */ |
3 | |
4 | void initFacilities(); |
5 | void freeFacilities(); //not implimented yet |
6 | |
7 | |
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 */ |
15 | |
16 | //format of fields |
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 */ |
20 | |
21 | //other elements |
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; |
27 | |
28 | |
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; |
35 | |
36 | |
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; |
43 | |
44 | |
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 */ |
60 | } ltt_descriptor; |
61 | |
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 */ |
72 | } field_handle; |
73 | |
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 */ |
81 | } event_handle; |
82 | |
83 | |
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 */ |
89 | } facility_handle; |
90 | |
91 | |
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 */ |
105 | } event_struct; |
106 | |
107 | |
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 */ |
113 | } kernel_facility; |
114 | |
115 | |
116 | void parseEventAndTypeDefinition(char * facilityName); |
117 | void generateFacilityHandle(char * facName, unsigned long checksum, sequence * events); |
118 | int getTypeSize(data_type dt, int index); |
119 | |
120 | |
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); |
128 | |
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); |
133 | |
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); |
137 | |
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); |
150 | |
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 ); |
153 | |
154 | |
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)) |
159 | |
160 | /* Time operation macros */ |
161 | /* (T3 = T2 - T1) */ |
162 | #define DBTimeSub(T3, T2, T1) \ |
163 | do \ |
164 | {\ |
165 | T3.tv_sec = T2.tv_sec - T1.tv_sec; \ |
166 | T3.tv_usec = T2.tv_usec - T1.tv_usec; \ |
167 | if(T3.tv_usec < 0)\ |
168 | {\ |
169 | T3.tv_sec--;\ |
170 | T3.tv_usec += 1000000;\ |
171 | }\ |
172 | } while(0) |
173 | |
174 | /* (T3 = T2 + T1) */ |
175 | #define DBTimeAdd(T3, T2, T1) \ |
176 | do \ |
177 | {\ |
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)\ |
181 | {\ |
182 | T3.tv_sec += T3.tv_usec / 1000000;\ |
183 | T3.tv_usec = T3.tv_usec % 1000000;\ |
184 | }\ |
185 | } while(0) |