X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fgraph%2Fgraph.c;h=f7b02a10bece15a7914d8612e362f058328bcc6e;hb=68b66a256a54d32992dfefeaad11eea88b7df234;hp=b7d04b0a674b2d8fb44aa7659e9bc44e440206ca;hpb=0d47d31b29a40292ae11215ca77555a3deec3126;p=babeltrace.git diff --git a/lib/graph/graph.c b/lib/graph/graph.c index b7d04b0a..f7b02a10 100644 --- a/lib/graph/graph.c +++ b/lib/graph/graph.c @@ -22,35 +22,36 @@ */ #define BT_LOG_TAG "GRAPH" -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -typedef void (*port_added_func_t)(const void *, const void *, void *); +typedef enum bt_graph_listener_status (*port_added_func_t)( + const void *, const void *, void *); -typedef void (*ports_connected_func_t)(const void *, const void *, 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 *); @@ -82,6 +83,9 @@ struct bt_graph_listener_ports_connected { do { \ size_t i; \ \ + if (!_listeners) { \ + break; \ + } \ for (i = 0; i < (_listeners)->len; i++) { \ _type *listener = \ &g_array_index((_listeners), _type, i); \ @@ -394,6 +398,7 @@ enum bt_graph_status bt_graph_connect_ports( const struct bt_connection **user_connection) { 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; @@ -528,7 +533,12 @@ enum bt_graph_status bt_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, " @@ -544,7 +554,7 @@ enum bt_graph_status bt_graph_connect_ports( end: if (status != BT_GRAPH_STATUS_OK) { - graph->config_state = BT_GRAPH_CONFIGURATION_STATE_FAULTY; + bt_graph_make_faulty(graph); } bt_object_put_ref(connection); @@ -688,7 +698,7 @@ enum bt_graph_status bt_graph_consume(struct bt_graph *graph) "Graph is in a faulty state: %!+g", graph); bt_graph_set_can_consume(graph, false); status = bt_graph_configure(graph); - if (status) { + if (unlikely(status)) { /* bt_graph_configure() logs errors */ goto end; } @@ -712,7 +722,7 @@ enum bt_graph_status bt_graph_run(struct bt_graph *graph) "Graph is in a faulty state: %!+g", graph); bt_graph_set_can_consume(graph, false); status = bt_graph_configure(graph); - if (status) { + if (unlikely(status)) { /* bt_graph_configure() logs errors */ goto end; } @@ -749,8 +759,6 @@ enum bt_graph_status bt_graph_run(struct bt_graph *graph) 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); @@ -1050,11 +1058,13 @@ bt_graph_add_filter_sink_component_ports_connected_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); @@ -1112,19 +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); + status = listener->func(comp, port, listener->base.data); + if (status != BT_GRAPH_LISTENER_STATUS_OK) { + goto end; + } } + +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); @@ -1182,9 +1201,15 @@ 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); + if (status != BT_GRAPH_LISTENER_STATUS_OK) { + goto end; + } } + +end: + return status; } enum bt_graph_status bt_graph_cancel(struct bt_graph *graph) @@ -1345,7 +1370,7 @@ enum bt_graph_status add_component_with_init_method_data( end: if (graph_status != BT_GRAPH_STATUS_OK) { - graph->config_state = BT_GRAPH_CONFIGURATION_STATE_FAULTY; + bt_graph_make_faulty(graph); } bt_object_put_ref(component);