int bt_ctf_event_class_add_field(struct bt_ctf_event_class *event_class, struct bt_ctf_field_type *type, const char *name) { int ret = 0; if (!event_class || !type) { BT_LOGW("Invalid parameter: event class or field type is NULL: " "event-class-addr=%p, field-type-addr=%p", event_class, type); ret = -1; goto end; } if (!bt_ctf_identifier_is_valid(name)) { BT_LOGW("Invalid parameter: event class's payload field type's field name is not a valid CTF identifier: " "addr=%p, name=\"%s\", id=%" PRId64 ", field-name=\"%s\"", event_class, bt_ctf_event_class_get_name(event_class), bt_ctf_event_class_get_id(event_class), name); ret = -1; goto end; } if (event_class->common.frozen) { BT_LOGW("Invalid parameter: event class is frozen: " "addr=%p, name=\"%s\", id=%" PRId64, event_class, bt_ctf_event_class_get_name(event_class), bt_ctf_event_class_get_id(event_class)); ret = -1; goto end; } if (!event_class->common.payload_field_type) { BT_LOGW("Event class has no payload field type: " "addr=%p, name=\"%s\", id=%" PRId64, event_class, bt_ctf_event_class_get_name(event_class), bt_ctf_event_class_get_id(event_class)); ret = -1; goto end; } BT_ASSERT(bt_ctf_field_type_common_get_type_id( event_class->common.payload_field_type) == BT_CTF_FIELD_TYPE_ID_STRUCT); ret = bt_ctf_field_type_structure_add_field( (void *) event_class->common.payload_field_type, (void *) type, name); BT_LOGV("Added field to event class's payload field type: " "event-class-addr=%p, event-class-name=\"%s\", " "event-class-id=%" PRId64 ", field-name=\"%s\", ft-addr=%p", event_class, bt_ctf_event_class_get_name(event_class), bt_ctf_event_class_get_id(event_class), name, type); end: return ret; }
int bt_ctf_event_class_get_payload_type_field_by_index( struct bt_ctf_event_class *event_class, const char **field_name, struct bt_ctf_field_type **field_type, uint64_t index) { int ret; if (!event_class) { BT_LOGW_STR("Invalid parameter: event class is NULL."); ret = -1; goto end; } if (!event_class->common.payload_field_type) { BT_LOGV("Event class has no payload field type: " "addr=%p, name=\"%s\", id=%" PRId64 ", index=%" PRIu64, event_class, bt_ctf_event_class_get_name(event_class), bt_ctf_event_class_get_id(event_class), index); ret = -1; goto end; } BT_ASSERT(bt_ctf_field_type_common_get_type_id( event_class->common.payload_field_type) == BT_CTF_FIELD_TYPE_ID_STRUCT); ret = bt_ctf_field_type_structure_get_field_by_index( (void *) event_class->common.payload_field_type, field_name, (void *) field_type, index); end: return ret; }
int64_t bt_ctf_event_class_get_payload_type_field_count( struct bt_ctf_event_class *event_class) { int64_t ret; if (!event_class) { BT_LOGW_STR("Invalid parameter: event class is NULL."); ret = (int64_t) -1; goto end; } if (!event_class->common.payload_field_type) { BT_LOGV("Event class has no payload field type: " "addr=%p, name=\"%s\", id=%" PRId64, event_class, bt_ctf_event_class_get_name(event_class), bt_ctf_event_class_get_id(event_class)); ret = (int64_t) -1; goto end; } BT_ASSERT(bt_ctf_field_type_common_get_type_id( event_class->common.payload_field_type) == BT_CTF_FIELD_TYPE_ID_STRUCT); ret = bt_ctf_field_type_common_structure_get_field_count( event_class->common.payload_field_type); end: return ret; }
BT_HIDDEN int bt_ctf_event_populate_event_header(struct bt_ctf_event *event) { int ret = 0; struct bt_ctf_field *id_field = NULL, *timestamp_field = NULL; if (!event || event->frozen) { ret = -1; goto end; } id_field = bt_ctf_field_structure_get_field(event->event_header, "id"); if (id_field) { ret = set_integer_field_value(id_field, (uint64_t) bt_ctf_event_class_get_id( event->event_class)); if (ret) { goto end; } } timestamp_field = bt_ctf_field_structure_get_field(event->event_header, "timestamp"); if (timestamp_field) { struct bt_ctf_field_type *timestamp_field_type = bt_ctf_field_get_type(timestamp_field); struct bt_ctf_clock *mapped_clock; assert(timestamp_field_type); mapped_clock = bt_ctf_field_type_integer_get_mapped_clock( timestamp_field_type); bt_put(timestamp_field_type); if (mapped_clock) { int64_t timestamp; ret = bt_ctf_clock_get_time(mapped_clock, ×tamp); bt_put(mapped_clock); if (ret) { goto end; } ret = set_integer_field_value(timestamp_field, timestamp); if (ret) { goto end; } } } end: bt_put(id_field); bt_put(timestamp_field); return ret; }
struct bt_ctf_field_type * bt_ctf_event_class_get_payload_type_field_type_by_name( struct bt_ctf_event_class *event_class, const char *name) { GQuark name_quark; struct bt_ctf_field_type *field_type = NULL; if (!event_class || !name) { BT_LOGW("Invalid parameter: event class or name is NULL: " "event-class-addr=%p, name-addr=%p", event_class, name); goto end; } if (!event_class->common.payload_field_type) { BT_LOGV("Event class has no payload field type: " "addr=%p, name=\"%s\", id=%" PRId64, event_class, bt_ctf_event_class_get_name(event_class), bt_ctf_event_class_get_id(event_class)); goto end; } BT_ASSERT(bt_ctf_field_type_common_get_type_id( event_class->common.payload_field_type) == BT_CTF_FIELD_TYPE_ID_STRUCT); name_quark = g_quark_try_string(name); if (!name_quark) { BT_LOGE("Cannot get GQuark: string=\"%s\"", name); goto end; } /* * No need to increment field_type's reference count since getting it * from the structure already does. */ field_type = (void *) bt_ctf_field_type_structure_get_field_type_by_name( (void *) event_class->common.payload_field_type, name); end: return field_type; }
BT_HIDDEN int bt_ctf_event_class_serialize(struct bt_ctf_event_class *event_class, struct metadata_context *context) { int ret = 0; struct bt_ctf_value *attr_value = NULL; BT_ASSERT(event_class); BT_ASSERT(context); BT_LOGD("Serializing event class's metadata: " "event-class-addr=%p, event-class-name=\"%s\", " "event-class-id=%" PRId64 ", metadata-context-addr=%p", event_class, bt_ctf_event_class_get_name(event_class), bt_ctf_event_class_get_id(event_class), context); context->current_indentation_level = 1; g_string_assign(context->field_name, ""); g_string_append(context->string, "event {\n"); /* Serialize attributes */ g_string_append_printf(context->string, "\tname = \"%s\";\n", event_class->common.name->str); BT_ASSERT(event_class->common.id >= 0); g_string_append_printf(context->string, "\tid = %" PRId64 ";\n", event_class->common.id); g_string_append_printf(context->string, "\tstream_id = %" PRId64 ";\n", bt_ctf_stream_class_common_get_id( bt_ctf_event_class_common_borrow_stream_class( BT_CTF_TO_COMMON(event_class)))); if (event_class->common.log_level != BT_CTF_EVENT_CLASS_LOG_LEVEL_UNSPECIFIED) { g_string_append_printf(context->string, "\tloglevel = %d;\n", (int) event_class->common.log_level); } if (event_class->common.emf_uri->len > 0) { g_string_append_printf(context->string, "\tmodel.emf.uri = \"%s\";\n", event_class->common.emf_uri->str); } /* Serialize context field type */ if (event_class->common.context_field_type) { g_string_append(context->string, "\tcontext := "); BT_LOGD_STR("Serializing event class's context field type metadata."); ret = bt_ctf_field_type_serialize_recursive( (void *) event_class->common.context_field_type, context); if (ret) { BT_LOGW("Cannot serialize event class's context field type's metadata: " "ret=%d", ret); goto end; } g_string_append(context->string, ";\n"); } /* Serialize payload field type */ if (event_class->common.payload_field_type) { g_string_append(context->string, "\tfields := "); BT_LOGD_STR("Serializing event class's payload field type metadata."); ret = bt_ctf_field_type_serialize_recursive( (void *) event_class->common.payload_field_type, context); if (ret) { BT_LOGW("Cannot serialize event class's payload field type's metadata: " "ret=%d", ret); goto end; } g_string_append(context->string, ";\n"); } g_string_append(context->string, "};\n\n"); end: context->current_indentation_level = 0; BT_CTF_OBJECT_PUT_REF_AND_RESET(attr_value); return ret; }