X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=lttng-events.c;h=879097b4a8c7af056c0f0ec57dbef4d9376e7c57;hb=3b731ab1a88c60e0a3a8eeddd225f751e821b1f3;hp=27a8f8644477be0bcf41c3732622e0e8c0f9fa57;hpb=9de2c21569afcb6b983e81a2e9b1d0c2b83c98f0;p=lttng-modules.git diff --git a/lttng-events.c b/lttng-events.c index 27a8f864..879097b4 100644 --- a/lttng-events.c +++ b/lttng-events.c @@ -285,6 +285,7 @@ struct lttng_channel *lttng_channel_create(struct lttng_session *session, goto nomem; chan->session = session; chan->id = session->free_chan_id++; + chan->ops = &transport->ops; /* * Note: the channel creation op already writes into the packet * headers. Therefore the "chan" information used as input @@ -296,7 +297,6 @@ struct lttng_channel *lttng_channel_create(struct lttng_session *session, if (!chan->chan) goto create_error; chan->enabled = 1; - chan->ops = &transport->ops; chan->transport = transport; chan->channel_type = channel_type; list_add(&chan->list, &session->chan); @@ -554,35 +554,43 @@ void _lttng_event_destroy(struct lttng_event *event) * remaining space left in packet and write, since mutual exclusion * protects us from concurrent writes. */ -int lttng_metadata_output_channel(struct lttng_channel *chan, - struct lttng_metadata_stream *stream) +int lttng_metadata_output_channel(struct lttng_metadata_stream *stream, + struct channel *chan) { struct lib_ring_buffer_ctx ctx; int ret = 0; size_t len, reserve_len; + /* + * Ensure we support mutiple get_next / put sequences followed + * by put_next. + */ + WARN_ON(stream->metadata_in < stream->metadata_out); + if (stream->metadata_in != stream->metadata_out) + return 0; + len = stream->metadata_cache->metadata_written - - stream->metadata_cache_read; + stream->metadata_in; if (!len) return 0; reserve_len = min_t(size_t, - chan->ops->packet_avail_size(chan->chan), + stream->transport->ops.packet_avail_size(chan), len); - lib_ring_buffer_ctx_init(&ctx, chan->chan, NULL, reserve_len, + lib_ring_buffer_ctx_init(&ctx, chan, NULL, reserve_len, sizeof(char), -1); /* * If reservation failed, return an error to the caller. */ - ret = chan->ops->event_reserve(&ctx, 0); + ret = stream->transport->ops.event_reserve(&ctx, 0); if (ret != 0) { printk(KERN_WARNING "LTTng: Metadata event reservation failed\n"); goto end; } - chan->ops->event_write(&ctx, - stream->metadata_cache->data + stream->metadata_cache_read, + stream->transport->ops.event_write(&ctx, + stream->metadata_cache->data + stream->metadata_in, reserve_len); - chan->ops->event_commit(&ctx); - stream->metadata_cache_read += reserve_len; + stream->transport->ops.event_commit(&ctx); + stream->metadata_in += reserve_len; ret = reserve_len; end: