+guint lttv_trace_get_num_cpu(LttvTrace *t)
+{
+#warning "TODO - Set the right number of CPU"
+ return 24;
+}
+
+LttvTracesetPosition *lttv_traceset_create_current_position(const LttvTraceset *traceset)
+{
+ LttvTracesetPosition *traceset_pos;
+
+ traceset_pos = g_new(LttvTracesetPosition, 1);
+
+ /* Check if the new passed */
+ if(traceset_pos == NULL) {
+ return NULL;
+ }
+
+ traceset_pos->iter = traceset->iter;
+ traceset_pos->bt_pos = bt_iter_get_pos(bt_ctf_get_iter(traceset->iter));
+ traceset_pos->timestamp = G_MAXUINT64;
+ traceset_pos->cpu_id = INT_MAX;
+
+ return traceset_pos;
+}
+
+LttvTracesetPosition *lttv_traceset_create_time_position(LttvTraceset *traceset,
+ LttTime timestamp)
+{
+ LttvTracesetPosition *traceset_pos;
+
+ traceset_pos = g_new(LttvTracesetPosition, 1);
+
+ /* Check if the new passed */
+ if(traceset_pos == NULL) {
+ return NULL;
+ }
+
+ traceset_pos->iter = traceset->iter;
+ traceset_pos->bt_pos = bt_iter_create_time_pos(
+ bt_ctf_get_iter(traceset_pos->iter),
+ ltt_time_to_uint64(timestamp));
+ traceset_pos->timestamp = G_MAXUINT64;
+ traceset_pos->cpu_id = INT_MAX;
+ return traceset_pos;
+}
+
+void lttv_traceset_destroy_position(LttvTracesetPosition *traceset_pos)
+{
+ bt_iter_free_pos(traceset_pos->bt_pos);
+ g_free(traceset_pos);
+}
+
+void lttv_traceset_seek_to_position(const LttvTracesetPosition *traceset_pos)
+{
+ bt_iter_set_pos(bt_ctf_get_iter(traceset_pos->iter), traceset_pos->bt_pos);
+}
+
+guint lttv_traceset_get_cpuid_from_event(LttvEvent *event)
+{
+ unsigned long timestamp;
+ unsigned int cpu_id;
+
+ struct bt_ctf_event *ctf_event = event->bt_event;
+ timestamp = bt_ctf_get_timestamp(ctf_event);
+ if (timestamp == -1ULL) {
+ return 0;
+ }
+ 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;
+ }
+ cpu_id = bt_ctf_get_uint64(bt_ctf_get_field(ctf_event, scope, "cpu_id"));
+ if (bt_ctf_field_get_error()) {
+ return 0;
+ } else {
+ return cpu_id;
+ }
+}
+
+guint64 lttv_traceset_get_timestamp_first_event(LttvTraceset *ts)
+{
+ LttvTracesetPosition begin_position;
+ struct bt_iter_pos pos;
+ begin_position.bt_pos = &pos;
+ begin_position.timestamp = G_MAXUINT64;
+ begin_position.cpu_id = INT_MAX;
+
+ /* Assign iterator to the beginning of the traces */
+ begin_position.bt_pos->type = BT_SEEK_BEGIN;
+ begin_position.iter = ts->iter;
+
+ 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.
+ *
+ */
+guint64 lttv_traceset_get_timestamp_begin(LttvTraceset *traceset)
+{
+ struct bt_context *bt_ctx;
+ bt_ctx = lttv_traceset_get_context(traceset);
+ guint64 timestamp_min, timestamp_cur = 0;
+ int i;
+ int trace_count;
+ LttvTrace *currentTrace;
+ trace_count = traceset->traces->len;
+ if(trace_count == 0)
+ timestamp_min = 0;
+ else{
+ timestamp_min = G_MAXUINT64;
+ for(i = 0; i < trace_count;i++)
+ {
+ currentTrace = g_ptr_array_index(traceset->traces,i);
+ timestamp_cur = bt_trace_handle_get_timestamp_begin(bt_ctx,
+ currentTrace->id,
+ BT_CLOCK_REAL);
+ if(timestamp_cur < timestamp_min)
+ timestamp_min = timestamp_cur;
+ }
+ }
+ return timestamp_min;
+}
+
+/*
+ * lttv_traceset_get_timestamp_end: returns the maximum timestamp of
+ * all the traces in the traceset.
+ *
+ */
+guint64 lttv_traceset_get_timestamp_end(LttvTraceset *traceset)
+{
+ struct bt_context *bt_ctx;
+ bt_ctx = lttv_traceset_get_context(traceset);
+ guint64 timestamp_max, timestamp_cur = 0;
+ int i;
+ int trace_count;
+ LttvTrace *currentTrace;
+ trace_count = traceset->traces->len;
+
+ if(trace_count == 0){
+ timestamp_max = 1;
+ }
+ else{
+ timestamp_max = 0;
+ for(i =0; i < trace_count;i++)
+ {
+ currentTrace = g_ptr_array_index(traceset->traces,i);
+ timestamp_cur = bt_trace_handle_get_timestamp_end(bt_ctx,
+ currentTrace->id,
+ BT_CLOCK_REAL);
+ if(timestamp_cur > timestamp_max){
+ timestamp_max = timestamp_cur;
+ }
+ }
+ }
+ return timestamp_max;
+}
+/*
+ * lttv_traceset_get_time_span_real : return a TimeInterval representing the
+ * minimum timestamp and the maximum timestamp of the traceset.
+ *
+ */
+TimeInterval lttv_traceset_get_time_span_real(LttvTraceset *ts)
+{
+
+
+ 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 and the maximum timestamp of the traceset.
+ *
+ */
+TimeInterval lttv_traceset_get_time_span(LttvTraceset *ts)
+{
+ 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)
+{
+ return bt_ctf_event_name(event->bt_event);
+}
+
+int set_values_position(const LttvTracesetPosition *pos)
+{
+ LttvTracesetPosition previous_pos;
+ previous_pos.iter = pos->iter;
+ previous_pos.bt_pos = bt_iter_get_pos(bt_ctf_get_iter(pos->iter));
+ /* Seek to the new desired position */
+ lttv_traceset_seek_to_position(pos);
+ /*Read the event*/
+ struct bt_ctf_event *event = bt_ctf_iter_read_event(pos->iter);
+
+ if(event != NULL){
+ ((LttvTracesetPosition *)pos)->timestamp = bt_ctf_get_timestamp(event);
+
+ LttvEvent lttv_event;
+ lttv_event.bt_event = event;
+ ((LttvTracesetPosition *)pos)->cpu_id = lttv_traceset_get_cpuid_from_event(<tv_event);
+ }
+ else {
+ /* The event is null */
+ return 0;
+ }
+
+ /* Reassign the previously saved position */
+ 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)
+{
+ if(pos->timestamp == G_MAXUINT64){
+ if(set_values_position(pos) == 0){
+ return 0;
+ }
+ }
+
+ return pos->timestamp;
+}
+
+int lttv_traceset_position_get_cpuid(const LttvTracesetPosition *pos){
+ if(pos->cpu_id == INT_MAX ){
+ if(set_values_position(pos) == 0){
+ return 0;
+ }
+ }
+ return pos->cpu_id;
+}
+
+LttTime lttv_traceset_position_get_time(const LttvTracesetPosition *pos)
+{
+ return ltt_time_from_uint64(lttv_traceset_position_get_timestamp(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;
+ }
+
+ 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);
+ }
+#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;
+ }
+}
+
+int lttv_traceset_position_time_compare(const LttvTracesetPosition *pos1,
+ const LttvTracesetPosition *pos2)
+{
+ guint64 timeStampPos1,timeStampPos2;
+
+ timeStampPos1 = lttv_traceset_position_get_timestamp(pos1);
+ timeStampPos2 = lttv_traceset_position_get_timestamp(pos2);
+
+ return timeStampPos1 - timeStampPos2;
+}
+int lttv_traceset_position_compare_current(const LttvTraceset *ts,
+ const LttvTracesetPosition *pos)
+{
+ int result = 0;
+ LttvTracesetPosition *curPos = lttv_traceset_create_current_position(ts);
+
+ result = lttv_traceset_position_compare(curPos,pos);
+
+ lttv_traceset_destroy_position(curPos);
+
+ return result;
+}
+
+LttTime lttv_traceset_get_current_time(const LttvTraceset *ts)
+{
+ LttvTracesetPosition *curPos = lttv_traceset_create_current_position(ts);
+ guint64 currentTimestamp = lttv_traceset_position_get_timestamp(curPos);
+ lttv_traceset_destroy_position(curPos);
+
+ return ltt_time_from_uint64(currentTimestamp);
+}