Set private port's user data on creation
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Thu, 27 Apr 2017 23:17:04 +0000 (19:17 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sun, 28 May 2017 16:57:41 +0000 (12:57 -0400)
With separate port creation and user data setting calls, the following
scenario is problematic:

    Source adds a port (private data is not set yet)
      Graph user's "port added" callback is called
        This callback connects the new port to a sink port
          This sink's "port connected" method is called
            This sink creates a notification iterator on the connected
            port's connection
              The source's notification iterator initialization method
              is called with the added port with NO private data yet

With this change, it is guaranteed that as soon as the port can be
accessed by any user, its private data is set.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
15 files changed:
include/babeltrace/graph/component-internal.h
include/babeltrace/graph/port-internal.h
include/babeltrace/graph/private-component-filter.h
include/babeltrace/graph/private-component-sink.h
include/babeltrace/graph/private-component-source.h
include/babeltrace/graph/private-port.h
lib/graph/component.c
lib/graph/filter.c
lib/graph/port.c
lib/graph/sink.c
lib/graph/source.c
plugins/ctf/fs/fs.c
plugins/utils/muxer/muxer.c
tests/lib/test_graph_topo.c
tests/plugins/test-utils-muxer.c

index f6ed6ac77f00d2d00434aa49026429ed4ca673d8..2308afdd5ea363f2561085d2405133dbb150e70a 100644 (file)
@@ -129,11 +129,13 @@ struct bt_port *bt_component_get_output_port_by_name(struct bt_component *comp,
 
 BT_HIDDEN
 struct bt_port *bt_component_add_input_port(
-               struct bt_component *component, const char *name);
+               struct bt_component *component, const char *name,
+               void *user_data);
 
 BT_HIDDEN
 struct bt_port *bt_component_add_output_port(
-               struct bt_component *component, const char *name);
+               struct bt_component *component, const char *name,
+               void *user_data);
 
 BT_HIDDEN
 enum bt_component_status bt_component_remove_port(
index 3a277674961139b7d96f48c36260e0ea9a1990f4..807728cb2eb51bb5aa638605939251cab122e780 100644 (file)
@@ -57,7 +57,7 @@ struct bt_private_port *bt_private_port_from_port(
 
 BT_HIDDEN
 struct bt_port *bt_port_create(struct bt_component *parent_component,
-               enum bt_port_type type, const char *name);
+               enum bt_port_type type, const char *name, void *user_data);
 
 BT_HIDDEN
 void bt_port_set_connection(struct bt_port *port,
index 51944afd3c1c2b99b2cc6e9a0c72157f9f2eeef7..bb3cfe75f114052916cce350193333f3b86d3ea4 100644 (file)
@@ -49,7 +49,7 @@ bt_private_component_filter_get_default_output_private_port(
 extern struct bt_private_port *
 bt_private_component_filter_add_output_private_port(
                struct bt_private_component *private_component,
-               const char *name);
+               const char *name, void *user_data);
 
 extern struct bt_private_port *
 bt_private_component_filter_get_input_private_port_by_name(
@@ -67,7 +67,7 @@ bt_private_component_filter_get_default_input_private_port(
 extern struct bt_private_port *
 bt_private_component_filter_add_input_private_port(
                struct bt_private_component *private_component,
-               const char *name);
+               const char *name, void *user_data);
 
 #ifdef __cplusplus
 }
index db3e71f1d7a109854e7171577713b346c2a20c96..9c473ccc591f9e2395fbe80ce1599eee644aea5a 100644 (file)
@@ -49,7 +49,7 @@ bt_private_component_sink_get_default_input_private_port(
 extern struct bt_private_port *
 bt_private_component_sink_add_input_private_port(
                struct bt_private_component *private_component,
-               const char *name);
+               const char *name, void *user_data);
 
 #ifdef __cplusplus
 }
index 257e6485e98ad39d63969fae67dae61eeb6cccbd..da65320392bc946c40986f079b13caa246f1f26e 100644 (file)
@@ -50,7 +50,7 @@ bt_private_component_source_get_default_output_private_port(
 extern struct bt_private_port *
 bt_private_component_source_add_output_private_port(
                struct bt_private_component *private_component,
-               const char *name);
+               const char *name, void *user_data);
 
 #ifdef __cplusplus
 }
