X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Ffield.c;h=62113d576d08f11b1bc722ad6e3a80ca7aeb8b74;hp=664b1ab4cbd23af40ffd9b86fe33745c8d371247;hb=1094efa4f2edbf019427bf0322dab3f3ea9ec5ab;hpb=cec0261d56a42e810f56b39fcefbe33987c8aab8 diff --git a/src/lib/trace-ir/field.c b/src/lib/trace-ir/field.c index 664b1ab4..62113d57 100644 --- a/src/lib/trace-ir/field.c +++ b/src/lib/trace-ir/field.c @@ -90,6 +90,13 @@ struct bt_field_methods bool_field_methods = { .reset = reset_single_field, }; +static +struct bt_field_methods bit_array_field_methods = { + .set_is_frozen = set_single_field_is_frozen, + .is_set = single_field_is_set, + .reset = reset_single_field, +}; + static struct bt_field_methods integer_field_methods = { .set_is_frozen = set_single_field_is_frozen, @@ -142,6 +149,9 @@ struct bt_field_methods variant_field_methods = { static struct bt_field *create_bool_field(struct bt_field_class *); +static +struct bt_field *create_bit_array_field(struct bt_field_class *); + static struct bt_field *create_integer_field(struct bt_field_class *); @@ -169,6 +179,7 @@ struct bt_field *create_variant_field(struct bt_field_class *); static struct bt_field *(* const field_create_funcs[])(struct bt_field_class *) = { [BT_FIELD_CLASS_TYPE_BOOL] = create_bool_field, + [BT_FIELD_CLASS_TYPE_BIT_ARRAY] = create_bit_array_field, [BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER] = create_integer_field, [BT_FIELD_CLASS_TYPE_SIGNED_INTEGER] = create_integer_field, [BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION] = create_integer_field, @@ -187,6 +198,9 @@ struct bt_field *(* const field_create_funcs[])(struct bt_field_class *) = { static void destroy_bool_field(struct bt_field *field); +static +void destroy_bit_array_field(struct bt_field *field); + static void destroy_integer_field(struct bt_field *field); @@ -211,6 +225,7 @@ void destroy_variant_field(struct bt_field *field); static void (* const field_destroy_funcs[])(struct bt_field *) = { [BT_FIELD_CLASS_TYPE_BOOL] = destroy_bool_field, + [BT_FIELD_CLASS_TYPE_BIT_ARRAY] = destroy_bit_array_field, [BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER] = destroy_integer_field, [BT_FIELD_CLASS_TYPE_SIGNED_INTEGER] = destroy_integer_field, [BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION] = destroy_integer_field, @@ -294,6 +309,26 @@ end: return (void *) bool_field; } +static +struct bt_field *create_bit_array_field(struct bt_field_class *fc) +{ + struct bt_field_bit_array *ba_field; + + BT_LIB_LOGD("Creating bit array field object: %![fc-]+F", fc); + ba_field = g_new0(struct bt_field_bit_array, 1); + if (!ba_field) { + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to allocate one bit array field."); + goto end; + } + + init_field((void *) ba_field, fc, &bit_array_field_methods); + BT_LIB_LOGD("Created bit array field object: %!+f", ba_field); + +end: + return (void *) ba_field; +} + static struct bt_field *create_integer_field(struct bt_field_class *fc) { @@ -607,6 +642,38 @@ void bt_field_bool_set_value(struct bt_field *field, bt_bool value) bt_field_set_single(field, true); } +uint64_t bt_field_bit_array_get_value_as_integer(const struct bt_field *field) +{ + const struct bt_field_bit_array *ba_field = (const void *) field; + + BT_ASSERT_PRE_DEV_NON_NULL(field, "Field"); + BT_ASSERT_PRE_DEV_FIELD_IS_SET(field, "Field"); + BT_ASSERT_PRE_DEV_FIELD_HAS_CLASS_TYPE(field, + BT_FIELD_CLASS_TYPE_BIT_ARRAY, "Field"); + return ba_field->value_as_int; +} + +void bt_field_bit_array_set_value_as_integer(struct bt_field *field, + uint64_t value) +{ + struct bt_field_bit_array *ba_field = (void *) field; + struct bt_field_class_bit_array *ba_fc; + + BT_ASSERT_PRE_DEV_NON_NULL(field, "Field"); + BT_ASSERT_PRE_DEV_FIELD_HAS_CLASS_TYPE(field, + BT_FIELD_CLASS_TYPE_BIT_ARRAY, "Field"); + BT_ASSERT_PRE_DEV_FIELD_HOT(field, "Field"); + ba_fc = (void *) field->class; + ba_field->value_as_int = value; + + if (ba_fc->length < 64) { + /* Apply mask */ + ba_field->value_as_int &= ((UINT64_C(1) << ba_fc->length) - 1); + } + + bt_field_set_single(field, true); +} + int64_t bt_field_integer_signed_get_value(const struct bt_field *field) { const struct bt_field_integer *int_field = (const void *) field; @@ -1106,6 +1173,15 @@ void destroy_bool_field(struct bt_field *field) g_free(field); } +static +void destroy_bit_array_field(struct bt_field *field) +{ + BT_ASSERT(field); + BT_LIB_LOGD("Destroying bit array field object: %!+f", field); + bt_field_finalize(field); + g_free(field); +} + static void destroy_integer_field(struct bt_field *field) {