#include <babeltrace/graph/private-component-sink.h>
#include <babeltrace/graph/private-port.h>
#include <babeltrace/graph/private-connection.h>
+#include <babeltrace/graph/private-connection-notification-iterator.h>
#include <babeltrace/graph/private-component.h>
#include <babeltrace/graph/component-class-sink-colander-internal.h>
#include <babeltrace/assert-internal.h>
struct bt_component_class *colander_comp_cls;
struct colander_data {
- struct bt_notification **user_notif;
- enum bt_notification_type *notif_types;
+ bt_notification_array notifs;
+ uint64_t *count_addr;
struct bt_notification_iterator *notif_iter;
};
struct colander_data *colander_data = NULL;
struct bt_component_class_sink_colander_data *user_provided_data =
init_method_data;
- const enum bt_notification_type *notif_type;
if (!init_method_data) {
BT_LOGW_STR("Component initialization method data is NULL.");
goto end;
}
- colander_data->user_notif = user_provided_data->notification;
-
- if (user_provided_data->notification_types) {
- notif_type = user_provided_data->notification_types;
- unsigned long count;
-
- while (*notif_type != BT_NOTIFICATION_TYPE_SENTINEL) {
- notif_type++;
- }
-
- count = notif_type - user_provided_data->notification_types + 1;
-
- colander_data->notif_types =
- g_new0(enum bt_notification_type, count);
- if (!colander_data->notif_types) {
- BT_LOGE_STR("Failed to allocate an array of notification types.");
- status = BT_COMPONENT_STATUS_NOMEM;
- goto end;
- }
-
- memcpy(colander_data->notif_types,
- user_provided_data->notification_types,
- count * sizeof(enum bt_notification_type));
- }
-
+ colander_data->notifs = user_provided_data->notifs;
+ colander_data->count_addr = user_provided_data->count_addr;
status = bt_private_component_sink_add_input_private_port(
priv_comp, "in", NULL, NULL);
if (status != BT_COMPONENT_STATUS_OK) {
bt_put(colander_data->notif_iter);
}
- g_free(colander_data->notif_types);
g_free(colander_data);
}
BT_ASSERT(colander_data);
BT_PUT(colander_data->notif_iter);
conn_status = bt_private_connection_create_notification_iterator(
- priv_conn, colander_data->notif_types,
- &colander_data->notif_iter);
+ priv_conn, &colander_data->notif_iter);
if (conn_status) {
BT_LOGE("Cannot create notification iterator from connection: "
"comp-addr=%p, conn-addr=%p", priv_comp, priv_conn);
{
enum bt_component_status status = BT_COMPONENT_STATUS_OK;
enum bt_notification_iterator_status notif_iter_status;
- struct bt_notification *notif = NULL;
struct colander_data *colander_data =
bt_private_component_get_user_data(priv_comp);
+ bt_notification_array notifs;
BT_ASSERT(colander_data);
goto end;
}
- notif_iter_status = bt_notification_iterator_next(
- colander_data->notif_iter);
+ notif_iter_status = bt_private_connection_notification_iterator_next(
+ colander_data->notif_iter, ¬ifs, colander_data->count_addr);
switch (notif_iter_status) {
case BT_NOTIFICATION_ITERATOR_STATUS_CANCELED:
status = BT_COMPONENT_STATUS_OK;
status = BT_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);
break;
default:
status = BT_COMPONENT_STATUS_ERROR;
goto end;
}
- notif = bt_notification_iterator_get_notification(
- colander_data->notif_iter);
- BT_ASSERT(notif);
-
end:
/* Move notification to user's pointer, even if NULL. */
- *colander_data->user_notif = notif;
return status;
}