API fix : fill the values for timestamp begin and end
[babeltrace.git] / formats / ctf / ctf.c
index 2965f496f2fc7a0ae51d55519975cf5257e00f7a..32206166b2a2c43a637dbf7e0e36489d297bd0da 100644 (file)
@@ -87,6 +87,12 @@ void ctf_set_handle(struct trace_descriptor *descriptor,
 
 static
 void ctf_close_trace(struct trace_descriptor *descriptor);
+static
+uint64_t ctf_timestamp_begin(struct trace_descriptor *descriptor,
+               struct bt_trace_handle *handle);
+static
+uint64_t ctf_timestamp_end(struct trace_descriptor *descriptor,
+               struct bt_trace_handle *handle);
 
 static
 rw_dispatch read_dispatch_table[] = {
@@ -119,13 +125,102 @@ struct format ctf_format = {
        .close_trace = ctf_close_trace,
        .set_context = ctf_set_context,
        .set_handle = ctf_set_handle,
+       .timestamp_begin = ctf_timestamp_begin,
+       .timestamp_end = ctf_timestamp_end,
 };
 
+static
+uint64_t ctf_timestamp_begin(struct trace_descriptor *descriptor,
+               struct bt_trace_handle *handle)
+{
+       struct ctf_trace *tin;
+       uint64_t begin = ULLONG_MAX;
+       int i, j;
+
+       tin = container_of(descriptor, struct ctf_trace, parent);
+
+       if (!tin)
+               goto error;
+
+       /* for each stream_class */
+       for (i = 0; i < tin->streams->len; i++) {
+               struct ctf_stream_declaration *stream_class;
+
+               stream_class = g_ptr_array_index(tin->streams, i);
+               /* for each file_stream */
+               for (j = 0; j < stream_class->streams->len; j++) {
+                       struct ctf_stream_definition *stream;
+                       struct ctf_file_stream *cfs;
+                       struct ctf_stream_pos *stream_pos;
+                       struct packet_index *index;
+
+                       stream = g_ptr_array_index(stream_class->streams, j);
+                       cfs = container_of(stream, struct ctf_file_stream,
+                                       parent);
+                       stream_pos = &cfs->pos;
+
+                       index = &g_array_index(stream_pos->packet_index,
+                                       struct packet_index, 0);
+                       if (index->timestamp_begin < begin)
+                               begin = index->timestamp_begin;
+               }
+       }
+
+       return begin;
+
+error:
+       return -1ULL;
+}
+
+static
+uint64_t ctf_timestamp_end(struct trace_descriptor *descriptor,
+               struct bt_trace_handle *handle)
+{
+       struct ctf_trace *tin;
+       uint64_t end = 0;
+       int i, j;
+
+       tin = container_of(descriptor, struct ctf_trace, parent);
+
+       if (!tin)
+               goto error;
+
+       /* for each stream_class */
+       for (i = 0; i < tin->streams->len; i++) {
+               struct ctf_stream_declaration *stream_class;
+
+               stream_class = g_ptr_array_index(tin->streams, i);
+               /* for each file_stream */
+               for (j = 0; j < stream_class->streams->len; j++) {
+                       struct ctf_stream_definition *stream;
+                       struct ctf_file_stream *cfs;
+                       struct ctf_stream_pos *stream_pos;
+                       struct packet_index *index;
+
+                       stream = g_ptr_array_index(stream_class->streams, j);
+                       cfs = container_of(stream, struct ctf_file_stream,
+                                       parent);
+                       stream_pos = &cfs->pos;
+
+                       index = &g_array_index(stream_pos->packet_index,
+                                       struct packet_index,
+                                       stream_pos->packet_index->len - 1);
+                       if (index->timestamp_end > end)
+                               end = index->timestamp_end;
+               }
+       }
+
+       return end;
+
+error:
+       return -1ULL;
+}
+
 /*
  * Update stream current timestamp, keep at clock frequency.
  */
 static
-void ctf_update_timestamp(struct ctf_stream *stream,
+void ctf_update_timestamp(struct ctf_stream_definition *stream,
                          struct definition_integer *integer_definition)
 {
        struct declaration_integer *integer_declaration =
@@ -156,7 +251,7 @@ void ctf_update_timestamp(struct ctf_stream *stream,
  * applying offsets as needed (unix time).
  */
 void ctf_print_timestamp(FILE *fp,
-                       struct ctf_stream *stream,
+                       struct ctf_stream_definition *stream,
                        uint64_t timestamp)
 {
        uint64_t ts_sec = 0, ts_nsec;
@@ -221,12 +316,12 @@ end:
 }
 
 static
-int ctf_read_event(struct stream_pos *ppos, struct ctf_stream *stream)
+int ctf_read_event(struct stream_pos *ppos, struct ctf_stream_definition *stream)
 {
        struct ctf_stream_pos *pos =
                container_of(ppos, struct ctf_stream_pos, parent);
-       struct ctf_stream_class *stream_class = stream->stream_class;
-       struct ctf_stream_event *event;
+       struct ctf_stream_declaration *stream_class = stream->stream_class;
+       struct ctf_event_definition *event;
        uint64_t id = 0;
        int ret;
 
@@ -335,10 +430,10 @@ error:
 }
 
 static
-int ctf_write_event(struct stream_pos *pos, struct ctf_stream *stream)
+int ctf_write_event(struct stream_pos *pos, struct ctf_stream_definition *stream)
 {
-       struct ctf_stream_class *stream_class = stream->stream_class;
-       struct ctf_stream_event *event;
+       struct ctf_stream_declaration *stream_class = stream->stream_class;
+       struct ctf_event_definition *event;
        uint64_t id;
        int ret;
 
@@ -898,11 +993,11 @@ end_stream:
 }
 
 static
-struct ctf_stream_event *create_event_definitions(struct ctf_trace *td,
-                                                 struct ctf_stream *stream,
-                                                 struct ctf_event *event)
+struct ctf_event_definition *create_event_definitions(struct ctf_trace *td,
+                                                 struct ctf_stream_definition *stream,
+                                                 struct ctf_event_declaration *event)
 {
-       struct ctf_stream_event *stream_event = g_new0(struct ctf_stream_event, 1);
+       struct ctf_event_definition *stream_event = g_new0(struct ctf_event_definition, 1);
 
        if (event->context_decl) {
                struct definition *definition =
@@ -926,6 +1021,7 @@ struct ctf_stream_event *create_event_definitions(struct ctf_trace *td,
                                        struct definition_struct, p);
                stream->parent_def_scope = stream_event->event_fields->p.scope;
        }
+       stream_event->stream = stream;
        return stream_event;
 
 error:
@@ -937,9 +1033,9 @@ error:
 }
 
 static
-int create_stream_definitions(struct ctf_trace *td, struct ctf_stream *stream)
+int create_stream_definitions(struct ctf_trace *td, struct ctf_stream_definition *stream)
 {
-       struct ctf_stream_class *stream_class;
+       struct ctf_stream_declaration *stream_class;
        int ret;
        int i;
 
@@ -987,8 +1083,8 @@ int create_stream_definitions(struct ctf_trace *td, struct ctf_stream *stream)
        stream->events_by_id = g_ptr_array_new();
        g_ptr_array_set_size(stream->events_by_id, stream_class->events_by_id->len);
        for (i = 0; i < stream->events_by_id->len; i++) {
-               struct ctf_event *event = g_ptr_array_index(stream_class->events_by_id, i);
-               struct ctf_stream_event *stream_event;
+               struct ctf_event_declaration *event = g_ptr_array_index(stream_class->events_by_id, i);
+               struct ctf_event_definition *stream_event;
 
                if (!event)
                        continue;
@@ -1001,7 +1097,7 @@ int create_stream_definitions(struct ctf_trace *td, struct ctf_stream *stream)
 
 error_event:
        for (i = 0; i < stream->events_by_id->len; i++) {
-               struct ctf_stream_event *stream_event = g_ptr_array_index(stream->events_by_id, i);
+               struct ctf_event_definition *stream_event = g_ptr_array_index(stream->events_by_id, i);
                if (stream_event)
                        g_free(stream_event);
        }
@@ -1021,7 +1117,7 @@ static
 int create_stream_packet_index(struct ctf_trace *td,
                               struct ctf_file_stream *file_stream)
 {
-       struct ctf_stream_class *stream;
+       struct ctf_stream_declaration *stream;
        int len_index;
        struct ctf_stream_pos *pos;
        struct stat filestats;
@@ -1236,7 +1332,7 @@ int create_stream_packet_index(struct ctf_trace *td,
 }
 
 static
-int create_trace_definitions(struct ctf_trace *td, struct ctf_stream *stream)
+int create_trace_definitions(struct ctf_trace *td, struct ctf_stream_definition *stream)
 {
        int ret;
 
@@ -1462,7 +1558,7 @@ static
 int prepare_mmap_stream_definition(struct ctf_trace *td,
                struct ctf_file_stream *file_stream)
 {
-       struct ctf_stream_class *stream;
+       struct ctf_stream_declaration *stream;
        uint64_t stream_id = 0;
        int ret;
 
@@ -1601,7 +1697,7 @@ void ctf_close_trace(struct trace_descriptor *tdp)
 
        if (td->streams) {
                for (i = 0; i < td->streams->len; i++) {
-                       struct ctf_stream_class *stream;
+                       struct ctf_stream_declaration *stream;
                        int j;
 
                        stream = g_ptr_array_index(td->streams, i);
@@ -1616,6 +1712,16 @@ void ctf_close_trace(struct trace_descriptor *tdp)
                }
                g_ptr_array_free(td->streams, TRUE);
        }
+
+       if (td->event_declarations) {
+               for (i = 0; i < td->event_declarations->len; i++) {
+                       struct bt_ctf_event_decl *event;
+
+                       event = g_ptr_array_index(td->event_declarations, i);
+                       g_free(event);
+               }
+               g_ptr_array_free(td->event_declarations, TRUE);
+       }
        closedir(td->dir);
        g_free(td);
 }
This page took 0.026724 seconds and 4 git commands to generate.