X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Futils%2Fdummy%2Fdummy.c;h=31d1b70db2d83b2ec41c1b933968631ee8bcebda;hb=28e6ca8b6e08d1cdd1af81ae819aa39baa206eaf;hp=5f7c62d64b56dbe4b145fab37b88ec6ca6dfee52;hpb=fa054faf3a18fd8003510c32718c1fd4fbf3dd46;p=babeltrace.git diff --git a/plugins/utils/dummy/dummy.c b/plugins/utils/dummy/dummy.c index 5f7c62d6..31d1b70d 100644 --- a/plugins/utils/dummy/dummy.c +++ b/plugins/utils/dummy/dummy.c @@ -20,27 +20,15 @@ * SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include #include -#include +#include #include "dummy.h" -static void destroy_private_dummy_data(struct dummy *dummy) { - if (dummy->iterators) { - g_ptr_array_free(dummy->iterators, TRUE); - } + bt_object_put_ref(dummy->notif_iter); g_free(dummy); } @@ -48,9 +36,9 @@ void dummy_finalize(struct bt_private_component *component) { struct dummy *dummy; - assert(component); + BT_ASSERT(component); dummy = bt_private_component_get_user_data(component); - assert(dummy); + BT_ASSERT(dummy); destroy_private_dummy_data(dummy); } @@ -59,25 +47,15 @@ enum bt_component_status dummy_init(struct bt_private_component *component, { enum bt_component_status ret; struct dummy *dummy = g_new0(struct dummy, 1); - void *priv_port; if (!dummy) { ret = BT_COMPONENT_STATUS_NOMEM; goto end; } - priv_port = bt_private_component_sink_add_input_private_port(component, - "in", NULL); - if (!priv_port) { - ret = BT_COMPONENT_STATUS_NOMEM; - goto end; - } - - bt_put(priv_port); - dummy->iterators = g_ptr_array_new_with_free_func( - (GDestroyNotify) bt_put); - if (!dummy->iterators) { - ret = BT_COMPONENT_STATUS_NOMEM; + ret = bt_private_component_sink_add_input_port(component, + "in", NULL, NULL); + if (ret != BT_COMPONENT_STATUS_OK) { goto end; } @@ -85,82 +63,87 @@ enum bt_component_status dummy_init(struct bt_private_component *component, if (ret != BT_COMPONENT_STATUS_OK) { goto error; } -end: - return ret; + + goto end; + error: destroy_private_dummy_data(dummy); + +end: return ret; } -void dummy_port_connected( +enum bt_component_status dummy_port_connected( struct bt_private_component *component, struct bt_private_port *self_port, struct bt_port *other_port) { + enum bt_component_status status = BT_COMPONENT_STATUS_OK; struct dummy *dummy; struct bt_notification_iterator *iterator; struct bt_private_connection *connection; + enum bt_connection_status conn_status; dummy = bt_private_component_get_user_data(component); - assert(dummy); - connection = bt_private_port_get_private_connection(self_port); - assert(connection); - iterator = bt_private_connection_create_notification_iterator( - connection, NULL); - if (!iterator) { - dummy->error = true; + BT_ASSERT(dummy); + connection = bt_private_port_get_connection(self_port); + BT_ASSERT(connection); + conn_status = bt_private_connection_create_notification_iterator( + connection, &iterator); + if (conn_status != BT_CONNECTION_STATUS_OK) { + status = BT_COMPONENT_STATUS_ERROR; goto end; } - g_ptr_array_add(dummy->iterators, iterator); + BT_OBJECT_MOVE_REF(dummy->notif_iter, iterator); end: - bt_put(connection); + bt_object_put_ref(connection); + return status; } enum bt_component_status dummy_consume(struct bt_private_component *component) { enum bt_component_status ret = BT_COMPONENT_STATUS_OK; - struct bt_notification *notif = NULL; - size_t i; + bt_notification_array notifs; + uint64_t count; struct dummy *dummy; + enum bt_notification_iterator_status it_ret; + uint64_t i; dummy = bt_private_component_get_user_data(component); - assert(dummy); + BT_ASSERT(dummy); - if (unlikely(dummy->error)) { - ret = BT_COMPONENT_STATUS_ERROR; + if (unlikely(!dummy->notif_iter)) { + ret = BT_COMPONENT_STATUS_END; goto end; } - /* Consume one notification from each iterator. */ - for (i = 0; i < dummy->iterators->len; i++) { - struct bt_notification_iterator *it; - enum bt_notification_iterator_status it_ret; - - it = g_ptr_array_index(dummy->iterators, i); - - it_ret = bt_notification_iterator_next(it); - switch (it_ret) { - case BT_NOTIFICATION_ITERATOR_STATUS_ERROR: - ret = BT_COMPONENT_STATUS_ERROR; - goto end; - case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN: - ret = BT_COMPONENT_STATUS_AGAIN; - goto end; - case BT_NOTIFICATION_ITERATOR_STATUS_END: - g_ptr_array_remove_index(dummy->iterators, i); - i--; - continue; - default: - break; + /* Consume one notification */ + it_ret = bt_private_connection_notification_iterator_next( + dummy->notif_iter, ¬ifs, &count); + switch (it_ret) { + case BT_NOTIFICATION_ITERATOR_STATUS_OK: + ret = BT_COMPONENT_STATUS_OK; + + for (i = 0; i < count; i++) { + bt_object_put_ref(notifs[i]); } - } - if (dummy->iterators->len == 0) { + break; + case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN: + ret = BT_COMPONENT_STATUS_AGAIN; + goto end; + case BT_NOTIFICATION_ITERATOR_STATUS_END: ret = BT_COMPONENT_STATUS_END; + goto end; + case BT_NOTIFICATION_ITERATOR_STATUS_ERROR: + ret = BT_COMPONENT_STATUS_ERROR; + goto end; + default: + break; } + end: - bt_put(notif); return ret; }