X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fgraph%2Fiterator.c;h=f011373b0592918b739bd413647a11d03eee20d5;hb=fe7265b50927fe05576f8c5cedaea1d8433d8a02;hp=1f1f0cdd5484e91287dc06a9631e7a256c5302f9;hpb=a19804e742baa94691303e48e4e41bc0a4a8d917;p=babeltrace.git diff --git a/lib/graph/iterator.c b/lib/graph/iterator.c index 1f1f0cdd..f011373b 100644 --- a/lib/graph/iterator.c +++ b/lib/graph/iterator.c @@ -126,7 +126,7 @@ struct action { static void stream_destroy_listener(struct bt_ctf_stream *stream, void *data) { - struct bt_notification_iterator *iterator = data; + struct bt_notification_iterator_private_connection *iterator = data; /* Remove associated stream state */ g_hash_table_remove(iterator->stream_states, stream); @@ -185,14 +185,14 @@ void destroy_action(struct action *action) } static -void add_action(struct bt_notification_iterator *iterator, +void add_action(struct bt_notification_iterator_private_connection *iterator, struct action *action) { g_array_append_val(iterator->actions, *action); } static -void clear_actions(struct bt_notification_iterator *iterator) +void clear_actions(struct bt_notification_iterator_private_connection *iterator) { size_t i; @@ -230,7 +230,7 @@ const char *action_type_string(enum action_type type) } static -void apply_actions(struct bt_notification_iterator *iterator) +void apply_actions(struct bt_notification_iterator_private_connection *iterator) { size_t i; @@ -358,9 +358,9 @@ end: } static -void bt_notification_iterator_destroy(struct bt_object *obj) +void bt_private_connection_notification_iterator_destroy(struct bt_object *obj) { - struct bt_notification_iterator *iterator; + struct bt_notification_iterator_private_connection *iterator; assert(obj); @@ -375,10 +375,10 @@ void bt_notification_iterator_destroy(struct bt_object *obj) * would be called again. */ obj->ref_count.count++; - iterator = container_of(obj, struct bt_notification_iterator, base); + iterator = (void *) container_of(obj, struct bt_notification_iterator, base); BT_LOGD("Destroying notification iterator object: addr=%p", iterator); - bt_notification_iterator_finalize(iterator); + bt_private_connection_notification_iterator_finalize(iterator); if (iterator->queue) { struct bt_notification *notif; @@ -435,8 +435,8 @@ void bt_notification_iterator_destroy(struct bt_object *obj) } BT_HIDDEN -void bt_notification_iterator_finalize( - struct bt_notification_iterator *iterator) +void bt_private_connection_notification_iterator_finalize( + struct bt_notification_iterator_private_connection *iterator) { struct bt_component_class *comp_class = NULL; bt_component_class_notification_iterator_finalize_method @@ -445,13 +445,13 @@ void bt_notification_iterator_finalize( assert(iterator); switch (iterator->state) { - case BT_NOTIFICATION_ITERATOR_STATE_NON_INITIALIZED: + case BT_PRIVATE_CONNECTION_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: + case BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_FINALIZED: + case BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED: /* Already finalized */ BT_LOGD("Not finalizing notification iterator: already finalized: " "addr=%p", iterator); @@ -462,14 +462,14 @@ void bt_notification_iterator_finalize( BT_LOGD("Finalizing notification iterator: addr=%p", iterator); - if (iterator->state == BT_NOTIFICATION_ITERATOR_STATE_ENDED) { + if (iterator->state == BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_ENDED) { BT_LOGD("Updating notification iterator's state: " - "new-state=BT_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED"); - iterator->state = BT_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED; + "new-state=BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED"); + iterator->state = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED; } else { BT_LOGD("Updating notification iterator's state: " - "new-state=BT_NOTIFICATION_ITERATOR_STATE_FINALIZED"); - iterator->state = BT_NOTIFICATION_ITERATOR_STATE_FINALIZED; + "new-state=BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_FINALIZED"); + iterator->state = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_FINALIZED; } assert(iterator->upstream_component); @@ -502,7 +502,7 @@ void bt_notification_iterator_finalize( BT_LOGD("Calling user's finalization method: addr=%p", iterator); finalize_method( - bt_private_notification_iterator_from_notification_iterator(iterator)); + bt_private_connection_private_notification_iterator_from_notification_iterator(iterator)); } iterator->upstream_component = NULL; @@ -511,8 +511,8 @@ void bt_notification_iterator_finalize( } BT_HIDDEN -void bt_notification_iterator_set_connection( - struct bt_notification_iterator *iterator, +void bt_private_connection_notification_iterator_set_connection( + struct bt_notification_iterator_private_connection *iterator, struct bt_connection *connection) { assert(iterator); @@ -523,7 +523,7 @@ void bt_notification_iterator_set_connection( static int create_subscription_mask_from_notification_types( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, const enum bt_notification_type *notif_types) { const enum bt_notification_type *notif_type; @@ -538,38 +538,38 @@ int create_subscription_mask_from_notification_types( switch (*notif_type) { case BT_NOTIFICATION_TYPE_ALL: iterator->subscription_mask |= - BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_EVENT | - BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_INACTIVITY | - BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_BEGIN | - BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_END | - BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_BEGIN | - BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_END | - BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_EVENTS | - BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_PACKETS; + BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_EVENT | + BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_INACTIVITY | + BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_BEGIN | + BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_END | + BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_BEGIN | + BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_END | + BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_EVENTS | + BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_PACKETS; break; case BT_NOTIFICATION_TYPE_EVENT: - iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_EVENT; + iterator->subscription_mask |= BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_EVENT; break; case BT_NOTIFICATION_TYPE_INACTIVITY: - iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_INACTIVITY; + iterator->subscription_mask |= BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_INACTIVITY; break; case BT_NOTIFICATION_TYPE_STREAM_BEGIN: - iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_BEGIN; + iterator->subscription_mask |= BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_BEGIN; break; case BT_NOTIFICATION_TYPE_STREAM_END: - iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_END; + iterator->subscription_mask |= BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_END; break; case BT_NOTIFICATION_TYPE_PACKET_BEGIN: - iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_BEGIN; + iterator->subscription_mask |= BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_BEGIN; break; case BT_NOTIFICATION_TYPE_PACKET_END: - iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_END; + iterator->subscription_mask |= BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_END; break; case BT_NOTIFICATION_TYPE_DISCARDED_EVENTS: - iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_EVENTS; + iterator->subscription_mask |= BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_EVENTS; break; case BT_NOTIFICATION_TYPE_DISCARDED_PACKETS: - iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_PACKETS; + iterator->subscription_mask |= BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_PACKETS; break; default: ret = -1; @@ -586,17 +586,26 @@ end: return ret; } +static +void init_notification_iterator(struct bt_notification_iterator *iterator, + enum bt_notification_iterator_type type, + bt_object_release_func destroy) +{ + bt_object_init(iterator, destroy); + iterator->type = type; +} + BT_HIDDEN -enum bt_connection_status bt_notification_iterator_create( +enum bt_connection_status bt_private_connection_notification_iterator_create( struct bt_component *upstream_comp, struct bt_port *upstream_port, const enum bt_notification_type *notification_types, struct bt_connection *connection, - struct bt_notification_iterator **user_iterator) + struct bt_notification_iterator_private_connection **user_iterator) { enum bt_connection_status status = BT_CONNECTION_STATUS_OK; enum bt_component_class_type type; - struct bt_notification_iterator *iterator = NULL; + struct bt_notification_iterator_private_connection *iterator = NULL; assert(upstream_comp); assert(upstream_port); @@ -613,14 +622,16 @@ enum bt_connection_status bt_notification_iterator_create( type = bt_component_get_class_type(upstream_comp); assert(type == BT_COMPONENT_CLASS_TYPE_SOURCE || type == BT_COMPONENT_CLASS_TYPE_FILTER); - iterator = g_new0(struct bt_notification_iterator, 1); + iterator = g_new0(struct bt_notification_iterator_private_connection, 1); if (!iterator) { BT_LOGE_STR("Failed to allocate one notification iterator."); status = BT_CONNECTION_STATUS_NOMEM; goto end; } - bt_object_init(iterator, bt_notification_iterator_destroy); + init_notification_iterator((void *) iterator, + BT_NOTIFICATION_ITERATOR_TYPE_PRIVATE_CONNECTION, + bt_private_connection_notification_iterator_destroy); if (create_subscription_mask_from_notification_types(iterator, notification_types)) { @@ -654,7 +665,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_NON_INITIALIZED; + iterator->state = BT_PRIVATE_CONNECTION_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\", " @@ -672,24 +683,24 @@ end: return status; } -void *bt_private_notification_iterator_get_user_data( - struct bt_private_notification_iterator *private_iterator) +void *bt_private_connection_private_notification_iterator_get_user_data( + struct bt_private_connection_private_notification_iterator *private_iterator) { - struct bt_notification_iterator *iterator = - bt_notification_iterator_from_private(private_iterator); + struct bt_notification_iterator_private_connection *iterator = + bt_private_connection_notification_iterator_from_private(private_iterator); return iterator ? iterator->user_data : NULL; } enum bt_notification_iterator_status -bt_private_notification_iterator_set_user_data( - struct bt_private_notification_iterator *private_iterator, +bt_private_connection_private_notification_iterator_set_user_data( + struct bt_private_connection_private_notification_iterator *private_iterator, void *data) { enum bt_notification_iterator_status ret = BT_NOTIFICATION_ITERATOR_STATUS_OK; - struct bt_notification_iterator *iterator = - bt_notification_iterator_from_private(private_iterator); + struct bt_notification_iterator_private_connection *iterator = + bt_private_connection_notification_iterator_from_private(private_iterator); if (!iterator) { BT_LOGW_STR("Invalid parameter: notification iterator is NULL."); @@ -715,43 +726,56 @@ struct bt_notification *bt_notification_iterator_get_notification( goto end; } - notification = bt_get(iterator->current_notification); + switch (iterator->type) { + case BT_NOTIFICATION_ITERATOR_TYPE_PRIVATE_CONNECTION: + { + struct bt_notification_iterator_private_connection *priv_conn_iter = + (void *) iterator; + + notification = bt_get(priv_conn_iter->current_notification); + break; + } + default: + BT_LOGF("Unknown notification iterator type: addr=%p, type=%d", + iterator, iterator->type); + abort(); + } end: return notification; } static -enum bt_notification_iterator_notif_type +enum bt_private_connection_notification_iterator_notif_type bt_notification_iterator_notif_type_from_notif_type( enum bt_notification_type notif_type) { - enum bt_notification_iterator_notif_type iter_notif_type; + enum bt_private_connection_notification_iterator_notif_type iter_notif_type; switch (notif_type) { case BT_NOTIFICATION_TYPE_EVENT: - iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_EVENT; + iter_notif_type = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_EVENT; break; case BT_NOTIFICATION_TYPE_INACTIVITY: - iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_INACTIVITY; + iter_notif_type = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_INACTIVITY; break; case BT_NOTIFICATION_TYPE_STREAM_BEGIN: - iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_BEGIN; + iter_notif_type = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_BEGIN; break; case BT_NOTIFICATION_TYPE_STREAM_END: - iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_END; + iter_notif_type = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_END; break; case BT_NOTIFICATION_TYPE_PACKET_BEGIN: - iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_BEGIN; + iter_notif_type = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_BEGIN; break; case BT_NOTIFICATION_TYPE_PACKET_END: - iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_END; + iter_notif_type = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_END; break; case BT_NOTIFICATION_TYPE_DISCARDED_EVENTS: - iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_EVENTS; + iter_notif_type = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_EVENTS; break; case BT_NOTIFICATION_TYPE_DISCARDED_PACKETS: - iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_PACKETS; + iter_notif_type = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_NOTIF_TYPE_DISCARDED_PACKETS; break; default: abort(); @@ -761,7 +785,8 @@ bt_notification_iterator_notif_type_from_notif_type( } static -bt_bool validate_notification(struct bt_notification_iterator *iterator, +bt_bool validate_notification( + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *notif, struct bt_ctf_stream *notif_stream, struct bt_ctf_packet *notif_packet) @@ -880,7 +905,8 @@ end: } static -bt_bool is_subscribed_to_notification_type(struct bt_notification_iterator *iterator, +bt_bool is_subscribed_to_notification_type( + struct bt_notification_iterator_private_connection *iterator, enum bt_notification_type notif_type) { uint32_t iter_notif_type = @@ -891,7 +917,8 @@ bt_bool is_subscribed_to_notification_type(struct bt_notification_iterator *iter } static -void add_action_push_notif(struct bt_notification_iterator *iterator, +void add_action_push_notif( + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *notif) { struct action action = { @@ -911,7 +938,7 @@ void add_action_push_notif(struct bt_notification_iterator *iterator, static int add_action_push_notif_stream_begin( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_ctf_stream *stream) { int ret = 0; @@ -948,7 +975,7 @@ end: static int add_action_push_notif_stream_end( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_ctf_stream *stream) { int ret = 0; @@ -985,7 +1012,7 @@ end: static int add_action_push_notif_packet_begin( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_ctf_packet *packet) { int ret = 0; @@ -1021,7 +1048,7 @@ end: static int add_action_push_notif_packet_end( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_ctf_packet *packet) { int ret = 0; @@ -1057,7 +1084,7 @@ end: static void add_action_set_stream_state_is_ended( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct stream_state *stream_state) { struct action action = { @@ -1075,7 +1102,7 @@ void add_action_set_stream_state_is_ended( static void add_action_set_stream_state_cur_packet( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct stream_state *stream_state, struct bt_ctf_packet *packet) { @@ -1096,7 +1123,7 @@ void add_action_set_stream_state_cur_packet( static void add_action_update_stream_state_discarded_elements( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, enum action_type type, struct stream_state *stream_state, struct bt_ctf_clock_value *cur_begin, @@ -1127,7 +1154,8 @@ void add_action_update_stream_state_discarded_elements( } static -int ensure_stream_state_exists(struct bt_notification_iterator *iterator, +int ensure_stream_state_exists( + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *stream_begin_notif, struct bt_ctf_stream *notif_stream, struct stream_state **_stream_state) @@ -1304,7 +1332,8 @@ end: } static -int handle_discarded_packets(struct bt_notification_iterator *iterator, +int handle_discarded_packets( + struct bt_notification_iterator_private_connection *iterator, struct bt_ctf_packet *packet, struct bt_ctf_clock_value *ts_begin, struct bt_ctf_clock_value *ts_end, @@ -1378,7 +1407,8 @@ end: } static -int handle_discarded_events(struct bt_notification_iterator *iterator, +int handle_discarded_events( + struct bt_notification_iterator_private_connection *iterator, struct bt_ctf_packet *packet, struct bt_ctf_clock_value *ts_begin, struct bt_ctf_clock_value *ts_end, @@ -1538,7 +1568,8 @@ end: } static -int handle_discarded_elements(struct bt_notification_iterator *iterator, +int handle_discarded_elements( + struct bt_notification_iterator_private_connection *iterator, struct bt_ctf_packet *packet, struct stream_state *stream_state) { struct bt_ctf_clock_value *ts_begin = NULL; @@ -1578,7 +1609,8 @@ end: } static -int handle_packet_switch(struct bt_notification_iterator *iterator, +int handle_packet_switch( + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *packet_begin_notif, struct bt_ctf_packet *new_packet, struct stream_state *stream_state) @@ -1638,7 +1670,7 @@ end: static int handle_notif_stream_begin( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *notif, struct bt_ctf_stream *notif_stream) { @@ -1665,7 +1697,7 @@ end: static int handle_notif_stream_end( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *notif, struct bt_ctf_stream *notif_stream) { @@ -1700,7 +1732,7 @@ end: static int handle_notif_discarded_elements( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *notif, struct bt_ctf_stream *notif_stream) { @@ -1729,7 +1761,7 @@ end: static int handle_notif_packet_begin( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *notif, struct bt_ctf_stream *notif_stream, struct bt_ctf_packet *notif_packet) @@ -1763,7 +1795,7 @@ end: static int handle_notif_packet_end( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *notif, struct bt_ctf_stream *notif_stream, struct bt_ctf_packet *notif_packet) @@ -1800,7 +1832,7 @@ end: static int handle_notif_event( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *notif, struct bt_ctf_stream *notif_stream, struct bt_ctf_packet *notif_packet) @@ -1835,7 +1867,7 @@ end: static int enqueue_notification_and_automatic( - struct bt_notification_iterator *iterator, + struct bt_notification_iterator_private_connection *iterator, struct bt_notification *notif) { int ret = 0; @@ -1962,7 +1994,7 @@ end: } static -int handle_end(struct bt_notification_iterator *iterator) +int handle_end(struct bt_notification_iterator_private_connection *iterator) { GHashTableIter stream_state_iter; gpointer stream_gptr, stream_state_gptr; @@ -2014,12 +2046,12 @@ end: static enum bt_notification_iterator_status ensure_queue_has_notifications( - struct bt_notification_iterator *iterator) + struct bt_notification_iterator_private_connection *iterator) { - struct bt_private_notification_iterator *priv_iterator = - bt_private_notification_iterator_from_notification_iterator(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; - struct bt_notification_iterator_next_return next_return = { + struct bt_notification_iterator_next_method_return next_return = { .status = BT_NOTIFICATION_ITERATOR_STATUS_OK, .notification = NULL, }; @@ -2031,7 +2063,7 @@ enum bt_notification_iterator_status ensure_queue_has_notifications( BT_LOGD("Ensuring that notification iterator's queue has at least one notification: " "iter-addr=%p, queue-size=%u, iter-state=%s", iterator, iterator->queue->length, - bt_notification_iterator_state_string(iterator->state)); + bt_private_connection_notification_iterator_state_string(iterator->state)); if (iterator->queue->length > 0) { /* @@ -2046,12 +2078,12 @@ enum bt_notification_iterator_status ensure_queue_has_notifications( } switch (iterator->state) { - case BT_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED: - case BT_NOTIFICATION_ITERATOR_STATE_FINALIZED: + case BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED: + case BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_FINALIZED: BT_LOGD_STR("Notification iterator's \"next\" called, but it is finalized."); status = BT_NOTIFICATION_ITERATOR_STATUS_CANCELED; goto end; - case BT_NOTIFICATION_ITERATOR_STATE_ENDED: + case BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_ENDED: BT_LOGD_STR("Notification iterator is ended."); status = BT_NOTIFICATION_ITERATOR_STATUS_END; goto end; @@ -2105,8 +2137,8 @@ enum bt_notification_iterator_status ensure_queue_has_notifications( goto end; } - if (iterator->state == BT_NOTIFICATION_ITERATOR_STATE_FINALIZED || - iterator->state == BT_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED) { + if (iterator->state == BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_FINALIZED || + iterator->state == BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_FINALIZED_AND_ENDED) { /* * The user's "next" method, somehow, cancelled * its own notification iterator. This can @@ -2141,8 +2173,8 @@ enum bt_notification_iterator_status ensure_queue_has_notifications( } assert(iterator->state == - BT_NOTIFICATION_ITERATOR_STATE_ACTIVE); - iterator->state = BT_NOTIFICATION_ITERATOR_STATE_ENDED; + BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_ACTIVE); + iterator->state = BT_PRIVATE_CONNECTION_NOTIFICATION_ITERATOR_STATE_ENDED; if (iterator->queue->length == 0) { status = BT_NOTIFICATION_ITERATOR_STATUS_END; @@ -2215,40 +2247,70 @@ bt_notification_iterator_next(struct bt_notification_iterator *iterator) BT_LOGD("Notification iterator's \"next\": iter-addr=%p", iterator); - /* - * Make sure that the iterator's queue contains at least one - * notification. - */ - status = ensure_queue_has_notifications(iterator); - if (status != BT_NOTIFICATION_ITERATOR_STATUS_OK) { - /* Not an error */ - goto end; - } + switch (iterator->type) { + case BT_NOTIFICATION_ITERATOR_TYPE_PRIVATE_CONNECTION: + { + struct bt_notification_iterator_private_connection *priv_conn_iter = + (void *) iterator; - /* - * Move the notification at the tail of the queue to the - * iterator's current notification. - */ - assert(iterator->queue->length > 0); - bt_put(iterator->current_notification); - iterator->current_notification = g_queue_pop_tail(iterator->queue); - assert(iterator->current_notification); + /* + * Make sure that the iterator's queue contains at least + * one notification. + */ + status = ensure_queue_has_notifications(priv_conn_iter); + if (status != BT_NOTIFICATION_ITERATOR_STATUS_OK) { + goto end; + } + + /* + * Move the notification at the tail of the queue to the + * iterator's current notification. + */ + assert(priv_conn_iter->queue->length > 0); + bt_put(priv_conn_iter->current_notification); + priv_conn_iter->current_notification = + g_queue_pop_tail(priv_conn_iter->queue); + assert(priv_conn_iter->current_notification); + break; + } + default: + BT_LOGF("Unknown notification iterator type: addr=%p, type=%d", + iterator, iterator->type); + abort(); + } end: return status; } -struct bt_component *bt_notification_iterator_get_component( +struct bt_component *bt_private_connection_notification_iterator_get_component( struct bt_notification_iterator *iterator) { - return bt_get(iterator->upstream_component); + struct bt_component *comp = NULL; + struct bt_notification_iterator_private_connection *iter_priv_conn; + + if (!iterator) { + BT_LOGW_STR("Invalid parameter: notification iterator is NULL."); + goto end; + } + + if (iterator->type != BT_NOTIFICATION_ITERATOR_TYPE_PRIVATE_CONNECTION) { + BT_LOGW_STR("Invalid parameter: notification iterator was not created from a private connection."); + goto end; + } + + iter_priv_conn = (void *) iterator; + comp = bt_get(iter_priv_conn->upstream_component); + +end: + return comp; } struct bt_private_component * -bt_private_notification_iterator_get_private_component( - struct bt_private_notification_iterator *private_iterator) +bt_private_connection_private_notification_iterator_get_private_component( + struct bt_private_connection_private_notification_iterator *private_iterator) { return bt_private_component_from_component( - bt_notification_iterator_get_component( - bt_notification_iterator_from_private(private_iterator))); + bt_private_connection_notification_iterator_get_component( + (void *) bt_private_connection_notification_iterator_from_private(private_iterator))); }