main window call process_traceset for each viewer
[lttv.git] / ltt / branches / poly / ltt / tracefile.c
index 07b8ab3a837a1f3d5cb7a69124a1f58f5482df87..debf0327eb40bdc235b69963afb317cd26f2752f 100644 (file)
@@ -5,9 +5,11 @@
 #include <dirent.h>
 #include <linux/errno.h>  
 
-#include <ltt/LTTTypes.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
 
@@ -108,7 +110,7 @@ void ltt_tracefile_open_control(LttTrace *t, char * control_name)
   LttTracefile * tf;
   LttEvent * ev;
   LttFacility * f;
-  uint16_t evId;
+  guint16 evId;
   void * pos;
   FacilityLoad fLoad;
   int i;
@@ -128,7 +130,7 @@ void ltt_tracefile_open_control(LttTrace *t, char * control_name)
        pos = ev->data;
        fLoad.name = (char*)pos;
        fLoad.checksum = *(LttChecksum*)(pos + strlen(fLoad.name));
-       fLoad.base_code = *(uint32_t*)(pos + strlen(fLoad.name) + sizeof(LttChecksum));
+       fLoad.base_code = *(guint32 *)(pos + strlen(fLoad.name) + sizeof(LttChecksum));
 
        for(i=0;i<t->facility_number;i++){
          f = (LttFacility*)g_ptr_array_index(t->facilities,i);
@@ -459,6 +461,12 @@ LttTrace *ltt_trace_open(const char *pathname)
   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.
@@ -739,6 +747,77 @@ unsigned ltt_tracefile_block_number(LttTracefile *tf)
  *    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)
 {
@@ -779,23 +858,22 @@ void ltt_tracefile_seek_time(LttTracefile *t, LttTime time)
     if(t->which_block == 1){
       updateTracefile(t);      
     }else{
-      if(ltt_time_compare(t->prev_block_end_time, time) >= 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) ;
+      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 )){
+       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");      
       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;  
@@ -854,14 +932,14 @@ LttEvent *ltt_tracefile_read(LttTracefile *t)
     if(err)g_error("Can not read tracefile");    
   }
 
-  lttEvent->event_id = (int)(*(uint16_t *)(t->cur_event_pos));
+  lttEvent->event_id = (int)(*(guint16 *)(t->cur_event_pos));
   if(lttEvent->event_id == TRACE_TIME_HEARTBEAT)
     t->cur_heart_beat_number++;
 
   t->prev_event_time  = t->current_event_time;
   //  t->current_event_time = getEventTime(t);
 
-  lttEvent->time_delta = *(uint32_t*)(t->cur_event_pos + EVENT_ID_SIZE);
+  lttEvent->time_delta = *(guint32 *)(t->cur_event_pos + EVENT_ID_SIZE);
   lttEvent->event_time = t->current_event_time;
 
   lttEvent->tracefile = t;
@@ -917,7 +995,7 @@ int readFile(int fd, void * buf, size_t size, char * mesg)
 int readBlock(LttTracefile * tf, int whichBlock)
 {
   off_t nbBytes;
-  uint32_t lostSize;
+  guint32 lostSize;
 
   if(whichBlock - tf->which_block == 1 && tf->which_block != 0){
     tf->prev_block_end_time = tf->a_block_end->time;
@@ -936,7 +1014,7 @@ int readBlock(LttTracefile * tf, int whichBlock)
     return EIO;
 
   tf->a_block_start=(BlockStart *) (tf->buffer + EVENT_HEADER_SIZE);
-  lostSize = *(uint32_t*)(tf->buffer + tf->block_size - sizeof(uint32_t));
+  lostSize = *(guint32 *)(tf->buffer + tf->block_size - sizeof(guint32));
   tf->a_block_end=(BlockEnd *)(tf->buffer + tf->block_size - 
                                lostSize + EVENT_HEADER_SIZE); 
   tf->last_event_pos = tf->buffer + tf->block_size - lostSize;
@@ -989,7 +1067,7 @@ int skipEvent(LttTracefile * t)
   LttEventType * evT;
   LttField * rootFld;
 
-  evId   = (int)(*(uint16_t *)(t->cur_event_pos));
+  evId   = (int)(*(guint16 *)(t->cur_event_pos));
   evData = t->cur_event_pos + EVENT_HEADER_SIZE;
 
   evT    = ltt_trace_eventtype_get(t->trace,(unsigned)evId);
@@ -1064,12 +1142,12 @@ LttTime getEventTime(LttTracefile * tf)
   LttCycleCount lEventTotalCycle; // Total cycles from start for event
   double        lEventNSec;       // Total usecs from start for event
   LttTime       lTimeOffset;      // Time offset in struct LttTime
-  uint16_t      evId;
-  int64_t       nanoSec, tmpCycleCount = (((uint64_t)1)<<32);
+  guint16       evId;
+  gint64        nanoSec, tmpCycleCount = (((guint64)1)<<32);
   static LttCycleCount preCycleCount = 0;
   static int   count = 0;
 
-  evId = *(uint16_t*)tf->cur_event_pos;
+  evId = *(guint16 *)tf->cur_event_pos;
   if(evId == TRACE_BLOCK_START){
     count = 0;
     preCycleCount = 0;
@@ -1083,7 +1161,7 @@ LttTime getEventTime(LttTracefile * tf)
   }
   
   // Calculate total time in cycles from start of buffer for this event
-  cycle_count = (LttCycleCount)*(uint32_t*)(tf->cur_event_pos + EVENT_ID_SIZE);
+  cycle_count = (LttCycleCount)*(guint32 *)(tf->cur_event_pos + EVENT_ID_SIZE);
   
   if(cycle_count < preCycleCount)count++;
   preCycleCount = cycle_count;
@@ -1271,11 +1349,11 @@ int getFieldtypeSize(LttTracefile * t, LttEventType * evT, int offsetRoot,
 
 int getIntNumber(int size, void *evD)
 {
-  int64_t i;
-  if(size == 1)      i = *(int8_t *)evD;
-  else if(size == 2) i = *(int16_t *)evD;
-  else if(size == 4) i = *(int32_t *)evD;
-  else if(size == 8) i = *(int64_t *)evD;
+  gint64 i;
+  if(size == 1)      i = *(gint8 *)evD;
+  else if(size == 2) i = *(gint16 *)evD;
+  else if(size == 4) i = *(gint32 *)evD;
+  else if(size == 8) i = *(gint64 *)evD;
  
   return (int) i;
 }
@@ -1309,3 +1387,34 @@ void getDataEndianType(LttArchSize * size, LttArchEndian * endian)
   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;
+}
+
This page took 0.026225 seconds and 4 git commands to generate.