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:
BT_HIDDEN
struct bt_port *bt_component_add_input_port(
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(
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(
BT_HIDDEN
enum bt_component_status bt_component_remove_port(
BT_HIDDEN
struct bt_port *bt_port_create(struct bt_component *parent_component,
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,
BT_HIDDEN
void bt_port_set_connection(struct bt_port *port,
extern struct bt_private_port *
bt_private_component_filter_add_output_private_port(
struct bt_private_component *private_component,
extern struct bt_private_port *
bt_private_component_filter_add_output_private_port(
struct bt_private_component *private_component,
+ const char *name, void *user_data);
extern struct bt_private_port *
bt_private_component_filter_get_input_private_port_by_name(
extern struct bt_private_port *
bt_private_component_filter_get_input_private_port_by_name(
extern struct bt_private_port *
bt_private_component_filter_add_input_private_port(
struct bt_private_component *private_component,
extern struct bt_private_port *
bt_private_component_filter_add_input_private_port(
struct bt_private_component *private_component,
+ const char *name, void *user_data);
extern struct bt_private_port *
bt_private_component_sink_add_input_private_port(
struct bt_private_component *private_component,
extern struct bt_private_port *
bt_private_component_sink_add_input_private_port(
struct bt_private_component *private_component,
+ const char *name, void *user_data);
extern struct bt_private_port *
bt_private_component_source_add_output_private_port(
struct bt_private_component *private_component,
extern struct bt_private_port *
bt_private_component_source_add_output_private_port(
struct bt_private_component *private_component,
+ const char *name, void *user_data);
struct bt_private_port *private_port);
extern int bt_private_port_remove_from_component(
struct bt_private_port *private_port);
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);
extern void *bt_private_port_get_user_data(
struct bt_private_port *private_port);
static
struct bt_port *bt_component_add_port(
struct bt_component *component, GPtrArray *ports,
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;
{
size_t i;
struct bt_port *new_port = NULL;
- 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;
}
if (!new_port) {
goto end;
}
type == BT_COMPONENT_CLASS_TYPE_FILTER) {
default_port = bt_component_add_port(component,
component->output_ports, BT_PORT_TYPE_OUTPUT,
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;
if (!default_port) {
BT_PUT(component);
goto end;
type == BT_COMPONENT_CLASS_TYPE_SINK) {
default_port = bt_component_add_port(component,
component->input_ports, BT_PORT_TYPE_INPUT,
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;
if (!default_port) {
BT_PUT(component);
goto end;
BT_HIDDEN
struct bt_port *bt_component_add_input_port(
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,
{
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(
}
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,
{
return bt_component_add_port(component, component->output_ports,
- BT_PORT_TYPE_OUTPUT, name);
+ BT_PORT_TYPE_OUTPUT, name, user_data);
struct bt_private_port *bt_private_component_filter_add_input_private_port(
struct bt_private_component *private_component,
struct bt_private_port *bt_private_component_filter_add_input_private_port(
struct bt_private_component *private_component,
+ const char *name, void *user_data)
{
struct bt_port *port = NULL;
struct bt_component *component =
{
struct bt_port *port = NULL;
struct bt_component *component =
- 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);
}
end:
return bt_private_port_from_port(port);
}
struct bt_private_port *bt_private_component_filter_add_output_private_port(
struct bt_private_component *private_component,
struct bt_private_port *bt_private_component_filter_add_output_private_port(
struct bt_private_component *private_component,
+ const char *name, void *user_data)
{
struct bt_port *port = NULL;
struct bt_component *component =
{
struct bt_port *port = NULL;
struct bt_component *component =
- 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);
}
end:
return bt_private_port_from_port(port);
}
BT_HIDDEN
struct bt_port *bt_port_create(struct bt_component *parent_component,
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;
{
struct bt_port *port = NULL;
+ port->user_data = user_data;
bt_object_set_parent(port, &parent_component->base);
end:
bt_object_set_parent(port, &parent_component->base);
end:
-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)
{
void *bt_private_port_get_user_data(
struct bt_private_port *private_port)
{
struct bt_private_port *bt_private_component_sink_add_input_private_port(
struct bt_private_component *private_component,
struct bt_private_port *bt_private_component_sink_add_input_private_port(
struct bt_private_component *private_component,
+ const char *name, void *user_data)
{
struct bt_port *port = NULL;
struct bt_component *component =
{
struct bt_port *port = NULL;
struct bt_component *component =
- 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);
}
end:
return bt_private_port_from_port(port);
}
struct bt_private_port *bt_private_component_source_add_output_private_port(
struct bt_private_component *private_component,
struct bt_private_port *bt_private_component_source_add_output_private_port(
struct bt_private_component *private_component,
+ const char *name, void *user_data)
{
struct bt_port *port = NULL;
struct bt_component *component =
{
struct bt_port *port = NULL;
struct bt_component *component =
- 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);
}
end:
return bt_private_port_from_port(port);
}
port_name->str, stream_path);
/* Create output port for this file */
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;
port_data = g_new0(struct ctf_fs_port_data, 1);
if (!port_data) {
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) {
g_string_append_printf(port_name, "%u", muxer_comp->next_port_num);
priv_port = bt_private_component_filter_add_input_private_port(
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;
if (!priv_port) {
ret = -1;
goto end;
int ret = 0;
priv_port = bt_private_component_filter_add_output_private_port(
int ret = 0;
priv_port = bt_private_component_filter_add_output_private_port(
+ priv_comp, "out", NULL);
if (!priv_port) {
ret = -1;
}
if (!priv_port) {
ret = -1;
}
switch (current_test) {
case TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED:
port = bt_private_component_source_add_output_private_port(
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;
assert(port);
bt_put(port);
break;
struct bt_private_port *priv_port;
priv_port = bt_private_component_source_add_output_private_port(
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(
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;
assert(priv_port);
bt_put(priv_port);
next_return.status = BT_NOTIFICATION_ITERATOR_STATUS_END;
struct bt_private_port *priv_port;
priv_port = bt_private_component_source_add_output_private_port(
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(
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;
assert(priv_port);
bt_put(priv_port);
next_return.status = BT_NOTIFICATION_ITERATOR_STATUS_END;
if (nb_ports >= 1) {
priv_port = bt_private_component_source_add_output_private_port(
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(
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(
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(
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);
}
assert(priv_port);
bt_put(priv_port);
}