+BT_HIDDEN
+enum bt_component_status writer_close(
+ struct writer_component *writer_component,
+ struct fs_writer *fs_writer,
+ struct bt_ctf_trace *trace)
+{
+ enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+
+ if (fs_writer->static_listener_id > 0) {
+ bt_ctf_trace_remove_is_static_listener(trace,
+ fs_writer->static_listener_id);
+ }
+ g_hash_table_remove(writer_component->trace_map, trace);
+ return ret;
+}
+
+BT_HIDDEN
+enum bt_component_status writer_stream_end(
+ struct writer_component *writer_component,
+ struct bt_ctf_stream *stream)
+{
+ struct bt_ctf_stream_class *stream_class = NULL;
+ struct fs_writer *fs_writer;
+ struct bt_ctf_trace *trace = NULL;
+ enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+
+ g_hash_table_remove(writer_component->stream_map, stream);
+
+ 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);
+ if (!fs_writer) {
+ fprintf(writer_component->err, "[error] %s in %s:%d\n",
+ __func__, __FILE__, __LINE__);
+ goto error;
+ }
+
+ assert(fs_writer->active_streams > 0);
+ fs_writer->active_streams--;
+ if (fs_writer->active_streams == 0 && fs_writer->trace_static) {
+ trace = bt_ctf_stream_class_get_trace(stream_class);
+ if (!trace) {
+ fprintf(writer_component->err, "[error] %s in %s:%d\n",
+ __func__, __FILE__, __LINE__);
+ goto error;
+ }
+ ret = writer_close(writer_component, fs_writer, trace);
+ }
+
+ goto end;
+
+error:
+ ret = BT_COMPONENT_STATUS_ERROR;
+end:
+ BT_PUT(trace);
+ BT_PUT(stream_class);
+ return ret;
+}
+