X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Ftrace.c;h=7a61040125a55d496e7d6878b4256b603afb6e06;hb=6e30bfdaa1314e2fca0a82d9bf39e6d55780e7fb;hp=e884c72a29ed0887bfe1da7880b02863684457dd;hpb=60bbfc7c8b30e092afdf97554a72cc25706ef8e9;p=babeltrace.git diff --git a/src/lib/trace-ir/trace.c b/src/lib/trace-ir/trace.c index e884c72a..7a610401 100644 --- a/src/lib/trace-ir/trace.c +++ b/src/lib/trace-ir/trace.c @@ -25,6 +25,7 @@ #include "lib/logging.h" #include "lib/assert-pre.h" +#include "lib/assert-post.h" #include #include #include @@ -55,6 +56,7 @@ #include "trace-class.h" #include "trace.h" #include "utils.h" +#include "lib/value.h" #include "lib/func-status.h" struct bt_trace_destruction_listener_elem { @@ -71,6 +73,7 @@ void destroy_trace(struct bt_object *obj) struct bt_trace *trace = (void *) obj; BT_LIB_LOGD("Destroying trace object: %!+t", trace); + BT_OBJECT_PUT_REF_AND_RESET(trace->user_attributes); /* * Call destruction listener functions so that everything else @@ -106,7 +109,7 @@ void destroy_trace(struct bt_object *obj) * The destruction listener should not have kept a * reference to the trace. */ - BT_ASSERT_PRE(trace->base.ref_count == 1, "Destruction listener kept a reference to the trace being destroyed: %![trace-]+t", trace); + BT_ASSERT_POST(trace->base.ref_count == 1, "Destruction listener kept a reference to the trace being destroyed: %![trace-]+t", trace); } g_array_free(trace->destruction_listeners, TRUE); trace->destruction_listeners = NULL; @@ -153,6 +156,13 @@ struct bt_trace *bt_trace_create(struct bt_trace_class *tc) } bt_object_init_shared(&trace->base, destroy_trace); + trace->user_attributes = bt_value_map_create(); + if (!trace->user_attributes) { + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to create a map value object."); + goto error; + } + trace->streams = g_ptr_array_new_with_free_func( (GDestroyNotify) bt_object_try_spec_release); if (!trace->streams) { @@ -187,7 +197,7 @@ struct bt_trace *bt_trace_create(struct bt_trace_class *tc) } trace->class = tc; - bt_object_get_no_null_check(trace->class); + bt_object_get_ref_no_null_check(trace->class); BT_LIB_LOGD("Created trace object: %!+t", trace); goto end; @@ -232,14 +242,13 @@ void bt_trace_set_uuid(struct bt_trace *trace, bt_uuid uuid) BT_LIB_LOGD("Set trace's UUID: %!+t", trace); } -BT_ASSERT_FUNC static bool trace_has_environment_entry(const struct bt_trace *trace, const char *name) { BT_ASSERT(trace); return bt_attributes_borrow_field_value_by_name( - trace->environment, name) != NULL; + trace->environment, name); } static @@ -323,12 +332,8 @@ end: uint64_t bt_trace_get_environment_entry_count(const struct bt_trace *trace) { - int64_t ret; - BT_ASSERT_PRE_DEV_NON_NULL(trace, "Trace"); - ret = bt_attributes_get_count(trace->environment); - BT_ASSERT(ret >= 0); - return (uint64_t) ret; + return bt_attributes_get_count(trace->environment); } void bt_trace_borrow_environment_entry_by_index_const( @@ -406,7 +411,7 @@ const struct bt_stream *bt_trace_borrow_stream_by_id_const( enum bt_trace_add_listener_status bt_trace_add_destruction_listener( const struct bt_trace *c_trace, bt_trace_destruction_listener_func listener, - void *data, uint64_t *listener_id) + void *data, bt_listener_id *listener_id) { struct bt_trace *trace = (void *) c_trace; uint64_t i; @@ -450,11 +455,11 @@ bool has_listener_id(const struct bt_trace *trace, uint64_t listener_id) BT_ASSERT(listener_id < trace->destruction_listeners->len); return (&g_array_index(trace->destruction_listeners, struct bt_trace_destruction_listener_elem, - listener_id))->func != NULL; + listener_id))->func; } enum bt_trace_remove_listener_status bt_trace_remove_destruction_listener( - const struct bt_trace *c_trace, uint64_t listener_id) + const struct bt_trace *c_trace, bt_listener_id listener_id) { struct bt_trace *trace = (void *) c_trace; struct bt_trace_destruction_listener_elem *elem; @@ -482,6 +487,9 @@ void _bt_trace_freeze(const struct bt_trace *trace) BT_ASSERT(trace); BT_LIB_LOGD("Freezing trace's class: %!+T", trace->class); bt_trace_class_freeze(trace->class); + BT_LIB_LOGD("Freezing trace's user attributes: %!+v", + trace->user_attributes); + bt_value_freeze(trace->user_attributes); BT_LIB_LOGD("Freezing trace: %!+t", trace); ((struct bt_trace *) trace)->frozen = true; } @@ -535,6 +543,32 @@ const struct bt_trace_class *bt_trace_borrow_class_const( return bt_trace_borrow_class((void *) trace); } +const struct bt_value *bt_trace_borrow_user_attributes_const( + const struct bt_trace *trace) +{ + BT_ASSERT_PRE_DEV_NON_NULL(trace, "Trace"); + return trace->user_attributes; +} + +struct bt_value *bt_trace_borrow_user_attributes(struct bt_trace *trace) +{ + return (void *) bt_trace_borrow_user_attributes_const((void *) trace); +} + +void bt_trace_set_user_attributes( + struct bt_trace *trace, + const struct bt_value *user_attributes) +{ + BT_ASSERT_PRE_NON_NULL(trace, "Trace"); + 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_DEV_TRACE_HOT(trace); + bt_object_put_ref_no_null_check(trace->user_attributes); + trace->user_attributes = (void *) user_attributes; + bt_object_get_ref_no_null_check(trace->user_attributes); +} + void bt_trace_get_ref(const struct bt_trace *trace) { bt_object_get_ref(trace);