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 <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
+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)
{
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(
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.");
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.
*
* 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)(
* @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. */
};
/** CTF notification iterator. */
* at a time
* @param medops Medium operations
* @param medops_data User data (passed to medium operations)
* 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
*/
* @returns New CTF notification iterator on
* success, or \c NULL on error
*/
static
struct bt_ctf_stream *medop_get_stream(
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;
{
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(
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) {
{
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) {
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);