X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fcomponent%2Fiterator.c;h=e2ffd2f017c098bfe7bc378b0a5b127a728570ee;hb=41a2b7aeccec8153fc6845819a0ca98461f35cb1;hp=7f3e2b037affd431b3716cc2d187778d5dda9361;hpb=64cadc660bbd0400df65da3534d28dbe59395ec7;p=babeltrace.git diff --git a/lib/component/iterator.c b/lib/component/iterator.c index 7f3e2b03..e2ffd2f0 100644 --- a/lib/component/iterator.c +++ b/lib/component/iterator.c @@ -77,6 +77,7 @@ void bt_notification_iterator_destroy(struct bt_object *obj) assert(0); } + BT_PUT(iterator->current_notification); BT_PUT(iterator->component); g_free(iterator); } @@ -159,42 +160,16 @@ end: struct bt_notification *bt_notification_iterator_get_notification( struct bt_notification_iterator *iterator) { - struct bt_private_notification_iterator *priv_iterator = - bt_private_notification_iterator_from_notification_iterator(iterator); - bt_component_class_notification_iterator_get_method get_method = NULL; - - assert(iterator); - assert(iterator->component); - assert(iterator->component->class); - - switch (iterator->component->class->type) { - case BT_COMPONENT_CLASS_TYPE_SOURCE: - { - struct bt_component_class_source *source_class = - container_of(iterator->component->class, - struct bt_component_class_source, parent); + struct bt_notification *notification = NULL; - assert(source_class->methods.iterator.get); - get_method = source_class->methods.iterator.get; - break; + if (!iterator) { + goto end; } - case BT_COMPONENT_CLASS_TYPE_FILTER: - { - struct bt_component_class_filter *filter_class = - container_of(iterator->component->class, - struct bt_component_class_filter, parent); - assert(filter_class->methods.iterator.get); - get_method = filter_class->methods.iterator.get; - break; - } - default: - assert(false); - break; - } + notification = bt_get(iterator->current_notification); - assert(get_method); - return get_method(priv_iterator); +end: + return notification; } enum bt_notification_iterator_status @@ -203,8 +178,15 @@ bt_notification_iterator_next(struct bt_notification_iterator *iterator) struct bt_private_notification_iterator *priv_iterator = bt_private_notification_iterator_from_notification_iterator(iterator); bt_component_class_notification_iterator_next_method next_method = NULL; + struct bt_notification_iterator_next_return next_return; + enum bt_notification_iterator_status status = + BT_NOTIFICATION_ITERATOR_STATUS_OK; + + if (!iterator) { + status = BT_NOTIFICATION_ITERATOR_STATUS_INVAL; + goto end; + } - assert(iterator); assert(iterator->component); assert(iterator->component->class); @@ -235,7 +217,19 @@ bt_notification_iterator_next(struct bt_notification_iterator *iterator) } assert(next_method); - return next_method(priv_iterator); + next_return = next_method(priv_iterator); + if (next_return.status == BT_NOTIFICATION_ITERATOR_STATUS_OK) { + if (!next_return.notification) { + status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR; + goto end; + } + + BT_MOVE(iterator->current_notification, + next_return.notification); + } + +end: + return next_return.status; } struct bt_component *bt_notification_iterator_get_component(