3 #include <ltt/ltt-types.h>
4 #include <ltt/ltt-private.h>
6 /*****************************************************************************
8 * ltt_event_position_get : get the event position data
10 * e : an instance of an event type
11 * ep : a pointer to event's position structure
12 * tf : tracefile pointer
13 * block : current block
14 * offset : current offset
16 ****************************************************************************/
17 void ltt_event_position_get(LttEventPosition
*ep
, LttTracefile
**tf
,
18 guint
*block
, guint
*offset
, guint64
*tsc
)
27 void ltt_event_position_set(LttEventPosition
*ep
, LttTracefile
*tf
,
28 guint block
, guint offset
, guint64 tsc
)
37 /*****************************************************************************
39 * ltt_event_position : get the event's position
41 * e : an instance of an event type
42 * ep : a pointer to event's position structure
43 ****************************************************************************/
45 void ltt_event_position(LttEvent
*e
, LttEventPosition
*ep
)
47 ep
->tracefile
= e
->tracefile
;
49 ep
->offset
= e
->offset
;
53 LttEventPosition
* ltt_event_position_new()
55 return g_new(LttEventPosition
, 1);
59 /*****************************************************************************
61 * ltt_event_position_compare : compare two positions
62 * A NULL value is infinite.
64 * ep1 : a pointer to event's position structure
65 * ep2 : a pointer to event's position structure
70 ****************************************************************************/
73 gint
ltt_event_position_compare(const LttEventPosition
*ep1
,
74 const LttEventPosition
*ep2
)
76 if(ep1
== NULL
&& ep2
== NULL
)
78 if(ep1
!= NULL
&& ep2
== NULL
)
80 if(ep1
== NULL
&& ep2
!= NULL
)
83 if(ep1
->tracefile
!= ep2
->tracefile
)
84 g_error("ltt_event_position_compare on different tracefiles makes no sense");
86 if(ep1
->block
< ep2
->block
)
88 if(ep1
->block
> ep2
->block
)
90 if(ep1
->offset
< ep2
->offset
)
92 if(ep1
->offset
> ep2
->offset
)
97 /*****************************************************************************
99 * ltt_event_position_copy : copy position
101 * src : a pointer to event's position structure source
102 * dest : a pointer to event's position structure dest
105 ****************************************************************************/
106 void ltt_event_position_copy(LttEventPosition
*dest
,
107 const LttEventPosition
*src
)
117 LttTracefile
*ltt_event_position_tracefile(LttEventPosition
*ep
)
119 return ep
->tracefile
;
122 /*****************************************************************************
123 * These functions extract data from an event after architecture specific
125 ****************************************************************************/
126 guint32
ltt_event_get_unsigned(LttEvent
*e
, struct marker_field
*f
)
128 gboolean reverse_byte_order
;
129 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
130 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
132 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
138 guint8 x
= *(guint8
*)(e
->data
+ f
->offset
);
143 return (guint32
)ltt_get_uint16(reverse_byte_order
, e
->data
+ f
->offset
);
146 return (guint32
)ltt_get_uint32(reverse_byte_order
, e
->data
+ f
->offset
);
150 g_critical("ltt_event_get_unsigned : field size %i unknown", f
->size
);
156 gint32
ltt_event_get_int(LttEvent
*e
, struct marker_field
*f
)
158 gboolean reverse_byte_order
;
159 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
160 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
162 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
168 gint8 x
= *(gint8
*)(e
->data
+ f
->offset
);
173 return (gint32
)ltt_get_int16(reverse_byte_order
, e
->data
+ f
->offset
);
176 return (gint32
)ltt_get_int32(reverse_byte_order
, e
->data
+ f
->offset
);
180 g_critical("ltt_event_get_int : field size %i unknown", f
->size
);
186 guint64
ltt_event_get_long_unsigned(LttEvent
*e
, struct marker_field
*f
)
188 gboolean reverse_byte_order
;
189 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
190 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
192 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
198 guint8 x
= *(guint8
*)(e
->data
+ f
->offset
);
203 return (guint64
)ltt_get_uint16(reverse_byte_order
, e
->data
+ f
->offset
);
206 return (guint64
)ltt_get_uint32(reverse_byte_order
, e
->data
+ f
->offset
);
209 return ltt_get_uint64(reverse_byte_order
, e
->data
+ f
->offset
);
212 g_critical("ltt_event_get_long_unsigned : field size %i unknown", f
->size
);
218 gint64
ltt_event_get_long_int(LttEvent
*e
, struct marker_field
*f
)
220 gboolean reverse_byte_order
;
221 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
222 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
224 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
230 gint8 x
= *(gint8
*)(e
->data
+ f
->offset
);
235 return (gint64
)ltt_get_int16(reverse_byte_order
, e
->data
+ f
->offset
);
238 return (gint64
)ltt_get_int32(reverse_byte_order
, e
->data
+ f
->offset
);
241 return ltt_get_int64(reverse_byte_order
, e
->data
+ f
->offset
);
244 g_critical("ltt_event_get_long_int : field size %i unknown", f
->size
);
251 float ltt_event_get_float(LttEvent
*e
, struct marker_field
*f
)
253 gboolean reverse_byte_order
;
254 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
255 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
257 g_assert(LTT_HAS_FLOAT(e
->tracefile
));
258 reverse_byte_order
= LTT_GET_FLOAT_BO(e
->tracefile
);
261 g_assert(f
->field_type
.type_class
== LTT_FLOAT
&& f
->size
== 4);
263 if(reverse_byte_order
== 0) return *(float *)(e
->data
+ f
->offset
);
265 void *ptr
= e
->data
+ f
->offset
;
266 guint32 value
= bswap_32(*(guint32
*)ptr
);
267 return *(float*)&value
;
271 double ltt_event_get_double(LttEvent
*e
, struct marker_field
*f
)
273 gboolean reverse_byte_order
;
274 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
275 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
277 g_assert(LTT_HAS_FLOAT(e
->tracefile
));
278 reverse_byte_order
= LTT_GET_FLOAT_BO(e
->tracefile
);
282 return ltt_event_get_float(e
, f
);
284 g_assert(f
->field_type
.type_class
== LTT_FLOAT
&& f
->size
== 8);
286 if(reverse_byte_order
== 0) return *(double *)(e
->data
+ f
->offset
);
288 void *ptr
= e
->data
+ f
->offset
;
289 guint64 value
= bswap_64(*(guint64
*)ptr
);
290 return *(double*)&value
;
295 /*****************************************************************************
296 * The string obtained is only valid until the next read from
297 * the same tracefile.
298 ****************************************************************************/
299 char *ltt_event_get_string(LttEvent
*e
, struct marker_field
*f
)
301 g_assert(f
->type
== LTT_TYPE_STRING
);
303 return (gchar
*)g_strdup((gchar
*)(e
->data
+ f
->offset
));