Fix: don't call iterator finalize more than once
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 15 May 2017 20:44:09 +0000 (16:44 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sun, 28 May 2017 16:57:43 +0000 (12:57 -0400)
A finalize may have side-effects that trigger port removal, thus calling
finalize again. Ensure it is not called more than once.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
lib/graph/iterator.c

index 1bfe3495051be8caa8d22d15b3532cceea794b65..bda2dfd3cfcd6f15558ac1a6631f6c710f4b9bc0 100644 (file)
@@ -349,6 +349,12 @@ void bt_notification_iterator_finalize(
                break;
        }
 
+       if (iterator->state == BT_NOTIFICATION_ITERATOR_STATE_ENDED) {
+               iterator->state = BT_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED;
+       } else {
+               iterator->state = BT_NOTIFICATION_ITERATOR_STATE_FINALIZED;
+       }
+
        assert(iterator->upstream_component);
        comp_class = iterator->upstream_component->class;
 
@@ -380,12 +386,6 @@ void bt_notification_iterator_finalize(
                        bt_private_notification_iterator_from_notification_iterator(iterator));
        }
 
-       if (iterator->state == BT_NOTIFICATION_ITERATOR_STATE_ENDED) {
-               iterator->state = BT_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED;
-       } else {
-               iterator->state = BT_NOTIFICATION_ITERATOR_STATE_FINALIZED;
-       }
-
        iterator->upstream_component = NULL;
        iterator->upstream_port = NULL;
 }
This page took 0.024746 seconds and 4 git commands to generate.