tap-driver.sh: flush stdout after each test result
[babeltrace.git] / lib / graph / graph.c
index 1b4653de735b60c0f9f5e6625261c6214f59ad33..f7b02a10bece15a7914d8612e362f058328bcc6e 100644 (file)
@@ -1,6 +1,6 @@
 /*
+ * Copyright 2017-2018 Philippe Proulx <pproulx@efficios.com>
  * Copyright 2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
- * Copyright 2017 Philippe Proulx <pproulx@efficios.com>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
  */
 
 #define BT_LOG_TAG "GRAPH"
-#include <babeltrace/lib-logging-internal.h>
-
-#include <babeltrace/graph/component-internal.h>
-#include <babeltrace/graph/private-graph.h>
-#include <babeltrace/graph/graph-internal.h>
-#include <babeltrace/graph/connection-internal.h>
-#include <babeltrace/graph/component-sink-internal.h>
-#include <babeltrace/graph/component-source.h>
-#include <babeltrace/graph/component-filter.h>
-#include <babeltrace/graph/port.h>
-#include <babeltrace/graph/notification-internal.h>
-#include <babeltrace/graph/notification-event-internal.h>
-#include <babeltrace/graph/notification-packet-internal.h>
-#include <babeltrace/compiler-internal.h>
-#include <babeltrace/common-internal.h>
-#include <babeltrace/types.h>
-#include <babeltrace/values.h>
-#include <babeltrace/private-values.h>
-#include <babeltrace/values-internal.h>
-#include <babeltrace/object.h>
-#include <babeltrace/assert-internal.h>
-#include <babeltrace/assert-pre-internal.h>
+#include <babeltrace2/lib-logging-internal.h>
+
+#include <babeltrace2/assert-internal.h>
+#include <babeltrace2/assert-pre-internal.h>
+#include <babeltrace2/graph/component-internal.h>
+#include <babeltrace2/graph/graph.h>
+#include <babeltrace2/graph/graph-const.h>
+#include <babeltrace2/graph/graph-internal.h>
+#include <babeltrace2/graph/connection-internal.h>
+#include <babeltrace2/graph/component-sink-internal.h>
+#include <babeltrace2/graph/component-source-const.h>
+#include <babeltrace2/graph/component-filter-const.h>
+#include <babeltrace2/graph/port-const.h>
+#include <babeltrace2/graph/message-internal.h>
+#include <babeltrace2/graph/message-event-internal.h>
+#include <babeltrace2/graph/message-packet-internal.h>
+#include <babeltrace2/compiler-internal.h>
+#include <babeltrace2/common-internal.h>
+#include <babeltrace2/types.h>
+#include <babeltrace2/value.h>
+#include <babeltrace2/value-const.h>
+#include <babeltrace2/value-internal.h>
 #include <unistd.h>
 #include <glib.h>
 
-typedef void (*port_added_func_t)(void *, void *, void *);
-typedef void (*port_removed_func_t)(void *, void *, void *);
-typedef void (*ports_connected_func_t)(void *, void *, void *, void *, void *);
-typedef void (*ports_disconnected_func_t)(void *, void *, void *, void *, void *);
-typedef enum bt_self_component_status (*comp_init_method_t)(void *, void *, void *);
+typedef enum bt_graph_listener_status (*port_added_func_t)(
+               const void *, const void *, void *);
+
+typedef enum bt_graph_listener_status (*ports_connected_func_t)(
+               const void *, const void *, const void *, const void *, void *);
+
+typedef enum bt_self_component_status (*comp_init_method_t)(const void *,
+               const void *, void *);
 
 struct bt_graph_listener {
-       bt_private_graph_listener_removed removed;
+       bt_graph_listener_removed_func removed;
        void *data;
 };
 
@@ -63,21 +66,11 @@ struct bt_graph_listener_port_added {
        port_added_func_t func;
 };
 
-struct bt_graph_listener_port_removed {
-       struct bt_graph_listener base;
-       port_removed_func_t func;
-};
-
 struct bt_graph_listener_ports_connected {
        struct bt_graph_listener base;
        ports_connected_func_t func;
 };
 
-struct bt_graph_listener_ports_disconnected {
-       struct bt_graph_listener base;
-       ports_disconnected_func_t func;
-};
-
 #define INIT_LISTENERS_ARRAY(_type, _listeners)                                \
        do {                                                            \
                _listeners = g_array_new(FALSE, TRUE, sizeof(_type));   \
@@ -90,6 +83,9 @@ struct bt_graph_listener_ports_disconnected {
        do {                                                            \
                size_t i;                                               \
                                                                        \
+               if (!_listeners) {                                      \
+                       break;                                          \
+               }                                                       \
                for (i = 0; i < (_listeners)->len; i++) {               \
                        _type *listener =                               \
                                &g_array_index((_listeners), _type, i); \
@@ -103,8 +99,7 @@ struct bt_graph_listener_ports_disconnected {
 static
 void destroy_graph(struct bt_object *obj)
 {
-       struct bt_graph *graph = container_of(obj,
-                       struct bt_graph, base);
+       struct bt_graph *graph = container_of(obj, struct bt_graph, base);
 
        /*
         * The graph's reference count is 0 if we're here. Increment
@@ -112,21 +107,21 @@ void destroy_graph(struct bt_object *obj)
         * in this situation:
         *
         * 1. We put and destroy a connection.
-        * 2. This connection's destructor finalizes its active
-        *    notification iterators.
-        * 3. A notification iterator's finalization function gets a
-        *    new reference on its component (reference count goes from
-        *    0 to 1).
+        * 2. This connection's destructor finalizes its active message
+        *    iterators.
+        * 3. A message iterator's finalization function gets a new
+        *    reference on its component (reference count goes from 0 to
+        *    1).
         * 4. Since this component's reference count goes to 1, it takes
         *    a reference on its parent (this graph). This graph's
         *    reference count goes from 0 to 1.
-        * 5. The notification iterator's finalization function puts its
+        * 5. The message iterator's finalization function puts its
         *    component reference (reference count goes from 1 to 0).
         * 6. Since this component's reference count goes from 1 to 0,
         *    it puts its parent (this graph). This graph's reference
         *    count goes from 1 to 0.
-        * 7. Since this graph's reference count goes from 1 to 0,
-        *    its destructor is called (this function).
+        * 7. Since this graph's reference count goes from 1 to 0, its
+        *    destructor is called (this function).
         *
         * With the incrementation below, the graph's reference count at
         * step 4 goes from 1 to 2, and from 2 to 1 at step 6. This
@@ -137,9 +132,9 @@ void destroy_graph(struct bt_object *obj)
 
        /*
         * Cancel the graph to disallow some operations, like creating
-        * notification iterators and adding ports to components.
+        * message iterators and adding ports to components.
         */
-       (void) bt_private_graph_cancel((void *) graph);
+       (void) bt_graph_cancel((void *) graph);
 
        /* Call all remove listeners */
        CALL_REMOVE_LISTENERS(struct bt_graph_listener_port_added,
@@ -150,30 +145,18 @@ void destroy_graph(struct bt_object *obj)
                graph->listeners.filter_input_port_added);
        CALL_REMOVE_LISTENERS(struct bt_graph_listener_port_added,
                graph->listeners.sink_input_port_added);
-       CALL_REMOVE_LISTENERS(struct bt_graph_listener_port_removed,
-               graph->listeners.source_output_port_removed);
-       CALL_REMOVE_LISTENERS(struct bt_graph_listener_port_removed,
-               graph->listeners.filter_output_port_removed);
-       CALL_REMOVE_LISTENERS(struct bt_graph_listener_port_removed,
-               graph->listeners.filter_input_port_removed);
-       CALL_REMOVE_LISTENERS(struct bt_graph_listener_port_removed,
-               graph->listeners.sink_input_port_removed);
        CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_connected,
                graph->listeners.source_filter_ports_connected);
+       CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_connected,
+               graph->listeners.filter_filter_ports_connected);
        CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_connected,
                graph->listeners.source_sink_ports_connected);
        CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_connected,
                graph->listeners.filter_sink_ports_connected);
-       CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_disconnected,
-               graph->listeners.source_filter_ports_disconnected);
-       CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_disconnected,
-               graph->listeners.source_sink_ports_disconnected);
-       CALL_REMOVE_LISTENERS(struct bt_graph_listener_ports_disconnected,
-               graph->listeners.filter_sink_ports_disconnected);
 
