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; }
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 struct bt_ctf_event *trimmer_output_event( struct trimmer_iterator *trim_it, struct bt_ctf_event *event) { struct bt_ctf_event_class *event_class = NULL; struct bt_ctf_event *writer_event = NULL; struct bt_ctf_packet *packet = NULL, *writer_packet = NULL; const char *event_name; int int_ret; event_class = bt_ctf_event_get_class(event); if (!event_class) { fprintf(trim_it->err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__); goto error; } event_name = bt_ctf_event_class_get_name(event_class); if (!event_name) { fprintf(trim_it->err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__); goto error; } writer_event = ctf_copy_event(trim_it->err, event, event_class, false); if (!writer_event) { fprintf(trim_it->err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__); fprintf(trim_it->err, "[error] Failed to copy event %s\n", bt_ctf_event_class_get_name(event_class)); goto error; } packet = bt_ctf_event_get_packet(event); if (!packet) { fprintf(trim_it->err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__); goto error; } writer_packet = lookup_packet(trim_it, packet); if (!writer_packet) { fprintf(trim_it->err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__); goto error; } bt_get(writer_packet); int_ret = bt_ctf_event_set_packet(writer_event, writer_packet); if (int_ret < 0) { fprintf(trim_it->err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__); fprintf(trim_it->err, "[error] Failed to append event %s\n", bt_ctf_event_class_get_name(event_class)); goto error; } /* We keep the reference on the writer_event to create a notification. */ goto end; error: BT_PUT(writer_event); end: bt_put(writer_packet); bt_put(packet); bt_put(event_class); return writer_event; }
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; }