X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Fgraph%2Fmessage%2Fiterator.h;h=8014d1fad536c27d8fbd97772a7c014035f17e43;hb=f2fb1b3297ca0bc13b53189a063b63944be7fae9;hp=1ecaa95a991d29329a2816d1ffcc6dd0ca160bca;hpb=da9c4c5260242efe4e3c2ff4a15201f7cbd1c89a;p=babeltrace.git diff --git a/src/lib/graph/message/iterator.h b/src/lib/graph/message/iterator.h index 1ecaa95a..8014d1fa 100644 --- a/src/lib/graph/message/iterator.h +++ b/src/lib/graph/message/iterator.h @@ -28,19 +28,14 @@ #include "lib/object.h" #include #include -#include #include #include "common/assert.h" #include +#include "common/uuid.h" struct bt_port; struct bt_graph; -enum bt_message_iterator_type { - BT_MESSAGE_ITERATOR_TYPE_SELF_COMPONENT_PORT_INPUT, - BT_MESSAGE_ITERATOR_TYPE_PORT_OUTPUT, -}; - enum bt_self_component_port_input_message_iterator_state { /* Iterator is not initialized */ BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_NON_INITIALIZED, @@ -70,39 +65,55 @@ enum bt_self_component_port_input_message_iterator_state { BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_LAST_SEEKING_RETURNED_ERROR, }; -struct bt_message_iterator { - struct bt_object base; - enum bt_message_iterator_type type; - GPtrArray *msgs; -}; - -typedef enum bt_self_message_iterator_status +typedef enum bt_component_class_message_iterator_next_method_status (*bt_self_component_port_input_message_iterator_next_method)( void *, bt_message_array_const, uint64_t, uint64_t *); -typedef enum bt_self_message_iterator_status +typedef enum bt_component_class_message_iterator_seek_ns_from_origin_method_status (*bt_self_component_port_input_message_iterator_seek_ns_from_origin_method)( void *, int64_t); -typedef enum bt_self_message_iterator_status +typedef enum bt_component_class_message_iterator_seek_beginning_method_status (*bt_self_component_port_input_message_iterator_seek_beginning_method)( void *); -typedef bt_bool +typedef enum bt_component_class_message_iterator_can_seek_ns_from_origin_method_status (*bt_self_component_port_input_message_iterator_can_seek_ns_from_origin_method)( - void *, int64_t); + void *, int64_t, bt_bool *); -typedef bt_bool +typedef enum bt_component_class_message_iterator_can_seek_beginning_method_status (*bt_self_component_port_input_message_iterator_can_seek_beginning_method)( - void *); + void *, bt_bool *); struct bt_self_component_port_input_message_iterator { - struct bt_message_iterator base; + struct bt_object base; + GPtrArray *msgs; struct bt_component *upstream_component; /* Weak */ struct bt_port *upstream_port; /* Weak */ struct bt_connection *connection; /* Weak */ struct bt_graph *graph; /* Weak */ + /* + * Array of + * `struct bt_self_component_port_input_message_iterator *` + * (weak). + * + * This is an array of upstream message iterators on which this + * iterator depends. The references are weak: an upstream + * message iterator is responsible for removing its entry within + * this array on finalization/destruction. + */ + GPtrArray *upstream_msg_iters; + + /* + * Downstream message iterator which depends on this message + * iterator (weak). + * + * This can be `NULL` if this message iterator's owner is a sink + * component. + */ + struct bt_self_component_port_input_message_iterator *downstream_msg_iter; + struct { bt_self_component_port_input_message_iterator_next_method next; bt_self_component_port_input_message_iterator_seek_ns_from_origin_method seek_ns_from_origin; @@ -113,6 +124,40 @@ struct bt_self_component_port_input_message_iterator { enum bt_self_component_port_input_message_iterator_state state; + /* + * Timestamp of the last received message (or INT64_MIN in the + * beginning, or after a seek to beginning). + */ + int64_t last_ns_from_origin; + + struct { + enum { + /* We haven't recorded clock properties yet. */ + CLOCK_EXPECTATION_UNSET, + + /* Expect to have no clock. */ + CLOCK_EXPECTATION_NONE, + + /* Clock with origin_is_unix_epoch true.*/ + CLOCK_EXPECTATION_ORIGIN_UNIX, + + /* Clock with origin_is_unix_epoch false, with a UUID.*/ + CLOCK_EXPECTATION_ORIGIN_OTHER_UUID, + + /* Clock with origin_is_unix_epoch false, without a UUID.*/ + CLOCK_EXPECTATION_ORIGIN_OTHER_NO_UUID, + } type; + + /* + * Expected UUID of the clock, if `type`is CLOCK_EXPECTATION_ORIGIN_OTHER_UUID. + * + * If the clock's origin is the unix epoch, the UUID is + * irrelevant (as the clock will be correlatable with other + * clocks having the same origin). + */ + bt_uuid_t uuid; + } clock_expectation; + /* * Data necessary for auto seek (the seek-to-beginning then fast-forward * seek strategy). @@ -131,23 +176,19 @@ struct bt_self_component_port_input_message_iterator { * send is the first of the queue). */ GQueue *msgs; + + /* + * After auto-seeking, we replace the iterator's `next` callback + * with our own, which returns the contents of the `msgs` queue. + * This field is where we save the original callback, so we can + * restore it. + */ + void *original_next_callback; } auto_seek; void *user_data; }; -struct bt_port_output_message_iterator { - struct bt_message_iterator base; - struct bt_graph *graph; /* Owned by this */ - struct bt_component_sink *colander; /* Owned by this */ - - /* - * Only used temporarily as a bridge between a colander sink and - * the user. - */ - uint64_t count; -}; - BT_HIDDEN void bt_self_component_port_input_message_iterator_try_finalize( struct bt_self_component_port_input_message_iterator *iterator); @@ -163,19 +204,19 @@ const char *bt_self_component_port_input_message_iterator_state_string( { switch (state) { case BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_ACTIVE: - return "BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_ACTIVE"; + return "ACTIVE"; case BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_ENDED: - return "BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_ENDED"; + return "ENDED"; case BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_FINALIZING: - return "BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_FINALIZING"; + return "FINALIZING"; case BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_FINALIZED: - return "BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_FINALIZED"; + return "FINALIZED"; case BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_SEEKING: - return "BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_SEEKING"; + return "SEEKING"; case BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_LAST_SEEKING_RETURNED_AGAIN: - return "BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_LAST_SEEKING_RETURNED_AGAIN"; + return "LAST_SEEKING_RETURNED_AGAIN"; case BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_LAST_SEEKING_RETURNED_ERROR: - return "BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_STATE_LAST_SEEKING_RETURNED_ERROR"; + return "LAST_SEEKING_RETURNED_ERROR"; default: return "(unknown)"; }