X-Git-Url: https://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=src%2Flib%2Fgraph%2Fiterator.c;fp=src%2Flib%2Fgraph%2Fiterator.c;h=c3cd9fecaf1ad4865131603300531f50f4e9a656;hp=1cb1e6a074f19af053650d58acdbe049987eda8b;hb=78d07b86b198c6d34673d6016e5926b4e50f21a4;hpb=879e4affa41282c93773c01801343db28e36980f diff --git a/src/lib/graph/iterator.c b/src/lib/graph/iterator.c index 1cb1e6a0..c3cd9fec 100644 --- a/src/lib/graph/iterator.c +++ b/src/lib/graph/iterator.c @@ -50,6 +50,7 @@ #include "message/stream.h" #include "message/packet.h" #include "lib/func-status.h" +#include "clock-correlation-validator/clock-correlation-validator.h" /* * TODO: Use graph's state (number of active iterators, etc.) and @@ -119,12 +120,6 @@ void bt_message_iterator_destroy(struct bt_object *obj) "%!+i", iterator); bt_message_iterator_try_finalize(iterator); - if (iterator->clock_expectation.type == - CLOCK_EXPECTATION_ORIGIN_OTHER_NO_UUID) { - BT_CLOCK_CLASS_PUT_REF_AND_RESET( - iterator->clock_expectation.clock_class); - } - if (iterator->connection) { /* * Remove ourself from the originating connection so @@ -160,6 +155,8 @@ void bt_message_iterator_destroy(struct bt_object *obj) iterator->msgs = NULL; } + BT_IF_DEV_MODE(bt_clock_correlation_validator_destroy( + iterator->correlation_validator)); BT_IF_DEV_MODE(g_hash_table_destroy(iterator->per_stream_state)); g_free(iterator); @@ -366,6 +363,17 @@ int create_self_component_input_port_message_iterator( goto error; } + BT_IF_DEV_MODE( + iterator->correlation_validator = + bt_clock_correlation_validator_create(); + if (!iterator->correlation_validator) { + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to allocate a clock correlation validator."); + status = BT_FUNC_STATUS_MEMORY_ERROR; + goto error; + } + ); + g_ptr_array_set_size(iterator->msgs, MSG_BATCH_SIZE); iterator->last_ns_from_origin = INT64_MIN; @@ -677,113 +685,61 @@ void assert_post_dev_clock_classes_are_compatible_one( struct bt_message_iterator *iterator, const struct bt_message *msg) { - const struct bt_clock_class *clock_class = NULL; - bt_uuid clock_class_uuid = NULL; - - switch (bt_message_get_type(msg)) { - case BT_MESSAGE_TYPE_STREAM_BEGINNING: - { - const struct bt_message_stream *stream_msg = - (struct bt_message_stream *) msg; - - clock_class = stream_msg->stream->class->default_clock_class; - break; - } - case BT_MESSAGE_TYPE_MESSAGE_ITERATOR_INACTIVITY: - { - const struct bt_message_message_iterator_inactivity *mii_msg = - (struct bt_message_message_iterator_inactivity *) msg; - - clock_class = mii_msg->cs->clock_class; - break; - } - default: - return; - } - - if (clock_class) { - clock_class_uuid = bt_clock_class_get_uuid(clock_class); - } - - switch (iterator->clock_expectation.type) { - case CLOCK_EXPECTATION_UNSET: - /* - * This is the first time we see a message with a clock - * snapshot: record the properties of that clock, against - * which we'll compare the clock properties of the following - * messages. - */ + enum bt_clock_correlation_validator_error_type type; + bt_uuid expected_uuid; + const bt_clock_class *actual_clock_cls; + const bt_clock_class *expected_clock_cls; + + if (!bt_clock_correlation_validator_validate_message( + iterator->correlation_validator, msg, &type, + &expected_uuid, &actual_clock_cls, + &expected_clock_cls)) { + switch (type) { + case BT_CLOCK_CORRELATION_VALIDATOR_ERROR_TYPE_EXPECTING_NO_CLOCK_CLASS_GOT_ONE: + BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, + "stream-class-has-no-clock-class", false, + "Expecting no clock class, got one."); + case BT_CLOCK_CORRELATION_VALIDATOR_ERROR_TYPE_EXPECTING_ORIGIN_UNIX_GOT_NONE: + BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, + "stream-class-has-clock-class-with-unix-epoch-origin", false, + "Expecting a clock class, got none."); + case BT_CLOCK_CORRELATION_VALIDATOR_ERROR_TYPE_EXPECTING_ORIGIN_UNIX_GOT_OTHER: + BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, + "clock-class-has-unix-epoch-origin", false, + "Expecting a clock class with Unix epoch origin: %![cc-]+K", + actual_clock_cls); + case BT_CLOCK_CORRELATION_VALIDATOR_ERROR_TYPE_EXPECTING_ORIGIN_UUID_GOT_NONE: + BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, + "stream-class-has-clock-class-with-uuid", false, + "Expecting a clock class, got none."); + case BT_CLOCK_CORRELATION_VALIDATOR_ERROR_TYPE_EXPECTING_ORIGIN_UUID_GOT_UNIX: + BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, + "clock-class-has-non-unix-epoch-origin", false, + "Expecting a clock class without Unix epoch origin: %![cc-]+K", + actual_clock_cls); + case BT_CLOCK_CORRELATION_VALIDATOR_ERROR_TYPE_EXPECTING_ORIGIN_UUID_GOT_NO_UUID: + BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, + "clock-class-has-uuid", false, + "Expecting a clock class with UUID: %![cc-]+K", + actual_clock_cls); + case BT_CLOCK_CORRELATION_VALIDATOR_ERROR_TYPE_EXPECTING_ORIGIN_UUID_GOT_OTHER_UUID: + BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, + "clock-class-has-expected-uuid", false, + "Expecting a clock class with UUID, got one with a different UUID: %![cc-]+K, expected-uuid=%!u", + actual_clock_cls, expected_uuid); - if (!clock_class) { - iterator->clock_expectation.type = CLOCK_EXPECTATION_NONE; - } else if (bt_clock_class_origin_is_unix_epoch(clock_class)) { - iterator->clock_expectation.type = CLOCK_EXPECTATION_ORIGIN_UNIX; - } else if (clock_class_uuid) { - iterator->clock_expectation.type = CLOCK_EXPECTATION_ORIGIN_OTHER_UUID; - bt_uuid_copy(iterator->clock_expectation.uuid, clock_class_uuid); - } else { - iterator->clock_expectation.type = CLOCK_EXPECTATION_ORIGIN_OTHER_NO_UUID; - iterator->clock_expectation.clock_class = clock_class; - bt_clock_class_get_ref(iterator->clock_expectation.clock_class); + case BT_CLOCK_CORRELATION_VALIDATOR_ERROR_TYPE_EXPECTING_ORIGIN_NO_UUID_GOT_NONE: + BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, + "stream-class-has-clock-class", false, + "Expecting a clock class, got none."); + case BT_CLOCK_CORRELATION_VALIDATOR_ERROR_TYPE_EXPECTING_ORIGIN_NO_UUID_GOT_OTHER: + BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, + "clock-class-is-expected", false, + "Unexpected clock class: %![expected-cc-]+K, %![actual-cc-]+K", + expected_clock_cls, actual_clock_cls); } - break; - - case CLOCK_EXPECTATION_NONE: - BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, - "stream-class-has-no-clock-class", !clock_class, - "Expecting no clock class, got one: %![cc-]+K", - clock_class); - break; - - case CLOCK_EXPECTATION_ORIGIN_UNIX: - BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, - "stream-class-has-clock-class-with-unix-epoch-origin", clock_class, - "Expecting a clock class with Unix epoch origin, got none."); - - BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, - "clock-class-has-unix-epoch-origin", - bt_clock_class_origin_is_unix_epoch(clock_class), - "Expecting a clock class with Unix epoch origin: %![cc-]+K", - clock_class); - break; - - case CLOCK_EXPECTATION_ORIGIN_OTHER_UUID: - BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, - "stream-class-has-clock-class-with-uuid", clock_class, - "Expecting a clock class with UUID, got none."); - - BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, - "clock-class-has-non-unix-epoch-origin", - !bt_clock_class_origin_is_unix_epoch(clock_class), - "Expecting a clock class without Unix epoch origin: %![cc-]+K", - clock_class); - - BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, - "clock-class-has-uuid", - clock_class_uuid, - "Expecting a clock class with UUID, got one without UUID: %![cc-]+K", - clock_class); - BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, - "clock-class-has-expected-uuid", - !bt_uuid_compare(iterator->clock_expectation.uuid, clock_class_uuid), - "Expecting a clock class with UUID, got one " - "with a different UUID: %![cc-]+K, expected-uuid=%!u", - clock_class, iterator->clock_expectation.uuid); - break; - - case CLOCK_EXPECTATION_ORIGIN_OTHER_NO_UUID: - BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, - "stream-class-has-clock-class", clock_class, - "Expecting a clock class, got none."); - - BT_ASSERT_POST_DEV(NEXT_METHOD_NAME, - "clock-class-is-expected", - clock_class == iterator->clock_expectation.clock_class, - "Expecting clock class %![cc-]+K, got %![cc-]+K.", - iterator->clock_expectation.clock_class, - clock_class); - break; + bt_common_abort(); } }