#include <ltt/event.h>
#include <ltt/trace.h>
+
+LttEvent *ltt_event_new()
+{
+ return g_new(LttEvent, 1);
+}
+
+void ltt_event_destroy(LttEvent *event)
+{
+ g_free(event);
+}
+
+
/*****************************************************************************
*Function name
* ltt_event_refresh_fields : refresh fields of an event
*Input params
* offsetRoot : offset from the root
- * offsetParent : offset from the parrent
+ * offsetParent : offset from the parent
* fld : field
* evD : event data
*Return value
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->old_position = TRUE;
ep->event_offset = e->data - e->tracefile->buffer - EVENT_HEADER_SIZE ;
ep->tf = e->tracefile;
+
+ /* This is a workaround for fast position seek */
+ ep->last_event_pos = e->last_event_pos;
+ ep->prev_block_end_time = e->prev_block_end_time;
+ ep->prev_event_time = e->prev_event_time;
+ ep->pre_cycle_count = e->pre_cycle_count;
+ ep->count = e->count;
+ /* end of workaround */
}
LttEventPosition * ltt_event_position_new()
/*****************************************************************************
* Function name
* ltt_event_position_compare : compare two positions
+ * A NULL value is infinite.
* Input params
* ep1 : a pointer to event's position structure
* ep2 : a pointer to event's position structure
{
if(ep1->tf != ep2->tf)
g_error("ltt_event_position_compare on different tracefiles makes no sense");
+ if(ep1 == NULL && ep2 == NULL)
+ return 0;
+ if(ep1 != NULL && ep2 == NULL)
+ return -1;
+ if(ep1 == NULL && ep2 != NULL)
+ return 1;
+
if(ep1->block_num < ep2->block_num)
return -1;
if(ep1->block_num > ep2->block_num)
gint ltt_event_event_position_compare(const LttEvent *event,
const LttEventPosition *ep)
{
- if(event->tf != ep->tf)
- g_error("ltt_event_position_compare on different tracefiles makes no sense");
- if(e->which_block < ep->block_num)
+ if(event == NULL && ep == NULL)
+ return 0;
+ if(event != NULL && ep == NULL)
+ return -1;
+ if(event == NULL && ep != NULL)
+ return 1;
+
+ g_assert(event->tracefile == ep->tf);
+
+ if(event->which_block < ep->block_num)
return -1;
- if(e->which_block > ep->block_num)
+ if(event->which_block > ep->block_num)
return 1;
- if(e->which_event < ep->event_num)
+ if(event->which_event < ep->event_num)
return -1;
- if(e->which_event > ep->event_num)
+ if(event->which_event > ep->event_num)
return 1;
return 0;
}
+/*****************************************************************************
+ * Function name
+ * ltt_event_position_copy : copy position
+ * Input params
+ * src : a pointer to event's position structure source
+ * dest : a pointer to event's position structure dest
+ * Return
+ * void
+ ****************************************************************************/
+void ltt_event_position_copy(LttEventPosition *dest,
+ const LttEventPosition *src)
+{
+ if(src == NULL)
+ dest = NULL;
+ else
+ *dest = *src;
+}
/*****************************************************************************
e->tracefile->trace->system_description->endian ? 0:1;
LttTypeEnum t = f->field_type->type_class;
- if(t != LTT_UINT && t != LTT_ENUM)
- g_error("The type of the field is not unsigned int\n");
+ g_assert(t == LTT_UINT || t == LTT_ENUM);
if(f->field_size == 1){
guint8 x = *(guint8 *)(e->data + f->offset_root);
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");
+ g_assert(f->field_type->type_class == LTT_INT);
if(f->field_size == 1){
gint8 x = *(gint8 *)(e->data + f->offset_root);
e->tracefile->trace->system_description->endian ? 0:1;
LttTypeEnum t = f->field_type->type_class;
- if(t != LTT_UINT && t != LTT_ENUM)
- g_error("The type of the field is not unsigned long\n");
+ g_assert(t == LTT_UINT || t == LTT_ENUM);
if(f->field_size == 1){
guint8 x = *(guint8 *)(e->data + f->offset_root);
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");
+ g_assert( f->field_type->type_class == LTT_INT);
if(f->field_size == 1){
gint8 x = *(gint8 *)(e->data + f->offset_root);
int revFlag = e->tracefile->trace->my_arch_endian ==
e->tracefile->trace->system_description->endian ? 0:1;
- if(f->field_type->type_class != LTT_FLOAT ||
- (f->field_type->type_class == LTT_FLOAT && f->field_size != 4))
- g_error("The type of the field is not float\n");
+ g_assert(f->field_type->type_class == LTT_FLOAT && f->field_size == 4);
if(revFlag == 0) return *(float *)(e->data + f->offset_root);
else{
int revFlag = e->tracefile->trace->my_arch_endian ==
e->tracefile->trace->system_description->endian ? 0:1;
- if(f->field_type->type_class != LTT_FLOAT ||
- (f->field_type->type_class == LTT_FLOAT && f->field_size != 8))
- g_error("The type of the field is not double\n");
+ g_assert(f->field_type->type_class == LTT_FLOAT && f->field_size == 8);
if(revFlag == 0) return *(double *)(e->data + f->offset_root);
else{
char *ltt_event_get_string(LttEvent *e, LttField *f)
{
- if(f->field_type->type_class != LTT_STRING)
- g_error("The field contains no string\n");
+ g_assert(f->field_type->type_class == LTT_STRING);
+
return (char*)g_strdup((char*)(e->data + f->offset_root));
}