From: Philippe Proulx Date: Wed, 5 Jul 2017 16:14:47 +0000 (-0400) Subject: ctf: notif-iter: pass current stream ID to get_stream() medop X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=b92735af1ce0311f1243db40ea238a0b6ffcb1c1 ctf: notif-iter: pass current stream ID to get_stream() medop Make the notif iter's get_stream() medop receive the current stream (instance) ID as a parameter, if any, so that the callee can create a stream with bt_ctf_stream_create_with_id(), if this is needed, with the appropriate stream ID which is only known dynamically after decoding the first packet header. In the case of src.ctf.fs, the streams are already created with the appropriate stream IDs because the component deals with data stream file groups and must mark the trace as static at creation time, so the new parameter is ignored. In the case of src.ctf.lttng-live, we cannot read the first packet header and then rewind (or it is rather complicated to do so), so the stream object is created the first time get_stream() is called with the received ID. Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- diff --git a/plugins/ctf/common/notif-iter/notif-iter.c b/plugins/ctf/common/notif-iter/notif-iter.c index e6b85753..b8af7e15 100644 --- a/plugins/ctf/common/notif-iter/notif-iter.c +++ b/plugins/ctf/common/notif-iter/notif-iter.c @@ -2667,6 +2667,35 @@ end: return event; } +static +uint64_t get_cur_stream_instance_id(struct bt_ctf_notif_iter *notit) +{ + struct bt_ctf_field *stream_instance_id_field = NULL; + uint64_t stream_instance_id = -1ULL; + int ret; + + if (!notit->dscopes.trace_packet_header) { + goto end; + } + + stream_instance_id_field = bt_ctf_field_structure_get_field_by_name( + notit->dscopes.trace_packet_header, "stream_instance_id"); + if (!stream_instance_id_field) { + goto end; + } + + ret = bt_ctf_field_unsigned_integer_get_value(stream_instance_id_field, + &stream_instance_id); + if (ret) { + stream_instance_id = -1ULL; + goto end; + } + +end: + bt_put(stream_instance_id_field); + return stream_instance_id; +} + static int set_stream(struct bt_ctf_notif_iter *notit) { @@ -2680,7 +2709,8 @@ int set_stream(struct bt_ctf_notif_iter *notit) bt_ctf_stream_class_get_name(notit->meta.stream_class), bt_ctf_stream_class_get_id(notit->meta.stream_class)); stream = bt_get(notit->medium.medops.get_stream( - notit->meta.stream_class, notit->medium.data)); + notit->meta.stream_class, get_cur_stream_instance_id(notit), + notit->medium.data)); BT_LOGV("User function returned: stream-addr=%p", stream); if (!stream) { BT_LOGW_STR("User function failed to return a stream object for the given stream class."); diff --git a/plugins/ctf/common/notif-iter/notif-iter.h b/plugins/ctf/common/notif-iter/notif-iter.h index 428dd2ec..c14146e3 100644 --- a/plugins/ctf/common/notif-iter/notif-iter.h +++ b/plugins/ctf/common/notif-iter/notif-iter.h @@ -189,13 +189,16 @@ struct bt_ctf_notif_iter_medium_ops { * corresponding stream class is found by the notification * iterator. * - * @param stream_class Stream class associated to the stream + * @param stream_class Stream class of the stream to get + * @param stream_id Stream (instance) ID of the stream + * to get (-1ULL if not available) * @param data User data * @returns Stream instance (weak reference) or * \c NULL on error */ struct bt_ctf_stream * (* get_stream)( - struct bt_ctf_stream_class *stream_class, void *data); + struct bt_ctf_stream_class *stream_class, + uint64_t stream_id, void *data); }; /** CTF notification iterator. */ @@ -240,7 +243,6 @@ struct bt_ctf_notif_iter_notif_event { * at a time * @param medops Medium operations * @param medops_data User data (passed to medium operations) - * @param err_stream Error stream (can be \c NULL to disable) * @returns New CTF notification iterator on * success, or \c NULL on error */ diff --git a/plugins/ctf/fs-src/data-stream-file.c b/plugins/ctf/fs-src/data-stream-file.c index 0ca01a61..76b58da9 100644 --- a/plugins/ctf/fs-src/data-stream-file.c +++ b/plugins/ctf/fs-src/data-stream-file.c @@ -176,7 +176,8 @@ end: static struct bt_ctf_stream *medop_get_stream( - struct bt_ctf_stream_class *stream_class, void *data) + struct bt_ctf_stream_class *stream_class, uint64_t stream_id, + void *data) { struct ctf_fs_ds_file *ds_file = data; struct bt_ctf_stream_class *ds_file_stream_class; diff --git a/plugins/ctf/lttng-live/data-stream.c b/plugins/ctf/lttng-live/data-stream.c index d7089108..f6832cab 100644 --- a/plugins/ctf/lttng-live/data-stream.c +++ b/plugins/ctf/lttng-live/data-stream.c @@ -73,20 +73,32 @@ enum bt_ctf_notif_iter_medium_status medop_request_bytes( static struct bt_ctf_stream *medop_get_stream( - struct bt_ctf_stream_class *stream_class, void *data) + struct bt_ctf_stream_class *stream_class, + uint64_t stream_id, void *data) { struct lttng_live_stream_iterator *lttng_live_stream = data; if (!lttng_live_stream->stream) { - int64_t id = bt_ctf_stream_class_get_id(stream_class); + int64_t stream_class_id = + bt_ctf_stream_class_get_id(stream_class); + + BT_LOGD("Creating stream %s (ID: %" PRIu64 ") out of stream class %" PRId64, + lttng_live_stream->name, stream_id, stream_class_id); + + if (stream_id == -1ULL) { + /* No stream ID */ + lttng_live_stream->stream = bt_ctf_stream_create( + stream_class, lttng_live_stream->name); + } else { + lttng_live_stream->stream = + bt_ctf_stream_create_with_id(stream_class, + lttng_live_stream->name, stream_id); + } - BT_LOGD("Creating stream %s out of stream class %" PRId64, - lttng_live_stream->name, id); - lttng_live_stream->stream = bt_ctf_stream_create(stream_class, - lttng_live_stream->name); if (!lttng_live_stream->stream) { - BT_LOGE("Cannot create stream %s (stream class %" PRId64 ")", - lttng_live_stream->name, id); + BT_LOGE("Cannot create stream %s (stream class %" PRId64 ", stream ID %" PRIu64 ")", + lttng_live_stream->name, + stream_class_id, stream_id); } }