src.ctf.fs: add stream port name to trace-info query, use it for stream intersection
[babeltrace.git] / plugins / ctf / fs-src / fs.c
index 6f02c8de4570a40738c6886173338e4acb64073a..f1583ae439b3448386e8e6db089d02232eaaac97 100644 (file)
@@ -399,29 +399,48 @@ void ctf_fs_finalize(bt_self_component_source *component)
                bt_self_component_source_as_self_component(component)));
 }
 
-static
-GString *get_stream_instance_unique_name(
-               struct ctf_fs_ds_file_group *ds_file_group)
+gchar *ctf_fs_make_port_name(struct ctf_fs_ds_file_group *ds_file_group)
 {
-       GString *name;
-       struct ctf_fs_ds_file_info *ds_file_info;
+       GString *name = g_string_new(NULL);
 
-       name = g_string_new(NULL);
-       if (!name) {
-               goto end;
+       /*
+        * The unique port name is generated by concatenating unique identifiers
+        * for:
+        *
+        *   - the trace
+        *   - the stream class
+        *   - the stream
+        */
+
+       /* For the trace, use the uuid if present, else the path. */
+       if (ds_file_group->ctf_fs_trace->metadata->tc->is_uuid_set) {
+               char uuid_str[BABELTRACE_UUID_STR_LEN];
+
+               bt_uuid_unparse(ds_file_group->ctf_fs_trace->metadata->tc->uuid, uuid_str);
+               g_string_assign(name, uuid_str);
+       } else {
+               g_string_assign(name, ds_file_group->ctf_fs_trace->path->str);
        }
 
        /*
-        * If there's more than one stream file in the stream file
-        * group, the first (earliest) stream file's path is used as
-        * the stream's unique name.
+        * For the stream class, use the id if present.  We can omit this field
+        * otherwise, as there will only be a single stream class.
         */
-       BT_ASSERT(ds_file_group->ds_file_infos->len > 0);
-       ds_file_info = g_ptr_array_index(ds_file_group->ds_file_infos, 0);
-       g_string_assign(name, ds_file_info->path->str);
+       if (ds_file_group->sc->id != UINT64_C(-1)) {
+               g_string_append_printf(name, " | %" PRIu64, ds_file_group->sc->id);
+       }
 
-end:
-       return name;
+       /* For the stream, use the id if present, else, use the path. */
+       if (ds_file_group->stream_id != UINT64_C(-1)) {
+               g_string_append_printf(name, " | %" PRIu64, ds_file_group->stream_id);
+       } else {
+               BT_ASSERT(ds_file_group->ds_file_infos->len == 1);
+               struct ctf_fs_ds_file_info *ds_file_info =
+                       g_ptr_array_index(ds_file_group->ds_file_infos, 0);
+               g_string_append_printf(name, " | %s", ds_file_info->path->str);
+       }
+
+       return g_string_free(name, FALSE);
 }
 
 static
@@ -431,14 +450,14 @@ int create_one_port_for_trace(struct ctf_fs_component *ctf_fs,
 {
        int ret = 0;
        struct ctf_fs_port_data *port_data = NULL;
-       GString *port_name = NULL;
+       gchar *port_name;
 
-       port_name = get_stream_instance_unique_name(ds_file_group);
+       port_name = ctf_fs_make_port_name(ds_file_group);
        if (!port_name) {
                goto error;
        }
 
-       BT_LOGD("Creating one port named `%s`", port_name->str);
+       BT_LOGD("Creating one port named `%s`", port_name);
 
        /* Create output port for this file */
        port_data = g_new0(struct ctf_fs_port_data, 1);
@@ -449,7 +468,7 @@ int create_one_port_for_trace(struct ctf_fs_component *ctf_fs,
        port_data->ctf_fs = ctf_fs;
        port_data->ds_file_group = ds_file_group;
        ret = bt_self_component_source_add_output_port(
-               ctf_fs->self_comp, port_name->str, port_data, NULL);
+               ctf_fs->self_comp, port_name, port_data, NULL);
        if (ret) {
                goto error;
        }
@@ -463,7 +482,7 @@ error:
 
 end:
        if (port_name) {
-               g_string_free(port_name, TRUE);
+               g_free(port_name);
        }
 
        port_data_destroy(port_data);
@@ -1587,6 +1606,31 @@ end:
        return ret;
 }
 
+static
+GString *get_stream_instance_unique_name(
+               struct ctf_fs_ds_file_group *ds_file_group)
+{
+       GString *name;
+       struct ctf_fs_ds_file_info *ds_file_info;
+
+       name = g_string_new(NULL);
+       if (!name) {
+               goto end;
+       }
+
+       /*
+        * If there's more than one stream file in the stream file
+        * group, the first (earliest) stream file's path is used as
+        * the stream's unique name.
+        */
+       BT_ASSERT(ds_file_group->ds_file_infos->len > 0);
+       ds_file_info = g_ptr_array_index(ds_file_group->ds_file_infos, 0);
+       g_string_assign(name, ds_file_info->path->str);
+
+end:
+       return name;
+}
+
 /* Create the IR stream objects for ctf_fs_trace. */
 
 static
This page took 0.025167 seconds and 4 git commands to generate.