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
);
57 gboolean
empty_ht(gpointer key
, gpointer value
, gpointer user_data
)
63 gboolean
empty_streams_ht(gpointer key
, gpointer value
, gpointer user_data
)
65 struct bt_ctf_stream
*writer_stream
= value
;
67 bt_ctf_stream_flush(writer_stream
);
73 void destroy_stream_state_key(gpointer key
)
75 g_free((enum fs_writer_stream_state
*) key
);
79 void check_completed_trace(gpointer key
, gpointer value
, gpointer user_data
)
81 enum fs_writer_stream_state
*state
= value
;
82 int *trace_completed
= user_data
;
84 if (*state
!= FS_WRITER_COMPLETED_STREAM
) {
90 void trace_is_static_listener(struct bt_ctf_trace
*trace
, void *data
)
92 struct fs_writer
*fs_writer
= data
;
93 int trace_completed
= 1;
95 fs_writer
->trace_static
= 1;
97 g_hash_table_foreach(fs_writer
->stream_states
,
98 check_completed_trace
, &trace_completed
);
99 if (trace_completed
) {
100 writer_close(fs_writer
->writer_component
, fs_writer
);
101 g_hash_table_remove(fs_writer
->writer_component
->trace_map
,
107 struct bt_ctf_stream_class
*insert_new_stream_class(
108 struct writer_component
*writer_component
,
109 struct fs_writer
*fs_writer
,
110 struct bt_ctf_stream_class
*stream_class
)
112 struct bt_ctf_stream_class
*writer_stream_class
= NULL
;
113 struct bt_ctf_trace
*trace
= NULL
, *writer_trace
= NULL
;
114 struct bt_ctf_writer
*ctf_writer
= fs_writer
->writer
;
115 enum bt_component_status ret
;
117 trace
= bt_ctf_stream_class_get_trace(stream_class
);
119 fprintf(writer_component
->err
,
120 "[error] %s in %s:%d\n", __func__
, __FILE__
,
125 writer_trace
= bt_ctf_writer_get_trace(ctf_writer
);
127 fprintf(writer_component
->err
,
128 "[error] %s in %s:%d\n", __func__
, __FILE__
,
133 ret
= ctf_copy_clock_classes(writer_component
->err
, writer_trace
,
134 writer_stream_class
, trace
);
135 if (ret
!= BT_COMPONENT_STATUS_OK
) {
136 fprintf(writer_component
->err
,
137 "[error] %s in %s:%d\n", __func__
, __FILE__
,
142 writer_stream_class
= ctf_copy_stream_class(writer_component
->err
,
143 stream_class
, writer_trace
, true);
144 if (!writer_stream_class
) {
145 fprintf(writer_component
->err
, "[error] Failed to copy stream class\n");
146 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
147 __func__
, __FILE__
, __LINE__
);
151 ret
= bt_ctf_trace_add_stream_class(writer_trace
, writer_stream_class
);
153 fprintf(writer_component
->err
,
154 "[error] %s in %s:%d\n", __func__
, __FILE__
,
159 g_hash_table_insert(fs_writer
->stream_class_map
,
160 (gpointer
) stream_class
, writer_stream_class
);
165 BT_PUT(writer_stream_class
);
167 bt_put(writer_trace
);
169 return writer_stream_class
;
173 enum fs_writer_stream_state
*insert_new_stream_state(
174 struct writer_component
*writer_component
,
175 struct fs_writer
*fs_writer
, struct bt_ctf_stream
*stream
)
177 enum fs_writer_stream_state
*v
= NULL
;
179 v
= g_new0(enum fs_writer_stream_state
, 1);
181 fprintf(writer_component
->err
,
182 "[error] %s in %s:%d\n", __func__
,
185 *v
= FS_WRITER_UNKNOWN_STREAM
;
187 g_hash_table_insert(fs_writer
->stream_states
, stream
, v
);
193 * Make sure the output path is valid for a single trace: either it does
194 * not exists or it is empty.
196 * Return 0 if the path is valid, -1 otherwise.
199 bool valid_single_trace_path(const char *path
)
203 DIR *dir
= opendir(path
);
206 /* Non-existent directory. */
212 while ((d
= readdir(dir
)) != NULL
) {
213 /* Ignore "." and ".." directories. */
236 int make_trace_path(struct writer_component
*writer_component
,
237 struct bt_ctf_trace
*trace
, char *trace_path
)
240 const char *trace_name
;
242 if (writer_component
->single_trace
) {
245 trace_name
= bt_ctf_trace_get_name(trace
);
247 trace_name
= writer_component
->trace_name_base
->str
;
251 /* Sanitize the trace name. */
252 if (strlen(trace_name
) == 2 && !strcmp(trace_name
, "..")) {
253 fprintf(writer_component
->err
, "[error] Trace name cannot "
258 if (strstr(trace_name
, "../")) {
259 fprintf(writer_component
->err
, "[error] Trace name cannot "
260 "contain \"../\", received \"%s\"\n",
266 snprintf(trace_path
, PATH_MAX
, "%s/%s",
267 writer_component
->base_path
->str
,
270 * Append a suffix if the trace_path exists and we are not in
273 if (writer_component
->single_trace
) {
274 if (valid_single_trace_path(trace_path
) != 0) {
275 fprintf(writer_component
->err
,
276 "[error] Invalid output directory\n");
280 if (g_file_test(trace_path
, G_FILE_TEST_EXISTS
)) {
284 snprintf(trace_path
, PATH_MAX
, "%s/%s-%d",
285 writer_component
->base_path
->str
,
287 } while (g_file_test(trace_path
, G_FILE_TEST_EXISTS
) && i
< INT_MAX
);
289 fprintf(writer_component
->err
, "[error] Unable to find "
290 "a unique trace path\n");
306 struct fs_writer
*insert_new_writer(
307 struct writer_component
*writer_component
,
308 struct bt_ctf_trace
*trace
)
310 struct bt_ctf_writer
*ctf_writer
= NULL
;
311 struct bt_ctf_trace
*writer_trace
= NULL
;
312 char trace_path
[PATH_MAX
];
313 enum bt_component_status ret
;
314 struct bt_ctf_stream
*stream
= NULL
;
315 struct fs_writer
*fs_writer
= NULL
;
318 if (writer_component
->single_trace
&& writer_component
->nr_traces
> 0) {
319 fprintf(writer_component
->err
, "[error] Trying to process more "
320 "than one trace but --single-trace mode "
325 ret
= make_trace_path(writer_component
, trace
, trace_path
);
327 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
328 __func__
, __FILE__
, __LINE__
);
332 printf("ctf.fs sink creating trace in %s\n", trace_path
);
334 ctf_writer
= bt_ctf_writer_create(trace_path
);
336 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
337 __func__
, __FILE__
, __LINE__
);
341 writer_trace
= bt_ctf_writer_get_trace(ctf_writer
);
343 fprintf(writer_component
->err
,
344 "[error] %s in %s:%d\n", __func__
, __FILE__
,
349 ret
= ctf_copy_trace(writer_component
->err
, trace
, writer_trace
);
350 if (ret
!= BT_COMPONENT_STATUS_OK
) {
351 fprintf(writer_component
->err
, "[error] Failed to copy trace\n");
352 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
353 __func__
, __FILE__
, __LINE__
);
358 fs_writer
= g_new0(struct fs_writer
, 1);
360 fprintf(writer_component
->err
,
361 "[error] %s in %s:%d\n", __func__
, __FILE__
,
365 fs_writer
->writer
= ctf_writer
;
366 fs_writer
->trace
= trace
;
367 fs_writer
->writer_trace
= writer_trace
;
368 fs_writer
->writer_component
= writer_component
;
369 BT_PUT(writer_trace
);
370 fs_writer
->stream_class_map
= g_hash_table_new_full(g_direct_hash
,
371 g_direct_equal
, NULL
, (GDestroyNotify
) unref_stream_class
);
372 fs_writer
->stream_map
= g_hash_table_new_full(g_direct_hash
,
373 g_direct_equal
, NULL
, (GDestroyNotify
) unref_stream
);
374 fs_writer
->stream_states
= g_hash_table_new_full(g_direct_hash
,
375 g_direct_equal
, NULL
, destroy_stream_state_key
);
377 /* Set all the existing streams in the unknown state. */
378 nr_stream
= bt_ctf_trace_get_stream_count(trace
);
379 for (i
= 0; i
< nr_stream
; i
++) {
380 stream
= bt_ctf_trace_get_stream_by_index(trace
, i
);
382 fprintf(writer_component
->err
,
383 "[error] %s in %s:%d\n", __func__
,
387 insert_new_stream_state(writer_component
, fs_writer
, stream
);
391 /* Check if the trace is already static or register a listener. */
392 if (bt_ctf_trace_is_static(trace
)) {
393 fs_writer
->trace_static
= 1;
394 fs_writer
->static_listener_id
= -1;
396 ret
= bt_ctf_trace_add_is_static_listener(trace
,
397 trace_is_static_listener
, fs_writer
);
399 fprintf(writer_component
->err
,
400 "[error] %s in %s:%d\n", __func__
, __FILE__
,
404 fs_writer
->static_listener_id
= ret
;
407 writer_component
->nr_traces
++;
408 g_hash_table_insert(writer_component
->trace_map
, (gpointer
) trace
,
416 bt_put(writer_trace
);
424 struct fs_writer
*get_fs_writer(struct writer_component
*writer_component
,
425 struct bt_ctf_stream_class
*stream_class
)
427 struct bt_ctf_trace
*trace
= NULL
;
428 struct fs_writer
*fs_writer
;
430 trace
= bt_ctf_stream_class_get_trace(stream_class
);
432 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
433 __func__
, __FILE__
, __LINE__
);
437 fs_writer
= g_hash_table_lookup(writer_component
->trace_map
,
440 fs_writer
= insert_new_writer(writer_component
, trace
);
452 struct fs_writer
*get_fs_writer_from_stream(
453 struct writer_component
*writer_component
,
454 struct bt_ctf_stream
*stream
)
456 struct bt_ctf_stream_class
*stream_class
= NULL
;
457 struct fs_writer
*fs_writer
;
459 stream_class
= bt_ctf_stream_get_class(stream
);
461 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
462 __func__
, __FILE__
, __LINE__
);
466 fs_writer
= get_fs_writer(writer_component
, stream_class
);
473 bt_put(stream_class
);
478 struct bt_ctf_stream_class
*lookup_stream_class(
479 struct writer_component
*writer_component
,
480 struct bt_ctf_stream_class
*stream_class
)
482 struct fs_writer
*fs_writer
= get_fs_writer(
483 writer_component
, stream_class
);
485 return (struct bt_ctf_stream_class
*) g_hash_table_lookup(
486 fs_writer
->stream_class_map
, (gpointer
) stream_class
);
490 struct bt_ctf_stream
*lookup_stream(struct writer_component
*writer_component
,
491 struct bt_ctf_stream
*stream
)
493 struct fs_writer
*fs_writer
= get_fs_writer_from_stream(
494 writer_component
, stream
);
496 return (struct bt_ctf_stream
*) g_hash_table_lookup(
497 fs_writer
->stream_map
, (gpointer
) stream
);
501 struct bt_ctf_stream
*insert_new_stream(
502 struct writer_component
*writer_component
,
503 struct fs_writer
*fs_writer
,
504 struct bt_ctf_stream_class
*stream_class
,
505 struct bt_ctf_stream
*stream
)
507 struct bt_ctf_stream
*writer_stream
= NULL
;
508 struct bt_ctf_stream_class
*writer_stream_class
= NULL
;
509 struct bt_ctf_writer
*ctf_writer
= bt_get(fs_writer
->writer
);
511 writer_stream_class
= lookup_stream_class(writer_component
,
513 if (!writer_stream_class
) {
514 writer_stream_class
= insert_new_stream_class(
515 writer_component
, fs_writer
, stream_class
);
516 if (!writer_stream_class
) {
517 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
518 __func__
, __FILE__
, __LINE__
);
522 bt_get(writer_stream_class
);
524 writer_stream
= bt_ctf_stream_create(writer_stream_class
,
525 bt_ctf_stream_get_name(stream
));
526 if (!writer_stream
) {
527 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
528 __func__
, __FILE__
, __LINE__
);
532 g_hash_table_insert(fs_writer
->stream_map
, (gpointer
) stream
,
538 BT_PUT(writer_stream
);
541 bt_put(writer_stream_class
);
542 return writer_stream
;
546 struct bt_ctf_event_class
*get_event_class(struct writer_component
*writer_component
,
547 struct bt_ctf_stream_class
*writer_stream_class
,
548 struct bt_ctf_event_class
*event_class
)
550 return bt_ctf_stream_class_get_event_class_by_id(writer_stream_class
,
551 bt_ctf_event_class_get_id(event_class
));
555 struct bt_ctf_stream
*get_writer_stream(
556 struct writer_component
*writer_component
,
557 struct bt_ctf_packet
*packet
, struct bt_ctf_stream
*stream
)
559 struct bt_ctf_stream
*writer_stream
= NULL
;
561 writer_stream
= lookup_stream(writer_component
, stream
);
562 if (!writer_stream
) {
563 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
564 __func__
, __FILE__
, __LINE__
);
567 bt_get(writer_stream
);
572 BT_PUT(writer_stream
);
574 return writer_stream
;
578 void writer_close(struct writer_component
*writer_component
,
579 struct fs_writer
*fs_writer
)
581 if (fs_writer
->static_listener_id
>= 0) {
582 bt_ctf_trace_remove_is_static_listener(fs_writer
->trace
,
583 fs_writer
->static_listener_id
);
586 /* Empty the stream class HT. */
587 g_hash_table_foreach_remove(fs_writer
->stream_class_map
,
589 g_hash_table_destroy(fs_writer
->stream_class_map
);
591 /* Empty the stream HT. */
592 g_hash_table_foreach_remove(fs_writer
->stream_map
,
593 empty_streams_ht
, NULL
);
594 g_hash_table_destroy(fs_writer
->stream_map
);
596 /* Empty the stream state HT. */
597 g_hash_table_foreach_remove(fs_writer
->stream_states
,
599 g_hash_table_destroy(fs_writer
->stream_states
);
603 enum bt_component_status
writer_stream_begin(
604 struct writer_component
*writer_component
,
605 struct bt_ctf_stream
*stream
)
607 struct bt_ctf_stream_class
*stream_class
= NULL
;
608 struct fs_writer
*fs_writer
;
609 struct bt_ctf_stream
*writer_stream
= NULL
;
610 enum bt_component_status ret
= BT_COMPONENT_STATUS_OK
;
611 enum fs_writer_stream_state
*state
;
613 stream_class
= bt_ctf_stream_get_class(stream
);
615 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
616 __func__
, __FILE__
, __LINE__
);
620 fs_writer
= get_fs_writer(writer_component
, stream_class
);
622 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
623 __func__
, __FILE__
, __LINE__
);
627 /* Set the stream as active */
628 state
= g_hash_table_lookup(fs_writer
->stream_states
, stream
);
630 if (fs_writer
->trace_static
) {
631 fprintf(writer_component
->err
, "[error] Adding a new "
632 "stream on a static trace\n");
635 state
= insert_new_stream_state(writer_component
, fs_writer
,
638 if (*state
!= FS_WRITER_UNKNOWN_STREAM
) {
639 fprintf(writer_component
->err
, "[error] Unexpected stream "
640 "state %d\n", *state
);
643 *state
= FS_WRITER_ACTIVE_STREAM
;
645 writer_stream
= insert_new_stream(writer_component
, fs_writer
,
646 stream_class
, stream
);
647 if (!writer_stream
) {
648 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
649 __func__
, __FILE__
, __LINE__
);
656 ret
= BT_COMPONENT_STATUS_ERROR
;
658 bt_put(stream_class
);
663 enum bt_component_status
writer_stream_end(
664 struct writer_component
*writer_component
,
665 struct bt_ctf_stream
*stream
)
667 struct bt_ctf_stream_class
*stream_class
= NULL
;
668 struct fs_writer
*fs_writer
;
669 struct bt_ctf_trace
*trace
= NULL
;
670 enum bt_component_status ret
= BT_COMPONENT_STATUS_OK
;
671 enum fs_writer_stream_state
*state
;
673 stream_class
= bt_ctf_stream_get_class(stream
);
675 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
676 __func__
, __FILE__
, __LINE__
);
680 fs_writer
= get_fs_writer(writer_component
, stream_class
);
682 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
683 __func__
, __FILE__
, __LINE__
);
687 state
= g_hash_table_lookup(fs_writer
->stream_states
, stream
);
688 if (*state
!= FS_WRITER_ACTIVE_STREAM
) {
689 fprintf(writer_component
->err
, "[error] Unexpected stream "
690 "state %d\n", *state
);
693 *state
= FS_WRITER_COMPLETED_STREAM
;
695 g_hash_table_remove(fs_writer
->stream_map
, stream
);
697 if (fs_writer
->trace_static
) {
698 int trace_completed
= 1;
700 g_hash_table_foreach(fs_writer
->stream_states
,
701 check_completed_trace
, &trace_completed
);
702 if (trace_completed
) {
703 writer_close(writer_component
, fs_writer
);
704 g_hash_table_remove(writer_component
->trace_map
,
712 ret
= BT_COMPONENT_STATUS_ERROR
;
715 BT_PUT(stream_class
);
720 enum bt_component_status
writer_new_packet(
721 struct writer_component
*writer_component
,
722 struct bt_ctf_packet
*packet
)
724 struct bt_ctf_stream
*stream
= NULL
, *writer_stream
= NULL
;
725 enum bt_component_status ret
= BT_COMPONENT_STATUS_OK
;
728 stream
= bt_ctf_packet_get_stream(packet
);
730 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
731 __func__
, __FILE__
, __LINE__
);
735 writer_stream
= get_writer_stream(writer_component
, packet
, stream
);
736 if (!writer_stream
) {
737 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
738 __func__
, __FILE__
, __LINE__
);
743 int_ret
= ctf_stream_copy_packet_context(
744 writer_component
->err
, packet
, writer_stream
);
746 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
747 __func__
, __FILE__
, __LINE__
);
751 ret
= ctf_stream_copy_packet_header(writer_component
->err
,
752 packet
, writer_stream
);
754 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
755 __func__
, __FILE__
, __LINE__
);
762 ret
= BT_COMPONENT_STATUS_ERROR
;
764 bt_put(writer_stream
);
770 enum bt_component_status
writer_close_packet(
771 struct writer_component
*writer_component
,
772 struct bt_ctf_packet
*packet
)
774 struct bt_ctf_stream
*stream
= NULL
, *writer_stream
= NULL
;
775 enum bt_component_status ret
;
777 stream
= bt_ctf_packet_get_stream(packet
);
779 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
780 __func__
, __FILE__
, __LINE__
);
784 writer_stream
= lookup_stream(writer_component
, stream
);
785 if (!writer_stream
) {
786 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
787 __func__
, __FILE__
, __LINE__
);
792 bt_get(writer_stream
);
794 ret
= bt_ctf_stream_flush(writer_stream
);
796 fprintf(writer_component
->err
,
797 "[error] Failed to flush packet\n");
800 BT_PUT(writer_stream
);
802 ret
= BT_COMPONENT_STATUS_OK
;
806 ret
= BT_COMPONENT_STATUS_ERROR
;
808 bt_put(writer_stream
);
814 enum bt_component_status
writer_output_event(
815 struct writer_component
*writer_component
,
816 struct bt_ctf_event
*event
)
818 enum bt_component_status ret
;
819 struct bt_ctf_event_class
*event_class
= NULL
, *writer_event_class
= NULL
;
820 struct bt_ctf_stream
*stream
= NULL
, *writer_stream
= NULL
;
821 struct bt_ctf_stream_class
*stream_class
= NULL
, *writer_stream_class
= NULL
;
822 struct bt_ctf_event
*writer_event
= NULL
;
823 const char *event_name
;
826 event_class
= bt_ctf_event_get_class(event
);
828 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
833 event_name
= bt_ctf_event_class_get_name(event_class
);
835 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
840 stream
= bt_ctf_event_get_stream(event
);
842 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
847 writer_stream
= lookup_stream(writer_component
, stream
);
848 if (!writer_stream
|| !bt_get(writer_stream
)) {
849 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
854 stream_class
= bt_ctf_event_class_get_stream_class(event_class
);
856 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
861 writer_stream_class
= lookup_stream_class(writer_component
, stream_class
);
862 if (!writer_stream_class
|| !bt_get(writer_stream_class
)) {
863 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
868 writer_event_class
= get_event_class(writer_component
,
869 writer_stream_class
, event_class
);
870 if (!writer_event_class
) {
871 writer_event_class
= ctf_copy_event_class(writer_component
->err
,
873 if (!writer_event_class
) {
874 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
875 __func__
, __FILE__
, __LINE__
);
878 int_ret
= bt_ctf_stream_class_add_event_class(
879 writer_stream_class
, writer_event_class
);
881 fprintf(writer_component
->err
, "[error] %s in %s:%d\n",
882 __func__
, __FILE__
, __LINE__
);
887 writer_event
= ctf_copy_event(writer_component
->err
, event
,
888 writer_event_class
, true);
890 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
892 fprintf(writer_component
->err
, "[error] Failed to copy event %s\n",
893 bt_ctf_event_class_get_name(writer_event_class
));
897 int_ret
= bt_ctf_stream_append_event(writer_stream
, writer_event
);
899 fprintf(writer_component
->err
, "[error] %s in %s:%d\n", __func__
,
901 fprintf(writer_component
->err
, "[error] Failed to append event %s\n",
902 bt_ctf_event_class_get_name(writer_event_class
));
906 ret
= BT_COMPONENT_STATUS_OK
;
910 ret
= BT_COMPONENT_STATUS_ERROR
;
912 bt_put(writer_event
);
913 bt_put(writer_event_class
);
914 bt_put(writer_stream_class
);
915 bt_put(stream_class
);
916 bt_put(writer_stream
);