Subscribe to notifications when creating a notif. iterator
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Tue, 2 May 2017 20:42:16 +0000 (16:42 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sun, 28 May 2017 16:57:42 +0000 (12:57 -0400)
bt_private_connection_create_notification_iterator() now accepts a new
parameter which is a BT_NOTIFICATION_TYPE_SENTINEL-terminated array of
notification types to subscribe to. It is guaranteed that, after any
bt_notification_iterator_next() called on the created iterator (if the
status is BT_NOTIFICATION_ITERATOR_STATUS_OK), the following call to
bt_notification_iterator_get_notification() returns a notification to
which the iterator is subscribed.

You can pass NULL to the notification types parameter of
bt_private_connection_create_notification_iterator() to subscribe to all
existing notifications (including the ones that will be added to the
following versions of the library).

The use case behind the subscription mechanism is for a notification
iterator to avoid the generation of automatic notifications when the
iterator's user does not expect them anyway. This should be the case of
some filters and sinks, text.pretty being a current example (only needs
event notifications).

Tests and existing plugins are updated accordingly.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
13 files changed:
include/babeltrace/graph/notification-iterator-internal.h
include/babeltrace/graph/notification.h
include/babeltrace/graph/private-connection.h
lib/graph/connection.c
lib/graph/iterator.c
plugins/debug-info/plugin.c
plugins/text/pretty/pretty.c
plugins/utils/dummy/dummy.c
plugins/utils/muxer/muxer.c
plugins/utils/trimmer/iterator.c
plugins/writer/writer.c
tests/lib/test_bt_notification_iterator.c
tests/plugins/test-utils-muxer.c

index dc4e430928609b37df95d1a8d750a59bb9110db1..90a8ee4760ddff7ea1842bdc9449773dd31979df 100644 (file)
 
 struct bt_port;
 
+enum bt_notification_iterator_notif_type {
+       BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_EVENT =             (1U << 0),
+       BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_INACTIVITY =        (1U << 1),
+       BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_BEGIN =      (1U << 2),
+       BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_END =        (1U << 3),
+       BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_BEGIN =      (1U << 4),
+       BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_END =        (1U << 5),
+};
+
 struct bt_notification_iterator {
        struct bt_object base;
        struct bt_component *upstream_component; /* owned by this */
@@ -69,6 +78,13 @@ struct bt_notification_iterator {
         */
        GArray *actions;
 
+       /*
+        * This is a mask of notifications to which the user of this
+        * iterator is subscribed
+        * (see enum bt_notification_iterator_notif_type above).
+        */
+       uint32_t subscription_mask;
+
        bool is_ended;
        void *user_data;
 };
@@ -97,7 +113,8 @@ bt_private_notification_iterator_from_notification_iterator(
 BT_HIDDEN
 struct bt_notification_iterator *bt_notification_iterator_create(
                struct bt_component *upstream_component,
-               struct bt_port *upstream_port);
+               struct bt_port *upstream_port,
+               const enum bt_notification_type *notification_types);
 
 /**
  * Validate a notification iterator.
index ae5e22f95617bd0d85d1fc6a418eafb8dc368946..632da9bec953b6ac69399137436aae11336f0f10 100644 (file)
@@ -37,15 +37,15 @@ struct bt_notification;
  * Notification types. Unhandled notification types should be ignored.
  */
 enum bt_notification_type {
-       BT_NOTIFICATION_TYPE_SENTINEL =         -2,
+       BT_NOTIFICATION_TYPE_SENTINEL =         -1000,
        BT_NOTIFICATION_TYPE_UNKNOWN =          -1,
-       BT_NOTIFICATION_TYPE_ALL =              0,
-       BT_NOTIFICATION_TYPE_EVENT =            1,
-       BT_NOTIFICATION_TYPE_INACTIVITY =       2,
-       BT_NOTIFICATION_TYPE_STREAM_BEGIN =     3,
-       BT_NOTIFICATION_TYPE_STREAM_END =       4,
-       BT_NOTIFICATION_TYPE_PACKET_BEGIN =     5,
-       BT_NOTIFICATION_TYPE_PACKET_END =       6,
+       BT_NOTIFICATION_TYPE_ALL =              -2,
+       BT_NOTIFICATION_TYPE_EVENT =            0,
+       BT_NOTIFICATION_TYPE_INACTIVITY =       1,
+       BT_NOTIFICATION_TYPE_STREAM_BEGIN =     2,
+       BT_NOTIFICATION_TYPE_STREAM_END =       3,
+       BT_NOTIFICATION_TYPE_PACKET_BEGIN =     4,
+       BT_NOTIFICATION_TYPE_PACKET_END =       5,
        BT_NOTIFICATION_TYPE_NR, /* Not part of ABI. */
 };
 
index 76294604caa33d18ebad5ec5a472db4a3aa40c6b..9d3d39c4c8dca3044e2308bb2db63d7d04048dc6 100644 (file)
@@ -23,6 +23,8 @@
  * SOFTWARE.
  */
 
+#include <babeltrace/graph/notification.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -36,7 +38,8 @@ struct bt_connection *bt_connection_from_private_connection(
 
 extern struct bt_notification_iterator *
 bt_private_connection_create_notification_iterator(
-               struct bt_private_connection *private_connection);
+               struct bt_private_connection *private_connection,
+               const enum bt_notification_type *notification_types);
 
 #ifdef __cplusplus
 }
