X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Ferror.c;h=77064005dc3ddfcc24e3ac1b6830635bbb0a8591;hb=HEAD;hp=65638b9394436d0e93c2a632f214b20c646cba19;hpb=9a2c8b8e0cb6579066b4b8ceb8255cdd5175bb2d;p=babeltrace.git diff --git a/src/lib/error.c b/src/lib/error.c index 65638b93..77064005 100644 --- a/src/lib/error.c +++ b/src/lib/error.c @@ -1,23 +1,7 @@ /* - * Copyright (c) 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 (c) 2019 Philippe Proulx */ #define BT_LOG_TAG "LIB/ERROR" @@ -28,15 +12,17 @@ #include #include "error.h" -#include "graph/message/iterator.h" #include "graph/component.h" #include "graph/component-class.h" +#include "graph/iterator.h" #include "common/assert.h" -#include "lib/assert-pre.h" +#include "common/common.h" +#include "lib/assert-cond.h" #include "lib/func-status.h" -#define BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(_cause, _exp_type) \ - BT_ASSERT_PRE(((const struct bt_error_cause *) (_cause))->actor_type == _exp_type, \ +#define BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(_cause, _exp_type_name, _exp_type) \ + BT_ASSERT_PRE("error-cause-has-" _exp_type_name "-actor", \ + ((const struct bt_error_cause *) (_cause))->actor_type == _exp_type, \ "Unexpected error cause's actor type: type=%s, exp-type=%s", \ bt_error_cause_actor_type_string(((const struct bt_error_cause *) (_cause))->actor_type), \ bt_error_cause_actor_type_string(_exp_type)) @@ -170,8 +156,6 @@ int init_error_cause(struct bt_error_cause *cause, goto end; } - BT_LIB_LOGD("Initialized error cause: %!+r", cause); - end: return ret; } @@ -315,8 +299,10 @@ struct bt_error_cause_component_actor *create_error_cause_component_actor( goto end; error: - destroy_error_cause(&cause->base); - cause = NULL; + if (cause) { + destroy_error_cause(&cause->base); + cause = NULL; + } end: return cause; @@ -356,8 +342,10 @@ create_error_cause_component_class_actor(struct bt_component_class *comp_cls, goto end; error: - destroy_error_cause(&cause->base); - cause = NULL; + if (cause) { + destroy_error_cause(&cause->base); + cause = NULL; + } end: return cause; @@ -422,14 +410,15 @@ create_error_cause_message_iterator_actor(struct bt_message_iterator *iter, goto end; error: - destroy_error_cause(&cause->base); - cause = NULL; + if (cause) { + destroy_error_cause(&cause->base); + cause = NULL; + } end: return cause; } -BT_HIDDEN struct bt_error *bt_error_create(void) { struct bt_error *error; @@ -459,7 +448,6 @@ end: return error; } -BT_HIDDEN void bt_error_destroy(struct bt_error *error) { if (!error) { @@ -477,7 +465,6 @@ end: return; } -BT_HIDDEN int bt_error_append_cause_from_unknown(struct bt_error *error, const char *module_name, const char *file_name, uint64_t line_no, const char *msg_fmt, va_list args) @@ -505,11 +492,9 @@ int bt_error_append_cause_from_unknown(struct bt_error *error, cause = NULL; end: - destroy_error_cause(cause); return status; } -BT_HIDDEN int bt_error_append_cause_from_component( struct bt_error *error, bt_self_component *self_comp, const char *file_name, uint64_t line_no, @@ -538,11 +523,9 @@ int bt_error_append_cause_from_component( cause = NULL; end: - destroy_error_cause(&cause->base); return status; } -BT_HIDDEN int bt_error_append_cause_from_component_class( struct bt_error *error, bt_self_component_class *self_comp_class, @@ -572,11 +555,9 @@ int bt_error_append_cause_from_component_class( cause = NULL; end: - destroy_error_cause(&cause->base); return status; } -BT_HIDDEN int bt_error_append_cause_from_message_iterator( struct bt_error *error, bt_self_message_iterator *self_iter, const char *file_name, uint64_t line_no, @@ -605,7 +586,6 @@ int bt_error_append_cause_from_message_iterator( cause = NULL; end: - destroy_error_cause(&cause->base); return status; } @@ -615,106 +595,119 @@ uint64_t error_cause_count(const bt_error *error) return error->causes ? error->causes->len : 0; } +BT_EXPORT uint64_t bt_error_get_cause_count(const bt_error *error) { - BT_ASSERT_PRE_NON_NULL(error, "Error"); + BT_ASSERT_PRE_ERROR_NON_NULL(error); return error_cause_count(error); } +BT_EXPORT void bt_error_release(const struct bt_error *error) { - BT_ASSERT_PRE_NON_NULL(error, "Error"); + BT_ASSERT_PRE_ERROR_NON_NULL(error); bt_error_destroy((void *) error); } +BT_EXPORT const struct bt_error_cause *bt_error_borrow_cause_by_index( const bt_error *error, uint64_t index) { - BT_ASSERT_PRE_NON_NULL(error, "Error"); + BT_ASSERT_PRE_ERROR_NON_NULL(error); BT_ASSERT_PRE_VALID_INDEX(index, error_cause_count(error)); return error->causes->pdata[index]; } +BT_EXPORT enum bt_error_cause_actor_type bt_error_cause_get_actor_type( const struct bt_error_cause *cause) { - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); return cause->actor_type; } +BT_EXPORT const char *bt_error_cause_get_message(const struct bt_error_cause *cause) { - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); return cause->message->str; } +BT_EXPORT const char *bt_error_cause_get_module_name(const struct bt_error_cause *cause) { - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); return cause->module_name->str; } +BT_EXPORT const char *bt_error_cause_get_file_name(const struct bt_error_cause *cause) { - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); return cause->file_name->str; } +BT_EXPORT uint64_t bt_error_cause_get_line_number(const bt_error_cause *cause) { - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); return cause->line_no; } +BT_EXPORT const char *bt_error_cause_component_actor_get_component_name( const struct bt_error_cause *cause) { const struct bt_error_cause_component_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "component", BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT); return spec_cause->comp_name->str; } +BT_EXPORT bt_component_class_type bt_error_cause_component_actor_get_component_class_type( const struct bt_error_cause *cause) { const struct bt_error_cause_component_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "component", BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT); return spec_cause->comp_class_id.type; } +BT_EXPORT const char *bt_error_cause_component_actor_get_component_class_name( const struct bt_error_cause *cause) { const struct bt_error_cause_component_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "component", BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT); return spec_cause->comp_class_id.name->str; } +BT_EXPORT const char *bt_error_cause_component_actor_get_plugin_name( const struct bt_error_cause *cause) { const struct bt_error_cause_component_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "component", BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT); return spec_cause->comp_class_id.plugin_name->len > 0 ? spec_cause->comp_class_id.plugin_name->str : NULL; } +BT_EXPORT bt_component_class_type bt_error_cause_component_class_actor_get_component_class_type( const struct bt_error_cause *cause) @@ -722,49 +715,53 @@ bt_error_cause_component_class_actor_get_component_class_type( const struct bt_error_cause_component_class_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "component-class", BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS); return spec_cause->comp_class_id.type; } +BT_EXPORT const char *bt_error_cause_component_class_actor_get_component_class_name( const struct bt_error_cause *cause) { const struct bt_error_cause_component_class_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "component-class", BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS); return spec_cause->comp_class_id.name->str; } +BT_EXPORT const char *bt_error_cause_component_class_actor_get_plugin_name( const struct bt_error_cause *cause) { const struct bt_error_cause_component_class_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "component-class", BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS); return spec_cause->comp_class_id.plugin_name->len > 0 ? spec_cause->comp_class_id.plugin_name->str : NULL; } +BT_EXPORT const char *bt_error_cause_message_iterator_actor_get_component_name( const struct bt_error_cause *cause) { const struct bt_error_cause_message_iterator_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "message-iterator", BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR); return spec_cause->comp_name->str; } +BT_EXPORT const char * bt_error_cause_message_iterator_actor_get_component_output_port_name( const struct bt_error_cause *cause) @@ -772,12 +769,13 @@ bt_error_cause_message_iterator_actor_get_component_output_port_name( const struct bt_error_cause_message_iterator_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "message-iterator", BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR); return spec_cause->output_port_name->str; } +BT_EXPORT bt_component_class_type bt_error_cause_message_iterator_actor_get_component_class_type( const struct bt_error_cause *cause) @@ -785,32 +783,34 @@ bt_error_cause_message_iterator_actor_get_component_class_type( const struct bt_error_cause_message_iterator_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "message-iterator", BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR); return spec_cause->comp_class_id.type; } +BT_EXPORT const char *bt_error_cause_message_iterator_actor_get_component_class_name( const struct bt_error_cause *cause) { const struct bt_error_cause_message_iterator_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "message-iterator", BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR); return spec_cause->comp_class_id.name->str; } +BT_EXPORT const char *bt_error_cause_message_iterator_actor_get_plugin_name( const struct bt_error_cause *cause) { const struct bt_error_cause_message_iterator_actor *spec_cause = (const void *) cause; - BT_ASSERT_PRE_NON_NULL(cause, "Error cause"); - BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, + BT_ASSERT_PRE_ERROR_CAUSE_NON_NULL(cause); + BT_ASSERT_PRE_CAUSE_HAS_ACTOR_TYPE(cause, "message-iterator", BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR); return spec_cause->comp_class_id.plugin_name->len > 0 ? spec_cause->comp_class_id.plugin_name->str : NULL;