lib: make can_seek_beginning and can_seek_ns_from_origin methods return a status
[babeltrace.git] / src / lib / graph / iterator.c
index 62e1f91e768719131929aa94aa0b94fdcca46494..983f5c100ab5d1a5482742bd080739589f90128c 100644 (file)
@@ -63,7 +63,6 @@
 #include <stdlib.h>
 
 #include "component-class.h"
-#include "component-class-sink-colander.h"
 #include "component.h"
 #include "component-sink.h"
 #include "component-source.h"
@@ -274,25 +273,30 @@ void bt_self_component_port_input_message_iterator_set_connection(
 }
 
 static
-bt_bool can_seek_ns_from_origin_true(
+enum bt_message_iterator_can_seek_beginning_status can_seek_ns_from_origin_true(
                struct bt_self_component_port_input_message_iterator *iterator,
-               int64_t ns_from_origin)
+               int64_t ns_from_origin, bt_bool *can_seek)
 {
-       return BT_TRUE;
+       *can_seek = BT_TRUE;
+
+       return BT_FUNC_STATUS_OK;
 }
 
 static
-bt_bool can_seek_beginning_true(
-               struct bt_self_component_port_input_message_iterator *iterator)
+enum bt_message_iterator_can_seek_beginning_status can_seek_beginning_true(
+               struct bt_self_component_port_input_message_iterator *iterator,
+               bt_bool *can_seek)
 {
-       return BT_TRUE;
+       *can_seek = BT_TRUE;
+
+       return BT_FUNC_STATUS_OK;
 }
 
 static
-struct bt_self_component_port_input_message_iterator *
-create_self_component_input_port_message_iterator(
+int create_self_component_input_port_message_iterator(
                struct bt_self_message_iterator *self_downstream_msg_iter,
-               struct bt_self_component_port_input *self_port)
+               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)(
                        void *, void *, void *);
