X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Fwriter%2Fwriter.c;h=f89ac7460a80f56e5d5f5eba0c48f972bc2b4519;hb=d00b90bff69bfea0b81e73c166f68ca9231636d4;hp=ad99ed8abd4691d3d2b8397f6c6a26a0373c0724;hpb=ea0e619ec5a367076b752c24fa385af7aa82994a;p=babeltrace.git diff --git a/plugins/writer/writer.c b/plugins/writer/writer.c index ad99ed8a..f89ac746 100644 --- a/plugins/writer/writer.c +++ b/plugins/writer/writer.c @@ -27,21 +27,28 @@ */ #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include #include "writer.h" +#include static void destroy_writer_component_data(struct writer_component *writer_component) { + bt_put(writer_component->input_iterator); g_hash_table_destroy(writer_component->stream_map); g_hash_table_destroy(writer_component->stream_class_map); g_hash_table_destroy(writer_component->trace_map); @@ -50,10 +57,10 @@ void destroy_writer_component_data(struct writer_component *writer_component) } static -void destroy_writer_component(struct bt_component *component) +void finalize_writer_component(struct bt_private_component *component) { struct writer_component *writer_component = (struct writer_component *) - bt_component_get_private_data(component); + bt_private_component_get_user_data(component); destroy_writer_component_data(writer_component); g_free(writer_component); @@ -180,18 +187,42 @@ end: } static -enum bt_component_status run(struct bt_component *component) +enum bt_component_status writer_component_accept_port_connection( + struct bt_private_component *component, + struct bt_private_port *self_port, + struct bt_port *other_port) +{ + enum bt_component_status ret = BT_COMPONENT_STATUS_OK; + struct bt_private_connection *connection; + struct writer_component *writer; + + writer = bt_private_component_get_user_data(component); + assert(writer); + assert(!writer->input_iterator); + connection = bt_private_port_get_private_connection(self_port); + assert(connection); + writer->input_iterator = + bt_private_connection_create_notification_iterator(connection); + + if (!writer->input_iterator) { + ret = BT_COMPONENT_STATUS_ERROR; + } + bt_put(connection); + return ret; +} + +static +enum bt_component_status run(struct bt_private_component *component) { enum bt_component_status ret; + enum bt_notification_iterator_status it_status; struct bt_notification *notification = NULL; struct bt_notification_iterator *it; struct writer_component *writer_component = - bt_component_get_private_data(component); + bt_private_component_get_user_data(component); - ret = bt_component_sink_get_input_iterator(component, 0, &it); - if (ret != BT_COMPONENT_STATUS_OK) { - goto end; - } + it = writer_component->input_iterator; + assert(it); notification = bt_notification_iterator_get_notification(it); if (!notification) { @@ -199,8 +230,9 @@ enum bt_component_status run(struct bt_component *component) goto end; } - ret = bt_notification_iterator_next(it); - if (ret != BT_COMPONENT_STATUS_OK) { + it_status = bt_notification_iterator_next(it); + if (it_status != BT_COMPONENT_STATUS_OK) { + ret = BT_COMPONENT_STATUS_ERROR; goto end; } @@ -213,7 +245,8 @@ end: static enum bt_component_status writer_component_init( - struct bt_component *component, struct bt_value *params) + struct bt_private_component *component, struct bt_value *params, + UNUSED_VAR void *init_method_data) { enum bt_component_status ret; enum bt_value_status value_ret; @@ -239,6 +272,7 @@ enum bt_component_status writer_component_init( ret = BT_COMPONENT_STATUS_INVALID; goto error; } + bt_put(value); writer_component->base_path = g_string_new(path); if (!writer_component) { @@ -246,19 +280,7 @@ enum bt_component_status writer_component_init( goto error; } - ret = bt_component_set_destroy_cb(component, - destroy_writer_component); - if (ret != BT_COMPONENT_STATUS_OK) { - goto error; - } - - ret = bt_component_set_private_data(component, writer_component); - if (ret != BT_COMPONENT_STATUS_OK) { - goto error; - } - - ret = bt_component_sink_set_consume_cb(component, - run); + ret = bt_private_component_set_user_data(component, writer_component); if (ret != BT_COMPONENT_STATUS_OK) { goto error; } @@ -272,13 +294,13 @@ error: } /* Initialize plug-in entry points. */ -BT_PLUGIN_NAME("writer"); +BT_PLUGIN(writer); BT_PLUGIN_DESCRIPTION("Babeltrace CTF-Writer output plug-in."); BT_PLUGIN_AUTHOR("Jérémie Galarneau"); BT_PLUGIN_LICENSE("MIT"); - -BT_PLUGIN_COMPONENT_CLASSES_BEGIN -BT_PLUGIN_SINK_COMPONENT_CLASS_ENTRY("writer", - "Formats CTF-IR to CTF.", - writer_component_init) -BT_PLUGIN_COMPONENT_CLASSES_END +BT_PLUGIN_SINK_COMPONENT_CLASS(writer, run); +BT_PLUGIN_SINK_COMPONENT_CLASS_INIT_METHOD(writer, writer_component_init); +BT_PLUGIN_SINK_COMPONENT_CLASS_ACCEPT_PORT_CONNECTION_METHOD(writer, + writer_component_accept_port_connection); +BT_PLUGIN_SINK_COMPONENT_CLASS_FINALIZE_METHOD(writer, finalize_writer_component); +BT_PLUGIN_SINK_COMPONENT_CLASS_DESCRIPTION(writer, "Formats CTF-IR to CTF.");