4 /*****************************************************************************
6 * ltt_event_position_get : get the event position data
8 * e : an instance of an event type
9 * ep : a pointer to event's position structure
10 * tf : tracefile pointer
11 * block : current block
12 * offset : current offset
14 ****************************************************************************/
15 void ltt_event_position_get(LttEventPosition
*ep
, LttTracefile
**tf
,
16 guint
*block
, guint
*offset
, guint64
*tsc
)
25 void ltt_event_position_set(LttEventPosition
*ep
, LttTracefile
*tf
,
26 guint block
, guint offset
, guint64 tsc
)
35 /*****************************************************************************
37 * ltt_event_position : get the event's position
39 * e : an instance of an event type
40 * ep : a pointer to event's position structure
41 ****************************************************************************/
43 void ltt_event_position(LttEvent
*e
, LttEventPosition
*ep
)
45 ep
->tracefile
= e
->tracefile
;
47 ep
->offset
= e
->offset
;
51 LttEventPosition
* ltt_event_position_new()
53 return g_new(LttEventPosition
, 1);
57 /*****************************************************************************
59 * ltt_event_position_compare : compare two positions
60 * A NULL value is infinite.
62 * ep1 : a pointer to event's position structure
63 * ep2 : a pointer to event's position structure
68 ****************************************************************************/
71 gint
ltt_event_position_compare(const LttEventPosition
*ep1
,
72 const LttEventPosition
*ep2
)
74 if(ep1
== NULL
&& ep2
== NULL
)
76 if(ep1
!= NULL
&& ep2
== NULL
)
78 if(ep1
== NULL
&& ep2
!= NULL
)
81 if(ep1
->tracefile
!= ep2
->tracefile
)
82 g_error("ltt_event_position_compare on different tracefiles makes no sense");
84 if(ep1
->block
< ep2
->block
)
86 if(ep1
->block
> ep2
->block
)
88 if(ep1
->offset
< ep2
->offset
)
90 if(ep1
->offset
> ep2
->offset
)
95 /*****************************************************************************
97 * ltt_event_position_copy : copy position
99 * src : a pointer to event's position structure source
100 * dest : a pointer to event's position structure dest
103 ****************************************************************************/
104 void ltt_event_position_copy(LttEventPosition
*dest
,
105 const LttEventPosition
*src
)
115 LttTracefile
*ltt_event_position_tracefile(LttEventPosition
*ep
)
117 return ep
->tracefile
;
120 /*****************************************************************************
121 * These functions extract data from an event after architecture specific
123 ****************************************************************************/
124 guint32
ltt_event_get_unsigned(LttEvent
*e
, struct marker_field
*f
)
126 gboolean reverse_byte_order
;
127 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
128 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
130 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
136 guint8 x
= *(guint8
*)(e
->data
+ f
->offset
);
141 return (guint32
)ltt_get_uint16(reverse_byte_order
, e
->data
+ f
->offset
);
144 return (guint32
)ltt_get_uint32(reverse_byte_order
, e
->data
+ f
->offset
);
148 g_critical("ltt_event_get_unsigned : field size %i unknown", f
->size
);
154 gint32
ltt_event_get_int(LttEvent
*e
, struct marker_field
*f
)
156 gboolean reverse_byte_order
;
157 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
158 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
160 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
166 gint8 x
= *(gint8
*)(e
->data
+ f
->offset
);
171 return (gint32
)ltt_get_int16(reverse_byte_order
, e
->data
+ f
->offset
);
174 return (gint32
)ltt_get_int32(reverse_byte_order
, e
->data
+ f
->offset
);
178 g_critical("ltt_event_get_int : field size %i unknown", f
->size
);
184 guint64
ltt_event_get_long_unsigned(LttEvent
*e
, struct marker_field
*f
)
186 gboolean reverse_byte_order
;
187 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
188 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
190 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
196 guint8 x
= *(guint8
*)(e
->data
+ f
->offset
);
201 return (guint64
)ltt_get_uint16(reverse_byte_order
, e
->data
+ f
->offset
);
204 return (guint64
)ltt_get_uint32(reverse_byte_order
, e
->data
+ f
->offset
);
207 return ltt_get_uint64(reverse_byte_order
, e
->data
+ f
->offset
);
210 g_critical("ltt_event_get_long_unsigned : field size %i unknown", f
->size
);
216 gint64
ltt_event_get_long_int(LttEvent
*e
, struct marker_field
*f
)
218 gboolean reverse_byte_order
;
219 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
220 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
222 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
228 gint8 x
= *(gint8
*)(e
->data
+ f
->offset
);
233 return (gint64
)ltt_get_int16(reverse_byte_order
, e
->data
+ f
->offset
);
236 return (gint64
)ltt_get_int32(reverse_byte_order
, e
->data
+ f
->offset
);
239 return ltt_get_int64(reverse_byte_order
, e
->data
+ f
->offset
);
242 g_critical("ltt_event_get_long_int : field size %i unknown", f
->size
);
249 float ltt_event_get_float(LttEvent
*e
, struct marker_field
*f
)
251 gboolean reverse_byte_order
;
252 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
253 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
255 g_assert(LTT_HAS_FLOAT(e
->tracefile
));
256 reverse_byte_order
= LTT_GET_FLOAT_BO(e
->tracefile
);
259 g_assert(f
->field_type
.type_class
== LTT_FLOAT
&& f
->size
== 4);
261 if(reverse_byte_order
== 0) return *(float *)(e
->data
+ f
->offset
);
263 void *ptr
= e
->data
+ f
->offset
;
264 guint32 value
= bswap_32(*(guint32
*)ptr
);
265 return *(float*)&value
;
269 double ltt_event_get_double(LttEvent
*e
, struct marker_field
*f
)
271 gboolean reverse_byte_order
;
272 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
273 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
275 g_assert(LTT_HAS_FLOAT(e
->tracefile
));
276 reverse_byte_order
= LTT_GET_FLOAT_BO(e
->tracefile
);
280 return ltt_event_get_float(e
, f
);
282 g_assert(f
->field_type
.type_class
== LTT_FLOAT
&& f
->size
== 8);
284 if(reverse_byte_order
== 0) return *(double *)(e
->data
+ f
->offset
);
286 void *ptr
= e
->data
+ f
->offset
;
287 guint64 value
= bswap_64(*(guint64
*)ptr
);
288 return *(double*)&value
;
293 /*****************************************************************************
294 * The string obtained is only valid until the next read from
295 * the same tracefile.
296 ****************************************************************************/
297 char *ltt_event_get_string(LttEvent
*e
, struct marker_field
*f
)
299 g_assert(f
->type
== LTT_TYPE_STRING
);
301 return (gchar
*)g_strdup((gchar
*)(e
->data
+ f
->offset
));