X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Ftext%2Fdmesg%2Fdmesg.c;h=d23e31bec5cd0b69b5b1079aae0b81a25417214b;hb=ecd7492f21a492b70569d5ecc1d3a808241b63f0;hp=65718d326b0f5e75eb9dd13f72087bdecaad4cbc;hpb=a3f0c7db90f4cfc81090a83a7442b7bc624d5789;p=babeltrace.git diff --git a/src/plugins/text/dmesg/dmesg.c b/src/plugins/text/dmesg/dmesg.c index 65718d32..d23e31be 100644 --- a/src/plugins/text/dmesg/dmesg.c +++ b/src/plugins/text/dmesg/dmesg.c @@ -1,24 +1,8 @@ /* + * SPDX-License-Identifier: MIT + * * Copyright 2010-2011 EfficiOS Inc. and Linux Foundation * 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. - * - * 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. */ #define BT_COMP_LOG_SELF_COMP (dmesg_comp->self_comp) @@ -92,25 +76,28 @@ bt_field_class *create_event_payload_fc(struct dmesg_component *dmesg_comp, { bt_field_class *root_fc = NULL; bt_field_class *fc = NULL; - int ret; + bt_field_class_structure_append_member_status append_member_status; root_fc = bt_field_class_structure_create(trace_class); if (!root_fc) { - BT_COMP_LOGE_STR("Cannot create an empty structure field class object."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create an empty structure field class object."); goto error; } fc = bt_field_class_string_create(trace_class); if (!fc) { - BT_COMP_LOGE_STR("Cannot create a string field class object."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create a string field class object."); goto error; } - ret = bt_field_class_structure_append_member(root_fc, + append_member_status = bt_field_class_structure_append_member(root_fc, "str", fc); - if (ret) { - BT_COMP_LOGE("Cannot add `str` member to structure field class: " - "ret=%d", ret); + if (append_member_status != BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) { + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot add `str` member to structure field class: ret=%d", + append_member_status); goto error; } @@ -132,14 +119,16 @@ int create_meta(struct dmesg_component *dmesg_comp, bool has_ts) dmesg_comp->trace_class = bt_trace_class_create(dmesg_comp->self_comp); if (!dmesg_comp->trace_class) { - BT_COMP_LOGE_STR("Cannot create an empty trace class object."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create an empty trace class object."); goto error; } dmesg_comp->stream_class = bt_stream_class_create( dmesg_comp->trace_class); if (!dmesg_comp->stream_class) { - BT_COMP_LOGE_STR("Cannot create a stream class object."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create a stream class object."); goto error; } @@ -147,7 +136,8 @@ int create_meta(struct dmesg_component *dmesg_comp, bool has_ts) dmesg_comp->clock_class = bt_clock_class_create( dmesg_comp->self_comp); if (!dmesg_comp->clock_class) { - BT_COMP_LOGE_STR("Cannot create clock class."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create clock class."); goto error; } @@ -161,7 +151,8 @@ int create_meta(struct dmesg_component *dmesg_comp, bool has_ts) ret = bt_stream_class_set_default_clock_class( dmesg_comp->stream_class, dmesg_comp->clock_class); if (ret) { - BT_COMP_LOGE_STR("Cannot set stream class's default clock class."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot set stream class's default clock class."); goto error; } } @@ -169,25 +160,29 @@ int create_meta(struct dmesg_component *dmesg_comp, bool has_ts) dmesg_comp->event_class = bt_event_class_create( dmesg_comp->stream_class); if (!dmesg_comp->event_class) { - BT_COMP_LOGE_STR("Cannot create an event class object."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create an event class object."); goto error; } ret = bt_event_class_set_name(dmesg_comp->event_class, "string"); if (ret) { - BT_COMP_LOGE_STR("Cannot set event class's name."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot set event class's name."); goto error; } fc = create_event_payload_fc(dmesg_comp, dmesg_comp->trace_class); if (!fc) { - BT_COMP_LOGE_STR("Cannot create event payload field class."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create event payload field class."); goto error; } ret = bt_event_class_set_payload_field_class(dmesg_comp->event_class, fc); if (ret) { - BT_COMP_LOGE_STR("Cannot set event class's event payload field class."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot set event class's event payload field class."); goto error; } @@ -263,7 +258,8 @@ int create_stream_and_trace(struct dmesg_component *dmesg_comp) dmesg_comp->trace = bt_trace_create(dmesg_comp->trace_class); if (!dmesg_comp->trace) { - BT_COMP_LOGE_STR("Cannot create trace object."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create trace object."); goto error; } @@ -282,7 +278,8 @@ int create_stream_and_trace(struct dmesg_component *dmesg_comp) if (trace_name) { ret = bt_trace_set_name(dmesg_comp->trace, trace_name); if (ret) { - BT_COMP_LOGE("Cannot set trace's name: name=\"%s\"", + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot set trace's name: name=\"%s\"", trace_name); goto error; } @@ -291,7 +288,8 @@ int create_stream_and_trace(struct dmesg_component *dmesg_comp) dmesg_comp->stream = bt_stream_create(dmesg_comp->stream_class, dmesg_comp->trace); if (!dmesg_comp->stream) { - BT_COMP_LOGE_STR("Cannot create stream object."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create stream object."); goto error; } @@ -318,15 +316,17 @@ int try_create_meta_stream(struct dmesg_component *dmesg_comp, bool has_ts) ret = create_meta(dmesg_comp, has_ts); if (ret) { - BT_COMP_LOGE("Cannot create metadata objects: dmesg-comp-addr=%p", + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create metadata objects: dmesg-comp-addr=%p", dmesg_comp); goto error; } ret = create_stream_and_trace(dmesg_comp); if (ret) { - BT_COMP_LOGE("Cannot create stream object: " - "dmesg-comp-addr=%p", dmesg_comp); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create stream object: dmesg-comp-addr=%p", + dmesg_comp); goto error; } @@ -359,37 +359,11 @@ void destroy_dmesg_component(struct dmesg_component *dmesg_comp) g_free(dmesg_comp); } -static -bt_component_class_initialize_method_status create_port( - bt_self_component_source *self_comp) -{ - bt_component_class_initialize_method_status status; - bt_self_component_add_port_status add_port_status; - - add_port_status = bt_self_component_source_add_output_port(self_comp, - "out", NULL, NULL); - switch (add_port_status) { - case BT_SELF_COMPONENT_ADD_PORT_STATUS_OK: - status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; - break; - case BT_SELF_COMPONENT_ADD_PORT_STATUS_ERROR: - status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; - break; - case BT_SELF_COMPONENT_ADD_PORT_STATUS_MEMORY_ERROR: - status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; - break; - default: - bt_common_abort(); - } - - return status; -} - -BT_HIDDEN bt_component_class_initialize_method_status dmesg_init( bt_self_component_source *self_comp_src, - bt_self_component_source_configuration *config, - const bt_value *params, void *init_method_data) + bt_self_component_source_configuration *config __attribute__((unused)), + const bt_value *params, + void *init_method_data __attribute__((unused))) { struct dmesg_component *dmesg_comp = g_new0(struct dmesg_component, 1); bt_component_class_initialize_method_status status; @@ -397,12 +371,18 @@ bt_component_class_initialize_method_status dmesg_init( bt_self_component_source_as_self_component(self_comp_src); const bt_component *comp = bt_self_component_as_component(self_comp); bt_logging_level log_level = bt_component_get_logging_level(comp); + bt_self_component_add_port_status add_port_status; if (!dmesg_comp) { - /* Implicit log level is not available here */ + /* + * Don't use BT_COMP_LOGE_APPEND_CAUSE, as `dmesg_comp` is not + * initialized. + */ BT_COMP_LOG_CUR_LVL(BT_LOG_ERROR, log_level, self_comp, "Failed to allocate one dmesg component structure."); - status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; + BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_FROM_COMPONENT(self_comp, + "Failed to allocate one dmesg component structure."); + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; } @@ -411,14 +391,15 @@ bt_component_class_initialize_method_status dmesg_init( dmesg_comp->self_comp_src = self_comp_src; dmesg_comp->params.path = g_string_new(NULL); if (!dmesg_comp->params.path) { - BT_COMP_LOGE_STR("Failed to allocate a GString."); - status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; + BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Failed to allocate a GString."); + status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; } status = handle_params(dmesg_comp, params); if (status != BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK) { - BT_COMP_LOGE("Invalid parameters: comp-addr=%p", self_comp); + BT_COMP_LOGE_APPEND_CAUSE(self_comp, + "Invalid parameters: comp-addr=%p", self_comp); status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; goto error; } @@ -426,15 +407,19 @@ bt_component_class_initialize_method_status dmesg_init( if (!dmesg_comp->params.read_from_stdin && !g_file_test(dmesg_comp->params.path->str, G_FILE_TEST_IS_REGULAR)) { - BT_COMP_LOGE("Input path is not a regular file: " + BT_COMP_LOGE_APPEND_CAUSE(self_comp, + "Input path is not a regular file: " "comp-addr=%p, path=\"%s\"", self_comp, dmesg_comp->params.path->str); status = BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_ERROR; goto error; } - status = create_port(self_comp_src); - if (status != BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK) { + add_port_status = bt_self_component_source_add_output_port( + self_comp_src, "out", NULL, NULL); + if (add_port_status != BT_SELF_COMPONENT_ADD_PORT_STATUS_OK) { + BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Failed to add output port."); + status = (int) add_port_status; goto error; } @@ -452,7 +437,6 @@ end: return status; } -BT_HIDDEN void dmesg_finalize(bt_self_component_source *self_comp) { destroy_dmesg_component(bt_self_component_get_data( @@ -546,7 +530,8 @@ skip_ts: } if (!msg) { - BT_COMP_LOGE_STR("Cannot create event message."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create event message."); goto error; } @@ -575,7 +560,8 @@ int fill_event_payload_from_line(struct dmesg_component *dmesg_comp, str_field = bt_field_structure_borrow_member_field_by_index( ep_field, 0); if (!str_field) { - BT_COMP_LOGE_STR("Cannot borrow `timestamp` field from event payload structure field."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot borrow `timestamp` field from event payload structure field."); goto error; } @@ -588,8 +574,8 @@ int fill_event_payload_from_line(struct dmesg_component *dmesg_comp, bt_field_string_clear(str_field); ret = bt_field_string_append_with_length(str_field, line, len); if (ret) { - BT_COMP_LOGE("Cannot append value to string field object: " - "len=%zu", len); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot append value to string field object: len=%zu", len); goto error; } @@ -615,7 +601,8 @@ bt_message *create_msg_from_line( msg = create_init_event_msg_from_line(dmesg_msg_iter, line, &new_start); if (!msg) { - BT_COMP_LOGE_STR("Cannot create and initialize event message from line."); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create and initialize event message from line."); goto error; } @@ -623,8 +610,8 @@ bt_message *create_msg_from_line( BT_ASSERT_DBG(event); ret = fill_event_payload_from_line(dmesg_comp, new_start, event); if (ret) { - BT_COMP_LOGE("Cannot fill event payload field from line: " - "ret=%d", ret); + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot fill event payload field from line: ret=%d", ret); goto error; } @@ -650,7 +637,8 @@ void destroy_dmesg_msg_iter(struct dmesg_msg_iter *dmesg_msg_iter) if (dmesg_msg_iter->fp && dmesg_msg_iter->fp != stdin) { if (fclose(dmesg_msg_iter->fp)) { - BT_COMP_LOGE_ERRNO("Cannot close input file", "."); + BT_COMP_LOGE_APPEND_CAUSE_ERRNO(dmesg_comp->self_comp, + "Cannot close input file", "."); } } @@ -661,21 +649,22 @@ void destroy_dmesg_msg_iter(struct dmesg_msg_iter *dmesg_msg_iter) -BT_HIDDEN bt_message_iterator_class_initialize_method_status dmesg_msg_iter_init( bt_self_message_iterator *self_msg_iter, - bt_self_message_iterator_configuration *config, - bt_self_component *self_comp, - bt_self_component_port_output *self_port) + bt_self_message_iterator_configuration *config __attribute__((unused)), + bt_self_component_port_output *self_port __attribute__((unused))) { + bt_self_component *self_comp = + bt_self_message_iterator_borrow_component(self_msg_iter); struct dmesg_component *dmesg_comp = bt_self_component_get_data(self_comp); struct dmesg_msg_iter *dmesg_msg_iter = g_new0(struct dmesg_msg_iter, 1); - bt_message_iterator_class_initialize_method_status status = - BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_OK; + bt_message_iterator_class_initialize_method_status status; if (!dmesg_msg_iter) { - BT_COMP_LOGE_STR("Failed to allocate on dmesg message iterator structure."); + BT_COMP_LOGE_APPEND_CAUSE(self_comp, + "Failed to allocate on dmesg message iterator structure."); + status = BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR; goto error; } @@ -688,28 +677,28 @@ bt_message_iterator_class_initialize_method_status dmesg_msg_iter_init( } else { dmesg_msg_iter->fp = fopen(dmesg_comp->params.path->str, "r"); if (!dmesg_msg_iter->fp) { - BT_COMP_LOGE_ERRNO("Cannot open input file in read mode", ": path=\"%s\"", + BT_COMP_LOGE_APPEND_CAUSE_ERRNO(self_comp, + "Cannot open input file in read mode", ": path=\"%s\"", dmesg_comp->params.path->str); + status = BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR; goto error; } } bt_self_message_iterator_set_data(self_msg_iter, dmesg_msg_iter); + + status = BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_OK; goto end; error: destroy_dmesg_msg_iter(dmesg_msg_iter); bt_self_message_iterator_set_data(self_msg_iter, NULL); - if (status >= 0) { - status = BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR; - } end: return status; } -BT_HIDDEN void dmesg_msg_iter_finalize( bt_self_message_iterator *priv_msg_iter) { @@ -724,8 +713,7 @@ bt_message_iterator_class_next_method_status dmesg_msg_iter_next_one( { ssize_t len; struct dmesg_component *dmesg_comp; - bt_message_iterator_class_next_method_status status = - BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_OK; + bt_message_iterator_class_next_method_status status; BT_ASSERT_DBG(dmesg_msg_iter); dmesg_comp = dmesg_msg_iter->dmesg_comp; @@ -750,8 +738,10 @@ bt_message_iterator_class_next_method_status dmesg_msg_iter_next_one( if (len < 0) { if (errno == EINVAL) { status = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR; + goto end; } else if (errno == ENOMEM) { status = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_MEMORY_ERROR; + goto end; } else { if (dmesg_msg_iter->state == STATE_EMIT_STREAM_BEGINNING) { /* Stream did not even begin */ @@ -764,15 +754,13 @@ bt_message_iterator_class_next_method_status dmesg_msg_iter_next_one( goto handle_state; } } - - goto end; } BT_ASSERT_DBG(dmesg_msg_iter->linebuf); /* Ignore empty lines, once trimmed */ for (ch = dmesg_msg_iter->linebuf; *ch != '\0'; ch++) { - if (!isspace(*ch)) { + if (!isspace((unsigned char) *ch)) { only_spaces = false; break; } @@ -786,9 +774,11 @@ bt_message_iterator_class_next_method_status dmesg_msg_iter_next_one( dmesg_msg_iter->tmp_event_msg = create_msg_from_line( dmesg_msg_iter, dmesg_msg_iter->linebuf); if (!dmesg_msg_iter->tmp_event_msg) { - BT_COMP_LOGE("Cannot create event message from line: " + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create event message from line: " "dmesg-comp-addr=%p, line=\"%s\"", dmesg_comp, dmesg_msg_iter->linebuf); + status = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR; goto end; } @@ -817,16 +807,19 @@ handle_state: } if (!*msg) { - BT_COMP_LOGE("Cannot create message: dmesg-comp-addr=%p", + BT_COMP_LOGE_APPEND_CAUSE(dmesg_comp->self_comp, + "Cannot create message: dmesg-comp-addr=%p", dmesg_comp); status = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR; + goto end; } + status = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_OK; + end: return status; } -BT_HIDDEN bt_message_iterator_class_next_method_status dmesg_msg_iter_next( bt_self_message_iterator *self_msg_iter, bt_message_array_const msgs, uint64_t capacity, @@ -871,7 +864,6 @@ bt_message_iterator_class_next_method_status dmesg_msg_iter_next( return status; } -BT_HIDDEN bt_message_iterator_class_can_seek_beginning_method_status dmesg_msg_iter_can_seek_beginning( bt_self_message_iterator *self_msg_iter, bt_bool *can_seek) @@ -885,7 +877,6 @@ dmesg_msg_iter_can_seek_beginning( return BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_OK; } -BT_HIDDEN bt_message_iterator_class_seek_beginning_method_status dmesg_msg_iter_seek_beginning( bt_self_message_iterator *self_msg_iter)