Fix null stream handling
[babeltrace.git] / formats / ctf / ctf.c
index e84e19d870e0d5bd1531e8cdb9266effa2d6806b..5e43d2fa867cce377f14cf9869929ef20afd79bd 100644 (file)
@@ -52,7 +52,9 @@
 
 extern int yydebug;
 
+static
 struct trace_descriptor *ctf_open_trace(const char *path, int flags);
+static
 void ctf_close_trace(struct trace_descriptor *descriptor);
 
 static
@@ -101,6 +103,7 @@ int ctf_read_event(struct stream_pos *ppos, struct ctf_stream *stream)
        /* Read event header */
        if (stream_class->event_header) {
                struct definition_integer *integer_definition;
+               struct definition *variant;
 
                ret = generic_rw(ppos, &stream_class->event_header->p);
                if (ret)
@@ -118,20 +121,21 @@ int ctf_read_event(struct stream_pos *ppos, struct ctf_stream *stream)
                        }
                }
 
+               variant = lookup_variant(&stream_class->event_header->p, "v");
+               if (variant) {
+                       integer_definition = lookup_integer(variant, "id", FALSE);
+                       if (integer_definition) {
+                               id = integer_definition->value._unsigned;
+                       }
+               }
+
                /* lookup timestamp */
                integer_definition = lookup_integer(&stream_class->event_header->p, "timestamp", FALSE);
                if (integer_definition) {
                        stream->timestamp = integer_definition->value._unsigned;
                } else {
-                       struct definition *definition;
-
-                       definition = lookup_variant(&stream_class->event_header->p, "v");
-                       if (definition) {
-                               integer_definition = lookup_integer(definition, "id", FALSE);
-                               if (integer_definition) {
-                                       id = integer_definition->value._unsigned;
-                               }
-                               integer_definition = lookup_integer(definition, "timestamp", FALSE);
+                       if (variant) {
+                               integer_definition = lookup_integer(variant, "timestamp", FALSE);
                                if (integer_definition) {
                                        stream->timestamp = integer_definition->value._unsigned;
                                }
@@ -183,23 +187,32 @@ int ctf_write_event(struct stream_pos *pos, struct ctf_stream *stream)
        struct ctf_stream_class *stream_class = stream->stream_class;
        struct ctf_event *event_class;
        uint64_t id = 0;
-       int len_index;
        int ret;
 
        /* print event header */
        if (stream_class->event_header) {
+               struct definition_integer *integer_definition;
+               struct definition *variant;
+
                /* lookup event id */
-               len_index = struct_declaration_lookup_field_index(stream_class->event_header_decl,
-                               g_quark_from_static_string("id"));
-               if (len_index >= 0) {
-                       struct definition_integer *defint;
-                       struct definition *field;
-
-                       field = struct_definition_get_field_from_index(stream_class->event_header, len_index);
-                       assert(field->declaration->id == CTF_TYPE_INTEGER);
-                       defint = container_of(field, struct definition_integer, p);
-                       assert(defint->declaration->signedness == FALSE);
-                       id = defint->value._unsigned;   /* set id */
+               integer_definition = lookup_integer(&stream_class->event_header->p, "id", FALSE);
+               if (integer_definition) {
+                       id = integer_definition->value._unsigned;
+               } else {
+                       struct definition_enum *enum_definition;
+
+                       enum_definition = lookup_enum(&stream_class->event_header->p, "id", FALSE);
+                       if (enum_definition) {
+                               id = enum_definition->integer->value._unsigned;
+                       }
+               }
+
+               variant = lookup_variant(&stream_class->event_header->p, "v");
+               if (variant) {
+                       integer_definition = lookup_integer(variant, "id", FALSE);
+                       if (integer_definition) {
+                               id = integer_definition->value._unsigned;
+                       }
                }
 
                ret = generic_rw(pos, &stream_class->event_header->p);
@@ -896,6 +909,7 @@ error:
        return ret;
 }
 
+static
 struct trace_descriptor *ctf_open_trace(const char *path, int flags)
 {
        struct ctf_trace *td;
@@ -934,6 +948,7 @@ void ctf_close_file_stream(struct ctf_file_stream *file_stream)
        close(file_stream->pos.fd);
 }
 
+static
 void ctf_close_trace(struct trace_descriptor *tdp)
 {
        struct ctf_trace *td = container_of(tdp, struct ctf_trace, parent);
@@ -943,7 +958,10 @@ void ctf_close_trace(struct trace_descriptor *tdp)
                for (i = 0; i < td->streams->len; i++) {
                        struct ctf_stream_class *stream;
                        int j;
+
                        stream = g_ptr_array_index(td->streams, i);
+                       if (!stream)
+                               continue;
                        for (j = 0; j < stream->files->len; j++) {
                                struct ctf_file_stream *file_stream;
                                file_stream = g_ptr_array_index(stream->files, j);
This page took 0.024033 seconds and 4 git commands to generate.