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)
{
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.");
* 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. */
* 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
*/
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;
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);
}
}