/* * Write at most one packet in the channel. * Returns the number of bytes written on success, < 0 on error. */ ssize_t ustctl_write_one_packet_to_channel( struct ustctl_consumer_channel *channel, const char *metadata_str, /* NOT null-terminated */ size_t len) /* metadata length */ { struct lttng_ust_lib_ring_buffer_ctx ctx; struct lttng_channel *chan = channel->chan; const char *str = metadata_str; ssize_t reserve_len; int ret; reserve_len = min_t(ssize_t, chan->ops->packet_avail_size(chan->chan, chan->handle), len); lib_ring_buffer_ctx_init(&ctx, chan->chan, NULL, reserve_len, sizeof(char), -1, chan->handle); ret = chan->ops->event_reserve(&ctx, 0); if (ret != 0) { DBG("LTTng: event reservation failed"); assert(ret < 0); reserve_len = ret; goto end; } chan->ops->event_write(&ctx, str, reserve_len); chan->ops->event_commit(&ctx); end: return reserve_len; }
/* The probe function */ void probe(struct lttng_event* __tp_data) { struct lttng_event *__event = (struct lttng_event *) __tp_data; struct lttng_channel *__chan = __event->chan; struct lttng_ust_lib_ring_buffer_ctx __ctx; size_t __event_len, __event_align; int __ret; __event_len = 0; __event_align = 0; lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len, __event_align, -1, __chan->handle); __ctx.ip = __builtin_return_address(0); __ret = __chan->ops->event_reserve(&__ctx, __event->id); if (__ret < 0) return; __chan->ops->event_commit(&__ctx); }
int ustctl_write_metadata_to_channel( struct ustctl_consumer_channel *channel, const char *metadata_str, /* NOT null-terminated */ size_t len) /* metadata length */ { struct lttng_ust_lib_ring_buffer_ctx ctx; struct lttng_channel *chan = channel->chan; const char *str = metadata_str; int ret = 0, waitret; size_t reserve_len, pos; for (pos = 0; pos < len; pos += reserve_len) { reserve_len = min_t(size_t, chan->ops->packet_avail_size(chan->chan, chan->handle), len - pos); lib_ring_buffer_ctx_init(&ctx, chan->chan, NULL, reserve_len, sizeof(char), -1, chan->handle); /* * We don't care about metadata buffer's records lost * count, because we always retry here. Report error if * we need to bail out after timeout or being * interrupted. */ waitret = wait_cond_interruptible_timeout( ({ ret = chan->ops->event_reserve(&ctx, 0); ret != -ENOBUFS || !ret; }), LTTNG_METADATA_TIMEOUT_MSEC); if (waitret == -ETIMEDOUT || waitret == -EINTR || ret) { DBG("LTTng: Failure to write metadata to buffers (%s)\n", waitret == -EINTR ? "interrupted" : (ret == -ENOBUFS ? "timeout" : "I/O error")); if (waitret == -EINTR) ret = waitret; goto end; } chan->ops->event_write(&ctx, &str[pos], reserve_len); chan->ops->event_commit(&ctx); }