X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fgraph%2Fsink.c;h=5c8bec7a910fb00e13fbd858f252ea5a7cf26fa7;hb=f6ccaed94e575af57fe6bf38154771bee4871a2a;hp=916979adf3a9ba8670585260d7f5c32f071bb039;hpb=544d0515ffa2d011247e4f1d7cad5770b8ec7033;p=babeltrace.git diff --git a/lib/graph/sink.c b/lib/graph/sink.c index 916979ad..5c8bec7a 100644 --- a/lib/graph/sink.c +++ b/lib/graph/sink.c @@ -26,35 +26,17 @@ * SOFTWARE. */ +#define BT_LOG_TAG "COMP-SINK" +#include + #include #include #include #include #include - -BT_HIDDEN -enum bt_component_status bt_component_sink_validate( - struct bt_component *component) -{ - enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - - if (!component) { - ret = BT_COMPONENT_STATUS_INVALID; - goto end; - } - - if (!component->class) { - ret = BT_COMPONENT_STATUS_INVALID; - goto end; - } - - if (component->class->type != BT_COMPONENT_CLASS_TYPE_SINK) { - ret = BT_COMPONENT_STATUS_INVALID; - goto end; - } -end: - return ret; -} +#include +#include +#include BT_HIDDEN void bt_component_sink_destroy(struct bt_component *component) @@ -63,12 +45,13 @@ void bt_component_sink_destroy(struct bt_component *component) BT_HIDDEN struct bt_component *bt_component_sink_create( - struct bt_component_class *class, struct bt_value *params) + struct bt_component_class *class) { struct bt_component_sink *sink = NULL; sink = g_new0(struct bt_component_sink, 1); if (!sink) { + BT_LOGE_STR("Failed to allocate one sink component."); goto end; } @@ -83,20 +66,20 @@ enum bt_component_status bt_component_sink_consume( enum bt_component_status ret = BT_COMPONENT_STATUS_OK; struct bt_component_class_sink *sink_class = NULL; - if (!component) { - ret = BT_COMPONENT_STATUS_INVALID; - goto end; - } - - if (bt_component_get_class_type(component) != BT_COMPONENT_CLASS_TYPE_SINK) { - ret = BT_COMPONENT_STATUS_UNSUPPORTED; - goto end; - } - + BT_ASSERT(component); + BT_ASSERT(bt_component_get_class_type(component) == BT_COMPONENT_CLASS_TYPE_SINK); sink_class = container_of(component->class, struct bt_component_class_sink, parent); - assert(sink_class->methods.consume); + BT_ASSERT(sink_class->methods.consume); + BT_LOGD("Calling user's consume method: " + "comp-addr=%p, comp-name=\"%s\"", + component, bt_component_get_name(component)); ret = sink_class->methods.consume(bt_private_component_from_component(component)); -end: + BT_LOGD("User method returned: status=%s", + bt_component_status_string(ret)); + if (ret < 0) { + BT_LOGW_STR("Consume method failed."); + } + return ret; } @@ -104,85 +87,155 @@ int64_t bt_component_sink_get_input_port_count(struct bt_component *component) { int64_t ret; - if (!component || - component->class->type != BT_COMPONENT_CLASS_TYPE_SINK) { - ret = -1; + if (!component) { + BT_LOGW_STR("Invalid parameter: component is NULL."); + ret = (int64_t) -1; goto end; } + if (component->class->type != BT_COMPONENT_CLASS_TYPE_SINK) { + BT_LOGW("Invalid parameter: component's class is not a sink component class: " + "comp-addr=%p, comp-name=\"%s\", comp-class-type=%s", + component, bt_component_get_name(component), + bt_component_class_type_string(component->class->type)); + ret = (int64_t) -1; + goto end; + } + + /* bt_component_get_input_port_count() logs details/errors */ ret = bt_component_get_input_port_count(component); + end: return ret; } -struct bt_port *bt_component_sink_get_input_port( +struct bt_port *bt_component_sink_get_input_port_by_name( struct bt_component *component, const char *name) { struct bt_port *port = NULL; - if (!component || !name || - component->class->type != BT_COMPONENT_CLASS_TYPE_SINK) { + if (!component) { + BT_LOGW_STR("Invalid parameter: component is NULL."); goto end; } - port = bt_component_get_input_port(component, name); + if (!name) { + BT_LOGW_STR("Invalid parameter: name is NULL."); + goto end; + } + + if (component->class->type != BT_COMPONENT_CLASS_TYPE_SINK) { + BT_LOGW("Invalid parameter: component's class is not a sink component class: " + "comp-addr=%p, comp-name=\"%s\", comp-class-type=%s", + component, bt_component_get_name(component), + bt_component_class_type_string(component->class->type)); + goto end; + } + + /* bt_component_get_input_port_by_name() logs details/errors */ + port = bt_component_get_input_port_by_name(component, name); + end: return port; } -struct bt_port *bt_component_sink_get_input_port_at_index( - struct bt_component *component, int index) +struct bt_port *bt_component_sink_get_input_port_by_index( + struct bt_component *component, uint64_t index) { struct bt_port *port = NULL; - if (!component || - component->class->type != BT_COMPONENT_CLASS_TYPE_SINK) { + if (!component) { + BT_LOGW_STR("Invalid parameter: component is NULL."); + goto end; + } + + if (component->class->type != BT_COMPONENT_CLASS_TYPE_SINK) { + BT_LOGW("Invalid parameter: component's class is not a sink component class: " + "comp-addr=%p, comp-name=\"%s\", comp-class-type=%s", + component, bt_component_get_name(component), + bt_component_class_type_string(component->class->type)); goto end; } - port = bt_component_get_input_port_at_index(component, index); + /* bt_component_get_input_port_by_index() logs details/errors */ + port = bt_component_get_input_port_by_index(component, index); + end: return port; } -struct bt_port *bt_component_sink_get_default_input_port( - struct bt_component *component) -{ - return bt_component_sink_get_input_port(component, - DEFAULT_INPUT_PORT_NAME); -} - struct bt_private_port * -bt_private_component_sink_get_input_private_port_at_index( - struct bt_private_component *private_component, int index) +bt_private_component_sink_get_input_private_port_by_index( + struct bt_private_component *private_component, uint64_t index) { + /* bt_component_sink_get_input_port_by_index() logs details/errors */ return bt_private_port_from_port( - bt_component_sink_get_input_port_at_index( - bt_component_from_private(private_component), index)); + bt_component_sink_get_input_port_by_index( + bt_component_borrow_from_private(private_component), index)); } -struct bt_private_port *bt_private_component_sink_get_default_input_private_port( - struct bt_private_component *private_component) +struct bt_private_port * +bt_private_component_sink_get_input_private_port_by_name( + struct bt_private_component *private_component, + const char *name) { + /* bt_component_sink_get_input_port_by_name() logs details/errors */ return bt_private_port_from_port( - bt_component_sink_get_default_input_port( - bt_component_from_private(private_component))); + bt_component_sink_get_input_port_by_name( + bt_component_borrow_from_private(private_component), name)); } -struct bt_private_port *bt_private_component_sink_add_input_private_port( +enum bt_component_status 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_private_port **user_priv_port) { + enum bt_component_status status = BT_COMPONENT_STATUS_OK; struct bt_port *port = NULL; struct bt_component *component = - bt_component_from_private(private_component); + bt_component_borrow_from_private(private_component); + struct bt_graph *graph; + + if (!component) { + BT_LOGW_STR("Invalid parameter: component is NULL."); + status = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + if (component->class->type != BT_COMPONENT_CLASS_TYPE_SINK) { + BT_LOGW("Invalid parameter: component's class is not a sink component class: " + "comp-addr=%p, comp-name=\"%s\", comp-class-type=%s", + component, bt_component_get_name(component), + bt_component_class_type_string(component->class->type)); + status = BT_COMPONENT_STATUS_INVALID; + goto end; + } - if (!component || - component->class->type != BT_COMPONENT_CLASS_TYPE_SINK) { + graph = bt_component_borrow_graph(component); + + if (graph && bt_graph_is_canceled(graph)) { + BT_LOGW("Cannot add input port to sink component: graph is canceled: " + "comp-addr=%p, comp-name=\"%s\", graph-addr=%p", + component, bt_component_get_name(component), + bt_component_borrow_graph(component)); + status = BT_COMPONENT_STATUS_GRAPH_IS_CANCELED; goto end; } - port = bt_component_add_input_port(component, name); + /* bt_component_add_input_port() logs details/errors */ + port = bt_component_add_input_port(component, name, user_data); + if (!port) { + status = BT_COMPONENT_STATUS_NOMEM; + goto end; + } + + if (user_priv_port) { + /* Move reference to user */ + *user_priv_port = bt_private_port_from_port(port); + port = NULL; + } + end: - return bt_private_port_from_port(port); + bt_put(port); + return status; }