X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=lib%2Fgraph%2Fgraph.c;h=b43504148d2b01bf5e67e5a24937caef84fc5d13;hb=8138bfe1b1d389d60d8f6c98b8f0cc8e84b9907b;hp=7db5b761a32c1fc28baf4e1a0c77a50ca1281d70;hpb=1d7bf34933f21be1aac814b60dc0def7d4506c89;p=babeltrace.git diff --git a/lib/graph/graph.c b/lib/graph/graph.c index 7db5b761..b4350414 100644 --- a/lib/graph/graph.c +++ b/lib/graph/graph.c @@ -230,7 +230,7 @@ struct bt_graph *bt_graph_create(void) goto error; } - graph->can_consume = BT_TRUE; + bt_graph_set_can_consume(graph, BT_TRUE); ret = init_listeners_array(&graph->listeners.port_added); if (ret) { BT_LOGE_STR("Cannot create the \"port added\" listener array."); @@ -292,7 +292,7 @@ struct bt_graph *bt_graph_create(void) end: return graph; error: - BT_PUT(graph); + BT_OBJECT_PUT_REF_AND_RESET(graph); goto end; } @@ -341,7 +341,7 @@ enum bt_graph_status bt_graph_connect_ports(struct bt_graph *graph, goto end; } - graph->can_consume = BT_FALSE; + bt_graph_set_can_consume(graph, BT_FALSE); /* Ensure appropriate types for upstream and downstream ports. */ if (bt_port_get_type(upstream_port) != BT_PORT_TYPE_OUTPUT) { @@ -450,17 +450,56 @@ enum bt_graph_status bt_graph_connect_ports(struct bt_graph *graph, * Notify both components that their port is connected. */ BT_LOGD_STR("Notifying upstream component that its port is connected."); - bt_component_port_connected(upstream_component, upstream_port, - downstream_port); + component_status = bt_component_port_connected(upstream_component, + upstream_port, downstream_port); + if (component_status != BT_COMPONENT_STATUS_OK) { + BT_LOGW("Error while notifying upstream component that its port is connected: " + "status=%s, graph-addr=%p, " + "upstream-comp-addr=%p, upstream-comp-name=\"%s\", " + "downstream-comp-addr=%p, downstream-comp-name=\"%s\", " + "upstream-port-addr=%p, upstream-port-name=\"%s\", " + "downstream-port-addr=%p, downstream-port-name=\"%s\"", + bt_component_status_string(component_status), graph, + upstream_component, bt_component_get_name(upstream_component), + downstream_component, bt_component_get_name(downstream_component), + upstream_port, bt_port_get_name(upstream_port), + downstream_port, bt_port_get_name(downstream_port)); + bt_connection_end(connection, true); + status = bt_graph_status_from_component_status( + component_status); + goto end; + } + + connection->notified_upstream_port_connected = true; BT_LOGD_STR("Notifying downstream component that its port is connected."); - bt_component_port_connected(downstream_component, downstream_port, - upstream_port); + component_status = bt_component_port_connected(downstream_component, + downstream_port, upstream_port); + if (component_status != BT_COMPONENT_STATUS_OK) { + BT_LOGW("Error while notifying downstream component that its port is connected: " + "status=%s, graph-addr=%p, " + "upstream-comp-addr=%p, upstream-comp-name=\"%s\", " + "downstream-comp-addr=%p, downstream-comp-name=\"%s\", " + "upstream-port-addr=%p, upstream-port-name=\"%s\", " + "downstream-port-addr=%p, downstream-port-name=\"%s\"", + bt_component_status_string(component_status), graph, + upstream_component, bt_component_get_name(upstream_component), + downstream_component, bt_component_get_name(downstream_component), + upstream_port, bt_port_get_name(upstream_port), + downstream_port, bt_port_get_name(downstream_port)); + bt_connection_end(connection, true); + status = bt_graph_status_from_component_status( + component_status); + goto end; + } + + connection->notified_downstream_port_connected = true; /* * 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); + connection->notified_graph_ports_connected = true; BT_LOGD("Connected component ports within graph: " "graph-addr=%p, " "upstream-comp-addr=%p, upstream-comp-name=\"%s\", " @@ -480,21 +519,21 @@ enum bt_graph_status bt_graph_connect_ports(struct bt_graph *graph, } end: - bt_put(upstream_graph); - bt_put(downstream_graph); - bt_put(upstream_component); - bt_put(downstream_component); - bt_put(connection); + bt_object_put_ref(upstream_graph); + bt_object_put_ref(downstream_graph); + bt_object_put_ref(upstream_component); + bt_object_put_ref(downstream_component); + bt_object_put_ref(connection); if (graph) { - graph->can_consume = init_can_consume; + (void) init_can_consume; + bt_graph_set_can_consume(graph, init_can_consume); } return status; } -static +static inline enum bt_graph_status consume_graph_sink(struct bt_component *sink) { - enum bt_graph_status status = BT_GRAPH_STATUS_OK; enum bt_component_status comp_status; BT_ASSERT(sink); @@ -502,25 +541,14 @@ enum bt_graph_status consume_graph_sink(struct bt_component *sink) BT_LOGV("Consumed from sink: addr=%p, name=\"%s\", status=%s", sink, bt_component_get_name(sink), bt_component_status_string(comp_status)); - - switch (comp_status) { - case BT_COMPONENT_STATUS_OK: - break; - case BT_COMPONENT_STATUS_END: - status = BT_GRAPH_STATUS_END; - break; - case BT_COMPONENT_STATUS_AGAIN: - status = BT_GRAPH_STATUS_AGAIN; - break; - case BT_COMPONENT_STATUS_INVALID: - status = BT_GRAPH_STATUS_INVALID; - break; - default: - status = BT_GRAPH_STATUS_ERROR; - break; - } - - return status; + BT_ASSERT_PRE(comp_status == BT_COMPONENT_STATUS_OK || + comp_status == BT_COMPONENT_STATUS_END || + comp_status == BT_COMPONENT_STATUS_AGAIN || + comp_status == BT_COMPONENT_STATUS_ERROR || + comp_status == BT_COMPONENT_STATUS_NOMEM, + "Invalid component status returned by consuming function: " + "status=%s", bt_component_status_string(comp_status)); + return (enum bt_graph_status) comp_status; } /* @@ -528,7 +556,7 @@ enum bt_graph_status consume_graph_sink(struct bt_component *sink) * this function. This function adds it back to the queue if there's * still something to consume afterwards. */ -static +static inline enum bt_graph_status consume_sink_node(struct bt_graph *graph, GList *node) { @@ -537,7 +565,7 @@ enum bt_graph_status consume_sink_node(struct bt_graph *graph, sink = node->data; status = consume_graph_sink(sink); - if (status != BT_GRAPH_STATUS_END) { + if (unlikely(status != BT_GRAPH_STATUS_END)) { g_queue_push_tail_link(graph->sinks_to_consume, node); goto end; } @@ -591,7 +619,7 @@ end: return status; } -BT_HIDDEN +static inline enum bt_graph_status bt_graph_consume_no_check(struct bt_graph *graph) { enum bt_graph_status status = BT_GRAPH_STATUS_OK; @@ -602,7 +630,7 @@ enum bt_graph_status bt_graph_consume_no_check(struct bt_graph *graph) BT_ASSERT_PRE(graph->has_sink, "Graph has no sink component: %!+g", graph); - if (g_queue_is_empty(graph->sinks_to_consume)) { + if (unlikely(g_queue_is_empty(graph->sinks_to_consume))) { BT_LOGV_STR("Graph's sink queue is empty: end of graph."); status = BT_GRAPH_STATUS_END; goto end; @@ -626,9 +654,9 @@ enum bt_graph_status bt_graph_consume(struct bt_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); - graph->can_consume = BT_FALSE; + bt_graph_set_can_consume(graph, BT_FALSE); status = bt_graph_consume_no_check(graph); - graph->can_consume = BT_TRUE; + bt_graph_set_can_consume(graph, BT_TRUE); return status; } @@ -649,13 +677,9 @@ enum bt_graph_status bt_graph_run(struct bt_graph *graph) goto end; } - if (!graph->can_consume) { - BT_LOGW_STR("Cannot run graph in its current state."); - status = BT_GRAPH_STATUS_CANNOT_CONSUME; - goto end; - } - - graph->can_consume = BT_FALSE; + BT_ASSERT_PRE(graph->can_consume, + "Cannot consume graph in its current state: %!+g", graph); + bt_graph_set_can_consume(graph, BT_FALSE); BT_LOGV("Running graph: addr=%p", graph); do { @@ -665,7 +689,7 @@ enum bt_graph_status bt_graph_run(struct bt_graph *graph) * signal, this is not a warning nor an error, it was * intentional: log with a DEBUG level only. */ - if (graph->canceled) { + if (unlikely(graph->canceled)) { BT_LOGD("Stopping the graph: graph is canceled: " "graph-addr=%p", graph); status = BT_GRAPH_STATUS_CANCELED; @@ -673,7 +697,7 @@ enum bt_graph_status bt_graph_run(struct bt_graph *graph) } status = bt_graph_consume_no_check(graph); - if (status == BT_GRAPH_STATUS_AGAIN) { + if (unlikely(status == BT_GRAPH_STATUS_AGAIN)) { /* * If AGAIN is received and there are multiple * sinks, go ahead and consume from the next @@ -700,7 +724,7 @@ enum bt_graph_status bt_graph_run(struct bt_graph *graph) end: BT_LOGV("Graph ran: status=%s", bt_graph_status_string(status)); if (graph) { - graph->can_consume = BT_TRUE; + bt_graph_set_can_consume(graph, BT_TRUE); } return status; } @@ -1011,7 +1035,7 @@ enum bt_graph_status bt_graph_add_component_with_init_method_data( size_t i; bt_bool init_can_consume; - bt_get(params); + bt_object_get_ref(params); if (!graph) { BT_LOGW_STR("Invalid parameter: graph is NULL."); @@ -1158,8 +1182,8 @@ enum bt_graph_status bt_graph_add_component_with_init_method_data( } end: - bt_put(component); - bt_put(params); + bt_object_put_ref(component); + bt_object_put_ref(params); if (graph) { graph->can_consume = init_can_consume; } @@ -1198,7 +1222,7 @@ int bt_graph_remove_unconnected_component(struct bt_graph *graph, bt_component_get_input_port_by_index(component, i); BT_ASSERT(port); - bt_put(port); + bt_object_put_ref(port); if (bt_port_is_connected(port)) { BT_LOGW("Cannot remove component from graph: " @@ -1220,7 +1244,7 @@ int bt_graph_remove_unconnected_component(struct bt_graph *graph, bt_component_get_output_port_by_index(component, i); BT_ASSERT(port); - bt_put(port); + bt_object_put_ref(port); if (bt_port_is_connected(port)) { BT_LOGW("Cannot remove component from graph: "