X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Ftrace.c;h=1be8992b55b45611f0cdcaac56d9c103faf10ca6;hb=d98421f2abfc5adab28ab7ee9b63537a6c7261cc;hp=7a61040125a55d496e7d6878b4256b603afb6e06;hpb=99b4b64b7ac398ab304fe7009d0a352b4002e459;p=babeltrace.git diff --git a/src/lib/trace-ir/trace.c b/src/lib/trace-ir/trace.c index 7a610401..1be8992b 100644 --- a/src/lib/trace-ir/trace.c +++ b/src/lib/trace-ir/trace.c @@ -1,39 +1,20 @@ /* + * SPDX-License-Identifier: MIT + * * Copyright 2017-2018 Philippe Proulx * Copyright 2014 Jérémie Galarneau - * - * 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_LOG_TAG "LIB/TRACE" #include "lib/logging.h" -#include "lib/assert-pre.h" -#include "lib/assert-post.h" +#include "lib/assert-cond.h" #include -#include #include #include "ctf-writer/functor.h" #include "ctf-writer/clock.h" #include "compat/compiler.h" #include -#include #include "lib/value.h" #include #include "compat/endian.h" @@ -42,6 +23,7 @@ #include #include #include +#include #include #include "attributes.h" @@ -81,6 +63,8 @@ void destroy_trace(struct bt_object *obj) */ if (trace->destruction_listeners) { uint64_t i; + const struct bt_error *saved_error; + BT_LIB_LOGD("Calling trace destruction listener(s): %!+t", trace); /* @@ -95,6 +79,8 @@ void destroy_trace(struct bt_object *obj) */ trace->base.ref_count++; + saved_error = bt_current_thread_take_error(); + /* Call all the trace destruction listeners */ for (i = 0; i < trace->destruction_listeners->len; i++) { struct bt_trace_destruction_listener_elem elem = @@ -103,6 +89,7 @@ void destroy_trace(struct bt_object *obj) if (elem.func) { elem.func(trace, elem.data); + BT_ASSERT_POST_NO_ERROR(); } /* @@ -113,6 +100,10 @@ void destroy_trace(struct bt_object *obj) } g_array_free(trace->destruction_listeners, TRUE); trace->destruction_listeners = NULL; + + if (saved_error) { + BT_CURRENT_THREAD_MOVE_ERROR_AND_RESET(saved_error); + } } if (trace->name.str) { @@ -148,6 +139,8 @@ struct bt_trace *bt_trace_create(struct bt_trace_class *tc) { struct bt_trace *trace = NULL; + BT_ASSERT_PRE_NO_ERROR(); + BT_LIB_LOGD("Creating trace object: %![tc-]+T", tc); trace = g_new0(struct bt_trace, 1); if (!trace) { @@ -217,6 +210,7 @@ const char *bt_trace_get_name(const struct bt_trace *trace) enum bt_trace_set_name_status bt_trace_set_name(struct bt_trace *trace, const char *name) { + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(trace, "Trace"); BT_ASSERT_PRE_NON_NULL(name, "Name"); BT_ASSERT_PRE_DEV_TRACE_HOT(trace); @@ -287,9 +281,12 @@ bt_trace_set_environment_entry_string( { int ret; struct bt_value *value_obj; + + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(trace, "Trace"); BT_ASSERT_PRE_NON_NULL(name, "Name"); BT_ASSERT_PRE_NON_NULL(value, "Value"); + value_obj = bt_value_string_create_init(value); if (!value_obj) { BT_LIB_LOGE_APPEND_CAUSE( @@ -312,8 +309,11 @@ bt_trace_set_environment_entry_integer( { int ret; struct bt_value *value_obj; + + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(trace, "Trace"); BT_ASSERT_PRE_NON_NULL(name, "Name"); + value_obj = bt_value_integer_signed_create_init(value); if (!value_obj) { BT_LIB_LOGE_APPEND_CAUSE( @@ -420,6 +420,7 @@ enum bt_trace_add_listener_status bt_trace_add_destruction_listener( .data = data, }; + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(trace, "Trace"); BT_ASSERT_PRE_NON_NULL(listener, "Listener"); @@ -464,6 +465,7 @@ enum bt_trace_remove_listener_status bt_trace_remove_destruction_listener( struct bt_trace *trace = (void *) c_trace; struct bt_trace_destruction_listener_elem *elem; + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(trace, "Trace"); BT_ASSERT_PRE(has_listener_id(trace, listener_id), "Trace has no such trace destruction listener ID: "