index 1455369cd46555594a6b2172e6c8abf1a76bbd52..c9c140b70f96cb7f310af5d1489d9f800ced119f 100644 (file)
@@ -39,8 +39,6 @@ extern struct bt_private_component *bt_private_port_get_private_component(
                struct bt_private_port *private_port);
 extern int bt_private_port_remove_from_component(
                struct bt_private_port *private_port);
-extern int bt_private_port_set_user_data(
-               struct bt_private_port *private_port, void *user_data);
 extern void *bt_private_port_get_user_data(
                struct bt_private_port *private_port);
 
index 792a36145bf2aaf8dbf78c34c2fa990de11b56cc..7b433ea9626441bd9203a186924cc6f21ba30b41 100644 (file)
@@ -135,7 +135,7 @@ enum bt_component_class_type bt_component_get_class_type(
 static
 struct bt_port *bt_component_add_port(
                struct bt_component *component, GPtrArray *ports,
-               enum bt_port_type port_type, const char *name)
+               enum bt_port_type port_type, const char *name, void *user_data)
 {
        size_t i;
        struct bt_port *new_port = NULL;
@@ -162,7 +162,7 @@ struct bt_port *bt_component_add_port(
                }
        }
 
-       new_port = bt_port_create(component, port_type, name);
+       new_port = bt_port_create(component, port_type, name, user_data);
        if (!new_port) {
                goto end;
        }
@@ -277,7 +277,7 @@ struct bt_component *bt_component_create_with_init_method_data(
                        type == BT_COMPONENT_CLASS_TYPE_FILTER) {
                default_port = bt_component_add_port(component,
                        component->output_ports, BT_PORT_TYPE_OUTPUT,
-                       DEFAULT_OUTPUT_PORT_NAME);
+                       DEFAULT_OUTPUT_PORT_NAME, NULL);
                if (!default_port) {
                        BT_PUT(component);
                        goto end;
@@ -290,7 +290,7 @@ struct bt_component *bt_component_create_with_init_method_data(
                        type == BT_COMPONENT_CLASS_TYPE_SINK) {
                default_port = bt_component_add_port(component,
                        component->input_ports, BT_PORT_TYPE_INPUT,
-                       DEFAULT_INPUT_PORT_NAME);
+                       DEFAULT_INPUT_PORT_NAME, NULL);
                if (!default_port) {
                        BT_PUT(component);
                        goto end;
@@ -492,18 +492,20 @@ struct bt_port *bt_component_get_output_port_by_index(struct bt_component *comp,
 
 BT_HIDDEN
 struct bt_port *bt_component_add_input_port(
-               struct bt_component *component, const char *name)
+               struct bt_component *component, const char *name,
+               void *user_data)
 {
        return bt_component_add_port(component, component->input_ports,
-               BT_PORT_TYPE_INPUT, name);
+               BT_PORT_TYPE_INPUT, name, user_data);
 }
 
 BT_HIDDEN
 struct bt_port *bt_component_add_output_port(
-               struct bt_component *component, const char *name)
+               struct bt_component *component, const char *name,
+               void *user_data)
 {
        return bt_component_add_port(component, component->output_ports,
-               BT_PORT_TYPE_OUTPUT, name);
+               BT_PORT_TYPE_OUTPUT, name, user_data);
 }
 
 static
index 81f872e648fe798e658dbf1dacd5bd072a04e2d6..e109e15ed434adcba9ec2913976f85e1b36c28ba 100644 (file)
@@ -206,7 +206,7 @@ bt_private_component_filter_get_default_input_private_port(
 
 struct bt_private_port *bt_private_component_filter_add_input_private_port(
                struct bt_private_component *private_component,
-               const char *name)
+               const char *name, void *user_data)
 {
        struct bt_port *port = NULL;
        struct bt_component *component =
@@ -217,7 +217,7 @@ struct bt_private_port *bt_private_component_filter_add_input_private_port(
                goto end;
        }
 
-       port = bt_component_add_input_port(component, name);
+       port = bt_component_add_input_port(component, name, user_data);
 end:
        return bt_private_port_from_port(port);
 }
