Use the in development bt_iter_equals_pos
[lttv.git] / lttv / lttv / traceset.c
index 10108f3ceb76383f70752834713e9a42714f7470..765e3cf5552243e90e6e0bec608d0c6f9c196ba2 100644 (file)
@@ -70,6 +70,9 @@ LttvTraceset *lttv_traceset_new(void)
        ts->state_trace_handle_index = g_ptr_array_new();
        ts->has_precomputed_states = FALSE;
 
+       ts->time_span.start_time = ltt_time_zero;
+        ts->time_span.end_time = ltt_time_zero;
+       lttv_traceset_get_time_span_real(ts);
        return ts;
 }
 
@@ -483,7 +486,7 @@ guint lttv_traceset_get_cpuid_from_event(LttvEvent *event)
        if (timestamp == -1ULL) {
                return 0;
        }
-       const struct definition *scope = bt_ctf_get_top_level_scope(ctf_event, BT_STREAM_PACKET_CONTEXT);
+       const struct bt_definition *scope = bt_ctf_get_top_level_scope(ctf_event, BT_STREAM_PACKET_CONTEXT);
        if (bt_ctf_field_get_error()) {
                return 0;
        }
@@ -510,6 +513,21 @@ guint64 lttv_traceset_get_timestamp_first_event(LttvTraceset *ts)
         return lttv_traceset_position_get_timestamp(&begin_position);  
 }
 
+guint64 lttv_traceset_get_timestamp_last_event(LttvTraceset *ts)
+{
+       LttvTracesetPosition last_position;
+       struct bt_iter_pos pos;
+       last_position.bt_pos = &pos;
+       last_position.timestamp = G_MAXUINT64;
+       last_position.cpu_id = INT_MAX;
+
+       /* Assign iterator to the last event of the traces */  
+       last_position.bt_pos->type = BT_SEEK_LAST;
+       last_position.iter = ts->iter;
+
+       return lttv_traceset_position_get_timestamp(&last_position);
+}
+
 /*
  * lttv_traceset_get_timestamp_begin : returns the  minimum timestamp of 
  * all the traces in the traceset.
@@ -532,7 +550,8 @@ guint64 lttv_traceset_get_timestamp_begin(LttvTraceset *traceset)
                 {
                         currentTrace = g_ptr_array_index(traceset->traces,i);
                         timestamp_cur = bt_trace_handle_get_timestamp_begin(bt_ctx,
-                                                                        currentTrace->id);
+                                                                       currentTrace->id,
+                                                                       BT_CLOCK_REAL);
                         if(timestamp_cur < timestamp_min)
                                 timestamp_min = timestamp_cur;
                 }
@@ -564,7 +583,8 @@ guint64 lttv_traceset_get_timestamp_end(LttvTraceset *traceset)
                {
                        currentTrace = g_ptr_array_index(traceset->traces,i);
                        timestamp_cur = bt_trace_handle_get_timestamp_end(bt_ctx,
-                                                                         currentTrace->id);
+                                                                       currentTrace->id,
+                                                                       BT_CLOCK_REAL);
                        if(timestamp_cur > timestamp_max){
                                timestamp_max = timestamp_cur;
                        }
@@ -574,28 +594,37 @@ guint64 lttv_traceset_get_timestamp_end(LttvTraceset *traceset)
 }
 /*
  * lttv_traceset_get_time_span_real : return a TimeInterval representing the
- * minimum timestamp dans le maximum timestamp of the traceset.
+ * minimum timestamp and the maximum timestamp of the traceset.
  * 
  */
 TimeInterval lttv_traceset_get_time_span_real(LttvTraceset *ts)
 {
-        TimeInterval time_span;
-        time_span.start_time =ltt_time_from_uint64(lttv_traceset_get_timestamp_first_event(ts));
-        time_span.end_time = ltt_time_from_uint64(lttv_traceset_get_timestamp_end(ts));
-        return time_span;
+
+
+       if(ltt_time_compare(ts->time_span.start_time, 
+                               ltt_time_zero) == 0 && ts->traces->len > 0){
+               ts->time_span.start_time = ltt_time_from_uint64(
+                               lttv_traceset_get_timestamp_first_event(ts));
+               ts->time_span.end_time = ltt_time_from_uint64(
+                                       lttv_traceset_get_timestamp_last_event(ts));    
+       }
+        return ts->time_span;
 }
 
 /*
  * lttv_traceset_get_time_span : return a TimeInterval representing the
- * minimum timestamp dans le maximum timestamp of the traceset.
+ * minimum timestamp and the maximum timestamp of the traceset.
  * 
  */
 TimeInterval lttv_traceset_get_time_span(LttvTraceset *ts)
 {
-        TimeInterval time_span;
-        time_span.start_time =ltt_time_from_uint64(lttv_traceset_get_timestamp_begin(ts));
-        time_span.end_time = ltt_time_from_uint64(lttv_traceset_get_timestamp_end(ts));
-        return time_span;
+       if(ltt_time_compare(ts->time_span.start_time, ltt_time_zero) == 0){
+               ts->time_span.start_time =ltt_time_from_uint64(
+                                       lttv_traceset_get_timestamp_begin(ts));
+               ts->time_span.end_time = ltt_time_from_uint64(
+                                       lttv_traceset_get_timestamp_end(ts));
+       }
+        return ts->time_span;
 }
 
 const char *lttv_traceset_get_name_from_event(LttvEvent *event)
