lib: do not finalize a non-initialized notification iterator
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Thu, 3 Aug 2017 20:33:39 +0000 (16:33 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 11 Aug 2017 22:54:15 +0000 (18:54 -0400)
Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
include/babeltrace/graph/notification-iterator-internal.h
lib/graph/connection.c
lib/graph/iterator.c

index 9fcab16af8d59a4117ce730ebe3e6ab8d44c2eeb..567c47387f8136075b5bf50530e7d649cb83551d 100644 (file)
@@ -34,6 +34,7 @@
 #include <babeltrace/graph/notification-iterator.h>
 #include <babeltrace/graph/private-notification-iterator.h>
 #include <babeltrace/types.h>
+#include <stdbool.h>
 
 struct bt_port;
 
@@ -49,6 +50,9 @@ enum bt_notification_iterator_notif_type {
 };
 
 enum bt_notification_iterator_state {
+       /* Iterator is not initialized. */
+       BT_NOTIFICATION_ITERATOR_STATE_NON_INITIALIZED,
+
        /* Iterator is active, not at the end yet, and not finalized. */
        BT_NOTIFICATION_ITERATOR_STATE_ACTIVE,
 
index ef4fefede918ff625a4349a7e165797b51b7804e..f3fbe7c0526997f2eeee5e7c4fcd70dca0d076c6 100644 (file)
@@ -395,6 +395,7 @@ bt_private_connection_create_notification_iterator(
                }
        }
 
+       iterator->state = BT_NOTIFICATION_ITERATOR_STATE_ACTIVE;
        g_ptr_array_add(connection->iterators, iterator);
        BT_LOGD("Created notification iterator from connection: "
                "conn-addr=%p, upstream-port-addr=%p, "
index cc1228ba7ded6106f189a66d75a264aa4616ca59..f5dd6d70d9d1019726b964a268f59f733815c269 100644 (file)
@@ -445,6 +445,11 @@ void bt_notification_iterator_finalize(
        assert(iterator);
 
        switch (iterator->state) {
+       case BT_NOTIFICATION_ITERATOR_STATE_NON_INITIALIZED:
+               /* Skip user finalization if user initialization failed */
+               BT_LOGD("Not finalizing non-initialized notification iterator: "
+                       "addr=%p", iterator);
+               return;
        case BT_NOTIFICATION_ITERATOR_STATE_FINALIZED:
        case BT_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED:
                /* Already finalized */
@@ -649,7 +654,7 @@ enum bt_connection_status bt_notification_iterator_create(
        iterator->upstream_component = upstream_comp;
        iterator->upstream_port = upstream_port;
        iterator->connection = connection;
-       iterator->state = BT_NOTIFICATION_ITERATOR_STATE_ACTIVE;
+       iterator->state = BT_NOTIFICATION_ITERATOR_STATE_NON_INITIALIZED;
        BT_LOGD("Created notification iterator: "
                "upstream-comp-addr=%p, upstream-comp-name=\"%s\", "
                "upstream-port-addr=%p, upstream-port-name=\"%s\", "
This page took 0.027854 seconds and 4 git commands to generate.