add trace verification at opening
[lttv.git] / ltt / branches / poly / ltt / tracefile.c
index 3eefa029003d98b4049cf274a398ab0a0d6454dc..6fe13f1dbd13ee9311885c49037de55db9c57612 100644 (file)
@@ -76,11 +76,6 @@ GQuark LTT_TRACEFILE_NAME_FACILITIES;
 #define PAGE_MASK (~(page_size-1))
 #define PAGE_ALIGN(addr)  (((addr)+page_size-1)&PAGE_MASK)
 
-/* obtain the time of an event */
-
-static inline LttTime getEventTime(LttTracefile * tf);
-
-
 /* set the offset of the fields belonging to the event,
    need the information of the archecture */
 void set_fields_offsets(LttTracefile *tf, LttEventType *event_type);
@@ -190,6 +185,11 @@ LttFacility *ltt_trace_get_facility_by_num(LttTrace *t,
 
 }
 
+guint ltt_trace_get_num_cpu(LttTrace *t)
+{
+  return t->num_cpu;
+}
+
 
 /*****************************************************************************
  *Function name
@@ -540,7 +540,6 @@ int get_tracefile_name_number(const gchar *raw_name,
 {
   guint raw_name_len = strlen(raw_name);
   gchar char_name[PATH_MAX];
-  gchar *digit_begin;
   int i;
   int underscore_pos;
   long int cpu_num;
@@ -689,8 +688,6 @@ static int open_tracefiles(LttTrace *trace, gchar *root_path,
                        GQuark name;
       guint num;
       GArray *group;
-      LttTracefile *tf;
-      guint len;
       
       if(get_tracefile_name_number(rel_path, &name, &num))
         continue; /* invalid name */
@@ -959,7 +956,6 @@ static int ltt_process_facility_tracefile(LttTracefile *tf)
   return 0;
 
   /* Error handling */
-facility_error:
 event_id_error:
 fac_id_error:
 update_error:
@@ -975,8 +971,14 @@ LttTrace *ltt_trace_open(const gchar *pathname)
   LttTrace  * t;
   LttTracefile *tf;
   GArray *group;
-  int i;
+  int i, ret;
   struct ltt_block_start_header *header;
+       DIR *dir;
+       struct dirent *entry;
+  guint control_found = 0;
+  guint eventdefs_found = 0;
+       struct stat stat_buf;
+  gchar path[PATH_MAX];
   
   t = g_new(LttTrace, 1);
   if(!t) goto alloc_error;
@@ -984,11 +986,40 @@ LttTrace *ltt_trace_open(const gchar *pathname)
   get_absolute_pathname(pathname, abs_path);
   t->pathname = g_quark_from_string(abs_path);
 
-  /* Open all the tracefiles */
   g_datalist_init(&t->tracefiles);
+
+  /* Test to see if it looks like a trace */
+       dir = opendir(abs_path);
+       if(dir == NULL) {
+               perror(abs_path);
+               goto open_error;
+       }
+       while((entry = readdir(dir)) != NULL) {
+    strcpy(path, abs_path);
+    strcat(path, "/");
+    strcat(path, entry->d_name);
+               ret = stat(path, &stat_buf);
+               if(ret == -1) {
+                       perror(path);
+                       continue;
+               }
+               if(S_ISDIR(stat_buf.st_mode)) {
+      if(strcmp(entry->d_name, "control") == 0) {
+        control_found = 1;
+      }
+      if(strcmp(entry->d_name, "eventdefs") == 0) {
+        eventdefs_found = 1;
+      }
+    }
+  }
+  closedir(dir);
+  
+  if(!control_found || !eventdefs_found) goto find_error;
+  
+  /* Open all the tracefiles */
   if(open_tracefiles(t, abs_path, "")) {
     g_warning("Error opening tracefile %s", abs_path);
-    goto open_error;
+    goto find_error;
   }
   
   /* Prepare the facilities containers : array and mapping */
@@ -1021,7 +1052,8 @@ LttTrace *ltt_trace_open(const gchar *pathname)
   t->has_heartbeat = header->trace.has_heartbeat;
   t->has_alignment = header->trace.has_alignment;
   t->has_tsc = header->trace.has_tsc;
-  
+
+  t->num_cpu = group->len;
   
   for(i=0; i<group->len; i++) {
     tf = &g_array_index (group, LttTracefile, i);
@@ -1035,15 +1067,16 @@ LttTrace *ltt_trace_open(const gchar *pathname)
 facilities_error:
   g_datalist_clear(&t->facilities_by_name);
   g_array_free(t->facilities_by_num, TRUE);
-open_error:
+find_error:
   g_datalist_clear(&t->tracefiles);
+open_error:
   g_free(t);
 alloc_error:
   return NULL;
 
 }
 
-GQuark ltt_trace_name(LttTrace *t)
+GQuark ltt_trace_name(const LttTrace *t)
 {
   return t->pathname;
 }
@@ -1157,7 +1190,6 @@ LttTracefile *ltt_trace_find_tracefile(LttTrace *t, const gchar *name)
 static void ltt_tracefile_time_span_get(LttTracefile *tf,
                                         LttTime *start, LttTime *end)
 {
-  struct ltt_block_start_header * header;
   int err;
 
   err = map_block(tf, 0);
@@ -1386,11 +1418,12 @@ int ltt_tracefile_seek_position(LttTracefile *tf, const LttEventPosition *ep) {
   err = ltt_tracefile_read_op(tf);
   if(err) goto fail;
 
-  return;
+  return 0;
 
 fail:
   g_error("ltt_tracefile_seek_time failed on tracefile %s", 
       g_quark_to_string(tf->name));
+  return 1;
 }
 
 /* Calculate the real event time based on the buffer boundaries */
@@ -1486,9 +1519,6 @@ int ltt_tracefile_read_seek(LttTracefile *tf)
 /* do specific operation on events */
 int ltt_tracefile_read_op(LttTracefile *tf)
 {
-  int err;
-  LttFacility *f;
-  void * pos;
   LttEvent *event;
 
   event = &tf->event;
@@ -1508,8 +1538,6 @@ int ltt_tracefile_read_op(LttTracefile *tf)
  * event specific operation. */
 int ltt_tracefile_read_update_event(LttTracefile *tf)
 {
-  int err;
-  LttFacility *f;
   void * pos;
   LttEvent *event;
  
@@ -1766,7 +1794,6 @@ static int ltt_seek_next_event(LttTracefile *tf)
 {
   int ret = 0;
   void *pos;
-  ssize_t event_size;
   
   /* seek over the buffer header if we are at the buffer start */
   if(tf->event.offset == 0) {
@@ -2038,7 +2065,6 @@ gint check_fields_compatibility(LttEventType *event_type1,
     LttField *field1, LttField *field2)
 {
   guint different = 0;
-  enum field_status local_fixed_root, local_fixed_parent;
   guint i;
   LttType *type1;
   LttType *type2;
@@ -2064,11 +2090,6 @@ gint check_fields_compatibility(LttEventType *event_type1,
   type1 = field1->field_type;
   type2 = field2->field_type;
 
-  size_t current_root_offset;
-  size_t current_offset;
-  enum field_status current_child_status, final_child_status;
-  size_t max_size;
-
   if(type1->type_class != type2->type_class) {
     different = 1;
     goto end;
This page took 0.030401 seconds and 4 git commands to generate.