4 * Babeltrace CTF Writer Output Plugin Event Handling
6 * Copyright 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com>
8 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
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:
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
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
29 #include <babeltrace/ctf-ir/event.h>
30 #include <babeltrace/ctf-ir/packet.h>
31 #include <babeltrace/ctf-ir/event-class.h>
32 #include <babeltrace/ctf-ir/stream.h>
33 #include <babeltrace/ctf-ir/stream-class.h>
34 #include <babeltrace/ctf-ir/clock-class.h>
35 #include <babeltrace/ctf-ir/fields.h>
36 #include <babeltrace/ctf-writer/stream-class.h>
37 #include <babeltrace/ctf-writer/stream.h>
40 #include <ctfcopytrace.h>
45 void unref_stream_class(struct bt_ctf_stream_class
*writer_stream_class
)
47 bt_put(writer_stream_class
);
51 void unref_stream(struct bt_ctf_stream_class
*writer_stream
)
53 bt_put(writer_stream
);
56 gboolean
empty_ht(gpointer key
, gpointer value
, gpointer user_data
)
61 gboolean
empty_streams_ht(gpointer key
, gpointer value
, gpointer user_data
)
63 struct bt_ctf_stream
*writer_stream
= value
;
65 bt_ctf_stream_flush(writer_stream
);
70 void destroy_stream_state_key(gpointer key
)
72 g_free((enum fs_writer_stream_state
*) key
);
75 void check_completed_trace(gpointer key
, gpointer value
, gpointer user_data
)
77 enum fs_writer_stream_state
*state
= value
;
78 int *trace_completed
= user_data
;
80 if (*state
!= FS_WRITER_COMPLETED_STREAM
) {
86 void trace_is_static_listener(struct bt_ctf_trace
*trace
, void *data
)
88 struct fs_writer
*fs_writer
= data
;
89 int trace_completed
= 1;
91 fs_writer
->trace_static
= 1;
93 g_hash_table_foreach(fs_writer
->stream_states
,
94 check_completed_trace
, &trace_completed
);
95 if (trace_completed
) {
96 writer_close(fs_writer
->writer_component
, fs_writer
);
97 g_hash_table_remove(fs_writer
->writer_component
->trace_map
,
103 struct bt_ctf_stream_class
*insert_new_stream_class(
104 struct writer_component
*writer_component
,
105 struct fs_writer
*fs_writer
,
106 struct bt_ctf_stream_class
*stream_class
)
108 struct bt_ctf_stream_class
*writer_stream_class
= NULL
;
109 struct bt_ctf_trace
*trace
= NULL
, *writer_trace
= NULL
;
110 struct bt_ctf_writer
*ctf_writer
= fs_writer
->writer
;
111 enum bt_component_status ret
;
113 trace
= bt_ctf_stream_class_get_trace(stream_class
);
115 fprintf(writer_component
->err
,
116 "[error] %s in %s:%d\n", __func__
, __FILE__
,
121 writer_trace
= bt_ctf_writer_get_trace(ctf_writer
);
123 fprintf(writer_component
->err
,
124 "[error] %s in %s:%d\n", __func__
, __FILE__
,
129 ret
= ctf_copy_clock_classes(writer_component
->err
, writer_trace
,
130 writer_stream_class
, trace
);
131 if (ret
!= BT_COMPONENT_STATUS_OK
) {
132 fprintf(writer_component
->err
,
133 "[error] %s in %s:%d\n", __func__
, __FILE__
,
138 writer_stream_class
= ctf_copy_stream_class(writer_component
->err
,
139 stream_class
, writer_trace
, true);
140 if (!writer_stream_class
) {
141 fprintf(writer_component
->err
, "[error] Failed to copy stream class\n");
142 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
143 __func__
, __FILE__
, __LINE__
);
147 g_hash_table_insert(fs_writer
->stream_class_map
,
148 (gpointer
) stream_class
, writer_stream_class
);
153 BT_PUT(writer_stream_class
);
155 bt_put(writer_trace
);
157 return writer_stream_class
;
161 enum fs_writer_stream_state
*insert_new_stream_state(
162 struct writer_component
*writer_component
,
163 struct fs_writer
*fs_writer
, struct bt_ctf_stream
*stream
)
165 enum fs_writer_stream_state
*v
= NULL
;
167 v
= g_new0(enum fs_writer_stream_state
, 1);
169 fprintf(writer_component
->err
,
170 "[error] %s in %s:%d\n", __func__
,
173 *v
= FS_WRITER_UNKNOWN_STREAM
;
175 g_hash_table_insert(fs_writer
->stream_states
, stream
, v
);
181 int make_trace_path(struct writer_component
*writer_component
,
182 struct bt_ctf_trace
*trace
, char *trace_path
)
185 const char *trace_name
;
187 trace_name
= bt_ctf_trace_get_name(trace
);
189 trace_name
= writer_component
->trace_name_base
->str
;
191 /* XXX: we might have to skip the first level, TBD. */
193 /* Sanitize the trace name. */
194 if (strlen(trace_name
) == 2 && !strcmp(trace_name
, "..")) {
195 fprintf(writer_component
->err
, "[error] Trace name cannot "
200 if (strstr(trace_name
, "../")) {
201 fprintf(writer_component
->err
, "[error] Trace name cannot "
202 "contain \"../\", received \"%s\"\n",
208 snprintf(trace_path
, PATH_MAX
, "%s/%s",
209 writer_component
->base_path
->str
,
211 if (g_file_test(trace_path
, G_FILE_TEST_EXISTS
)) {
214 snprintf(trace_path
, PATH_MAX
, "%s/%s-%d",
215 writer_component
->base_path
->str
,
217 } while (g_file_test(trace_path
, G_FILE_TEST_EXISTS
) && i
< INT_MAX
);
219 fprintf(writer_component
->err
, "[error] Unable to find "
220 "a unique trace path\n");
236 struct fs_writer
*insert_new_writer(
237 struct writer_component
*writer_component
,
238 struct bt_ctf_trace
*trace
)
240 struct bt_ctf_writer
*ctf_writer
= NULL
;
241 struct bt_ctf_trace
*writer_trace
= NULL
;
242 char trace_path
[PATH_MAX
];
243 enum bt_component_status ret
;
244 struct bt_ctf_stream
*stream
= NULL
;
245 struct fs_writer
*fs_writer
= NULL
;
248 ret
= make_trace_path(writer_component
, trace
, trace_path
);
250 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
251 __func__
, __FILE__
, __LINE__
);
255 printf("ctf.fs sink creating trace in %s\n", trace_path
);
257 ctf_writer
= bt_ctf_writer_create(trace_path
);
259 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
260 __func__
, __FILE__
, __LINE__
);
264 writer_trace
= bt_ctf_writer_get_trace(ctf_writer
);
266 fprintf(writer_component
->err
,
267 "[error] %s in %s:%d\n", __func__
, __FILE__
,
272 ret
= ctf_copy_trace(writer_component
->err
, trace
, writer_trace
);
273 if (ret
!= BT_COMPONENT_STATUS_OK
) {
274 fprintf(writer_component
->err
, "[error] Failed to copy trace\n");
275 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
276 __func__
, __FILE__
, __LINE__
);
281 fs_writer
= g_new0(struct fs_writer
, 1);
283 fprintf(writer_component
->err
,
284 "[error] %s in %s:%d\n", __func__
, __FILE__
,
288 fs_writer
->writer
= ctf_writer
;
289 fs_writer
->trace
= trace
;
290 fs_writer
->writer_trace
= writer_trace
;
291 fs_writer
->writer_component
= writer_component
;
292 BT_PUT(writer_trace
);
293 fs_writer
->stream_class_map
= g_hash_table_new_full(g_direct_hash
,
294 g_direct_equal
, NULL
, (GDestroyNotify
) unref_stream_class
);
295 fs_writer
->stream_map
= g_hash_table_new_full(g_direct_hash
,
296 g_direct_equal
, NULL
, (GDestroyNotify
) unref_stream
);
297 fs_writer
->stream_states
= g_hash_table_new_full(g_direct_hash
,
298 g_direct_equal
, NULL
, destroy_stream_state_key
);
300 /* Set all the existing streams in the unknown state. */
301 nr_stream
= bt_ctf_trace_get_stream_count(trace
);
302 for (i
= 0; i
< nr_stream
; i
++) {
303 stream
= bt_ctf_trace_get_stream_by_index(trace
, i
);
305 fprintf(writer_component
->err
,
306 "[error] %s in %s:%d\n", __func__
,
310 insert_new_stream_state(writer_component
, fs_writer
, stream
);
314 /* Check if the trace is already static or register a listener. */
315 if (bt_ctf_trace_is_static(trace
)) {
316 fs_writer
->trace_static
= 1;
317 fs_writer
->static_listener_id
= -1;
319 ret
= bt_ctf_trace_add_is_static_listener(trace
,
320 trace_is_static_listener
, fs_writer
);
322 fprintf(writer_component
->err
,
323 "[error] %s in %s:%d\n", __func__
, __FILE__
,
327 fs_writer
->static_listener_id
= ret
;
330 g_hash_table_insert(writer_component
->trace_map
, (gpointer
) trace
,
338 bt_put(writer_trace
);
346 struct fs_writer
*get_fs_writer(struct writer_component
*writer_component
,
347 struct bt_ctf_stream_class
*stream_class
)
349 struct bt_ctf_trace
*trace
= NULL
;
350 struct fs_writer
*fs_writer
;
352 trace
= bt_ctf_stream_class_get_trace(stream_class
);
354 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
355 __func__
, __FILE__
, __LINE__
);
359 fs_writer
= g_hash_table_lookup(writer_component
->trace_map
,
362 fs_writer
= insert_new_writer(writer_component
, trace
);
374 struct fs_writer
*get_fs_writer_from_stream(
375 struct writer_component
*writer_component
,
376 struct bt_ctf_stream
*stream
)
378 struct bt_ctf_stream_class
*stream_class
= NULL
;
379 struct fs_writer
*fs_writer
;
381 stream_class
= bt_ctf_stream_get_class(stream
);
383 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
384 __func__
, __FILE__
, __LINE__
);
388 fs_writer
= get_fs_writer(writer_component
, stream_class
);
395 bt_put(stream_class
);
400 struct bt_ctf_stream_class
*lookup_stream_class(
401 struct writer_component
*writer_component
,
402 struct bt_ctf_stream_class
*stream_class
)
404 struct fs_writer
*fs_writer
= get_fs_writer(
405 writer_component
, stream_class
);
407 return (struct bt_ctf_stream_class
*) g_hash_table_lookup(
408 fs_writer
->stream_class_map
, (gpointer
) stream_class
);
412 struct bt_ctf_stream
*lookup_stream(struct writer_component
*writer_component
,
413 struct bt_ctf_stream
*stream
)
415 struct fs_writer
*fs_writer
= get_fs_writer_from_stream(
416 writer_component
, stream
);
418 return (struct bt_ctf_stream
*) g_hash_table_lookup(
419 fs_writer
->stream_map
, (gpointer
) stream
);
423 struct bt_ctf_stream
*insert_new_stream(
424 struct writer_component
*writer_component
,
425 struct fs_writer
*fs_writer
,
426 struct bt_ctf_stream_class
*stream_class
,
427 struct bt_ctf_stream
*stream
)
429 struct bt_ctf_stream
*writer_stream
= NULL
;
430 struct bt_ctf_stream_class
*writer_stream_class
= NULL
;
431 struct bt_ctf_writer
*ctf_writer
= bt_get(fs_writer
->writer
);
433 writer_stream_class
= lookup_stream_class(writer_component
,
435 if (!writer_stream_class
) {
436 writer_stream_class
= insert_new_stream_class(
437 writer_component
, fs_writer
, stream_class
);
438 if (!writer_stream_class
) {
439 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
440 __func__
, __FILE__
, __LINE__
);
444 bt_get(writer_stream_class
);
446 writer_stream
= bt_ctf_writer_create_stream(ctf_writer
,
447 writer_stream_class
);
448 if (!writer_stream
) {
449 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
450 __func__
, __FILE__
, __LINE__
);
454 g_hash_table_insert(fs_writer
->stream_map
, (gpointer
) stream
,
460 BT_PUT(writer_stream
);
463 bt_put(writer_stream_class
);
464 return writer_stream
;
468 struct bt_ctf_event_class
*get_event_class(struct writer_component
*writer_component
,
469 struct bt_ctf_stream_class
*writer_stream_class
,
470 struct bt_ctf_event_class
*event_class
)
472 return bt_ctf_stream_class_get_event_class_by_id(writer_stream_class
,
473 bt_ctf_event_class_get_id(event_class
));
477 struct bt_ctf_stream
*get_writer_stream(
478 struct writer_component
*writer_component
,
479 struct bt_ctf_packet
*packet
, struct bt_ctf_stream
*stream
)
481 struct bt_ctf_stream
*writer_stream
= NULL
;
483 writer_stream
= lookup_stream(writer_component
, stream
);
484 if (!writer_stream
) {
485 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
486 __func__
, __FILE__
, __LINE__
);
489 bt_get(writer_stream
);
494 BT_PUT(writer_stream
);
496 return writer_stream
;
500 void writer_close(struct writer_component
*writer_component
,
501 struct fs_writer
*fs_writer
)
503 if (fs_writer
->static_listener_id
> 0) {
504 bt_ctf_trace_remove_is_static_listener(fs_writer
->trace
,
505 fs_writer
->static_listener_id
);
508 /* Empty the stream class HT. */
509 g_hash_table_foreach_remove(fs_writer
->stream_class_map
,
511 g_hash_table_destroy(fs_writer
->stream_class_map
);
513 /* Empty the stream HT. */
514 g_hash_table_foreach_remove(fs_writer
->stream_map
,
515 empty_streams_ht
, NULL
);
516 g_hash_table_destroy(fs_writer
->stream_map
);
518 /* Empty the stream state HT. */
519 g_hash_table_foreach_remove(fs_writer
->stream_states
,
521 g_hash_table_destroy(fs_writer
->stream_states
);
525 enum bt_component_status
writer_stream_begin(
526 struct writer_component
*writer_component
,
527 struct bt_ctf_stream
*stream
)
529 struct bt_ctf_stream_class
*stream_class
= NULL
;
530 struct fs_writer
*fs_writer
;
531 struct bt_ctf_stream
*writer_stream
= NULL
;
532 enum bt_component_status ret
= BT_COMPONENT_STATUS_OK
;
533 enum fs_writer_stream_state
*state
;
535 stream_class
= bt_ctf_stream_get_class(stream
);
537 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
538 __func__
, __FILE__
, __LINE__
);
542 fs_writer
= get_fs_writer(writer_component
, stream_class
);
544 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
545 __func__
, __FILE__
, __LINE__
);
549 /* Set the stream as active */
550 state
= g_hash_table_lookup(fs_writer
->stream_states
, stream
);
552 if (fs_writer
->trace_static
) {
553 fprintf(writer_component
->err
, "[error] Adding a new "
554 "stream on a static trace\n");
557 state
= insert_new_stream_state(writer_component
, fs_writer
,
560 if (*state
!= FS_WRITER_UNKNOWN_STREAM
) {
561 fprintf(writer_component
->err
, "[error] Unexpected stream "
562 "state %d\n", *state
);
565 *state
= FS_WRITER_ACTIVE_STREAM
;
567 writer_stream
= insert_new_stream(writer_component
, fs_writer
,
568 stream_class
, stream
);
569 if (!writer_stream
) {
570 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
571 __func__
, __FILE__
, __LINE__
);
574 fs_writer
->active_streams
++;
579 ret
= BT_COMPONENT_STATUS_ERROR
;
581 bt_put(stream_class
);
586 enum bt_component_status
writer_stream_end(
587 struct writer_component
*writer_component
,
588 struct bt_ctf_stream
*stream
)
590 struct bt_ctf_stream_class
*stream_class
= NULL
;
591 struct fs_writer
*fs_writer
;
592 struct bt_ctf_trace
*trace
= NULL
;
593 enum bt_component_status ret
= BT_COMPONENT_STATUS_OK
;
594 enum fs_writer_stream_state
*state
;
596 stream_class
= bt_ctf_stream_get_class(stream
);
598 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
599 __func__
, __FILE__
, __LINE__
);
603 fs_writer
= get_fs_writer(writer_component
, stream_class
);
605 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
606 __func__
, __FILE__
, __LINE__
);
610 state
= g_hash_table_lookup(fs_writer
->stream_states
, stream
);
611 if (*state
!= FS_WRITER_ACTIVE_STREAM
) {
612 fprintf(writer_component
->err
, "[error] Unexpected stream "
613 "state %d\n", *state
);
616 *state
= FS_WRITER_COMPLETED_STREAM
;
618 g_hash_table_remove(fs_writer
->stream_map
, stream
);
620 if (fs_writer
->trace_static
) {
621 int trace_completed
= 1;
623 g_hash_table_foreach(fs_writer
->stream_states
,
624 check_completed_trace
, &trace_completed
);
625 if (trace_completed
) {
626 writer_close(writer_component
, fs_writer
);
627 g_hash_table_remove(writer_component
->trace_map
,
635 ret
= BT_COMPONENT_STATUS_ERROR
;
638 BT_PUT(stream_class
);
643 enum bt_component_status
writer_new_packet(
644 struct writer_component
*writer_component
,
645 struct bt_ctf_packet
*packet
)
647 struct bt_ctf_stream
*stream
= NULL
, *writer_stream
= NULL
;
648 struct bt_ctf_field
*writer_packet_context
= NULL
;
649 enum bt_component_status ret
= BT_COMPONENT_STATUS_OK
;
652 stream
= bt_ctf_packet_get_stream(packet
);
654 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
655 __func__
, __FILE__
, __LINE__
);
659 writer_stream
= get_writer_stream(writer_component
, packet
, stream
);
660 if (!writer_stream
) {
661 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
662 __func__
, __FILE__
, __LINE__
);
667 writer_packet_context
= ctf_copy_packet_context(writer_component
->err
,
668 packet
, writer_stream
);
669 if (!writer_packet_context
) {
670 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
671 __func__
, __FILE__
, __LINE__
);
675 int_ret
= bt_ctf_stream_set_packet_context(writer_stream
,
676 writer_packet_context
);
678 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
682 BT_PUT(writer_stream
);
683 BT_PUT(writer_packet_context
);
688 ret
= BT_COMPONENT_STATUS_ERROR
;
690 bt_put(writer_stream
);
691 bt_put(writer_packet_context
);
697 enum bt_component_status
writer_close_packet(
698 struct writer_component
*writer_component
,
699 struct bt_ctf_packet
*packet
)
701 struct bt_ctf_stream
*stream
= NULL
, *writer_stream
= NULL
;
702 enum bt_component_status ret
;
704 stream
= bt_ctf_packet_get_stream(packet
);
706 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
707 __func__
, __FILE__
, __LINE__
);
711 writer_stream
= lookup_stream(writer_component
, stream
);
712 if (!writer_stream
) {
713 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
714 __func__
, __FILE__
, __LINE__
);
719 bt_get(writer_stream
);
721 ret
= bt_ctf_stream_flush(writer_stream
);
723 fprintf(writer_component
->err
,
724 "[error] Failed to flush packet\n");
727 BT_PUT(writer_stream
);
729 ret
= BT_COMPONENT_STATUS_OK
;
733 ret
= BT_COMPONENT_STATUS_ERROR
;
735 bt_put(writer_stream
);
741 enum bt_component_status
writer_output_event(
742 struct writer_component
*writer_component
,
743 struct bt_ctf_event
*event
)
745 enum bt_component_status ret
;
746 struct bt_ctf_event_class
*event_class
= NULL
, *writer_event_class
= NULL
;
747 struct bt_ctf_stream
*stream
= NULL
, *writer_stream
= NULL
;
748 struct bt_ctf_stream_class
*stream_class
= NULL
, *writer_stream_class
= NULL
;
749 struct bt_ctf_event
*writer_event
= NULL
;
750 const char *event_name
;
753 event_class
= bt_ctf_event_get_class(event
);
755 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
760 event_name
= bt_ctf_event_class_get_name(event_class
);
762 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
767 stream
= bt_ctf_event_get_stream(event
);
769 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
774 writer_stream
= lookup_stream(writer_component
, stream
);
775 if (!writer_stream
|| !bt_get(writer_stream
)) {
776 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
781 stream_class
= bt_ctf_event_class_get_stream_class(event_class
);
783 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
788 writer_stream_class
= lookup_stream_class(writer_component
, stream_class
);
789 if (!writer_stream_class
|| !bt_get(writer_stream_class
)) {
790 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
795 writer_event_class
= get_event_class(writer_component
,
796 writer_stream_class
, event_class
);
797 if (!writer_event_class
) {
798 writer_event_class
= ctf_copy_event_class(writer_component
->err
,
800 if (!writer_event_class
) {
801 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
802 __func__
, __FILE__
, __LINE__
);
805 int_ret
= bt_ctf_stream_class_add_event_class(
806 writer_stream_class
, writer_event_class
);
808 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
809 __func__
, __FILE__
, __LINE__
);
814 writer_event
= ctf_copy_event(writer_component
->err
, event
,
815 writer_event_class
, true);
817 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
819 fprintf(writer_component
->err
, "[error] Failed to copy event %s\n",
820 bt_ctf_event_class_get_name(writer_event_class
));
824 int_ret
= bt_ctf_stream_append_event(writer_stream
, writer_event
);
826 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
828 fprintf(writer_component
->err
, "[error] Failed to append event %s\n",
829 bt_ctf_event_class_get_name(writer_event_class
));
833 ret
= BT_COMPONENT_STATUS_OK
;
837 ret
= BT_COMPONENT_STATUS_ERROR
;
839 bt_put(writer_event
);
840 bt_put(writer_event_class
);
841 bt_put(writer_stream_class
);
842 bt_put(stream_class
);
843 bt_put(writer_stream
);