#include <stdio.h>
#include <asm/types.h>
#include <linux/byteorder/swab.h>
-#include <ltt/LTTTypes.h>
+
#include "parser.h"
+#include <ltt/ltt.h>
+#include "ltt-private.h"
#include <ltt/event.h>
+#include <ltt/trace.h>
/*****************************************************************************
*Function name
LttEventType * event_type = ltt_event_eventtype(e);
if(!event_type) return NULL;
field = event_type->root_field;
+ if(!field) return NULL;
//check if the field need refresh
if(e->which_block != event_type->latest_block ||
return e->event_cycle_count;
}
+/*****************************************************************************
+ *Function name
+ * ltt_event_position : get the event's position
+ *Input params
+ * e : an instance of an event type
+ * ep : a pointer to event's position structure
+ ****************************************************************************/
+
+void ltt_event_position(LttEvent *e, LttEventPosition *ep)
+{
+ ep->block_num = e->which_block;
+ ep->event_num = e->which_event;
+ ep->event_time = e->event_time;
+ ep->event_cycle_count = e->event_cycle_count;
+ ep->heart_beat_number = e->tracefile->cur_heart_beat_number;
+ ep->old_position = FALSE;
+ ep->event_offset = e->data - e->tracefile->buffer - EVENT_HEADER_SIZE ;
+ ep->tf = e->tracefile;
+}
+
+LttEventPosition * ltt_event_position_new()
+{
+ return g_new(LttEventPosition, 1);
+}
+
+/*****************************************************************************
+ *Function name
+ * ltt_event_position_get : get the block number and index of the event
+ *Input params
+ * ep : a pointer to event's position structure
+ * block_number : the block number of the event
+ * index_in_block : the index of the event within the block
+ ****************************************************************************/
+
+void ltt_event_position_get(LttEventPosition *ep,
+ unsigned *block_number, unsigned *index_in_block, LttTracefile ** tf)
+{
+ *block_number = ep->block_num;
+ *index_in_block = ep->event_num;
+ *tf = ep->tf;
+}
+
+/*****************************************************************************
+ *Function name
+ * ltt_event_position_set : set the block number and index of the event
+ *Input params
+ * ep : a pointer to event's position structure
+ * block_number : the block number of the event
+ * index_in_block : the index of the event within the block
+ ****************************************************************************/
+
+void ltt_event_position_set(LttEventPosition *ep,
+ unsigned block_number, unsigned index_in_block)
+{
+ ep->block_num = block_number;
+ ep->event_num = index_in_block;
+}
+
/*****************************************************************************
*Function name
* ltt_event_cpu_i: get the cpu id where the event happens
****************************************************************************/
unsigned ltt_event_cpu_id(LttEvent *e)
-{
- return (unsigned)atoi(e->tracefile->name);
+{
+ char * c1, * c2, * c3;
+ c1 = strrchr(e->tracefile->name,'\\');
+ c2 = strrchr(e->tracefile->name,'/');
+ if(c1 == NULL && c2 == NULL){
+ return (unsigned)atoi(e->tracefile->name);
+ }else if(c1 == NULL){
+ c2++;
+ return (unsigned)atoi(c2);
+ }else if(c2 == NULL){
+ c1++;
+ return (unsigned)atoi(c1);
+ }else{
+ c3 = (c1 > c2) ? c1 : c2;
+ c3++;
+ return (unsigned)atoi(c3);
+ }
}
/*****************************************************************************
unsigned ltt_event_get_unsigned(LttEvent *e, LttField *f)
{
- LttArchSize rSize = e->tracefile->trace->system_description->size;
int revFlag = e->tracefile->trace->my_arch_endian ==
e->tracefile->trace->system_description->endian ? 0:1;
LttTypeEnum t = f->field_type->type_class;
- if(t != LTT_UINT || t != LTT_ENUM)
+ if(t != LTT_UINT && t != LTT_ENUM)
g_error("The type of the field is not unsigned int\n");
- if(rSize == LTT_LP32){
- if(f->field_size != 2)
- g_error("The type of the field is not unsigned int: uint16_t\n");
- else{
- uint16_t x = *(uint16_t *)(e->data + f->offset_root);
- return (unsigned) (revFlag ? BREV16(x) : x);
- }
- }else if(rSize == LTT_ILP32 || rSize == LTT_LP64){
- if(f->field_size != 4)
- g_error("The type of the field is not unsigned int: uint32_t\n");
- else{
- uint32_t x = *(uint32_t *)(e->data + f->offset_root);
- return (unsigned) (revFlag ? BREV32(x): x);
- }
- }else if(rSize == LTT_ILP64){
- if(f->field_size != 8)
- g_error("The type of the field is not unsigned int: uint64_t\n");
- else{
- uint64_t x = *(uint64_t *)(e->data + f->offset_root);
- return (unsigned) (revFlag ? BREV64(x): x);
- }
+ if(f->field_size == 1){
+ guint8 x = *(guint8 *)(e->data + f->offset_root);
+ return (unsigned int) x;
+ }else if(f->field_size == 2){
+ guint16 x = *(guint16 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (unsigned int) (revFlag ? GUINT16_FROM_BE(x): x);
+ else
+ return (unsigned int) (revFlag ? GUINT16_FROM_LE(x): x);
+ }else if(f->field_size == 4){
+ guint32 x = *(guint32 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (unsigned int) (revFlag ? GUINT32_FROM_BE(x): x);
+ else
+ return (unsigned int) (revFlag ? GUINT32_FROM_LE(x): x);
+ }else if(f->field_size == 8){
+ guint64 x = *(guint64 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (unsigned int) (revFlag ? GUINT64_FROM_BE(x): x);
+ else
+ return (unsigned int) (revFlag ? GUINT64_FROM_LE(x): x);
}
}
int ltt_event_get_int(LttEvent *e, LttField *f)
{
- LttArchSize rSize = e->tracefile->trace->system_description->size;
int revFlag = e->tracefile->trace->my_arch_endian ==
e->tracefile->trace->system_description->endian ? 0:1;
if(f->field_type->type_class != LTT_INT)
g_error("The type of the field is not int\n");
- if(rSize == LTT_LP32){
- if(f->field_size != 2)
- g_error("The type of the field is not int: int16_t\n");
- else{
- int16_t x = *(int16_t *)(e->data + f->offset_root);
- return (int) (revFlag ? BREV16(x) : x);
- }
- }else if(rSize == LTT_ILP32 || rSize == LTT_LP64){
- if(f->field_size != 4)
- g_error("The type of the field is not int: int32_t\n");
- else{
- int32_t x = *(int32_t *)(e->data + f->offset_root);
- return (int) (revFlag ? BREV32(x): x);
- }
- }else if(rSize == LTT_ILP64){
- if(f->field_size != 8)
- g_error("The type of the field is not int: int64_t\n");
- else{
- int64_t x = *(int64_t *)(e->data + f->offset_root);
- return (int) (revFlag ? BREV64(x): x);
- }
+ if(f->field_size == 1){
+ gint8 x = *(gint8 *)(e->data + f->offset_root);
+ return (int) x;
+ }else if(f->field_size == 2){
+ gint16 x = *(gint16 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (int) (revFlag ? GINT16_FROM_BE(x): x);
+ else
+ return (int) (revFlag ? GINT16_FROM_LE(x): x);
+ }else if(f->field_size == 4){
+ gint32 x = *(gint32 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (int) (revFlag ? GINT32_FROM_BE(x): x);
+ else
+ return (int) (revFlag ? GINT32_FROM_LE(x): x);
+ }else if(f->field_size == 8){
+ gint64 x = *(gint64 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (int) (revFlag ? GINT64_FROM_BE(x): x);
+ else
+ return (int) (revFlag ? GINT64_FROM_LE(x): x);
}
}
unsigned long ltt_event_get_long_unsigned(LttEvent *e, LttField *f)
{
- LttArchSize rSize = e->tracefile->trace->system_description->size;
int revFlag = e->tracefile->trace->my_arch_endian ==
e->tracefile->trace->system_description->endian ? 0:1;
LttTypeEnum t = f->field_type->type_class;
- if(t != LTT_UINT || t != LTT_ENUM)
+ if(t != LTT_UINT && t != LTT_ENUM)
g_error("The type of the field is not unsigned long\n");
- if(rSize == LTT_LP32 || rSize == LTT_ILP32 ){
- if(f->field_size != 4)
- g_error("The type of the field is not unsigned long: uint32_t\n");
- else{
- uint32_t x = *(uint32_t *)(e->data + f->offset_root);
- return (unsigned long) (revFlag ? BREV32(x) : x);
- }
- }else if(rSize == LTT_LP64 || rSize == LTT_ILP64){
- if(f->field_size != 8)
- g_error("The type of the field is not unsigned long: uint64_t\n");
- else{
- uint64_t x = *(uint64_t *)(e->data + f->offset_root);
- return (unsigned long) (revFlag ? BREV64(x): x);
- }
+ if(f->field_size == 1){
+ guint8 x = *(guint8 *)(e->data + f->offset_root);
+ return (unsigned long) x;
+ }else if(f->field_size == 2){
+ guint16 x = *(guint16 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (unsigned long) (revFlag ? GUINT16_FROM_BE(x): x);
+ else
+ return (unsigned long) (revFlag ? GUINT16_FROM_LE(x): x);
+ }else if(f->field_size == 4){
+ guint32 x = *(guint32 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (unsigned long) (revFlag ? GUINT32_FROM_BE(x): x);
+ else
+ return (unsigned long) (revFlag ? GUINT32_FROM_LE(x): x);
+ }else if(f->field_size == 8){
+ guint64 x = *(guint64 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (unsigned long) (revFlag ? GUINT64_FROM_BE(x): x);
+ else
+ return (unsigned long) (revFlag ? GUINT64_FROM_LE(x): x);
}
}
long int ltt_event_get_long_int(LttEvent *e, LttField *f)
{
- LttArchSize rSize = e->tracefile->trace->system_description->size;
int revFlag = e->tracefile->trace->my_arch_endian ==
e->tracefile->trace->system_description->endian ? 0:1;
if( f->field_type->type_class != LTT_INT)
g_error("The type of the field is not long int\n");
- if(rSize == LTT_LP32 || rSize == LTT_ILP32 ){
- if(f->field_size != 4)
- g_error("The type of the field is not long int: int32_t\n");
- else{
- int32_t x = *(int32_t *)(e->data + f->offset_root);
- return (long) (revFlag ? BREV32(x) : x);
- }
- }else if(rSize == LTT_LP64 || rSize == LTT_ILP64){
- if(f->field_size != 8)
- g_error("The type of the field is not long int: int64_t\n");
- else{
- int64_t x = *(int64_t *)(e->data + f->offset_root);
- return (long) (revFlag ? BREV64(x): x);
- }
+ if(f->field_size == 1){
+ gint8 x = *(gint8 *)(e->data + f->offset_root);
+ return (long) x;
+ }else if(f->field_size == 2){
+ gint16 x = *(gint16 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (long) (revFlag ? GINT16_FROM_BE(x): x);
+ else
+ return (long) (revFlag ? GINT16_FROM_LE(x): x);
+ }else if(f->field_size == 4){
+ gint32 x = *(gint32 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (long) (revFlag ? GINT32_FROM_BE(x): x);
+ else
+ return (long) (revFlag ? GINT32_FROM_LE(x): x);
+ }else if(f->field_size == 8){
+ gint64 x = *(gint64 *)(e->data + f->offset_root);
+ if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
+ return (long) (revFlag ? GINT64_FROM_BE(x): x);
+ else
+ return (long) (revFlag ? GINT64_FROM_LE(x): x);
}
}
if(revFlag == 0) return *(float *)(e->data + f->offset_root);
else{
- uint32_t aInt;
+ guint32 aInt;
memcpy((void*)&aInt, e->data + f->offset_root, 4);
aInt = ___swab32(aInt);
return *((float*)&aInt);
if(revFlag == 0) return *(double *)(e->data + f->offset_root);
else{
- uint64_t aInt;
+ guint64 aInt;
memcpy((void*)&aInt, e->data + f->offset_root, 8);
aInt = ___swab64(aInt);
return *((double *)&aInt);