X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Ftrace-class.c;h=593f390efac2d4dfd5bf9adcbf467af6db5eccb8;hb=43c59509042845f8d42c3e99ec74d45fa2dc0908;hp=d838fdcd0699610a9d5f9f22381fc2144eaf2a47;hpb=c4f23e30bf67d2523163614bc9461d84cbe1ae80;p=babeltrace.git diff --git a/src/lib/trace-ir/trace-class.c b/src/lib/trace-ir/trace-class.c index d838fdcd..593f390e 100644 --- a/src/lib/trace-ir/trace-class.c +++ b/src/lib/trace-ir/trace-class.c @@ -27,13 +27,11 @@ #include "lib/assert-pre.h" #include "lib/assert-post.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" @@ -80,6 +78,8 @@ void destroy_trace_class(struct bt_object *obj) */ if (tc->destruction_listeners) { uint64_t i; + const struct bt_error *saved_error; + BT_LIB_LOGD("Calling trace class destruction listener(s): %!+T", tc); /* @@ -94,6 +94,8 @@ void destroy_trace_class(struct bt_object *obj) */ tc->base.ref_count++; + saved_error = bt_current_thread_take_error(); + /* Call all the trace class destruction listeners */ for (i = 0; i < tc->destruction_listeners->len; i++) { struct bt_trace_class_destruction_listener_elem elem = @@ -102,6 +104,7 @@ void destroy_trace_class(struct bt_object *obj) if (elem.func) { elem.func(tc, elem.data); + BT_ASSERT_POST_NO_ERROR(); } /* @@ -112,6 +115,10 @@ void destroy_trace_class(struct bt_object *obj) } g_array_free(tc->destruction_listeners, TRUE); tc->destruction_listeners = NULL; + + if (saved_error) { + BT_CURRENT_THREAD_MOVE_ERROR_AND_RESET(saved_error); + } } if (tc->stream_classes) { @@ -127,6 +134,7 @@ struct bt_trace_class *bt_trace_class_create(bt_self_component *self_comp) { struct bt_trace_class *tc = NULL; + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(self_comp, "Self component"); BT_LOGD_STR("Creating default trace class object."); tc = g_new0(struct bt_trace_class, 1); @@ -180,6 +188,7 @@ enum bt_trace_class_add_listener_status bt_trace_class_add_destruction_listener( .data = data, }; + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(tc, "Trace class"); BT_ASSERT_PRE_NON_NULL(listener, "Listener"); @@ -224,6 +233,7 @@ enum bt_trace_class_remove_listener_status bt_trace_class_remove_destruction_lis struct bt_trace_class *tc = (void *) _tc; struct bt_trace_class_destruction_listener_elem *elem; + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(tc, "Trace class"); BT_ASSERT_PRE(has_listener_id(tc, listener_id), "Trace class has no such trace class destruction listener ID: "