3 #include <ltt/ltt-types.h>
5 /*****************************************************************************
7 * ltt_event_position_get : get the event position data
9 * e : an instance of an event type
10 * ep : a pointer to event's position structure
11 * tf : tracefile pointer
12 * block : current block
13 * offset : current offset
15 ****************************************************************************/
16 void ltt_event_position_get(LttEventPosition
*ep
, LttTracefile
**tf
,
17 guint
*block
, guint
*offset
, guint64
*tsc
)
26 void ltt_event_position_set(LttEventPosition
*ep
, LttTracefile
*tf
,
27 guint block
, guint offset
, guint64 tsc
)
36 /*****************************************************************************
38 * ltt_event_position : get the event's position
40 * e : an instance of an event type
41 * ep : a pointer to event's position structure
42 ****************************************************************************/
44 void ltt_event_position(LttEvent
*e
, LttEventPosition
*ep
)
46 ep
->tracefile
= e
->tracefile
;
48 ep
->offset
= e
->offset
;
52 LttEventPosition
* ltt_event_position_new()
54 return g_new(LttEventPosition
, 1);
58 /*****************************************************************************
60 * ltt_event_position_compare : compare two positions
61 * A NULL value is infinite.
63 * ep1 : a pointer to event's position structure
64 * ep2 : a pointer to event's position structure
69 ****************************************************************************/
72 gint
ltt_event_position_compare(const LttEventPosition
*ep1
,
73 const LttEventPosition
*ep2
)
75 if(ep1
== NULL
&& ep2
== NULL
)
77 if(ep1
!= NULL
&& ep2
== NULL
)
79 if(ep1
== NULL
&& ep2
!= NULL
)
82 if(ep1
->tracefile
!= ep2
->tracefile
)
83 g_error("ltt_event_position_compare on different tracefiles makes no sense");
85 if(ep1
->block
< ep2
->block
)
87 if(ep1
->block
> ep2
->block
)
89 if(ep1
->offset
< ep2
->offset
)
91 if(ep1
->offset
> ep2
->offset
)
96 /*****************************************************************************
98 * ltt_event_position_copy : copy position
100 * src : a pointer to event's position structure source
101 * dest : a pointer to event's position structure dest
104 ****************************************************************************/
105 void ltt_event_position_copy(LttEventPosition
*dest
,
106 const LttEventPosition
*src
)
116 LttTracefile
*ltt_event_position_tracefile(LttEventPosition
*ep
)
118 return ep
->tracefile
;
121 /*****************************************************************************
122 * These functions extract data from an event after architecture specific
124 ****************************************************************************/
125 guint32
ltt_event_get_unsigned(LttEvent
*e
, struct marker_field
*f
)
127 gboolean reverse_byte_order
;
128 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
129 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
131 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
137 guint8 x
= *(guint8
*)(e
->data
+ f
->offset
);
142 return (guint32
)ltt_get_uint16(reverse_byte_order
, e
->data
+ f
->offset
);
145 return (guint32
)ltt_get_uint32(reverse_byte_order
, e
->data
+ f
->offset
);
149 g_critical("ltt_event_get_unsigned : field size %i unknown", f
->size
);
155 gint32
ltt_event_get_int(LttEvent
*e
, struct marker_field
*f
)
157 gboolean reverse_byte_order
;
158 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
159 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
161 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
167 gint8 x
= *(gint8
*)(e
->data
+ f
->offset
);
172 return (gint32
)ltt_get_int16(reverse_byte_order
, e
->data
+ f
->offset
);
175 return (gint32
)ltt_get_int32(reverse_byte_order
, e
->data
+ f
->offset
);
179 g_critical("ltt_event_get_int : field size %i unknown", f
->size
);
185 guint64
ltt_event_get_long_unsigned(LttEvent
*e
, struct marker_field
*f
)
187 gboolean reverse_byte_order
;
188 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
189 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
191 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
197 guint8 x
= *(guint8
*)(e
->data
+ f
->offset
);
202 return (guint64
)ltt_get_uint16(reverse_byte_order
, e
->data
+ f
->offset
);
205 return (guint64
)ltt_get_uint32(reverse_byte_order
, e
->data
+ f
->offset
);
208 return ltt_get_uint64(reverse_byte_order
, e
->data
+ f
->offset
);
211 g_critical("ltt_event_get_long_unsigned : field size %i unknown", f
->size
);
217 gint64
ltt_event_get_long_int(LttEvent
*e
, struct marker_field
*f
)
219 gboolean reverse_byte_order
;
220 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
221 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
223 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
229 gint8 x
= *(gint8
*)(e
->data
+ f
->offset
);
234 return (gint64
)ltt_get_int16(reverse_byte_order
, e
->data
+ f
->offset
);
237 return (gint64
)ltt_get_int32(reverse_byte_order
, e
->data
+ f
->offset
);
240 return ltt_get_int64(reverse_byte_order
, e
->data
+ f
->offset
);
243 g_critical("ltt_event_get_long_int : field size %i unknown", f
->size
);
250 float ltt_event_get_float(LttEvent
*e
, struct marker_field
*f
)
252 gboolean reverse_byte_order
;
253 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
254 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
256 g_assert(LTT_HAS_FLOAT(e
->tracefile
));
257 reverse_byte_order
= LTT_GET_FLOAT_BO(e
->tracefile
);
260 g_assert(f
->field_type
.type_class
== LTT_FLOAT
&& f
->size
== 4);
262 if(reverse_byte_order
== 0) return *(float *)(e
->data
+ f
->offset
);
264 void *ptr
= e
->data
+ f
->offset
;
265 guint32 value
= bswap_32(*(guint32
*)ptr
);
266 return *(float*)&value
;
270 double ltt_event_get_double(LttEvent
*e
, struct marker_field
*f
)
272 gboolean reverse_byte_order
;
273 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
274 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
276 g_assert(LTT_HAS_FLOAT(e
->tracefile
));
277 reverse_byte_order
= LTT_GET_FLOAT_BO(e
->tracefile
);
281 return ltt_event_get_float(e
, f
);
283 g_assert(f
->field_type
.type_class
== LTT_FLOAT
&& f
->size
== 8);
285 if(reverse_byte_order
== 0) return *(double *)(e
->data
+ f
->offset
);
287 void *ptr
= e
->data
+ f
->offset
;
288 guint64 value
= bswap_64(*(guint64
*)ptr
);
289 return *(double*)&value
;
294 /*****************************************************************************
295 * The string obtained is only valid until the next read from
296 * the same tracefile.
297 ****************************************************************************/
298 char *ltt_event_get_string(LttEvent
*e
, struct marker_field
*f
)
300 g_assert(f
->type
== LTT_TYPE_STRING
);
302 return (gchar
*)g_strdup((gchar
*)(e
->data
+ f
->offset
));