index bfc9c04b8f0b0831fd03a5a6cc47648a6713afa0..a9a5f9db667b2a86b0e8e8e117ab1aefe518f4a1 100644 (file)
@@ -140,7 +140,8 @@ struct bt_port *bt_connection_get_downstream_port(
 
 struct bt_notification_iterator *
 bt_private_connection_create_notification_iterator(
-               struct bt_private_connection *private_connection)
+               struct bt_private_connection *private_connection,
+               const enum bt_notification_type *notification_types)
 {
        enum bt_notification_iterator_status ret_iterator;
        enum bt_component_class_type upstream_comp_class_type;
@@ -150,11 +151,19 @@ bt_private_connection_create_notification_iterator(
        struct bt_component_class *upstream_comp_class = NULL;
        struct bt_connection *connection = NULL;
        bt_component_class_notification_iterator_init_method init_method = NULL;
+       static const enum bt_notification_type all_notif_types[] = {
+               BT_NOTIFICATION_TYPE_ALL,
+               BT_NOTIFICATION_TYPE_SENTINEL,
+       };
 
        if (!private_connection) {
                goto error;
        }
 
+       if (!notification_types) {
+               notification_types = all_notif_types;
+       }
+
        connection = bt_connection_from_private(private_connection);
 
        if (!connection->upstream_port || !connection->downstream_port) {
@@ -180,7 +189,7 @@ bt_private_connection_create_notification_iterator(
        }
 
        iterator = bt_notification_iterator_create(upstream_component,
-               upstream_port);
+               upstream_port, notification_types);
        if (!iterator) {
                goto error;
        }
index 389eec528c022d6c1ff32b7e1b7ccde3a07e0a3f..c76293a972baac05b618233390dba0d8c0c3a7ef 100644 (file)
@@ -33,6 +33,7 @@
 #include <babeltrace/graph/component.h>
 #include <babeltrace/graph/component-source-internal.h>
 #include <babeltrace/graph/component-class-internal.h>
+#include <babeltrace/graph/notification.h>
 #include <babeltrace/graph/notification-iterator.h>
 #include <babeltrace/graph/notification-iterator-internal.h>
 #include <babeltrace/graph/notification-internal.h>
@@ -43,6 +44,7 @@
 #include <babeltrace/graph/notification-stream.h>
 #include <babeltrace/graph/notification-stream-internal.h>
 #include <babeltrace/graph/port.h>
+#include <stdint.h>
 
 struct stream_state {
        struct bt_ctf_stream *stream; /* owned by this */
@@ -341,16 +343,70 @@ void bt_notification_iterator_destroy(struct bt_object *obj)
        g_free(iterator);
 }
 
+static
+int create_subscription_mask_from_notification_types(
+               struct bt_notification_iterator *iterator,
+               const enum bt_notification_type *notif_types)
+{
+       const enum bt_notification_type *notif_type;
+       int ret = 0;
+
+       assert(notif_types);
+       iterator->subscription_mask = 0;
+
+       for (notif_type = notif_types;
+                       *notif_type != BT_NOTIFICATION_TYPE_SENTINEL;
+                       notif_type++) {
+               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;
+                       break;
+               case BT_NOTIFICATION_TYPE_EVENT:
+                       iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_EVENT;
+                       break;
+               case BT_NOTIFICATION_TYPE_INACTIVITY:
+                       iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_INACTIVITY;
+                       break;
+               case BT_NOTIFICATION_TYPE_STREAM_BEGIN:
+                       iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_BEGIN;
+                       break;
+               case BT_NOTIFICATION_TYPE_STREAM_END:
+                       iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_END;
+                       break;
+               case BT_NOTIFICATION_TYPE_PACKET_BEGIN:
+                       iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_BEGIN;
+                       break;
+               case BT_NOTIFICATION_TYPE_PACKET_END:
+                       iterator->subscription_mask |= BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_END;
+                       break;
+               default:
+                       ret = -1;
+                       goto end;
+               }
+       }
+
+end:
+       return ret;
+}
+
 BT_HIDDEN
 struct bt_notification_iterator *bt_notification_iterator_create(
                struct bt_component *upstream_comp,
-               struct bt_port *upstream_port)
+               struct bt_port *upstream_port,
+               const enum bt_notification_type *notification_types)
 {
        enum bt_component_class_type type;
        struct bt_notification_iterator *iterator = NULL;
 
        assert(upstream_comp);
        assert(upstream_port);
+       assert(notification_types);
        assert(bt_port_is_connected(upstream_port));
 
        type = bt_component_get_class_type(upstream_comp);
@@ -369,6 +425,11 @@ struct bt_notification_iterator *bt_notification_iterator_create(
 
        bt_object_init(iterator, bt_notification_iterator_destroy);
 
+       if (create_subscription_mask_from_notification_types(iterator,
+                       notification_types)) {
+               goto error;
+       }
+
        iterator->stream_states = g_hash_table_new_full(g_direct_hash,
                g_direct_equal, NULL, (GDestroyNotify) destroy_stream_state);
        if (!iterator->stream_states) {
@@ -455,6 +516,39 @@ end:
        return notification;
 }
 
+static
+enum bt_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;
+
+       switch (notif_type) {
+       case BT_NOTIFICATION_TYPE_EVENT:
+               iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_EVENT;
+               break;
+       case BT_NOTIFICATION_TYPE_INACTIVITY:
+               iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_INACTIVITY;
+               break;
+       case BT_NOTIFICATION_TYPE_STREAM_BEGIN:
+               iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_BEGIN;
+               break;
+       case BT_NOTIFICATION_TYPE_STREAM_END:
+               iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_STREAM_END;
+               break;
+       case BT_NOTIFICATION_TYPE_PACKET_BEGIN:
+               iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_BEGIN;
+               break;
+       case BT_NOTIFICATION_TYPE_PACKET_END:
+               iter_notif_type = BT_NOTIFICATION_ITERATOR_NOTIF_TYPE_PACKET_END;
+               break;
+       default:
+               assert(false);
+       }
+
+       return iter_notif_type;
+}
+
 static
 bool validate_notification(struct bt_notification_iterator *iterator,
                struct bt_notification *notif,
@@ -542,18 +636,32 @@ end:
        return is_valid;
 }
 
+static
+bool is_subscribed_to_notification_type(struct bt_notification_iterator *iterator,
+               enum bt_notification_type notif_type)
+{
+       uint32_t iter_notif_type =
+               (uint32_t) bt_notification_iterator_notif_type_from_notif_type(
+                       notif_type);
+
+       return (iter_notif_type & iterator->subscription_mask) ? true : false;
+}
+
 static
 void add_action_push_notif(struct bt_notification_iterator *iterator,
                struct bt_notification *notif)
 {
        struct action action = {
                .type = ACTION_TYPE_PUSH_NOTIF,
-               .payload.push_notif = {
-                       .notif = bt_get(notif),
-               },
        };
 
        assert(notif);
+
+       if (!is_subscribed_to_notification_type(iterator, notif->type)) {
+               return;
+       }
+
+       action.payload.push_notif.notif = bt_get(notif);
        add_action(iterator, &action);
 }
 
@@ -565,6 +673,11 @@ int add_action_push_notif_stream_begin(
        int ret = 0;
        struct bt_notification *stream_begin_notif = NULL;
 
+       if (!is_subscribed_to_notification_type(iterator,
+                       BT_NOTIFICATION_TYPE_STREAM_BEGIN)) {
+               goto end;
+       }
+
        assert(stream);
        stream_begin_notif = bt_notification_stream_begin_create(stream);
        if (!stream_begin_notif) {
@@ -590,6 +703,11 @@ int add_action_push_notif_stream_end(
        int ret = 0;
        struct bt_notification *stream_end_notif = NULL;
 
+       if (!is_subscribed_to_notification_type(iterator,
+                       BT_NOTIFICATION_TYPE_STREAM_END)) {
+               goto end;
+       }
+
        assert(stream);
        stream_end_notif = bt_notification_stream_end_create(stream);
        if (!stream_end_notif) {
@@ -615,6 +733,11 @@ int add_action_push_notif_packet_begin(
        int ret = 0;
        struct bt_notification *packet_begin_notif = NULL;
 
+       if (!is_subscribed_to_notification_type(iterator,
+                       BT_NOTIFICATION_TYPE_PACKET_BEGIN)) {
+               goto end;
+       }
+
        assert(packet);
        packet_begin_notif = bt_notification_packet_begin_create(packet);
        if (!packet_begin_notif) {
@@ -640,6 +763,11 @@ int add_action_push_notif_packet_end(
        int ret = 0;
        struct bt_notification *packet_end_notif = NULL;
 
+       if (!is_subscribed_to_notification_type(iterator,
+                       BT_NOTIFICATION_TYPE_PACKET_END)) {
+               goto end;
+       }
+
        assert(packet);
        packet_end_notif = bt_notification_packet_end_create(packet);
        if (!packet_end_notif) {
@@ -967,6 +1095,9 @@ int enqueue_notification_and_automatic(
 
        assert(notif);
 
+       // TODO: Skip most of this if the iterator is only subscribed
+       //       to event/inactivity notifications.
+
        /* Get the stream and packet referred by the notification */
        switch (notif->type) {
        case BT_NOTIFICATION_TYPE_EVENT:
@@ -1165,55 +1296,57 @@ enum bt_notification_iterator_status ensure_queue_has_notifications(
 
        /*
         * Call the user's "next" method to get the next notification
-        * and status, skipping the forwarded automatic notifications
-        * if any.
+        * and status.
         */
        assert(next_method);
-       next_return = next_method(priv_iterator);
-       if (next_return.status < 0) {
-               status = next_return.status;
-               goto end;
-       }
 
-       switch (next_return.status) {
-       case BT_NOTIFICATION_ITERATOR_STATUS_END:
-               ret = handle_end(iterator);
-               if (ret) {
-                       status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
+       while (iterator->queue->length == 0) {
+               next_return = next_method(priv_iterator);
+               if (next_return.status < 0) {
+                       status = next_return.status;
                        goto end;
                }
 
-               if (iterator->queue->length == 0) {
-                       status = BT_NOTIFICATION_ITERATOR_STATUS_END;
-               }
+               switch (next_return.status) {
+               case BT_NOTIFICATION_ITERATOR_STATUS_END:
+                       ret = handle_end(iterator);
+                       if (ret) {
+                               status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
+                               goto end;
+                       }
 
-               iterator->is_ended = true;
-               break;
-       case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN:
-               status = BT_NOTIFICATION_ITERATOR_STATUS_AGAIN;
-               break;
-       case BT_NOTIFICATION_ITERATOR_STATUS_OK:
-               if (!next_return.notification) {
-                       status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
-                       goto end;
-               }
+                       if (iterator->queue->length == 0) {
+                               status = BT_NOTIFICATION_ITERATOR_STATUS_END;
+                       }
 
-               /*
-                * We know the notification is valid. Before we push it
-                * to the head of the queue, push the appropriate
-                * automatic notifications if any.
-                */
-               ret = enqueue_notification_and_automatic(iterator,
-                       next_return.notification);
-               BT_PUT(next_return.notification);
-               if (ret) {
-                       status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
+                       iterator->is_ended = true;
                        goto end;
+               case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN:
+                       status = BT_NOTIFICATION_ITERATOR_STATUS_AGAIN;
+                       goto end;
+               case BT_NOTIFICATION_ITERATOR_STATUS_OK:
+                       if (!next_return.notification) {
+                               status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
+                               goto end;
+                       }
+
+                       /*
+                        * We know the notification is valid. Before we
+                        * push it to the head of the queue, push the
+                        * appropriate automatic notifications if any.
+                        */
+                       ret = enqueue_notification_and_automatic(iterator,
+                               next_return.notification);
+                       BT_PUT(next_return.notification);
+                       if (ret) {
+                               status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
+                               goto end;
+                       }
+                       break;
+               default:
+                       /* Unknown non-error status */
+                       assert(false);
                }
-               break;
-       default:
-               /* Unknown non-error status */
-               assert(false);
        }
 
 end:
index 9795bcf3b1c4496067d781428380e0ecf7d2cd83..c9ae94fad22b82b550bfdd237da8563555340035 100644 (file)
@@ -325,7 +325,7 @@ enum bt_notification_iterator_status debug_info_iterator_init(
        assert(connection);
 
        it_data->input_iterator = bt_private_connection_create_notification_iterator(
-                       connection);
+                       connection, NULL);
        if (!it_data->input_iterator) {
                ret = BT_NOTIFICATION_ITERATOR_STATUS_NOMEM;
                goto end;
index cea5fe688f080511e9b5c63903f020864380f86c..043ba4fc5d265a5123a269fdedc6a81b0fc4a9cb 100644 (file)
@@ -145,6 +145,10 @@ void pretty_port_connected(
 {
        struct bt_private_connection *connection;
        struct pretty_component *pretty;
+       static const enum bt_notification_type notif_types[] = {
+               BT_NOTIFICATION_TYPE_EVENT,
+               BT_NOTIFICATION_TYPE_SENTINEL,
+       };
 
        pretty = bt_private_component_get_user_data(component);
        assert(pretty);
@@ -152,7 +156,8 @@ void pretty_port_connected(
        connection = bt_private_port_get_private_connection(self_port);
        assert(connection);
        pretty->input_iterator =
-               bt_private_connection_create_notification_iterator(connection);
+               bt_private_connection_create_notification_iterator(connection,
+                       notif_types);
 
        if (!pretty->input_iterator) {
                pretty->error = true;
index 978ecdeacd6d871c7c8de0823821baa0ecf9a825..5f7c62d64b56dbe4b145fab37b88ec6ca6dfee52 100644 (file)
@@ -106,7 +106,7 @@ void dummy_port_connected(
        connection = bt_private_port_get_private_connection(self_port);
        assert(connection);
        iterator = bt_private_connection_create_notification_iterator(
-               connection);
+               connection, NULL);
        if (!iterator) {
                dummy->error = true;
                goto end;
index ba2fb3c0064be7c07a211e9fad2dc42b54af7d7f..b98a74e02bbe47716bc888d4f0c539b3dfb43d01 100644 (file)
@@ -359,7 +359,7 @@ struct bt_notification_iterator *create_notif_iter_on_input_port(
        //       returned notification by the muxer notification
        //       iterator which creates it.
        notif_iter = bt_private_connection_create_notification_iterator(
-               priv_conn);
+               priv_conn, NULL);
        if (!notif_iter) {
                *ret = -1;
                goto end;
index e6427307ebb235aa2971aadb104f0cf865cbd4dc..2fba7f66eabae945db1a59df010e9abebf0addaa 100644 (file)
@@ -91,7 +91,8 @@ enum bt_notification_iterator_status trimmer_iterator_init(
        assert(connection);
 
        it_data->input_iterator =
-               bt_private_connection_create_notification_iterator(connection);
+               bt_private_connection_create_notification_iterator(connection,
+                       NULL);
        if (!it_data->input_iterator) {
                ret = BT_NOTIFICATION_ITERATOR_STATUS_NOMEM;
                goto end;
index 118210ab2bfe42e771a40dbde7d3fc445105af0e..3bca09b61f79f466756c8a50c0ea109f791b58b4 100644 (file)
@@ -198,8 +198,9 @@ void writer_component_port_connected(
        assert(!writer->input_iterator);
        connection = bt_private_port_get_private_connection(self_port);
        assert(connection);
-        writer->input_iterator =
-               bt_private_connection_create_notification_iterator(connection);
+       writer->input_iterator =
+               bt_private_connection_create_notification_iterator(connection,
+                       NULL);
 
        if (!writer->input_iterator) {
                writer->error = true;
index 303c42bdc464076d59384a734b74fa98f5f44647..99664498b3df718a607c7ff3feb779042ba027d0 100644 (file)
@@ -831,7 +831,8 @@ void sink_port_connected(struct bt_private_component *private_component,
        assert(user_data);
        assert(priv_conn);
        user_data->notif_iter =
-               bt_private_connection_create_notification_iterator(priv_conn);
+               bt_private_connection_create_notification_iterator(priv_conn,
+                       NULL);
        assert(user_data->notif_iter);
        bt_put(priv_conn);
 }
index 1b4c94ec2c43e595295eee7ac78411c6561d2a64..2fd584c921dd3a32dfbb3e4d4def9074d7fdcd74 100644 (file)
@@ -884,7 +884,8 @@ void sink_port_connected(struct bt_private_component *private_component,
        assert(user_data);
        assert(priv_conn);
        user_data->notif_iter =
-               bt_private_connection_create_notification_iterator(priv_conn);
+               bt_private_connection_create_notification_iterator(priv_conn,
+                       NULL);
        assert(user_data->notif_iter);
        bt_put(priv_conn);
 }
This page took 0.036409 seconds and 4 git commands to generate.