+static
+struct fs_writer *get_fs_writer_from_stream(
+ struct writer_component *writer_component,
+ struct bt_ctf_stream *stream)
+{
+ struct bt_ctf_stream_class *stream_class = NULL;
+ struct fs_writer *fs_writer;
+
+ stream_class = bt_ctf_stream_get_class(stream);
+ if (!stream_class) {
+ fprintf(writer_component->err, "[error] %s in %s:%d\n",
+ __func__, __FILE__, __LINE__);
+ goto error;
+ }
+
+ fs_writer = get_fs_writer(writer_component, stream_class);
+ goto end;
+
+error:
+ fs_writer = NULL;
+
+end:
+ bt_put(stream_class);
+ return fs_writer;
+}
+
+static
+struct bt_ctf_stream_class *lookup_stream_class(
+ struct writer_component *writer_component,
+ struct bt_ctf_stream_class *stream_class)
+{
+ struct fs_writer *fs_writer = get_fs_writer(
+ writer_component, stream_class);
+ assert(fs_writer);
+ return (struct bt_ctf_stream_class *) g_hash_table_lookup(
+ fs_writer->stream_class_map, (gpointer) stream_class);
+}
+
+static
+struct bt_ctf_stream *lookup_stream(struct writer_component *writer_component,
+ struct bt_ctf_stream *stream)
+{
+ struct fs_writer *fs_writer = get_fs_writer_from_stream(
+ writer_component, stream);
+ assert(fs_writer);
+ return (struct bt_ctf_stream *) g_hash_table_lookup(
+ fs_writer->stream_map, (gpointer) stream);
+}
+
+static
+struct bt_ctf_stream *insert_new_stream(
+ struct writer_component *writer_component,
+ struct fs_writer *fs_writer,
+ struct bt_ctf_stream_class *stream_class,
+ struct bt_ctf_stream *stream)
+{
+ struct bt_ctf_stream *writer_stream = NULL;
+ struct bt_ctf_stream_class *writer_stream_class = NULL;
+ struct bt_ctf_writer *ctf_writer = bt_get(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) {
+ fprintf(writer_component->err, "[error] %s in %s:%d\n",
+ __func__, __FILE__, __LINE__);
+ goto error;
+ }
+ }
+ bt_get(writer_stream_class);
+
+ writer_stream = bt_ctf_writer_create_stream(ctf_writer,
+ writer_stream_class);
+ if (!writer_stream) {
+ fprintf(writer_component->err, "[error] %s in %s:%d\n",
+ __func__, __FILE__, __LINE__);
+ goto error;
+ }
+
+ g_hash_table_insert(fs_writer->stream_map, (gpointer) stream,
+ writer_stream);
+
+ goto end;
+
+error:
+ BT_PUT(writer_stream);
+end:
+ bt_put(ctf_writer);
+ bt_put(writer_stream_class);
+ return writer_stream;
+}
+
+static
+struct bt_ctf_event_class *get_event_class(struct writer_component *writer_component,
+ struct bt_ctf_stream_class *writer_stream_class,
+ struct bt_ctf_event_class *event_class)
+{
+ return bt_ctf_stream_class_get_event_class_by_id(writer_stream_class,
+ bt_ctf_event_class_get_id(event_class));
+}
+