X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Ftext%2Fdetails%2Fdetails.c;h=ae389b25562778fd148c8ae55736c34559020b92;hb=818919b92b3dfe0834cec1c2e15d6ed6a41abb70;hp=3fcd466018f6ab668bbcd523000e40f1453e024d;hpb=55478183b5a100be028ed476718f0773ec7b4af5;p=babeltrace.git diff --git a/src/plugins/text/details/details.c b/src/plugins/text/details/details.c index 3fcd4660..ae389b25 100644 --- a/src/plugins/text/details/details.c +++ b/src/plugins/text/details/details.c @@ -1,27 +1,15 @@ /* - * Copyright 2019 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 2019 Philippe Proulx */ -#define BT_LOG_TAG "PLUGIN-TEXT-DETAILS-SINK" -#include "logging.h" +#define BT_COMP_LOG_SELF_COMP (details_comp->self_comp) +#define BT_LOG_OUTPUT_LEVEL (details_comp->log_level) +#define BT_LOG_TAG "PLUGIN/SINK.TEXT.DETAILS" +#include "logging/comp-logging.h" + +#include #include @@ -29,45 +17,18 @@ #include "common/assert.h" #include "details.h" #include "write.h" - -#define LOG_WRONG_PARAM_TYPE(_name, _value, _exp_type) \ - do { \ - BT_LOGE("Wrong `%s` parameter type: type=%s, " \ - "expected-type=%s", \ - (_name), bt_common_value_type_string( \ - bt_value_get_type(_value)), \ - bt_common_value_type_string(_exp_type)); \ - } while (0) - -static -const char * const in_port_name = "in"; - -static -const char * const color_param_name = "color"; - -static -const char * const with_metadata_param_name = "with-metadata"; - -static -const char * const with_time_param_name = "with-time"; - -static -const char * const with_trace_class_name_param_name = "with-trace-class-name"; - -static -const char * const with_trace_name_param_name = "with-trace-name"; - -static -const char * const with_stream_class_name_param_name = "with-stream-class-name"; - -static -const char * const with_stream_name_param_name = "with-stream-name"; - -static -const char * const with_uuid_param_name = "with-uuid"; - -static -const char * const compact_param_name = "compact"; +#include "plugins/common/param-validation/param-validation.h" + +#define IN_PORT_NAME "in" +#define COLOR_PARAM_NAME "color" +#define WITH_METADATA_PARAM_NAME "with-metadata" +#define WITH_DATA_PARAM_NAME "with-data" +#define WITH_TIME_PARAM_NAME "with-time" +#define WITH_TRACE_NAME_PARAM_NAME "with-trace-name" +#define WITH_STREAM_CLASS_NAME_PARAM_NAME "with-stream-class-name" +#define WITH_STREAM_NAME_PARAM_NAME "with-stream-name" +#define WITH_UUID_PARAM_NAME "with-uuid" +#define COMPACT_PARAM_NAME "compact" BT_HIDDEN void details_destroy_details_trace_class_meta( @@ -137,9 +98,11 @@ void destroy_details_comp(struct details_comp *details_comp) if (details_tc_meta->tc_destruction_listener_id != UINT64_C(-1)) { - bt_trace_class_remove_destruction_listener( - (const void *) key, - details_tc_meta->tc_destruction_listener_id); + if (bt_trace_class_remove_destruction_listener( + (const void *) key, + details_tc_meta->tc_destruction_listener_id)) { + bt_current_thread_clear_error(); + } } } @@ -158,9 +121,11 @@ void destroy_details_comp(struct details_comp *details_comp) while (g_hash_table_iter_next(&iter, &key, &value)) { struct details_trace *details_trace = value; - bt_trace_remove_destruction_listener( - (const void *) key, - details_trace->trace_destruction_listener_id); + if (bt_trace_remove_destruction_listener( + (const void *) key, + details_trace->trace_destruction_listener_id)) { + bt_current_thread_clear_error(); + } } g_hash_table_destroy(details_comp->traces); @@ -172,7 +137,7 @@ void destroy_details_comp(struct details_comp *details_comp) details_comp->str = NULL; } - BT_SELF_COMPONENT_PORT_INPUT_MESSAGE_ITERATOR_PUT_REF_AND_RESET( + BT_MESSAGE_ITERATOR_PUT_REF_AND_RESET( details_comp->msg_iter); g_free(details_comp); @@ -181,14 +146,20 @@ end: } static -struct details_comp *create_details_comp(void) +struct details_comp *create_details_comp( + bt_self_component_sink *self_comp_sink) { struct details_comp *details_comp = g_new0(struct details_comp, 1); + bt_self_component *self_comp = + bt_self_component_sink_as_self_component(self_comp_sink); if (!details_comp) { goto error; } + details_comp->log_level = bt_component_get_logging_level( + bt_self_component_as_component(self_comp)); + details_comp->self_comp = self_comp; details_comp->meta = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) details_destroy_details_trace_class_meta); @@ -230,48 +201,63 @@ void details_finalize(bt_self_component_sink *comp) } static -int configure_bool_opt(struct details_comp *details_comp, +void configure_bool_opt(struct details_comp *details_comp, const bt_value *params, const char *param_name, bool default_value, bool *opt_value) { - int ret = 0; const bt_value *value; *opt_value = default_value; value = bt_value_map_borrow_entry_value_const(params, param_name); if (value) { - if (!bt_value_is_bool(value)) { - LOG_WRONG_PARAM_TYPE(param_name, value, - BT_VALUE_TYPE_BOOL); - ret = -1; - goto end; - } - *opt_value = (bool) bt_value_bool_get(value); } - -end: - return ret; } +static const char *color_choices[] = { "never", "auto", "always", NULL }; + +static const struct bt_param_validation_map_value_entry_descr details_params[] = { + { COLOR_PARAM_NAME, BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { BT_VALUE_TYPE_STRING, .string = { + .choices = color_choices, + } } }, + { WITH_METADATA_PARAM_NAME, BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } }, + { WITH_DATA_PARAM_NAME, BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } }, + { COMPACT_PARAM_NAME, BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } }, + { WITH_TIME_PARAM_NAME, BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } }, + { WITH_TRACE_NAME_PARAM_NAME, BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } }, + { WITH_STREAM_CLASS_NAME_PARAM_NAME, BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } }, + { WITH_STREAM_NAME_PARAM_NAME, BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } }, + { WITH_UUID_PARAM_NAME, BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_OPTIONAL, { .type = BT_VALUE_TYPE_BOOL } }, + BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_END +}; + static -int configure_details_comp(struct details_comp *details_comp, +bt_component_class_initialize_method_status configure_details_comp( + struct details_comp *details_comp, const bt_value *params) { - int ret = 0; + bt_component_class_initialize_method_status status; const bt_value *value; const char *str; + enum bt_param_validation_status validation_status; + gchar *validate_error = NULL; + + validation_status = bt_param_validation_validate(params, + details_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(details_comp->self_comp, + "%s", validate_error); + goto end; + } /* Colorize output? */ details_comp->cfg.with_color = bt_common_colors_supported(); - value = bt_value_map_borrow_entry_value_const(params, color_param_name); + value = bt_value_map_borrow_entry_value_const(params, COLOR_PARAM_NAME); if (value) { - if (!bt_value_is_string(value)) { - LOG_WRONG_PARAM_TYPE(color_param_name, value, - BT_VALUE_TYPE_STRING); - goto error; - } - str = bt_value_string_get(value); if (strcmp(str, "never") == 0) { @@ -279,127 +265,102 @@ int configure_details_comp(struct details_comp *details_comp, } else if (strcmp(str, "auto") == 0) { details_comp->cfg.with_color = bt_common_colors_supported(); - } else if (strcmp(str, "always") == 0) { - details_comp->cfg.with_color = true; } else { - BT_LOGE("Invalid `%s` parameter: unknown value " - "(expecting `never`, `auto`, or `always`): " - "value=\"%s\"", color_param_name, str); - goto error; + BT_ASSERT(strcmp(str, "always") == 0); + + details_comp->cfg.with_color = true; } } /* With metadata objects? */ - ret = configure_bool_opt(details_comp, params, with_metadata_param_name, + configure_bool_opt(details_comp, params, WITH_METADATA_PARAM_NAME, true, &details_comp->cfg.with_meta); - if (ret) { - goto error; - } + + /* With data objects? */ + configure_bool_opt(details_comp, params, WITH_DATA_PARAM_NAME, + true, &details_comp->cfg.with_data); /* Compact? */ - ret = configure_bool_opt(details_comp, params, compact_param_name, + configure_bool_opt(details_comp, params, COMPACT_PARAM_NAME, false, &details_comp->cfg.compact); - if (ret) { - goto error; - } /* With time? */ - ret = configure_bool_opt(details_comp, params, with_time_param_name, + configure_bool_opt(details_comp, params, WITH_TIME_PARAM_NAME, true, &details_comp->cfg.with_time); - if (ret) { - goto error; - } - - /* With trace class name? */ - ret = configure_bool_opt(details_comp, params, - with_trace_class_name_param_name, - true, &details_comp->cfg.with_trace_class_name); - if (ret) { - goto error; - } /* With trace name? */ - ret = configure_bool_opt(details_comp, params, - with_trace_name_param_name, + configure_bool_opt(details_comp, params, + WITH_TRACE_NAME_PARAM_NAME, true, &details_comp->cfg.with_trace_name); - if (ret) { - goto error; - } /* With stream class name? */ - ret = configure_bool_opt(details_comp, params, - with_stream_class_name_param_name, + configure_bool_opt(details_comp, params, + WITH_STREAM_CLASS_NAME_PARAM_NAME, true, &details_comp->cfg.with_stream_class_name); - if (ret) { - goto error; - } /* With stream name? */ - ret = configure_bool_opt(details_comp, params, - with_stream_name_param_name, + configure_bool_opt(details_comp, params, + WITH_STREAM_NAME_PARAM_NAME, true, &details_comp->cfg.with_stream_name); - if (ret) { - goto error; - } /* With UUID? */ - ret = configure_bool_opt(details_comp, params, - with_uuid_param_name, true, &details_comp->cfg.with_uuid); - if (ret) { - goto error; - } + configure_bool_opt(details_comp, params, + WITH_UUID_PARAM_NAME, true, &details_comp->cfg.with_uuid); + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; goto end; -error: - ret = -1; - end: - return ret; + g_free(validate_error); + + return status; } static void log_configuration(bt_self_component_sink *comp, struct details_comp *details_comp) { - BT_LOGI("Configuration for `sink.text.details` component `%s`:", + BT_COMP_LOGI("Configuration for `sink.text.details` component `%s`:", bt_component_get_name(bt_self_component_as_component( bt_self_component_sink_as_self_component(comp)))); - BT_LOGI(" Colorize output: %d", details_comp->cfg.with_color); - BT_LOGI(" Compact: %d", details_comp->cfg.compact); - BT_LOGI(" With metadata: %d", details_comp->cfg.with_meta); - BT_LOGI(" With time: %d", details_comp->cfg.with_time); - BT_LOGI(" With trace class name: %d", - details_comp->cfg.with_trace_class_name); - BT_LOGI(" With trace name: %d", details_comp->cfg.with_trace_name); - BT_LOGI(" With stream class name: %d", + BT_COMP_LOGI(" Colorize output: %d", details_comp->cfg.with_color); + BT_COMP_LOGI(" Compact: %d", details_comp->cfg.compact); + BT_COMP_LOGI(" With metadata: %d", details_comp->cfg.with_meta); + BT_COMP_LOGI(" With time: %d", details_comp->cfg.with_time); + BT_COMP_LOGI(" With trace name: %d", details_comp->cfg.with_trace_name); + BT_COMP_LOGI(" With stream class name: %d", details_comp->cfg.with_stream_class_name); - BT_LOGI(" With stream name: %d", details_comp->cfg.with_stream_name); - BT_LOGI(" With UUID: %d", details_comp->cfg.with_uuid); + BT_COMP_LOGI(" With stream name: %d", details_comp->cfg.with_stream_name); + BT_COMP_LOGI(" With UUID: %d", details_comp->cfg.with_uuid); } BT_HIDDEN -bt_self_component_status details_init(bt_self_component_sink *comp, +bt_component_class_initialize_method_status details_init( + bt_self_component_sink *comp, + bt_self_component_sink_configuration *config, const bt_value *params, __attribute__((unused)) void *init_method_data) { - bt_self_component_status status = BT_SELF_COMPONENT_STATUS_OK; + bt_component_class_initialize_method_status status = + BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; + bt_self_component_add_port_status add_port_status; struct details_comp *details_comp = NULL; - status = bt_self_component_sink_add_input_port(comp, in_port_name, - NULL, NULL); - if (status != BT_SELF_COMPONENT_STATUS_OK) { + add_port_status = bt_self_component_sink_add_input_port(comp, + IN_PORT_NAME, NULL, NULL); + if (add_port_status != BT_SELF_COMPONENT_ADD_PORT_STATUS_OK) { + status = (int) add_port_status; goto error; } - details_comp = create_details_comp(); + details_comp = create_details_comp(comp); if (!details_comp) { - status = BT_SELF_COMPONENT_STATUS_NOMEM; + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; } if (configure_details_comp(details_comp, params)) { - BT_LOGE_STR("Failed to configure component."); + BT_COMP_LOGE_STR("Failed to configure component."); goto error; } @@ -409,8 +370,8 @@ bt_self_component_status details_init(bt_self_component_sink *comp, goto end; error: - if (status == BT_SELF_COMPONENT_STATUS_OK) { - status = BT_SELF_COMPONENT_STATUS_ERROR; + if (status == BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK) { + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; } destroy_details_comp(details_comp); @@ -420,11 +381,13 @@ end: } BT_HIDDEN -bt_self_component_status details_graph_is_configured( - bt_self_component_sink *comp) +bt_component_class_sink_graph_is_configured_method_status +details_graph_is_configured(bt_self_component_sink *comp) { - bt_self_component_status status = BT_SELF_COMPONENT_STATUS_OK; - bt_self_component_port_input_message_iterator *iterator; + bt_component_class_sink_graph_is_configured_method_status status; + bt_message_iterator_create_from_sink_component_status + msg_iter_status; + bt_message_iterator *iterator; struct details_comp *details_comp; bt_self_component_port_input *in_port; @@ -432,94 +395,83 @@ bt_self_component_status details_graph_is_configured( bt_self_component_sink_as_self_component(comp)); BT_ASSERT(details_comp); in_port = bt_self_component_sink_borrow_input_port_by_name(comp, - in_port_name); + IN_PORT_NAME); if (!bt_port_is_connected(bt_port_input_as_port_const( bt_self_component_port_input_as_port_input(in_port)))) { - BT_LOGE("Single input port is not connected: " - "port-name=\"%s\"", in_port_name); - status = BT_SELF_COMPONENT_STATUS_ERROR; + BT_COMP_LOGE("Single input port is not connected: " + "port-name=\"%s\"", IN_PORT_NAME); + status = BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_ERROR; goto end; } - iterator = bt_self_component_port_input_message_iterator_create( - bt_self_component_sink_borrow_input_port_by_name(comp, - in_port_name)); - if (!iterator) { - status = BT_SELF_COMPONENT_STATUS_NOMEM; + msg_iter_status = bt_message_iterator_create_from_sink_component( + comp, bt_self_component_sink_borrow_input_port_by_name(comp, + 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( details_comp->msg_iter, iterator); + status = BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_OK; + end: return status; } BT_HIDDEN -bt_self_component_status details_consume(bt_self_component_sink *comp) +bt_component_class_sink_consume_method_status +details_consume(bt_self_component_sink *comp) { - bt_self_component_status ret = BT_SELF_COMPONENT_STATUS_OK; + bt_component_class_sink_consume_method_status status; bt_message_array_const msgs; uint64_t count; struct details_comp *details_comp; - bt_message_iterator_status it_ret; + bt_message_iterator_next_status next_status; uint64_t i; details_comp = bt_self_component_get_data( bt_self_component_sink_as_self_component(comp)); - BT_ASSERT(details_comp); - BT_ASSERT(details_comp->msg_iter); + BT_ASSERT_DBG(details_comp); + BT_ASSERT_DBG(details_comp->msg_iter); /* Consume messages */ - it_ret = bt_self_component_port_input_message_iterator_next( + next_status = bt_message_iterator_next( details_comp->msg_iter, &msgs, &count); - switch (it_ret) { - case BT_MESSAGE_ITERATOR_STATUS_OK: - ret = BT_SELF_COMPONENT_STATUS_OK; - - for (i = 0; i < count; i++) { - int print_ret = details_write_message(details_comp, - msgs[i]); - - if (print_ret) { - for (; i < count; i++) { - /* Put all remaining messages */ - bt_message_put_ref(msgs[i]); - } + if (next_status != BT_MESSAGE_ITERATOR_NEXT_STATUS_OK) { + status = (int) next_status; + goto end; + } - ret = BT_SELF_COMPONENT_STATUS_ERROR; - goto end; - } + for (i = 0; i < count; i++) { + int print_ret = details_write_message(details_comp, + msgs[i]); - /* Print output buffer to standard output and flush */ - if (details_comp->str->len > 0) { - printf("%s", details_comp->str->str); - fflush(stdout); - details_comp->printed_something = true; + if (print_ret) { + for (; i < count; i++) { + /* Put all remaining messages */ + bt_message_put_ref(msgs[i]); } - /* Put this message */ - bt_message_put_ref(msgs[i]); + status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_ERROR; + goto end; } - break; - case BT_MESSAGE_ITERATOR_STATUS_AGAIN: - ret = BT_SELF_COMPONENT_STATUS_AGAIN; - goto end; - case BT_MESSAGE_ITERATOR_STATUS_END: - ret = BT_SELF_COMPONENT_STATUS_END; - goto end; - case BT_MESSAGE_ITERATOR_STATUS_ERROR: - ret = BT_SELF_COMPONENT_STATUS_ERROR; - goto end; - case BT_MESSAGE_ITERATOR_STATUS_NOMEM: - ret = BT_SELF_COMPONENT_STATUS_NOMEM; - goto end; - default: - abort(); + /* Print output buffer to standard output and flush */ + if (details_comp->str->len > 0) { + printf("%s", details_comp->str->str); + fflush(stdout); + details_comp->printed_something = true; + } + + /* Put this message */ + bt_message_put_ref(msgs[i]); } + status = BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_OK; + end: - return ret; + return status; }