X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Ftrace-ir%2Fstream.c;h=f85b4b2323d3b0bad84a03a598d33f1b98aadfe4;hb=ecd7492f21a492b70569d5ecc1d3a808241b63f0;hp=81f212da57865856c9ba5beb52414f77df8795b6;hpb=870631a2db01676b476dbee615aade0a22926bcd;p=babeltrace.git diff --git a/src/lib/trace-ir/stream.c b/src/lib/trace-ir/stream.c index 81f212da..f85b4b23 100644 --- a/src/lib/trace-ir/stream.c +++ b/src/lib/trace-ir/stream.c @@ -1,31 +1,14 @@ /* + * SPDX-License-Identifier: MIT + * * Copyright 2017-2018 Philippe Proulx * Copyright 2013, 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/STREAM" #include "lib/logging.h" -#include "lib/assert-pre.h" -#include +#include "lib/assert-cond.h" #include #include #include @@ -34,16 +17,19 @@ #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), "Stream", \ + ": %!+s", (_stream)) static void destroy_stream(struct bt_object *obj) @@ -51,6 +37,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); @@ -65,12 +52,12 @@ void destroy_stream(struct bt_object *obj) } static -void bt_stream_free_packet(struct bt_packet *packet, struct bt_stream *stream) +void bt_stream_free_packet(struct bt_packet *packet, + struct bt_stream *stream __attribute__((unused))) { 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) @@ -97,18 +84,21 @@ end: static struct bt_stream *create_stream_with_id(struct bt_stream_class *stream_class, - struct bt_trace *trace, uint64_t id) + struct bt_trace *trace, uint64_t id, const char *api_func) { int ret; struct bt_stream *stream; BT_ASSERT(stream_class); BT_ASSERT(trace); - BT_ASSERT_PRE(trace->class == - bt_stream_class_borrow_trace_class_inline(stream_class), + BT_ASSERT_PRE_FROM_FUNC(api_func, + "trace-class-is-stream-class-trace-class", + trace->class == + bt_stream_class_borrow_trace_class_inline(stream_class), "Trace's class is different from stream class's parent trace class: " "%![sc-]+S, %![trace-]+t", stream_class, trace); - BT_ASSERT_PRE(stream_id_is_unique(trace, stream_class, id), + BT_ASSERT_PRE_FROM_FUNC(api_func, "stream-id-is-unique", + stream_id_is_unique(trace, stream_class, id), "Duplicate stream ID: %![trace-]+t, id=%" PRIu64, trace, id); BT_LIB_LOGD("Creating stream object: %![trace-]+t, id=%" PRIu64, trace, id); @@ -119,6 +109,13 @@ struct bt_stream *create_stream_with_id(struct bt_stream_class *stream_class, } 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_LIB_LOGE_APPEND_CAUSE("Failed to allocate a GString."); @@ -137,7 +134,7 @@ struct bt_stream *create_stream_with_id(struct bt_stream_class *stream_class, } 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); @@ -153,92 +150,137 @@ end: return stream; } +BT_EXPORT struct bt_stream *bt_stream_create(struct bt_stream_class *stream_class, struct bt_trace *trace) { uint64_t id; - 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, + BT_ASSERT_PRE_NO_ERROR(); + BT_ASSERT_PRE_SC_NON_NULL(stream_class); + BT_ASSERT_PRE_TRACE_NON_NULL(trace); + BT_ASSERT_PRE("stream-class-automatically-assigns-stream-ids", + stream_class->assigns_automatic_stream_id, "Stream class does not automatically assigns stream IDs: " "%![sc-]+S", stream_class); id = bt_trace_get_automatic_stream_id(trace, stream_class); - return create_stream_with_id(stream_class, trace, id); + return create_stream_with_id(stream_class, trace, id, __func__); } +BT_EXPORT struct bt_stream *bt_stream_create_with_id(struct bt_stream_class *stream_class, struct bt_trace *trace, uint64_t id) { - 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, + BT_ASSERT_PRE_NO_ERROR(); + BT_ASSERT_PRE_SC_NON_NULL(stream_class); + BT_ASSERT_PRE_TRACE_NON_NULL(trace); + BT_ASSERT_PRE("stream-class-does-not-automatically-assigns-stream-ids", + !stream_class->assigns_automatic_stream_id, "Stream class automatically assigns stream IDs: " "%![sc-]+S", stream_class); - return create_stream_with_id(stream_class, trace, id); + return create_stream_with_id(stream_class, trace, id, __func__); } +BT_EXPORT struct bt_stream_class *bt_stream_borrow_class(struct bt_stream *stream) { - BT_ASSERT_PRE_NON_NULL(stream, "Stream"); + BT_ASSERT_PRE_DEV_STREAM_NON_NULL(stream); return stream->class; } +BT_EXPORT const struct bt_stream_class *bt_stream_borrow_class_const( const struct bt_stream *stream) { return bt_stream_borrow_class((void *) stream); } +BT_EXPORT struct bt_trace *bt_stream_borrow_trace(struct bt_stream *stream) { - BT_ASSERT_PRE_NON_NULL(stream, "Stream"); + BT_ASSERT_PRE_DEV_STREAM_NON_NULL(stream); return bt_stream_borrow_trace_inline(stream); } +BT_EXPORT const struct bt_trace *bt_stream_borrow_trace_const( const struct bt_stream *stream) { return bt_stream_borrow_trace((void *) stream); } +BT_EXPORT const char *bt_stream_get_name(const struct bt_stream *stream) { - BT_ASSERT_PRE_NON_NULL(stream, "Stream"); + BT_ASSERT_PRE_DEV_STREAM_NON_NULL(stream); return stream->name.value; } +BT_EXPORT enum bt_stream_set_name_status bt_stream_set_name(struct bt_stream *stream, const char *name) { - BT_ASSERT_PRE_NON_NULL(stream, "Stream"); - BT_ASSERT_PRE_NON_NULL(name, "Name"); - BT_ASSERT_PRE_STREAM_HOT(stream); + BT_ASSERT_PRE_NO_ERROR(); + BT_ASSERT_PRE_STREAM_NON_NULL(stream); + BT_ASSERT_PRE_NAME_NON_NULL(name); + 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_FUNC_STATUS_OK; } +BT_EXPORT uint64_t bt_stream_get_id(const struct bt_stream *stream) { - BT_ASSERT_PRE_NON_NULL(stream, "Stream class"); + BT_ASSERT_PRE_DEV_SC_NON_NULL(stream); return stream->id; } -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; } +BT_EXPORT +const struct bt_value *bt_stream_borrow_user_attributes_const( + const struct bt_stream *stream) +{ + BT_ASSERT_PRE_DEV_STREAM_NON_NULL(stream); + return stream->user_attributes; +} + +BT_EXPORT +struct bt_value *bt_stream_borrow_user_attributes(struct bt_stream *stream) +{ + return (void *) bt_stream_borrow_user_attributes_const((void *) stream); +} + +BT_EXPORT +void bt_stream_set_user_attributes(struct bt_stream *stream, + const struct bt_value *user_attributes) +{ + BT_ASSERT_PRE_STREAM_NON_NULL(stream); + BT_ASSERT_PRE_USER_ATTRS_NON_NULL(user_attributes); + BT_ASSERT_PRE_USER_ATTRS_IS_MAP(user_attributes); + 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); +} + +BT_EXPORT void bt_stream_get_ref(const struct bt_stream *stream) { bt_object_get_ref(stream); } +BT_EXPORT void bt_stream_put_ref(const struct bt_stream *stream) { bt_object_put_ref(stream);