lib: simplify the public notification iterator interfaces
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Wed, 6 Jun 2018 20:52:03 +0000 (16:52 -0400)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Thu, 2 May 2019 04:05:45 +0000 (00:05 -0400)
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 <eeppeliteloop@gmail.com>
13 files changed:
include/babeltrace/graph/notification-iterator-internal.h
include/babeltrace/graph/notification-iterator.h
include/babeltrace/graph/output-port-notification-iterator.h
include/babeltrace/graph/private-connection-notification-iterator.h
lib/graph/component-class-sink-colander.c
lib/graph/iterator.c
lib/lib-logging.c
plugins/text/pretty/pretty.c
plugins/utils/counter/counter.c
plugins/utils/dummy/dummy.c
plugins/utils/muxer/muxer.c
tests/lib/test_bt_notification_iterator.c
tests/plugins/test-utils-muxer.c

index 2d2ef9cabf08eacccf91e980c633fb209aa4a226..5cac60a621603691cf4d04364da16fb8fd5cdcc7 100644 (file)
@@ -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 *
index a062f2e4d581142a8853c0feec7a36c110449a23..dcaafb0e2a275e2138732fd3eec9b1f6edd674dc 100644 (file)
@@ -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 <b>not</b> 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
index 750fff7d7e35b6c9eae3b597ae69e8523478bb29..d5c897d385caa61fbb453af4d10d345c728e281a 100644 (file)
  * SOFTWARE.
  */
 
-/* For enum bt_notification_type */
-#include <babeltrace/graph/notification.h>
+/* For enum bt_notification_iterator_status */
+#include <babeltrace/graph/notification-iterator.h>
 
 #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
index 6075da078dc43c1404abf9733990fa66953b9a9a..b1a3dc2d20f2448c48c5aced366064381cf6b9e9 100644 (file)
  * SOFTWARE.
  */
 
+/* For enum bt_notification_iterator_status */
+#include <babeltrace/graph/notification-iterator.h>
+
 #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
index d69989a278fc18cbe9f39169cebceec5f0410893..e9e23d54ac065a069fa5dc917f48e12b7aa98f67 100644 (file)
@@ -29,6 +29,7 @@
 #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>
@@ -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, &notif);
        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:
index 799888bc4f772b1e1bd01267f2ebe7da9b9183b9..b5eb5649118abb7cbb01cff18ff3e70f29685566 100644 (file)
@@ -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;
index d1ac59e6e349cf18e4554eab67559b9f669b7f4d..eedcae710854dc6f12c428ace7c6e7b43d09bcfe 100644 (file)
@@ -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:
index 34b5254d67591c53623a23f3b7dab3caf0c3f172..776266765e25a99656ce799813de158459070012 100644 (file)
@@ -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, &notif);
 
        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;
 }
 
index 125f6b2ebbad6db180bdccbf541b1be3a19907c6..7ff3d33978759a7a058f607b801db529b91bbb5d 100644 (file)
@@ -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, &notif);
        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;
 }
index 0535b95806cf4762b6159f00deaaeb76631c08a9..5109259eff34033d172c923f8b8e707baa03d41b 100644 (file)
@@ -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, &notif);
        switch (it_ret) {
        case BT_NOTIFICATION_ITERATOR_STATUS_ERROR:
                ret = BT_COMPONENT_STATUS_ERROR;
index 1f87b2162b3b73b6a9e43b515df094a4bea2504c..61cd4883319ff3332037d844df015e75d93fada7 100644 (file)
@@ -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, &notif);
        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, &notif_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);
 
        /*
index 97c2075aa914243c918425b162b1da074900f09d..4ccd88766c2382ce01f728c8e5e5b022a082e6d9 100644 (file)
@@ -51,6 +51,7 @@
 #include <babeltrace/graph/private-component-sink.h>
 #include <babeltrace/graph/private-component.h>
 #include <babeltrace/graph/private-connection.h>
+#include <babeltrace/graph/private-connection-notification-iterator.h>
 #include <babeltrace/graph/private-connection-private-notification-iterator.h>
 #include <babeltrace/graph/private-port.h>
 #include <babeltrace/plugin/plugin.h>
@@ -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,
+                       &notification);
+       } else {
+               ret = bt_private_connection_notification_iterator_next(
+                       notif_iter, &notification);
+       }
+
        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,
index 7648fa110ba35aec0f64b51a923ea02c3a8b5fb3..5cbe9fee7ef6165d2a20540c3da9e080973bf475 100644 (file)
@@ -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, &notification);
 
        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)) {
This page took 0.037142 seconds and 4 git commands to generate.