lib: rename `bt_object_{get,put}_no` -> `bt_object_{get,put}_ref_no`
[babeltrace.git] / src / lib / graph / iterator.c
index 8af6166a0dd47d5759219c2c4a1d96220a780ffe..80de80ee543fb28512562e6f7c26bbe216347db1 100644 (file)
@@ -137,7 +137,7 @@ void bt_self_component_port_input_message_iterator_destroy(struct bt_object *obj
 
        if (iterator->auto_seek.msgs) {
                while (!g_queue_is_empty(iterator->auto_seek.msgs)) {
-                       bt_object_put_no_null_check(
+                       bt_object_put_ref_no_null_check(
                                g_queue_pop_tail(iterator->auto_seek.msgs));
                }
 
@@ -298,7 +298,7 @@ int create_self_component_input_port_message_iterator(
                struct bt_self_component_port_input *self_port,
                struct bt_self_component_port_input_message_iterator **message_iterator)
 {
-       typedef enum bt_component_class_message_iterator_init_method_status (*init_method_t)(
+       typedef enum bt_component_class_message_iterator_initialize_method_status (*init_method_t)(
                        void *, void *, void *, void *);
 
        init_method_t init_method = NULL;
@@ -451,7 +451,7 @@ int create_self_component_input_port_message_iterator(
                        (void *) upstream_comp_cls;
 
                init_method =
-                       (init_method_t) src_comp_cls->methods.msg_iter_init;
+                       (init_method_t) src_comp_cls->methods.msg_iter_initialize;
                break;
        }
        case BT_COMPONENT_CLASS_TYPE_FILTER:
@@ -460,7 +460,7 @@ int create_self_component_input_port_message_iterator(
                        (void *) upstream_comp_cls;
 
                init_method =
-                       (init_method_t) flt_comp_cls->methods.msg_iter_init;
+                       (init_method_t) flt_comp_cls->methods.msg_iter_initialize;
                break;
        }
        default:
@@ -469,7 +469,7 @@ int create_self_component_input_port_message_iterator(
        }
 
        if (init_method) {
-               enum bt_component_class_message_iterator_init_method_status iter_status;
+               enum bt_component_class_message_iterator_initialize_method_status iter_status;
 
                BT_LIB_LOGD("Calling user's initialization method: %!+i", iterator);
                iter_status = init_method(iterator, &iterator->config, upstream_comp,
@@ -1001,25 +1001,46 @@ bt_self_component_port_input_message_iterator_can_seek_ns_from_origin(
                 */
                *can_seek = -1;
 
+               BT_LIB_LOGD("Calling user's \"can seek nanoseconds from origin\" method: %!+i",
+                       iterator);
+
                status = (int) iterator->methods.can_seek_ns_from_origin(iterator,
                        ns_from_origin, can_seek);
 
-               BT_ASSERT_POST(
-                       status != BT_FUNC_STATUS_OK ||
-                               *can_seek == BT_TRUE ||
-                               *can_seek == BT_FALSE,
+               if (status != BT_FUNC_STATUS_OK) {
+                       BT_LIB_LOGW_APPEND_CAUSE(
+                               "Component input port message iterator's \"can seek nanoseconds from origin\" method failed: "
+                               "%![iter-]+i, status=%s",
+                               iterator, bt_common_func_status_string(status));
+                       goto end;
+               }
+
+               BT_ASSERT_POST(*can_seek == BT_TRUE || *can_seek == BT_FALSE,
                        "Unexpected boolean value returned from user's \"can seek ns from origin\" method: val=%d, %![iter-]+i",
                        *can_seek, iterator);
 
-               goto end;
+               BT_LIB_LOGD(
+                       "User's \"can seek nanoseconds from origin\" returned successfully: "
+                       "%![iter-]+i, can-seek=%d",
+                       iterator, *can_seek);
+
+               if (*can_seek) {
+                       goto end;
+               }
        }
 
        /*
-        * Automatic seeking fall back: if we can seek to the beginning,
-        * then we can automatically seek to any message.
+        * Automatic seeking fall back: if we can seek to the beginning and the
+        * iterator supports forward seeking then we can automatically seek to
+        * any timestamp.
         */
        status = (int) bt_self_component_port_input_message_iterator_can_seek_beginning(
                iterator, can_seek);
+       if (status != BT_FUNC_STATUS_OK) {
+               goto end;
+       }
+
+       *can_seek = *can_seek && iterator->config.can_seek_forward;
 
 end:
        return status;
@@ -1503,7 +1524,7 @@ skip_msg:
                break;
        }
 
-       bt_object_put_no_null_check(msg);
+       bt_object_put_ref_no_null_check(msg);
        msg = NULL;
        goto end;
 
@@ -1521,7 +1542,7 @@ int find_message_ge_ns_from_origin(
                struct bt_self_component_port_input_message_iterator *iterator,
                int64_t ns_from_origin, GHashTable *stream_states)
 {
-       int status;
+       int status = BT_FUNC_STATUS_OK;
        enum bt_self_component_port_input_message_iterator_state init_state =
                iterator->state;
        const struct bt_message *messages[MSG_BATCH_SIZE];
@@ -1603,7 +1624,7 @@ int find_message_ge_ns_from_origin(
 end:
        for (i = 0; i < user_count; i++) {
                if (messages[i]) {
-                       bt_object_put_no_null_check(messages[i]);
+                       bt_object_put_ref_no_null_check(messages[i]);
                }
        }
 
@@ -1686,6 +1707,7 @@ bt_self_component_port_input_message_iterator_seek_ns_from_origin(
 {
        int status;
        GHashTable *stream_states = NULL;
+       bt_bool can_seek_by_itself;
 
        BT_ASSERT_PRE_NON_NULL(iterator, "Message iterator");
        BT_ASSERT_PRE_ITER_HAS_STATE_TO_SEEK(iterator);
@@ -1694,6 +1716,7 @@ bt_self_component_port_input_message_iterator_seek_ns_from_origin(
                        BT_GRAPH_CONFIGURATION_STATE_CONFIGURING,
                "Graph is not configured: %!+g",
                bt_component_borrow_graph(iterator->upstream_component));
+       /* The iterator must be able to seek ns from origin one way or another. */
        BT_ASSERT_PRE(
                message_iterator_can_seek_ns_from_origin(iterator, ns_from_origin),
                "Message iterator cannot seek nanoseconds from origin: %!+i, "
@@ -1707,8 +1730,25 @@ bt_self_component_port_input_message_iterator_seek_ns_from_origin(
         */
        reset_iterator_expectations(iterator);
 
-       if (iterator->methods.seek_ns_from_origin) {
+       /* Check if the iterator can seek by itself.  If not we'll use autoseek. */
+       if (iterator->methods.can_seek_ns_from_origin) {
+               bt_component_class_message_iterator_can_seek_ns_from_origin_method_status
+                       can_seek_status;
+
+               can_seek_status =
+                       iterator->methods.can_seek_ns_from_origin(
+                               iterator, ns_from_origin, &can_seek_by_itself);
+               if (can_seek_status != BT_FUNC_STATUS_OK) {
+                       status = can_seek_status;
+                       goto end;
+               }
+       } else {
+               can_seek_by_itself = false;
+       }
+
+       if (can_seek_by_itself) {
                /* The iterator knows how to seek to a particular time, let it handle this. */
+               BT_ASSERT(iterator->methods.seek_ns_from_origin);
                BT_LIB_LOGD("Calling user's \"seek nanoseconds from origin\" method: "
                        "%![iter-]+i, ns=%" PRId64, iterator, ns_from_origin);
                status = iterator->methods.seek_ns_from_origin(iterator,
@@ -1729,8 +1769,9 @@ bt_self_component_port_input_message_iterator_seek_ns_from_origin(
                }
        } else {
                /*
-                * The iterator doesn't know how to seek to a particular time.  We will
-                * seek to the beginning and fast forward to the right place.
+                * The iterator doesn't know how to seek by itself to a
+                * particular time.  We will seek to the beginning and fast
+                * forward to the right place.
                 */
                enum bt_component_class_message_iterator_can_seek_beginning_method_status
                        can_seek_status;
@@ -1779,7 +1820,7 @@ bt_self_component_port_input_message_iterator_seek_ns_from_origin(
                 * message queue.
                 */
                while (!g_queue_is_empty(iterator->auto_seek.msgs)) {
-                       bt_object_put_no_null_check(
+                       bt_object_put_ref_no_null_check(
                                g_queue_pop_tail(iterator->auto_seek.msgs));
                }
 
This page took 0.031896 seconds and 4 git commands to generate.