@@ -242,7 +242,7 @@ bt_private_component_filter_get_default_output_private_port(
 
 struct bt_private_port *bt_private_component_filter_add_output_private_port(
                struct bt_private_component *private_component,
-               const char *name)
+               const char *name, void *user_data)
 {
        struct bt_port *port = NULL;
        struct bt_component *component =
@@ -253,7 +253,7 @@ struct bt_private_port *bt_private_component_filter_add_output_private_port(
                goto end;
        }
 
-       port = bt_component_add_output_port(component, name);
+       port = bt_component_add_output_port(component, name, user_data);
 end:
        return bt_private_port_from_port(port);
 }
index c0d5e061d2cd49e271d794de3bbe1e064a67fd5f..b0e95f6eb8e25b4f5bfdaf5e4550d7be48a5b0d7 100644 (file)
@@ -51,7 +51,7 @@ struct bt_port *bt_port_from_private_port(
 
 BT_HIDDEN
 struct bt_port *bt_port_create(struct bt_component *parent_component,
-               enum bt_port_type type, const char *name)
+               enum bt_port_type type, const char *name, void *user_data)
 {
        struct bt_port *port = NULL;
 
@@ -76,6 +76,7 @@ struct bt_port *bt_port_create(struct bt_component *parent_component,
        }
 
        port->type = type;
+       port->user_data = user_data;
 
        bt_object_set_parent(port, &parent_component->base);
 end:
@@ -188,22 +189,6 @@ end:
        return ret;
 }
 
-int bt_private_port_set_user_data(
-               struct bt_private_port *private_port, void *user_data)
-{
-       int ret = 0;
-
-       if (!private_port) {
-               ret = -1;
-               goto end;
-       }
-
-       bt_port_from_private(private_port)->user_data = user_data;
-
-end:
-       return ret;
-}
-
 void *bt_private_port_get_user_data(
                struct bt_private_port *private_port)
 {
index 1bd092835a1687e59b82ae702b7baafb3b4ffdd3..1eedcf73fd7d4428cd5e65d36675d54172b33dfc 100644 (file)
@@ -171,7 +171,7 @@ struct bt_private_port *bt_private_component_sink_get_default_input_private_port
 
 struct bt_private_port *bt_private_component_sink_add_input_private_port(
                struct bt_private_component *private_component,
-               const char *name)
+               const char *name, void *user_data)
 {
        struct bt_port *port = NULL;
        struct bt_component *component =
@@ -182,7 +182,7 @@ struct bt_private_port *bt_private_component_sink_add_input_private_port(
                goto end;
        }
 
-       port = bt_component_add_input_port(component, name);
+       port = bt_component_add_input_port(component, name, user_data);
 end:
        return bt_private_port_from_port(port);
 }
index ed052ded0e6360816dd2bf534de7a5217ee5a23e..e76959b8722b53f046f39d0466b338fc75daf87f 100644 (file)
@@ -161,7 +161,7 @@ struct bt_private_port *bt_private_component_source_get_default_output_private_p
 
 struct bt_private_port *bt_private_component_source_add_output_private_port(
                struct bt_private_component *private_component,
-               const char *name)
+               const char *name, void *user_data)
 {
        struct bt_port *port = NULL;
        struct bt_component *component =
@@ -172,7 +172,7 @@ struct bt_private_port *bt_private_component_source_add_output_private_port(
                goto end;
        }
 
-       port = bt_component_add_output_port(component, name);
+       port = bt_component_add_output_port(component, name, user_data);
 end:
        return bt_private_port_from_port(port);
 }
index e734a1e1fde604187e2c49ebfa84911b31a35334..669d2daa906d259dd586be96dcd6963cc46da524 100644 (file)
@@ -189,12 +189,6 @@ int create_one_port(struct ctf_fs_component *ctf_fs,
                port_name->str, stream_path);
 
        /* Create output port for this file */
