#include <linux/errno.h>
#include "parser.h"
+#include <ltt/ltt.h>
+#include "ltt-private.h"
#include <ltt/trace.h>
+#include <ltt/facility.h>
#define DIR_NAME_SIZE 256
return t;
}
+char * ltt_trace_name(LttTrace *t)
+{
+ return t->pathname;
+}
+
+
/******************************************************************************
* When we copy a trace, we want all the opening actions to happen again :
* the trace will be reopened and totally independant from the original.
* t : tracefile
* time : criteria of the time
****************************************************************************/
+void ltt_tracefile_find_time_block(LttTracefile *t, LttTime time,
+ int start_block, int end_block)
+{
+ int err, tmp_block, s, e;
+ int headTime;
+ int tailTime;
+
+ err=readBlock(t,start_block);
+ if(err) g_error("Can not read tracefile: %s\n", t->name);
+ if(start_block == end_block)return;
+
+ tailTime = ltt_time_compare(t->a_block_end->time, time);
+ if(tailTime >= 0) return;
+
+ err=readBlock(t,end_block);
+ if(err) g_error("Can not read tracefile: %s\n", t->name);
+ if(start_block+1 == end_block)return;
+
+ headTime = ltt_time_compare(t->a_block_start->time, time);
+ if(headTime <= 0 ) return;
+
+ tmp_block = (end_block + start_block)/2;
+ err=readBlock(t,tmp_block);
+ if(err) g_error("Can not read tracefile: %s\n", t->name);
+
+ headTime = ltt_time_compare(t->a_block_start->time, time);
+ tailTime = ltt_time_compare(t->a_block_end->time, time);
+ if(headTime <= 0 && tailTime >= 0) return;
+
+ if(headTime > 0){
+ s = start_block + 1;
+ e = tmp_block - 1;
+ if(s <= e)
+ ltt_tracefile_find_time_block(t, time, s, e);
+ else return;
+ }
+
+ if(tailTime < 0){
+ s = tmp_block + 1;
+ e = end_block - 1;
+ if(s <= e)
+ ltt_tracefile_find_time_block(t, time, s, e);
+ else return;
+ }
+}
+
+void ltt_tracefile_backward_find_time_block(LttTracefile *t, LttTime time)
+{
+ int t_time, h_time, err;
+ err=readBlock(t,t->which_block-1);
+ if(err) g_error("Can not read tracefile: %s\n", t->name);
+ h_time = ltt_time_compare(t->a_block_start->time, time);
+ t_time = ltt_time_compare(t->a_block_end->time, time);
+ if(h_time == 0){
+ int tmp;
+ if(t->which_block == 1) return;
+ err=readBlock(t,t->which_block-1);
+ if(err) g_error("Can not read tracefile: %s\n", t->name);
+ tmp = ltt_time_compare(t->a_block_end->time, time);
+ if(tmp == 0) return ltt_tracefile_seek_time(t, time);
+ err=readBlock(t,t->which_block+1);
+ if(err) g_error("Can not read tracefile: %s\n", t->name);
+ }else if(h_time > 0){
+ ltt_tracefile_find_time_block(t, time, 1, t->which_block);
+ return ltt_tracefile_seek_time(t, time) ;
+ }else{
+ if(t_time >= 0) return ltt_tracefile_seek_time(t, time);
+ err=readBlock(t,t->which_block+1);
+ if(err) g_error("Can not read tracefile: %s\n", t->name);
+ }
+}
void ltt_tracefile_seek_time(LttTracefile *t, LttTime time)
{
if(ltt_time_compare(t->prev_block_end_time, time) >= 0 ||
(t->prev_block_end_time.tv_sec == 0 &&
t->prev_block_end_time.tv_nsec == 0 )){
- err=readBlock(t,t->which_block-1);
- if(err) g_error("Can not read tracefile: %s\n", t->name);
- return ltt_tracefile_seek_time(t, time) ;
+ ltt_tracefile_backward_find_time_block(t, time);
}else{
updateTracefile(t);
}
}
}else if(tailTime < 0){
if(t->which_block != t->block_number){
- err=readBlock(t,t->which_block+1);
- if(err) g_error("Can not read tracefile: %s\n", t->name);
+ ltt_tracefile_find_time_block(t, time, t->which_block+1, t->block_number);
+ return ltt_tracefile_seek_time(t, time);
}else {
- g_print("End of file\n");
+ t->cur_event_pos = t->buffer + t->block_size;
+ g_print("End of file\n");
return;
}
- if(tailTime < 0) return ltt_tracefile_seek_time(t, time);
}else if(tailTime == 0){
t->cur_event_pos = t->last_event_pos;
t->current_event_time = time;
LttTime lTimeOffset; // Time offset in struct LttTime
guint16 evId;
gint64 nanoSec, tmpCycleCount = (((guint64)1)<<32);
- static LttCycleCount preCycleCount = 0;
- static int count = 0;
evId = *(guint16 *)tf->cur_event_pos;
if(evId == TRACE_BLOCK_START){
- count = 0;
- preCycleCount = 0;
+ tf->count = 0;
+ tf->pre_cycle_count = 0;
tf->cur_cycle_count = tf->a_block_start->cycle_count;
return tf->a_block_start->time;
}else if(evId == TRACE_BLOCK_END){
- count = 0;
- preCycleCount = 0;
+ tf->count = 0;
+ tf->pre_cycle_count = 0;
tf->cur_cycle_count = tf->a_block_end->cycle_count;
return tf->a_block_end->time;
}
// Calculate total time in cycles from start of buffer for this event
cycle_count = (LttCycleCount)*(guint32 *)(tf->cur_event_pos + EVENT_ID_SIZE);
- if(cycle_count < preCycleCount)count++;
- preCycleCount = cycle_count;
- cycle_count += tmpCycleCount * count;
+ if(cycle_count < tf->pre_cycle_count)tf->count++;
+ tf->pre_cycle_count = cycle_count;
+ cycle_count += tmpCycleCount * tf->count;
- if(tf->cur_heart_beat_number > count)
- cycle_count += tmpCycleCount * (tf->cur_heart_beat_number - count);
+ if(tf->cur_heart_beat_number > tf->count)
+ cycle_count += tmpCycleCount * (tf->cur_heart_beat_number - tf->count);
tf->cur_cycle_count = cycle_count;
else *size = LTT_UNKNOWN;
}
+/* get the node name of the system */
+
+char * ltt_trace_system_description_node_name (LttSystemDescription * s)
+{
+ return s->node_name;
+}
+
+
+/* get the domain name of the system */
+
+char * ltt_trace_system_description_domain_name (LttSystemDescription * s)
+{
+ return s->domain_name;
+}
+
+
+/* get the description of the system */
+
+char * ltt_trace_system_description_description (LttSystemDescription * s)
+{
+ return s->description;
+}
+
+
+/* get the start time of the trace */
+
+LttTime ltt_trace_system_description_trace_start_time(LttSystemDescription *s)
+{
+ return s->trace_start;
+}
+