-       if (graph->notifications) {
-               g_ptr_array_free(graph->notifications, TRUE);
-               graph->notifications = NULL;
+       if (graph->messages) {
+               g_ptr_array_free(graph->messages, TRUE);
+               graph->messages = NULL;
        }
 
        if (graph->connections) {
@@ -213,32 +196,18 @@ void destroy_graph(struct bt_object *obj)
                graph->listeners.sink_input_port_added = NULL;
        }
 
-       if (graph->listeners.source_output_port_removed) {
-               g_array_free(graph->listeners.source_output_port_removed, TRUE);
-               graph->listeners.source_output_port_removed = NULL;
-       }
-
-       if (graph->listeners.filter_output_port_removed) {
-               g_array_free(graph->listeners.filter_output_port_removed, TRUE);
-               graph->listeners.filter_output_port_removed = NULL;
-       }
-
-       if (graph->listeners.filter_input_port_removed) {
-               g_array_free(graph->listeners.filter_input_port_removed, TRUE);
-               graph->listeners.filter_input_port_removed = NULL;
-       }
-
-       if (graph->listeners.sink_input_port_removed) {
-               g_array_free(graph->listeners.sink_input_port_removed, TRUE);
-               graph->listeners.sink_input_port_removed = NULL;
-       }
-
        if (graph->listeners.source_filter_ports_connected) {
                g_array_free(graph->listeners.source_filter_ports_connected,
                        TRUE);
                graph->listeners.source_filter_ports_connected = NULL;
        }
 
+       if (graph->listeners.filter_filter_ports_connected) {
+               g_array_free(graph->listeners.filter_filter_ports_connected,
+                       TRUE);
+               graph->listeners.filter_filter_ports_connected = NULL;
+       }
+
        if (graph->listeners.source_sink_ports_connected) {
                g_array_free(graph->listeners.source_sink_ports_connected,
                        TRUE);
@@ -251,58 +220,40 @@ void destroy_graph(struct bt_object *obj)
                graph->listeners.filter_sink_ports_connected = NULL;
        }
 
-       if (graph->listeners.source_filter_ports_disconnected) {
-               g_array_free(graph->listeners.source_filter_ports_disconnected,
-                       TRUE);
-               graph->listeners.source_filter_ports_disconnected = NULL;
-       }
-
-       if (graph->listeners.source_sink_ports_disconnected) {
-               g_array_free(graph->listeners.source_sink_ports_disconnected,
-                       TRUE);
-               graph->listeners.source_sink_ports_disconnected = NULL;
-       }
-
-       if (graph->listeners.filter_sink_ports_disconnected) {
-               g_array_free(graph->listeners.filter_sink_ports_disconnected,
-                       TRUE);
-               graph->listeners.filter_sink_ports_disconnected = NULL;
-       }
-
-       bt_object_pool_finalize(&graph->event_notif_pool);
-       bt_object_pool_finalize(&graph->packet_begin_notif_pool);
-       bt_object_pool_finalize(&graph->packet_end_notif_pool);
+       bt_object_pool_finalize(&graph->event_msg_pool);
+       bt_object_pool_finalize(&graph->packet_begin_msg_pool);
+       bt_object_pool_finalize(&graph->packet_end_msg_pool);
        g_free(graph);
 }
 
 static