@@ -307,7 +311,9 @@ create_self_component_input_port_message_iterator(
        struct bt_component *comp;
        struct bt_component *upstream_comp;
        struct bt_component_class *upstream_comp_cls;
+       int status;
 
+       BT_ASSERT_PRE_NON_NULL(message_iterator, "Created message iterator");
        BT_ASSERT_PRE_NON_NULL(port, "Input port");
        comp = bt_port_borrow_component_inline(port);
        BT_ASSERT_PRE(bt_port_is_connected(port),
@@ -339,6 +345,7 @@ create_self_component_input_port_message_iterator(
                BT_LIB_LOGE_APPEND_CAUSE(
                        "Failed to allocate one self component input port "
                        "message iterator.");
+               status = BT_FUNC_STATUS_MEMORY_ERROR;
                goto error;
        }
 
@@ -347,6 +354,7 @@ create_self_component_input_port_message_iterator(
        iterator->msgs = g_ptr_array_new();
        if (!iterator->msgs) {
                BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GPtrArray.");
+               status = BT_FUNC_STATUS_MEMORY_ERROR;
                goto error;
        }
 
@@ -355,12 +363,14 @@ create_self_component_input_port_message_iterator(
        iterator->auto_seek.msgs = g_queue_new();
        if (!iterator->auto_seek.msgs) {
                BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GQueue.");
+               status = BT_FUNC_STATUS_MEMORY_ERROR;
                goto error;
        }
 
        iterator->upstream_msg_iters = g_ptr_array_new();
        if (!iterator->upstream_msg_iters) {
                BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GPtrArray.");
+               status = BT_FUNC_STATUS_MEMORY_ERROR;
                goto error;
        }
 
@@ -430,7 +440,7 @@ create_self_component_input_port_message_iterator(
        if (iterator->methods.seek_beginning &&
                        !iterator->methods.can_seek_beginning) {
                iterator->methods.can_seek_beginning =
-                       (bt_self_component_port_input_message_iterator_seek_beginning_method)
+                       (bt_self_component_port_input_message_iterator_can_seek_beginning_method)
                                can_seek_beginning_true;
        }
 
@@ -472,6 +482,7 @@ create_self_component_input_port_message_iterator(
                                "%![iter-]+i, status=%s",
                                iterator,
                                bt_common_func_status_string(iter_status));
+                       status = iter_status;
                        goto error;
                }
        }
@@ -494,33 +505,38 @@ create_self_component_input_port_message_iterator(
        BT_LIB_LOGI("Created message iterator on self component input port: "
                "%![up-port-]+p, %![up-comp-]+c, %![iter-]+i",
                upstream_port, upstream_comp, iterator);
+
+       *message_iterator = iterator;
+       status = BT_FUNC_STATUS_OK;
        goto end;
 
 error:
        BT_OBJECT_PUT_REF_AND_RESET(iterator);
 
 end:
-       return iterator;
+       return status;
 }
 
-struct bt_self_component_port_input_message_iterator *
+bt_self_component_port_input_message_iterator_create_from_message_iterator_status
 bt_self_component_port_input_message_iterator_create_from_message_iterator(
                struct bt_self_message_iterator *self_msg_iter,
-               struct bt_self_component_port_input *input_port)
+               struct bt_self_component_port_input *input_port,
+               struct bt_self_component_port_input_message_iterator **message_iterator)
 {
        BT_ASSERT_PRE_NON_NULL(self_msg_iter, "Message iterator");
        return create_self_component_input_port_message_iterator(self_msg_iter,
-               input_port);
+               input_port, message_iterator);
 }
 
-struct bt_self_component_port_input_message_iterator *
+bt_self_component_port_input_message_iterator_create_from_sink_component_status
 bt_self_component_port_input_message_iterator_create_from_sink_component(
                struct bt_self_component_sink *self_comp,
-               struct bt_self_component_port_input *input_port)
+               struct bt_self_component_port_input *input_port,
+               struct bt_self_component_port_input_message_iterator **message_iterator)
 {
        BT_ASSERT_PRE_NON_NULL(self_comp, "Sink component");
        return create_self_component_input_port_message_iterator(NULL,
-               input_port);
+               input_port, message_iterator);
 }
 
 void *bt_self_message_iterator_get_data(
@@ -940,7 +956,7 @@ struct bt_self_component *bt_self_message_iterator_borrow_component(
        return (void *) iterator->upstream_component;
 }
 
-struct bt_self_port_output *bt_self_message_iterator_borrow_port(
+struct bt_self_component_port_output *bt_self_message_iterator_borrow_port(
                struct bt_self_message_iterator *self_iterator)
 {
        struct bt_self_component_port_input_message_iterator *iterator =
@@ -950,13 +966,15 @@ struct bt_self_port_output *bt_self_message_iterator_borrow_port(
        return (void *) iterator->upstream_port;
 }
 
-bt_bool bt_self_component_port_input_message_iterator_can_seek_ns_from_origin(
+enum bt_message_iterator_can_seek_ns_from_origin_status
+bt_self_component_port_input_message_iterator_can_seek_ns_from_origin(
                struct bt_self_component_port_input_message_iterator *iterator,
-               int64_t ns_from_origin)
+               int64_t ns_from_origin, bt_bool *can_seek)
 {
-       bt_bool can = BT_FALSE;
+       enum bt_message_iterator_can_seek_ns_from_origin_status status;
 
        BT_ASSERT_PRE_NON_NULL(iterator, "Message iterator");
+       BT_ASSERT_PRE_NON_NULL(can_seek, "Result (output)");
        BT_ASSERT_PRE_ITER_HAS_STATE_TO_SEEK(iterator);
        BT_ASSERT_PRE(
                bt_component_borrow_graph(iterator->upstream_component)->config_state !=
@@ -965,8 +983,22 @@ bt_bool bt_self_component_port_input_message_iterator_can_seek_ns_from_origin(
                bt_component_borrow_graph(iterator->upstream_component));
 
        if (iterator->methods.can_seek_ns_from_origin) {
-               can = iterator->methods.can_seek_ns_from_origin(iterator,
-                       ns_from_origin);
+               /*
+                * Initialize to an invalid value, so we can post-assert that
+                * the method returned a valid value.
+                */
+               *can_seek = -1;
+
+               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,
+                       "Unexpected boolean value returned from user's \"can seek ns from origin\" method: val=%d, %![iter-]+i",
+                       *can_seek, iterator);
+
                goto end;
        }
 
@@ -974,20 +1006,22 @@ bt_bool bt_self_component_port_input_message_iterator_can_seek_ns_from_origin(
         * Automatic seeking fall back: if we can seek to the beginning,
         * then we can automatically seek to any message.
         */
-       if (iterator->methods.can_seek_beginning) {
-               can = iterator->methods.can_seek_beginning(iterator);
-       }
+       status = (int) bt_self_component_port_input_message_iterator_can_seek_beginning(
+               iterator, can_seek);
 
 end:
-       return can;
+       return status;
 }
 
-bt_bool bt_self_component_port_input_message_iterator_can_seek_beginning(
-               struct bt_self_component_port_input_message_iterator *iterator)
+enum bt_message_iterator_can_seek_beginning_status
+bt_self_component_port_input_message_iterator_can_seek_beginning(
+               struct bt_self_component_port_input_message_iterator *iterator,
+               bt_bool *can_seek)
 {
-       bt_bool can = BT_FALSE;
+       enum bt_message_iterator_can_seek_beginning_status status;
 
        BT_ASSERT_PRE_NON_NULL(iterator, "Message iterator");
+       BT_ASSERT_PRE_NON_NULL(can_seek, "Result (output)");
        BT_ASSERT_PRE_ITER_HAS_STATE_TO_SEEK(iterator);
        BT_ASSERT_PRE(
                bt_component_borrow_graph(iterator->upstream_component)->config_state !=
@@ -996,10 +1030,26 @@ bt_bool bt_self_component_port_input_message_iterator_can_seek_beginning(
                bt_component_borrow_graph(iterator->upstream_component));
 
        if (iterator->methods.can_seek_beginning) {
-               can = iterator->methods.can_seek_beginning(iterator);
+               /*
+                * Initialize to an invalid value, so we can post-assert that
+                * the method returned a valid value.
+                */
+               *can_seek = -1;
+
+               status = (int) iterator->methods.can_seek_beginning(iterator, can_seek);
+
+               BT_ASSERT_POST(
+                       status != BT_FUNC_STATUS_OK ||
+                               *can_seek == BT_TRUE ||
+                               *can_seek == BT_FALSE,
+                       "Unexpected boolean value returned from user's \"can seek beginning\" method: val=%d, %![iter-]+i",
+                       *can_seek, iterator);
+       } else {
+               *can_seek = BT_FALSE;
+               status = BT_FUNC_STATUS_OK;
        }
 
-       return can;
+       return status;
 }
 
 static inline
@@ -1039,6 +1089,22 @@ void reset_iterator_expectations(
        iterator->clock_expectation.type = CLOCK_EXPECTATION_UNSET;
 }
 
+static
+bool message_iterator_can_seek_beginning(
+               struct bt_self_component_port_input_message_iterator *iterator)
+{
+       enum bt_message_iterator_can_seek_beginning_status status;
+       bt_bool can_seek;
+
+       status = bt_self_component_port_input_message_iterator_can_seek_beginning(
+               iterator, &can_seek);
+       if (status != BT_FUNC_STATUS_OK) {
+               can_seek = BT_FALSE;
+       }
+
+       return can_seek;
+}
+
 enum bt_message_iterator_seek_beginning_status
 bt_self_component_port_input_message_iterator_seek_beginning(
                struct bt_self_component_port_input_message_iterator *iterator)
@@ -1052,9 +1118,7 @@ bt_self_component_port_input_message_iterator_seek_beginning(
                        BT_GRAPH_CONFIGURATION_STATE_CONFIGURING,
                "Graph is not configured: %!+g",
                bt_component_borrow_graph(iterator->upstream_component));
-       BT_ASSERT_PRE(
-               bt_self_component_port_input_message_iterator_can_seek_beginning(
-                       iterator),
+       BT_ASSERT_PRE(message_iterator_can_seek_beginning(iterator),
                "Message iterator cannot seek beginning: %!+i", iterator);
 
        /*
@@ -1577,6 +1641,22 @@ int clock_raw_value_from_ns_from_origin(const bt_clock_class *clock_class,
                cc_offset_cycles, cc_freq, ns_from_origin, raw_value);
 }
 
+static
+bool message_iterator_can_seek_ns_from_origin(
+               struct bt_self_component_port_input_message_iterator *iterator,
+               int64_t ns_from_origin)
+{
+       enum bt_message_iterator_can_seek_ns_from_origin_status status;
+       bt_bool can_seek;
+
+       status = bt_self_component_port_input_message_iterator_can_seek_ns_from_origin(
+               iterator, ns_from_origin, &can_seek);
+       if (status != BT_FUNC_STATUS_OK) {
+               can_seek = BT_FALSE;
+       }
+
+       return can_seek;
+}
 
 enum bt_message_iterator_seek_ns_from_origin_status
 bt_self_component_port_input_message_iterator_seek_ns_from_origin(
@@ -1594,8 +1674,7 @@ bt_self_component_port_input_message_iterator_seek_ns_from_origin(
                "Graph is not configured: %!+g",
                bt_component_borrow_graph(iterator->upstream_component));
        BT_ASSERT_PRE(
-               bt_self_component_port_input_message_iterator_can_seek_ns_from_origin(
-                       iterator, ns_from_origin),
+               message_iterator_can_seek_ns_from_origin(iterator, ns_from_origin),
                "Message iterator cannot seek nanoseconds from origin: %!+i, "
                "ns-from-origin=%" PRId64, iterator, ns_from_origin);
        set_self_comp_port_input_msg_iterator_state(iterator,
@@ -1632,7 +1711,15 @@ bt_self_component_port_input_message_iterator_seek_ns_from_origin(
                 * 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.
                 */
-               BT_ASSERT(iterator->methods.can_seek_beginning(iterator));
+               enum bt_component_class_message_iterator_can_seek_beginning_method_status
+                       can_seek_status;
+               bt_bool can_seek_beginning;
+
+               can_seek_status = iterator->methods.can_seek_beginning(iterator,
+                       &can_seek_beginning);
+               BT_ASSERT(can_seek_status == BT_FUNC_STATUS_OK);
+               BT_ASSERT(can_seek_beginning);
+
                BT_ASSERT(iterator->methods.seek_beginning);
                BT_LIB_LOGD("Calling user's \"seek beginning\" method: %!+i",
                        iterator);
This page took 0.027863 seconds and 4 git commands to generate.