X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Futils%2Fcounter%2Fcounter.c;h=24cf37feec66d3ca5302201b4d917aa626978b21;hb=6b8362f328ff96232e16ae7272dc68c673890aa2;hp=6284438f1fe120d5866228d9946b05f4876d3fb4;hpb=d9c39b0a4ad9517178899334c0ca89fd20901609;p=babeltrace.git diff --git a/src/plugins/utils/counter/counter.c b/src/plugins/utils/counter/counter.c index 6284438f..24cf37fe 100644 --- a/src/plugins/utils/counter/counter.c +++ b/src/plugins/utils/counter/counter.c @@ -1,23 +1,7 @@ /* - * Copyright 2017 Philippe Proulx - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. + * SPDX-License-Identifier: MIT * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Copyright 2017 Philippe Proulx */ #define BT_COMP_LOG_SELF_COMP (counter->self_comp) @@ -30,7 +14,9 @@ #include "common/common.h" #include "common/assert.h" #include +#include #include +#include "plugins/common/param-validation/param-validation.h" #include "counter.h" @@ -112,13 +98,16 @@ void try_print_last(struct counter *counter) } } +static void destroy_private_counter_data(struct counter *counter) { - bt_self_component_port_input_message_iterator_put_ref(counter->msg_iter); - g_free(counter); + if (counter) { + bt_message_iterator_put_ref( + counter->msg_iter); + g_free(counter); + } } -BT_HIDDEN void counter_finalize(bt_self_component_sink *comp) { struct counter *counter; @@ -128,25 +117,33 @@ void counter_finalize(bt_self_component_sink *comp) bt_self_component_sink_as_self_component(comp)); BT_ASSERT(counter); try_print_last(counter); - bt_self_component_port_input_message_iterator_put_ref(counter->msg_iter); + bt_message_iterator_put_ref(counter->msg_iter); g_free(counter); } -BT_HIDDEN -bt_component_class_init_method_status counter_init( +static +struct bt_param_validation_map_value_entry_descr counter_params[] = { + { "step", BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_UNSIGNED_INTEGER } }, + { "hide-zero", BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } }, + BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_END +}; + +bt_component_class_initialize_method_status counter_init( bt_self_component_sink *component, + bt_self_component_sink_configuration *config __attribute__((unused)), const bt_value *params, - __attribute__((unused)) void *init_method_data) + void *init_method_data __attribute__((unused))) { - 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 counter *counter = g_new0(struct counter, 1); const bt_value *step = NULL; const bt_value *hide_zero = NULL; + enum bt_param_validation_status validation_status; + gchar *validate_error = NULL; if (!counter) { - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; } @@ -156,101 +153,93 @@ bt_component_class_init_method_status counter_init( bt_self_component_as_component(counter->self_comp)); add_port_status = bt_self_component_sink_add_input_port(component, "in", NULL, NULL); - switch (add_port_status) { - case BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR: - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; + if (add_port_status != BT_SELF_COMPONENT_ADD_PORT_STATUS_OK) { + status = (int) add_port_status; goto error; - case BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR: - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_MEMORY_ERROR; + } + + validation_status = bt_param_validation_validate(params, + counter_params, &validate_error); + if (validation_status == BT_PARAM_VALIDATION_STATUS_MEMORY_ERROR) { + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; + goto error; + } else if (validation_status == BT_PARAM_VALIDATION_STATUS_VALIDATION_ERROR) { + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; + BT_COMP_LOGE_APPEND_CAUSE(counter->self_comp, + "%s", validate_error); goto error; - default: - break; } counter->last_printed_total = -1ULL; counter->step = 10000; step = bt_value_map_borrow_entry_value_const(params, "step"); if (step) { - if (!bt_value_is_unsigned_integer(step)) { - BT_COMP_LOGE("`step` parameter: expecting an unsigned integer value: " - "type=%s", bt_common_value_type_string( - bt_value_get_type(step))); - goto error; - } - counter->step = bt_value_integer_unsigned_get(step); } hide_zero = bt_value_map_borrow_entry_value_const(params, "hide-zero"); if (hide_zero) { - if (!bt_value_is_bool(hide_zero)) { - BT_COMP_LOGE("`hide-zero` parameter: expecting a boolean value: " - "type=%s", bt_common_value_type_string( - bt_value_get_type(hide_zero))); - goto error; - } - counter->hide_zero = (bool) bt_value_bool_get(hide_zero); } bt_self_component_set_data( bt_self_component_sink_as_self_component(component), counter); + + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; goto end; error: destroy_private_counter_data(counter); - if (status == BT_COMPONENT_CLASS_INIT_METHOD_STATUS_OK) { - status = BT_COMPONENT_CLASS_INIT_METHOD_STATUS_ERROR; - } - end: + g_free(validate_error); return status; } -BT_HIDDEN bt_component_class_sink_graph_is_configured_method_status counter_graph_is_configured( bt_self_component_sink *comp) { - bt_component_class_sink_graph_is_configured_method_status status = - BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_OK; + bt_component_class_sink_graph_is_configured_method_status status; + bt_message_iterator_create_from_sink_component_status + msg_iter_status; struct counter *counter; - bt_self_component_port_input_message_iterator *iterator; + bt_message_iterator *iterator; counter = bt_self_component_get_data( bt_self_component_sink_as_self_component(comp)); BT_ASSERT(counter); - iterator = bt_self_component_port_input_message_iterator_create_from_sink_component( + + msg_iter_status = bt_message_iterator_create_from_sink_component( comp, bt_self_component_sink_borrow_input_port_by_name(comp, - in_port_name)); - if (!iterator) { - status = BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_MEMORY_ERROR; + in_port_name), &iterator); + if (msg_iter_status != BT_MESSAGE_ITERATOR_CREATE_FROM_SINK_COMPONENT_STATUS_OK) { + status = (int) msg_iter_status; goto end; } - BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_MOVE_REF( + BT_MESSAGE_ITERATOR_MOVE_REF( counter->msg_iter, iterator); + status = BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_OK; end: return status; } -BT_HIDDEN bt_component_class_sink_consume_method_status counter_consume( bt_self_component_sink *comp) { - bt_component_class_sink_consume_method_status status = - BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_OK; + bt_component_class_sink_consume_method_status status; struct counter *counter; bt_message_iterator_next_status next_status; uint64_t msg_count; bt_message_array_const msgs; + bt_self_component *self_comp = + bt_self_component_sink_as_self_component(comp); - counter = bt_self_component_get_data( - bt_self_component_sink_as_self_component(comp)); - BT_ASSERT(counter); + counter = bt_self_component_get_data(self_comp); + BT_ASSERT_DBG(counter); if (G_UNLIKELY(!counter->msg_iter)) { try_print_last(counter); @@ -259,12 +248,8 @@ bt_component_class_sink_consume_method_status counter_consume( } /* Consume messages */ - next_status = bt_self_component_port_input_message_iterator_next( + next_status = bt_message_iterator_next( counter->msg_iter, &msgs, &msg_count); - if (next_status < 0) { - status = (int) next_status; - goto end; - } switch (next_status) { case BT_MESSAGE_ITERATOR_NEXT_STATUS_OK: @@ -274,7 +259,7 @@ bt_component_class_sink_consume_method_status counter_consume( for (i = 0; i < msg_count; i++) { const bt_message *msg = msgs[i]; - BT_ASSERT(msg); + BT_ASSERT_DBG(msg); switch (bt_message_get_type(msg)) { case BT_MESSAGE_TYPE_EVENT: counter->count.event++; @@ -307,24 +292,22 @@ bt_component_class_sink_consume_method_status counter_consume( bt_message_put_ref(msg); } - status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_OK; + try_print_count(counter, msg_count); break; } - case BT_MESSAGE_ITERATOR_NEXT_STATUS_AGAIN: - status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_AGAIN; - goto end; case BT_MESSAGE_ITERATOR_NEXT_STATUS_END: try_print_last(counter); - status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_END; - goto end; + break; + case BT_MESSAGE_ITERATOR_NEXT_STATUS_ERROR: case BT_MESSAGE_ITERATOR_NEXT_STATUS_MEMORY_ERROR: - status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_MEMORY_ERROR; - goto end; + BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT(self_comp, + "Failed to get messages from upstream component"); + break; default: break; } - try_print_count(counter, msg_count); + status = (int) next_status; end: return status;