X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Futils%2Ftrimmer%2Ftrimmer.c;h=889845a1d6fdde2ccb7cb1f53151625fe138cc57;hb=98b15851a941e7342b8bb19e265cdc3a40fabfb8;hp=4d39fba27cdbd662e5d1df2e21c830e6a7fb66e3;hpb=f2fb1b3297ca0bc13b53189a063b63944be7fae9;p=babeltrace.git diff --git a/src/plugins/utils/trimmer/trimmer.c b/src/plugins/utils/trimmer/trimmer.c index 4d39fba2..889845a1 100644 --- a/src/plugins/utils/trimmer/trimmer.c +++ b/src/plugins/utils/trimmer/trimmer.c @@ -34,6 +34,7 @@ #include #include #include "compat/glib.h" +#include "plugins/common/param-validation/param-validation.h" #include "trimmer.h" @@ -453,19 +454,13 @@ int set_bound_from_param(struct trimmer_comp *trimmer_comp, */ sprintf(tmp_arg, "%" PRId64, value); arg = tmp_arg; - } else if (bt_value_is_string(param)) { - arg = bt_value_string_get(param); } else { - BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, - "`%s` parameter must be an integer or a string value.", - param_name); - ret = -1; - goto end; + BT_ASSERT(bt_value_is_string(param)); + arg = bt_value_string_get(param); } ret = set_bound_from_str(trimmer_comp, arg, bound, is_gmt); -end: return ret; } @@ -513,11 +508,52 @@ end: } static -int init_trimmer_comp_from_params(struct trimmer_comp *trimmer_comp, +enum bt_param_validation_status validate_bound_type( + const bt_value *value, + struct bt_param_validation_context *context) +{ + enum bt_param_validation_status status = BT_PARAM_VALIDATION_STATUS_OK; + + if (!bt_value_is_signed_integer(value) && + !bt_value_is_string(value)) { + status = bt_param_validation_error(context, + "unexpected type: expected-types=[%s, %s], actual-type=%s", + bt_common_value_type_string(BT_VALUE_TYPE_SIGNED_INTEGER), + bt_common_value_type_string(BT_VALUE_TYPE_STRING), + bt_common_value_type_string(bt_value_get_type(value))); + } + + return status; +} + +struct bt_param_validation_map_value_entry_descr trimmer_params[] = { + { "gmt", BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } }, + { "begin", BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .validation_func = validate_bound_type } }, + { "end", BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .validation_func = validate_bound_type } }, + BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_END +}; + +static +bt_component_class_initialize_method_status init_trimmer_comp_from_params( + struct trimmer_comp *trimmer_comp, const bt_value *params) { const bt_value *value; - int ret = 0; + bt_component_class_initialize_method_status status; + enum bt_param_validation_status validation_status; + gchar *validate_error = NULL; + + validation_status = bt_param_validation_validate(params, + trimmer_params, &validate_error); + if (validation_status == BT_PARAM_VALIDATION_STATUS_MEMORY_ERROR) { + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; + goto end; + } else if (validation_status == BT_PARAM_VALIDATION_STATUS_VALIDATION_ERROR) { + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; + BT_COMP_LOGE_APPEND_CAUSE(trimmer_comp->self_comp, "%s", + validate_error); + goto end; + } BT_ASSERT(params); value = bt_value_map_borrow_entry_value_const(params, "gmt"); @@ -530,7 +566,7 @@ int init_trimmer_comp_from_params(struct trimmer_comp *trimmer_comp, if (set_bound_from_param(trimmer_comp, "begin", value, &trimmer_comp->begin, trimmer_comp->is_gmt)) { /* set_bound_from_param() logs errors */ - ret = -1; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; goto end; } } else { @@ -543,7 +579,7 @@ int init_trimmer_comp_from_params(struct trimmer_comp *trimmer_comp, if (set_bound_from_param(trimmer_comp, "end", value, &trimmer_comp->end, trimmer_comp->is_gmt)) { /* set_bound_from_param() logs errors */ - ret = -1; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; goto end; } } else { @@ -551,75 +587,68 @@ int init_trimmer_comp_from_params(struct trimmer_comp *trimmer_comp, trimmer_comp->end.is_set = true; } -end: if (trimmer_comp->begin.is_set && trimmer_comp->end.is_set) { /* validate_trimmer_bounds() logs errors */ - ret = validate_trimmer_bounds(trimmer_comp, - &trimmer_comp->begin, &trimmer_comp->end); + if (validate_trimmer_bounds(trimmer_comp, + &trimmer_comp->begin, &trimmer_comp->end)) { + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; + goto end; + } } - return ret; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; + +end: + g_free(validate_error); + + return status; } -bt_component_class_init_method_status trimmer_init( +bt_component_class_initialize_method_status trimmer_init( bt_self_component_filter *self_comp_flt, + bt_self_component_filter_configuration *config, const bt_value *params, void *init_data) { - int ret; - bt_component_class_init_method_status status = - BT_COMPONENT_CLASS_INIT_METHOD_STATUS_OK; + bt_component_class_initialize_method_status status; bt_self_component_add_port_status add_port_status; struct trimmer_comp *trimmer_comp = create_trimmer_comp(); bt_self_component *self_comp = bt_self_component_filter_as_self_component(self_comp_flt); + if (!trimmer_comp) { - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; } trimmer_comp->log_level = bt_component_get_logging_level( bt_self_component_as_component(self_comp)); trimmer_comp->self_comp = self_comp; + add_port_status = bt_self_component_filter_add_input_port( self_comp_flt, in_port_name, NULL, NULL); - switch (add_port_status) { - case BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR: - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; - goto error; - case BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR: - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; + if (add_port_status != BT_SELF_COMPONENT_ADD_PORT_STATUS_OK) { + status = (int) add_port_status; goto error; - default: - break; } add_port_status = bt_self_component_filter_add_output_port( self_comp_flt, "out", NULL, NULL); - switch (add_port_status) { - case BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR: - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; - goto error; - case BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR: - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; + if (add_port_status != BT_SELF_COMPONENT_ADD_PORT_STATUS_OK) { + status = (int) add_port_status; goto error; - default: - break; } - ret = init_trimmer_comp_from_params(trimmer_comp, params); - if (ret) { - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; + status = init_trimmer_comp_from_params(trimmer_comp, params); + if (status != BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK) { goto error; } bt_self_component_set_data(self_comp, trimmer_comp); + + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; goto end; error: - if (status == BT_COMPONENT_CLASS_INIT_METHOD_STATUS_OK) { - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; - } - if (trimmer_comp) { destroy_trimmer_comp(trimmer_comp); } @@ -661,19 +690,20 @@ void destroy_trimmer_iterator_stream_state( } BT_HIDDEN -bt_component_class_message_iterator_init_method_status trimmer_msg_iter_init( +bt_component_class_message_iterator_initialize_method_status trimmer_msg_iter_init( bt_self_message_iterator *self_msg_iter, + bt_self_message_iterator_configuration *config, bt_self_component_filter *self_comp, bt_self_component_port_output *port) { - bt_component_class_message_iterator_init_method_status status; + bt_component_class_message_iterator_initialize_method_status status; bt_self_component_port_input_message_iterator_create_from_message_iterator_status msg_iter_status; struct trimmer_iterator *trimmer_it; trimmer_it = g_new0(struct trimmer_iterator, 1); if (!trimmer_it) { - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_MEMORY_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; } @@ -706,7 +736,7 @@ bt_component_class_message_iterator_init_method_status trimmer_msg_iter_init( trimmer_it->output_messages = g_queue_new(); if (!trimmer_it->output_messages) { - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_MEMORY_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; } @@ -714,14 +744,21 @@ bt_component_class_message_iterator_init_method_status trimmer_msg_iter_init( g_direct_equal, NULL, (GDestroyNotify) destroy_trimmer_iterator_stream_state); if (!trimmer_it->stream_states) { - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_MEMORY_ERROR; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; } + /* + * The trimmer requires upstream messages to have times, so it can + * always seek forward. + */ + bt_self_message_iterator_configuration_set_can_seek_forward( + config, BT_TRUE); + trimmer_it->self_msg_iter = self_msg_iter; bt_self_message_iterator_set_data(self_msg_iter, trimmer_it); - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD_STATUS_OK; + status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_INITIALIZE_METHOD_STATUS_OK; goto end; error: @@ -739,9 +776,9 @@ int get_msg_ns_from_origin(const bt_message *msg, int64_t *ns_from_origin, const bt_clock_snapshot *clock_snapshot = NULL; int ret = 0; - BT_ASSERT(msg); - BT_ASSERT(ns_from_origin); - BT_ASSERT(has_clock_snapshot); + BT_ASSERT_DBG(msg); + BT_ASSERT_DBG(ns_from_origin); + BT_ASSERT_DBG(has_clock_snapshot); switch (bt_message_get_type(msg)) { case BT_MESSAGE_TYPE_EVENT: @@ -949,7 +986,7 @@ state_set_trimmer_iterator_bounds( continue; } - BT_ASSERT(ns_from_origin != INT64_MIN && + BT_ASSERT_DBG(ns_from_origin != INT64_MIN && ns_from_origin != INT64_MAX); put_messages(msgs, count); goto found; @@ -1340,9 +1377,9 @@ struct trimmer_iterator_stream_state *get_stream_state_entry( { struct trimmer_iterator_stream_state *sstate; - BT_ASSERT(stream); + BT_ASSERT_DBG(stream); sstate = g_hash_table_lookup(trimmer_it->stream_states, stream); - BT_ASSERT(sstate); + BT_ASSERT_DBG(sstate); return sstate; } @@ -1391,7 +1428,7 @@ handle_message_with_stream( * class has a clock class. And we know it has, otherwise we * couldn't be using the trimmer component. */ - BT_ASSERT(ns_from_origin); + BT_ASSERT_DBG(ns_from_origin); if (G_UNLIKELY(!trimmer_it->end.is_infinite && *ns_from_origin > trimmer_it->end.ns_from_origin)) { @@ -1729,7 +1766,7 @@ void fill_message_array_from_output_messages( (*count)++; } - BT_ASSERT(*count > 0); + BT_ASSERT_DBG(*count > 0); } static inline @@ -1786,7 +1823,7 @@ state_trim(struct trimmer_iterator *trimmer_it, goto end; } - BT_ASSERT(my_count > 0); + BT_ASSERT_DBG(my_count > 0); for (i = 0; i < my_count; i++) { status = handle_message(trimmer_it, my_msgs[i], @@ -1829,7 +1866,7 @@ state_trim(struct trimmer_iterator *trimmer_it, * There's at least one message in the output message queue: * move the messages to the output message array. */ - BT_ASSERT(!g_queue_is_empty(trimmer_it->output_messages)); + BT_ASSERT_DBG(!g_queue_is_empty(trimmer_it->output_messages)); fill_message_array_from_output_messages(trimmer_it, msgs, capacity, count); @@ -1848,7 +1885,7 @@ bt_component_class_message_iterator_next_method_status trimmer_msg_iter_next( bt_component_class_message_iterator_next_method_status status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; - BT_ASSERT(trimmer_it); + BT_ASSERT_DBG(trimmer_it); if (G_LIKELY(trimmer_it->state == TRIMMER_ITERATOR_STATE_TRIM)) { status = state_trim(trimmer_it, msgs, capacity, count);