X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fgraph%2Fcomponent-class-sink-colander.c;h=6a9d287e2a9983dac998dbfebe92a320e4d9e2a0;hb=3fadfbc0c91f82c46bd36e6e0657ea93570c9db1;hp=a40f8ea09e813122840db65c8e094aef3fa72bf5;hpb=d94d92ac6656fd252a5d7bb4f6c76935ba18e62e;p=babeltrace.git diff --git a/lib/graph/component-class-sink-colander.c b/lib/graph/component-class-sink-colander.c index a40f8ea0..6a9d287e 100644 --- a/lib/graph/component-class-sink-colander.c +++ b/lib/graph/component-class-sink-colander.c @@ -1,5 +1,5 @@ /* - * Copyright 2017 Philippe Proulx + * Copyright 2017-2018 Philippe Proulx * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -21,35 +21,29 @@ */ #define BT_LOG_TAG "COLANDER" -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include #include static -struct bt_private_component_class_sink *colander_comp_cls; - -struct colander_data { - bt_notification_array notifs; - uint64_t *count_addr; - struct bt_self_component_port_input_notification_iterator *notif_iter; -}; +struct bt_component_class_sink *colander_comp_cls; static enum bt_self_component_status colander_init( struct bt_self_component_sink *self_comp, - struct bt_value *params, void *init_method_data) + const struct bt_value *params, void *init_method_data) { enum bt_self_component_status status = BT_SELF_COMPONENT_STATUS_OK; - struct colander_data *colander_data = NULL; + struct bt_component_class_sink_colander_priv_data *colander_data = NULL; struct bt_component_class_sink_colander_data *user_provided_data = init_method_data; @@ -59,14 +53,15 @@ enum bt_self_component_status colander_init( goto end; } - colander_data = g_new0(struct colander_data, 1); + colander_data = g_new0( + struct bt_component_class_sink_colander_priv_data, 1); if (!colander_data) { BT_LOGE_STR("Failed to allocate colander data."); status = BT_SELF_COMPONENT_STATUS_NOMEM; goto end; } - colander_data->notifs = user_provided_data->notifs; + colander_data->msgs = user_provided_data->msgs; colander_data->count_addr = user_provided_data->count_addr; status = bt_self_component_sink_add_input_port(self_comp, "in", NULL, NULL); @@ -76,7 +71,7 @@ enum bt_self_component_status colander_init( } bt_self_component_set_data( - bt_self_component_sink_borrow_self_component(self_comp), + bt_self_component_sink_as_self_component(self_comp), colander_data); end: @@ -86,36 +81,38 @@ end: static void colander_finalize(struct bt_self_component_sink *self_comp) { - struct colander_data *colander_data = + struct bt_component_class_sink_colander_priv_data *colander_data = bt_self_component_get_data( - bt_self_component_sink_borrow_self_component(self_comp)); + bt_self_component_sink_as_self_component(self_comp)); if (!colander_data) { return; } - BT_OBJECT_PUT_REF_AND_RESET(colander_data->notif_iter); + BT_OBJECT_PUT_REF_AND_RESET(colander_data->msg_iter); g_free(colander_data); } static -enum bt_self_component_status colander_input_port_connected( - struct bt_self_component_sink *self_comp, - struct bt_self_component_port_input *self_port, - struct bt_port_output *other_port) +enum bt_self_component_status colander_graph_is_configured( + bt_self_component_sink *self_comp) { enum bt_self_component_status status = BT_SELF_COMPONENT_STATUS_OK; - struct colander_data *colander_data = + struct bt_component_class_sink_colander_priv_data *colander_data = bt_self_component_get_data( - bt_self_component_sink_borrow_self_component(self_comp)); + bt_self_component_sink_as_self_component(self_comp)); + + struct bt_self_component_port_input *self_port = + bt_self_component_sink_borrow_input_port_by_name(self_comp, "in"); + BT_ASSERT(self_port); BT_ASSERT(colander_data); - BT_OBJECT_PUT_REF_AND_RESET(colander_data->notif_iter); - colander_data->notif_iter = - bt_self_component_port_input_notification_iterator_create( + BT_OBJECT_PUT_REF_AND_RESET(colander_data->msg_iter); + colander_data->msg_iter = + bt_self_component_port_input_message_iterator_create( self_port); - if (!colander_data->notif_iter) { - BT_LIB_LOGE("Cannot create notification iterator on " + if (!colander_data->msg_iter) { + BT_LIB_LOGE("Cannot create message iterator on " "self component input port: %![port-]+p", self_port); status = BT_SELF_COMPONENT_STATUS_NOMEM; @@ -131,39 +128,36 @@ enum bt_self_component_status colander_consume( struct bt_self_component_sink *self_comp) { enum bt_self_component_status status = BT_SELF_COMPONENT_STATUS_OK; - enum bt_notification_iterator_status notif_iter_status; - struct colander_data *colander_data = + enum bt_message_iterator_status msg_iter_status; + struct bt_component_class_sink_colander_priv_data *colander_data = bt_self_component_get_data( - bt_self_component_sink_borrow_self_component(self_comp)); - bt_notification_array notifs; + bt_self_component_sink_as_self_component(self_comp)); + bt_message_array_const msgs; BT_ASSERT(colander_data); - if (!colander_data->notif_iter) { + if (!colander_data->msg_iter) { BT_LIB_LOGW("Trying to consume without an " - "upstream notification iterator: %![comp-]+c", + "upstream message iterator: %![comp-]+c", self_comp); goto end; } - notif_iter_status = - bt_self_component_port_input_notification_iterator_next( - colander_data->notif_iter, ¬ifs, + msg_iter_status = + bt_self_component_port_input_message_iterator_next( + colander_data->msg_iter, &msgs, colander_data->count_addr); - switch (notif_iter_status) { - case BT_NOTIFICATION_ITERATOR_STATUS_CANCELED: - status = BT_SELF_COMPONENT_STATUS_OK; - goto end; - case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN: + switch (msg_iter_status) { + case BT_MESSAGE_ITERATOR_STATUS_AGAIN: status = BT_SELF_COMPONENT_STATUS_AGAIN; goto end; - case BT_NOTIFICATION_ITERATOR_STATUS_END: + case BT_MESSAGE_ITERATOR_STATUS_END: status = BT_SELF_COMPONENT_STATUS_END; goto end; - case BT_NOTIFICATION_ITERATOR_STATUS_OK: - /* Move notifications to user (count already set) */ - memcpy(colander_data->notifs, notifs, - sizeof(*notifs) * *colander_data->count_addr); + case BT_MESSAGE_ITERATOR_STATUS_OK: + /* Move messages to user (count already set) */ + memcpy(colander_data->msgs, msgs, + sizeof(*msgs) * *colander_data->count_addr); break; default: status = BT_SELF_COMPONENT_STATUS_ERROR; @@ -180,24 +174,23 @@ struct bt_component_class_sink *bt_component_class_sink_colander_get(void) goto end; } - colander_comp_cls = bt_private_component_class_sink_create( - "colander", colander_consume); + colander_comp_cls = bt_component_class_sink_create("colander", + colander_consume); if (!colander_comp_cls) { BT_LOGE_STR("Cannot create sink colander component class."); goto end; } - (void) bt_private_component_class_sink_set_init_method( + (void) bt_component_class_sink_set_init_method( colander_comp_cls, colander_init); - (void) bt_private_component_class_sink_set_finalize_method( + (void) bt_component_class_sink_set_finalize_method( colander_comp_cls, colander_finalize); - (void) bt_private_component_class_sink_set_input_port_connected_method( - colander_comp_cls, colander_input_port_connected); + (void) bt_component_class_sink_set_graph_is_configured_method( + colander_comp_cls, colander_graph_is_configured); end: - return bt_object_get_ref( - bt_private_component_class_sink_borrow_component_class_sink( - colander_comp_cls)); + bt_object_get_ref(colander_comp_cls); + return (void *) colander_comp_cls; } __attribute__((destructor)) static