-void destroy_notification_event(struct bt_notification *notif,
+void destroy_message_event(struct bt_message *msg,
                struct bt_graph *graph)
 {
-       bt_notification_event_destroy(notif);
+       bt_message_event_destroy(msg);
 }
 
 static
-void destroy_notification_packet_begin(struct bt_notification *notif,
+void destroy_message_packet_begin(struct bt_message *msg,
                struct bt_graph *graph)
 {
-       bt_notification_packet_begin_destroy(notif);
+       bt_message_packet_destroy(msg);
 }
 
 static
-void destroy_notification_packet_end(struct bt_notification *notif,
+void destroy_message_packet_end(struct bt_message *msg,
                struct bt_graph *graph)
 {
-       bt_notification_packet_end_destroy(notif);
+       bt_message_packet_destroy(msg);
 }
 
 static
-void notify_notification_graph_is_destroyed(struct bt_notification *notif)
+void notify_message_graph_is_destroyed(struct bt_message *msg)
 {
-       bt_notification_unlink_graph(notif);
+       bt_message_unlink_graph(msg);
 }
 
-struct bt_private_graph *bt_private_graph_create(void)
+struct bt_graph *bt_graph_create(void)
 {
        struct bt_graph *graph;
        int ret;
@@ -366,38 +317,6 @@ struct bt_private_graph *bt_private_graph_create(void)
                goto error;
        }
 
-       INIT_LISTENERS_ARRAY(struct bt_graph_listener_port_removed,
-               graph->listeners.source_output_port_removed);
-
-       if (!graph->listeners.source_output_port_removed) {
-               ret = -1;
-               goto error;
-       }
-
-       INIT_LISTENERS_ARRAY(struct bt_graph_listener_port_removed,
-               graph->listeners.filter_output_port_removed);
-
-       if (!graph->listeners.filter_output_port_removed) {
-               ret = -1;
-               goto error;
-       }
-
-       INIT_LISTENERS_ARRAY(struct bt_graph_listener_port_removed,
-               graph->listeners.filter_input_port_removed);
-
-       if (!graph->listeners.filter_input_port_removed) {
-               ret = -1;
-               goto error;
-       }
-
-       INIT_LISTENERS_ARRAY(struct bt_graph_listener_port_removed,
-               graph->listeners.sink_input_port_removed);
-
-       if (!graph->listeners.sink_input_port_removed) {
-               ret = -1;
-               goto error;
-       }
-
        INIT_LISTENERS_ARRAY(struct bt_graph_listener_ports_connected,
                graph->listeners.source_filter_ports_connected);
 
@@ -415,69 +334,53 @@ struct bt_private_graph *bt_private_graph_create(void)
        }
 
        INIT_LISTENERS_ARRAY(struct bt_graph_listener_ports_connected,
-               graph->listeners.filter_sink_ports_connected);
-
-       if (!graph->listeners.filter_sink_ports_connected) {
-               ret = -1;
-               goto error;
-       }
-
-       INIT_LISTENERS_ARRAY(struct bt_graph_listener_ports_disconnected,
-               graph->listeners.source_filter_ports_disconnected);
-
-       if (!graph->listeners.source_filter_ports_disconnected) {
-               ret = -1;
-               goto error;
-       }
-
-       INIT_LISTENERS_ARRAY(struct bt_graph_listener_ports_disconnected,
-               graph->listeners.source_sink_ports_disconnected);
+               graph->listeners.filter_filter_ports_connected);
 
-       if (!graph->listeners.source_sink_ports_disconnected) {
+       if (!graph->listeners.filter_filter_ports_connected) {
                ret = -1;
                goto error;
        }
 
-       INIT_LISTENERS_ARRAY(struct bt_graph_listener_ports_disconnected,
-               graph->listeners.filter_sink_ports_disconnected);
+       INIT_LISTENERS_ARRAY(struct bt_graph_listener_ports_connected,
+               graph->listeners.filter_sink_ports_connected);
 
-       if (!graph->listeners.filter_sink_ports_disconnected) {
+       if (!graph->listeners.filter_sink_ports_connected) {
                ret = -1;
                goto error;
        }
 
-       ret = bt_object_pool_initialize(&graph->event_notif_pool,
-               (bt_object_pool_new_object_func) bt_notification_event_new,
-               (bt_object_pool_destroy_object_func) destroy_notification_event,
+       ret = bt_object_pool_initialize(&graph->event_msg_pool,
+               (bt_object_pool_new_object_func) bt_message_event_new,
+               (bt_object_pool_destroy_object_func) destroy_message_event,
                graph);
        if (ret) {
-               BT_LOGE("Failed to initialize event notification pool: ret=%d",
+               BT_LOGE("Failed to initialize event message pool: ret=%d",
                        ret);
                goto error;
        }
 
-       ret = bt_object_pool_initialize(&graph->packet_begin_notif_pool,
-               (bt_object_pool_new_object_func) bt_notification_packet_begin_new,
-               (bt_object_pool_destroy_object_func) destroy_notification_packet_begin,
+       ret = bt_object_pool_initialize(&graph->packet_begin_msg_pool,
+               (bt_object_pool_new_object_func) bt_message_packet_beginning_new,
+               (bt_object_pool_destroy_object_func) destroy_message_packet_begin,
                graph);
        if (ret) {
-               BT_LOGE("Failed to initialize packet beginning notification pool: ret=%d",
+               BT_LOGE("Failed to initialize packet beginning message pool: ret=%d",
                        ret);
                goto error;
        }
 
-       ret = bt_object_pool_initialize(&graph->packet_end_notif_pool,
-               (bt_object_pool_new_object_func) bt_notification_packet_end_new,
-               (bt_object_pool_destroy_object_func) destroy_notification_packet_end,
+       ret = bt_object_pool_initialize(&graph->packet_end_msg_pool,
+               (bt_object_pool_new_object_func) bt_message_packet_end_new,
+               (bt_object_pool_destroy_object_func) destroy_message_packet_end,
                graph);
        if (ret) {
-               BT_LOGE("Failed to initialize packet end notification pool: ret=%d",
+               BT_LOGE("Failed to initialize packet end message pool: ret=%d",
                        ret);
                goto error;
        }
 
-       graph->notifications = g_ptr_array_new_with_free_func(
-               (GDestroyNotify) notify_notification_graph_is_destroyed);
+       graph->messages = g_ptr_array_new_with_free_func(
+               (GDestroyNotify) notify_message_graph_is_destroyed);
        BT_LIB_LOGD("Created graph object: %!+g", graph);
 
 end:
@@ -488,14 +391,14 @@ error:
        goto end;
 }
 
-enum bt_graph_status bt_private_graph_connect_ports(
-               struct bt_private_graph *priv_graph,
-               struct bt_port_output *upstream_port_out,
-               struct bt_port_input *downstream_port_in,
-               struct bt_connection **user_connection)
+enum bt_graph_status bt_graph_connect_ports(
+               struct bt_graph *graph,
+               const struct bt_port_output *upstream_port_out,
+               const struct bt_port_input *downstream_port_in,
+               const struct bt_connection **user_connection)
 {
-       struct bt_graph *graph = (void *) priv_graph;
        enum bt_graph_status status = BT_GRAPH_STATUS_OK;
+       enum bt_graph_listener_status listener_status;
        struct bt_connection *connection = NULL;
        struct bt_port *upstream_port = (void *) upstream_port_out;
        struct bt_port *downstream_port = (void *) downstream_port_in;
@@ -508,14 +411,17 @@ enum bt_graph_status bt_private_graph_connect_ports(
        BT_ASSERT_PRE_NON_NULL(upstream_port, "Upstream port");
        BT_ASSERT_PRE_NON_NULL(downstream_port, "Downstream port port");
        BT_ASSERT_PRE(!graph->canceled, "Graph is canceled: %!+g", graph);
+       BT_ASSERT_PRE(
+               graph->config_state == BT_GRAPH_CONFIGURATION_STATE_CONFIGURING,
+               "Graph is not in the \"configuring\" state: %!+g", graph);
        BT_ASSERT_PRE(!bt_port_is_connected(upstream_port),
                "Upstream port is already connected: %!+p", upstream_port);
        BT_ASSERT_PRE(!bt_port_is_connected(downstream_port),
                "Downstream port is already connected: %!+p", downstream_port);
-       BT_ASSERT_PRE(bt_port_borrow_component((void *) upstream_port),
+       BT_ASSERT_PRE(bt_port_borrow_component_inline((void *) upstream_port),
                "Upstream port does not belong to a component: %!+p",
                upstream_port);
-       BT_ASSERT_PRE(bt_port_borrow_component((void *) downstream_port),
+       BT_ASSERT_PRE(bt_port_borrow_component_inline((void *) downstream_port),
                "Downstream port does not belong to a component: %!+p",
                downstream_port);
        init_can_consume = graph->can_consume;
@@ -523,9 +429,9 @@ enum bt_graph_status bt_private_graph_connect_ports(
                "%![graph-]+g, %![up-port-]+p, %![down-port-]+p",
                graph, upstream_port, downstream_port);
        bt_graph_set_can_consume(graph, false);
-       upstream_component = bt_port_borrow_component(
+       upstream_component = bt_port_borrow_component_inline(
                (void *) upstream_port);
-       downstream_component = bt_port_borrow_component(
+       downstream_component = bt_port_borrow_component_inline(
                (void *) downstream_port);
 
        /*
@@ -627,7 +533,12 @@ enum bt_graph_status bt_private_graph_connect_ports(
         * Notify the graph's creator that both ports are connected.
         */
        BT_LOGD_STR("Notifying graph's user that new component ports are connected.");
-       bt_graph_notify_ports_connected(graph, upstream_port, downstream_port);
+       listener_status = bt_graph_notify_ports_connected(graph, upstream_port, downstream_port);
+       if (listener_status != BT_GRAPH_LISTENER_STATUS_OK) {
+               status = (int) listener_status;
+               goto end;
+       }
+
        connection->notified_graph_ports_connected = true;
        BT_LIB_LOGD("Connected component ports within graph: "
                "%![graph-]+g, %![up-comp-]+c, %![down-comp-]+c, "
@@ -642,6 +553,10 @@ enum bt_graph_status bt_private_graph_connect_ports(
        }
 
 end:
+       if (status != BT_GRAPH_STATUS_OK) {
+               bt_graph_make_faulty(graph);
+       }
+
        bt_object_put_ref(connection);
        (void) init_can_consume;
        bt_graph_set_can_consume(graph, init_can_consume);
@@ -771,32 +686,47 @@ end:
        return status;
 }
 
-enum bt_graph_status bt_private_graph_consume(
-               struct bt_private_graph *priv_graph)
+enum bt_graph_status bt_graph_consume(struct bt_graph *graph)
 {
-       struct bt_graph *graph = (void *) priv_graph;
        enum bt_graph_status status;
 
        BT_ASSERT_PRE_NON_NULL(graph, "Graph");
        BT_ASSERT_PRE(!graph->canceled, "Graph is canceled: %!+g", graph);
        BT_ASSERT_PRE(graph->can_consume,
                "Cannot consume graph in its current state: %!+g", graph);
-       bt_graph_set_can_consume(graph, BT_FALSE);
+       BT_ASSERT_PRE(graph->config_state != BT_GRAPH_CONFIGURATION_STATE_FAULTY,
+               "Graph is in a faulty state: %!+g", graph);
+       bt_graph_set_can_consume(graph, false);
+       status = bt_graph_configure(graph);
+       if (unlikely(status)) {
+               /* bt_graph_configure() logs errors */
+               goto end;
+       }
+
        status = consume_no_check(graph);
-       bt_graph_set_can_consume(graph, BT_TRUE);
+       bt_graph_set_can_consume(graph, true);
+
+end:
        return status;
 }
 
-enum bt_graph_status bt_private_graph_run(struct bt_private_graph *priv_graph)
+enum bt_graph_status bt_graph_run(struct bt_graph *graph)
 {
-       struct bt_graph *graph = (void *) priv_graph;
-       enum bt_graph_status status = BT_GRAPH_STATUS_OK;
+       enum bt_graph_status status;
 
        BT_ASSERT_PRE_NON_NULL(graph, "Graph");
        BT_ASSERT_PRE(!graph->canceled, "Graph is canceled: %!+g", graph);
        BT_ASSERT_PRE(graph->can_consume,
                "Cannot consume graph in its current state: %!+g", graph);
-       bt_graph_set_can_consume(graph, BT_FALSE);
+       BT_ASSERT_PRE(graph->config_state != BT_GRAPH_CONFIGURATION_STATE_FAULTY,
+               "Graph is in a faulty state: %!+g", graph);
+       bt_graph_set_can_consume(graph, false);
+       status = bt_graph_configure(graph);
+       if (unlikely(status)) {
+               /* bt_graph_configure() logs errors */
+               goto end;
+       }
+
        BT_LIB_LOGV("Running graph: %!+g", graph);
 
        do {
@@ -822,15 +752,13 @@ enum bt_graph_status bt_private_graph_run(struct bt_private_graph *priv_graph)
                         *
                         * However, in the case where a single sink is
                         * left, the caller can decide to busy-wait and
-                        * call bt_private_graph_run() continuously
+                        * call bt_graph_run() continuously
                         * until the source is ready or it can decide to
                         * sleep for an arbitrary amount of time.
                         */
                        if (graph->sinks_to_consume->length > 1) {
                                status = BT_GRAPH_STATUS_OK;
                        }
-               } else if (status == BT_GRAPH_STATUS_NO_SINK) {
-                       goto end;
                }
        } while (status == BT_GRAPH_STATUS_OK);
 
@@ -841,18 +769,17 @@ enum bt_graph_status bt_private_graph_run(struct bt_private_graph *priv_graph)
 end:
        BT_LIB_LOGV("Graph ran: %![graph-]+g, status=%s", graph,
                bt_graph_status_string(status));
-       bt_graph_set_can_consume(graph, BT_TRUE);
+       bt_graph_set_can_consume(graph, true);
        return status;
 }
 
 enum bt_graph_status
-bt_private_graph_add_source_component_output_port_added_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_source_component_output_port_added_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_source_component_output_port_added_listener(
+               struct bt_graph *graph,
+               bt_graph_source_component_output_port_added_listener_func func,
+               bt_graph_listener_removed_func listener_removed, void *data,
                int *out_listener_id)
 {
-       struct bt_graph *graph = (void *) priv_graph;
        struct bt_graph_listener_port_added listener = {
                .base = {
                        .removed = listener_removed,
@@ -882,13 +809,12 @@ bt_private_graph_add_source_component_output_port_added_listener(
 }
 
 enum bt_graph_status
-bt_private_graph_add_filter_component_output_port_added_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_filter_component_output_port_added_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_filter_component_output_port_added_listener(
+               struct bt_graph *graph,
+               bt_graph_filter_component_output_port_added_listener_func func,
+               bt_graph_listener_removed_func listener_removed, void *data,
                int *out_listener_id)
 {
-       struct bt_graph *graph = (void *) priv_graph;
        struct bt_graph_listener_port_added listener = {
                .base = {
                        .removed = listener_removed,
@@ -918,13 +844,12 @@ bt_private_graph_add_filter_component_output_port_added_listener(
 }
 
 enum bt_graph_status
-bt_private_graph_add_filter_component_input_port_added_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_filter_component_input_port_added_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_filter_component_input_port_added_listener(
+               struct bt_graph *graph,
+               bt_graph_filter_component_input_port_added_listener_func func,
+               bt_graph_listener_removed_func listener_removed, void *data,
                int *out_listener_id)
 {
-       struct bt_graph *graph = (void *) priv_graph;
        struct bt_graph_listener_port_added listener = {
                .base = {
                        .removed = listener_removed,
@@ -954,13 +879,12 @@ bt_private_graph_add_filter_component_input_port_added_listener(
 }
 
 enum bt_graph_status
-bt_private_graph_add_sink_component_input_port_added_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_sink_component_input_port_added_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_sink_component_input_port_added_listener(
+               struct bt_graph *graph,
+               bt_graph_sink_component_input_port_added_listener_func func,
+               bt_graph_listener_removed_func listener_removed, void *data,
                int *out_listener_id)
 {
-       struct bt_graph *graph = (void *) priv_graph;
        struct bt_graph_listener_port_added listener = {
                .base = {
                        .removed = listener_removed,
@@ -990,157 +914,12 @@ bt_private_graph_add_sink_component_input_port_added_listener(
 }
 
 enum bt_graph_status
-bt_private_graph_add_source_component_output_port_removed_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_source_component_output_port_removed_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
-               int *out_listener_id)
-{
-       struct bt_graph *graph = (void *) priv_graph;
-       struct bt_graph_listener_port_removed listener = {
-               .base = {
-                       .removed = listener_removed,
-                       .data = data,
-               },
-               .func = (port_removed_func_t) func,
-       };
-       int listener_id;
-
-       BT_ASSERT_PRE_NON_NULL(graph, "Graph");
-       BT_ASSERT_PRE_NON_NULL(func, "Listener");
-       BT_ASSERT_PRE_NON_NULL(func, "\"Listener removed\" listener");
-       BT_ASSERT_PRE(!graph->in_remove_listener,
-               "Graph currently executing a \"listener removed\" listener: "
-               "%!+g", graph);
-       g_array_append_val(graph->listeners.source_output_port_removed, listener);
-       listener_id = graph->listeners.source_output_port_removed->len - 1;
-       BT_LIB_LOGV("Added \"source component output port removed\" listener to graph: "
-               "%![graph-]+g, listener-addr=%p, id=%d", graph, listener,
-               listener_id);
-
-       if (listener_id) {
-               *out_listener_id = listener_id;
-       }
-
-       return BT_GRAPH_STATUS_OK;
-}
-
-enum bt_graph_status
-bt_private_graph_add_filter_component_output_port_removed_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_filter_component_output_port_removed_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
-               int *out_listener_id)
-{
-       struct bt_graph *graph = (void *) priv_graph;
-       struct bt_graph_listener_port_removed listener = {
-               .base = {
-                       .removed = listener_removed,
-                       .data = data,
-               },
-               .func = (port_removed_func_t) func,
-       };
-       int listener_id;
-
-       BT_ASSERT_PRE_NON_NULL(graph, "Graph");
-       BT_ASSERT_PRE_NON_NULL(func, "Listener");
-       BT_ASSERT_PRE_NON_NULL(func, "\"Listener removed\" listener");
-       BT_ASSERT_PRE(!graph->in_remove_listener,
-               "Graph currently executing a \"listener removed\" listener: "
-               "%!+g", graph);
-       g_array_append_val(graph->listeners.filter_output_port_removed, listener);
-       listener_id = graph->listeners.filter_output_port_removed->len - 1;
-       BT_LIB_LOGV("Added \"filter component output port removed\" listener to graph: "
-               "%![graph-]+g, listener-addr=%p, id=%d", graph, listener,
-               listener_id);
-
-       if (listener_id) {
-               *out_listener_id = listener_id;
-       }
-
-       return BT_GRAPH_STATUS_OK;
-}
-
-enum bt_graph_status
-bt_private_graph_add_filter_component_input_port_removed_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_filter_component_input_port_removed_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
-               int *out_listener_id)
-{
-       struct bt_graph *graph = (void *) priv_graph;
-       struct bt_graph_listener_port_removed listener = {
-               .base = {
-                       .removed = listener_removed,
-                       .data = data,
-               },
-               .func = (port_removed_func_t) func,
-       };
-       int listener_id;
-
-       BT_ASSERT_PRE_NON_NULL(graph, "Graph");
-       BT_ASSERT_PRE_NON_NULL(func, "Listener");
-       BT_ASSERT_PRE_NON_NULL(func, "\"Listener removed\" listener");
-       BT_ASSERT_PRE(!graph->in_remove_listener,
-               "Graph currently executing a \"listener removed\" listener: "
-               "%!+g", graph);
-       g_array_append_val(graph->listeners.filter_input_port_removed, listener);
-       listener_id = graph->listeners.filter_input_port_removed->len - 1;
-       BT_LIB_LOGV("Added \"filter component input port removed\" listener to graph: "
-               "%![graph-]+g, listener-addr=%p, id=%d", graph, listener,
-               listener_id);
-
-       if (listener_id) {
-               *out_listener_id = listener_id;
-       }
-
-       return BT_GRAPH_STATUS_OK;
-}
-
-enum bt_graph_status
-bt_private_graph_add_sink_component_input_port_removed_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_sink_component_input_port_removed_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
-               int *out_listener_id)
-{
-       struct bt_graph *graph = (void *) priv_graph;
-       struct bt_graph_listener_port_removed listener = {
-               .base = {
-                       .removed = listener_removed,
-                       .data = data,
-               },
-               .func = (port_removed_func_t) func,
-       };
-       int listener_id;
-
-       BT_ASSERT_PRE_NON_NULL(graph, "Graph");
-       BT_ASSERT_PRE_NON_NULL(func, "Listener");
-       BT_ASSERT_PRE_NON_NULL(func, "\"Listener removed\" listener");
-       BT_ASSERT_PRE(!graph->in_remove_listener,
-               "Graph currently executing a \"listener removed\" listener: "
-               "%!+g", graph);
-       g_array_append_val(graph->listeners.sink_input_port_removed, listener);
-       listener_id = graph->listeners.sink_input_port_removed->len - 1;
-       BT_LIB_LOGV("Added \"sink component input port removed\" listener to graph: "
-               "%![graph-]+g, listener-addr=%p, id=%d", graph, listener,
-               listener_id);
-
-       if (listener_id) {
-               *out_listener_id = listener_id;
-       }
-
-       return BT_GRAPH_STATUS_OK;
-}
-
-enum bt_graph_status
-bt_private_graph_add_source_filter_component_ports_connected_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_source_filter_component_ports_connected_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_source_filter_component_ports_connected_listener(
+               struct bt_graph *graph,
+               bt_graph_source_filter_component_ports_connected_listener_func func,
+               bt_graph_listener_removed_func listener_removed, void *data,
                int *out_listener_id)
 {
-       struct bt_graph *graph = (void *) priv_graph;
        struct bt_graph_listener_ports_connected listener = {
                .base = {
                        .removed = listener_removed,
@@ -1171,13 +950,12 @@ bt_private_graph_add_source_filter_component_ports_connected_listener(
 }
 
 enum bt_graph_status
-bt_private_graph_add_source_sink_component_ports_connected_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_source_sink_component_ports_connected_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_source_sink_component_ports_connected_listener(
+               struct bt_graph *graph,
+               bt_graph_source_sink_component_ports_connected_listener_func func,
+               bt_graph_listener_removed_func listener_removed, void *data,
                int *out_listener_id)
 {
-       struct bt_graph *graph = (void *) priv_graph;
        struct bt_graph_listener_ports_connected listener = {
                .base = {
                        .removed = listener_removed,
@@ -1208,13 +986,12 @@ bt_private_graph_add_source_sink_component_ports_connected_listener(
 }
 
 enum bt_graph_status
-bt_private_graph_add_filter_sink_component_ports_connected_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_filter_sink_component_ports_connected_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_filter_filter_component_ports_connected_listener(
+               struct bt_graph *graph,
+               bt_graph_filter_filter_component_ports_connected_listener_func func,
+               bt_graph_listener_removed_func listener_removed, void *data,
                int *out_listener_id)
 {
-       struct bt_graph *graph = (void *) priv_graph;
        struct bt_graph_listener_ports_connected listener = {
                .base = {
                        .removed = listener_removed,
@@ -1230,84 +1007,10 @@ bt_private_graph_add_filter_sink_component_ports_connected_listener(
        BT_ASSERT_PRE(!graph->in_remove_listener,
                "Graph currently executing a \"listener removed\" listener: "
                "%!+g", graph);
-       g_array_append_val(graph->listeners.filter_sink_ports_connected,
-               listener);
-       listener_id = graph->listeners.filter_sink_ports_connected->len - 1;
-       BT_LIB_LOGV("Added \"filter to sink component ports connected\" listener to graph: "
-               "%![graph-]+g, listener-addr=%p, id=%d", graph, listener,
-               listener_id);
-
-       if (listener_id) {
-               *out_listener_id = listener_id;
-       }
-
-       return BT_GRAPH_STATUS_OK;
-}
-
-enum bt_graph_status
-bt_private_graph_add_source_filter_component_ports_disconnected_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_source_filter_component_ports_disconnected_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
-               int *out_listener_id)
-{
-       struct bt_graph *graph = (void *) priv_graph;
-       struct bt_graph_listener_ports_disconnected listener = {
-               .base = {
-                       .removed = listener_removed,
-                       .data = data,
-               },
-               .func = (ports_disconnected_func_t) func,
-       };
-       int listener_id;
-
-       BT_ASSERT_PRE_NON_NULL(graph, "Graph");
-       BT_ASSERT_PRE_NON_NULL(func, "Listener");
-       BT_ASSERT_PRE_NON_NULL(func, "\"Listener removed\" listener");
-       BT_ASSERT_PRE(!graph->in_remove_listener,
-               "Graph currently executing a \"listener removed\" listener: "
-               "%!+g", graph);
-       g_array_append_val(graph->listeners.source_filter_ports_disconnected,
-               listener);
-       listener_id = graph->listeners.source_filter_ports_disconnected->len - 1;
-       BT_LIB_LOGV("Added \"source to filter component ports disconnected\" listener to graph: "
-               "%![graph-]+g, listener-addr=%p, id=%d", graph, listener,
-               listener_id);
-
-       if (listener_id) {
-               *out_listener_id = listener_id;
-       }
-
-       return BT_GRAPH_STATUS_OK;
-}
-
-enum bt_graph_status
-bt_private_graph_add_source_sink_component_ports_disconnected_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_source_sink_component_ports_disconnected_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
-               int *out_listener_id)
-{
-       struct bt_graph *graph = (void *) priv_graph;
-       struct bt_graph_listener_ports_disconnected listener = {
-               .base = {
-                       .removed = listener_removed,
-                       .data = data,
-               },
-               .func = (ports_disconnected_func_t) func,
-       };
-       int listener_id;
-
-       BT_ASSERT_PRE_NON_NULL(graph, "Graph");
-       BT_ASSERT_PRE_NON_NULL(func, "Listener");
-       BT_ASSERT_PRE_NON_NULL(func, "\"Listener removed\" listener");
-       BT_ASSERT_PRE(!graph->in_remove_listener,
-               "Graph currently executing a \"listener removed\" listener: "
-               "%!+g", graph);
-       g_array_append_val(graph->listeners.source_sink_ports_disconnected,
+       g_array_append_val(graph->listeners.filter_filter_ports_connected,
                listener);
-       listener_id = graph->listeners.source_sink_ports_disconnected->len - 1;
-       BT_LIB_LOGV("Added \"source to sink component ports disconnected\" listener to graph: "
+       listener_id = graph->listeners.filter_filter_ports_connected->len - 1;
+       BT_LIB_LOGV("Added \"filter to filter component ports connected\" listener to graph: "
                "%![graph-]+g, listener-addr=%p, id=%d", graph, listener,
                listener_id);
 
@@ -1319,19 +1022,18 @@ bt_private_graph_add_source_sink_component_ports_disconnected_listener(
 }
 
 enum bt_graph_status
-bt_private_graph_add_filter_sink_component_ports_disconnected_listener(
-               struct bt_private_graph *priv_graph,
-               bt_private_graph_filter_sink_component_ports_disconnected_listener func,
-               bt_private_graph_listener_removed listener_removed, void *data,
+bt_graph_add_filter_sink_component_ports_connected_listener(
+               struct bt_graph *graph,
+               bt_graph_filter_sink_component_ports_connected_listener_func func,
+               bt_graph_listener_removed_func listener_removed, void *data,
                int *out_listener_id)
 {
-       struct bt_graph *graph = (void *) priv_graph;
-       struct bt_graph_listener_ports_disconnected listener = {
+       struct bt_graph_listener_ports_connected listener = {
                .base = {
                        .removed = listener_removed,
                        .data = data,
                },
-               .func = (ports_disconnected_func_t) func,
+               .func = (ports_connected_func_t) func,
        };
        int listener_id;
 
@@ -1341,10 +1043,10 @@ bt_private_graph_add_filter_sink_component_ports_disconnected_listener(
        BT_ASSERT_PRE(!graph->in_remove_listener,
                "Graph currently executing a \"listener removed\" listener: "
                "%!+g", graph);
-       g_array_append_val(graph->listeners.filter_sink_ports_disconnected,
+       g_array_append_val(graph->listeners.filter_sink_ports_connected,
                listener);
-       listener_id = graph->listeners.filter_sink_ports_disconnected->len - 1;
-       BT_LIB_LOGV("Added \"filter to sink component ports disconnected\" listener to graph: "
+       listener_id = graph->listeners.filter_sink_ports_connected->len - 1;
+       BT_LIB_LOGV("Added \"filter to sink component ports connected\" listener to graph: "
                "%![graph-]+g, listener-addr=%p, id=%d", graph, listener,
                listener_id);
 
@@ -1356,17 +1058,19 @@ bt_private_graph_add_filter_sink_component_ports_disconnected_listener(
 }
 
 BT_HIDDEN
-void bt_graph_notify_port_added(struct bt_graph *graph, struct bt_port *port)
+enum bt_graph_listener_status bt_graph_notify_port_added(
+               struct bt_graph *graph, struct bt_port *port)
 {
        uint64_t i;
        GArray *listeners;
        struct bt_component *comp;
+       enum bt_graph_listener_status status = BT_GRAPH_LISTENER_STATUS_OK;
 
        BT_ASSERT(graph);
        BT_ASSERT(port);
        BT_LIB_LOGV("Notifying graph listeners that a port was added: "
                "%![graph-]+g, %![port-]+p", graph, port);
-       comp = bt_port_borrow_component(port);
+       comp = bt_port_borrow_component_inline(port);
        BT_ASSERT(comp);
 
        switch (comp->class->type) {
@@ -1418,85 +1122,28 @@ void bt_graph_notify_port_added(struct bt_graph *graph, struct bt_port *port)
                        &g_array_index(listeners,
                                struct bt_graph_listener_port_added, i);
 
-               BT_ASSERT(listener->func);
-               listener->func(comp, port, listener->base.data);
-       }
-}
 
-BT_HIDDEN
-void bt_graph_notify_port_removed(struct bt_graph *graph,
-               struct bt_component *comp, struct bt_port *port)
-{
-       uint64_t i;
-       GArray *listeners;
-
-       BT_ASSERT(graph);
-       BT_ASSERT(port);
-       BT_LIB_LOGV("Notifying graph listeners that a port was removed: "
-               "%![graph-]+g, %![comp-]+c, %![port-]+p", graph, comp, port);
-
-       switch (comp->class->type) {
-       case BT_COMPONENT_CLASS_TYPE_SOURCE:
-       {
-               switch (port->type) {
-               case BT_PORT_TYPE_OUTPUT:
-                       listeners = graph->listeners.source_output_port_removed;
-                       break;
-               default:
-                       abort();
-               }
-
-               break;
-       }
-       case BT_COMPONENT_CLASS_TYPE_FILTER:
-       {
-               switch (port->type) {
-               case BT_PORT_TYPE_INPUT:
-                       listeners = graph->listeners.filter_input_port_removed;
-                       break;
-               case BT_PORT_TYPE_OUTPUT:
-                       listeners = graph->listeners.filter_output_port_removed;
-                       break;
-               default:
-                       abort();
-               }
-
-               break;
-       }
-       case BT_COMPONENT_CLASS_TYPE_SINK:
-       {
-               switch (port->type) {
-               case BT_PORT_TYPE_INPUT:
-                       listeners = graph->listeners.sink_input_port_removed;
-                       break;
-               default:
-                       abort();
+               BT_ASSERT(listener->func);
+               status = listener->func(comp, port, listener->base.data);
+               if (status != BT_GRAPH_LISTENER_STATUS_OK) {
+                       goto end;
                }
-
-               break;
-       }
-       default:
-               abort();
        }
 
-       for (i = 0; i < listeners->len; i++) {
-               struct bt_graph_listener_port_removed *listener =
-                       &g_array_index(listeners,
-                               struct bt_graph_listener_port_removed, i);
-
-               BT_ASSERT(listener->func);
-               listener->func(comp, port, listener->base.data);
-       }
+end:
+       return status;
 }
 
 BT_HIDDEN
-void bt_graph_notify_ports_connected(struct bt_graph *graph,
-               struct bt_port *upstream_port, struct bt_port *downstream_port)
+enum bt_graph_listener_status bt_graph_notify_ports_connected(
+               struct bt_graph *graph, struct bt_port *upstream_port,
+               struct bt_port *downstream_port)
 {
        uint64_t i;
        GArray *listeners;
        struct bt_component *upstream_comp;
        struct bt_component *downstream_comp;
+       enum bt_graph_listener_status status = BT_GRAPH_LISTENER_STATUS_OK;
 
        BT_ASSERT(graph);
        BT_ASSERT(upstream_port);
@@ -1504,9 +1151,9 @@ void bt_graph_notify_ports_connected(struct bt_graph *graph,
        BT_LIB_LOGV("Notifying graph listeners that ports were connected: "
                "%![graph-]+g, %![up-port-]+p, %![down-port-]+p",
                graph, upstream_port, downstream_port);
-       upstream_comp = bt_port_borrow_component(upstream_port);
+       upstream_comp = bt_port_borrow_component_inline(upstream_port);
        BT_ASSERT(upstream_comp);
-       downstream_comp = bt_port_borrow_component(downstream_port);
+       downstream_comp = bt_port_borrow_component_inline(downstream_port);
        BT_ASSERT(downstream_comp);
 
        switch (upstream_comp->class->type) {
@@ -1530,6 +1177,10 @@ void bt_graph_notify_ports_connected(struct bt_graph *graph,
        case BT_COMPONENT_CLASS_TYPE_FILTER:
        {
                switch (downstream_comp->class->type) {
+               case BT_COMPONENT_CLASS_TYPE_FILTER:
+                       listeners =
+                               graph->listeners.filter_filter_ports_connected;
+                       break;
                case BT_COMPONENT_CLASS_TYPE_SINK:
                        listeners =
                                graph->listeners.filter_sink_ports_connected;
@@ -1550,82 +1201,19 @@ void bt_graph_notify_ports_connected(struct bt_graph *graph,
                                struct bt_graph_listener_ports_connected, i);
 
                BT_ASSERT(listener->func);
-               listener->func(upstream_comp, downstream_comp,
+               status = listener->func(upstream_comp, downstream_comp,
                        upstream_port, downstream_port, listener->base.data);
-       }
-}
-
-BT_HIDDEN
-void bt_graph_notify_ports_disconnected(struct bt_graph *graph,
-               struct bt_component *upstream_comp,
-               struct bt_component *downstream_comp,
-               struct bt_port *upstream_port,
-               struct bt_port *downstream_port)
-{
-       uint64_t i;
-       GArray *listeners;
-
-       BT_ASSERT(graph);
-       BT_ASSERT(upstream_comp);
-       BT_ASSERT(downstream_comp);
-       BT_ASSERT(upstream_port);
-       BT_ASSERT(downstream_port);
-       BT_LIB_LOGV("Notifying graph listeners that ports were disconnected: "
-               "%![graph-]+g, %![up-port-]+p, %![down-port-]+p, "
-               "%![up-comp-]+c, %![down-comp-]+c",
-               graph, upstream_port, downstream_port, upstream_comp,
-               downstream_comp);
-
-       switch (upstream_comp->class->type) {
-       case BT_COMPONENT_CLASS_TYPE_SOURCE:
-       {
-               switch (downstream_comp->class->type) {
-               case BT_COMPONENT_CLASS_TYPE_FILTER:
-                       listeners =
-                               graph->listeners.source_filter_ports_disconnected;
-                       break;
-               case BT_COMPONENT_CLASS_TYPE_SINK:
-                       listeners =
-                               graph->listeners.source_sink_ports_disconnected;
-                       break;
-               default:
-                       abort();
-               }
-
-               break;
-       }
-       case BT_COMPONENT_CLASS_TYPE_FILTER:
-       {
-               switch (downstream_comp->class->type) {
-               case BT_COMPONENT_CLASS_TYPE_SINK:
-                       listeners =
-                               graph->listeners.filter_sink_ports_disconnected;
-                       break;
-               default:
-                       abort();
+               if (status != BT_GRAPH_LISTENER_STATUS_OK) {
+                       goto end;
                }
-
-               break;
-       }
-       default:
-               abort();
        }
 
-       for (i = 0; i < listeners->len; i++) {
-               struct bt_graph_listener_ports_disconnected *listener =
-                       &g_array_index(listeners,
-                               struct bt_graph_listener_ports_disconnected, i);
-
-               BT_ASSERT(listener->func);
-               listener->func(upstream_comp, downstream_comp,
-                       upstream_port, downstream_port, listener->base.data);
-       }
+end:
+       return status;
 }
 
-enum bt_graph_status bt_private_graph_cancel(
-               struct bt_private_graph *priv_graph)
+enum bt_graph_status bt_graph_cancel(struct bt_graph *graph)
 {
-       struct bt_graph *graph = (void *) priv_graph;
 
        BT_ASSERT_PRE_NON_NULL(graph, "Graph");
        graph->canceled = true;
@@ -1633,7 +1221,7 @@ enum bt_graph_status bt_private_graph_cancel(
        return BT_GRAPH_STATUS_OK;
 }
 
-bt_bool bt_graph_is_canceled(struct bt_graph *graph)
+bt_bool bt_graph_is_canceled(const struct bt_graph *graph)
 {
        BT_ASSERT_PRE_NON_NULL(graph, "Graph");
        return graph->canceled ? BT_TRUE : BT_FALSE;
@@ -1675,28 +1263,30 @@ end:
 
 static
 enum bt_graph_status add_component_with_init_method_data(
-               struct bt_private_graph *priv_graph,
+               struct bt_graph *graph,
                struct bt_component_class *comp_cls,
                comp_init_method_t init_method,
-               const char *name, struct bt_value *params,
+               const char *name, const struct bt_value *params,
                void *init_method_data, struct bt_component **user_component)
 {
-       struct bt_graph *graph = (void *) priv_graph;
        enum bt_graph_status graph_status = BT_GRAPH_STATUS_OK;
        enum bt_self_component_status comp_status;
        struct bt_component *component = NULL;
        int ret;
        bool init_can_consume;
+       struct bt_value *new_params = NULL;
 
        BT_ASSERT(comp_cls);
        BT_ASSERT_PRE_NON_NULL(graph, "Graph");
        BT_ASSERT_PRE_NON_NULL(name, "Name");
        BT_ASSERT_PRE(!graph->canceled, "Graph is canceled: %!+g", graph);
+       BT_ASSERT_PRE(
+               graph->config_state == BT_GRAPH_CONFIGURATION_STATE_CONFIGURING,
+               "Graph is not in the \"configuring\" state: %!+g", graph);
        BT_ASSERT_PRE(!component_name_exists(graph, name),
                "Duplicate component name: %!+g, name=\"%s\"", graph, name);
        BT_ASSERT_PRE(!params || bt_value_is_map(params),
                "Parameter value is not a map value: %!+v", params);
-       bt_object_get_ref(params);
        init_can_consume = graph->can_consume;
        bt_graph_set_can_consume(graph, false);
        BT_LIB_LOGD("Adding component to graph: "
@@ -1705,13 +1295,14 @@ enum bt_graph_status add_component_with_init_method_data(
                graph, comp_cls, name, params, init_method_data);
 
        if (!params) {
-               params = bt_private_value_borrow_value(
-                       bt_private_value_map_create());
-               if (!params) {
+               new_params = bt_value_map_create();
+               if (!new_params) {
                        BT_LOGE_STR("Cannot create map value object.");
                        graph_status = BT_GRAPH_STATUS_NOMEM;
                        goto end;
                }
+
+               params = new_params;
        }
 
        ret = bt_component_create(comp_cls, name, &component);
@@ -1729,6 +1320,7 @@ enum bt_graph_status add_component_with_init_method_data(
         */
        g_ptr_array_add(graph->components, component);
        bt_component_set_graph(component, graph);
+       bt_value_freeze(params);
 
        if (init_method) {
                BT_LOGD_STR("Calling user's initialization method.");
@@ -1777,19 +1369,24 @@ enum bt_graph_status add_component_with_init_method_data(
        }
 
 end:
+       if (graph_status != BT_GRAPH_STATUS_OK) {
+               bt_graph_make_faulty(graph);
+       }
+
        bt_object_put_ref(component);
-       bt_object_put_ref(params);
+       bt_object_put_ref(new_params);
        (void) init_can_consume;
        bt_graph_set_can_consume(graph, init_can_consume);
        return graph_status;
 }
 
 enum bt_graph_status
-bt_private_graph_add_source_component_with_init_method_data(
-               struct bt_private_graph *graph,
-               struct bt_component_class_source *comp_cls,
-               const char *name, struct bt_value *params,
-               void *init_method_data, struct bt_component_source **component)
+bt_graph_add_source_component_with_init_method_data(
+               struct bt_graph *graph,
+               const struct bt_component_class_source *comp_cls,
+               const char *name, const struct bt_value *params,
+               void *init_method_data,
+               const struct bt_component_source **component)
 {
        BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
        return add_component_with_init_method_data(graph,
@@ -1797,22 +1394,23 @@ bt_private_graph_add_source_component_with_init_method_data(
                name, params, init_method_data, (void *) component);
 }
 
-enum bt_graph_status bt_private_graph_add_source_component(
-               struct bt_private_graph *graph,
-               struct bt_component_class_source *comp_cls,
-               const char *name, struct bt_value *params,
-               struct bt_component_source **component)
+enum bt_graph_status bt_graph_add_source_component(
+               struct bt_graph *graph,
+               const struct bt_component_class_source *comp_cls,
+               const char *name, const struct bt_value *params,
+               const struct bt_component_source **component)
 {
-       return bt_private_graph_add_source_component_with_init_method_data(
+       return bt_graph_add_source_component_with_init_method_data(
                graph, comp_cls, name, params, NULL, component);
 }
 
 enum bt_graph_status
-bt_private_graph_add_filter_component_with_init_method_data(
-               struct bt_private_graph *graph,
-               struct bt_component_class_filter *comp_cls,
-               const char *name, struct bt_value *params,
-               void *init_method_data, struct bt_component_filter **component)
+bt_graph_add_filter_component_with_init_method_data(
+               struct bt_graph *graph,
+               const struct bt_component_class_filter *comp_cls,
+               const char *name, const struct bt_value *params,
+               void *init_method_data,
+               const struct bt_component_filter **component)
 {
        BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
        return add_component_with_init_method_data(graph,
@@ -1820,22 +1418,23 @@ bt_private_graph_add_filter_component_with_init_method_data(
                name, params, init_method_data, (void *) component);
 }
 
-enum bt_graph_status bt_private_graph_add_filter_component(
-               struct bt_private_graph *graph,
-               struct bt_component_class_filter *comp_cls,
-               const char *name, struct bt_value *params,
-               struct bt_component_filter **component)
+enum bt_graph_status bt_graph_add_filter_component(
+               struct bt_graph *graph,
+               const struct bt_component_class_filter *comp_cls,
+               const char *name, const struct bt_value *params,
+               const struct bt_component_filter **component)
 {
-       return bt_private_graph_add_filter_component_with_init_method_data(
+       return bt_graph_add_filter_component_with_init_method_data(
                graph, comp_cls, name, params, NULL, component);
 }
 
 enum bt_graph_status
-bt_private_graph_add_sink_component_with_init_method_data(
-               struct bt_private_graph *graph,
-               struct bt_component_class_sink *comp_cls,
-               const char *name, struct bt_value *params,
-               void *init_method_data, struct bt_component_sink **component)
+bt_graph_add_sink_component_with_init_method_data(
+               struct bt_graph *graph,
+               const struct bt_component_class_sink *comp_cls,
+               const char *name, const struct bt_value *params,
+               void *init_method_data,
+               const struct bt_component_sink **component)
 {
        BT_ASSERT_PRE_NON_NULL(comp_cls, "Component class");
        return add_component_with_init_method_data(graph,
@@ -1843,13 +1442,13 @@ bt_private_graph_add_sink_component_with_init_method_data(
                name, params, init_method_data, (void *) component);
 }
 
-enum bt_graph_status bt_private_graph_add_sink_component(
-               struct bt_private_graph *graph,
-               struct bt_component_class_sink *comp_cls,
-               const char *name, struct bt_value *params,
-               struct bt_component_sink **component)
+enum bt_graph_status bt_graph_add_sink_component(
+               struct bt_graph *graph,
+               const struct bt_component_class_sink *comp_cls,
+               const char *name, const struct bt_value *params,
+               const struct bt_component_sink **component)
 {
-       return bt_private_graph_add_sink_component_with_init_method_data(
+       return bt_graph_add_sink_component_with_init_method_data(
                graph, comp_cls, name, params, NULL, component);
 }
 
@@ -1929,19 +1528,29 @@ end:
 }
 
 BT_HIDDEN
-void bt_graph_add_notification(struct bt_graph *graph,
-               struct bt_notification *notif)
+void bt_graph_add_message(struct bt_graph *graph,
+               struct bt_message *msg)
 {
        BT_ASSERT(graph);
-       BT_ASSERT(notif);
+       BT_ASSERT(msg);
 
        /*
         * It's okay not to take a reference because, when a
-        * notification's reference count drops to 0, either:
+        * message's reference count drops to 0, either:
         *
         * * It is recycled back to one of this graph's pool.
         * * It is destroyed because it doesn't have any link to any
         *   graph, which means the original graph is already destroyed.
         */
-       g_ptr_array_add(graph->notifications, notif);
+       g_ptr_array_add(graph->messages, msg);
+}
+
+void bt_graph_get_ref(const struct bt_graph *graph)
+{
+       bt_object_get_ref(graph);
+}
+
+void bt_graph_put_ref(const struct bt_graph *graph)
+{
+       bt_object_put_ref(graph);
 }
This page took 0.044341 seconds and 4 git commands to generate.