X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fplugin-system%2Fsink.c;h=f49f93cce36a5399669a1ad0f28d1228bc0b2fb7;hb=09ac5ce7990677798a58638ab45ab1a62e615a9a;hp=4f705a00134c11d68850e515ef1d3a9984c47a48;hpb=9defb2e2b9da3adb7ef1d75a0f211fa08866c596;p=babeltrace.git diff --git a/lib/plugin-system/sink.c b/lib/plugin-system/sink.c index 4f705a00..f49f93cc 100644 --- a/lib/plugin-system/sink.c +++ b/lib/plugin-system/sink.c @@ -27,6 +27,7 @@ */ #include +#include #include #include #include @@ -38,25 +39,45 @@ enum bt_component_status bt_component_sink_validate( enum bt_component_status ret = BT_COMPONENT_STATUS_OK; struct bt_component_sink *sink; - sink = container_of(component, struct bt_component_sink, parent); - if (sink->registered_notifications_mask == 0) { - /* - * A sink must be registered to at least one notification type. - */ - printf_error("Invalid sink component; not registered to any notification"); + if (!component) { ret = BT_COMPONENT_STATUS_INVALID; goto end; } - if (!sink->handle_notification) { - printf_error("Invalid sink component; no notification handling callback defined."); + if (!component->class) { ret = BT_COMPONENT_STATUS_INVALID; goto end; } + + if (component->class->type != BT_COMPONENT_TYPE_SINK) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + sink = container_of(component, struct bt_component_sink, parent); + if (!sink->consume) { + printf_error("Invalid sink component; no notification consumption callback defined."); + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + ret = component_input_validate(&sink->input); + if (ret) { + goto end; + } end: return ret; } +static +void bt_component_sink_destroy(struct bt_component *component) +{ + struct bt_component_sink *sink = container_of(component, + struct bt_component_sink, parent); + + component_input_fini(&sink->input); +} + BT_HIDDEN struct bt_component *bt_component_sink_create( struct bt_component_class *class, struct bt_value *params) @@ -69,23 +90,49 @@ struct bt_component *bt_component_sink_create( goto end; } + sink->parent.class = bt_get(class); ret = bt_component_init(&sink->parent, bt_component_sink_destroy); if (ret != BT_COMPONENT_STATUS_OK) { - BT_PUT(sink); - goto end; + goto error; + } + +/* + ret = bt_component_sink_register_notification_type(&sink->parent, + BT_NOTIFICATION_TYPE_EVENT); + if (ret != BT_COMPONENT_STATUS_OK) { + goto error; + } +*/ + if (component_input_init(&sink->input)) { + goto error; } end: return sink ? &sink->parent : NULL; +error: + BT_PUT(sink); + return NULL; } -enum bt_component_status bt_component_sink_handle_notification( - struct bt_component *component, - struct bt_notification *notification) +static +enum bt_component_status validate_inputs(struct bt_component_sink *sink) +{ + size_t array_size = sink->input.iterators->len; + + if (array_size < sink->input.min_count || + array_size > sink->input.max_count) { + return BT_COMPONENT_STATUS_INVALID; + } + + return BT_COMPONENT_STATUS_OK; +} + +enum bt_component_status bt_component_sink_consume( + struct bt_component *component) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; struct bt_component_sink *sink = NULL; - if (!component || !notification) { + if (!component) { ret = BT_COMPONENT_STATUS_INVALID; goto end; } @@ -96,12 +143,21 @@ enum bt_component_status bt_component_sink_handle_notification( } sink = container_of(component, struct bt_component_sink, parent); - assert(sink->handle_notification); - ret = sink->handle_notification(component, notification); + if (!sink->input.validated) { + ret = validate_inputs(sink); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + sink->input.validated = true; + } + + assert(sink->consume); + ret = sink->consume(component); end: return ret; } - +/* +static enum bt_component_status bt_component_sink_register_notification_type( struct bt_component *component, enum bt_notification_type type) { @@ -133,3 +189,201 @@ enum bt_component_status bt_component_sink_register_notification_type( end: return ret; } +*/ +enum bt_component_status bt_component_sink_set_consume_cb( + struct bt_component *component, + bt_component_sink_consume_cb consume) +{ + struct bt_component_sink *sink; + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + + if (!component) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) { + ret = BT_COMPONENT_STATUS_UNSUPPORTED; + goto end; + } + + if (!component->initializing) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + sink = container_of(component, struct bt_component_sink, parent); + sink->consume = consume; +end: + return ret; +} + +enum bt_component_status bt_component_sink_set_add_iterator_cb( + struct bt_component *component, + bt_component_sink_add_iterator_cb add_iterator) +{ + struct bt_component_sink *sink; + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + + if (!component) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) { + ret = BT_COMPONENT_STATUS_UNSUPPORTED; + goto end; + } + + if (!component->initializing) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + sink = container_of(component, struct bt_component_sink, parent); + sink->add_iterator = add_iterator; +end: + return ret; +} + +enum bt_component_status bt_component_sink_set_minimum_input_count( + struct bt_component *component, + unsigned int minimum) +{ + struct bt_component_sink *sink; + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + + if (!component) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) { + ret = BT_COMPONENT_STATUS_UNSUPPORTED; + goto end; + } + + if (!component->initializing) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + sink = container_of(component, struct bt_component_sink, parent); + sink->input.min_count = minimum; +end: + return ret; +} + +enum bt_component_status bt_component_sink_set_maximum_input_count( + struct bt_component *component, + unsigned int maximum) +{ + struct bt_component_sink *sink; + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + + if (!component) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) { + ret = BT_COMPONENT_STATUS_UNSUPPORTED; + goto end; + } + + if (!component->initializing) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + sink = container_of(component, struct bt_component_sink, parent); + sink->input.max_count = maximum; +end: + return ret; +} + +enum bt_component_status +bt_component_sink_get_input_count(struct bt_component *component, + unsigned int *count) +{ + struct bt_component_sink *sink; + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + + if (!component || !count) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) { + ret = BT_COMPONENT_STATUS_UNSUPPORTED; + goto end; + } + + sink = container_of(component, struct bt_component_sink, parent); + *count = (unsigned int) sink->input.iterators->len; +end: + return ret; +} + +enum bt_component_status +bt_component_sink_get_input_iterator(struct bt_component *component, + unsigned int input, struct bt_notification_iterator **iterator) +{ + struct bt_component_sink *sink; + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + + if (!component || !iterator) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) { + ret = BT_COMPONENT_STATUS_UNSUPPORTED; + goto end; + } + + sink = container_of(component, struct bt_component_sink, parent); + if (input >= (unsigned int) sink->input.iterators->len) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + *iterator = bt_get(g_ptr_array_index(sink->input.iterators, input)); +end: + return ret; +} + +enum bt_component_status +bt_component_sink_add_iterator(struct bt_component *component, + struct bt_notification_iterator *iterator) +{ + struct bt_component_sink *sink; + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + + if (!component || !iterator) { + ret = BT_COMPONENT_STATUS_INVALID; + goto end; + } + + if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) { + ret = BT_COMPONENT_STATUS_UNSUPPORTED; + goto end; + } + + sink = container_of(component, struct bt_component_sink, parent); + if (sink->input.iterators->len == sink->input.max_count) { + ret = BT_COMPONENT_STATUS_UNSUPPORTED; + goto end; + } + + if (sink->add_iterator) { + ret = sink->add_iterator(component, iterator); + if (ret != BT_COMPONENT_STATUS_OK) { + goto end; + } + } + + g_ptr_array_add(sink->input.iterators, bt_get(iterator)); +end: + return ret; +}