+ if (!fs_writer) {
+ fs_writer = insert_new_writer(writer_component, trace);
+ }
+ BT_TRACE_PUT_REF_AND_RESET(trace);
+
+ return fs_writer;
+}
+
+static
+struct fs_writer *get_fs_writer_from_stream(
+ struct writer_component *writer_component,
+ const bt_stream *stream)
+{
+ const bt_stream_class *stream_class = NULL;
+ struct fs_writer *fs_writer;
+
+ stream_class = bt_stream_get_class(stream);
+ BT_ASSERT(stream_class);
+
+ fs_writer = get_fs_writer(writer_component, stream_class);
+
+ bt_stream_class_put_ref(stream_class);
+ return fs_writer;
+}
+
+static
+const bt_stream_class *lookup_stream_class(
+ struct writer_component *writer_component,
+ const bt_stream_class *stream_class)
+{
+ struct fs_writer *fs_writer = get_fs_writer(
+ writer_component, stream_class);
+ BT_ASSERT(fs_writer);
+ return (const bt_stream_class *) g_hash_table_lookup(
+ fs_writer->stream_class_map, (gpointer) stream_class);
+}
+
+static
+const bt_stream *lookup_stream(struct writer_component *writer_component,
+ const bt_stream *stream)
+{
+ struct fs_writer *fs_writer = get_fs_writer_from_stream(
+ writer_component, stream);
+ BT_ASSERT(fs_writer);
+ return (const bt_stream *) g_hash_table_lookup(
+ fs_writer->stream_map, (gpointer) stream);
+}
+
+static
+const bt_stream *insert_new_stream(
+ struct writer_component *writer_component,
+ struct fs_writer *fs_writer,
+ const bt_stream_class *stream_class,
+ const bt_stream *stream)
+{
+ const bt_stream *writer_stream = NULL;
+ const bt_stream_class *writer_stream_class = NULL;
+ struct bt_ctf_writer *ctf_writer = bt_object_get_ref(fs_writer->writer);
+
+ writer_stream_class = lookup_stream_class(writer_component,
+ stream_class);
+ if (!writer_stream_class) {
+ writer_stream_class = insert_new_stream_class(
+ writer_component, fs_writer, stream_class);
+ if (!writer_stream_class) {
+ BT_LOGE_STR("Failed to insert a new stream_class.");
+ goto error;
+ }