+int bt_event_common_initialize(struct bt_event_common *event,
+ struct bt_event_class_common *event_class,
+ struct bt_clock_class *init_expected_clock_class,
+ bt_object_release_func release_func,
+ bt_validation_flag_copy_field_type_func field_type_copy_func,
+ bool must_be_in_trace,
+ int (*map_clock_classes_func)(struct bt_stream_class_common *stream_class,
+ struct bt_field_type_common *packet_context_field_type,
+ struct bt_field_type_common *event_header_field_type),
+ void *(*create_field_func)(void *),
+ void (*release_field_func)(void *),
+ void *(*create_header_field_func)(void *, void *),
+ void (*release_header_field_func)(void *));
+
+static inline
+struct bt_field_common *bt_event_common_borrow_payload(
+ struct bt_event_common *event)
+{
+ struct bt_field_common *payload = NULL;
+
+ BT_ASSERT_PRE_NON_NULL(event, "Event");
+
+ if (!event->payload_field) {
+ BT_LOGV("Event has no current payload field: addr=%p, "
+ "event-class-name=\"%s\", event-class-id=%" PRId64,
+ event, bt_event_class_common_get_name(event->class),
+ bt_event_class_common_get_id(event->class));
+ goto end;
+ }
+
+ payload = event->payload_field;
+
+end:
+ return payload;
+}
+
+static inline
+struct bt_field_common *bt_event_common_borrow_header(
+ struct bt_event_common *event)
+{
+ struct bt_field_common *header = NULL;
+
+ BT_ASSERT_PRE_NON_NULL(event, "Event");
+
+ if (!event->header_field) {
+ BT_LOGV("Event has no current header field: addr=%p, "
+ "event-class-name=\"%s\", event-class-id=%" PRId64,
+ event, bt_event_class_common_get_name(event->class),
+ bt_event_class_common_get_id(event->class));
+ goto end;
+ }
+
+ header = event->header_field->field;
+
+end:
+ return header;
+}
+
+static inline
+struct bt_field_common *bt_event_common_borrow_context(
+ struct bt_event_common *event)
+{
+ struct bt_field_common *context = NULL;
+
+ BT_ASSERT_PRE_NON_NULL(event, "Event");
+
+ if (!event->context_field) {
+ BT_LOGV("Event has no current context field: addr=%p, "
+ "event-class-name=\"%s\", event-class-id=%" PRId64,
+ event, bt_event_class_common_get_name(event->class),
+ bt_event_class_common_get_id(event->class));
+ goto end;
+ }
+
+ context = event->context_field;
+
+end:
+ return context;
+}
+
+static inline
+struct bt_field_common *bt_event_common_borrow_stream_event_context(
+ struct bt_event_common *event)
+{
+ struct bt_field_common *stream_event_context = NULL;
+
+ BT_ASSERT_PRE_NON_NULL(event, "Event");
+
+ if (!event->stream_event_context_field) {
+ BT_LOGV("Event has no current stream event context field: addr=%p, "
+ "event-class-name=\"%s\", event-class-id=%" PRId64,
+ event, bt_event_class_common_get_name(event->class),
+ bt_event_class_common_get_id(event->class));
+ goto end;
+ }
+
+ stream_event_context = event->stream_event_context_field;
+
+end:
+ return stream_event_context;
+}
+
+static inline
+void bt_event_common_finalize(struct bt_object *obj,
+ void (*field_release_func)(void *),
+ void (*header_field_release_func)(void *, struct bt_event_common *))
+{
+ struct bt_event_common *event = (void *) obj;
+
+ BT_LOGD("Destroying event: addr=%p, "
+ "event-class-name=\"%s\", event-class-id=%" PRId64,
+ event,
+ event->class ? bt_event_class_common_get_name(event->class) : NULL,
+ event->class ? bt_event_class_common_get_id(event->class) : INT64_C(-1));
+
+ if (event->header_field) {
+ BT_LOGD_STR("Releasing event's header field.");
+ header_field_release_func(event->header_field, event);
+ }
+
+ if (event->stream_event_context_field) {
+ BT_LOGD_STR("Releasing event's stream event context field.");
+ field_release_func(event->stream_event_context_field);
+ }
+
+ if (event->context_field) {
+ BT_LOGD_STR("Releasing event's context field.");
+ field_release_func(event->context_field);
+ }
+
+ if (event->payload_field) {
+ BT_LOGD_STR("Releasing event's payload field.");
+ field_release_func(event->payload_field);
+ }
+
+ /*
+ * Leave this after calling header_field_release_func() because
+ * this function receives the event object and could need its
+ * class to perform some cleanup.
+ */
+ if (!event->base.parent) {
+ /*
+ * Event was keeping a reference to its class since it shared no
+ * common ancestor with it to guarantee they would both have the
+ * same lifetime.
+ */
+ bt_put(event->class);
+ }
+}