objects: Doxygen: bt_object_type: minor fix
[babeltrace.git] / formats / ctf / ir / trace.c
CommitLineData
bc37ae52
JG
1/*
2 * trace.c
3 *
4 * Babeltrace CTF IR - Trace
5 *
6 * Copyright 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
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
29#include <babeltrace/ctf-ir/trace-internal.h>
30#include <babeltrace/ctf-ir/clock-internal.h>
31#include <babeltrace/ctf-ir/stream-internal.h>
32#include <babeltrace/ctf-ir/stream-class-internal.h>
33#include <babeltrace/ctf-writer/functor-internal.h>
34#include <babeltrace/ctf-ir/event-types-internal.h>
654c1444 35#include <babeltrace/ctf-ir/utils.h>
bc37ae52
JG
36#include <babeltrace/compiler.h>
37
38#define DEFAULT_IDENTIFIER_SIZE 128
39#define DEFAULT_METADATA_STRING_SIZE 4096
40
41static
42void environment_variable_destroy(struct environment_variable *var);
43static
44void bt_ctf_trace_destroy(struct bt_ctf_ref *ref);
45static
46int init_trace_packet_header(struct bt_ctf_trace *trace);
47
bc37ae52
JG
48static
49const unsigned int field_type_aliases_alignments[] = {
50 [FIELD_TYPE_ALIAS_UINT5_T] = 1,
51 [FIELD_TYPE_ALIAS_UINT8_T ... FIELD_TYPE_ALIAS_UINT16_T] = 8,
52 [FIELD_TYPE_ALIAS_UINT27_T] = 1,
53 [FIELD_TYPE_ALIAS_UINT32_T ... FIELD_TYPE_ALIAS_UINT64_T] = 8,
54};
55
56static
57const unsigned int field_type_aliases_sizes[] = {
58 [FIELD_TYPE_ALIAS_UINT5_T] = 5,
59 [FIELD_TYPE_ALIAS_UINT8_T] = 8,
60 [FIELD_TYPE_ALIAS_UINT16_T] = 16,
61 [FIELD_TYPE_ALIAS_UINT27_T] = 27,
62 [FIELD_TYPE_ALIAS_UINT32_T] = 32,
63 [FIELD_TYPE_ALIAS_UINT64_T] = 64,
64};
65
bc37ae52
JG
66struct bt_ctf_trace *bt_ctf_trace_create(void)
67{
68 struct bt_ctf_trace *trace = NULL;
69
70 trace = g_new0(struct bt_ctf_trace, 1);
71 if (!trace) {
72 goto error;
73 }
74
75 bt_ctf_trace_set_byte_order(trace, BT_CTF_BYTE_ORDER_NATIVE);
76 bt_ctf_ref_init(&trace->ref_count);
77 trace->environment = g_ptr_array_new_with_free_func(
78 (GDestroyNotify)environment_variable_destroy);
79 trace->clocks = g_ptr_array_new_with_free_func(
80 (GDestroyNotify)bt_ctf_clock_put);
81 trace->streams = g_ptr_array_new_with_free_func(
82 (GDestroyNotify)bt_ctf_stream_put);
83 trace->stream_classes = g_ptr_array_new_with_free_func(
84 (GDestroyNotify)bt_ctf_stream_class_put);
85 if (!trace->environment || !trace->clocks ||
86 !trace->stream_classes || !trace->streams) {
87 goto error_destroy;
88 }
89
90 /* Generate a trace UUID */
91 uuid_generate(trace->uuid);
92 if (init_trace_packet_header(trace)) {
93 goto error_destroy;
94 }
95
96 return trace;
97
98error_destroy:
99 bt_ctf_trace_destroy(&trace->ref_count);
100 trace = NULL;
101error:
102 return trace;
103}
104
105void bt_ctf_trace_destroy(struct bt_ctf_ref *ref)
106{
107 struct bt_ctf_trace *trace;
108
109 if (!ref) {
110 return;
111 }
112
113 trace = container_of(ref, struct bt_ctf_trace, ref_count);
114 if (trace->environment) {
115 g_ptr_array_free(trace->environment, TRUE);
116 }
117
118 if (trace->clocks) {
119 g_ptr_array_free(trace->clocks, TRUE);
120 }
121
122 if (trace->streams) {
123 g_ptr_array_free(trace->streams, TRUE);
124 }
125
126 if (trace->stream_classes) {
127 g_ptr_array_free(trace->stream_classes, TRUE);
128 }
129
d246b111 130 bt_ctf_field_type_put(trace->packet_header_type);
bc37ae52
JG
131 g_free(trace);
132}
133
134struct bt_ctf_stream *bt_ctf_trace_create_stream(struct bt_ctf_trace *trace,
135 struct bt_ctf_stream_class *stream_class)
136{
137 int ret;
138 int stream_class_found = 0;
139 size_t i;
140 struct bt_ctf_stream *stream = NULL;
141
142 if (!trace || !stream_class) {
143 goto error;
144 }
145
d246b111 146 stream = bt_ctf_stream_create(stream_class, trace);
bc37ae52
JG
147 if (!stream) {
148 goto error;
149 }
150
151 for (i = 0; i < trace->stream_classes->len; i++) {
152 if (trace->stream_classes->pdata[i] == stream_class) {
153 stream_class_found = 1;
154 }
155 }
156
157 if (!stream_class_found) {
ef0c4a15
JG
158 ret = bt_ctf_trace_add_stream_class(trace, stream_class);
159 if (ret) {
160 goto error;
bc37ae52 161 }
bc37ae52
JG
162 }
163
164 bt_ctf_stream_get(stream);
165 g_ptr_array_add(trace->streams, stream);
c35a1669 166
bc37ae52 167 return stream;
bc37ae52
JG
168error:
169 bt_ctf_stream_put(stream);
170 return NULL;
171}
172
173int bt_ctf_trace_add_environment_field(struct bt_ctf_trace *trace,
174 const char *name,
175 const char *value)
176{
177 struct environment_variable *var = NULL;
178 char *escaped_value = NULL;
179 int ret = 0;
180
654c1444 181 if (!trace || !name || !value || bt_ctf_validate_identifier(name)) {
bc37ae52
JG
182 ret = -1;
183 goto error;
184 }
185
186 if (strchr(name, ' ')) {
187 ret = -1;
188 goto error;
189 }
190
191 var = g_new0(struct environment_variable, 1);
192 if (!var) {
193 ret = -1;
194 goto error;
195 }
196
3487c9f3 197 var->type = BT_ENVIRONMENT_FIELD_TYPE_STRING;
bc37ae52
JG
198 escaped_value = g_strescape(value, NULL);
199 if (!escaped_value) {
200 ret = -1;
201 goto error;
202 }
203
204 var->name = g_string_new(name);
3487c9f3 205 var->value.string = g_string_new(escaped_value);
bc37ae52 206 g_free(escaped_value);
3487c9f3 207 if (!var->name || !var->value.string) {
bc37ae52
JG
208 ret = -1;
209 goto error;
210 }
211
212 g_ptr_array_add(trace->environment, var);
213 return ret;
214
215error:
216 if (var && var->name) {
217 g_string_free(var->name, TRUE);
218 }
219
3487c9f3
JG
220 if (var && var->value.string) {
221 g_string_free(var->value.string, TRUE);
222 }
223
224 g_free(var);
225 return ret;
226}
227
228int bt_ctf_trace_add_environment_field_integer(struct bt_ctf_trace *trace,
229 const char *name,
e6fa2160 230 int64_t value)
3487c9f3
JG
231{
232 struct environment_variable *var = NULL;
233 int ret = 0;
234
235 if (!trace || !name) {
236 ret = -1;
237 goto error;
238 }
239
240 var = g_new0(struct environment_variable, 1);
241 if (!var) {
242 ret = -1;
243 goto error;
244 }
245
246 var->type = BT_ENVIRONMENT_FIELD_TYPE_INTEGER;
247 var->name = g_string_new(name);
248 var->value.integer = value;
249 if (!var->name) {
250 ret = -1;
251 goto error;
252 }
253
254 g_ptr_array_add(trace->environment, var);
255 return ret;
256
257error:
258 if (var && var->name) {
259 g_string_free(var->name, TRUE);
bc37ae52
JG
260 }
261
262 g_free(var);
263 return ret;
264}
265
e6fa2160
JG
266int bt_ctf_trace_get_environment_field_count(struct bt_ctf_trace *trace)
267{
268 int ret = 0;
269
270 if (!trace) {
271 ret = -1;
272 goto end;
273 }
274
275 ret = trace->environment->len;
276end:
277 return ret;
278}
279
280enum bt_environment_field_type
281bt_ctf_trace_get_environment_field_type(struct bt_ctf_trace *trace, int index)
282{
283 struct environment_variable *var;
284 enum bt_environment_field_type type = BT_ENVIRONMENT_FIELD_TYPE_UNKNOWN;
285
286 if (!trace || index < 0 || index >= trace->environment->len) {
287 goto end;
288 }
289
290 var = g_ptr_array_index(trace->environment, index);
291 type = var->type;
292end:
293 return type;
294}
295
296const char *
297bt_ctf_trace_get_environment_field_name(struct bt_ctf_trace *trace,
298 int index)
299{
300 struct environment_variable *var;
301 const char *ret = NULL;
302
303 if (!trace || index < 0 || index >= trace->environment->len) {
304 goto end;
305 }
306
307 var = g_ptr_array_index(trace->environment, index);
308 ret = var->name->str;
309end:
310 return ret;
311}
312
313const char *
314bt_ctf_trace_get_environment_field_value_string(struct bt_ctf_trace *trace,
315 int index)
316{
317 struct environment_variable *var;
318 const char *ret = NULL;
319
320 if (!trace || index < 0 || index >= trace->environment->len) {
321 goto end;
322 }
323
324 var = g_ptr_array_index(trace->environment, index);
325 if (var->type != BT_ENVIRONMENT_FIELD_TYPE_STRING) {
326 goto end;
327 }
328 ret = var->value.string->str;
329end:
330 return ret;
331}
332
333int
334bt_ctf_trace_get_environment_field_value_integer(struct bt_ctf_trace *trace,
335 int index, int64_t *value)
336{
337 struct environment_variable *var;
338 int ret = 0;
339
340 if (!trace || !value || index < 0 || index >= trace->environment->len) {
341 ret = -1;
342 goto end;
343 }
344
345 var = g_ptr_array_index(trace->environment, index);
346 if (var->type != BT_ENVIRONMENT_FIELD_TYPE_INTEGER) {
347 ret = -1;
348 goto end;
349 }
350 *value = var->value.integer;
351end:
352 return ret;
353}
354
bc37ae52
JG
355int bt_ctf_trace_add_clock(struct bt_ctf_trace *trace,
356 struct bt_ctf_clock *clock)
357{
358 int ret = 0;
359 struct search_query query = { .value = clock, .found = 0 };
360
361 if (!trace || !clock) {
362 ret = -1;
363 goto end;
364 }
365
366 /* Check for duplicate clocks */
367 g_ptr_array_foreach(trace->clocks, value_exists, &query);
368 if (query.found) {
369 ret = -1;
370 goto end;
371 }
372
373 bt_ctf_clock_get(clock);
374 g_ptr_array_add(trace->clocks, clock);
375end:
376 return ret;
377}
378
884cd6c3
JG
379int bt_ctf_trace_get_clock_count(struct bt_ctf_trace *trace)
380{
381 int ret = -1;
382
383 if (!trace) {
384 goto end;
385 }
386
387 ret = trace->clocks->len;
388end:
389 return ret;
390}
391
392struct bt_ctf_clock *bt_ctf_trace_get_clock(struct bt_ctf_trace *trace,
393 int index)
394{
395 struct bt_ctf_clock *clock = NULL;
396
397 if (!trace || index < 0 || index >= trace->clocks->len) {
398 goto end;
399 }
400
401 clock = g_ptr_array_index(trace->clocks, index);
402 bt_ctf_clock_get(clock);
403end:
404 return clock;
405}
406
ef0c4a15
JG
407int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace,
408 struct bt_ctf_stream_class *stream_class)
409{
410 int ret, i;
411 int64_t stream_id;
412
413 if (!trace || !stream_class) {
414 ret = -1;
415 goto end;
416 }
417
418 for (i = 0; i < trace->stream_classes->len; i++) {
419 if (trace->stream_classes->pdata[i] == stream_class) {
420 ret = -1;
421 goto end;
422 }
423 }
424
425 stream_id = bt_ctf_stream_class_get_id(stream_class);
426 if (stream_id < 0) {
427 stream_id = trace->next_stream_id++;
428
429 /* Try to assign a new stream id */
430 for (i = 0; i < trace->stream_classes->len; i++) {
431 if (stream_id == bt_ctf_stream_class_get_id(
432 trace->stream_classes->pdata[i])) {
433 /* Duplicate stream id found */
434 ret = -1;
435 goto end;
436 }
437 }
438
439 if (_bt_ctf_stream_class_set_id(stream_class,
de866173 440 stream_id)) {
ef0c4a15
JG
441 /* TODO Should retry with a different stream id */
442 ret = -1;
443 goto end;
444 }
445 }
446
447 bt_ctf_stream_class_get(stream_class);
448 g_ptr_array_add(trace->stream_classes, stream_class);
449
450 /*
451 * Freeze the trace and its packet header.
452 *
453 * All field type byte orders set as "native" byte ordering can now be
454 * safely set to trace's own endianness, including the stream class'.
455 */
456 bt_ctf_field_type_set_native_byte_order(trace->packet_header_type,
457 trace->byte_order);
458 ret = bt_ctf_stream_class_set_byte_order(stream_class,
459 trace->byte_order == LITTLE_ENDIAN ?
460 BT_CTF_BYTE_ORDER_LITTLE_ENDIAN : BT_CTF_BYTE_ORDER_BIG_ENDIAN);
461 if (ret) {
462 goto end;
463 }
464 bt_ctf_stream_class_freeze(stream_class);
465 trace->frozen = 1;
466
467end:
468 return ret;
469}
470
471int bt_ctf_trace_get_stream_class_count(struct bt_ctf_trace *trace)
472{
473 int ret;
474
475 if (!trace) {
476 ret = -1;
477 goto end;
478 }
479
480 ret = trace->stream_classes->len;
481end:
482 return ret;
483}
484
485struct bt_ctf_stream_class *bt_ctf_trace_get_stream_class(
486 struct bt_ctf_trace *trace, int index)
487{
488 struct bt_ctf_stream_class *stream_class = NULL;
489
490 if (!trace || index < 0 || index >= trace->stream_classes->len) {
491 goto end;
492 }
493
494 stream_class = g_ptr_array_index(trace->stream_classes, index);
495 bt_ctf_stream_class_get(stream_class);
496end:
497 return stream_class;
498}
499
7e4347a3
PP
500struct bt_ctf_clock *bt_ctf_trace_get_clock_by_name(
501 struct bt_ctf_trace *trace, const char *name)
502{
503 size_t i;
504 struct bt_ctf_clock *clock = NULL;
505
506 if (!trace || !name) {
507 goto end;
508 }
509
510 for (i = 0; i < trace->clocks->len; ++i) {
511 struct bt_ctf_clock *cur_clk =
512 g_ptr_array_index(trace->clocks, i);
513 const char *cur_clk_name = bt_ctf_clock_get_name(cur_clk);
514
515 if (!cur_clk_name) {
516 goto end;
517 }
518
519 if (!strcmp(cur_clk_name, name)) {
520 clock = cur_clk;
521 bt_ctf_clock_get(clock);
522 goto end;
523 }
524 }
525
526end:
527 return clock;
528}
529
bc37ae52
JG
530BT_HIDDEN
531const char *get_byte_order_string(int byte_order)
532{
533 const char *string;
534
535 switch (byte_order) {
536 case LITTLE_ENDIAN:
537 string = "le";
538 break;
539 case BIG_ENDIAN:
540 string = "be";
541 break;
542 default:
543 string = "unknown";
544 break;
545 }
546
547 return string;
548}
549
550static
551int append_trace_metadata(struct bt_ctf_trace *trace,
552 struct metadata_context *context)
553{
554 unsigned char *uuid = trace->uuid;
555 int ret;
556
557 g_string_append(context->string, "trace {\n");
558
559 g_string_append(context->string, "\tmajor = 1;\n");
560 g_string_append(context->string, "\tminor = 8;\n");
561
562 g_string_append_printf(context->string,
563 "\tuuid = \"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\";\n",
564 uuid[0], uuid[1], uuid[2], uuid[3],
565 uuid[4], uuid[5], uuid[6], uuid[7],
566 uuid[8], uuid[9], uuid[10], uuid[11],
567 uuid[12], uuid[13], uuid[14], uuid[15]);
568 g_string_append_printf(context->string, "\tbyte_order = %s;\n",
569 get_byte_order_string(trace->byte_order));
570
571 g_string_append(context->string, "\tpacket.header := ");
572 context->current_indentation_level++;
573 g_string_assign(context->field_name, "");
d246b111 574 ret = bt_ctf_field_type_serialize(trace->packet_header_type,
bc37ae52
JG
575 context);
576 if (ret) {
577 goto end;
578 }
579 context->current_indentation_level--;
580
581 g_string_append(context->string, ";\n};\n\n");
582end:
583 return ret;
584}
585
586static
587void append_env_field_metadata(struct environment_variable *var,
588 struct metadata_context *context)
589{
3487c9f3
JG
590 switch (var->type) {
591 case BT_ENVIRONMENT_FIELD_TYPE_STRING:
592 g_string_append_printf(context->string, "\t%s = \"%s\";\n",
593 var->name->str, var->value.string->str);
594 break;
595 case BT_ENVIRONMENT_FIELD_TYPE_INTEGER:
596 g_string_append_printf(context->string, "\t%s = %" PRId64 ";\n",
597 var->name->str, var->value.integer);
598 break;
599 default:
600 assert(0);
601 }
bc37ae52
JG
602}
603
604static
605void append_env_metadata(struct bt_ctf_trace *trace,
606 struct metadata_context *context)
607{
608 if (trace->environment->len == 0) {
609 return;
610 }
611
612 g_string_append(context->string, "env {\n");
613 g_ptr_array_foreach(trace->environment,
614 (GFunc)append_env_field_metadata, context);
615 g_string_append(context->string, "};\n\n");
616}
617
618char *bt_ctf_trace_get_metadata_string(struct bt_ctf_trace *trace)
619{
620 char *metadata = NULL;
621 struct metadata_context *context = NULL;
622 int err = 0;
623 size_t i;
624
625 if (!trace) {
626 goto end;
627 }
628
629 context = g_new0(struct metadata_context, 1);
630 if (!context) {
631 goto end;
632 }
633
634 context->field_name = g_string_sized_new(DEFAULT_IDENTIFIER_SIZE);
635 context->string = g_string_sized_new(DEFAULT_METADATA_STRING_SIZE);
636 g_string_append(context->string, "/* CTF 1.8 */\n\n");
637 if (append_trace_metadata(trace, context)) {
638 goto error;
639 }
640 append_env_metadata(trace, context);
641 g_ptr_array_foreach(trace->clocks,
642 (GFunc)bt_ctf_clock_serialize, context);
643
644 for (i = 0; i < trace->stream_classes->len; i++) {
645 err = bt_ctf_stream_class_serialize(
646 trace->stream_classes->pdata[i], context);
647 if (err) {
648 goto error;
649 }
650 }
651
652 metadata = context->string->str;
653error:
654 g_string_free(context->string, err ? TRUE : FALSE);
655 g_string_free(context->field_name, TRUE);
656 g_free(context);
657end:
658 return metadata;
659}
660
4ed90fb3
JG
661enum bt_ctf_byte_order bt_ctf_trace_get_byte_order(struct bt_ctf_trace *trace)
662{
663 enum bt_ctf_byte_order ret = BT_CTF_BYTE_ORDER_UNKNOWN;
664
665 if (!trace) {
666 goto end;
667 }
668
669 switch (trace->byte_order) {
670 case BIG_ENDIAN:
671 ret = BT_CTF_BYTE_ORDER_BIG_ENDIAN;
672 break;
673 case LITTLE_ENDIAN:
674 ret = BT_CTF_BYTE_ORDER_LITTLE_ENDIAN;
675 break;
676 default:
677 break;
678 }
679end:
680 return ret;
681}
682
bc37ae52
JG
683int bt_ctf_trace_set_byte_order(struct bt_ctf_trace *trace,
684 enum bt_ctf_byte_order byte_order)
685{
686 int ret = 0;
687 int internal_byte_order;
688
689 if (!trace || trace->frozen) {
690 ret = -1;
691 goto end;
692 }
693
694 switch (byte_order) {
695 case BT_CTF_BYTE_ORDER_NATIVE:
c35a1669
JG
696 /*
697 * This doesn't make sense since the CTF specification defines
698 * the "native" byte order as "the byte order described in the
699 * trace description". However, this behavior had been
700 * implemented as part of v1.2 and is kept to maintain
701 * compatibility.
702 *
703 * This may be changed on a major version bump only.
704 */
705 internal_byte_order = (G_BYTE_ORDER == G_LITTLE_ENDIAN) ?
bc37ae52
JG
706 LITTLE_ENDIAN : BIG_ENDIAN;
707 break;
708 case BT_CTF_BYTE_ORDER_LITTLE_ENDIAN:
709 internal_byte_order = LITTLE_ENDIAN;
710 break;
711 case BT_CTF_BYTE_ORDER_BIG_ENDIAN:
712 case BT_CTF_BYTE_ORDER_NETWORK:
713 internal_byte_order = BIG_ENDIAN;
714 break;
715 default:
716 ret = -1;
717 goto end;
718 }
719
720 trace->byte_order = internal_byte_order;
bc37ae52
JG
721end:
722 return ret;
723}
724
d246b111
JG
725struct bt_ctf_field_type *bt_ctf_trace_get_packet_header_type(
726 struct bt_ctf_trace *trace)
727{
728 struct bt_ctf_field_type *field_type = NULL;
729
730 if (!trace) {
731 goto end;
732 }
733
734 bt_ctf_field_type_get(trace->packet_header_type);
735 field_type = trace->packet_header_type;
736end:
737 return field_type;
738}
739
740int bt_ctf_trace_set_packet_header_type(struct bt_ctf_trace *trace,
741 struct bt_ctf_field_type *packet_header_type)
742{
743 int ret = 0;
744
745 if (!trace || !packet_header_type || trace->frozen) {
746 ret = -1;
747 goto end;
748 }
749
750 /* packet_header_type must be a structure */
751 if (bt_ctf_field_type_get_type_id(packet_header_type) !=
752 CTF_TYPE_STRUCT) {
753 ret = -1;
754 goto end;
755 }
756
757 bt_ctf_field_type_get(packet_header_type);
758 bt_ctf_field_type_put(trace->packet_header_type);
759 trace->packet_header_type = packet_header_type;
760end:
761 return ret;
762}
763
bc37ae52
JG
764void bt_ctf_trace_get(struct bt_ctf_trace *trace)
765{
766 if (!trace) {
767 return;
768 }
769
770 bt_ctf_ref_get(&trace->ref_count);
771}
772
773void bt_ctf_trace_put(struct bt_ctf_trace *trace)
774{
775 if (!trace) {
776 return;
777 }
778
779 bt_ctf_ref_put(&trace->ref_count, bt_ctf_trace_destroy);
780}
781
bc37ae52
JG
782BT_HIDDEN
783struct bt_ctf_field_type *get_field_type(enum field_type_alias alias)
784{
785 unsigned int alignment, size;
786 struct bt_ctf_field_type *field_type;
787
788 if (alias >= NR_FIELD_TYPE_ALIAS) {
789 return NULL;
790 }
791
792 alignment = field_type_aliases_alignments[alias];
793 size = field_type_aliases_sizes[alias];
794 field_type = bt_ctf_field_type_integer_create(size);
795 bt_ctf_field_type_set_alignment(field_type, alignment);
796 return field_type;
797}
798
799static
800int init_trace_packet_header(struct bt_ctf_trace *trace)
801{
bc37ae52 802 int ret = 0;
d246b111 803 struct bt_ctf_field *magic = NULL, *uuid_array = NULL;
bc37ae52
JG
804 struct bt_ctf_field_type *_uint32_t =
805 get_field_type(FIELD_TYPE_ALIAS_UINT32_T);
806 struct bt_ctf_field_type *_uint8_t =
807 get_field_type(FIELD_TYPE_ALIAS_UINT8_T);
808 struct bt_ctf_field_type *trace_packet_header_type =
809 bt_ctf_field_type_structure_create();
810 struct bt_ctf_field_type *uuid_array_type =
811 bt_ctf_field_type_array_create(_uint8_t, 16);
812
813 if (!trace_packet_header_type || !uuid_array_type) {
814 ret = -1;
815 goto end;
816 }
817
bc37ae52
JG
818 ret = bt_ctf_field_type_structure_add_field(trace_packet_header_type,
819 _uint32_t, "magic");
820 if (ret) {
821 goto end;
822 }
823
824 ret = bt_ctf_field_type_structure_add_field(trace_packet_header_type,
825 uuid_array_type, "uuid");
826 if (ret) {
827 goto end;
828 }
829
830 ret = bt_ctf_field_type_structure_add_field(trace_packet_header_type,
831 _uint32_t, "stream_id");
832 if (ret) {
833 goto end;
834 }
835
662e778c
JG
836 ret = bt_ctf_trace_set_packet_header_type(trace,
837 trace_packet_header_type);
838 if (ret) {
839 goto end;
840 }
bc37ae52
JG
841end:
842 bt_ctf_field_type_put(uuid_array_type);
843 bt_ctf_field_type_put(_uint32_t);
844 bt_ctf_field_type_put(_uint8_t);
845 bt_ctf_field_put(magic);
846 bt_ctf_field_put(uuid_array);
662e778c 847 bt_ctf_field_type_put(trace_packet_header_type);
bc37ae52
JG
848
849 return ret;
850}
851
852static
853void environment_variable_destroy(struct environment_variable *var)
854{
855 g_string_free(var->name, TRUE);
3487c9f3
JG
856 if (var->type == BT_ENVIRONMENT_FIELD_TYPE_STRING) {
857 g_string_free(var->value.string, TRUE);
858 }
bc37ae52
JG
859 g_free(var);
860}
This page took 0.058119 seconds and 4 git commands to generate.