Allocate structure fields on creation
[babeltrace.git] / lib / ctf-ir / event.c
index 1ab1be57db83fbcffb06b7de26290d8d38b6a463..62fc4328cb1081c972f13eb5616c30b1c18cf590 100644 (file)
@@ -32,6 +32,8 @@
 #include <babeltrace/ctf-ir/fields-internal.h>
 #include <babeltrace/ctf-ir/field-types-internal.h>
 #include <babeltrace/ctf-ir/clock-class.h>
+#include <babeltrace/ctf-ir/clock-value.h>
+#include <babeltrace/ctf-ir/clock-value-internal.h>
 #include <babeltrace/ctf-ir/clock-class-internal.h>
 #include <babeltrace/ctf-ir/event-internal.h>
 #include <babeltrace/ctf-ir/event-class.h>
@@ -98,9 +100,6 @@ struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class)
                goto error;
        }
 
-       /* A stream class should always have an existing event header type */
-       assert(stream_class->event_header_type);
-
        /* The event class was frozen when added to its stream class */
        assert(event_class->frozen);
 
@@ -174,14 +173,21 @@ struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class)
        event->event_class = bt_get(event_class);
        event->clock_values = g_hash_table_new_full(g_direct_hash,
                        g_direct_equal, bt_put, bt_put);
-       event_header =
-               bt_ctf_field_create(validation_output.event_header_type);
-       if (!event_header) {
-               BT_LOGE_STR("Cannot create initial event header field object.");
-               goto error;
+
+       if (validation_output.event_header_type) {
+               BT_LOGD("Creating initial event header field: ft-addr=%p",
+                       validation_output.event_header_type);
+               event_header =
+                       bt_ctf_field_create(validation_output.event_header_type);
+               if (!event_header) {
+                       BT_LOGE_STR("Cannot create initial event header field object.");
+                       goto error;
+               }
        }
 
        if (validation_output.stream_event_ctx_type) {
+               BT_LOGD("Creating initial stream event context field: ft-addr=%p",
+                       validation_output.stream_event_ctx_type);
                stream_event_context = bt_ctf_field_create(
                        validation_output.stream_event_ctx_type);
                if (!stream_event_context) {
@@ -191,6 +197,8 @@ struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class)
        }
 
        if (validation_output.event_context_type) {
+               BT_LOGD("Creating initial event context field: ft-addr=%p",
+                       validation_output.event_context_type);
                event_context = bt_ctf_field_create(
                        validation_output.event_context_type);
                if (!event_context) {
@@ -200,6 +208,8 @@ struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class)
        }
 
        if (validation_output.event_payload_type) {
+               BT_LOGD("Creating initial event payload field: ft-addr=%p",
+                       validation_output.event_payload_type);
                event_payload = bt_ctf_field_create(
                        validation_output.event_payload_type);
                if (!event_payload) {
@@ -276,8 +286,7 @@ struct bt_ctf_event_class *bt_ctf_event_get_class(struct bt_ctf_event *event)
                goto end;
        }
 
-       event_class = event ? bt_get(bt_ctf_event_borrow_event_class(event)) :
-               NULL;
+       event_class = bt_get(bt_ctf_event_borrow_event_class(event));
 end:
        return event_class;
 }
@@ -332,8 +341,8 @@ int bt_ctf_event_set_payload(struct bt_ctf_event *event,
        }
 
        if (name) {
-               ret = bt_ctf_field_structure_set_field(event->fields_payload,
-                       name, payload);
+               ret = bt_ctf_field_structure_set_field_by_name(
+                       event->fields_payload, name, payload);
        } else {
                struct bt_ctf_field_type *payload_type;
 
@@ -860,14 +869,16 @@ int bt_ctf_event_validate(struct bt_ctf_event *event)
        struct bt_ctf_stream_class *stream_class = NULL;
 
        assert(event);
-       ret = bt_ctf_field_validate(event->event_header);
-       if (ret) {
-               BT_LOGD("Invalid event's header field: "
-                       "event-addr=%p, event-class-name=\"%s\", "
-                       "event-class-id=%" PRId64,
-                       event, bt_ctf_event_class_get_name(event->event_class),
-                       bt_ctf_event_class_get_id(event->event_class));
-               goto end;
+       if (event->event_header) {
+               ret = bt_ctf_field_validate(event->event_header);
+               if (ret) {
+                       BT_LOGD("Invalid event's header field: "
+                                       "event-addr=%p, event-class-name=\"%s\", "
+                                       "event-class-id=%" PRId64,
+                                       event, bt_ctf_event_class_get_name(event->event_class),
+                                       bt_ctf_event_class_get_id(event->event_class));
+                       goto end;
+               }
        }
 
        stream_class = bt_ctf_event_class_get_stream_class(event->event_class);
This page took 0.024913 seconds and 4 git commands to generate.