struct bt_ctf_field_type *bt_ctf_event_class_get_field_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) { goto end; } if (bt_ctf_field_type_get_type_id(event_class->fields) != CTF_TYPE_STRUCT) { goto end; } name_quark = g_quark_try_string(name); if (!name_quark) { goto end; } /* * No need to increment field_type's reference count since getting it * from the structure already does. */ field_type = bt_ctf_field_type_structure_get_field_type_by_name( event_class->fields, name); end: return field_type; }
struct bt_ctf_field *bt_ctf_field_structure_get_field( struct bt_ctf_field *field, const char *name) { struct bt_ctf_field *new_field = NULL; GQuark field_quark; struct bt_ctf_field_structure *structure; struct bt_ctf_field_type *field_type = NULL; size_t index; if (!field || !name || bt_ctf_field_type_get_type_id(field->type) != CTF_TYPE_STRUCT) { goto error; } field_quark = g_quark_from_string(name); structure = container_of(field, struct bt_ctf_field_structure, parent); field_type = bt_ctf_field_type_structure_get_field_type_by_name(field->type, name); if (!g_hash_table_lookup_extended(structure->field_name_to_index, GUINT_TO_POINTER(field_quark), NULL, (gpointer *)&index)) { goto error; } if (structure->fields->pdata[index]) { new_field = structure->fields->pdata[index]; goto end; } new_field = bt_ctf_field_create(field_type); if (!new_field) { goto error; } structure->fields->pdata[index] = new_field; end: bt_ctf_field_get(new_field); error: if (field_type) { bt_ctf_field_type_put(field_type); } return new_field; }
BT_HIDDEN int bt_ctf_field_structure_set_field(struct bt_ctf_field *field, const char *name, struct bt_ctf_field *value) { int ret = 0; GQuark field_quark; struct bt_ctf_field_structure *structure; struct bt_ctf_field_type *expected_field_type = NULL; size_t index; if (!field || !name || !value || bt_ctf_field_type_get_type_id(field->type) != CTF_TYPE_STRUCT) { ret = -1; goto end; } field_quark = g_quark_from_string(name); structure = container_of(field, struct bt_ctf_field_structure, parent); expected_field_type = bt_ctf_field_type_structure_get_field_type_by_name(field->type, name); if (expected_field_type != value->type) { ret = -1; goto end; } if (!g_hash_table_lookup_extended(structure->field_name_to_index, GUINT_TO_POINTER(field_quark), NULL, (gpointer *) &index)) { goto end; } if (structure->fields->pdata[index]) { bt_ctf_field_put(structure->fields->pdata[index]); } structure->fields->pdata[index] = value; bt_ctf_field_get(value); end: if (expected_field_type) { bt_ctf_field_type_put(expected_field_type); } 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; }