-       port = bt_private_component_source_add_output_private_port(
-               ctf_fs->priv_comp, port_name->str);
-       if (!port) {
-               goto error;
-       }
-
        port_data = g_new0(struct ctf_fs_port_data, 1);
        if (!port_data) {
                goto error;
@@ -205,8 +199,9 @@ int create_one_port(struct ctf_fs_component *ctf_fs,
                goto error;
        }
 
-       ret = bt_private_port_set_user_data(port, port_data);
-       if (ret) {
+       port = bt_private_component_source_add_output_private_port(
+               ctf_fs->priv_comp, port_name->str, port_data);
+       if (!port) {
                goto error;
        }
 
index 5db1e426a7205c8361699d340578174d4c18fba7..475dbf61866c331e97525fbb889a9c9dd605220b 100644 (file)
@@ -173,7 +173,7 @@ int ensure_available_input_port(struct bt_private_component *priv_comp)
 
        g_string_append_printf(port_name, "%u", muxer_comp->next_port_num);
        priv_port = bt_private_component_filter_add_input_private_port(
-               priv_comp, port_name->str);
+               priv_comp, port_name->str, NULL);
        if (!priv_port) {
                ret = -1;
                goto end;
@@ -228,7 +228,7 @@ int create_output_port(struct bt_private_component *priv_comp)
        int ret = 0;
 
        priv_port = bt_private_component_filter_add_output_private_port(
-               priv_comp, "out");
+               priv_comp, "out", NULL);
        if (!priv_port) {
                ret = -1;
        }
index 274f787264148a5fdd45b18035bfaa5d0a654d50..ccde32afe4fafeb440d94440df7424e45624772b 100644 (file)
@@ -338,7 +338,7 @@ void src_port_connected(struct bt_private_component *private_component,
        switch (current_test) {
        case TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED:
                port = bt_private_component_source_add_output_private_port(
-                       private_component, "hello");
+                       private_component, "hello", NULL);
                assert(port);
                bt_put(port);
                break;
index 707672c5c1659e9892ea40d5437d609f4d91e69b..50f5be5de37bfcf46991a3dd3d33b01039831ece 100644 (file)
@@ -634,11 +634,11 @@ struct bt_notification_iterator_next_return src_iter_next(
                        struct bt_private_port *priv_port;
 
                        priv_port = bt_private_component_source_add_output_private_port(
-                               private_component, "out1");
+                               private_component, "out1", NULL);
                        assert(priv_port);
                        bt_put(priv_port);
                        priv_port = bt_private_component_source_add_output_private_port(
-                               private_component, "out2");
+                               private_component, "out2", NULL);
                        assert(priv_port);
                        bt_put(priv_port);
                        next_return.status = BT_NOTIFICATION_ITERATOR_STATUS_END;
@@ -655,11 +655,11 @@ struct bt_notification_iterator_next_return src_iter_next(
                                struct bt_private_port *priv_port;
 
                                priv_port = bt_private_component_source_add_output_private_port(
-                                       private_component, "out1");
+                                       private_component, "out1", NULL);
                                assert(priv_port);
                                bt_put(priv_port);
                                priv_port = bt_private_component_source_add_output_private_port(
-                                       private_component, "out2");
+                                       private_component, "out2", NULL);
                                assert(priv_port);
                                bt_put(priv_port);
                                next_return.status = BT_NOTIFICATION_ITERATOR_STATUS_END;
@@ -708,28 +708,28 @@ enum bt_component_status src_init(
 
        if (nb_ports >= 1) {
                priv_port = bt_private_component_source_add_output_private_port(
-                       private_component, "out0");
+                       private_component, "out0", NULL);
                assert(priv_port);
                bt_put(priv_port);
        }
 
        if (nb_ports >= 2) {
                priv_port = bt_private_component_source_add_output_private_port(
-                       private_component, "out1");
+                       private_component, "out1", NULL);
                assert(priv_port);
                bt_put(priv_port);
        }
 
        if (nb_ports >= 3) {
                priv_port = bt_private_component_source_add_output_private_port(
-                       private_component, "out2");
+                       private_component, "out2", NULL);
                assert(priv_port);
                bt_put(priv_port);
        }
 
        if (nb_ports >= 4) {
                priv_port = bt_private_component_source_add_output_private_port(
-                       private_component, "out3");
+                       private_component, "out3", NULL);
                assert(priv_port);
                bt_put(priv_port);
        }
This page took 0.033533 seconds and 4 git commands to generate.