X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Fstream.c;h=18e8d093c834f7781a0a49bd1ab2543cf7246feb;hb=43c59509042845f8d42c3e99ec74d45fa2dc0908;hp=a19828f46ac6465b1f84839d350103932c02c70f;hpb=350ad6c1c5f45a4e90c33e3c1354125c209bbf02;p=babeltrace.git diff --git a/src/lib/trace-ir/stream.c b/src/lib/trace-ir/stream.c index a19828f4..18e8d093 100644 --- a/src/lib/trace-ir/stream.c +++ b/src/lib/trace-ir/stream.c @@ -22,10 +22,9 @@ */ #define BT_LOG_TAG "LIB/STREAM" -#include "lib/lib-logging.h" +#include "lib/logging.h" #include "lib/assert-pre.h" -#include #include #include #include @@ -34,15 +33,18 @@ #include "common/assert.h" #include "lib/property.h" #include +#include #include #include "packet.h" #include "stream-class.h" #include "stream.h" #include "trace.h" +#include "lib/value.h" +#include "lib/func-status.h" -#define BT_ASSERT_PRE_STREAM_HOT(_stream) \ - BT_ASSERT_PRE_HOT((_stream), "Stream", ": %!+s", (_stream)) +#define BT_ASSERT_PRE_DEV_STREAM_HOT(_stream) \ + BT_ASSERT_PRE_DEV_HOT((_stream), "Stream", ": %!+s", (_stream)) static void destroy_stream(struct bt_object *obj) @@ -50,6 +52,7 @@ void destroy_stream(struct bt_object *obj) struct bt_stream *stream = (void *) obj; BT_LIB_LOGD("Destroying stream object: %!+s", stream); + BT_OBJECT_PUT_REF_AND_RESET(stream->user_attributes); if (stream->name.str) { g_string_free(stream->name.str, TRUE); @@ -69,7 +72,6 @@ void bt_stream_free_packet(struct bt_packet *packet, struct bt_stream *stream) bt_packet_destroy(packet); } -BT_ASSERT_PRE_FUNC static inline bool stream_id_is_unique(struct bt_trace *trace, struct bt_stream_class *stream_class, uint64_t id) @@ -113,14 +115,21 @@ struct bt_stream *create_stream_with_id(struct bt_stream_class *stream_class, trace, id); stream = g_new0(struct bt_stream, 1); if (!stream) { - BT_LOGE_STR("Failed to allocate one stream."); + BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one stream."); goto error; } bt_object_init_shared_with_parent(&stream->base, destroy_stream); + stream->user_attributes = bt_value_map_create(); + if (!stream->user_attributes) { + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to create a map value object."); + goto error; + } + stream->name.str = g_string_new(NULL); if (!stream->name.str) { - BT_LOGE_STR("Failed to allocate a GString."); + BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GString."); goto error; } @@ -130,12 +139,13 @@ struct bt_stream *create_stream_with_id(struct bt_stream_class *stream_class, (bt_object_pool_destroy_object_func) bt_stream_free_packet, stream); if (ret) { - BT_LOGE("Failed to initialize packet pool: ret=%d", ret); + BT_LIB_LOGE_APPEND_CAUSE( + "Failed to initialize packet pool: ret=%d", ret); goto error; } stream->class = stream_class; - bt_object_get_no_null_check(stream_class); + bt_object_get_ref_no_null_check(stream_class); /* bt_trace_add_stream() sets the parent trace, and freezes the trace */ bt_trace_add_stream(trace, stream); @@ -156,6 +166,7 @@ struct bt_stream *bt_stream_create(struct bt_stream_class *stream_class, { uint64_t id; + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class"); BT_ASSERT_PRE_NON_NULL(trace, "Trace"); BT_ASSERT_PRE(stream_class->assigns_automatic_stream_id, @@ -168,6 +179,7 @@ struct bt_stream *bt_stream_create(struct bt_stream_class *stream_class, struct bt_stream *bt_stream_create_with_id(struct bt_stream_class *stream_class, struct bt_trace *trace, uint64_t id) { + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class"); BT_ASSERT_PRE_NON_NULL(trace, "Trace"); BT_ASSERT_PRE(!stream_class->assigns_automatic_stream_id, @@ -178,7 +190,7 @@ struct bt_stream *bt_stream_create_with_id(struct bt_stream_class *stream_class, struct bt_stream_class *bt_stream_borrow_class(struct bt_stream *stream) { - BT_ASSERT_PRE_NON_NULL(stream, "Stream"); + BT_ASSERT_PRE_DEV_NON_NULL(stream, "Stream"); return stream->class; } @@ -190,7 +202,7 @@ const struct bt_stream_class *bt_stream_borrow_class_const( struct bt_trace *bt_stream_borrow_trace(struct bt_stream *stream) { - BT_ASSERT_PRE_NON_NULL(stream, "Stream"); + BT_ASSERT_PRE_DEV_NON_NULL(stream, "Stream"); return bt_stream_borrow_trace_inline(stream); } @@ -202,25 +214,26 @@ const struct bt_trace *bt_stream_borrow_trace_const( const char *bt_stream_get_name(const struct bt_stream *stream) { - BT_ASSERT_PRE_NON_NULL(stream, "Stream"); + BT_ASSERT_PRE_DEV_NON_NULL(stream, "Stream"); return stream->name.value; } -enum bt_stream_status bt_stream_set_name(struct bt_stream *stream, +enum bt_stream_set_name_status bt_stream_set_name(struct bt_stream *stream, const char *name) { + BT_ASSERT_PRE_NO_ERROR(); BT_ASSERT_PRE_NON_NULL(stream, "Stream"); BT_ASSERT_PRE_NON_NULL(name, "Name"); - BT_ASSERT_PRE_STREAM_HOT(stream); + BT_ASSERT_PRE_DEV_STREAM_HOT(stream); g_string_assign(stream->name.str, name); stream->name.value = stream->name.str->str; BT_LIB_LOGD("Set stream's name: %!+s", stream); - return BT_STREAM_STATUS_OK; + return BT_FUNC_STATUS_OK; } uint64_t bt_stream_get_id(const struct bt_stream *stream) { - BT_ASSERT_PRE_NON_NULL(stream, "Stream class"); + BT_ASSERT_PRE_DEV_NON_NULL(stream, "Stream class"); return stream->id; } @@ -228,10 +241,38 @@ BT_HIDDEN void _bt_stream_freeze(const struct bt_stream *stream) { BT_ASSERT(stream); + BT_LIB_LOGD("Freezing stream's user attributes: %!+v", + stream->user_attributes); + bt_value_freeze(stream->user_attributes); BT_LIB_LOGD("Freezing stream: %!+s", stream); ((struct bt_stream *) stream)->frozen = true; } +const struct bt_value *bt_stream_borrow_user_attributes_const( + const struct bt_stream *stream) +{ + BT_ASSERT_PRE_DEV_NON_NULL(stream, "Stream"); + return stream->user_attributes; +} + +struct bt_value *bt_stream_borrow_user_attributes(struct bt_stream *stream) +{ + return (void *) bt_stream_borrow_user_attributes_const((void *) stream); +} + +void bt_stream_set_user_attributes(struct bt_stream *stream, + const struct bt_value *user_attributes) +{ + BT_ASSERT_PRE_NON_NULL(stream, "Stream"); + 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_STREAM_HOT(stream); + bt_object_put_ref_no_null_check(stream->user_attributes); + stream->user_attributes = (void *) user_attributes; + bt_object_get_ref_no_null_check(stream->user_attributes); +} + void bt_stream_get_ref(const struct bt_stream *stream) { bt_object_get_ref(stream);