X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Ftrace-class.c;h=648a2af8095c3d1fcdbfe7162cc7597ff571551b;hb=HEAD;hp=025698d2a0940490f27783440cd18f600abb113e;hpb=d98421f2abfc5adab28ab7ee9b63537a6c7261cc;p=babeltrace.git diff --git a/src/lib/trace-ir/trace-class.c b/src/lib/trace-ir/trace-class.c index 025698d2..648a2af8 100644 --- a/src/lib/trace-ir/trace-class.c +++ b/src/lib/trace-ir/trace-class.c @@ -11,31 +11,21 @@ #include "lib/assert-cond.h" #include #include -#include "ctf-writer/functor.h" -#include "ctf-writer/clock.h" #include "compat/compiler.h" #include #include "lib/value.h" #include #include "compat/endian.h" #include "common/assert.h" -#include "compat/glib.h" #include #include #include #include #include -#include "clock-class.h" -#include "event-class.h" -#include "event.h" -#include "field-class.h" -#include "field-wrapper.h" -#include "resolve-field-path.h" +#include "trace-class.h" #include "stream-class.h" #include "stream.h" -#include "trace.h" -#include "utils.h" #include "lib/value.h" #include "lib/func-status.h" @@ -45,7 +35,10 @@ struct bt_trace_class_destruction_listener_elem { }; #define BT_ASSERT_PRE_DEV_TRACE_CLASS_HOT(_tc) \ - BT_ASSERT_PRE_DEV_HOT((_tc), "Trace class", ": %!+T", (_tc)) + BT_ASSERT_PRE_DEV_HOT("trace-class", (_tc), "Trace class", \ + ": %!+T", (_tc)) + +#define DESTRUCTION_LISTENER_FUNC_NAME "bt_trace_destruction_listener_func" static void destroy_trace_class(struct bt_object *obj) @@ -82,19 +75,24 @@ void destroy_trace_class(struct bt_object *obj) /* Call all the trace class destruction listeners */ for (i = 0; i < tc->destruction_listeners->len; i++) { struct bt_trace_class_destruction_listener_elem elem = - g_array_index(tc->destruction_listeners, + bt_g_array_index(tc->destruction_listeners, struct bt_trace_class_destruction_listener_elem, i); if (elem.func) { elem.func(tc, elem.data); - BT_ASSERT_POST_NO_ERROR(); + BT_ASSERT_POST_NO_ERROR( + DESTRUCTION_LISTENER_FUNC_NAME); } /* * The destruction listener should not have kept a * reference to the trace class. */ - BT_ASSERT_POST(tc->base.ref_count == 1, "Destruction listener kept a reference to the trace class being destroyed: %![tc-]+T", tc); + BT_ASSERT_POST(DESTRUCTION_LISTENER_FUNC_NAME, + "trace-class-reference-count-not-changed", + tc->base.ref_count == 1, + "Destruction listener kept a reference to the trace class being destroyed: %![tc-]+T", + tc); } g_array_free(tc->destruction_listeners, TRUE); tc->destruction_listeners = NULL; @@ -113,12 +111,13 @@ void destroy_trace_class(struct bt_object *obj) g_free(tc); } +BT_EXPORT 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_ASSERT_PRE_COMP_NON_NULL(self_comp); BT_LOGD_STR("Creating default trace class object."); tc = g_new0(struct bt_trace_class, 1); if (!tc) { @@ -159,6 +158,7 @@ end: return tc; } +BT_EXPORT enum bt_trace_class_add_listener_status bt_trace_class_add_destruction_listener( const struct bt_trace_class *_tc, bt_trace_class_destruction_listener_func listener, @@ -172,13 +172,13 @@ enum bt_trace_class_add_listener_status bt_trace_class_add_destruction_listener( }; BT_ASSERT_PRE_NO_ERROR(); - BT_ASSERT_PRE_NON_NULL(tc, "Trace class"); - BT_ASSERT_PRE_NON_NULL(listener, "Listener"); + BT_ASSERT_PRE_TC_NON_NULL(tc); + BT_ASSERT_PRE_LISTENER_FUNC_NON_NULL(listener); /* Find the next available spot */ for (i = 0; i < tc->destruction_listeners->len; i++) { struct bt_trace_class_destruction_listener_elem elem = - g_array_index(tc->destruction_listeners, + bt_g_array_index(tc->destruction_listeners, struct bt_trace_class_destruction_listener_elem, i); if (!elem.func) { @@ -205,11 +205,12 @@ static bool has_listener_id(const struct bt_trace_class *tc, uint64_t listener_id) { BT_ASSERT(listener_id < tc->destruction_listeners->len); - return (&g_array_index(tc->destruction_listeners, + return (&bt_g_array_index(tc->destruction_listeners, struct bt_trace_class_destruction_listener_elem, listener_id))->func; } +BT_EXPORT enum bt_trace_class_remove_listener_status bt_trace_class_remove_destruction_listener( const struct bt_trace_class *_tc, bt_listener_id listener_id) { @@ -217,11 +218,12 @@ enum bt_trace_class_remove_listener_status bt_trace_class_remove_destruction_lis 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), + BT_ASSERT_PRE_TC_NON_NULL(tc); + BT_ASSERT_PRE("listener-id-exists", + has_listener_id(tc, listener_id), "Trace class has no such trace class destruction listener ID: " "%![tc-]+T, %" PRIu64, tc, listener_id); - elem = &g_array_index(tc->destruction_listeners, + elem = &bt_g_array_index(tc->destruction_listeners, struct bt_trace_class_destruction_listener_elem, listener_id); BT_ASSERT(elem->func); @@ -234,20 +236,23 @@ enum bt_trace_class_remove_listener_status bt_trace_class_remove_destruction_lis return BT_FUNC_STATUS_OK; } +BT_EXPORT uint64_t bt_trace_class_get_stream_class_count(const struct bt_trace_class *tc) { - BT_ASSERT_PRE_DEV_NON_NULL(tc, "Trace class"); + BT_ASSERT_PRE_DEV_TC_NON_NULL(tc); return (uint64_t) tc->stream_classes->len; } +BT_EXPORT struct bt_stream_class *bt_trace_class_borrow_stream_class_by_index( struct bt_trace_class *tc, uint64_t index) { - BT_ASSERT_PRE_DEV_NON_NULL(tc, "Trace class"); + BT_ASSERT_PRE_DEV_TC_NON_NULL(tc); BT_ASSERT_PRE_DEV_VALID_INDEX(index, tc->stream_classes->len); return g_ptr_array_index(tc->stream_classes, index); } +BT_EXPORT const struct bt_stream_class * bt_trace_class_borrow_stream_class_by_index_const( const struct bt_trace_class *tc, uint64_t index) @@ -256,13 +261,14 @@ bt_trace_class_borrow_stream_class_by_index_const( (void *) tc, index); } +BT_EXPORT struct bt_stream_class *bt_trace_class_borrow_stream_class_by_id( struct bt_trace_class *tc, uint64_t id) { struct bt_stream_class *stream_class = NULL; uint64_t i; - BT_ASSERT_PRE_DEV_NON_NULL(tc, "Trace class"); + BT_ASSERT_PRE_DEV_TC_NON_NULL(tc); for (i = 0; i < tc->stream_classes->len; i++) { struct bt_stream_class *stream_class_candidate = @@ -278,6 +284,7 @@ end: return stream_class; } +BT_EXPORT const struct bt_stream_class * bt_trace_class_borrow_stream_class_by_id_const( const struct bt_trace_class *tc, uint64_t id) @@ -285,7 +292,6 @@ bt_trace_class_borrow_stream_class_by_id_const( return bt_trace_class_borrow_stream_class_by_id((void *) tc, id); } -BT_HIDDEN void _bt_trace_class_freeze(const struct bt_trace_class *tc) { BT_ASSERT(tc); @@ -293,29 +299,33 @@ void _bt_trace_class_freeze(const struct bt_trace_class *tc) ((struct bt_trace_class *) tc)->frozen = true; } +BT_EXPORT bt_bool bt_trace_class_assigns_automatic_stream_class_id(const struct bt_trace_class *tc) { - BT_ASSERT_PRE_DEV_NON_NULL(tc, "Trace class"); + BT_ASSERT_PRE_DEV_TC_NON_NULL(tc); return (bt_bool) tc->assigns_automatic_stream_class_id; } +BT_EXPORT void bt_trace_class_set_assigns_automatic_stream_class_id(struct bt_trace_class *tc, bt_bool value) { - BT_ASSERT_PRE_NON_NULL(tc, "Trace class"); + BT_ASSERT_PRE_TC_NON_NULL(tc); BT_ASSERT_PRE_DEV_TRACE_CLASS_HOT(tc); tc->assigns_automatic_stream_class_id = (bool) value; BT_LIB_LOGD("Set trace class's automatic stream class ID " "assignment property: %!+T", tc); } +BT_EXPORT const struct bt_value *bt_trace_class_borrow_user_attributes_const( const struct bt_trace_class *trace_class) { - BT_ASSERT_PRE_DEV_NON_NULL(trace_class, "Trace class"); + BT_ASSERT_PRE_DEV_TC_NON_NULL(trace_class); return trace_class->user_attributes; } +BT_EXPORT struct bt_value *bt_trace_class_borrow_user_attributes( struct bt_trace_class *trace_class) { @@ -323,24 +333,26 @@ struct bt_value *bt_trace_class_borrow_user_attributes( (void *) trace_class); } +BT_EXPORT void bt_trace_class_set_user_attributes(struct bt_trace_class *trace_class, const struct bt_value *user_attributes) { - BT_ASSERT_PRE_NON_NULL(trace_class, "Trace class"); - BT_ASSERT_PRE_NON_NULL(user_attributes, "User attributes"); - BT_ASSERT_PRE(user_attributes->type == BT_VALUE_TYPE_MAP, - "User attributes object is not a map value object."); + BT_ASSERT_PRE_TC_NON_NULL(trace_class); + BT_ASSERT_PRE_USER_ATTRS_NON_NULL(user_attributes); + BT_ASSERT_PRE_USER_ATTRS_IS_MAP(user_attributes); BT_ASSERT_PRE_DEV_TRACE_CLASS_HOT(trace_class); bt_object_put_ref_no_null_check(trace_class->user_attributes); trace_class->user_attributes = (void *) user_attributes; bt_object_get_ref_no_null_check(trace_class->user_attributes); } +BT_EXPORT void bt_trace_class_get_ref(const struct bt_trace_class *trace_class) { bt_object_get_ref(trace_class); } +BT_EXPORT void bt_trace_class_put_ref(const struct bt_trace_class *trace_class) { bt_object_put_ref(trace_class);