1 #ifndef BABELTRACE_PLUGIN_CTF_FS_SINK_FS_SINK_CTF_META_H
2 #define BABELTRACE_PLUGIN_CTF_FS_SINK_FS_SINK_CTF_META_H
5 * Copyright 2018-2019 - Philippe Proulx <pproulx@efficios.com>
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
18 #include <babeltrace2/babeltrace.h>
19 #include "common/common.h"
20 #include "common/assert.h"
21 #include "common/uuid.h"
28 enum fs_sink_ctf_field_class_type
{
29 FS_SINK_CTF_FIELD_CLASS_TYPE_BOOL
,
30 FS_SINK_CTF_FIELD_CLASS_TYPE_BIT_ARRAY
,
31 FS_SINK_CTF_FIELD_CLASS_TYPE_INT
,
32 FS_SINK_CTF_FIELD_CLASS_TYPE_FLOAT
,
33 FS_SINK_CTF_FIELD_CLASS_TYPE_STRING
,
34 FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT
,
35 FS_SINK_CTF_FIELD_CLASS_TYPE_ARRAY
,
36 FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE
,
37 FS_SINK_CTF_FIELD_CLASS_TYPE_OPTION
,
38 FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT
,
41 struct fs_sink_ctf_field_class
{
42 enum fs_sink_ctf_field_class_type type
;
45 const bt_field_class
*ir_fc
;
47 unsigned int alignment
;
49 /* Index of the field class within its own parent */
50 uint64_t index_in_parent
;
53 struct fs_sink_ctf_field_class_bit_array
{
54 struct fs_sink_ctf_field_class base
;
58 struct fs_sink_ctf_field_class_bool
{
59 struct fs_sink_ctf_field_class_bit_array base
;
62 struct fs_sink_ctf_field_class_int
{
63 struct fs_sink_ctf_field_class_bit_array base
;
67 struct fs_sink_ctf_field_class_float
{
68 struct fs_sink_ctf_field_class_bit_array base
;
71 struct fs_sink_ctf_field_class_string
{
72 struct fs_sink_ctf_field_class base
;
75 struct fs_sink_ctf_named_field_class
{
79 struct fs_sink_ctf_field_class
*fc
;
82 struct fs_sink_ctf_field_class_struct
{
83 struct fs_sink_ctf_field_class base
;
85 /* Array of `struct fs_sink_ctf_named_field_class` */
89 struct fs_sink_ctf_field_class_option
{
90 struct fs_sink_ctf_field_class base
;
91 struct fs_sink_ctf_field_class
*content_fc
;
95 struct fs_sink_ctf_field_class_variant
{
96 struct fs_sink_ctf_field_class base
;
100 /* Array of `struct fs_sink_ctf_named_field_class` */
104 struct fs_sink_ctf_field_class_array_base
{
105 struct fs_sink_ctf_field_class base
;
106 struct fs_sink_ctf_field_class
*elem_fc
;
109 struct fs_sink_ctf_field_class_array
{
110 struct fs_sink_ctf_field_class_array_base base
;
114 struct fs_sink_ctf_field_class_sequence
{
115 struct fs_sink_ctf_field_class_array_base base
;
117 bool length_is_before
;
120 struct fs_sink_ctf_stream_class
;
122 struct fs_sink_ctf_event_class
{
124 const bt_event_class
*ir_ec
;
127 struct fs_sink_ctf_stream_class
*sc
;
130 struct fs_sink_ctf_field_class
*spec_context_fc
;
133 struct fs_sink_ctf_field_class
*payload_fc
;
136 struct fs_sink_ctf_trace
;
138 struct fs_sink_ctf_stream_class
{
140 struct fs_sink_ctf_trace
*trace
;
143 const bt_stream_class
*ir_sc
;
146 const bt_clock_class
*default_clock_class
;
148 GString
*default_clock_class_name
;
150 bool packets_have_ts_begin
;
151 bool packets_have_ts_end
;
152 bool has_discarded_events
;
153 bool discarded_events_has_ts
;
154 bool discarded_packets_has_ts
;
157 struct fs_sink_ctf_field_class
*packet_context_fc
;
160 struct fs_sink_ctf_field_class
*event_common_context_fc
;
162 /* Array of `struct fs_sink_ctf_event_class *` (owned by this) */
163 GPtrArray
*event_classes
;
166 * `const bt_event_class *` (weak) ->
167 * `struct fs_sink_ctf_event_class *` (weak)
169 GHashTable
*event_classes_from_ir
;
172 struct fs_sink_ctf_trace
{
174 const bt_trace
*ir_trace
;
177 const bt_trace_class
*ir_tc
;
181 /* Array of `struct fs_sink_ctf_stream_class *` (owned by this) */
182 GPtrArray
*stream_classes
;
186 void fs_sink_ctf_field_class_destroy(struct fs_sink_ctf_field_class
*fc
);
189 void _fs_sink_ctf_field_class_init(struct fs_sink_ctf_field_class
*fc
,
190 enum fs_sink_ctf_field_class_type type
,
191 const bt_field_class
*ir_fc
, unsigned int alignment
,
192 uint64_t index_in_parent
)
197 fc
->alignment
= alignment
;
198 fc
->index_in_parent
= index_in_parent
;
202 void _fs_sink_ctf_field_class_bit_array_init(
203 struct fs_sink_ctf_field_class_bit_array
*fc
,
204 enum fs_sink_ctf_field_class_type type
,
205 const bt_field_class
*ir_fc
, unsigned int size
,
206 uint64_t index_in_parent
)
208 _fs_sink_ctf_field_class_init((void *) fc
, type
, ir_fc
,
209 size
% 8 == 0 ? 8 : 1, index_in_parent
);
214 void _fs_sink_ctf_field_class_int_init(struct fs_sink_ctf_field_class_int
*fc
,
215 enum fs_sink_ctf_field_class_type type
,
216 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
218 bt_field_class_type ir_fc_type
= bt_field_class_get_type(ir_fc
);
220 _fs_sink_ctf_field_class_bit_array_init((void *) fc
, type
, ir_fc
,
221 (unsigned int) bt_field_class_integer_get_field_value_range(
224 fc
->is_signed
= bt_field_class_type_is(ir_fc_type
,
225 BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
);
229 void _fs_sink_ctf_named_field_class_init(
230 struct fs_sink_ctf_named_field_class
*named_fc
)
233 named_fc
->name
= g_string_new(NULL
);
234 BT_ASSERT(named_fc
->name
);
238 void _fs_sink_ctf_named_field_class_fini(
239 struct fs_sink_ctf_named_field_class
*named_fc
)
243 if (named_fc
->name
) {
244 g_string_free(named_fc
->name
, TRUE
);
245 named_fc
->name
= NULL
;
248 fs_sink_ctf_field_class_destroy(named_fc
->fc
);
253 struct fs_sink_ctf_field_class_bit_array
*
254 fs_sink_ctf_field_class_bit_array_create(
255 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
257 struct fs_sink_ctf_field_class_bit_array
*fc
=
258 g_new0(struct fs_sink_ctf_field_class_bit_array
, 1);
261 _fs_sink_ctf_field_class_bit_array_init((void *) fc
,
262 FS_SINK_CTF_FIELD_CLASS_TYPE_BIT_ARRAY
, ir_fc
,
263 (unsigned int) bt_field_class_bit_array_get_length(ir_fc
),
269 struct fs_sink_ctf_field_class_bool
*fs_sink_ctf_field_class_bool_create(
270 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
272 struct fs_sink_ctf_field_class_bool
*fc
=
273 g_new0(struct fs_sink_ctf_field_class_bool
, 1);
278 * CTF 1.8 has no boolean field class type, so this component
279 * translates it to an 8-bit unsigned integer field class.
281 _fs_sink_ctf_field_class_bit_array_init((void *) fc
,
282 FS_SINK_CTF_FIELD_CLASS_TYPE_BOOL
, ir_fc
,
288 struct fs_sink_ctf_field_class_int
*fs_sink_ctf_field_class_int_create(
289 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
291 struct fs_sink_ctf_field_class_int
*fc
=
292 g_new0(struct fs_sink_ctf_field_class_int
, 1);
295 _fs_sink_ctf_field_class_int_init(fc
, FS_SINK_CTF_FIELD_CLASS_TYPE_INT
,
296 ir_fc
, index_in_parent
);
301 struct fs_sink_ctf_field_class_float
*fs_sink_ctf_field_class_float_create(
302 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
304 struct fs_sink_ctf_field_class_float
*fc
=
305 g_new0(struct fs_sink_ctf_field_class_float
, 1);
308 _fs_sink_ctf_field_class_bit_array_init((void *) fc
,
309 FS_SINK_CTF_FIELD_CLASS_TYPE_FLOAT
,
311 bt_field_class_get_type(ir_fc
) ==
312 BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL
? 32 : 64,
318 struct fs_sink_ctf_field_class_string
*fs_sink_ctf_field_class_string_create(
319 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
321 struct fs_sink_ctf_field_class_string
*fc
=
322 g_new0(struct fs_sink_ctf_field_class_string
, 1);
325 _fs_sink_ctf_field_class_init((void *) fc
,
326 FS_SINK_CTF_FIELD_CLASS_TYPE_STRING
, ir_fc
,
332 struct fs_sink_ctf_field_class_struct
*fs_sink_ctf_field_class_struct_create_empty(
333 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
335 struct fs_sink_ctf_field_class_struct
*fc
=
336 g_new0(struct fs_sink_ctf_field_class_struct
, 1);
339 _fs_sink_ctf_field_class_init((void *) fc
,
340 FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT
, ir_fc
, 1, index_in_parent
);
341 fc
->members
= g_array_new(FALSE
, TRUE
,
342 sizeof(struct fs_sink_ctf_named_field_class
));
343 BT_ASSERT(fc
->members
);
348 struct fs_sink_ctf_field_class_option
*fs_sink_ctf_field_class_option_create_empty(
349 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
351 struct fs_sink_ctf_field_class_option
*fc
=
352 g_new0(struct fs_sink_ctf_field_class_option
, 1);
355 _fs_sink_ctf_field_class_init((void *) fc
,
356 FS_SINK_CTF_FIELD_CLASS_TYPE_OPTION
, ir_fc
,
358 fc
->tag_ref
= g_string_new(NULL
);
359 BT_ASSERT(fc
->tag_ref
);
364 struct fs_sink_ctf_field_class_variant
*fs_sink_ctf_field_class_variant_create_empty(
365 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
367 struct fs_sink_ctf_field_class_variant
*fc
=
368 g_new0(struct fs_sink_ctf_field_class_variant
, 1);
371 _fs_sink_ctf_field_class_init((void *) fc
,
372 FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT
, ir_fc
,
374 fc
->options
= g_array_new(FALSE
, TRUE
,
375 sizeof(struct fs_sink_ctf_named_field_class
));
376 BT_ASSERT(fc
->options
);
377 fc
->tag_ref
= g_string_new(NULL
);
378 BT_ASSERT(fc
->tag_ref
);
380 bt_field_class_get_type(fc
->base
.ir_fc
) ==
381 BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD
;
386 struct fs_sink_ctf_field_class_array
*fs_sink_ctf_field_class_array_create_empty(
387 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
389 struct fs_sink_ctf_field_class_array
*fc
=
390 g_new0(struct fs_sink_ctf_field_class_array
, 1);
393 _fs_sink_ctf_field_class_init((void *) fc
,
394 FS_SINK_CTF_FIELD_CLASS_TYPE_ARRAY
, ir_fc
,
396 fc
->length
= bt_field_class_array_static_get_length(ir_fc
);
401 struct fs_sink_ctf_field_class_sequence
*fs_sink_ctf_field_class_sequence_create_empty(
402 const bt_field_class
*ir_fc
, uint64_t index_in_parent
)
404 struct fs_sink_ctf_field_class_sequence
*fc
=
405 g_new0(struct fs_sink_ctf_field_class_sequence
, 1);
408 _fs_sink_ctf_field_class_init((void *) fc
,
409 FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE
,
410 ir_fc
, 1, index_in_parent
);
411 fc
->length_ref
= g_string_new(NULL
);
412 BT_ASSERT(fc
->length_ref
);
413 fc
->length_is_before
=
414 bt_field_class_get_type(ir_fc
) ==
415 BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD
;
420 struct fs_sink_ctf_named_field_class
*
421 fs_sink_ctf_field_class_struct_borrow_member_by_index(
422 struct fs_sink_ctf_field_class_struct
*fc
, uint64_t index
);
425 struct fs_sink_ctf_named_field_class
*
426 fs_sink_ctf_field_class_variant_borrow_option_by_index(
427 struct fs_sink_ctf_field_class_variant
*fc
, uint64_t index
);
430 void _fs_sink_ctf_field_class_fini(struct fs_sink_ctf_field_class
*fc
)
436 void _fs_sink_ctf_field_class_bit_array_destroy(
437 struct fs_sink_ctf_field_class_int
*fc
)
440 _fs_sink_ctf_field_class_fini((void *) fc
);
445 void _fs_sink_ctf_field_class_bool_destroy(
446 struct fs_sink_ctf_field_class_int
*fc
)
449 _fs_sink_ctf_field_class_fini((void *) fc
);
454 void _fs_sink_ctf_field_class_int_destroy(
455 struct fs_sink_ctf_field_class_int
*fc
)
458 _fs_sink_ctf_field_class_fini((void *) fc
);
463 void _fs_sink_ctf_field_class_float_destroy(
464 struct fs_sink_ctf_field_class_float
*fc
)
467 _fs_sink_ctf_field_class_fini((void *) fc
);
472 void _fs_sink_ctf_field_class_string_destroy(
473 struct fs_sink_ctf_field_class_string
*fc
)
476 _fs_sink_ctf_field_class_fini((void *) fc
);
481 void _fs_sink_ctf_field_class_struct_destroy(
482 struct fs_sink_ctf_field_class_struct
*fc
)
485 _fs_sink_ctf_field_class_fini((void *) fc
);
490 for (i
= 0; i
< fc
->members
->len
; i
++) {
491 struct fs_sink_ctf_named_field_class
*named_fc
=
492 fs_sink_ctf_field_class_struct_borrow_member_by_index(
495 _fs_sink_ctf_named_field_class_fini(named_fc
);
498 g_array_free(fc
->members
, TRUE
);
506 void _fs_sink_ctf_field_class_array_base_fini(
507 struct fs_sink_ctf_field_class_array_base
*fc
)
510 _fs_sink_ctf_field_class_fini((void *) fc
);
511 fs_sink_ctf_field_class_destroy(fc
->elem_fc
);
516 void _fs_sink_ctf_field_class_array_destroy(
517 struct fs_sink_ctf_field_class_array
*fc
)
520 _fs_sink_ctf_field_class_array_base_fini((void *) fc
);
525 void _fs_sink_ctf_field_class_sequence_destroy(
526 struct fs_sink_ctf_field_class_sequence
*fc
)
529 _fs_sink_ctf_field_class_array_base_fini((void *) fc
);
531 if (fc
->length_ref
) {
532 g_string_free(fc
->length_ref
, TRUE
);
533 fc
->length_ref
= NULL
;
540 void _fs_sink_ctf_field_class_option_destroy(
541 struct fs_sink_ctf_field_class_option
*fc
)
544 _fs_sink_ctf_field_class_fini((void *) fc
);
545 fs_sink_ctf_field_class_destroy(fc
->content_fc
);
548 g_string_free(fc
->tag_ref
, TRUE
);
556 void _fs_sink_ctf_field_class_variant_destroy(
557 struct fs_sink_ctf_field_class_variant
*fc
)
560 _fs_sink_ctf_field_class_fini((void *) fc
);
565 for (i
= 0; i
< fc
->options
->len
; i
++) {
566 struct fs_sink_ctf_named_field_class
*named_fc
=
567 fs_sink_ctf_field_class_variant_borrow_option_by_index(
570 _fs_sink_ctf_named_field_class_fini(named_fc
);
573 g_array_free(fc
->options
, TRUE
);
578 g_string_free(fc
->tag_ref
, TRUE
);
586 void fs_sink_ctf_field_class_destroy(struct fs_sink_ctf_field_class
*fc
)
593 case FS_SINK_CTF_FIELD_CLASS_TYPE_BOOL
:
594 _fs_sink_ctf_field_class_bool_destroy((void *) fc
);
596 case FS_SINK_CTF_FIELD_CLASS_TYPE_BIT_ARRAY
:
597 _fs_sink_ctf_field_class_bit_array_destroy((void *) fc
);
599 case FS_SINK_CTF_FIELD_CLASS_TYPE_INT
:
600 _fs_sink_ctf_field_class_int_destroy((void *) fc
);
602 case FS_SINK_CTF_FIELD_CLASS_TYPE_FLOAT
:
603 _fs_sink_ctf_field_class_float_destroy((void *) fc
);
605 case FS_SINK_CTF_FIELD_CLASS_TYPE_STRING
:
606 _fs_sink_ctf_field_class_string_destroy((void *) fc
);
608 case FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT
:
609 _fs_sink_ctf_field_class_struct_destroy((void *) fc
);
611 case FS_SINK_CTF_FIELD_CLASS_TYPE_ARRAY
:
612 _fs_sink_ctf_field_class_array_destroy((void *) fc
);
614 case FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE
:
615 _fs_sink_ctf_field_class_sequence_destroy((void *) fc
);
617 case FS_SINK_CTF_FIELD_CLASS_TYPE_OPTION
:
618 _fs_sink_ctf_field_class_option_destroy((void *) fc
);
620 case FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT
:
621 _fs_sink_ctf_field_class_variant_destroy((void *) fc
);
629 struct fs_sink_ctf_named_field_class
*
630 fs_sink_ctf_field_class_struct_borrow_member_by_index(
631 struct fs_sink_ctf_field_class_struct
*fc
, uint64_t index
)
634 BT_ASSERT_DBG(index
< fc
->members
->len
);
635 return &g_array_index(fc
->members
, struct fs_sink_ctf_named_field_class
,
640 struct fs_sink_ctf_named_field_class
*
641 fs_sink_ctf_field_class_struct_borrow_member_by_name(
642 struct fs_sink_ctf_field_class_struct
*fc
, const char *name
)
645 struct fs_sink_ctf_named_field_class
*ret_named_fc
= NULL
;
650 for (i
= 0; i
< fc
->members
->len
; i
++) {
651 struct fs_sink_ctf_named_field_class
*named_fc
=
652 fs_sink_ctf_field_class_struct_borrow_member_by_index(
655 if (strcmp(name
, named_fc
->name
->str
) == 0) {
656 ret_named_fc
= named_fc
;
666 struct fs_sink_ctf_field_class
*
667 fs_sink_ctf_field_class_struct_borrow_member_field_class_by_name(
668 struct fs_sink_ctf_field_class_struct
*struct_fc
, const char *name
)
670 struct fs_sink_ctf_named_field_class
*named_fc
= NULL
;
671 struct fs_sink_ctf_field_class
*fc
= NULL
;
677 named_fc
= fs_sink_ctf_field_class_struct_borrow_member_by_name(
690 struct fs_sink_ctf_field_class_int
*
691 fs_sink_ctf_field_class_struct_borrow_member_int_field_class_by_name(
692 struct fs_sink_ctf_field_class_struct
*struct_fc
,
695 struct fs_sink_ctf_field_class_int
*int_fc
= NULL
;
698 fs_sink_ctf_field_class_struct_borrow_member_field_class_by_name(
704 if (int_fc
->base
.base
.type
!= FS_SINK_CTF_FIELD_CLASS_TYPE_INT
) {
714 void fs_sink_ctf_field_class_struct_align_at_least(
715 struct fs_sink_ctf_field_class_struct
*fc
,
716 unsigned int alignment
)
718 if (alignment
> fc
->base
.alignment
) {
719 fc
->base
.alignment
= alignment
;
724 void fs_sink_ctf_field_class_struct_append_member(
725 struct fs_sink_ctf_field_class_struct
*fc
,
726 const char *name
, struct fs_sink_ctf_field_class
*member_fc
)
728 struct fs_sink_ctf_named_field_class
*named_fc
;
732 g_array_set_size(fc
->members
, fc
->members
->len
+ 1);
734 named_fc
= &g_array_index(fc
->members
,
735 struct fs_sink_ctf_named_field_class
, fc
->members
->len
- 1);
736 _fs_sink_ctf_named_field_class_init(named_fc
);
737 g_string_assign(named_fc
->name
, name
);
738 named_fc
->fc
= member_fc
;
739 fs_sink_ctf_field_class_struct_align_at_least(fc
, member_fc
->alignment
);
743 struct fs_sink_ctf_named_field_class
*
744 fs_sink_ctf_field_class_variant_borrow_option_by_index(
745 struct fs_sink_ctf_field_class_variant
*fc
, uint64_t index
)
748 BT_ASSERT_DBG(index
< fc
->options
->len
);
749 return &g_array_index(fc
->options
, struct fs_sink_ctf_named_field_class
,
754 struct fs_sink_ctf_named_field_class
*
755 fs_sink_ctf_field_class_variant_borrow_option_by_name(
756 struct fs_sink_ctf_field_class_variant
*fc
, const char *name
)
759 struct fs_sink_ctf_named_field_class
*ret_named_fc
= NULL
;
764 for (i
= 0; i
< fc
->options
->len
; i
++) {
765 struct fs_sink_ctf_named_field_class
*named_fc
=
766 fs_sink_ctf_field_class_variant_borrow_option_by_index(
769 if (strcmp(name
, named_fc
->name
->str
) == 0) {
770 ret_named_fc
= named_fc
;
780 void fs_sink_ctf_field_class_variant_append_option(
781 struct fs_sink_ctf_field_class_variant
*fc
,
782 const char *name
, struct fs_sink_ctf_field_class
*option_fc
)
784 struct fs_sink_ctf_named_field_class
*named_fc
;
788 g_array_set_size(fc
->options
, fc
->options
->len
+ 1);
790 named_fc
= &g_array_index(fc
->options
,
791 struct fs_sink_ctf_named_field_class
, fc
->options
->len
- 1);
792 _fs_sink_ctf_named_field_class_init(named_fc
);
793 g_string_assign(named_fc
->name
, name
);
794 named_fc
->fc
= option_fc
;
798 struct fs_sink_ctf_event_class
*fs_sink_ctf_event_class_create(
799 struct fs_sink_ctf_stream_class
*sc
,
800 const bt_event_class
*ir_ec
)
802 struct fs_sink_ctf_event_class
*ec
=
803 g_new0(struct fs_sink_ctf_event_class
, 1);
810 g_ptr_array_add(sc
->event_classes
, ec
);
811 g_hash_table_insert(sc
->event_classes_from_ir
, (gpointer
) ir_ec
, ec
);
816 void fs_sink_ctf_event_class_destroy(struct fs_sink_ctf_event_class
*ec
)
822 fs_sink_ctf_field_class_destroy(ec
->spec_context_fc
);
823 ec
->spec_context_fc
= NULL
;
824 fs_sink_ctf_field_class_destroy(ec
->payload_fc
);
825 ec
->payload_fc
= NULL
;
830 struct fs_sink_ctf_stream_class
*fs_sink_ctf_stream_class_create(
831 struct fs_sink_ctf_trace
*trace
,
832 const bt_stream_class
*ir_sc
)
834 struct fs_sink_ctf_stream_class
*sc
=
835 g_new0(struct fs_sink_ctf_stream_class
, 1);
842 sc
->default_clock_class
=
843 bt_stream_class_borrow_default_clock_class_const(ir_sc
);
844 sc
->default_clock_class_name
= g_string_new(NULL
);
845 BT_ASSERT(sc
->default_clock_class_name
);
846 sc
->event_classes
= g_ptr_array_new_with_free_func(
847 (GDestroyNotify
) fs_sink_ctf_event_class_destroy
);
848 BT_ASSERT(sc
->event_classes
);
849 sc
->event_classes_from_ir
= g_hash_table_new(g_direct_hash
,
851 BT_ASSERT(sc
->event_classes_from_ir
);
852 sc
->has_packets
= bt_stream_class_supports_packets(ir_sc
);
853 sc
->packets_have_ts_begin
=
854 bt_stream_class_packets_have_beginning_default_clock_snapshot(
856 sc
->packets_have_ts_end
=
857 bt_stream_class_packets_have_end_default_clock_snapshot(ir_sc
);
858 sc
->has_discarded_events
=
859 bt_stream_class_supports_discarded_events(ir_sc
);
861 if (sc
->has_discarded_events
) {
862 sc
->discarded_events_has_ts
=
863 bt_stream_class_discarded_events_have_default_clock_snapshots(
867 if (bt_stream_class_supports_discarded_packets(ir_sc
)) {
868 sc
->discarded_packets_has_ts
=
869 bt_stream_class_discarded_packets_have_default_clock_snapshots(
873 g_ptr_array_add(trace
->stream_classes
, sc
);
878 void fs_sink_ctf_stream_class_destroy(struct fs_sink_ctf_stream_class
*sc
)
884 if (sc
->default_clock_class_name
) {
885 g_string_free(sc
->default_clock_class_name
, TRUE
);
886 sc
->default_clock_class_name
= NULL
;
889 if (sc
->event_classes
) {
890 g_ptr_array_free(sc
->event_classes
, TRUE
);
891 sc
->event_classes
= NULL
;
894 if (sc
->event_classes_from_ir
) {
895 g_hash_table_destroy(sc
->event_classes_from_ir
);
896 sc
->event_classes_from_ir
= NULL
;
899 fs_sink_ctf_field_class_destroy(sc
->packet_context_fc
);
900 sc
->packet_context_fc
= NULL
;
901 fs_sink_ctf_field_class_destroy(sc
->event_common_context_fc
);
902 sc
->event_common_context_fc
= NULL
;
907 void fs_sink_ctf_stream_class_append_event_class(
908 struct fs_sink_ctf_stream_class
*sc
,
909 struct fs_sink_ctf_event_class
*ec
)
911 g_ptr_array_add(sc
->event_classes
, ec
);
915 void fs_sink_ctf_trace_destroy(struct fs_sink_ctf_trace
*trace
)
921 if (trace
->stream_classes
) {
922 g_ptr_array_free(trace
->stream_classes
, TRUE
);
923 trace
->stream_classes
= NULL
;
930 struct fs_sink_ctf_trace
*fs_sink_ctf_trace_create(const bt_trace
*ir_trace
)
932 struct fs_sink_ctf_trace
*trace
=
933 g_new0(struct fs_sink_ctf_trace
, 1);
937 bt_uuid_generate(trace
->uuid
);
939 trace
->ir_trace
= ir_trace
;
940 trace
->ir_tc
= bt_trace_borrow_class_const(ir_trace
);
941 trace
->stream_classes
= g_ptr_array_new_with_free_func(
942 (GDestroyNotify
) fs_sink_ctf_stream_class_destroy
);
943 BT_ASSERT(trace
->stream_classes
);
948 #endif /* BABELTRACE_PLUGIN_CTF_FS_SINK_FS_SINK_CTF_META_H */