@@ -614,7 +643,7 @@ int set_values_position(const LttvTracesetPosition *pos)
        struct bt_ctf_event *event = bt_ctf_iter_read_event(pos->iter);
 
        if(event != NULL){
-               ((LttvTracesetPosition *)pos)->timestamp = bt_ctf_get_timestamp_raw(event); 
+               ((LttvTracesetPosition *)pos)->timestamp = bt_ctf_get_timestamp(event); 
                
                LttvEvent lttv_event;
                lttv_event.bt_event = event;
@@ -629,6 +658,10 @@ int set_values_position(const LttvTracesetPosition *pos)
        lttv_traceset_seek_to_position(&previous_pos);
        /*We must desallocate because the function bt_iter_get_pos() does a g_new */
        bt_iter_free_pos(previous_pos.bt_pos);
+       if (pos->timestamp == G_MAXUINT64) {
+         return 0;
+       }
+       return 1;
 }
 
 guint64 lttv_traceset_position_get_timestamp(const LttvTracesetPosition *pos)
@@ -657,29 +690,41 @@ LttTime  lttv_traceset_position_get_time(const LttvTracesetPosition *pos)
 }
 
 
-
+/* 0 if equals, other is different */
 int lttv_traceset_position_compare(const LttvTracesetPosition *pos1, const LttvTracesetPosition *pos2)
 {
 #warning " TODO :Rename for lttv_traceset_position_equals && Must return COMPARAISON OF THE 2 POSITION && verify if it is the best way to compare position"
         if(pos1 == NULL || pos2 == NULL){
                 return -1;
        }
-        
-        guint64 timeStampPos1,timeStampPos2;
-        guint cpuId1, cpuId2;
-        
-        timeStampPos1 = lttv_traceset_position_get_timestamp(pos1);
-        timeStampPos2 = lttv_traceset_position_get_timestamp(pos2);
-        
-        
-        cpuId1 = lttv_traceset_position_get_cpuid(pos1);
-        cpuId2 = lttv_traceset_position_get_cpuid(pos2);
-       
-        if(timeStampPos1 == timeStampPos2 && cpuId1 == cpuId2){
-                return 0;
+
+       int res = -1;
+#ifdef HAVE_BT_ITER_EQUALS_POS
+       if(pos1->timestamp == G_MAXUINT64 || pos2->timestamp == G_MAXUINT64) {
+               res = bt_iter_equals_pos(pos1->bt_pos, pos2->bt_pos);
        }
-        else{
-                return 1;
+#endif
+       if (res < 0) {
+       
+               guint64 timeStampPos1,timeStampPos2;
+               guint cpuId1, cpuId2;
+               
+               timeStampPos1 = lttv_traceset_position_get_timestamp(pos1);
+               timeStampPos2 = lttv_traceset_position_get_timestamp(pos2);
+               
+               if (timeStampPos1 == timeStampPos2) {
+
+                       cpuId1 = lttv_traceset_position_get_cpuid(pos1);
+                       cpuId2 = lttv_traceset_position_get_cpuid(pos2);
+               
+                       if(cpuId1 == cpuId2){
+                               return 0;
+                       }
+               }
+               return 1;
+       } else {
+               
+               return !res;
        }
 }
 
This page took 0.024185 seconds and 4 git commands to generate.