Rework about dialog by using gtk_show_about_dialog
[lttv.git] / ltt / event.c
CommitLineData
f2a74ed3 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2007 Mathieu Desnoyers
3 *
4 * Complete rewrite from the original version made by XangXiu Yang.
5 *
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.
9 *
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.
14 *
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.
19 */
20
21#ifdef HAVE_CONFIG_H
22#include <config.h>
23#endif
24
25#include <glib.h>
449cb9d7 26
6cd62ccf 27#include <ltt/event.h>
d27446d1 28#include <ltt/ltt-types.h>
a7074914 29#include <ltt/ltt-private.h>
f4e57537 30#include <ltt/marker.h>
31#include <ltt/marker-field.h>
6cd62ccf 32
eed2ef37 33/*****************************************************************************
34 *Function name
35 * ltt_event_position_get : get the event position data
36 *Input params
37 * e : an instance of an event type
38 * ep : a pointer to event's position structure
39 * tf : tracefile pointer
40 * block : current block
41 * offset : current offset
42 * tsc : current tsc
43 ****************************************************************************/
44void ltt_event_position_get(LttEventPosition *ep, LttTracefile **tf,
45 guint *block, guint *offset, guint64 *tsc)
46{
47 *tf = ep->tracefile;
48 *block = ep->block;
49 *offset = ep->offset;
50 *tsc = ep->tsc;
51}
52
53
6d0cdf22 54void ltt_event_position_set(LttEventPosition *ep, LttTracefile *tf,
55 guint block, guint offset, guint64 tsc)
56{
57 ep->tracefile = tf;
58 ep->block = block;
59 ep->offset = offset;
60 ep->tsc = tsc;
61}
62
63
80da81ad 64/*****************************************************************************
65 *Function name
66 * ltt_event_position : get the event's position
67 *Input params
68 * e : an instance of an event type
69 * ep : a pointer to event's position structure
70 ****************************************************************************/
71
8b0a0cc8 72void ltt_event_position(const LttEvent *e, LttEventPosition *ep)
80da81ad 73{
3aee1200 74 ep->tracefile = e->tracefile;
75 ep->block = e->block;
76 ep->offset = e->offset;
77 ep->tsc = e->tsc;
80da81ad 78}
79
a5dcde2f 80LttEventPosition * ltt_event_position_new()
81{
82 return g_new(LttEventPosition, 1);
83}
84
80da81ad 85
96da5c0d 86/*****************************************************************************
87 * Function name
88 * ltt_event_position_compare : compare two positions
a00149f6 89 * A NULL value is infinite.
96da5c0d 90 * Input params
91 * ep1 : a pointer to event's position structure
92 * ep2 : a pointer to event's position structure
93 * Return
94 * -1 is ep1 < ep2
95 * 1 if ep1 > ep2
96 * 0 if ep1 == ep2
97 ****************************************************************************/
98
99
100gint ltt_event_position_compare(const LttEventPosition *ep1,
101 const LttEventPosition *ep2)
102{
a00149f6 103 if(ep1 == NULL && ep2 == NULL)
104 return 0;
105 if(ep1 != NULL && ep2 == NULL)
106 return -1;
107 if(ep1 == NULL && ep2 != NULL)
108 return 1;
96da5c0d 109
3aee1200 110 if(ep1->tracefile != ep2->tracefile)
111 g_error("ltt_event_position_compare on different tracefiles makes no sense");
112
113 if(ep1->block < ep2->block)
96da5c0d 114 return -1;
3aee1200 115 if(ep1->block > ep2->block)
96da5c0d 116 return 1;
3aee1200 117 if(ep1->offset < ep2->offset)
96da5c0d 118 return -1;
3aee1200 119 if(ep1->offset > ep2->offset)
96da5c0d 120 return 1;
121 return 0;
122}
123
2a74fbf4 124/*****************************************************************************
125 * Function name
126 * ltt_event_position_copy : copy position
127 * Input params
128 * src : a pointer to event's position structure source
129 * dest : a pointer to event's position structure dest
130 * Return
131 * void
132 ****************************************************************************/
133void ltt_event_position_copy(LttEventPosition *dest,
134 const LttEventPosition *src)
135{
a00149f6 136 if(src == NULL)
137 dest = NULL;
138 else
139 *dest = *src;
2a74fbf4 140}
96da5c0d 141
142
27304273 143
144LttTracefile *ltt_event_position_tracefile(LttEventPosition *ep)
145{
146 return ep->tracefile;
147}
148
c37440c8 149/*****************************************************************************
150 * These functions extract data from an event after architecture specific
151 * conversions
152 ****************************************************************************/
153guint32 ltt_event_get_unsigned(LttEvent *e, struct marker_field *f)
154{
155 gboolean reverse_byte_order;
1184dc37
MD
156 struct LttField *eventfield;
157 int offset, size;
f2a74ed3 158
c37440c8 159 if(unlikely(f->attributes & LTT_ATTRIBUTE_NETWORK_BYTE_ORDER)) {
160 reverse_byte_order = (g_ntohs(0x1) != 0x1);
161 } else {
162 reverse_byte_order = LTT_GET_BO(e->tracefile);
163 }
164
1184dc37
MD
165 eventfield = ltt_event_field(e, marker_field_get_index(f));
166 offset = eventfield->offset;
167 size = eventfield->size;
168 switch(size) {
c37440c8 169 case 1:
170 {
1184dc37
MD
171 guint8 x = *(guint8 *)(e->data + offset);
172 return (guint32) x;
c37440c8 173 }
174 break;
175 case 2:
1184dc37 176 return (guint32)ltt_get_uint16(reverse_byte_order, e->data + offset);
c37440c8 177 break;
178 case 4:
1184dc37 179 return (guint32)ltt_get_uint32(reverse_byte_order, e->data + offset);
c37440c8 180 break;
181 case 8:
182 default:
1184dc37 183 g_critical("ltt_event_get_unsigned : field size %i unknown", size);
c37440c8 184 return 0;
185 break;
186 }
187}
188
189gint32 ltt_event_get_int(LttEvent *e, struct marker_field *f)
190{
191 gboolean reverse_byte_order;
1184dc37
MD
192 struct LttField *eventfield;
193 int offset, size;
194
c37440c8 195 if(unlikely(f->attributes & LTT_ATTRIBUTE_NETWORK_BYTE_ORDER)) {
196 reverse_byte_order = (g_ntohs(0x1) != 0x1);
197 } else {
198 reverse_byte_order = LTT_GET_BO(e->tracefile);
199 }
200
1184dc37
MD
201 eventfield = ltt_event_field(e, marker_field_get_index(f));
202 offset = eventfield->offset;
203 size = eventfield->size;
204 switch(size) {
c37440c8 205 case 1:
206 {
1184dc37
MD
207 gint8 x = *(gint8 *)(e->data + offset);
208 return (gint32) x;
c37440c8 209 }
210 break;
211 case 2:
1184dc37 212 return (gint32)ltt_get_int16(reverse_byte_order, e->data + offset);
c37440c8 213 break;
214 case 4:
1184dc37 215 return (gint32)ltt_get_int32(reverse_byte_order, e->data + offset);
c37440c8 216 break;
217 case 8:
218 default:
1184dc37 219 g_critical("ltt_event_get_int : field size %i unknown", size);
c37440c8 220 return 0;
221 break;
222 }
223}
224
225guint64 ltt_event_get_long_unsigned(LttEvent *e, struct marker_field *f)
226{
227 gboolean reverse_byte_order;
1184dc37
MD
228 struct LttField *eventfield;
229 int offset, size;
230
c37440c8 231 if(unlikely(f->attributes & LTT_ATTRIBUTE_NETWORK_BYTE_ORDER)) {
232 reverse_byte_order = (g_ntohs(0x1) != 0x1);
233 } else {
234 reverse_byte_order = LTT_GET_BO(e->tracefile);
235 }
236
1184dc37
MD
237 eventfield = ltt_event_field(e, marker_field_get_index(f));
238 offset = eventfield->offset;
239 size = eventfield->size;
240 switch(size) {
c37440c8 241 case 1:
242 {
1184dc37
MD
243 guint8 x = *(guint8 *)(e->data + offset);
244 return (guint64) x;
c37440c8 245 }
246 break;
247 case 2:
1184dc37 248 return (guint64)ltt_get_uint16(reverse_byte_order, e->data + offset);
c37440c8 249 break;
250 case 4:
1184dc37 251 return (guint64)ltt_get_uint32(reverse_byte_order, e->data + offset);
c37440c8 252 break;
253 case 8:
1184dc37 254 return ltt_get_uint64(reverse_byte_order, e->data + offset);
c37440c8 255 break;
256 default:
1184dc37 257 g_critical("ltt_event_get_long_unsigned : field size %i unknown", size);
c37440c8 258 return 0;
259 break;
260 }
261}
262
263gint64 ltt_event_get_long_int(LttEvent *e, struct marker_field *f)
264{
265 gboolean reverse_byte_order;
1184dc37
MD
266 struct LttField *eventfield;
267 int offset, size;
268
c37440c8 269 if(unlikely(f->attributes & LTT_ATTRIBUTE_NETWORK_BYTE_ORDER)) {
270 reverse_byte_order = (g_ntohs(0x1) != 0x1);
271 } else {
272 reverse_byte_order = LTT_GET_BO(e->tracefile);
273 }
274
1184dc37
MD
275 eventfield = ltt_event_field(e, marker_field_get_index(f));
276 offset = eventfield->offset;
277 size = eventfield->size;
278 switch(size) {
c37440c8 279 case 1:
280 {
1184dc37 281 gint8 x = *(gint8 *)(e->data + offset);
c37440c8 282 return (gint64) x;
283 }
284 break;
285 case 2:
1184dc37 286 return (gint64)ltt_get_int16(reverse_byte_order, e->data + offset);
c37440c8 287 break;
288 case 4:
1184dc37 289 return (gint64)ltt_get_int32(reverse_byte_order, e->data + offset);
c37440c8 290 break;
291 case 8:
1184dc37 292 return ltt_get_int64(reverse_byte_order, e->data + offset);
c37440c8 293 break;
294 default:
1184dc37 295 g_critical("ltt_event_get_long_int : field size %i unknown", size);
c37440c8 296 return 0;
297 break;
298 }
299}
300
301#if 0
302float ltt_event_get_float(LttEvent *e, struct marker_field *f)
303{
304 gboolean reverse_byte_order;
1184dc37
MD
305 struct LttField *eventfield;
306 int offset, size;
307
c37440c8 308 if(unlikely(f->attributes & LTT_ATTRIBUTE_NETWORK_BYTE_ORDER)) {
309 reverse_byte_order = (g_ntohs(0x1) != 0x1);
310 } else {
311 g_assert(LTT_HAS_FLOAT(e->tracefile));
312 reverse_byte_order = LTT_GET_FLOAT_BO(e->tracefile);
313 }
314
1184dc37
MD
315 eventfield = ltt_event_field(e, marker_field_get_index(f));
316 offset = eventfield->offset;
317 size = eventfield->size;
318 g_assert(f->field_type.type_class == LTT_FLOAT && size == 4);
c37440c8 319
1184dc37 320 if(reverse_byte_order == 0) return *(float *)(e->data + offset);
c37440c8 321 else{
1184dc37 322 void *ptr = e->data + offset;
c37440c8 323 guint32 value = bswap_32(*(guint32*)ptr);
324 return *(float*)&value;
325 }
326}
327
328double ltt_event_get_double(LttEvent *e, struct marker_field *f)
329{
330 gboolean reverse_byte_order;
1184dc37
MD
331 struct LttField *eventfield;
332 int offset, size;
333
c37440c8 334 if(unlikely(f->attributes & LTT_ATTRIBUTE_NETWORK_BYTE_ORDER)) {
335 reverse_byte_order = (g_ntohs(0x1) != 0x1);
336 } else {
337 g_assert(LTT_HAS_FLOAT(e->tracefile));
338 reverse_byte_order = LTT_GET_FLOAT_BO(e->tracefile);
339 }
340
1184dc37
MD
341 eventfield = ltt_event_field(e, marker_field_get_index(f));
342 offset = eventfield->offset;
343 size = eventfield->size;
344 if(size == 4)
c37440c8 345 return ltt_event_get_float(e, f);
346
1184dc37 347 g_assert(f->field_type.type_class == LTT_FLOAT && size == 8);
c37440c8 348
1184dc37 349 if(reverse_byte_order == 0) return *(double *)(e->data + offset);
c37440c8 350 else {
1184dc37 351 void *ptr = e->data + offset;
c37440c8 352 guint64 value = bswap_64(*(guint64*)ptr);
353 return *(double*)&value;
354 }
355}
356#endif
357
358/*****************************************************************************
359 * The string obtained is only valid until the next read from
750eb11a 360 * the same tracefile. We reference directly the buffers.
c37440c8 361 ****************************************************************************/
750eb11a 362gchar *ltt_event_get_string(LttEvent *e, struct marker_field *f)
c37440c8 363{
1184dc37
MD
364 struct LttField *eventfield;
365 int offset;
366
c37440c8 367 g_assert(f->type == LTT_TYPE_STRING);
368
750eb11a 369 //caused memory leaks
370 //return (gchar*)g_strdup((gchar*)(e->data + f->offset));
1184dc37
MD
371 eventfield = ltt_event_field(e, marker_field_get_index(f));
372 offset = eventfield->offset;
373 return (gchar*)(e->data + offset);
c37440c8 374}
375
376
This page took 0.087301 seconds and 4 git commands to generate.