From 07245ac23157616e3f4ff611341f18193de8e37d Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Wed, 6 Jun 2018 16:52:03 -0400 Subject: [PATCH] lib: simplify the public notification iterator interfaces Simplify the public notification iterator interfaces so as to remove: * bt_notification_iterator_borrow_notification() * bt_notification_iterator_get_notification() * bt_notification_iterator_next() in favor of: enum bt_notification_iterator_status bt_output_port_notification_iterator_next(struct bt_notification_iterator *iterator, struct bt_notification **notification); enum bt_notification_iterator_status bt_private_connection_notification_iterator_next( struct bt_notification_iterator *iterator, struct bt_notification **notification); Those two new functions: * Move the notification received from the user method to the `notification` output variable directly without modifying the reference count. * Do not need to check the notification iterator type of notification to perform the appropriate specific operation and have precondition checks to ensure `iterator` has the right type. This API is also in line with some popular iterator interfaces where the "next" function returns the iteration status and the element at the same time, for example: * g_hash_table_iter_next() * Python's next() Signed-off-by: Philippe Proulx --- .../graph/notification-iterator-internal.h | 23 +-- .../babeltrace/graph/notification-iterator.h | 35 ---- .../graph/output-port-notification-iterator.h | 9 +- ...private-connection-notification-iterator.h | 9 + lib/graph/component-class-sink-colander.c | 7 +- lib/graph/iterator.c | 160 +++++++----------- lib/lib-logging.c | 3 - plugins/text/pretty/pretty.c | 10 +- plugins/utils/counter/counter.c | 9 +- plugins/utils/dummy/dummy.c | 3 +- plugins/utils/muxer/muxer.c | 17 +- tests/lib/test_bt_notification_iterator.c | 19 ++- tests/plugins/test-utils-muxer.c | 5 +- 13 files changed, 117 insertions(+), 192 deletions(-) diff --git a/include/babeltrace/graph/notification-iterator-internal.h b/include/babeltrace/graph/notification-iterator-internal.h index 2d2ef9ca..5cac60a6 100644 --- a/include/babeltrace/graph/notification-iterator-internal.h +++ b/include/babeltrace/graph/notification-iterator-internal.h @@ -87,7 +87,6 @@ enum bt_private_connection_notification_iterator_state { struct bt_notification_iterator { struct bt_object base; enum bt_notification_iterator_type type; - struct bt_notification *current_notification; /* owned by this */ }; struct bt_notification_iterator_private_connection { @@ -125,26 +124,10 @@ struct bt_notification_iterator_output_port { struct bt_notification_iterator base; struct bt_graph *graph; /* Owned by this */ struct bt_component *colander; /* Owned by this */ - struct bt_port *output_port; /* Owned by this */ -}; - -static inline -struct bt_notification *bt_notification_iterator_borrow_current_notification( - struct bt_notification_iterator *iterator) -{ - BT_ASSERT(iterator); - return iterator->current_notification; -} -static inline -void bt_notification_iterator_replace_current_notification( - struct bt_notification_iterator *iterator, - struct bt_notification *notification) -{ - BT_ASSERT(iterator); - bt_put(iterator->current_notification); - iterator->current_notification = bt_get(notification); -} + /* Only used temporarily: should always be NULL */ + struct bt_notification *notif; +}; static inline struct bt_private_connection_private_notification_iterator * diff --git a/include/babeltrace/graph/notification-iterator.h b/include/babeltrace/graph/notification-iterator.h index a062f2e4..dcaafb0e 100644 --- a/include/babeltrace/graph/notification-iterator.h +++ b/include/babeltrace/graph/notification-iterator.h @@ -61,41 +61,6 @@ enum bt_notification_iterator_status { BT_NOTIFICATION_ITERATOR_STATUS_UNSUPPORTED = -2, }; -extern struct bt_notification *bt_notification_iterator_borrow_notification( - struct bt_notification_iterator *iterator); - -/** - * Get current notification at iterator's position. - * - * This functions will not advance the cursor's position. - * The returned notification's reference count is already incremented. - * - * @param iterator Iterator instance - * @returns Returns a bt_notification instance - * - * @see bt_put() - */ -static inline -struct bt_notification *bt_notification_iterator_get_notification( - struct bt_notification_iterator *iterator) -{ - return bt_get(bt_notification_iterator_borrow_notification(iterator)); -} - -/** - * Advance the iterator's position forward. - * - * This function can be called repeatedly to iterate through the iterator's - * associated trace. - * - * @param iterator Iterator instance - * @returns Returns a bt_notification instance - * - * @see bt_notification_iterator_get_notification() - */ -extern enum bt_notification_iterator_status -bt_notification_iterator_next(struct bt_notification_iterator *iterator); - #ifdef __cplusplus } #endif diff --git a/include/babeltrace/graph/output-port-notification-iterator.h b/include/babeltrace/graph/output-port-notification-iterator.h index 750fff7d..d5c897d3 100644 --- a/include/babeltrace/graph/output-port-notification-iterator.h +++ b/include/babeltrace/graph/output-port-notification-iterator.h @@ -23,19 +23,24 @@ * SOFTWARE. */ -/* For enum bt_notification_type */ -#include +/* For enum bt_notification_iterator_status */ +#include #ifdef __cplusplus extern "C" { #endif struct bt_port; +struct bt_notification; struct bt_notification_iterator; extern struct bt_notification_iterator *bt_output_port_notification_iterator_create( struct bt_port *port, const char *colander_component_name); +extern enum bt_notification_iterator_status +bt_output_port_notification_iterator_next(struct bt_notification_iterator *iterator, + struct bt_notification **notification); + #ifdef __cplusplus } #endif diff --git a/include/babeltrace/graph/private-connection-notification-iterator.h b/include/babeltrace/graph/private-connection-notification-iterator.h index 6075da07..b1a3dc2d 100644 --- a/include/babeltrace/graph/private-connection-notification-iterator.h +++ b/include/babeltrace/graph/private-connection-notification-iterator.h @@ -23,16 +23,25 @@ * SOFTWARE. */ +/* For enum bt_notification_iterator_status */ +#include + #ifdef __cplusplus extern "C" { #endif struct bt_component; +struct bt_notification; struct bt_notification_iterator; extern struct bt_component *bt_private_connection_notification_iterator_get_component( struct bt_notification_iterator *iterator); +extern enum bt_notification_iterator_status +bt_private_connection_notification_iterator_next( + struct bt_notification_iterator *iterator, + struct bt_notification **notification); + #ifdef __cplusplus } #endif diff --git a/lib/graph/component-class-sink-colander.c b/lib/graph/component-class-sink-colander.c index d69989a2..e9e23d54 100644 --- a/lib/graph/component-class-sink-colander.c +++ b/lib/graph/component-class-sink-colander.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -142,8 +143,8 @@ enum bt_component_status colander_consume( 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, ¬if); switch (notif_iter_status) { case BT_NOTIFICATION_ITERATOR_STATUS_CANCELED: status = BT_COMPONENT_STATUS_OK; @@ -161,8 +162,6 @@ enum bt_component_status colander_consume( goto end; } - notif = bt_notification_iterator_get_notification( - colander_data->notif_iter); BT_ASSERT(notif); end: diff --git a/lib/graph/iterator.c b/lib/graph/iterator.c index 799888bc..b5eb5649 100644 --- a/lib/graph/iterator.c +++ b/lib/graph/iterator.c @@ -137,12 +137,8 @@ end: static void destroy_base_notification_iterator(struct bt_object *obj) { - struct bt_notification_iterator *iterator = - container_of(obj, struct bt_notification_iterator, base); - - BT_LOGD_STR("Putting current notification."); - bt_put(iterator->current_notification); - g_free(iterator); + BT_ASSERT(obj); + g_free(obj); } static @@ -163,7 +159,7 @@ void bt_private_connection_notification_iterator_destroy(struct bt_object *obj) * would be called again. */ obj->ref_count.count++; - iterator = (void *) container_of(obj, struct bt_notification_iterator, base); + iterator = (void *) obj; BT_LOGD("Destroying private connection notification iterator object: addr=%p", iterator); bt_private_connection_notification_iterator_finalize(iterator); @@ -402,13 +398,6 @@ struct bt_graph *bt_private_connection_private_notification_iterator_borrow_grap return iterator->graph; } -struct bt_notification *bt_notification_iterator_borrow_notification( - struct bt_notification_iterator *iterator) -{ - BT_ASSERT_PRE_NON_NULL(iterator, "Notification iterator"); - return bt_notification_iterator_borrow_current_notification(iterator); -} - BT_ASSERT_PRE_FUNC static inline void bt_notification_borrow_packet_stream(struct bt_notification *notif, @@ -638,11 +627,13 @@ end: return ret; } -static enum bt_notification_iterator_status -bt_priv_conn_private_notification_iterator_next( - struct bt_notification_iterator_private_connection *iterator) +bt_private_connection_notification_iterator_next( + struct bt_notification_iterator *user_iterator, + struct bt_notification **user_notif) { + struct bt_notification_iterator_private_connection *iterator = + (void *) user_iterator; struct bt_private_connection_private_notification_iterator *priv_iterator = bt_private_connection_private_notification_iterator_from_notification_iterator(iterator); bt_component_class_notification_iterator_next_method next_method = NULL; @@ -653,8 +644,13 @@ bt_priv_conn_private_notification_iterator_next( enum bt_notification_iterator_status status = BT_NOTIFICATION_ITERATOR_STATUS_OK; - BT_ASSERT(iterator); - BT_LIB_LOGD("Getting next notification iterator's notification: %!+i", + BT_ASSERT_PRE_NON_NULL(user_iterator, "Notification iterator"); + BT_ASSERT_PRE_NON_NULL(user_notif, "Notification"); + BT_ASSERT_PRE(user_iterator->type == + BT_NOTIFICATION_ITERATOR_TYPE_PRIVATE_CONNECTION, + "Notification iterator was not created from a private connection: " + "%!+i", iterator); + BT_LIB_LOGD("Getting next private connection notification iterator's notification: %!+i", iterator); BT_ASSERT_PRE(iterator->state == BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_ACTIVE, @@ -752,9 +748,7 @@ bt_priv_conn_private_notification_iterator_next( "Notification is invalid at this point: " "%![notif-iter-]+i, %![notif-]+n", iterator, next_return.notification); - bt_notification_iterator_replace_current_notification( - (void *) iterator, next_return.notification); - bt_put(next_return.notification); + *user_notif = next_return.notification; break; default: /* Unknown non-error status */ @@ -766,86 +760,51 @@ end: } enum bt_notification_iterator_status -bt_notification_iterator_next(struct bt_notification_iterator *iterator) +bt_output_port_notification_iterator_next( + struct bt_notification_iterator *iterator, + struct bt_notification **user_notif) { enum bt_notification_iterator_status status; + struct bt_notification_iterator_output_port *out_port_iter = + (void *) iterator; + enum bt_graph_status graph_status; BT_ASSERT_PRE_NON_NULL(iterator, "Notification iterator"); - BT_LOGD("Notification iterator's \"next\": iter-addr=%p", iterator); - BT_ASSERT(iterator->type == BT_NOTIFICATION_ITERATOR_TYPE_PRIVATE_CONNECTION || - iterator->type == BT_NOTIFICATION_ITERATOR_TYPE_OUTPUT_PORT); - - switch (iterator->type) { - case BT_NOTIFICATION_ITERATOR_TYPE_PRIVATE_CONNECTION: - { - struct bt_notification_iterator_private_connection *priv_conn_iter = - (void *) iterator; - - /* - * Make sure that the iterator's queue contains at least - * one notification. - */ - status = bt_priv_conn_private_notification_iterator_next( - priv_conn_iter); + BT_ASSERT_PRE_NON_NULL(user_notif, "Notification"); + BT_ASSERT_PRE(iterator->type == + BT_NOTIFICATION_ITERATOR_TYPE_OUTPUT_PORT, + "Notification iterator was not created from an output port: " + "%!+i", iterator); + BT_LIB_LOGD("Getting next output port notification iterator's notification: %!+i", + iterator); + graph_status = bt_graph_consume_sink_no_check( + out_port_iter->graph, out_port_iter->colander); + switch (graph_status) { + case BT_GRAPH_STATUS_CANCELED: + BT_ASSERT(!out_port_iter->notif); + status = BT_NOTIFICATION_ITERATOR_STATUS_CANCELED; break; - } - case BT_NOTIFICATION_ITERATOR_TYPE_OUTPUT_PORT: - { - struct bt_notification_iterator_output_port *out_port_iter = - (void *) iterator; - - /* - * Keep current notification in case there's an error: - * restore this notification so that the current - * notification is not changed from the user's point of - * view. - */ - struct bt_notification *old_notif = - bt_get(bt_notification_iterator_borrow_current_notification(iterator)); - enum bt_graph_status graph_status; - - /* - * Put current notification since it's possibly - * about to be replaced by a new one by the - * colander sink. - */ - bt_notification_iterator_replace_current_notification( - iterator, NULL); - graph_status = bt_graph_consume_sink_no_check( - out_port_iter->graph, out_port_iter->colander); - switch (graph_status) { - case BT_GRAPH_STATUS_CANCELED: - status = BT_NOTIFICATION_ITERATOR_STATUS_CANCELED; - break; - case BT_GRAPH_STATUS_AGAIN: - status = BT_NOTIFICATION_ITERATOR_STATUS_AGAIN; - break; - case BT_GRAPH_STATUS_END: - status = BT_NOTIFICATION_ITERATOR_STATUS_END; - break; - case BT_GRAPH_STATUS_NOMEM: - status = BT_NOTIFICATION_ITERATOR_STATUS_NOMEM; - break; - case BT_GRAPH_STATUS_OK: - status = BT_NOTIFICATION_ITERATOR_STATUS_OK; - BT_ASSERT(bt_notification_iterator_borrow_current_notification(iterator)); - break; - default: - /* Other errors */ - status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR; - } - - if (status != BT_NOTIFICATION_ITERATOR_STATUS_OK) { - /* Error/exception: restore old notification */ - bt_notification_iterator_replace_current_notification( - iterator, old_notif); - } - - bt_put(old_notif); + case BT_GRAPH_STATUS_AGAIN: + BT_ASSERT(!out_port_iter->notif); + status = BT_NOTIFICATION_ITERATOR_STATUS_AGAIN; + break; + case BT_GRAPH_STATUS_END: + BT_ASSERT(!out_port_iter->notif); + status = BT_NOTIFICATION_ITERATOR_STATUS_END; + break; + case BT_GRAPH_STATUS_NOMEM: + BT_ASSERT(!out_port_iter->notif); + status = BT_NOTIFICATION_ITERATOR_STATUS_NOMEM; + break; + case BT_GRAPH_STATUS_OK: + BT_ASSERT(out_port_iter->notif); + status = BT_NOTIFICATION_ITERATOR_STATUS_OK; + *user_notif = out_port_iter->notif; + out_port_iter->notif = NULL; break; - } default: - abort(); + /* Other errors */ + status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR; } return status; @@ -882,10 +841,9 @@ void bt_output_port_notification_iterator_destroy(struct bt_object *obj) BT_LOGD("Destroying output port notification iterator object: addr=%p", iterator); + BT_ASSERT(!iterator->notif); BT_LOGD_STR("Putting graph."); bt_put(iterator->graph); - BT_LOGD_STR("Putting output port."); - bt_put(iterator->output_port); BT_LOGD_STR("Putting colander sink component."); bt_put(iterator->colander); destroy_base_notification_iterator(obj); @@ -895,7 +853,6 @@ struct bt_notification_iterator *bt_output_port_notification_iterator_create( struct bt_port *output_port, const char *colander_component_name) { - struct bt_notification_iterator *iterator_base = NULL; struct bt_notification_iterator_output_port *iterator = NULL; struct bt_component_class *colander_comp_cls = NULL; struct bt_component *output_port_comp = NULL; @@ -938,10 +895,9 @@ struct bt_notification_iterator *bt_output_port_notification_iterator_create( } BT_MOVE(iterator->graph, graph); - iterator_base = (void *) iterator; colander_comp_name = colander_component_name ? colander_component_name : "colander"; - colander_data.notification = &iterator_base->current_notification; + colander_data.notification = &iterator->notif; graph_status = bt_graph_add_component_with_init_method_data( iterator->graph, colander_comp_cls, colander_comp_name, NULL, &colander_data, &iterator->colander); @@ -975,8 +931,8 @@ struct bt_notification_iterator *bt_output_port_notification_iterator_create( * nonconsumable forever so that only this notification iterator * can consume (thanks to bt_graph_consume_sink_no_check()). * This avoids leaking the notification created by the colander - * sink and moved to the base notification iterator's current - * notification member. + * sink and moved to the notification iterator's notification + * member. */ bt_graph_set_can_consume(iterator->graph, BT_FALSE); goto end; diff --git a/lib/lib-logging.c b/lib/lib-logging.c index d1ac59e6..eedcae71 100644 --- a/lib/lib-logging.c +++ b/lib/lib-logging.c @@ -1325,9 +1325,6 @@ static inline void format_notification_iterator(char **buf_ch, SET_TMP_PREFIX("colander-comp-"); format_component(buf_ch, false, tmp_prefix, iter_output_port->colander); - SET_TMP_PREFIX("output-port-"); - format_port(buf_ch, false, tmp_prefix, - iter_output_port->output_port); break; } default: diff --git a/plugins/text/pretty/pretty.c b/plugins/text/pretty/pretty.c index 34b5254d..77626676 100644 --- a/plugins/text/pretty/pretty.c +++ b/plugins/text/pretty/pretty.c @@ -179,7 +179,7 @@ BT_HIDDEN enum bt_component_status pretty_consume(struct bt_private_component *component) { enum bt_component_status ret; - struct bt_notification *notification = NULL; + struct bt_notification *notif = NULL; struct bt_notification_iterator *it; struct pretty_component *pretty = bt_private_component_get_user_data(component); @@ -191,7 +191,7 @@ enum bt_component_status pretty_consume(struct bt_private_component *component) } it = pretty->input_iterator; - it_ret = bt_notification_iterator_next(it); + it_ret = bt_private_connection_notification_iterator_next(it, ¬if); switch (it_ret) { case BT_NOTIFICATION_ITERATOR_STATUS_END: @@ -208,11 +208,11 @@ enum bt_component_status pretty_consume(struct bt_private_component *component) goto end; } - notification = bt_notification_iterator_borrow_notification(it); - BT_ASSERT(notification); - ret = handle_notification(pretty, notification); + BT_ASSERT(notif); + ret = handle_notification(pretty, notif); end: + bt_put(notif); return ret; } diff --git a/plugins/utils/counter/counter.c b/plugins/utils/counter/counter.c index 125f6b2e..7ff3d339 100644 --- a/plugins/utils/counter/counter.c +++ b/plugins/utils/counter/counter.c @@ -215,6 +215,7 @@ enum bt_component_status counter_consume(struct bt_private_component *component) struct counter *counter; enum bt_notification_iterator_status it_ret; int64_t count; + struct bt_notification *notif = NULL; counter = bt_private_component_get_user_data(component); BT_ASSERT(counter); @@ -231,7 +232,8 @@ enum bt_component_status counter_consume(struct bt_private_component *component) } /* Consume one notification */ - it_ret = bt_notification_iterator_next(counter->notif_iter); + it_ret = bt_private_connection_notification_iterator_next( + counter->notif_iter, ¬if); if (it_ret < 0) { ret = BT_COMPONENT_STATUS_ERROR; goto end; @@ -247,10 +249,6 @@ enum bt_component_status counter_consume(struct bt_private_component *component) goto end; case BT_NOTIFICATION_ITERATOR_STATUS_OK: { - struct bt_notification *notif = - bt_notification_iterator_borrow_notification( - counter->notif_iter); - BT_ASSERT(notif); switch (bt_notification_get_type(notif)) { case BT_NOTIFICATION_TYPE_EVENT: @@ -298,5 +296,6 @@ enum bt_component_status counter_consume(struct bt_private_component *component) try_print_count(counter); end: + bt_put(notif); return ret; } diff --git a/plugins/utils/dummy/dummy.c b/plugins/utils/dummy/dummy.c index 0535b958..5109259e 100644 --- a/plugins/utils/dummy/dummy.c +++ b/plugins/utils/dummy/dummy.c @@ -121,7 +121,8 @@ enum bt_component_status dummy_consume(struct bt_private_component *component) } /* Consume one notification */ - it_ret = bt_notification_iterator_next(dummy->notif_iter); + it_ret = bt_private_connection_notification_iterator_next( + dummy->notif_iter, ¬if); switch (it_ret) { case BT_NOTIFICATION_ITERATOR_STATUS_ERROR: ret = BT_COMPONENT_STATUS_ERROR; diff --git a/plugins/utils/muxer/muxer.c b/plugins/utils/muxer/muxer.c index 1f87b216..61cd4883 100644 --- a/plugins/utils/muxer/muxer.c +++ b/plugins/utils/muxer/muxer.c @@ -61,6 +61,9 @@ struct muxer_upstream_notif_iter { /* Owned by this, NULL if ended */ struct bt_notification_iterator *notif_iter; + /* Owned by this */ + struct bt_notification *notif; + /* * This flag is true if the upstream notification iterator's * current notification must be considered for the multiplexing @@ -135,6 +138,7 @@ void destroy_muxer_upstream_notif_iter( muxer_upstream_notif_iter->notif_iter, muxer_upstream_notif_iter->is_valid); bt_put(muxer_upstream_notif_iter->notif_iter); + bt_put(muxer_upstream_notif_iter->notif); g_free(muxer_upstream_notif_iter); } @@ -448,13 +452,14 @@ enum bt_notification_iterator_status muxer_upstream_notif_iter_next( struct muxer_upstream_notif_iter *muxer_upstream_notif_iter) { enum bt_notification_iterator_status status; + struct bt_notification *notif = NULL; BT_LOGV("Calling upstream notification iterator's \"next\" method: " "muxer-upstream-notif-iter-wrap-addr=%p, notif-iter-addr=%p", muxer_upstream_notif_iter, muxer_upstream_notif_iter->notif_iter); - status = bt_notification_iterator_next( - muxer_upstream_notif_iter->notif_iter); + status = bt_private_connection_notification_iterator_next( + muxer_upstream_notif_iter->notif_iter, ¬if); BT_LOGV("Upstream notification iterator's \"next\" method returned: " "status=%s", bt_notification_iterator_status_string(status)); @@ -466,6 +471,7 @@ enum bt_notification_iterator_status muxer_upstream_notif_iter_next( */ BT_LOGV_STR("Validated upstream notification iterator wrapper."); muxer_upstream_notif_iter->is_valid = true; + BT_MOVE(muxer_upstream_notif_iter->notif, notif); break; case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN: /* @@ -497,6 +503,7 @@ enum bt_notification_iterator_status muxer_upstream_notif_iter_next( break; } + BT_ASSERT(!notif); return status; } @@ -900,8 +907,7 @@ muxer_notif_iter_youngest_upstream_notif_iter( } BT_ASSERT(cur_muxer_upstream_notif_iter->is_valid); - notif = bt_notification_iterator_borrow_notification( - cur_muxer_upstream_notif_iter->notif_iter); + notif = cur_muxer_upstream_notif_iter->notif; BT_ASSERT(notif); ret = get_notif_ts_ns(muxer_comp, muxer_notif_iter, notif, muxer_notif_iter->last_returned_ts_ns, ¬if_ts_ns); @@ -1106,8 +1112,7 @@ struct bt_notification_iterator_next_method_return muxer_notif_iter_do_next( muxer_notif_iter, muxer_upstream_notif_iter, next_return_ts); BT_ASSERT(next_return.status == BT_NOTIFICATION_ITERATOR_STATUS_OK); BT_ASSERT(muxer_upstream_notif_iter); - next_return.notification = bt_notification_iterator_get_notification( - muxer_upstream_notif_iter->notif_iter); + next_return.notification = bt_get(muxer_upstream_notif_iter->notif); BT_ASSERT(next_return.notification); /* diff --git a/tests/lib/test_bt_notification_iterator.c b/tests/lib/test_bt_notification_iterator.c index 97c2075a..4ccd8876 100644 --- a/tests/lib/test_bt_notification_iterator.c +++ b/tests/lib/test_bt_notification_iterator.c @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -560,7 +561,8 @@ void src_finalize(struct bt_private_component *private_component) static enum bt_notification_iterator_status common_consume( - struct bt_notification_iterator *notif_iter) + struct bt_notification_iterator *notif_iter, + bool is_output_port_notif_iter) { enum bt_notification_iterator_status ret; struct bt_notification *notification = NULL; @@ -568,7 +570,14 @@ enum bt_notification_iterator_status common_consume( bool do_append_test_event = true; BT_ASSERT(notif_iter); - ret = bt_notification_iterator_next(notif_iter); + if (is_output_port_notif_iter) { + ret = bt_output_port_notification_iterator_next(notif_iter, + ¬ification); + } else { + ret = bt_private_connection_notification_iterator_next( + notif_iter, ¬ification); + } + if (ret < 0) { do_append_test_event = false; goto end; @@ -584,8 +593,6 @@ enum bt_notification_iterator_status common_consume( break; } - notification = bt_notification_iterator_get_notification( - notif_iter); BT_ASSERT(notification); switch (bt_notification_get_type(notification)) { @@ -656,7 +663,7 @@ enum bt_component_status sink_consume( enum bt_notification_iterator_status it_ret; BT_ASSERT(user_data && user_data->notif_iter); - it_ret = common_consume(user_data->notif_iter); + it_ret = common_consume(user_data->notif_iter, false); if (it_ret < 0) { ret = BT_COMPONENT_STATUS_ERROR; @@ -899,7 +906,7 @@ void test_output_port_notification_iterator(void) /* Consume the notification iterator */ while (iter_status == BT_NOTIFICATION_ITERATOR_STATUS_OK) { - iter_status = common_consume(notif_iter); + iter_status = common_consume(notif_iter, true); } ok(iter_status == BT_NOTIFICATION_ITERATOR_STATUS_END, diff --git a/tests/plugins/test-utils-muxer.c b/tests/plugins/test-utils-muxer.c index 7648fa11..5cbe9fee 100644 --- a/tests/plugins/test-utils-muxer.c +++ b/tests/plugins/test-utils-muxer.c @@ -767,7 +767,8 @@ enum bt_component_status sink_consume( bool do_append_test_event = true; BT_ASSERT(user_data && user_data->notif_iter); - it_ret = bt_notification_iterator_next(user_data->notif_iter); + it_ret = bt_private_connection_notification_iterator_next( + user_data->notif_iter, ¬ification); if (it_ret < 0) { ret = BT_COMPONENT_STATUS_ERROR; @@ -789,8 +790,6 @@ enum bt_component_status sink_consume( break; } - notification = bt_notification_iterator_get_notification( - user_data->notif_iter); BT_ASSERT(notification); switch (bt_notification_get_type(notification)) { -- 2.34.1