Add event header accessors and support for custom event headers
[babeltrace.git] / formats / ctf / ir / stream.c
index 80d13111c1a4ee18b310fb74e3f16cfb2b461077..8b60e1e86ddf5f10e846120ee58323872b0c5ac8 100644 (file)
@@ -355,6 +355,21 @@ void bt_ctf_stream_set_trace(struct bt_ctf_stream *stream,
        stream->trace = trace;
 }
 
+struct bt_ctf_stream_class *bt_ctf_stream_get_class(
+               struct bt_ctf_stream *stream)
+{
+       struct bt_ctf_stream_class *stream_class = NULL;
+
+       if (!stream) {
+               goto end;
+       }
+
+       stream_class = stream->stream_class;
+       bt_ctf_stream_class_get(stream_class);
+end:
+       return stream_class;
+}
+
 int bt_ctf_stream_get_discarded_events_count(
                struct bt_ctf_stream *stream, uint64_t *count)
 {
@@ -494,6 +509,11 @@ int bt_ctf_stream_append_event(struct bt_ctf_stream *stream,
                goto end;
        }
 
+       ret = bt_ctf_event_populate_event_header(event);
+       if (ret) {
+               goto end;
+       }
+
        /* Make sure the event's payload is set */
        ret = bt_ctf_event_validate(event);
        if (ret) {
@@ -617,12 +637,55 @@ end:
        return ret;
 }
 
+struct bt_ctf_field *bt_ctf_stream_get_packet_header(
+               struct bt_ctf_stream *stream)
+{
+       struct bt_ctf_field *packet_header = NULL;
+
+       if (!stream) {
+               goto end;
+       }
+
+       packet_header = stream->packet_header;
+       if (packet_header) {
+               bt_ctf_field_get(packet_header);
+       }
+end:
+       return packet_header;
+}
+
+int bt_ctf_stream_set_packet_header(struct bt_ctf_stream *stream,
+               struct bt_ctf_field *field)
+{
+       int ret = 0;
+       struct bt_ctf_field_type *field_type = NULL;
+
+       if (!stream || !field) {
+               ret = -1;
+               goto end;
+       }
+
+       field_type = bt_ctf_field_get_type(field);
+       if (field_type != stream->trace->packet_header_type) {
+               ret = -1;
+               goto end;
+       }
+
+       bt_ctf_field_get(field);
+       bt_ctf_field_put(stream->packet_header);
+       stream->packet_header = field;
+end:
+       if (field_type) {
+               bt_ctf_field_type_put(field_type);
+       }
+       return ret;
+}
+
 int bt_ctf_stream_flush(struct bt_ctf_stream *stream)
 {
        int ret = 0;
        size_t i;
        uint64_t timestamp_begin, timestamp_end, events_discarded;
-       struct bt_ctf_stream_class *stream_class;
        struct bt_ctf_field *integer = NULL;
        struct ctf_stream_pos packet_context_pos;
 
@@ -654,7 +717,6 @@ int bt_ctf_stream_flush(struct bt_ctf_stream *stream)
                goto end;
        }
 
-       stream_class = stream->stream_class;
        timestamp_begin = ((struct bt_ctf_event *) g_ptr_array_index(
                stream->events, 0))->timestamp;
        timestamp_end = ((struct bt_ctf_event *) g_ptr_array_index(
@@ -720,24 +782,24 @@ int bt_ctf_stream_flush(struct bt_ctf_stream *stream)
                        event->event_class);
                uint64_t timestamp = bt_ctf_event_get_timestamp(event);
 
-               ret = bt_ctf_field_reset(stream_class->event_header);
+               ret = bt_ctf_field_reset(event->event_header);
                if (ret) {
                        goto end;
                }
 
-               ret = set_structure_field_integer(stream_class->event_header,
+               ret = set_structure_field_integer(event->event_header,
                        "id", event_id);
                if (ret) {
                        goto end;
                }
-               ret = set_structure_field_integer(stream_class->event_header,
+               ret = set_structure_field_integer(event->event_header,
                        "timestamp", timestamp);
                if (ret) {
                        goto end;
                }
 
                /* Write event header */
-               ret = bt_ctf_field_serialize(stream_class->event_header,
+               ret = bt_ctf_field_serialize(event->event_header,
                        &stream->pos);
                if (ret) {
                        goto end;
This page took 0.030205 seconds and 4 git commands to generate.