lib: fully detach CTF IR and CTF writer implementations
[babeltrace.git] / lib / ctf-ir / fields.c
CommitLineData
273b65be 1/*
2e33ac5a 2 * fields.c
273b65be 3 *
d2dc44b6 4 * Babeltrace CTF IR - Event Fields
273b65be 5 *
de9dd397 6 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
273b65be
JG
7 *
8 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
fc25abce
PP
29#define BT_LOG_TAG "FIELDS"
30#include <babeltrace/lib-logging-internal.h>
31
3dca2276 32#include <babeltrace/assert-pre-internal.h>
2e33ac5a
PP
33#include <babeltrace/ctf-ir/fields-internal.h>
34#include <babeltrace/ctf-ir/field-types-internal.h>
83509119
JG
35#include <babeltrace/object-internal.h>
36#include <babeltrace/ref.h>
3d9990ac
PP
37#include <babeltrace/compiler-internal.h>
38#include <babeltrace/compat/fcntl-internal.h>
39#include <babeltrace/align-internal.h>
f6ccaed9 40#include <babeltrace/assert-internal.h>
fc25abce 41#include <inttypes.h>
273b65be 42
312c056a
PP
43#define BT_ASSERT_PRE_FIELD_IS_INT_OR_ENUM(_field, _name) \
44 BT_ASSERT_PRE((_field)->type->id == BT_FIELD_TYPE_ID_INTEGER || \
45 (_field)->type->id == BT_FIELD_TYPE_ID_ENUM, \
46 _name " is not an integer or an enumeration field: " \
47 "%!+f", (_field))
76f869ab 48
3dca2276 49static struct bt_field_common_methods bt_field_integer_methods = {
312c056a 50 .set_is_frozen = bt_field_common_generic_set_is_frozen,
3dca2276 51 .validate = bt_field_common_generic_validate,
312c056a 52 .copy = NULL,
3dca2276
PP
53 .is_set = bt_field_common_generic_is_set,
54 .reset = bt_field_common_generic_reset,
55};
273b65be 56
3dca2276 57static struct bt_field_common_methods bt_field_floating_point_methods = {
312c056a 58 .set_is_frozen = bt_field_common_generic_set_is_frozen,
3dca2276 59 .validate = bt_field_common_generic_validate,
312c056a 60 .copy = NULL,
3dca2276
PP
61 .is_set = bt_field_common_generic_is_set,
62 .reset = bt_field_common_generic_reset,
273b65be
JG
63};
64
3dca2276 65static struct bt_field_common_methods bt_field_enumeration_methods = {
312c056a
PP
66 .set_is_frozen = bt_field_common_generic_set_is_frozen,
67 .validate = bt_field_common_generic_validate,
68 .copy = NULL,
69 .is_set = bt_field_common_generic_is_set,
70 .reset = bt_field_common_generic_reset,
273b65be
JG
71};
72
3dca2276 73static struct bt_field_common_methods bt_field_string_methods = {
312c056a 74 .set_is_frozen = bt_field_common_generic_set_is_frozen,
3dca2276 75 .validate = bt_field_common_generic_validate,
312c056a 76 .copy = NULL,
3dca2276 77 .is_set = bt_field_common_generic_is_set,
4d4b475d 78 .reset = bt_field_common_generic_reset,
273b65be
JG
79};
80
3dca2276 81static struct bt_field_common_methods bt_field_structure_methods = {
312c056a 82 .set_is_frozen = bt_field_common_structure_set_is_frozen_recursive,
3dca2276 83 .validate = bt_field_common_structure_validate_recursive,
312c056a 84 .copy = NULL,
3dca2276
PP
85 .is_set = bt_field_common_structure_is_set_recursive,
86 .reset = bt_field_common_structure_reset_recursive,
12c8a1a3
JG
87};
88
3dca2276 89static struct bt_field_common_methods bt_field_sequence_methods = {
312c056a 90 .set_is_frozen = bt_field_common_sequence_set_is_frozen_recursive,
3dca2276 91 .validate = bt_field_common_sequence_validate_recursive,
312c056a 92 .copy = NULL,
3dca2276
PP
93 .is_set = bt_field_common_sequence_is_set_recursive,
94 .reset = bt_field_common_sequence_reset_recursive,
273b65be
JG
95};
96
3dca2276 97static struct bt_field_common_methods bt_field_array_methods = {
312c056a 98 .set_is_frozen = bt_field_common_array_set_is_frozen_recursive,
3dca2276 99 .validate = bt_field_common_array_validate_recursive,
312c056a 100 .copy = NULL,
3dca2276
PP
101 .is_set = bt_field_common_array_is_set_recursive,
102 .reset = bt_field_common_array_reset_recursive,
87d43dc1
JG
103};
104
3dca2276 105static struct bt_field_common_methods bt_field_variant_methods = {
312c056a 106 .set_is_frozen = bt_field_common_variant_set_is_frozen_recursive,
3dca2276 107 .validate = bt_field_common_variant_validate_recursive,
312c056a 108 .copy = NULL,
3dca2276
PP
109 .is_set = bt_field_common_variant_is_set_recursive,
110 .reset = bt_field_common_variant_reset_recursive,
918be005
PP
111};
112
76f869ab 113static
3dca2276 114struct bt_field *bt_field_integer_create(struct bt_field_type *);
76f869ab 115
3dca2276
PP
116static
117struct bt_field *bt_field_enumeration_create(struct bt_field_type *);
118
119static
120struct bt_field *bt_field_floating_point_create(struct bt_field_type *);
121
122static
123struct bt_field *bt_field_structure_create(struct bt_field_type *);
124
125static
126struct bt_field *bt_field_variant_create(struct bt_field_type *);
127
128static
129struct bt_field *bt_field_array_create(struct bt_field_type *);
f6ccaed9 130
3dca2276
PP
131static
132struct bt_field *bt_field_sequence_create(struct bt_field_type *);
f6ccaed9 133
3dca2276
PP
134static
135struct bt_field *bt_field_string_create(struct bt_field_type *);
f6ccaed9 136
3dca2276
PP
137static
138struct bt_field *(* const field_create_funcs[])(struct bt_field_type *) = {
139 [BT_FIELD_TYPE_ID_INTEGER] = bt_field_integer_create,
140 [BT_FIELD_TYPE_ID_ENUM] = bt_field_enumeration_create,
141 [BT_FIELD_TYPE_ID_FLOAT] = bt_field_floating_point_create,
142 [BT_FIELD_TYPE_ID_STRUCT] = bt_field_structure_create,
143 [BT_FIELD_TYPE_ID_VARIANT] = bt_field_variant_create,
144 [BT_FIELD_TYPE_ID_ARRAY] = bt_field_array_create,
145 [BT_FIELD_TYPE_ID_SEQUENCE] = bt_field_sequence_create,
146 [BT_FIELD_TYPE_ID_STRING] = bt_field_string_create,
147};
f6ccaed9 148
312c056a
PP
149static
150void bt_field_integer_destroy(struct bt_field *field);
151
152static
153void bt_field_enumeration_destroy(struct bt_field *field);
154
155static
156void bt_field_floating_point_destroy(struct bt_field *field);
157
158static
159void bt_field_structure_destroy_recursive(struct bt_field *field);
160
161static
162void bt_field_variant_destroy_recursive(struct bt_field *field);
163
164static
165void bt_field_array_destroy_recursive(struct bt_field *field);
166
167static
168void bt_field_sequence_destroy_recursive(struct bt_field *field);
169
170static
171void bt_field_string_destroy(struct bt_field *field);
172
173static
174void (* const field_destroy_funcs[])(struct bt_field *) = {
175 [BT_FIELD_TYPE_ID_INTEGER] = bt_field_integer_destroy,
176 [BT_FIELD_TYPE_ID_ENUM] = bt_field_enumeration_destroy,
177 [BT_FIELD_TYPE_ID_FLOAT] = bt_field_floating_point_destroy,
178 [BT_FIELD_TYPE_ID_STRUCT] = bt_field_structure_destroy_recursive,
179 [BT_FIELD_TYPE_ID_VARIANT] = bt_field_variant_destroy_recursive,
180 [BT_FIELD_TYPE_ID_ARRAY] = bt_field_array_destroy_recursive,
181 [BT_FIELD_TYPE_ID_SEQUENCE] = bt_field_sequence_destroy_recursive,
182 [BT_FIELD_TYPE_ID_STRING] = bt_field_string_destroy,
183};
184
185BT_HIDDEN
186struct bt_field *bt_field_create_recursive(struct bt_field_type *type)
273b65be 187{
50842bdc
PP
188 struct bt_field *field = NULL;
189 enum bt_field_type_id type_id;
273b65be 190
f6ccaed9 191 BT_ASSERT_PRE_NON_NULL(type, "Field type");
3dca2276
PP
192 BT_ASSERT(field_type_common_has_known_id((void *) type));
193 BT_ASSERT_PRE(bt_field_type_common_validate((void *) type) == 0,
f6ccaed9 194 "Field type is invalid: %!+F", type);
50842bdc 195 type_id = bt_field_type_get_type_id(type);
273b65be
JG
196 field = field_create_funcs[type_id](type);
197 if (!field) {
3dca2276 198 goto end;
273b65be
JG
199 }
200
50842bdc 201 bt_field_type_freeze(type);
273b65be 202
3dca2276
PP
203end:
204 return field;
273b65be
JG
205}
206
094ff7c0 207struct bt_field_type *bt_field_borrow_type(struct bt_field *field)
cd95e351 208{
094ff7c0 209 return (void *) bt_field_common_borrow_type((void *) field);
cd95e351
JG
210}
211
50842bdc 212enum bt_field_type_id bt_field_get_type_id(struct bt_field *field)
4ebcc695 213{
3dca2276
PP
214 struct bt_field_common *field_common = (void *) field;
215
f6ccaed9 216 BT_ASSERT_PRE_NON_NULL(field, "Field");
3dca2276 217 return field_common->type->id;
4ebcc695
PP
218}
219
312c056a 220int64_t bt_field_sequence_get_length(struct bt_field *field)
2e8876d3 221{
312c056a 222 return bt_field_common_sequence_get_length((void *) field);
2e8876d3
PP
223}
224
312c056a 225int bt_field_sequence_set_length(struct bt_field *field, uint64_t length)
273b65be 226{
3dca2276 227 return bt_field_common_sequence_set_length((void *) field,
312c056a 228 length, (bt_field_common_create_func) bt_field_create_recursive);
273b65be
JG
229}
230
094ff7c0 231struct bt_field *bt_field_structure_borrow_field_by_index(
50842bdc 232 struct bt_field *field, uint64_t index)
cd95e351 233{
094ff7c0 234 return (void *) bt_field_common_structure_borrow_field_by_index(
3dca2276 235 (void *) field, index);
f6ccaed9 236}
fc25abce 237
094ff7c0 238struct bt_field *bt_field_structure_borrow_field_by_name(
3dca2276 239 struct bt_field *field, const char *name)
f6ccaed9 240{
094ff7c0 241 return (void *) bt_field_common_structure_borrow_field_by_name(
3dca2276 242 (void *) field, name);
cd95e351
JG
243}
244
094ff7c0 245struct bt_field *bt_field_array_borrow_field(
3dca2276 246 struct bt_field *field, uint64_t index)
273b65be 247{
094ff7c0 248 return (void *) bt_field_common_array_borrow_field((void *) field,
312c056a 249 index);
3dca2276 250}
f6ccaed9 251
094ff7c0 252struct bt_field *bt_field_sequence_borrow_field(
3dca2276
PP
253 struct bt_field *field, uint64_t index)
254{
094ff7c0 255 return (void *) bt_field_common_sequence_borrow_field((void *) field,
312c056a 256 index);
273b65be
JG
257}
258
094ff7c0 259struct bt_field *bt_field_variant_borrow_current_field(
50842bdc 260 struct bt_field *variant_field)
3f4a108d 261{
094ff7c0 262 return (void *) bt_field_common_variant_borrow_current_field(
3dca2276 263 (void *) variant_field);
3f4a108d
PP
264}
265
312c056a
PP
266int bt_field_variant_set_tag_signed(struct bt_field *variant_field,
267 int64_t tag)
f78d67fb 268{
312c056a
PP
269 return bt_field_variant_common_set_tag((void *) variant_field,
270 (uint64_t) tag, true);
271}
272
273int bt_field_variant_set_tag_unsigned(struct bt_field *variant_field,
274 uint64_t tag)
275{
276 return bt_field_variant_common_set_tag((void *) variant_field,
277 (uint64_t) tag, false);
f78d67fb
JG
278}
279
312c056a
PP
280int bt_field_variant_get_tag_signed(struct bt_field *variant_field,
281 int64_t *tag)
273b65be 282{
312c056a
PP
283 return bt_field_common_variant_get_tag_signed((void *) variant_field, tag);
284}
285
286int bt_field_variant_get_tag_unsigned(struct bt_field *variant_field,
287 uint64_t *tag)
288{
289 return bt_field_common_variant_get_tag_unsigned((void *) variant_field, tag);
273b65be
JG
290}
291
50842bdc
PP
292struct bt_field_type_enumeration_mapping_iterator *
293bt_field_enumeration_get_mappings(struct bt_field *field)
cd95e351 294{
312c056a
PP
295 struct bt_field_enumeration *enum_field = (void *) field;
296
297 BT_ASSERT_PRE_NON_NULL(field, "Enumeration field");
298 BT_ASSERT_PRE_FIELD_COMMON_HAS_TYPE_ID((struct bt_field_common *) field,
299 BT_FIELD_TYPE_ID_ENUM, "Field");
300 BT_ASSERT_PRE_FIELD_COMMON_IS_SET((struct bt_field_common *) field,
301 "Enumeration field");
3dca2276 302 return bt_field_common_enumeration_get_mappings((void *) field,
312c056a
PP
303 (bt_field_common_create_func) bt_field_create_recursive,
304 enum_field->common.payload.unsignd);
305}
306
307BT_ASSERT_PRE_FUNC
308static inline
309struct bt_field_type_common_integer *get_int_enum_int_ft(
310 struct bt_field *field)
311{
312 struct bt_field_common_integer *int_field = (void *) field;
313 struct bt_field_type_common_integer *int_ft = NULL;
314
315 if (int_field->common.type->id == BT_FIELD_TYPE_ID_INTEGER) {
316 int_ft = BT_FROM_COMMON(int_field->common.type);
317 } else if (int_field->common.type->id == BT_FIELD_TYPE_ID_ENUM) {
318 struct bt_field_type_common_enumeration *enum_ft =
319 BT_FROM_COMMON(int_field->common.type);
320 int_ft = enum_ft->container_ft;
321 }
322
323 BT_ASSERT(int_ft);
324 return int_ft;
cd95e351
JG
325}
326
3dca2276 327int bt_field_integer_signed_get_value(struct bt_field *field, int64_t *value)
cd95e351 328{
312c056a
PP
329 struct bt_field_common_integer *integer = (void *) field;
330
331 BT_ASSERT_PRE_NON_NULL(field, "Integer/enumeration field");
332 BT_ASSERT_PRE_NON_NULL(value, "Value");
333 BT_ASSERT_PRE_FIELD_COMMON_IS_SET(BT_TO_COMMON(integer),
334 "Integer/enumeration field");
335 BT_ASSERT_PRE_FIELD_IS_INT_OR_ENUM(BT_TO_COMMON(integer), "Field");
336 BT_ASSERT_PRE(bt_field_type_common_integer_is_signed(
337 BT_TO_COMMON(get_int_enum_int_ft(field))),
338 "Field's type is unsigned: %!+f", field);
339 *value = integer->payload.signd;
340 return 0;
cd95e351
JG
341}
342
312c056a 343int bt_field_integer_signed_set_value(struct bt_field *field, int64_t value)
273b65be 344{
312c056a
PP
345 int ret = 0;
346 struct bt_field_common_integer *integer = (void *) field;
347
348 BT_ASSERT_PRE_NON_NULL(field, "Integer field");
349 BT_ASSERT_PRE_FIELD_COMMON_HOT(BT_TO_COMMON(integer), "Integer field");
350 BT_ASSERT_PRE_FIELD_IS_INT_OR_ENUM(BT_TO_COMMON(integer), "Field");
351 BT_ASSERT_PRE(bt_field_type_common_integer_is_signed(
352 BT_FROM_COMMON(get_int_enum_int_ft(field))),
353 "Field's type is unsigned: %!+f", field);
354 BT_ASSERT_PRE(value_is_in_range_signed(
355 get_int_enum_int_ft(field)->size, value),
356 "Value is out of bounds: value=%" PRId64 ", %![field-]+f",
357 value, field);
358 integer->payload.signd = value;
359 bt_field_set(field, true);
360 return ret;
273b65be
JG
361}
362
312c056a 363int bt_field_integer_unsigned_get_value(struct bt_field *field, uint64_t *value)
cd95e351 364{
312c056a
PP
365 struct bt_field_common_integer *integer = (void *) field;
366
367 BT_ASSERT_PRE_NON_NULL(field, "Integer field");
368 BT_ASSERT_PRE_NON_NULL(value, "Value");
369 BT_ASSERT_PRE_FIELD_COMMON_IS_SET(BT_TO_COMMON(integer), "Integer field");
370 BT_ASSERT_PRE_FIELD_IS_INT_OR_ENUM(BT_TO_COMMON(integer), "Field");
371 BT_ASSERT_PRE(!bt_field_type_common_integer_is_signed(
372 BT_FROM_COMMON(get_int_enum_int_ft(field))),
373 "Field's type is signed: %!+f", field);
374 *value = integer->payload.unsignd;
375 return 0;
cd95e351
JG
376}
377
312c056a
PP
378int bt_field_integer_unsigned_set_value(struct bt_field *field,
379 uint64_t value)
273b65be 380{
312c056a
PP
381 struct bt_field_common_integer *integer = (void *) field;
382
383 BT_ASSERT_PRE_NON_NULL(field, "Integer field");
384 BT_ASSERT_PRE_FIELD_COMMON_HOT(BT_TO_COMMON(integer), "Integer field");
385 BT_ASSERT_PRE_FIELD_IS_INT_OR_ENUM(BT_TO_COMMON(integer), "Field");
386 BT_ASSERT_PRE(!bt_field_type_common_integer_is_signed(
387 BT_FROM_COMMON(get_int_enum_int_ft(field))),
388 "Field's type is signed: %!+f", field);
389 BT_ASSERT_PRE(value_is_in_range_unsigned(
390 get_int_enum_int_ft(field)->size, value),
391 "Value is out of bounds: value=%" PRIu64 ", %![field-]+f",
392 value, field);
393 integer->payload.unsignd = value;
394 bt_field_set(field, true);
395 return 0;
f6ccaed9
PP
396}
397
3dca2276
PP
398int bt_field_floating_point_get_value(struct bt_field *field,
399 double *value)
f6ccaed9 400{
3dca2276 401 return bt_field_common_floating_point_get_value((void *) field, value);
273b65be
JG
402}
403
3dca2276
PP
404int bt_field_floating_point_set_value(struct bt_field *field,
405 double value)
cd95e351 406{
3dca2276 407 return bt_field_common_floating_point_set_value((void *) field, value);
f6ccaed9 408}
fc25abce 409
3dca2276 410const char *bt_field_string_get_value(struct bt_field *field)
f6ccaed9 411{
3dca2276 412 return bt_field_common_string_get_value((void *) field);
cd95e351
JG
413}
414
3dca2276 415int bt_field_string_set_value(struct bt_field *field, const char *value)
273b65be 416{
3dca2276 417 return bt_field_common_string_set_value((void *) field, value);
273b65be
JG
418}
419
3dca2276 420int bt_field_string_append(struct bt_field *field, const char *value)
cd95e351 421{
3dca2276 422 return bt_field_common_string_append((void *) field, value);
cd95e351
JG
423}
424
3dca2276
PP
425int bt_field_string_append_len(struct bt_field *field,
426 const char *value, unsigned int length)
273b65be 427{
3dca2276 428 return bt_field_common_string_append_len((void *) field, value, length);
273b65be
JG
429}
430
312c056a
PP
431int bt_field_string_clear(struct bt_field *string_field)
432{
433 return bt_field_common_string_clear((void *) string_field);
434}
435
3dca2276
PP
436BT_HIDDEN
437struct bt_field_common *bt_field_common_copy(struct bt_field_common *field)
c6f9c5a3 438{
3dca2276 439 struct bt_field_common *copy = NULL;
c6f9c5a3 440
3dca2276
PP
441 BT_ASSERT_PRE_NON_NULL(field, "Field");
442 BT_ASSERT(field_type_common_has_known_id(field->type));
443 BT_ASSERT(field->methods->copy);
444 copy = field->methods->copy(field);
445 if (!copy) {
446 BT_LOGW("Cannot create field: ft-addr=%p", field->type);
447 goto end;
c6f9c5a3
PP
448 }
449
3dca2276
PP
450 bt_field_common_set(copy, field->payload_set);
451
452end:
453 return copy;
c6f9c5a3
PP
454}
455
312c056a
PP
456static
457void bt_field_integer_destroy(struct bt_field *field)
3dca2276 458{
312c056a
PP
459 BT_LOGD("Destroying integer field object: addr=%p", field);
460 bt_field_common_integer_finalize((void *) field);
461 g_free(field);
3dca2276 462}
f98c6554 463
312c056a
PP
464static
465void bt_field_floating_point_destroy(struct bt_field *field)
3dca2276 466{
312c056a
PP
467 BT_LOGD("Destroying floating point field object: addr=%p", field);
468 bt_field_common_floating_point_finalize((void *) field);
469 g_free(field);
f98c6554
PP
470}
471
312c056a
PP
472static
473void bt_field_enumeration_destroy(struct bt_field *field)
273b65be 474{
312c056a
PP
475 BT_LOGD("Destroying enumeration field object: addr=%p", field);
476 bt_field_common_finalize((void *) field);
477 g_free(field);
3dca2276 478}
273b65be 479
312c056a
PP
480static
481void bt_field_structure_destroy_recursive(struct bt_field *field)
3dca2276 482{
312c056a
PP
483 BT_LOGD("Destroying structure field object: addr=%p", field);
484 bt_field_common_structure_finalize_recursive((void *) field);
485 g_free(field);
273b65be
JG
486}
487
312c056a
PP
488static
489void bt_field_variant_destroy_recursive(struct bt_field *field)
3dca2276 490{
312c056a
PP
491 BT_LOGD("Destroying variant field object: addr=%p", field);
492 bt_field_common_variant_finalize_recursive((void *) field);
493 g_free(field);
f6ccaed9 494}
12c8a1a3 495
312c056a
PP
496static
497void bt_field_array_destroy_recursive(struct bt_field *field)
f6ccaed9 498{
312c056a
PP
499 BT_LOGD("Destroying array field object: addr=%p", field);
500 bt_field_common_array_finalize_recursive((void *) field);
501 g_free(field);
12c8a1a3
JG
502}
503
312c056a
PP
504static
505void bt_field_sequence_destroy_recursive(struct bt_field *field)
273b65be 506{
312c056a
PP
507 BT_LOGD("Destroying sequence field object: addr=%p", field);
508 bt_field_common_sequence_finalize_recursive((void *) field);
509 g_free(field);
273b65be
JG
510}
511
312c056a
PP
512static
513void bt_field_string_destroy(struct bt_field *field)
76f869ab 514{
312c056a
PP
515 BT_LOGD("Destroying string field object: addr=%p", field);
516 bt_field_common_string_finalize((void *) field);
517 g_free(field);
76f869ab
JG
518}
519
3dca2276 520BT_HIDDEN
312c056a 521void bt_field_destroy_recursive(struct bt_field *field)
87d43dc1 522{
312c056a 523 struct bt_field_common *field_common = (void *) field;
87d43dc1 524
312c056a
PP
525 if (!field) {
526 return;
87d43dc1 527 }
f6ccaed9 528
312c056a
PP
529 BT_ASSERT(field_type_common_has_known_id((void *) field_common->type));
530 field_destroy_funcs[field_common->type->id](field);
87d43dc1
JG
531}
532
273b65be 533static
50842bdc 534struct bt_field *bt_field_integer_create(struct bt_field_type *type)
273b65be 535{
3dca2276
PP
536 struct bt_field_common_integer *integer =
537 g_new0(struct bt_field_common_integer, 1);
273b65be 538
fc25abce
PP
539 BT_LOGD("Creating integer field object: ft-addr=%p", type);
540
541 if (integer) {
3dca2276 542 bt_field_common_initialize(BT_TO_COMMON(integer), (void *) type,
3fea54f6 543 false, NULL, &bt_field_integer_methods);
fc25abce 544 BT_LOGD("Created integer field object: addr=%p, ft-addr=%p",
3dca2276 545 integer, type);
fc25abce
PP
546 } else {
547 BT_LOGE_STR("Failed to allocate one integer field.");
548 }
549
3dca2276 550 return (void *) integer;
273b65be
JG
551}
552
553static
3dca2276 554struct bt_field *bt_field_enumeration_create(struct bt_field_type *type)
273b65be 555{
312c056a
PP
556 struct bt_field_enumeration *enumeration = g_new0(
557 struct bt_field_enumeration, 1);
273b65be 558
fc25abce
PP
559 BT_LOGD("Creating enumeration field object: ft-addr=%p", type);
560
561 if (enumeration) {
312c056a
PP
562 bt_field_common_initialize(
563 BT_TO_COMMON(BT_TO_COMMON(enumeration)),
3fea54f6
PP
564 (void *) type, false, NULL,
565 &bt_field_enumeration_methods);
fc25abce 566 BT_LOGD("Created enumeration field object: addr=%p, ft-addr=%p",
3dca2276 567 enumeration, type);
fc25abce
PP
568 } else {
569 BT_LOGE_STR("Failed to allocate one enumeration field.");
570 }
571
3dca2276 572 return (void *) enumeration;
273b65be
JG
573}
574
575static
3dca2276 576struct bt_field *bt_field_floating_point_create(struct bt_field_type *type)
273b65be 577{
3dca2276 578 struct bt_field_common_floating_point *floating_point;
273b65be 579
fc25abce 580 BT_LOGD("Creating floating point number field object: ft-addr=%p", type);
3dca2276 581 floating_point = g_new0(struct bt_field_common_floating_point, 1);
fc25abce
PP
582
583 if (floating_point) {
3dca2276 584 bt_field_common_initialize(BT_TO_COMMON(floating_point),
3fea54f6
PP
585 (void *) type, false, NULL,
586 &bt_field_floating_point_methods);
fc25abce 587 BT_LOGD("Created floating point number field object: addr=%p, ft-addr=%p",
3dca2276 588 floating_point, type);
fc25abce
PP
589 } else {
590 BT_LOGE_STR("Failed to allocate one floating point number field.");
591 }
592
3dca2276 593 return (void *) floating_point;
273b65be
JG
594}
595
3dca2276
PP
596BT_HIDDEN
597int bt_field_common_structure_initialize(struct bt_field_common *field,
598 struct bt_field_type_common *type,
3fea54f6 599 bool is_shared, bt_object_release_func release_func,
3dca2276 600 struct bt_field_common_methods *methods,
312c056a
PP
601 bt_field_common_create_func field_create_func,
602 GDestroyNotify field_release_func)
3dca2276
PP
603{
604 int ret = 0;
605 struct bt_field_type_common_structure *structure_type =
606 BT_FROM_COMMON(type);
607 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
c58b9c62 608 size_t i;
273b65be 609
3dca2276 610 BT_LOGD("Initializing common structure field object: ft-addr=%p", type);
3fea54f6
PP
611 bt_field_common_initialize(field, type, is_shared,
612 release_func, methods);
312c056a 613 structure->fields = g_ptr_array_new_with_free_func(field_release_func);
3dca2276 614 g_ptr_array_set_size(structure->fields, structure_type->fields->len);
c58b9c62 615
312c056a 616 /* Create all fields contained in the structure field. */
c58b9c62 617 for (i = 0; i < structure_type->fields->len; i++) {
3dca2276 618 struct bt_field_common *field;
312c056a
PP
619 struct bt_field_type_common_structure_field *struct_field =
620 BT_FIELD_TYPE_COMMON_STRUCTURE_FIELD_AT_INDEX(
621 structure_type, i);
3dca2276 622 field = field_create_func(struct_field->type);
c58b9c62
JG
623 if (!field) {
624 BT_LOGE("Failed to create structure field's member: name=\"%s\", index=%zu",
3dca2276
PP
625 g_quark_to_string(struct_field->name), i);
626 ret = -1;
c58b9c62
JG
627 goto end;
628 }
629
630 g_ptr_array_index(structure->fields, i) = field;
631 }
632
3dca2276
PP
633 BT_LOGD("Initialized common structure field object: addr=%p, ft-addr=%p",
634 field, type);
635
273b65be 636end:
c58b9c62 637 return ret;
273b65be
JG
638}
639
3dca2276
PP
640static
641struct bt_field *bt_field_structure_create(struct bt_field_type *type)
642{
643 struct bt_field_common_structure *structure = g_new0(
644 struct bt_field_common_structure, 1);
645 int iret;
646
647 BT_LOGD("Creating structure field object: ft-addr=%p", type);
648
649 if (!structure) {
650 BT_LOGE_STR("Failed to allocate one structure field.");
651 goto end;
652 }
653
654 iret = bt_field_common_structure_initialize(BT_TO_COMMON(structure),
3fea54f6 655 (void *) type, false, NULL, &bt_field_structure_methods,
312c056a
PP
656 (bt_field_common_create_func) bt_field_create_recursive,
657 (GDestroyNotify) bt_field_destroy_recursive);
3dca2276
PP
658 if (iret) {
659 BT_PUT(structure);
660 goto end;
661 }
662
663 BT_LOGD("Created structure field object: addr=%p, ft-addr=%p",
664 structure, type);
665
666end:
667 return (void *) structure;
668}
669
312c056a
PP
670BT_HIDDEN
671int bt_field_common_variant_initialize(struct bt_field_common *field,
672 struct bt_field_type_common *type,
3fea54f6 673 bool is_shared, bt_object_release_func release_func,
312c056a
PP
674 struct bt_field_common_methods *methods,
675 bt_field_common_create_func field_create_func,
676 GDestroyNotify field_release_func)
677{
678 int ret = 0;
679 struct bt_field_type_common_variant *variant_type =
680 BT_FROM_COMMON(type);
681 struct bt_field_common_variant *variant = BT_FROM_COMMON(field);
682 size_t i;
683
684 BT_LOGD("Initializing common variant field object: ft-addr=%p", type);
3fea54f6
PP
685 bt_field_common_initialize(field, type, is_shared,
686 release_func, methods);
312c056a
PP
687 ret = bt_field_type_common_variant_update_choices(type);
688 if (ret) {
689 BT_LOGE("Cannot update common variant field type choices: "
690 "ret=%d", ret);
691 goto end;
692 }
693
694 variant->fields = g_ptr_array_new_with_free_func(field_release_func);
695 g_ptr_array_set_size(variant->fields, variant_type->choices->len);
696
697 /* Create all fields contained in the variant field. */
698 for (i = 0; i < variant_type->choices->len; i++) {
699 struct bt_field_common *field;
700 struct bt_field_type_common_variant_choice *var_choice =
701 BT_FIELD_TYPE_COMMON_VARIANT_CHOICE_AT_INDEX(
702 variant_type, i);
703
704 field = field_create_func(var_choice->type);
705 if (!field) {
706 BT_LOGE("Failed to create variant field's member: name=\"%s\", index=%zu",
707 g_quark_to_string(var_choice->name), i);
708 ret = -1;
709 goto end;
710 }
711
712 g_ptr_array_index(variant->fields, i) = field;
713 }
714
715 BT_LOGD("Initialized common variant field object: addr=%p, ft-addr=%p",
716 field, type);
717
718end:
719 return ret;
720}
721
4d4b475d
PP
722BT_HIDDEN
723int bt_field_common_string_initialize(struct bt_field_common *field,
724 struct bt_field_type_common *type,
3fea54f6 725 bool is_shared, bt_object_release_func release_func,
4d4b475d
PP
726 struct bt_field_common_methods *methods)
727{
728 int ret = 0;
729 struct bt_field_common_string *string = BT_FROM_COMMON(field);
730
731 BT_LOGD("Initializing common string field object: ft-addr=%p", type);
3fea54f6
PP
732 bt_field_common_initialize(field, type, is_shared,
733 release_func, methods);
4d4b475d
PP
734 string->buf = g_array_sized_new(FALSE, FALSE, sizeof(char), 1);
735 if (!string->buf) {
736 ret = -1;
737 goto end;
738 }
739
740 g_array_index(string->buf, char, 0) = '\0';
741 BT_LOGD("Initialized common string field object: addr=%p, ft-addr=%p",
742 field, type);
743
744end:
745 return ret;
746}
747
273b65be 748static
50842bdc 749struct bt_field *bt_field_variant_create(struct bt_field_type *type)
273b65be 750{
3dca2276
PP
751 struct bt_field_common_variant *variant = g_new0(
752 struct bt_field_common_variant, 1);
312c056a 753 int iret;
fc25abce
PP
754
755 BT_LOGD("Creating variant field object: ft-addr=%p", type);
756
312c056a 757 if (!variant) {
fc25abce 758 BT_LOGE_STR("Failed to allocate one variant field.");
312c056a
PP
759 goto end;
760 }
761
762 iret = bt_field_common_variant_initialize(BT_TO_COMMON(variant),
3fea54f6 763 (void *) type, false, NULL, &bt_field_variant_methods,
312c056a
PP
764 (bt_field_common_create_func) bt_field_create_recursive,
765 (GDestroyNotify) bt_field_destroy_recursive);
766 if (iret) {
767 BT_PUT(variant);
768 goto end;
fc25abce
PP
769 }
770
312c056a
PP
771 BT_LOGD("Created variant field object: addr=%p, ft-addr=%p",
772 variant, type);
773
774end:
3dca2276 775 return (void *) variant;
273b65be
JG
776}
777
3dca2276
PP
778BT_HIDDEN
779int bt_field_common_array_initialize(struct bt_field_common *field,
780 struct bt_field_type_common *type,
3fea54f6 781 bool is_shared, bt_object_release_func release_func,
312c056a
PP
782 struct bt_field_common_methods *methods,
783 bt_field_common_create_func field_create_func,
784 GDestroyNotify field_destroy_func)
273b65be 785{
3dca2276
PP
786 struct bt_field_type_common_array *array_type = BT_FROM_COMMON(type);
787 struct bt_field_common_array *array = BT_FROM_COMMON(field);
273b65be 788 unsigned int array_length;
3dca2276 789 int ret = 0;
312c056a 790 uint64_t i;
273b65be 791
3dca2276 792 BT_LOGD("Initializing common array field object: ft-addr=%p", type);
f6ccaed9 793 BT_ASSERT(type);
3fea54f6
PP
794 bt_field_common_initialize(field, type, is_shared,
795 release_func, methods);
273b65be 796 array_length = array_type->length;
fe0fe95c 797 array->elements = g_ptr_array_sized_new(array_length);
273b65be 798 if (!array->elements) {
3dca2276
PP
799 ret = -1;
800 goto end;
273b65be
JG
801 }
802
312c056a 803 g_ptr_array_set_free_func(array->elements, field_destroy_func);
273b65be 804 g_ptr_array_set_size(array->elements, array_length);
312c056a
PP
805
806 for (i = 0; i < array_length; i++) {
807 array->elements->pdata[i] = field_create_func(
808 array_type->element_ft);
809 if (!array->elements->pdata[i]) {
810 ret = -1;
811 goto end;
812 }
813 }
814
3dca2276
PP
815 BT_LOGD("Initialized common array field object: addr=%p, ft-addr=%p",
816 field, type);
273b65be 817
3dca2276
PP
818end:
819 return ret;
273b65be
JG
820}
821
822static
3dca2276 823struct bt_field *bt_field_array_create(struct bt_field_type *type)
273b65be 824{
3dca2276
PP
825 struct bt_field_common_array *array =
826 g_new0(struct bt_field_common_array, 1);
827 int ret;
fc25abce 828
3dca2276
PP
829 BT_LOGD("Creating array field object: ft-addr=%p", type);
830 BT_ASSERT(type);
fc25abce 831
3dca2276
PP
832 if (!array) {
833 BT_LOGE_STR("Failed to allocate one array field.");
834 goto end;
fc25abce
PP
835 }
836
3dca2276 837 ret = bt_field_common_array_initialize(BT_TO_COMMON(array),
3fea54f6 838 (void *) type, false, NULL, &bt_field_array_methods,
312c056a
PP
839 (bt_field_common_create_func) bt_field_create_recursive,
840 (GDestroyNotify) bt_field_destroy_recursive);
3dca2276
PP
841 if (ret) {
842 BT_PUT(array);
843 goto end;
844 }
273b65be 845
3dca2276
PP
846 BT_LOGD("Created array field object: addr=%p, ft-addr=%p",
847 array, type);
273b65be 848
3dca2276
PP
849end:
850 return (void *) array;
273b65be
JG
851}
852
312c056a
PP
853BT_HIDDEN
854int bt_field_common_sequence_initialize(struct bt_field_common *field,
855 struct bt_field_type_common *type,
3fea54f6 856 bool is_shared, bt_object_release_func release_func,
312c056a
PP
857 struct bt_field_common_methods *methods,
858 GDestroyNotify field_destroy_func)
859{
860 struct bt_field_common_sequence *sequence = BT_FROM_COMMON(field);
861 int ret = 0;
862
863 BT_LOGD("Initializing common sequence field object: ft-addr=%p", type);
864 BT_ASSERT(type);
3fea54f6
PP
865 bt_field_common_initialize(field, type, is_shared,
866 release_func, methods);
312c056a
PP
867 sequence->elements = g_ptr_array_new();
868 if (!sequence->elements) {
869 ret = -1;
870 goto end;
871 }
872
873 g_ptr_array_set_free_func(sequence->elements, field_destroy_func);
874 BT_LOGD("Initialized common sequence field object: addr=%p, ft-addr=%p",
875 field, type);
876
877end:
878 return ret;
879}
880
273b65be 881static
3dca2276 882struct bt_field *bt_field_sequence_create(struct bt_field_type *type)
273b65be 883{
312c056a
PP
884 struct bt_field_common_sequence *sequence =
885 g_new0(struct bt_field_common_sequence, 1);
886 int ret;
273b65be 887
3dca2276 888 BT_LOGD("Creating sequence field object: ft-addr=%p", type);
312c056a 889 BT_ASSERT(type);
273b65be 890
312c056a 891 if (!sequence) {
3dca2276 892 BT_LOGE_STR("Failed to allocate one sequence field.");
312c056a 893 goto end;
4fef87ab 894 }
3dca2276 895
312c056a 896 ret = bt_field_common_sequence_initialize(BT_TO_COMMON(sequence),
3fea54f6 897 (void *) type, false, NULL, &bt_field_sequence_methods,
312c056a
PP
898 (GDestroyNotify) bt_field_destroy_recursive);
899 if (ret) {
900 BT_PUT(sequence);
901 goto end;
902 }
903
904 BT_LOGD("Created sequence field object: addr=%p, ft-addr=%p",
905 sequence, type);
906
907end:
3dca2276 908 return (void *) sequence;
273b65be
JG
909}
910
911static
3dca2276 912struct bt_field *bt_field_string_create(struct bt_field_type *type)
273b65be 913{
3dca2276
PP
914 struct bt_field_common_string *string = g_new0(
915 struct bt_field_common_string, 1);
fc25abce 916
3dca2276
PP
917 BT_LOGD("Creating string field object: ft-addr=%p", type);
918
919 if (string) {
4d4b475d 920 bt_field_common_string_initialize(BT_TO_COMMON(string),
3fea54f6 921 (void *) type, false, NULL, &bt_field_string_methods);
3dca2276
PP
922 BT_LOGD("Created string field object: addr=%p, ft-addr=%p",
923 string, type);
924 } else {
925 BT_LOGE_STR("Failed to allocate one string field.");
9b2b7163 926 }
3dca2276
PP
927
928 return (void *) string;
273b65be
JG
929}
930
3dca2276
PP
931BT_HIDDEN
932int bt_field_common_generic_validate(struct bt_field_common *field)
273b65be 933{
da2f6971 934 return (field && field->payload_set) ? 0 : -1;
273b65be
JG
935}
936
3dca2276
PP
937BT_HIDDEN
938int bt_field_common_structure_validate_recursive(struct bt_field_common *field)
273b65be 939{
fc25abce 940 int64_t i;
273b65be 941 int ret = 0;
3dca2276 942 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
273b65be 943
f6ccaed9 944 BT_ASSERT(field);
f6ccaed9 945
273b65be 946 for (i = 0; i < structure->fields->len; i++) {
3dca2276 947 ret = bt_field_common_validate_recursive(
f6ccaed9 948 (void *) structure->fields->pdata[i]);
fc25abce 949
273b65be 950 if (ret) {
fc25abce 951 int this_ret;
6ce12048 952 const char *name;
6ce12048 953
094ff7c0 954 this_ret = bt_field_type_common_structure_borrow_field_by_index(
f6ccaed9
PP
955 field->type, &name, NULL, i);
956 BT_ASSERT(this_ret == 0);
957 BT_ASSERT_PRE_MSG("Invalid structure field's field: "
3dca2276
PP
958 "%![struct-field-]+_f, field-name=\"%s\", "
959 "index=%" PRId64 ", %![field-]+_f",
f6ccaed9 960 field, name, i, structure->fields->pdata[i]);
273b65be
JG
961 goto end;
962 }
963 }
f6ccaed9 964
273b65be
JG
965end:
966 return ret;
967}
968
3dca2276
PP
969BT_HIDDEN
970int bt_field_common_variant_validate_recursive(struct bt_field_common *field)
273b65be
JG
971{
972 int ret = 0;
3dca2276 973 struct bt_field_common_variant *variant = BT_FROM_COMMON(field);
273b65be 974
f6ccaed9 975 BT_ASSERT(field);
312c056a
PP
976
977 if (!variant->current_field) {
978 ret = -1;
979 goto end;
fc25abce 980 }
f6ccaed9 981
312c056a
PP
982 ret = bt_field_common_validate_recursive(variant->current_field);
983
984end:
273b65be
JG
985 return ret;
986}
987
3dca2276
PP
988BT_HIDDEN
989int bt_field_common_array_validate_recursive(struct bt_field_common *field)
273b65be 990{
fc25abce 991 int64_t i;
273b65be 992 int ret = 0;
3dca2276 993 struct bt_field_common_array *array = BT_FROM_COMMON(field);
273b65be 994
f6ccaed9 995 BT_ASSERT(field);
3dca2276 996
273b65be 997 for (i = 0; i < array->elements->len; i++) {
3dca2276 998 ret = bt_field_common_validate_recursive((void *) array->elements->pdata[i]);
273b65be 999 if (ret) {
f6ccaed9 1000 BT_ASSERT_PRE_MSG("Invalid array field's element field: "
3dca2276
PP
1001 "%![array-field-]+_f, " PRId64 ", "
1002 "%![elem-field-]+_f",
f6ccaed9 1003 field, i, array->elements->pdata[i]);
273b65be
JG
1004 goto end;
1005 }
1006 }
f6ccaed9 1007
273b65be
JG
1008end:
1009 return ret;
1010}
1011
3dca2276
PP
1012BT_HIDDEN
1013int bt_field_common_sequence_validate_recursive(struct bt_field_common *field)
273b65be
JG
1014{
1015 size_t i;
1016 int ret = 0;
3dca2276 1017 struct bt_field_common_sequence *sequence = BT_FROM_COMMON(field);
273b65be 1018
f6ccaed9 1019 BT_ASSERT(field);
3dca2276 1020
273b65be 1021 for (i = 0; i < sequence->elements->len; i++) {
3dca2276 1022 ret = bt_field_common_validate_recursive(
f6ccaed9 1023 (void *) sequence->elements->pdata[i]);
273b65be 1024 if (ret) {
f6ccaed9 1025 BT_ASSERT_PRE_MSG("Invalid sequence field's element field: "
3dca2276
PP
1026 "%![seq-field-]+_f, " PRId64 ", "
1027 "%![elem-field-]+_f",
f6ccaed9 1028 field, i, sequence->elements->pdata[i]);
273b65be
JG
1029 goto end;
1030 }
1031 }
1032end:
1033 return ret;
1034}
1035
3dca2276
PP
1036BT_HIDDEN
1037void bt_field_common_generic_reset(struct bt_field_common *field)
12c8a1a3 1038{
f6ccaed9 1039 BT_ASSERT(field);
d990a4fb 1040 field->payload_set = false;
12c8a1a3
JG
1041}
1042
3dca2276
PP
1043BT_HIDDEN
1044void bt_field_common_structure_reset_recursive(struct bt_field_common *field)
12c8a1a3 1045{
fc25abce 1046 int64_t i;
3dca2276 1047 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
12c8a1a3 1048
f6ccaed9 1049 BT_ASSERT(field);
f6ccaed9 1050
12c8a1a3 1051 for (i = 0; i < structure->fields->len; i++) {
3dca2276 1052 struct bt_field_common *member = structure->fields->pdata[i];
12c8a1a3
JG
1053
1054 if (!member) {
1055 /*
f6ccaed9
PP
1056 * Structure members are lazily initialized;
1057 * skip if this member has not been allocated
1058 * yet.
12c8a1a3
JG
1059 */
1060 continue;
1061 }
1062
3dca2276 1063 bt_field_common_reset_recursive(member);
12c8a1a3 1064 }
12c8a1a3
JG
1065}
1066
3dca2276
PP
1067BT_HIDDEN
1068void bt_field_common_variant_reset_recursive(struct bt_field_common *field)
12c8a1a3 1069{
3dca2276 1070 struct bt_field_common_variant *variant = BT_FROM_COMMON(field);
12c8a1a3 1071
f6ccaed9 1072 BT_ASSERT(field);
312c056a 1073 variant->current_field = NULL;
12c8a1a3
JG
1074}
1075
3dca2276
PP
1076BT_HIDDEN
1077void bt_field_common_array_reset_recursive(struct bt_field_common *field)
12c8a1a3
JG
1078{
1079 size_t i;
3dca2276 1080 struct bt_field_common_array *array = BT_FROM_COMMON(field);
12c8a1a3 1081
f6ccaed9 1082 BT_ASSERT(field);
f6ccaed9 1083
12c8a1a3 1084 for (i = 0; i < array->elements->len; i++) {
3dca2276 1085 struct bt_field_common *member = array->elements->pdata[i];
12c8a1a3
JG
1086
1087 if (!member) {
1088 /*
f6ccaed9
PP
1089 * Array elements are lazily initialized; skip
1090 * if this member has not been allocated yet.
12c8a1a3
JG
1091 */
1092 continue;
1093 }
1094
3dca2276 1095 bt_field_common_reset_recursive(member);
12c8a1a3 1096 }
12c8a1a3
JG
1097}
1098
3dca2276
PP
1099BT_HIDDEN
1100void bt_field_common_sequence_reset_recursive(struct bt_field_common *field)
12c8a1a3 1101{
3dca2276 1102 struct bt_field_common_sequence *sequence = BT_FROM_COMMON(field);
312c056a 1103 uint64_t i;
12c8a1a3 1104
f6ccaed9 1105 BT_ASSERT(field);
f6ccaed9 1106
312c056a
PP
1107 for (i = 0; i < sequence->elements->len; i++) {
1108 if (sequence->elements->pdata[i]) {
1109 bt_field_common_reset_recursive(
1110 sequence->elements->pdata[i]);
1111 }
12c8a1a3 1112 }
f6ccaed9 1113
312c056a 1114 sequence->length = 0;
12c8a1a3
JG
1115}
1116
3dca2276 1117BT_HIDDEN
312c056a
PP
1118void bt_field_common_generic_set_is_frozen(struct bt_field_common *field,
1119 bool is_frozen)
918be005 1120{
312c056a 1121 field->frozen = is_frozen;
918be005
PP
1122}
1123
3dca2276 1124BT_HIDDEN
312c056a
PP
1125void bt_field_common_structure_set_is_frozen_recursive(
1126 struct bt_field_common *field, bool is_frozen)
918be005 1127{
312c056a 1128 uint64_t i;
3dca2276
PP
1129 struct bt_field_common_structure *structure_field =
1130 BT_FROM_COMMON(field);
918be005 1131
fc25abce
PP
1132 BT_LOGD("Freezing structure field object: addr=%p", field);
1133
918be005 1134 for (i = 0; i < structure_field->fields->len; i++) {
312c056a 1135 struct bt_field_common *struct_field =
918be005
PP
1136 g_ptr_array_index(structure_field->fields, i);
1137
fc25abce 1138 BT_LOGD("Freezing structure field's field: field-addr=%p, index=%" PRId64,
312c056a
PP
1139 struct_field, i);
1140 bt_field_common_set_is_frozen_recursive(struct_field,
1141 is_frozen);
918be005
PP
1142 }
1143
312c056a 1144 bt_field_common_generic_set_is_frozen(field, is_frozen);
918be005
PP
1145}
1146
3dca2276 1147BT_HIDDEN
312c056a
PP
1148void bt_field_common_variant_set_is_frozen_recursive(
1149 struct bt_field_common *field, bool is_frozen)
918be005 1150{
312c056a 1151 uint64_t i;
3dca2276 1152 struct bt_field_common_variant *variant_field = BT_FROM_COMMON(field);
918be005 1153
fc25abce 1154 BT_LOGD("Freezing variant field object: addr=%p", field);
312c056a
PP
1155
1156 for (i = 0; i < variant_field->fields->len; i++) {
1157 struct bt_field_common *var_field =
1158 g_ptr_array_index(variant_field->fields, i);
1159
1160 BT_LOGD("Freezing variant field's field: field-addr=%p, index=%" PRId64,
1161 var_field, i);
1162 bt_field_common_set_is_frozen_recursive(var_field, is_frozen);
1163 }
1164
1165 bt_field_common_generic_set_is_frozen(field, is_frozen);
918be005
PP
1166}
1167
3dca2276 1168BT_HIDDEN
312c056a
PP
1169void bt_field_common_array_set_is_frozen_recursive(
1170 struct bt_field_common *field, bool is_frozen)
918be005 1171{
fc25abce 1172 int64_t i;
3dca2276 1173 struct bt_field_common_array *array_field = BT_FROM_COMMON(field);
918be005 1174
fc25abce
PP
1175 BT_LOGD("Freezing array field object: addr=%p", field);
1176
918be005 1177 for (i = 0; i < array_field->elements->len; i++) {
3dca2276 1178 struct bt_field_common *elem_field =
918be005
PP
1179 g_ptr_array_index(array_field->elements, i);
1180
fc25abce
PP
1181 BT_LOGD("Freezing array field object's element field: "
1182 "element-field-addr=%p, index=%" PRId64,
1183 elem_field, i);
312c056a 1184 bt_field_common_set_is_frozen_recursive(elem_field, is_frozen);
918be005
PP
1185 }
1186
312c056a 1187 bt_field_common_generic_set_is_frozen(field, is_frozen);
918be005
PP
1188}
1189
3dca2276 1190BT_HIDDEN
312c056a
PP
1191void bt_field_common_sequence_set_is_frozen_recursive(
1192 struct bt_field_common *field, bool is_frozen)
918be005 1193{
fc25abce 1194 int64_t i;
3dca2276
PP
1195 struct bt_field_common_sequence *sequence_field =
1196 BT_FROM_COMMON(field);
918be005 1197
fc25abce 1198 BT_LOGD("Freezing sequence field object: addr=%p", field);
918be005 1199
312c056a 1200 for (i = 0; i < sequence_field->length; i++) {
3dca2276 1201 struct bt_field_common *elem_field =
918be005
PP
1202 g_ptr_array_index(sequence_field->elements, i);
1203
fc25abce
PP
1204 BT_LOGD("Freezing sequence field object's element field: "
1205 "element-field-addr=%p, index=%" PRId64,
1206 elem_field, i);
312c056a 1207 bt_field_common_set_is_frozen_recursive(elem_field, is_frozen);
918be005
PP
1208 }
1209
312c056a 1210 bt_field_common_generic_set_is_frozen(field, is_frozen);
918be005
PP
1211}
1212
1213BT_HIDDEN
312c056a
PP
1214void _bt_field_common_set_is_frozen_recursive(struct bt_field_common *field,
1215 bool is_frozen)
918be005
PP
1216{
1217 if (!field) {
1218 goto end;
1219 }
1220
312c056a
PP
1221 BT_LOGD("Setting field object's frozen state: addr=%p, is-frozen=%d",
1222 field, is_frozen);
3dca2276 1223 BT_ASSERT(field_type_common_has_known_id(field->type));
312c056a
PP
1224 BT_ASSERT(field->methods->set_is_frozen);
1225 field->methods->set_is_frozen(field, is_frozen);
3dca2276 1226
918be005
PP
1227end:
1228 return;
1229}
76f869ab 1230
3dca2276
PP
1231BT_HIDDEN
1232bt_bool bt_field_common_generic_is_set(struct bt_field_common *field)
76f869ab
JG
1233{
1234 return field && field->payload_set;
1235}
1236
3dca2276
PP
1237BT_HIDDEN
1238bt_bool bt_field_common_structure_is_set_recursive(
1239 struct bt_field_common *field)
76f869ab 1240{
d4bf905a 1241 bt_bool is_set = BT_FALSE;
76f869ab 1242 size_t i;
3dca2276 1243 struct bt_field_common_structure *structure = BT_FROM_COMMON(field);
76f869ab 1244
f6ccaed9 1245 BT_ASSERT(field);
3dca2276 1246
76f869ab 1247 for (i = 0; i < structure->fields->len; i++) {
3dca2276 1248 is_set = bt_field_common_is_set_recursive(
f1367c62 1249 structure->fields->pdata[i]);
d4bf905a 1250 if (!is_set) {
76f869ab
JG
1251 goto end;
1252 }
1253 }
3dca2276 1254
76f869ab 1255end:
d4bf905a 1256 return is_set;
76f869ab
JG
1257}
1258
3dca2276
PP
1259BT_HIDDEN
1260bt_bool bt_field_common_variant_is_set_recursive(struct bt_field_common *field)
76f869ab 1261{
3dca2276 1262 struct bt_field_common_variant *variant = BT_FROM_COMMON(field);
312c056a 1263 bt_bool is_set = BT_FALSE;
76f869ab 1264
f6ccaed9 1265 BT_ASSERT(field);
312c056a
PP
1266
1267 if (variant->current_field) {
1268 is_set = bt_field_common_is_set_recursive(
1269 variant->current_field);
1270 }
1271
1272 return is_set;
76f869ab
JG
1273}
1274
3dca2276
PP
1275BT_HIDDEN
1276bt_bool bt_field_common_array_is_set_recursive(struct bt_field_common *field)
76f869ab
JG
1277{
1278 size_t i;
d4bf905a 1279 bt_bool is_set = BT_FALSE;
3dca2276 1280 struct bt_field_common_array *array = BT_FROM_COMMON(field);
76f869ab 1281
f6ccaed9 1282 BT_ASSERT(field);
3dca2276 1283
76f869ab 1284 for (i = 0; i < array->elements->len; i++) {
3dca2276 1285 is_set = bt_field_common_is_set_recursive(array->elements->pdata[i]);
d4bf905a 1286 if (!is_set) {
76f869ab
JG
1287 goto end;
1288 }
1289 }
3dca2276 1290
76f869ab 1291end:
d4bf905a 1292 return is_set;
76f869ab
JG
1293}
1294
3dca2276
PP
1295BT_HIDDEN
1296bt_bool bt_field_common_sequence_is_set_recursive(struct bt_field_common *field)
76f869ab
JG
1297{
1298 size_t i;
d4bf905a 1299 bt_bool is_set = BT_FALSE;
3dca2276 1300 struct bt_field_common_sequence *sequence = BT_FROM_COMMON(field);
76f869ab 1301
f6ccaed9 1302 BT_ASSERT(field);
3dca2276 1303
6ead1648
JG
1304 if (!sequence->elements) {
1305 goto end;
1306 }
1307
76f869ab 1308 for (i = 0; i < sequence->elements->len; i++) {
3dca2276
PP
1309 is_set = bt_field_common_is_set_recursive(
1310 sequence->elements->pdata[i]);
d4bf905a 1311 if (!is_set) {
76f869ab
JG
1312 goto end;
1313 }
1314 }
3dca2276 1315
76f869ab 1316end:
d4bf905a 1317 return is_set;
76f869ab 1318}
This page took 0.126101 seconds and 4 git commands to generate.