1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2007 Mathieu Desnoyers
4 * Complete rewrite from the original version made by XangXiu Yang.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License Version 2.1 as published by the Free Software Foundation.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
27 #include <ltt/event.h>
28 #include <ltt/ltt-types.h>
29 #include <ltt/ltt-private.h>
31 /*****************************************************************************
33 * ltt_event_position_get : get the event position data
35 * e : an instance of an event type
36 * ep : a pointer to event's position structure
37 * tf : tracefile pointer
38 * block : current block
39 * offset : current offset
41 ****************************************************************************/
42 void ltt_event_position_get(LttEventPosition
*ep
, LttTracefile
**tf
,
43 guint
*block
, guint
*offset
, guint64
*tsc
)
52 void ltt_event_position_set(LttEventPosition
*ep
, LttTracefile
*tf
,
53 guint block
, guint offset
, guint64 tsc
)
62 /*****************************************************************************
64 * ltt_event_position : get the event's position
66 * e : an instance of an event type
67 * ep : a pointer to event's position structure
68 ****************************************************************************/
70 void ltt_event_position(LttEvent
*e
, LttEventPosition
*ep
)
72 ep
->tracefile
= e
->tracefile
;
74 ep
->offset
= e
->offset
;
78 LttEventPosition
* ltt_event_position_new()
80 return g_new(LttEventPosition
, 1);
84 /*****************************************************************************
86 * ltt_event_position_compare : compare two positions
87 * A NULL value is infinite.
89 * ep1 : a pointer to event's position structure
90 * ep2 : a pointer to event's position structure
95 ****************************************************************************/
98 gint
ltt_event_position_compare(const LttEventPosition
*ep1
,
99 const LttEventPosition
*ep2
)
101 if(ep1
== NULL
&& ep2
== NULL
)
103 if(ep1
!= NULL
&& ep2
== NULL
)
105 if(ep1
== NULL
&& ep2
!= NULL
)
108 if(ep1
->tracefile
!= ep2
->tracefile
)
109 g_error("ltt_event_position_compare on different tracefiles makes no sense");
111 if(ep1
->block
< ep2
->block
)
113 if(ep1
->block
> ep2
->block
)
115 if(ep1
->offset
< ep2
->offset
)
117 if(ep1
->offset
> ep2
->offset
)
122 /*****************************************************************************
124 * ltt_event_position_copy : copy position
126 * src : a pointer to event's position structure source
127 * dest : a pointer to event's position structure dest
130 ****************************************************************************/
131 void ltt_event_position_copy(LttEventPosition
*dest
,
132 const LttEventPosition
*src
)
142 LttTracefile
*ltt_event_position_tracefile(LttEventPosition
*ep
)
144 return ep
->tracefile
;
147 /*****************************************************************************
148 * These functions extract data from an event after architecture specific
150 ****************************************************************************/
151 guint32
ltt_event_get_unsigned(LttEvent
*e
, struct marker_field
*f
)
153 gboolean reverse_byte_order
;
155 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
156 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
158 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
164 guint8 x
= *(guint8
*)(e
->data
+ f
->offset
);
169 return (guint32
)ltt_get_uint16(reverse_byte_order
, e
->data
+ f
->offset
);
172 return (guint32
)ltt_get_uint32(reverse_byte_order
, e
->data
+ f
->offset
);
176 g_critical("ltt_event_get_unsigned : field size %i unknown", f
->size
);
182 gint32
ltt_event_get_int(LttEvent
*e
, struct marker_field
*f
)
184 gboolean reverse_byte_order
;
185 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
186 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
188 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
194 gint8 x
= *(gint8
*)(e
->data
+ f
->offset
);
199 return (gint32
)ltt_get_int16(reverse_byte_order
, e
->data
+ f
->offset
);
202 return (gint32
)ltt_get_int32(reverse_byte_order
, e
->data
+ f
->offset
);
206 g_critical("ltt_event_get_int : field size %i unknown", f
->size
);
212 guint64
ltt_event_get_long_unsigned(LttEvent
*e
, struct marker_field
*f
)
214 gboolean reverse_byte_order
;
215 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
216 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
218 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
224 guint8 x
= *(guint8
*)(e
->data
+ f
->offset
);
229 return (guint64
)ltt_get_uint16(reverse_byte_order
, e
->data
+ f
->offset
);
232 return (guint64
)ltt_get_uint32(reverse_byte_order
, e
->data
+ f
->offset
);
235 return ltt_get_uint64(reverse_byte_order
, e
->data
+ f
->offset
);
238 g_critical("ltt_event_get_long_unsigned : field size %i unknown", f
->size
);
244 gint64
ltt_event_get_long_int(LttEvent
*e
, struct marker_field
*f
)
246 gboolean reverse_byte_order
;
247 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
248 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
250 reverse_byte_order
= LTT_GET_BO(e
->tracefile
);
256 gint8 x
= *(gint8
*)(e
->data
+ f
->offset
);
261 return (gint64
)ltt_get_int16(reverse_byte_order
, e
->data
+ f
->offset
);
264 return (gint64
)ltt_get_int32(reverse_byte_order
, e
->data
+ f
->offset
);
267 return ltt_get_int64(reverse_byte_order
, e
->data
+ f
->offset
);
270 g_critical("ltt_event_get_long_int : field size %i unknown", f
->size
);
277 float ltt_event_get_float(LttEvent
*e
, struct marker_field
*f
)
279 gboolean reverse_byte_order
;
280 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
281 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
283 g_assert(LTT_HAS_FLOAT(e
->tracefile
));
284 reverse_byte_order
= LTT_GET_FLOAT_BO(e
->tracefile
);
287 g_assert(f
->field_type
.type_class
== LTT_FLOAT
&& f
->size
== 4);
289 if(reverse_byte_order
== 0) return *(float *)(e
->data
+ f
->offset
);
291 void *ptr
= e
->data
+ f
->offset
;
292 guint32 value
= bswap_32(*(guint32
*)ptr
);
293 return *(float*)&value
;
297 double ltt_event_get_double(LttEvent
*e
, struct marker_field
*f
)
299 gboolean reverse_byte_order
;
300 if(unlikely(f
->attributes
& LTT_ATTRIBUTE_NETWORK_BYTE_ORDER
)) {
301 reverse_byte_order
= (g_ntohs(0x1) != 0x1);
303 g_assert(LTT_HAS_FLOAT(e
->tracefile
));
304 reverse_byte_order
= LTT_GET_FLOAT_BO(e
->tracefile
);
308 return ltt_event_get_float(e
, f
);
310 g_assert(f
->field_type
.type_class
== LTT_FLOAT
&& f
->size
== 8);
312 if(reverse_byte_order
== 0) return *(double *)(e
->data
+ f
->offset
);
314 void *ptr
= e
->data
+ f
->offset
;
315 guint64 value
= bswap_64(*(guint64
*)ptr
);
316 return *(double*)&value
;
321 /*****************************************************************************
322 * The string obtained is only valid until the next read from
323 * the same tracefile.
324 ****************************************************************************/
325 char *ltt_event_get_string(LttEvent
*e
, struct marker_field
*f
)
327 g_assert(f
->type
== LTT_TYPE_STRING
);
329 return (gchar
*)g_strdup((gchar
*)(e
->data
+ f
->offset
));